+
+ Read the Docs
+ v: ${config.versions.current.slug}
+
+
+
+
+ ${renderLanguages(config)}
+ ${renderVersions(config)}
+ ${renderDownloads(config)}
+
+ On Read the Docs
+
+ Project Home
+
+
+ Builds
+
+
+ Downloads
+
+
+
+ Search
+
+
+
+
+
+
+ Hosted by Read the Docs
+
+
+
+ `;
+
+ // Inject the generated flyout into the body HTML element.
+ document.body.insertAdjacentHTML("beforeend", flyout);
+
+ // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout.
+ document
+ .querySelector("#flyout-search-form")
+ .addEventListener("focusin", () => {
+ const event = new CustomEvent("readthedocs-search-show");
+ document.dispatchEvent(event);
+ });
+ })
+}
+
+if (themeLanguageSelector || themeVersionSelector) {
+ function onSelectorSwitch(event) {
+ const option = event.target.selectedIndex;
+ const item = event.target.options[option];
+ window.location.href = item.dataset.url;
+ }
+
+ document.addEventListener("readthedocs-addons-data-ready", function (event) {
+ const config = event.detail.data();
+
+ const versionSwitch = document.querySelector(
+ "div.switch-menus > div.version-switch",
+ );
+ if (themeVersionSelector) {
+ let versions = config.versions.active;
+ if (config.versions.current.hidden || config.versions.current.type === "external") {
+ versions.unshift(config.versions.current);
+ }
+ const versionSelect = `
+
+ ${versions
+ .map(
+ (version) => `
+
+ ${version.slug}
+ `,
+ )
+ .join("\n")}
+
+ `;
+
+ versionSwitch.innerHTML = versionSelect;
+ versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch);
+ }
+
+ const languageSwitch = document.querySelector(
+ "div.switch-menus > div.language-switch",
+ );
+
+ if (themeLanguageSelector) {
+ if (config.projects.translations.length) {
+ // Add the current language to the options on the selector
+ let languages = config.projects.translations.concat(
+ config.projects.current,
+ );
+ languages = languages.sort((a, b) =>
+ a.language.name.localeCompare(b.language.name),
+ );
+
+ const languageSelect = `
+
+ ${languages
+ .map(
+ (language) => `
+
+ ${language.language.name}
+ `,
+ )
+ .join("\n")}
+
+ `;
+
+ languageSwitch.innerHTML = languageSelect;
+ languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch);
+ }
+ else {
+ languageSwitch.remove();
+ }
+ }
+ });
+}
+
+document.addEventListener("readthedocs-addons-data-ready", function (event) {
+ // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav.
+ document
+ .querySelector("[role='search'] input")
+ .addEventListener("focusin", () => {
+ const event = new CustomEvent("readthedocs-search-show");
+ document.dispatchEvent(event);
+ });
+});
\ No newline at end of file
diff --git a/devel/html/_static/language_data.js b/devel/html/_static/language_data.js
new file mode 100644
index 0000000..c7fe6c6
--- /dev/null
+++ b/devel/html/_static/language_data.js
@@ -0,0 +1,192 @@
+/*
+ * This script contains the language-specific data used by searchtools.js,
+ * namely the list of stopwords, stemmer, scorer and splitter.
+ */
+
+var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
+
+
+/* Non-minified version is copied as a separate JS file, if available */
+
+/**
+ * Porter Stemmer
+ */
+var Stemmer = function() {
+
+ var step2list = {
+ ational: 'ate',
+ tional: 'tion',
+ enci: 'ence',
+ anci: 'ance',
+ izer: 'ize',
+ bli: 'ble',
+ alli: 'al',
+ entli: 'ent',
+ eli: 'e',
+ ousli: 'ous',
+ ization: 'ize',
+ ation: 'ate',
+ ator: 'ate',
+ alism: 'al',
+ iveness: 'ive',
+ fulness: 'ful',
+ ousness: 'ous',
+ aliti: 'al',
+ iviti: 'ive',
+ biliti: 'ble',
+ logi: 'log'
+ };
+
+ var step3list = {
+ icate: 'ic',
+ ative: '',
+ alize: 'al',
+ iciti: 'ic',
+ ical: 'ic',
+ ful: '',
+ ness: ''
+ };
+
+ var c = "[^aeiou]"; // consonant
+ var v = "[aeiouy]"; // vowel
+ var C = c + "[^aeiouy]*"; // consonant sequence
+ var V = v + "[aeiou]*"; // vowel sequence
+
+ var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
+ var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
+ var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
+ var s_v = "^(" + C + ")?" + v; // vowel in stem
+
+ this.stemWord = function (w) {
+ var stem;
+ var suffix;
+ var firstch;
+ var origword = w;
+
+ if (w.length < 3)
+ return w;
+
+ var re;
+ var re2;
+ var re3;
+ var re4;
+
+ firstch = w.substr(0,1);
+ if (firstch == "y")
+ w = firstch.toUpperCase() + w.substr(1);
+
+ // Step 1a
+ re = /^(.+?)(ss|i)es$/;
+ re2 = /^(.+?)([^s])s$/;
+
+ if (re.test(w))
+ w = w.replace(re,"$1$2");
+ else if (re2.test(w))
+ w = w.replace(re2,"$1$2");
+
+ // Step 1b
+ re = /^(.+?)eed$/;
+ re2 = /^(.+?)(ed|ing)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ re = new RegExp(mgr0);
+ if (re.test(fp[1])) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ }
+ else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1];
+ re2 = new RegExp(s_v);
+ if (re2.test(stem)) {
+ w = stem;
+ re2 = /(at|bl|iz)$/;
+ re3 = new RegExp("([^aeiouylsz])\\1$");
+ re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re2.test(w))
+ w = w + "e";
+ else if (re3.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ else if (re4.test(w))
+ w = w + "e";
+ }
+ }
+
+ // Step 1c
+ re = /^(.+?)y$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(s_v);
+ if (re.test(stem))
+ w = stem + "i";
+ }
+
+ // Step 2
+ re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem))
+ w = stem + step2list[suffix];
+ }
+
+ // Step 3
+ re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem))
+ w = stem + step3list[suffix];
+ }
+
+ // Step 4
+ re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+ re2 = /^(.+?)(s|t)(ion)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ if (re.test(stem))
+ w = stem;
+ }
+ else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1] + fp[2];
+ re2 = new RegExp(mgr1);
+ if (re2.test(stem))
+ w = stem;
+ }
+
+ // Step 5
+ re = /^(.+?)e$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ re2 = new RegExp(meq1);
+ re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+ w = stem;
+ }
+ re = /ll$/;
+ re2 = new RegExp(mgr1);
+ if (re.test(w) && re2.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+
+ // and turn initial Y back to y
+ if (firstch == "y")
+ w = firstch.toLowerCase() + w.substr(1);
+ return w;
+ }
+}
+
diff --git a/devel/html/_static/minus.png b/devel/html/_static/minus.png
new file mode 100644
index 0000000..d96755f
Binary files /dev/null and b/devel/html/_static/minus.png differ
diff --git a/devel/html/_static/plus.png b/devel/html/_static/plus.png
new file mode 100644
index 0000000..7107cec
Binary files /dev/null and b/devel/html/_static/plus.png differ
diff --git a/devel/html/_static/product-logo-ex-rail.png b/devel/html/_static/product-logo-ex-rail.png
new file mode 100644
index 0000000..e642bd5
Binary files /dev/null and b/devel/html/_static/product-logo-ex-rail.png differ
diff --git a/devel/html/_static/pygments.css b/devel/html/_static/pygments.css
new file mode 100644
index 0000000..6f8b210
--- /dev/null
+++ b/devel/html/_static/pygments.css
@@ -0,0 +1,75 @@
+pre { line-height: 125%; }
+td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+.highlight .hll { background-color: #ffffcc }
+.highlight { background: #f8f8f8; }
+.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */
+.highlight .err { border: 1px solid #F00 } /* Error */
+.highlight .k { color: #008000; font-weight: bold } /* Keyword */
+.highlight .o { color: #666 } /* Operator */
+.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
+.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #9C6500 } /* Comment.Preproc */
+.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
+.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #A00000 } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+.highlight .gr { color: #E40000 } /* Generic.Error */
+.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.highlight .gi { color: #008400 } /* Generic.Inserted */
+.highlight .go { color: #717171 } /* Generic.Output */
+.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.highlight .gt { color: #04D } /* Generic.Traceback */
+.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { color: #008000 } /* Keyword.Pseudo */
+.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #B00040 } /* Keyword.Type */
+.highlight .m { color: #666 } /* Literal.Number */
+.highlight .s { color: #BA2121 } /* Literal.String */
+.highlight .na { color: #687822 } /* Name.Attribute */
+.highlight .nb { color: #008000 } /* Name.Builtin */
+.highlight .nc { color: #00F; font-weight: bold } /* Name.Class */
+.highlight .no { color: #800 } /* Name.Constant */
+.highlight .nd { color: #A2F } /* Name.Decorator */
+.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */
+.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
+.highlight .nf { color: #00F } /* Name.Function */
+.highlight .nl { color: #767600 } /* Name.Label */
+.highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */
+.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #19177C } /* Name.Variable */
+.highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */
+.highlight .w { color: #BBB } /* Text.Whitespace */
+.highlight .mb { color: #666 } /* Literal.Number.Bin */
+.highlight .mf { color: #666 } /* Literal.Number.Float */
+.highlight .mh { color: #666 } /* Literal.Number.Hex */
+.highlight .mi { color: #666 } /* Literal.Number.Integer */
+.highlight .mo { color: #666 } /* Literal.Number.Oct */
+.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
+.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
+.highlight .sc { color: #BA2121 } /* Literal.String.Char */
+.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
+.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
+.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
+.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
+.highlight .sx { color: #008000 } /* Literal.String.Other */
+.highlight .sr { color: #A45A77 } /* Literal.String.Regex */
+.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
+.highlight .ss { color: #19177C } /* Literal.String.Symbol */
+.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.highlight .fm { color: #00F } /* Name.Function.Magic */
+.highlight .vc { color: #19177C } /* Name.Variable.Class */
+.highlight .vg { color: #19177C } /* Name.Variable.Global */
+.highlight .vi { color: #19177C } /* Name.Variable.Instance */
+.highlight .vm { color: #19177C } /* Name.Variable.Magic */
+.highlight .il { color: #666 } /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/devel/html/_static/searchtools.js b/devel/html/_static/searchtools.js
new file mode 100644
index 0000000..2c774d1
--- /dev/null
+++ b/devel/html/_static/searchtools.js
@@ -0,0 +1,632 @@
+/*
+ * Sphinx JavaScript utilities for the full-text search.
+ */
+"use strict";
+
+/**
+ * Simple result scoring code.
+ */
+if (typeof Scorer === "undefined") {
+ var Scorer = {
+ // Implement the following function to further tweak the score for each result
+ // The function takes a result array [docname, title, anchor, descr, score, filename]
+ // and returns the new score.
+ /*
+ score: result => {
+ const [docname, title, anchor, descr, score, filename, kind] = result
+ return score
+ },
+ */
+
+ // query matches the full name of an object
+ objNameMatch: 11,
+ // or matches in the last dotted part of the object name
+ objPartialMatch: 6,
+ // Additive scores depending on the priority of the object
+ objPrio: {
+ 0: 15, // used to be importantResults
+ 1: 5, // used to be objectResults
+ 2: -5, // used to be unimportantResults
+ },
+ // Used when the priority is not in the mapping.
+ objPrioDefault: 0,
+
+ // query found in title
+ title: 15,
+ partialTitle: 7,
+ // query found in terms
+ term: 5,
+ partialTerm: 2,
+ };
+}
+
+// Global search result kind enum, used by themes to style search results.
+class SearchResultKind {
+ static get index() { return "index"; }
+ static get object() { return "object"; }
+ static get text() { return "text"; }
+ static get title() { return "title"; }
+}
+
+const _removeChildren = (element) => {
+ while (element && element.lastChild) element.removeChild(element.lastChild);
+};
+
+/**
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
+ */
+const _escapeRegExp = (string) =>
+ string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
+
+const _displayItem = (item, searchTerms, highlightTerms) => {
+ const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
+ const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
+ const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
+ const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
+ const contentRoot = document.documentElement.dataset.content_root;
+
+ const [docName, title, anchor, descr, score, _filename, kind] = item;
+
+ let listItem = document.createElement("li");
+ // Add a class representing the item's type:
+ // can be used by a theme's CSS selector for styling
+ // See SearchResultKind for the class names.
+ listItem.classList.add(`kind-${kind}`);
+ let requestUrl;
+ let linkUrl;
+ if (docBuilder === "dirhtml") {
+ // dirhtml builder
+ let dirname = docName + "/";
+ if (dirname.match(/\/index\/$/))
+ dirname = dirname.substring(0, dirname.length - 6);
+ else if (dirname === "index/") dirname = "";
+ requestUrl = contentRoot + dirname;
+ linkUrl = requestUrl;
+ } else {
+ // normal html builders
+ requestUrl = contentRoot + docName + docFileSuffix;
+ linkUrl = docName + docLinkSuffix;
+ }
+ let linkEl = listItem.appendChild(document.createElement("a"));
+ linkEl.href = linkUrl + anchor;
+ linkEl.dataset.score = score;
+ linkEl.innerHTML = title;
+ if (descr) {
+ listItem.appendChild(document.createElement("span")).innerHTML =
+ " (" + descr + ")";
+ // highlight search terms in the description
+ if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
+ highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
+ }
+ else if (showSearchSummary)
+ fetch(requestUrl)
+ .then((responseData) => responseData.text())
+ .then((data) => {
+ if (data)
+ listItem.appendChild(
+ Search.makeSearchSummary(data, searchTerms, anchor)
+ );
+ // highlight search terms in the summary
+ if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
+ highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
+ });
+ Search.output.appendChild(listItem);
+};
+const _finishSearch = (resultCount) => {
+ Search.stopPulse();
+ Search.title.innerText = _("Search Results");
+ if (!resultCount)
+ Search.status.innerText = Documentation.gettext(
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
+ );
+ else
+ Search.status.innerText = Documentation.ngettext(
+ "Search finished, found one page matching the search query.",
+ "Search finished, found ${resultCount} pages matching the search query.",
+ resultCount,
+ ).replace('${resultCount}', resultCount);
+};
+const _displayNextItem = (
+ results,
+ resultCount,
+ searchTerms,
+ highlightTerms,
+) => {
+ // results left, load the summary and display it
+ // this is intended to be dynamic (don't sub resultsCount)
+ if (results.length) {
+ _displayItem(results.pop(), searchTerms, highlightTerms);
+ setTimeout(
+ () => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
+ 5
+ );
+ }
+ // search finished, update title and status message
+ else _finishSearch(resultCount);
+};
+// Helper function used by query() to order search results.
+// Each input is an array of [docname, title, anchor, descr, score, filename, kind].
+// Order the results by score (in opposite order of appearance, since the
+// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
+const _orderResultsByScoreThenName = (a, b) => {
+ const leftScore = a[4];
+ const rightScore = b[4];
+ if (leftScore === rightScore) {
+ // same score: sort alphabetically
+ const leftTitle = a[1].toLowerCase();
+ const rightTitle = b[1].toLowerCase();
+ if (leftTitle === rightTitle) return 0;
+ return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
+ }
+ return leftScore > rightScore ? 1 : -1;
+};
+
+/**
+ * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
+ * custom function per language.
+ *
+ * The regular expression works by splitting the string on consecutive characters
+ * that are not Unicode letters, numbers, underscores, or emoji characters.
+ * This is the same as ``\W+`` in Python, preserving the surrogate pair area.
+ */
+if (typeof splitQuery === "undefined") {
+ var splitQuery = (query) => query
+ .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
+ .filter(term => term) // remove remaining empty strings
+}
+
+/**
+ * Search Module
+ */
+const Search = {
+ _index: null,
+ _queued_query: null,
+ _pulse_status: -1,
+
+ htmlToText: (htmlString, anchor) => {
+ const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
+ for (const removalQuery of [".headerlink", "script", "style"]) {
+ htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
+ }
+ if (anchor) {
+ const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`);
+ if (anchorContent) return anchorContent.textContent;
+
+ console.warn(
+ `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`
+ );
+ }
+
+ // if anchor not specified or not found, fall back to main content
+ const docContent = htmlElement.querySelector('[role="main"]');
+ if (docContent) return docContent.textContent;
+
+ console.warn(
+ "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template."
+ );
+ return "";
+ },
+
+ init: () => {
+ const query = new URLSearchParams(window.location.search).get("q");
+ document
+ .querySelectorAll('input[name="q"]')
+ .forEach((el) => (el.value = query));
+ if (query) Search.performSearch(query);
+ },
+
+ loadIndex: (url) =>
+ (document.body.appendChild(document.createElement("script")).src = url),
+
+ setIndex: (index) => {
+ Search._index = index;
+ if (Search._queued_query !== null) {
+ const query = Search._queued_query;
+ Search._queued_query = null;
+ Search.query(query);
+ }
+ },
+
+ hasIndex: () => Search._index !== null,
+
+ deferQuery: (query) => (Search._queued_query = query),
+
+ stopPulse: () => (Search._pulse_status = -1),
+
+ startPulse: () => {
+ if (Search._pulse_status >= 0) return;
+
+ const pulse = () => {
+ Search._pulse_status = (Search._pulse_status + 1) % 4;
+ Search.dots.innerText = ".".repeat(Search._pulse_status);
+ if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
+ };
+ pulse();
+ },
+
+ /**
+ * perform a search for something (or wait until index is loaded)
+ */
+ performSearch: (query) => {
+ // create the required interface elements
+ const searchText = document.createElement("h2");
+ searchText.textContent = _("Searching");
+ const searchSummary = document.createElement("p");
+ searchSummary.classList.add("search-summary");
+ searchSummary.innerText = "";
+ const searchList = document.createElement("ul");
+ searchList.setAttribute("role", "list");
+ searchList.classList.add("search");
+
+ const out = document.getElementById("search-results");
+ Search.title = out.appendChild(searchText);
+ Search.dots = Search.title.appendChild(document.createElement("span"));
+ Search.status = out.appendChild(searchSummary);
+ Search.output = out.appendChild(searchList);
+
+ const searchProgress = document.getElementById("search-progress");
+ // Some themes don't use the search progress node
+ if (searchProgress) {
+ searchProgress.innerText = _("Preparing search...");
+ }
+ Search.startPulse();
+
+ // index already loaded, the browser was quick!
+ if (Search.hasIndex()) Search.query(query);
+ else Search.deferQuery(query);
+ },
+
+ _parseQuery: (query) => {
+ // stem the search terms and add them to the correct list
+ const stemmer = new Stemmer();
+ const searchTerms = new Set();
+ const excludedTerms = new Set();
+ const highlightTerms = new Set();
+ const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
+ splitQuery(query.trim()).forEach((queryTerm) => {
+ const queryTermLower = queryTerm.toLowerCase();
+
+ // maybe skip this "word"
+ // stopwords array is from language_data.js
+ if (
+ stopwords.indexOf(queryTermLower) !== -1 ||
+ queryTerm.match(/^\d+$/)
+ )
+ return;
+
+ // stem the word
+ let word = stemmer.stemWord(queryTermLower);
+ // select the correct list
+ if (word[0] === "-") excludedTerms.add(word.substr(1));
+ else {
+ searchTerms.add(word);
+ highlightTerms.add(queryTermLower);
+ }
+ });
+
+ if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js
+ localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
+ }
+
+ // console.debug("SEARCH: searching for:");
+ // console.info("required: ", [...searchTerms]);
+ // console.info("excluded: ", [...excludedTerms]);
+
+ return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
+ },
+
+ /**
+ * execute search (requires search index to be loaded)
+ */
+ _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => {
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const titles = Search._index.titles;
+ const allTitles = Search._index.alltitles;
+ const indexEntries = Search._index.indexentries;
+
+ // Collect multiple result groups to be sorted separately and then ordered.
+ // Each is an array of [docname, title, anchor, descr, score, filename, kind].
+ const normalResults = [];
+ const nonMainIndexResults = [];
+
+ _removeChildren(document.getElementById("search-progress"));
+
+ const queryLower = query.toLowerCase().trim();
+ for (const [title, foundTitles] of Object.entries(allTitles)) {
+ if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
+ for (const [file, id] of foundTitles) {
+ const score = Math.round(Scorer.title * queryLower.length / title.length);
+ const boost = titles[file] === title ? 1 : 0; // add a boost for document titles
+ normalResults.push([
+ docNames[file],
+ titles[file] !== title ? `${titles[file]} > ${title}` : title,
+ id !== null ? "#" + id : "",
+ null,
+ score + boost,
+ filenames[file],
+ SearchResultKind.title,
+ ]);
+ }
+ }
+ }
+
+ // search for explicit entries in index directives
+ for (const [entry, foundEntries] of Object.entries(indexEntries)) {
+ if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
+ for (const [file, id, isMain] of foundEntries) {
+ const score = Math.round(100 * queryLower.length / entry.length);
+ const result = [
+ docNames[file],
+ titles[file],
+ id ? "#" + id : "",
+ null,
+ score,
+ filenames[file],
+ SearchResultKind.index,
+ ];
+ if (isMain) {
+ normalResults.push(result);
+ } else {
+ nonMainIndexResults.push(result);
+ }
+ }
+ }
+ }
+
+ // lookup as object
+ objectTerms.forEach((term) =>
+ normalResults.push(...Search.performObjectSearch(term, objectTerms))
+ );
+
+ // lookup as search terms in fulltext
+ normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms));
+
+ // let the scorer override scores with a custom scoring function
+ if (Scorer.score) {
+ normalResults.forEach((item) => (item[4] = Scorer.score(item)));
+ nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
+ }
+
+ // Sort each group of results by score and then alphabetically by name.
+ normalResults.sort(_orderResultsByScoreThenName);
+ nonMainIndexResults.sort(_orderResultsByScoreThenName);
+
+ // Combine the result groups in (reverse) order.
+ // Non-main index entries are typically arbitrary cross-references,
+ // so display them after other results.
+ let results = [...nonMainIndexResults, ...normalResults];
+
+ // remove duplicate search results
+ // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
+ let seen = new Set();
+ results = results.reverse().reduce((acc, result) => {
+ let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
+ if (!seen.has(resultStr)) {
+ acc.push(result);
+ seen.add(resultStr);
+ }
+ return acc;
+ }, []);
+
+ return results.reverse();
+ },
+
+ query: (query) => {
+ const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query);
+ const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms);
+
+ // for debugging
+ //Search.lastresults = results.slice(); // a copy
+ // console.info("search results:", Search.lastresults);
+
+ // print the results
+ _displayNextItem(results, results.length, searchTerms, highlightTerms);
+ },
+
+ /**
+ * search for object names
+ */
+ performObjectSearch: (object, objectTerms) => {
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const objects = Search._index.objects;
+ const objNames = Search._index.objnames;
+ const titles = Search._index.titles;
+
+ const results = [];
+
+ const objectSearchCallback = (prefix, match) => {
+ const name = match[4]
+ const fullname = (prefix ? prefix + "." : "") + name;
+ const fullnameLower = fullname.toLowerCase();
+ if (fullnameLower.indexOf(object) < 0) return;
+
+ let score = 0;
+ const parts = fullnameLower.split(".");
+
+ // check for different match types: exact matches of full name or
+ // "last name" (i.e. last dotted part)
+ if (fullnameLower === object || parts.slice(-1)[0] === object)
+ score += Scorer.objNameMatch;
+ else if (parts.slice(-1)[0].indexOf(object) > -1)
+ score += Scorer.objPartialMatch; // matches in last name
+
+ const objName = objNames[match[1]][2];
+ const title = titles[match[0]];
+
+ // If more than one term searched for, we require other words to be
+ // found in the name/title/description
+ const otherTerms = new Set(objectTerms);
+ otherTerms.delete(object);
+ if (otherTerms.size > 0) {
+ const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
+ if (
+ [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
+ )
+ return;
+ }
+
+ let anchor = match[3];
+ if (anchor === "") anchor = fullname;
+ else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
+
+ const descr = objName + _(", in ") + title;
+
+ // add custom score for some objects according to scorer
+ if (Scorer.objPrio.hasOwnProperty(match[2]))
+ score += Scorer.objPrio[match[2]];
+ else score += Scorer.objPrioDefault;
+
+ results.push([
+ docNames[match[0]],
+ fullname,
+ "#" + anchor,
+ descr,
+ score,
+ filenames[match[0]],
+ SearchResultKind.object,
+ ]);
+ };
+ Object.keys(objects).forEach((prefix) =>
+ objects[prefix].forEach((array) =>
+ objectSearchCallback(prefix, array)
+ )
+ );
+ return results;
+ },
+
+ /**
+ * search for full-text terms in the index
+ */
+ performTermsSearch: (searchTerms, excludedTerms) => {
+ // prepare search
+ const terms = Search._index.terms;
+ const titleTerms = Search._index.titleterms;
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const titles = Search._index.titles;
+
+ const scoreMap = new Map();
+ const fileMap = new Map();
+
+ // perform the search on the required terms
+ searchTerms.forEach((word) => {
+ const files = [];
+ const arr = [
+ { files: terms[word], score: Scorer.term },
+ { files: titleTerms[word], score: Scorer.title },
+ ];
+ // add support for partial matches
+ if (word.length > 2) {
+ const escapedWord = _escapeRegExp(word);
+ if (!terms.hasOwnProperty(word)) {
+ Object.keys(terms).forEach((term) => {
+ if (term.match(escapedWord))
+ arr.push({ files: terms[term], score: Scorer.partialTerm });
+ });
+ }
+ if (!titleTerms.hasOwnProperty(word)) {
+ Object.keys(titleTerms).forEach((term) => {
+ if (term.match(escapedWord))
+ arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
+ });
+ }
+ }
+
+ // no match but word was a required one
+ if (arr.every((record) => record.files === undefined)) return;
+
+ // found search word in contents
+ arr.forEach((record) => {
+ if (record.files === undefined) return;
+
+ let recordFiles = record.files;
+ if (recordFiles.length === undefined) recordFiles = [recordFiles];
+ files.push(...recordFiles);
+
+ // set score for the word in each file
+ recordFiles.forEach((file) => {
+ if (!scoreMap.has(file)) scoreMap.set(file, {});
+ scoreMap.get(file)[word] = record.score;
+ });
+ });
+
+ // create the mapping
+ files.forEach((file) => {
+ if (!fileMap.has(file)) fileMap.set(file, [word]);
+ else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word);
+ });
+ });
+
+ // now check if the files don't contain excluded terms
+ const results = [];
+ for (const [file, wordList] of fileMap) {
+ // check if all requirements are matched
+
+ // as search terms with length < 3 are discarded
+ const filteredTermCount = [...searchTerms].filter(
+ (term) => term.length > 2
+ ).length;
+ if (
+ wordList.length !== searchTerms.size &&
+ wordList.length !== filteredTermCount
+ )
+ continue;
+
+ // ensure that none of the excluded terms is in the search result
+ if (
+ [...excludedTerms].some(
+ (term) =>
+ terms[term] === file ||
+ titleTerms[term] === file ||
+ (terms[term] || []).includes(file) ||
+ (titleTerms[term] || []).includes(file)
+ )
+ )
+ break;
+
+ // select one (max) score for the file.
+ const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
+ // add result to the result list
+ results.push([
+ docNames[file],
+ titles[file],
+ "",
+ null,
+ score,
+ filenames[file],
+ SearchResultKind.text,
+ ]);
+ }
+ return results;
+ },
+
+ /**
+ * helper function to return a node containing the
+ * search summary for a given text. keywords is a list
+ * of stemmed words.
+ */
+ makeSearchSummary: (htmlText, keywords, anchor) => {
+ const text = Search.htmlToText(htmlText, anchor);
+ if (text === "") return null;
+
+ const textLower = text.toLowerCase();
+ const actualStartPosition = [...keywords]
+ .map((k) => textLower.indexOf(k.toLowerCase()))
+ .filter((i) => i > -1)
+ .slice(-1)[0];
+ const startWithContext = Math.max(actualStartPosition - 120, 0);
+
+ const top = startWithContext === 0 ? "" : "...";
+ const tail = startWithContext + 240 < text.length ? "..." : "";
+
+ let summary = document.createElement("p");
+ summary.classList.add("context");
+ summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
+
+ return summary;
+ },
+};
+
+_ready(Search.init);
diff --git a/devel/html/_static/sphinx_highlight.js b/devel/html/_static/sphinx_highlight.js
new file mode 100644
index 0000000..8a96c69
--- /dev/null
+++ b/devel/html/_static/sphinx_highlight.js
@@ -0,0 +1,154 @@
+/* Highlighting utilities for Sphinx HTML documentation. */
+"use strict";
+
+const SPHINX_HIGHLIGHT_ENABLED = true
+
+/**
+ * highlight a given string on a node by wrapping it in
+ * span elements with the given class name.
+ */
+const _highlight = (node, addItems, text, className) => {
+ if (node.nodeType === Node.TEXT_NODE) {
+ const val = node.nodeValue;
+ const parent = node.parentNode;
+ const pos = val.toLowerCase().indexOf(text);
+ if (
+ pos >= 0 &&
+ !parent.classList.contains(className) &&
+ !parent.classList.contains("nohighlight")
+ ) {
+ let span;
+
+ const closestNode = parent.closest("body, svg, foreignObject");
+ const isInSVG = closestNode && closestNode.matches("svg");
+ if (isInSVG) {
+ span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
+ } else {
+ span = document.createElement("span");
+ span.classList.add(className);
+ }
+
+ span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+ const rest = document.createTextNode(val.substr(pos + text.length));
+ parent.insertBefore(
+ span,
+ parent.insertBefore(
+ rest,
+ node.nextSibling
+ )
+ );
+ node.nodeValue = val.substr(0, pos);
+ /* There may be more occurrences of search term in this node. So call this
+ * function recursively on the remaining fragment.
+ */
+ _highlight(rest, addItems, text, className);
+
+ if (isInSVG) {
+ const rect = document.createElementNS(
+ "http://www.w3.org/2000/svg",
+ "rect"
+ );
+ const bbox = parent.getBBox();
+ rect.x.baseVal.value = bbox.x;
+ rect.y.baseVal.value = bbox.y;
+ rect.width.baseVal.value = bbox.width;
+ rect.height.baseVal.value = bbox.height;
+ rect.setAttribute("class", className);
+ addItems.push({ parent: parent, target: rect });
+ }
+ }
+ } else if (node.matches && !node.matches("button, select, textarea")) {
+ node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
+ }
+};
+const _highlightText = (thisNode, text, className) => {
+ let addItems = [];
+ _highlight(thisNode, addItems, text, className);
+ addItems.forEach((obj) =>
+ obj.parent.insertAdjacentElement("beforebegin", obj.target)
+ );
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const SphinxHighlight = {
+
+ /**
+ * highlight the search words provided in localstorage in the text
+ */
+ highlightSearchWords: () => {
+ if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight
+
+ // get and clear terms from localstorage
+ const url = new URL(window.location);
+ const highlight =
+ localStorage.getItem("sphinx_highlight_terms")
+ || url.searchParams.get("highlight")
+ || "";
+ localStorage.removeItem("sphinx_highlight_terms")
+ url.searchParams.delete("highlight");
+ window.history.replaceState({}, "", url);
+
+ // get individual terms from highlight string
+ const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
+ if (terms.length === 0) return; // nothing to do
+
+ // There should never be more than one element matching "div.body"
+ const divBody = document.querySelectorAll("div.body");
+ const body = divBody.length ? divBody[0] : document.querySelector("body");
+ window.setTimeout(() => {
+ terms.forEach((term) => _highlightText(body, term, "highlighted"));
+ }, 10);
+
+ const searchBox = document.getElementById("searchbox");
+ if (searchBox === null) return;
+ searchBox.appendChild(
+ document
+ .createRange()
+ .createContextualFragment(
+ '
' +
+ '' +
+ _("Hide Search Matches") +
+ "
"
+ )
+ );
+ },
+
+ /**
+ * helper function to hide the search marks again
+ */
+ hideSearchWords: () => {
+ document
+ .querySelectorAll("#searchbox .highlight-link")
+ .forEach((el) => el.remove());
+ document
+ .querySelectorAll("span.highlighted")
+ .forEach((el) => el.classList.remove("highlighted"));
+ localStorage.removeItem("sphinx_highlight_terms")
+ },
+
+ initEscapeListener: () => {
+ // only install a listener if it is really needed
+ if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
+ if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
+ SphinxHighlight.hideSearchWords();
+ event.preventDefault();
+ }
+ });
+ },
+};
+
+_ready(() => {
+ /* Do not call highlightSearchWords() when we are on the search page.
+ * It will highlight words from the *previous* search query.
+ */
+ if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords();
+ SphinxHighlight.initEscapeListener();
+});
diff --git a/devel/html/genindex.html b/devel/html/genindex.html
new file mode 100644
index 0000000..d179ecb
--- /dev/null
+++ b/devel/html/genindex.html
@@ -0,0 +1,676 @@
+
+
+
+
+
+
+
+
+
Index — EXRAIL Language documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EXRAIL Language
+
+
+
+
+
+
+
+
+
+
Index
+
+
+
A
+ |
B
+ |
C
+ |
D
+ |
E
+ |
F
+ |
G
+ |
H
+ |
I
+ |
J
+ |
K
+ |
L
+ |
M
+ |
N
+ |
O
+ |
P
+ |
R
+ |
S
+ |
T
+ |
U
+ |
V
+ |
W
+ |
X
+
+
+
A
+
+
+
B
+
+
+
C
+
+
+
D
+
+
+
E
+
+
+
F
+
+
+
G
+
+
+
H
+
+
+
I
+
+
+
J
+
+
+
K
+
+
+
L
+
+
+
M
+
+
+
N
+
+
+
O
+
+
+
P
+
+
+
R
+
+
+
S
+
+
+
T
+
+
+
U
+
+
+
V
+
+
+
W
+
+
+
X
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/devel/html/index.html b/devel/html/index.html
new file mode 100644
index 0000000..cd66618
--- /dev/null
+++ b/devel/html/index.html
@@ -0,0 +1,2428 @@
+
+
+
+
+
+
+
+
+
+
EXRAIL Language documentation — EXRAIL Language documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EXRAIL Language
+
+
+
+
+
+
+
+
+
+EXRAIL Language documentation
+
+Introduction
+EXRAIL - Extended Railroad Automation Instruction Language
+This page is a reference to all EXRAIL commands available with EX-CommandStation.
+
+
+Macros
+
+
Defines
+
+
+ACTIVATE ( addr , subaddr )
+Send DCC Accessory Activate packet (gate on then off)
+
+Parameters:
+
+
+
+
+
+
+
+ACTIVATEL ( longaddr )
+Send DCC Accessory Activate packet (gate on then off)
+
+Parameters:
+
+
+
+
+
+
+
+AFTER ( sensor_id , timer... )
+Wait for sensor activated, then decativated for given time.
+
+Parameters:
+
+
+
+
+
+
+
+AFTEROVERLOAD ( track_id )
+Wait for overload to be resolved.
+
+Parameters:
+
+
+
+
+
+
+
+ALIAS ( name , value... )
+defines a named numeric value.
+
+Parameters:
+
+
+
+
+
+
+
+AMBER ( signal_id )
+Sets a signal to amber state.
+
+Parameters:
+
+
+
+
+
+
+
+ANOUT ( vpin , value , param1 , param2 )
+Writes to the HAL analog output interface of a device driver. Values and meanings of extra parameters depend on driver.
+
+Parameters:
+
+vpin – Virtual pin number of device
+value – basic analog value
+param1 – device dependent
+param2 – device dependent
+
+
+
+
+
+
+
+AT ( sensor_id )
+wait intil a sensor becomes active
+
+Parameters:
+
+
+
+
+
+
+
+ASPECT ( address , value )
+Sends a DCC aspect value to an accessory address. May also change status of a signal defined using this aspect.
+
+Parameters:
+
+
+
+
+
+
+
+ATGTE ( sensor_id , value )
+Wait for analog sensor to be greater than given value.
+
+Parameters:
+
+
+
+
+
+
+
+ATLT ( sensor_id , value )
+Wait for analog sensor value to be less than given value.
+
+Parameters:
+
+
+
+
+
+
+
+ATTIMEOUT ( sensor_id , timeout_ms )
+Wait for sensor active, with timeout. Use IFTIMEOUT to determine whether the AT was satisfied.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+AUTOMATION ( id , description )
+Defies starting point of a sequence that will be shown as an Automation by the throttles. Automations are started by the throttle handing over a loco id to be driven.
+
+Parameters:
+
+
+
+
+
+
+
+AUTOSTART
+A new task will be created starting from this point at Command Station startup
+
+
+
+
+BLINK ( vpin , onDuty , offDuty )
+Starts a blinking process for a vpin (typically a LED) Stop blink with SET or RESET.
+
+Parameters:
+
+
+
+
+
+
+
+BROADCAST ( msg )
+Send raw message text to all throttles using the DCC-EX protocol.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+CALL ( route )
+transfer control to another sequence with expectation to return
+
+
+
+Parameters:
+
+
+
+
+
+
+
+CLEAR_STASH ( id )
+Clears loco stash value
+
+Parameters:
+
+
+
+
+
+
+
+CLEAR_ALL_STASH ( id )
+???????????????????????????????????????
+
+Parameters:
+
+
+
+
+
+
+
+CLOSE ( id )
+Close turnout by id.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+CONFIGURE_SERVO ( vpin , pos1 , pos2 , profile )
+setup servo movement parameters for non-turnout
+
+Parameters:
+
+vpin – must refer to a servo capable pin
+pos1 – SET position of servo
+pos2 – RESET position of servo
+profile – Movement profile (????????)
+
+
+
+
+
+
+
+DCC_SIGNAL ( id , add , subaddr )
+Define a DCC accessory signal with short address.
+
+Parameters:
+
+
+
+
+
+
+
+DCCX_SIGNAL ( id , redAspect , amberAspect , greenAspect )
+DEfine advanced DCC accessory signal with aspects.
+
+Parameters:
+
+
+
+
+
+
+
+DCC_TURNTABLE ( id , home , description... )
+??????????????????????????????????
+
+Parameters:
+
+id
+home
+description...
+
+
+
+
+
+
+
+DEACTIVATE ( addr , subaddr )
+Sends DCC Deactivate packet (gate on, gate off) to short address.
+
+Parameters:
+
+
+
+
+
+
+
+DEACTIVATEL ( addr )
+Sends DCC Deactivate packet (gate on, gate off) to long address.
+
+Parameters:
+
+
+
+
+
+
+
+DELAY ( mindelay )
+Waits for given milliseconds delay (This is not blocking)
+
+Parameters:
+
+
+
+
+
+
+
+DELAYMINS ( mindelay )
+Waits for given minutes delay (This is not blocking)
+
+Parameters:
+
+
+
+
+
+
+
+DELAYRANDOM ( mindelay , maxdelay )
+Waits for random delay between min and max milliseconds (This is not blocking)
+
+Parameters:
+
+mindelay – mS
+maxdelay – mS
+
+
+
+
+
+
+
+DONE
+Stops task loco (if any) and terminates current task.
+
+
+
+
+DRIVE ( analogpin )
+RESERVED do not use.
+
+Parameters:
+
+
+
+
+
+
+
+ELSE
+introduces alternate processing path after any kind of IF
+
+
+
+
+ENDEXRAIL
+Obsolete, has no effect.
+
+
+
+
+ENDIF
+determines end of IF(any type)
block. IF something ENDIF, or
+IF something ELSE something ENDIF
+
+
+
+
+
+ENDTASK
+same as DONE
+
+
+
+
+
+
+ESTOP
+Performs emergency stop on current task loco.
+
+
+
+
+EXRAIL
+OBSOLETE ignored.
+
+
+
+
+EXTT_TURNTABLE ( id , vpin , home , description... )
+??????????????????????
+
+Parameters:
+
+id
+vpin
+home
+description...
+
+
+
+
+
+
+
+FADE ( pin , value , ms )
+Modifies analog value slowly taking a given time.
+
+Parameters:
+
+pin
+value – new target value
+ms – time to reach value
+
+
+
+
+
+
+
+FOFF ( func )
+Turns off loco function for current loco.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+FOLLOW ( route )
+Task processing follows given route or sequence (Effectively a GoTo)
+
+Parameters:
+
+
+
+
+
+
+
+FON ( func )
+Turn on current loc finction.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+FORGET
+Removes current loco from task and DCC reminders table.
+
+
+
+
+FREE ( blockid )
+Frees logical token for given block.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+FTOGGLE ( func )
+Toggles function for current loco.
+
+Parameters:
+
+
+
+
+
+
+
+FWD ( speed )
+Instructs current loco to set DCC speed.
+
+Parameters:
+
+speed – 0..127 (1=ESTOP)
+
+
+
+
+
+
+
+GREEN ( signal_id )
+Sets signal to green state.
+
+Parameters:
+
+
+
+
+
+
+
+HAL ( haltype , params... )
+Defines VPIN mapping for specific hardware drivers.
+
+Parameters:
+
+
+
+
+
+
+
+HAL_IGNORE_DEFAULTS
+System will ignore default HAL settings.
+
+
+
+
+IF ( sensor_id )
+Checks sensor state, If false jumps to matching nested ELSE or ENDIF.
+
+Parameters:
+
+
+
+
+
+
+
+IFAMBER ( signal_id )
+Checks if signal is in AMBER state.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+IFCLOSED ( turnout_id )
+Checks if given turnout is in close state.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+IFGREEN ( signal_id )
+Checks if given signal is in GREEN state.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+IFGTE ( sensor_id , value )
+Checks if analog sensor >= value.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+IFLOCO ( loco_id )
+Checks if current task loco = loco_id.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+IFLT ( sensor_id , value )
+Checks if analog sensor < value.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+IFNOT ( sensor_id )
+Inverse of IF.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+IFRANDOM ( percent )
+randomly satisfield IF at given percent probability
+
+
+
+Parameters:
+
+
+
+
+
+
+
+IFRED ( signal_id )
+Checks if given signal is in RED state.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+IFTHROWN ( turnout_id )
+Checks if given turnout is in THROWN state.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+IFRESERVE ( block )
+Agttempts to reserve block token and if satisfiled the block remains reserved.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+IFTIMEOUT
+Checks TIMEOUT state after an AT/AFTER request with timeout value.
+
+
+
+
+
+
+IFTTPOSITION ( turntable_id , position )
+Checks if GTurntable is in given position.
+
+
+
+Parameters:
+
+turntable_id
+position
+
+
+
+
+
+
+
+IFRE ( sensor_id , value )
+????????????????????????????????????????
+
+Parameters:
+
+
+
+
+
+
+
+INVERT_DIRECTION
+Marks current task so that FWD and REV commands are inverted.
+
+
+
+
+JMRI_SENSOR ( vpin , count... )
+DEfines multiple JMRI
+
+Parameters:
+
+
+
+
+
+
+
+JOIN
+Switches PROG track to receive MAIN track DCC packets. (Drive on PROG track)
+
+
+
+
+KILLALL
+Tertminates all running EXRAIL tasks.
+
+
+
+
+LATCH ( sensor_id )
+Make all AT/AFTER/IF see sensor active without checking hardware.
+
+Parameters:
+
+
+
+
+
+
+
+LCC ( eventid )
+Issue event to LCC.
+
+Parameters:
+
+
+
+
+
+
+
+LCCX ( senderid , eventid )
+Issue LCC event while impersonating another sender.
+
+Parameters:
+
+
+
+
+
+
+
+LCD ( row , msg )
+Write message on row of default configured LCD/OLED.
+
+
+
+Parameters:
+
+row
+msg – Quoted text
+
+
+
+
+
+
+
+SCREEN ( display , row , msg )
+Send message to external display hadlers.
+
+Parameters:
+
+
+
+
+
+
+
+LCN ( msg )
+??????
+
+Parameters:
+
+
+
+
+
+
+
+MESSAGE ( msg )
+Send a human readable message to all throttle users.
+
+Parameters:
+
+
+
+
+
+
+
+MOVETT ( id , steps , activity )
+???????????????????
+
+Parameters:
+
+
+
+
+
+
+
+NEOPIXEL ( id , r , g , b , count... )
+Set a NEOPIXEL vpin to a given red/green/blue colour.
+
+Parameters:
+
+
+
+
+
+
+
+NEOPIXEL_SIGNAL ( sigid , redcolour , ambercolour , greencolour )
+Define a signal that uses a single multi colour pixel.
+
+Parameters:
+
+
+
+
+
+
+
+ACON ( eventid )
+Send MERG CBUS ACON to Adapter.
+
+Parameters:
+
+
+
+
+
+
+
+ACOF ( eventid )
+Send MERG CBUS ACOF to Adapter.
+
+Parameters:
+
+
+
+
+
+
+
+ONACON ( eventid )
+Start task here when ACON for event receied from MERG CBUS.
+
+Parameters:
+
+
+
+
+
+
+
+ONACOF ( eventid )
+Start task here when ACOF for event receied from MERG CBUS.
+
+Parameters:
+
+
+
+
+
+
+
+ONACTIVATE ( addr , subaddr )
+Start task here when DCC Activate sent for short address.
+
+Parameters:
+
+
+
+
+
+
+
+ONACTIVATEL ( linear )
+Start task here when DCC Activate sent for long address.
+
+Parameters:
+
+
+
+
+
+
+
+ONAMBER ( signal_id )
+Start task here when signal set to AMBER state.
+
+Parameters:
+
+
+
+
+
+
+
+ONTIME ( value )
+Start task here when fastclock mins in day=value.
+
+Parameters:
+
+
+
+
+
+
+
+ONCLOCKTIME ( hours , mins )
+Start task here when fastclock matches time.
+
+Parameters:
+
+
+
+
+
+
+
+ONCLOCKMINS ( mins )
+Start task here hourly when fastclock minutes matches.
+
+Parameters:
+
+
+
+
+
+
+
+ONOVERLOAD ( track_id )
+Start task here when given track goes into overload.
+
+Parameters:
+
+
+
+
+
+
+
+ONDEACTIVATE ( addr , subaddr )
+Start task here when DCC deactivate packet sent.
+
+Parameters:
+
+
+
+
+
+
+
+ONDEACTIVATEL ( linear )
+Start task here when DCC deactivate sent to linear address.
+
+Parameters:
+
+
+
+
+
+
+
+ONCLOSE ( turnout_id )
+Start task here when turnout closed.
+
+Parameters:
+
+
+
+
+
+
+
+ONLCC ( sender , event )
+??????????????????
+
+Parameters:
+
+
+
+
+
+
+
+ONGREEN ( signal_id )
+Start task here when signal set to GREEN state.
+
+Parameters:
+
+
+
+
+
+
+
+ONRED ( signal_id )
+Start task here when signal set to RED state.
+
+Parameters:
+
+
+
+
+
+
+
+ONROTATE ( turntable_id )
+Start task here when turntable is rotated.
+
+Parameters:
+
+
+
+
+
+
+
+ONTHROW ( turnout_id )
+Start task here when turnout is Thrown.
+
+Parameters:
+
+
+
+
+
+
+
+ONCHANGE ( sensor_id )
+???????????????????
+
+Parameters:
+
+
+
+
+
+
+
+ONSENSOR ( sensor_id )
+Start task here when sensor changes state (debounced)
+
+Parameters:
+
+
+
+
+
+
+
+ONBUTTON ( sensor_id )
+Start task here when sensor changes HIGH to LOW.
+
+Parameters:
+
+
+
+
+
+
+
+PAUSE
+Pauses all EXRAIL tasks except the curremnt one. Other tasks ESTOP their locos until RESUME issued.
+
+
+
+
+PIN_TURNOUT ( id , pin , description... )
+Defines a tirnout which operates on a signle pin.
+
+Parameters:
+
+
+
+
+
+
+
+PRINT ( msg )
+prints diagnostic message on USB serial
+
+Parameters:
+
+
+
+
+
+
+
+PARSE ( msg )
+Executes <> command as if entered from serial.
+
+Parameters:
+
+
+
+
+
+
+
+PICKUP_STASH ( id )
+Loads stashed value into current task loco.
+
+Parameters:
+
+
+
+
+
+
+
+POM ( cv , value )
+Write value to cv on current tasks loco (Program on Main)
+
+Parameters:
+
+
+
+
+
+
+
+POWEROFF
+Powers off all tracks.
+
+
+
+
+POWERON
+Powers ON all tracks.
+
+
+
+
+READ_LOCO
+Reads loco Id from prog traqck and sets currenmt task loco id.
+
+
+
+
+RED ( signal_id )
+sets signal to RED state
+
+Parameters:
+
+
+
+
+
+
+
+RESERVE ( blockid )
+Waits for token for block. If not available immediately, current task loco is stopped.
+
+Parameters:
+
+
+
+
+
+
+
+RESET ( pin , count... )
+Sets output puin LOW.
+
+Parameters:
+
+
+
+
+
+
+
+RESUME
+Resumes PAUSEd tasks.
+
+
+
+
+
+
+RETURN
+Returns to CALL.
+
+
+
+
+
+
+REV ( speed )
+Issues DCC speed packet for current loco in reverse.
+
+
+
+Parameters:
+
+
+
+
+
+
+
+ROTATE ( turntable_id , position , activity )
+????
+
+Parameters:
+
+turntable_id
+position
+activity
+
+
+
+
+
+
+
+ROTATE_DCC ( turntable_id , position )
+????
+
+Parameters:
+
+turntable_id
+position
+
+
+
+
+
+
+
+ROSTER ( cab , name , funcmap... )
+Describes a loco roster entry visible to throttles.
+
+Parameters:
+
+cab – loco DCC address or 0 for default entry
+name – Quoted text
+funcmap... – Quoted text, optional list of function names separated by / character with momentary fuinctin names prefixed with an *.
+
+
+
+
+
+
+
+ROUTE ( id , description )
+DEfines starting point of a sequence that will appear as a route on throttle buttons.
+
+Parameters:
+
+
+
+
+
+
+
+ROUTE_ACTIVE ( id )
+Tells throttle to display the route button as active.
+
+Parameters:
+
+
+
+
+
+
+
+ROUTE_INACTIVE ( id )
+Tells throttle to display the route button as inactive.
+
+Parameters:
+
+
+
+
+
+
+
+ROUTE_HIDDEN ( id )
+Tells throttle to hide the route button.
+
+Parameters:
+
+
+
+
+
+
+
+ROUTE_DISABLED ( id )
+Tells throttle to display the route button as disabled.
+
+Parameters:
+
+
+
+
+
+
+
+ROUTE_CAPTION ( id , caption )
+Tells throttle to change thr route button caption.
+
+Parameters:
+
+
+
+
+
+
+
+SENDLOCO ( cab , route )
+Start a new task to drive the loco.
+
+Parameters:
+
+
+
+
+
+
+
+SEQUENCE ( id )
+Provides a unique label than can be used to call, follow or start.
+
+
+
+
+
+Parameters:
+
+
+
+
+
+
+
+SERIAL ( msg )
+Write direct to Serial output.
+
+Parameters:
+
+
+
+
+
+
+
+SERIAL1 ( msg )
+Write direct to Serial1 output.
+
+Parameters:
+
+
+
+
+
+
+
+SERIAL2 ( msg )
+Write direct to Serial2 output.
+
+Parameters:
+
+
+
+
+
+
+
+SERIAL3 ( msg )
+Write direct to Serial3 output.
+
+Parameters:
+
+
+
+
+
+
+
+SERIAL4 ( msg )
+Write direct to Serial4 output.
+
+Parameters:
+
+
+
+
+
+
+
+SERIAL5 ( msg )
+Write direct to Serial5 output.
+
+Parameters:
+
+
+
+
+
+
+
+SERIAL6 ( msg )
+Write direct to Serial6 output.
+
+Parameters:
+
+
+
+
+
+
+
+SERVO ( id , position , profile )
+Move servo to given position.
+
+Parameters:
+
+
+
+
+
+
+
+SERVO2 ( id , position , duration )
+Move servo to given position taking time.
+
+Parameters:
+
+id
+position
+duration – mS
+
+
+
+
+
+
+
+SERVO_SIGNAL ( vpin , redpos , amberpos , greenpos )
+Dedfine a servo based signal with 3 servo positions.
+
+Parameters:
+
+vpin
+redpos
+amberpos
+greenpos
+
+
+
+
+
+
+
+SERVO_TURNOUT ( id , pin , activeAngle , inactiveAngle , profile , description... )
+Define a servo driven turnout.
+
+Parameters:
+
+
+
+
+
+
+
+SET ( pin , count... )
+Set VPIN HIGH
+
+Parameters:
+
+
+
+
+
+
+
+SET_TRACK ( track , mode )
+Set output track type.
+
+Parameters:
+
+track – A..H
+mode – ???names???
+
+
+
+
+
+
+
+SET_POWER ( track , onoff )
+Set track power mode.
+
+Parameters:
+
+track – A..H
+onoff – ??? values ???
+
+
+
+
+
+
+
+SETLOCO ( loco )
+Sets the loco being handled by the current task.
+
+Parameters:
+
+
+
+
+
+
+
+SETFREQ ( freq )
+Sets the DC track PWM frequency.
+
+Parameters:
+
+
+
+
+
+
+
+SIGNAL ( redpin , amberpin , greenpin )
+Define a Signal with LOW=on leds (is that common annode???)
+
+
+
+Parameters:
+
+redpin
+amberpin
+greenpin
+
+
+
+
+
+
+
+SIGNALH ( redpin , amberpin , greenpin )
+define a signal with HIGH=ON leds
+
+Parameters:
+
+redpin
+amberpin
+greenpin
+
+
+
+
+
+
+
+SPEED ( speed )
+Changes current tasks loco speed without changing direction.
+
+Parameters:
+
+speed – 0..127 (1=ESTOP)
+
+
+
+
+
+
+
+START ( route )
+Starts a new task at the given route/animation/sequence.
+
+Parameters:
+
+
+
+
+
+
+
+STASH ( id )
+saves cuttent tasks loco id in the stash array
+
+Parameters:
+
+
+
+
+
+
+
+STEALTH ( code... )
+Allows for embedding raw C++ code in context of current task.
+
+Parameters:
+
+
+
+
+
+
+
+STEALTH_GLOBAL ( code... )
+Allows for embedding raw c++ code out of context.
+
+Parameters:
+
+
+
+
+
+
+
+STOP
+Same as SPEED(0)
+
+
+
+
+THROW ( id )
+Throws given turnout.
+
+Parameters:
+
+
+
+
+
+
+
+TOGGLE_TURNOUT ( id )
+Toggles given turnout.
+
+Parameters:
+
+
+
+
+
+
+
+TT_ADDPOSITION ( turntable_id , position , value , angle , description... )
+Defines a turntable track position.
+
+Parameters:
+
+turntable_id
+position – ??????????
+value
+angle
+description...
+
+
+
+
+
+
+
+TURNOUT ( id , addr , subaddr , description... )
+Defines a DCC accessory turnout with legacy address.
+
+Parameters:
+
+
+
+
+
+
+
+TURNOUTL ( id , addr , description... )
+Defines a DCC accessory turnout with inear address.
+
+param id
+
+Param :
+
+Parameters:
+
+
+
+
+
+
+
+UNJOIN
+Disconnects PROG track from MAIN.
+
+
+
+
+
+
+UNLATCH ( sensor_id )
+removes latched on flag
+
+
+
+Parameters:
+
+
+
+
+
+
+
+VIRTUAL_SIGNAL ( id )
+Defines a virtual (no hardware) signal.
+
+Parameters:
+
+
+
+
+
+
+
+VIRTUAL_TURNOUT ( id , description... )
+Defines a virtual (no hardware) turnout.
+
+Parameters:
+
+
+
+
+
+
+
+WAITFOR ( pin )
+???????????????????
+
+Parameters:
+
+
+
+
+
+
+
+WAITFORTT ( turntable_id )
+
+Parameters:
+
+
+
+
+
+
+
+WITHROTTLE ( msg )
+Broadcasts a string in Withrottle protocol format to all throttles using this protocol.
+
+Parameters:
+
+
+
+
+
+
+
+XFOFF ( cab , func )
+Turns function off for given loco.
+
+Parameters:
+
+
+
+
+
+
+
+XFON ( cab , func )
+Turns function ON for given loco.
+
+Parameters:
+
+
+
+
+
+
+
+XFTOGGLE ( cab , func )
+Toggles function state for given loco.
+
+Parameters:
+
+
+
+
+
+
+
+XFWD ( cab , speed )
+Sends DCC speed to loco in forward direction.
+
+Parameters:
+
+
+
+
+
+
+
+XREV ( cab , speed )
+Sends DCC speed to loco in reverse direction.
+
+Parameters:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/devel/html/objects.inv b/devel/html/objects.inv
new file mode 100644
index 0000000..389fb74
Binary files /dev/null and b/devel/html/objects.inv differ
diff --git a/devel/html/robots.txt b/devel/html/robots.txt
new file mode 100644
index 0000000..fa4a648
--- /dev/null
+++ b/devel/html/robots.txt
@@ -0,0 +1,3 @@
+User-agent: *
+
+Sitemap: https://dcc-ex.com/CommandStation-EX/sitemap.xml
diff --git a/devel/html/search.html b/devel/html/search.html
new file mode 100644
index 0000000..3c4e11d
--- /dev/null
+++ b/devel/html/search.html
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
+
Search — EXRAIL Language documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EXRAIL Language
+
+
+
+
+
+
+
+
+
+
+
+ Please activate JavaScript to enable the search functionality.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/devel/html/searchindex.js b/devel/html/searchindex.js
new file mode 100644
index 0000000..f578b72
--- /dev/null
+++ b/devel/html/searchindex.js
@@ -0,0 +1 @@
+Search.setIndex({"alltitles": {"EXRAIL Language documentation": [[0, null]], "Introduction": [[0, "introduction"]], "Macros": [[0, "macros"]]}, "docnames": ["index"], "envversion": {"sphinx": 64, "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}, "filenames": ["index.rst"], "indexentries": {"acof (c macro)": [[0, "c.ACOF", false]], "acon (c macro)": [[0, "c.ACON", false]], "activate (c macro)": [[0, "c.ACTIVATE", false]], "activatel (c macro)": [[0, "c.ACTIVATEL", false]], "after (c macro)": [[0, "c.AFTER", false]], "afteroverload (c macro)": [[0, "c.AFTEROVERLOAD", false]], "alias (c macro)": [[0, "c.ALIAS", false]], "amber (c macro)": [[0, "c.AMBER", false]], "anout (c macro)": [[0, "c.ANOUT", false]], "aspect (c macro)": [[0, "c.ASPECT", false]], "at (c macro)": [[0, "c.AT", false]], "atgte (c macro)": [[0, "c.ATGTE", false]], "atlt (c macro)": [[0, "c.ATLT", false]], "attimeout (c macro)": [[0, "c.ATTIMEOUT", false]], "automation (c macro)": [[0, "c.AUTOMATION", false]], "autostart (c macro)": [[0, "c.AUTOSTART", false]], "blink (c macro)": [[0, "c.BLINK", false]], "broadcast (c macro)": [[0, "c.BROADCAST", false]], "call (c macro)": [[0, "c.CALL", false]], "clear_all_stash (c macro)": [[0, "c.CLEAR_ALL_STASH", false]], "clear_stash (c macro)": [[0, "c.CLEAR_STASH", false]], "close (c macro)": [[0, "c.CLOSE", false]], "configure_servo (c macro)": [[0, "c.CONFIGURE_SERVO", false]], "dcc_signal (c macro)": [[0, "c.DCC_SIGNAL", false]], "dcc_turntable (c macro)": [[0, "c.DCC_TURNTABLE", false]], "dccx_signal (c macro)": [[0, "c.DCCX_SIGNAL", false]], "deactivate (c macro)": [[0, "c.DEACTIVATE", false]], "deactivatel (c macro)": [[0, "c.DEACTIVATEL", false]], "delay (c macro)": [[0, "c.DELAY", false]], "delaymins (c macro)": [[0, "c.DELAYMINS", false]], "delayrandom (c macro)": [[0, "c.DELAYRANDOM", false]], "done (c macro)": [[0, "c.DONE", false]], "drive (c macro)": [[0, "c.DRIVE", false]], "else (c macro)": [[0, "c.ELSE", false]], "endexrail (c macro)": [[0, "c.ENDEXRAIL", false]], "endif (c macro)": [[0, "c.ENDIF", false]], "endtask (c macro)": [[0, "c.ENDTASK", false]], "estop (c macro)": [[0, "c.ESTOP", false]], "exrail (c macro)": [[0, "c.EXRAIL", false]], "extt_turntable (c macro)": [[0, "c.EXTT_TURNTABLE", false]], "fade (c macro)": [[0, "c.FADE", false]], "foff (c macro)": [[0, "c.FOFF", false]], "follow (c macro)": [[0, "c.FOLLOW", false]], "fon (c macro)": [[0, "c.FON", false]], "forget (c macro)": [[0, "c.FORGET", false]], "free (c macro)": [[0, "c.FREE", false]], "ftoggle (c macro)": [[0, "c.FTOGGLE", false]], "fwd (c macro)": [[0, "c.FWD", false]], "green (c macro)": [[0, "c.GREEN", false]], "hal (c macro)": [[0, "c.HAL", false]], "hal_ignore_defaults (c macro)": [[0, "c.HAL_IGNORE_DEFAULTS", false]], "if (c macro)": [[0, "c.IF", false]], "ifamber (c macro)": [[0, "c.IFAMBER", false]], "ifclosed (c macro)": [[0, "c.IFCLOSED", false]], "ifgreen (c macro)": [[0, "c.IFGREEN", false]], "ifgte (c macro)": [[0, "c.IFGTE", false]], "ifloco (c macro)": [[0, "c.IFLOCO", false]], "iflt (c macro)": [[0, "c.IFLT", false]], "ifnot (c macro)": [[0, "c.IFNOT", false]], "ifrandom (c macro)": [[0, "c.IFRANDOM", false]], "ifre (c macro)": [[0, "c.IFRE", false]], "ifred (c macro)": [[0, "c.IFRED", false]], "ifreserve (c macro)": [[0, "c.IFRESERVE", false]], "ifthrown (c macro)": [[0, "c.IFTHROWN", false]], "iftimeout (c macro)": [[0, "c.IFTIMEOUT", false]], "ifttposition (c macro)": [[0, "c.IFTTPOSITION", false]], "invert_direction (c macro)": [[0, "c.INVERT_DIRECTION", false]], "jmri_sensor (c macro)": [[0, "c.JMRI_SENSOR", false]], "join (c macro)": [[0, "c.JOIN", false]], "killall (c macro)": [[0, "c.KILLALL", false]], "latch (c macro)": [[0, "c.LATCH", false]], "lcc (c macro)": [[0, "c.LCC", false]], "lccx (c macro)": [[0, "c.LCCX", false]], "lcd (c macro)": [[0, "c.LCD", false]], "lcn (c macro)": [[0, "c.LCN", false]], "message (c macro)": [[0, "c.MESSAGE", false]], "movett (c macro)": [[0, "c.MOVETT", false]], "neopixel (c macro)": [[0, "c.NEOPIXEL", false]], "neopixel_signal (c macro)": [[0, "c.NEOPIXEL_SIGNAL", false]], "onacof (c macro)": [[0, "c.ONACOF", false]], "onacon (c macro)": [[0, "c.ONACON", false]], "onactivate (c macro)": [[0, "c.ONACTIVATE", false]], "onactivatel (c macro)": [[0, "c.ONACTIVATEL", false]], "onamber (c macro)": [[0, "c.ONAMBER", false]], "onbutton (c macro)": [[0, "c.ONBUTTON", false]], "onchange (c macro)": [[0, "c.ONCHANGE", false]], "onclockmins (c macro)": [[0, "c.ONCLOCKMINS", false]], "onclocktime (c macro)": [[0, "c.ONCLOCKTIME", false]], "onclose (c macro)": [[0, "c.ONCLOSE", false]], "ondeactivate (c macro)": [[0, "c.ONDEACTIVATE", false]], "ondeactivatel (c macro)": [[0, "c.ONDEACTIVATEL", false]], "ongreen (c macro)": [[0, "c.ONGREEN", false]], "onlcc (c macro)": [[0, "c.ONLCC", false]], "onoverload (c macro)": [[0, "c.ONOVERLOAD", false]], "onred (c macro)": [[0, "c.ONRED", false]], "onrotate (c macro)": [[0, "c.ONROTATE", false]], "onsensor (c macro)": [[0, "c.ONSENSOR", false]], "onthrow (c macro)": [[0, "c.ONTHROW", false]], "ontime (c macro)": [[0, "c.ONTIME", false]], "parse (c macro)": [[0, "c.PARSE", false]], "pause (c macro)": [[0, "c.PAUSE", false]], "pickup_stash (c macro)": [[0, "c.PICKUP_STASH", false]], "pin_turnout (c macro)": [[0, "c.PIN_TURNOUT", false]], "pom (c macro)": [[0, "c.POM", false]], "poweroff (c macro)": [[0, "c.POWEROFF", false]], "poweron (c macro)": [[0, "c.POWERON", false]], "print (c macro)": [[0, "c.PRINT", false]], "read_loco (c macro)": [[0, "c.READ_LOCO", false]], "red (c macro)": [[0, "c.RED", false]], "reserve (c macro)": [[0, "c.RESERVE", false]], "reset (c macro)": [[0, "c.RESET", false]], "resume (c macro)": [[0, "c.RESUME", false]], "return (c macro)": [[0, "c.RETURN", false]], "rev (c macro)": [[0, "c.REV", false]], "roster (c macro)": [[0, "c.ROSTER", false]], "rotate (c macro)": [[0, "c.ROTATE", false]], "rotate_dcc (c macro)": [[0, "c.ROTATE_DCC", false]], "route (c macro)": [[0, "c.ROUTE", false]], "route_active (c macro)": [[0, "c.ROUTE_ACTIVE", false]], "route_caption (c macro)": [[0, "c.ROUTE_CAPTION", false]], "route_disabled (c macro)": [[0, "c.ROUTE_DISABLED", false]], "route_hidden (c macro)": [[0, "c.ROUTE_HIDDEN", false]], "route_inactive (c macro)": [[0, "c.ROUTE_INACTIVE", false]], "screen (c macro)": [[0, "c.SCREEN", false]], "sendloco (c macro)": [[0, "c.SENDLOCO", false]], "sequence (c macro)": [[0, "c.SEQUENCE", false]], "serial (c macro)": [[0, "c.SERIAL", false]], "serial1 (c macro)": [[0, "c.SERIAL1", false]], "serial2 (c macro)": [[0, "c.SERIAL2", false]], "serial3 (c macro)": [[0, "c.SERIAL3", false]], "serial4 (c macro)": [[0, "c.SERIAL4", false]], "serial5 (c macro)": [[0, "c.SERIAL5", false]], "serial6 (c macro)": [[0, "c.SERIAL6", false]], "servo (c macro)": [[0, "c.SERVO", false]], "servo2 (c macro)": [[0, "c.SERVO2", false]], "servo_signal (c macro)": [[0, "c.SERVO_SIGNAL", false]], "servo_turnout (c macro)": [[0, "c.SERVO_TURNOUT", false]], "set (c macro)": [[0, "c.SET", false]], "set_power (c macro)": [[0, "c.SET_POWER", false]], "set_track (c macro)": [[0, "c.SET_TRACK", false]], "setfreq (c macro)": [[0, "c.SETFREQ", false]], "setloco (c macro)": [[0, "c.SETLOCO", false]], "signal (c macro)": [[0, "c.SIGNAL", false]], "signalh (c macro)": [[0, "c.SIGNALH", false]], "speed (c macro)": [[0, "c.SPEED", false]], "start (c macro)": [[0, "c.START", false]], "stash (c macro)": [[0, "c.STASH", false]], "stealth (c macro)": [[0, "c.STEALTH", false]], "stealth_global (c macro)": [[0, "c.STEALTH_GLOBAL", false]], "stop (c macro)": [[0, "c.STOP", false]], "throw (c macro)": [[0, "c.THROW", false]], "toggle_turnout (c macro)": [[0, "c.TOGGLE_TURNOUT", false]], "tt_addposition (c macro)": [[0, "c.TT_ADDPOSITION", false]], "turnout (c macro)": [[0, "c.TURNOUT", false]], "turnoutl (c macro)": [[0, "c.TURNOUTL", false]], "unjoin (c macro)": [[0, "c.UNJOIN", false]], "unlatch (c macro)": [[0, "c.UNLATCH", false]], "virtual_signal (c macro)": [[0, "c.VIRTUAL_SIGNAL", false]], "virtual_turnout (c macro)": [[0, "c.VIRTUAL_TURNOUT", false]], "waitfor (c macro)": [[0, "c.WAITFOR", false]], "waitfortt (c macro)": [[0, "c.WAITFORTT", false]], "withrottle (c macro)": [[0, "c.WITHROTTLE", false]], "xfoff (c macro)": [[0, "c.XFOFF", false]], "xfon (c macro)": [[0, "c.XFON", false]], "xftoggle (c macro)": [[0, "c.XFTOGGLE", false]], "xfwd (c macro)": [[0, "c.XFWD", false]], "xrev (c macro)": [[0, "c.XREV", false]]}, "objects": {"": [[0, 0, 1, "c.ACOF", "ACOF"], [0, 0, 1, "c.ACON", "ACON"], [0, 0, 1, "c.ACTIVATE", "ACTIVATE"], [0, 0, 1, "c.ACTIVATEL", "ACTIVATEL"], [0, 0, 1, "c.AFTER", "AFTER"], [0, 0, 1, "c.AFTEROVERLOAD", "AFTEROVERLOAD"], [0, 0, 1, "c.ALIAS", "ALIAS"], [0, 0, 1, "c.AMBER", "AMBER"], [0, 0, 1, "c.ANOUT", "ANOUT"], [0, 0, 1, "c.ASPECT", "ASPECT"], [0, 0, 1, "c.AT", "AT"], [0, 0, 1, "c.ATGTE", "ATGTE"], [0, 0, 1, "c.ATLT", "ATLT"], [0, 0, 1, "c.ATTIMEOUT", "ATTIMEOUT"], [0, 0, 1, "c.AUTOMATION", "AUTOMATION"], [0, 0, 1, "c.AUTOSTART", "AUTOSTART"], [0, 0, 1, "c.BLINK", "BLINK"], [0, 0, 1, "c.BROADCAST", "BROADCAST"], [0, 0, 1, "c.CALL", "CALL"], [0, 0, 1, "c.CLEAR_ALL_STASH", "CLEAR_ALL_STASH"], [0, 0, 1, "c.CLEAR_STASH", "CLEAR_STASH"], [0, 0, 1, "c.CLOSE", "CLOSE"], [0, 0, 1, "c.CONFIGURE_SERVO", "CONFIGURE_SERVO"], [0, 0, 1, "c.DCCX_SIGNAL", "DCCX_SIGNAL"], [0, 0, 1, "c.DCC_SIGNAL", "DCC_SIGNAL"], [0, 0, 1, "c.DCC_TURNTABLE", "DCC_TURNTABLE"], [0, 0, 1, "c.DEACTIVATE", "DEACTIVATE"], [0, 0, 1, "c.DEACTIVATEL", "DEACTIVATEL"], [0, 0, 1, "c.DELAY", "DELAY"], [0, 0, 1, "c.DELAYMINS", "DELAYMINS"], [0, 0, 1, "c.DELAYRANDOM", "DELAYRANDOM"], [0, 0, 1, "c.DONE", "DONE"], [0, 0, 1, "c.DRIVE", "DRIVE"], [0, 0, 1, "c.ELSE", "ELSE"], [0, 0, 1, "c.ENDEXRAIL", "ENDEXRAIL"], [0, 0, 1, "c.ENDIF", "ENDIF"], [0, 0, 1, "c.ENDTASK", "ENDTASK"], [0, 0, 1, "c.ESTOP", "ESTOP"], [0, 0, 1, "c.EXRAIL", "EXRAIL"], [0, 0, 1, "c.EXTT_TURNTABLE", "EXTT_TURNTABLE"], [0, 0, 1, "c.FADE", "FADE"], [0, 0, 1, "c.FOFF", "FOFF"], [0, 0, 1, "c.FOLLOW", "FOLLOW"], [0, 0, 1, "c.FON", "FON"], [0, 0, 1, "c.FORGET", "FORGET"], [0, 0, 1, "c.FREE", "FREE"], [0, 0, 1, "c.FTOGGLE", "FTOGGLE"], [0, 0, 1, "c.FWD", "FWD"], [0, 0, 1, "c.GREEN", "GREEN"], [0, 0, 1, "c.HAL", "HAL"], [0, 0, 1, "c.HAL_IGNORE_DEFAULTS", "HAL_IGNORE_DEFAULTS"], [0, 0, 1, "c.IF", "IF"], [0, 0, 1, "c.IFAMBER", "IFAMBER"], [0, 0, 1, "c.IFCLOSED", "IFCLOSED"], [0, 0, 1, "c.IFGREEN", "IFGREEN"], [0, 0, 1, "c.IFGTE", "IFGTE"], [0, 0, 1, "c.IFLOCO", "IFLOCO"], [0, 0, 1, "c.IFLT", "IFLT"], [0, 0, 1, "c.IFNOT", "IFNOT"], [0, 0, 1, "c.IFRANDOM", "IFRANDOM"], [0, 0, 1, "c.IFRE", "IFRE"], [0, 0, 1, "c.IFRED", "IFRED"], [0, 0, 1, "c.IFRESERVE", "IFRESERVE"], [0, 0, 1, "c.IFTHROWN", "IFTHROWN"], [0, 0, 1, "c.IFTIMEOUT", "IFTIMEOUT"], [0, 0, 1, "c.IFTTPOSITION", "IFTTPOSITION"], [0, 0, 1, "c.INVERT_DIRECTION", "INVERT_DIRECTION"], [0, 0, 1, "c.JMRI_SENSOR", "JMRI_SENSOR"], [0, 0, 1, "c.JOIN", "JOIN"], [0, 0, 1, "c.KILLALL", "KILLALL"], [0, 0, 1, "c.LATCH", "LATCH"], [0, 0, 1, "c.LCC", "LCC"], [0, 0, 1, "c.LCCX", "LCCX"], [0, 0, 1, "c.LCD", "LCD"], [0, 0, 1, "c.LCN", "LCN"], [0, 0, 1, "c.MESSAGE", "MESSAGE"], [0, 0, 1, "c.MOVETT", "MOVETT"], [0, 0, 1, "c.NEOPIXEL", "NEOPIXEL"], [0, 0, 1, "c.NEOPIXEL_SIGNAL", "NEOPIXEL_SIGNAL"], [0, 0, 1, "c.ONACOF", "ONACOF"], [0, 0, 1, "c.ONACON", "ONACON"], [0, 0, 1, "c.ONACTIVATE", "ONACTIVATE"], [0, 0, 1, "c.ONACTIVATEL", "ONACTIVATEL"], [0, 0, 1, "c.ONAMBER", "ONAMBER"], [0, 0, 1, "c.ONBUTTON", "ONBUTTON"], [0, 0, 1, "c.ONCHANGE", "ONCHANGE"], [0, 0, 1, "c.ONCLOCKMINS", "ONCLOCKMINS"], [0, 0, 1, "c.ONCLOCKTIME", "ONCLOCKTIME"], [0, 0, 1, "c.ONCLOSE", "ONCLOSE"], [0, 0, 1, "c.ONDEACTIVATE", "ONDEACTIVATE"], [0, 0, 1, "c.ONDEACTIVATEL", "ONDEACTIVATEL"], [0, 0, 1, "c.ONGREEN", "ONGREEN"], [0, 0, 1, "c.ONLCC", "ONLCC"], [0, 0, 1, "c.ONOVERLOAD", "ONOVERLOAD"], [0, 0, 1, "c.ONRED", "ONRED"], [0, 0, 1, "c.ONROTATE", "ONROTATE"], [0, 0, 1, "c.ONSENSOR", "ONSENSOR"], [0, 0, 1, "c.ONTHROW", "ONTHROW"], [0, 0, 1, "c.ONTIME", "ONTIME"], [0, 0, 1, "c.PARSE", "PARSE"], [0, 0, 1, "c.PAUSE", "PAUSE"], [0, 0, 1, "c.PICKUP_STASH", "PICKUP_STASH"], [0, 0, 1, "c.PIN_TURNOUT", "PIN_TURNOUT"], [0, 0, 1, "c.POM", "POM"], [0, 0, 1, "c.POWEROFF", "POWEROFF"], [0, 0, 1, "c.POWERON", "POWERON"], [0, 0, 1, "c.PRINT", "PRINT"], [0, 0, 1, "c.READ_LOCO", "READ_LOCO"], [0, 0, 1, "c.RED", "RED"], [0, 0, 1, "c.RESERVE", "RESERVE"], [0, 0, 1, "c.RESET", "RESET"], [0, 0, 1, "c.RESUME", "RESUME"], [0, 0, 1, "c.RETURN", "RETURN"], [0, 0, 1, "c.REV", "REV"], [0, 0, 1, "c.ROSTER", "ROSTER"], [0, 0, 1, "c.ROTATE", "ROTATE"], [0, 0, 1, "c.ROTATE_DCC", "ROTATE_DCC"], [0, 0, 1, "c.ROUTE", "ROUTE"], [0, 0, 1, "c.ROUTE_ACTIVE", "ROUTE_ACTIVE"], [0, 0, 1, "c.ROUTE_CAPTION", "ROUTE_CAPTION"], [0, 0, 1, "c.ROUTE_DISABLED", "ROUTE_DISABLED"], [0, 0, 1, "c.ROUTE_HIDDEN", "ROUTE_HIDDEN"], [0, 0, 1, "c.ROUTE_INACTIVE", "ROUTE_INACTIVE"], [0, 0, 1, "c.SCREEN", "SCREEN"], [0, 0, 1, "c.SENDLOCO", "SENDLOCO"], [0, 0, 1, "c.SEQUENCE", "SEQUENCE"], [0, 0, 1, "c.SERIAL", "SERIAL"], [0, 0, 1, "c.SERIAL1", "SERIAL1"], [0, 0, 1, "c.SERIAL2", "SERIAL2"], [0, 0, 1, "c.SERIAL3", "SERIAL3"], [0, 0, 1, "c.SERIAL4", "SERIAL4"], [0, 0, 1, "c.SERIAL5", "SERIAL5"], [0, 0, 1, "c.SERIAL6", "SERIAL6"], [0, 0, 1, "c.SERVO", "SERVO"], [0, 0, 1, "c.SERVO2", "SERVO2"], [0, 0, 1, "c.SERVO_SIGNAL", "SERVO_SIGNAL"], [0, 0, 1, "c.SERVO_TURNOUT", "SERVO_TURNOUT"], [0, 0, 1, "c.SET", "SET"], [0, 0, 1, "c.SETFREQ", "SETFREQ"], [0, 0, 1, "c.SETLOCO", "SETLOCO"], [0, 0, 1, "c.SET_POWER", "SET_POWER"], [0, 0, 1, "c.SET_TRACK", "SET_TRACK"], [0, 0, 1, "c.SIGNAL", "SIGNAL"], [0, 0, 1, "c.SIGNALH", "SIGNALH"], [0, 0, 1, "c.SPEED", "SPEED"], [0, 0, 1, "c.START", "START"], [0, 0, 1, "c.STASH", "STASH"], [0, 0, 1, "c.STEALTH", "STEALTH"], [0, 0, 1, "c.STEALTH_GLOBAL", "STEALTH_GLOBAL"], [0, 0, 1, "c.STOP", "STOP"], [0, 0, 1, "c.THROW", "THROW"], [0, 0, 1, "c.TOGGLE_TURNOUT", "TOGGLE_TURNOUT"], [0, 0, 1, "c.TT_ADDPOSITION", "TT_ADDPOSITION"], [0, 0, 1, "c.TURNOUT", "TURNOUT"], [0, 0, 1, "c.TURNOUTL", "TURNOUTL"], [0, 0, 1, "c.UNJOIN", "UNJOIN"], [0, 0, 1, "c.UNLATCH", "UNLATCH"], [0, 0, 1, "c.VIRTUAL_SIGNAL", "VIRTUAL_SIGNAL"], [0, 0, 1, "c.VIRTUAL_TURNOUT", "VIRTUAL_TURNOUT"], [0, 0, 1, "c.WAITFOR", "WAITFOR"], [0, 0, 1, "c.WAITFORTT", "WAITFORTT"], [0, 0, 1, "c.WITHROTTLE", "WITHROTTLE"], [0, 0, 1, "c.XFOFF", "XFOFF"], [0, 0, 1, "c.XFON", "XFON"], [0, 0, 1, "c.XFTOGGLE", "XFTOGGLE"], [0, 0, 1, "c.XFWD", "XFWD"], [0, 0, 1, "c.XREV", "XREV"]]}, "objnames": {"0": ["c", "macro", "C macro"]}, "objtypes": {"0": "c:macro"}, "terms": {"0": 0, "1": 0, "127": 0, "255": 0, "3": 0, "500": 0, "A": 0, "AT": 0, "IF": 0, "If": 0, "ON": 0, "abov": 0, "accessori": 0, "acof": 0, "acon": 0, "activ": 0, "activatel": 0, "activeangl": 0, "adapt": 0, "add": 0, "addr": 0, "address": 0, "advanc": 0, "after": 0, "afteroverload": 0, "agttempt": 0, "alia": 0, "all": 0, "allow": 0, "also": 0, "altern": 0, "amber": 0, "amberaspect": 0, "ambercolour": 0, "amberpin": 0, "amberpo": 0, "an": 0, "analog": 0, "analogpin": 0, "angl": 0, "ani": 0, "anim": 0, "annod": 0, "anoth": 0, "anout": 0, "appear": 0, "ar": 0, "arrai": 0, "aspect": 0, "atgt": 0, "atlt": 0, "attimeout": 0, "autom": 0, "automat": 0, "autostart": 0, "avail": 0, "b": 0, "base": 0, "basic": 0, "becom": 0, "being": 0, "between": 0, "blink": 0, "block": 0, "blockid": 0, "blue": 0, "broadcast": 0, "button": 0, "c": 0, "cab": 0, "call": 0, "can": 0, "capabl": 0, "capot": 0, "caption": 0, "cbu": 0, "chang": 0, "charact": 0, "check": 0, "clear": 0, "clear_all_stash": 0, "clear_stash": 0, "close": 0, "code": 0, "colour": 0, "command": 0, "commandst": 0, "common": 0, "compon": 0, "configur": 0, "configure_servo": 0, "consecut": 0, "consecutin": 0, "context": 0, "control": 0, "count": 0, "creat": 0, "curremnt": 0, "currenmt": 0, "current": 0, "cuttent": 0, "cv": 0, "dai": 0, "dc": 0, "dcc": 0, "dcc_signal": 0, "dcc_turntabl": 0, "dccx_signal": 0, "deactiv": 0, "deactivatel": 0, "debounc": 0, "decativ": 0, "dedfin": 0, "default": 0, "defi": 0, "defin": 0, "delai": 0, "delaymin": 0, "delayrandom": 0, "depend": 0, "describ": 0, "descript": 0, "determin": 0, "devic": 0, "diagnost": 0, "differ": 0, "direct": 0, "disabl": 0, "disconnect": 0, "displai": 0, "do": 0, "done": 0, "drive": 0, "driven": 0, "driver": 0, "durat": 0, "effect": 0, "els": 0, "embed": 0, "emerg": 0, "end": 0, "endexrail": 0, "endif": 0, "endtask": 0, "enter": 0, "entri": 0, "estop": 0, "etc": 0, "event": 0, "eventid": 0, "ex": 0, "except": 0, "execut": 0, "expect": 0, "extend": 0, "extern": 0, "extra": 0, "extt_turnt": 0, "fade": 0, "fals": 0, "fastclock": 0, "feedback": 0, "finction": 0, "flag": 0, "foff": 0, "follow": 0, "fon": 0, "forget": 0, "format": 0, "forward": 0, "free": 0, "freq": 0, "frequenc": 0, "from": 0, "ftoggl": 0, "fuinctin": 0, "func": 0, "funcmap": 0, "function": 0, "fwd": 0, "g": 0, "gate": 0, "given": 0, "goe": 0, "goto": 0, "greater": 0, "green": 0, "greenaspect": 0, "greencolour": 0, "greenpin": 0, "greenpo": 0, "gturntabl": 0, "h": 0, "ha": 0, "hadler": 0, "hal": 0, "hal_ignore_default": 0, "haltyp": 0, "hand": 0, "handl": 0, "hardwar": 0, "have": 0, "here": 0, "hidden": 0, "hide": 0, "high": 0, "home": 0, "hour": 0, "hourli": 0, "human": 0, "i": 0, "id": 0, "ifamb": 0, "ifclos": 0, "ifgreen": 0, "ifgt": 0, "ifloco": 0, "iflt": 0, "ifnot": 0, "ifr": 0, "ifrandom": 0, "ifreserv": 0, "ifthrown": 0, "iftimeout": 0, "ifttposit": 0, "ignor": 0, "immedi": 0, "imperson": 0, "inact": 0, "inactiveangl": 0, "includ": 0, "inear": 0, "instruct": 0, "interfac": 0, "intil": 0, "introduc": 0, "invers": 0, "invert": 0, "invert_direct": 0, "issu": 0, "jmri": 0, "jmri_sensor": 0, "join": 0, "jump": 0, "keyword": 0, "killal": 0, "kind": 0, "label": 0, "larg": 0, "latch": 0, "lcc": 0, "lccx": 0, "lcd": 0, "lcn": 0, "led": 0, "legaci": 0, "less": 0, "linear": 0, "list": 0, "load": 0, "loc": 0, "local": 0, "loco": 0, "loco_id": 0, "logic": 0, "long": 0, "longaddr": 0, "low": 0, "m": 0, "mai": 0, "main": 0, "make": 0, "manipul": 0, "map": 0, "mark": 0, "match": 0, "max": 0, "maxdelai": 0, "mean": 0, "merg": 0, "messag": 0, "millisecond": 0, "min": 0, "mindelai": 0, "minut": 0, "mode": 0, "modifi": 0, "momentari": 0, "move": 0, "movement": 0, "movett": 0, "msg": 0, "multi": 0, "multipl": 0, "must": 0, "name": 0, "neg": 0, "neopixel": 0, "neopixel_sign": 0, "neorgb": 0, "nest": 0, "new": 0, "non": 0, "normal": 0, "number": 0, "numer": 0, "obsolet": 0, "off": 0, "offduti": 0, "ol": 0, "omit": 0, "onacof": 0, "onacon": 0, "onactiv": 0, "onactivatel": 0, "onamb": 0, "onbutton": 0, "onchang": 0, "onclockmin": 0, "onclocktim": 0, "onclos": 0, "ondeactiv": 0, "ondeactivatel": 0, "onduti": 0, "one": 0, "ongreen": 0, "onlcc": 0, "onli": 0, "onoff": 0, "onoverload": 0, "onr": 0, "onrot": 0, "onsensor": 0, "onthrow": 0, "ontim": 0, "oper": 0, "option": 0, "other": 0, "out": 0, "output": 0, "over": 0, "overload": 0, "packet": 0, "page": 0, "param": 0, "param1": 0, "param2": 0, "paramet": 0, "pars": 0, "path": 0, "paus": 0, "percent": 0, "perform": 0, "pickup_stash": 0, "pin": 0, "pin_turnout": 0, "pixel": 0, "point": 0, "pom": 0, "pos1": 0, "pos2": 0, "posit": 0, "power": 0, "poweroff": 0, "poweron": 0, "prefer": 0, "prefix": 0, "previous": 0, "print": 0, "probabl": 0, "process": 0, "profil": 0, "prog": 0, "program": 0, "protocol": 0, "provid": 0, "puin": 0, "pwm": 0, "quot": 0, "r": 0, "railroad": 0, "random": 0, "randomli": 0, "raw": 0, "reach": 0, "read": 0, "read_loco": 0, "readabl": 0, "recei": 0, "receiv": 0, "red": 0, "redaspect": 0, "redcolour": 0, "redpin": 0, "redpo": 0, "refer": 0, "remain": 0, "remind": 0, "remov": 0, "request": 0, "reserv": 0, "reset": 0, "resolv": 0, "resum": 0, "return": 0, "rev": 0, "revers": 0, "rgb": 0, "roster": 0, "rotat": 0, "rotate_dcc": 0, "rout": 0, "route_act": 0, "route_capt": 0, "route_dis": 0, "route_hidden": 0, "route_inact": 0, "row": 0, "run": 0, "same": 0, "satisfi": 0, "satisfield": 0, "satisfil": 0, "save": 0, "screen": 0, "see": 0, "send": 0, "sender": 0, "senderid": 0, "sendloco": 0, "sensor": 0, "sensor_id": 0, "sent": 0, "separ": 0, "sequenc": 0, "sequenti": 0, "serial": 0, "serial1": 0, "serial2": 0, "serial3": 0, "serial4": 0, "serial5": 0, "serial6": 0, "servo": 0, "servo2": 0, "servo_sign": 0, "servo_turnout": 0, "set": 0, "set_pow": 0, "set_track": 0, "setfreq": 0, "setloco": 0, "setup": 0, "short": 0, "shown": 0, "sigid": 0, "signal": 0, "signal_id": 0, "signalh": 0, "signl": 0, "singl": 0, "slowli": 0, "so": 0, "someth": 0, "specif": 0, "speed": 0, "start": 0, "startup": 0, "stash": 0, "state": 0, "station": 0, "statu": 0, "stealth": 0, "stealth_glob": 0, "step": 0, "stop": 0, "string": 0, "subaddr": 0, "subaddress": 0, "switch": 0, "system": 0, "tabl": 0, "take": 0, "target": 0, "task": 0, "tell": 0, "termin": 0, "tertmin": 0, "text": 0, "than": 0, "thi": 0, "thr": 0, "throttl": 0, "throw": 0, "thrown": 0, "time": 0, "timeout": 0, "timeout_m": 0, "timer": 0, "tirnout": 0, "toggl": 0, "toggle_turnout": 0, "token": 0, "track": 0, "track_id": 0, "transfer": 0, "traqck": 0, "tt_addposit": 0, "turn": 0, "turnout": 0, "turnout_id": 0, "turnoutl": 0, "turntabl": 0, "turntable_id": 0, "type": 0, "typic": 0, "uniqu": 0, "unjoin": 0, "unlatch": 0, "until": 0, "us": 0, "usb": 0, "user": 0, "valu": 0, "virtual": 0, "virtual_sign": 0, "virtual_turnout": 0, "visibl": 0, "vpim": 0, "vpin": 0, "wa": 0, "wait": 0, "waitfor": 0, "waitfortt": 0, "when": 0, "where": 0, "whether": 0, "which": 0, "while": 0, "without": 0, "withrottl": 0, "write": 0, "xfoff": 0, "xfon": 0, "xftoggl": 0, "xfwd": 0, "xrev": 0}, "titles": ["EXRAIL Language documentation"], "titleterms": {"document": 0, "exrail": 0, "introduct": 0, "languag": 0, "macro": 0}})
\ No newline at end of file
diff --git a/devel/html/sitemap.xml b/devel/html/sitemap.xml
new file mode 100644
index 0000000..a953c77
--- /dev/null
+++ b/devel/html/sitemap.xml
@@ -0,0 +1,2 @@
+
+
https://dcc-ex.com/CommandStation-EX/devel/en/index.html https://dcc-ex.com/CommandStation-EX/devel/en/genindex.html https://dcc-ex.com/CommandStation-EX/devel/en/search.html
\ No newline at end of file