UNPKG

docsify

Version:

A magical documentation generator.

8,123 lines • 338 kB
/*!
 * Docsify v5.1.0
 * https://docsify.js.org
 * (c) 2017-2026
 * MIT license
 */
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};

function getDefaultExportFromCjs(x) {
    return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
}

var prism$1 = {
    exports: {}
};

var hasRequiredPrism;

function requirePrism() {
    if (hasRequiredPrism) return prism$1.exports;
    hasRequiredPrism = 1;
    (function(module) {
        var _self = typeof window !== "undefined" ? window : typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope ? self : {};
        var Prism = function(_self) {
            var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i;
            var uniqueId = 0;
            var plainTextGrammar = {};
            var _ = {
                manual: _self.Prism && _self.Prism.manual,
                disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,
                util: {
                    encode: function encode(tokens) {
                        if (tokens instanceof Token) {
                            return new Token(tokens.type, encode(tokens.content), tokens.alias);
                        } else if (Array.isArray(tokens)) {
                            return tokens.map(encode);
                        } else {
                            return tokens.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/\u00a0/g, " ");
                        }
                    },
                    type: function(o) {
                        return Object.prototype.toString.call(o).slice(8, -1);
                    },
                    objId: function(obj) {
                        if (!obj["__id"]) {
                            Object.defineProperty(obj, "__id", {
                                value: ++uniqueId
                            });
                        }
                        return obj["__id"];
                    },
                    clone: function deepClone(o, visited) {
                        visited = visited || {};
                        var clone;
                        var id;
                        switch (_.util.type(o)) {
                          case "Object":
                            id = _.util.objId(o);
                            if (visited[id]) {
                                return visited[id];
                            }
                            clone = {};
                            visited[id] = clone;
                            for (var key in o) {
                                if (o.hasOwnProperty(key)) {
                                    clone[key] = deepClone(o[key], visited);
                                }
                            }
                            return clone;

                          case "Array":
                            id = _.util.objId(o);
                            if (visited[id]) {
                                return visited[id];
                            }
                            clone = [];
                            visited[id] = clone;
                            o.forEach((function(v, i) {
                                clone[i] = deepClone(v, visited);
                            }));
                            return clone;

                          default:
                            return o;
                        }
                    },
                    getLanguage: function(element) {
                        while (element) {
                            var m = lang.exec(element.className);
                            if (m) {
                                return m[1].toLowerCase();
                            }
                            element = element.parentElement;
                        }
                        return "none";
                    },
                    setLanguage: function(element, language) {
                        element.className = element.className.replace(RegExp(lang, "gi"), "");
                        element.classList.add("language-" + language);
                    },
                    currentScript: function() {
                        if (typeof document === "undefined") {
                            return null;
                        }
                        if (document.currentScript && document.currentScript.tagName === "SCRIPT" && 1 < 2) {
                            return document.currentScript;
                        }
                        try {
                            throw new Error;
                        } catch (err) {
                            var src = (/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(err.stack) || [])[1];
                            if (src) {
                                var scripts = document.getElementsByTagName("script");
                                for (var i in scripts) {
                                    if (scripts[i].src == src) {
                                        return scripts[i];
                                    }
                                }
                            }
                            return null;
                        }
                    },
                    isActive: function(element, className, defaultActivation) {
                        var no = "no-" + className;
                        while (element) {
                            var classList = element.classList;
                            if (classList.contains(className)) {
                                return true;
                            }
                            if (classList.contains(no)) {
                                return false;
                            }
                            element = element.parentElement;
                        }
                        return !!defaultActivation;
                    }
                },
                languages: {
                    plain: plainTextGrammar,
                    plaintext: plainTextGrammar,
                    text: plainTextGrammar,
                    txt: plainTextGrammar,
                    extend: function(id, redef) {
                        var lang = _.util.clone(_.languages[id]);
                        for (var key in redef) {
                            lang[key] = redef[key];
                        }
                        return lang;
                    },
                    insertBefore: function(inside, before, insert, root) {
                        root = root || _.languages;
                        var grammar = root[inside];
                        var ret = {};
                        for (var token in grammar) {
                            if (grammar.hasOwnProperty(token)) {
                                if (token == before) {
                                    for (var newToken in insert) {
                                        if (insert.hasOwnProperty(newToken)) {
                                            ret[newToken] = insert[newToken];
                                        }
                                    }
                                }
                                if (!insert.hasOwnProperty(token)) {
                                    ret[token] = grammar[token];
                                }
                            }
                        }
                        var old = root[inside];
                        root[inside] = ret;
                        _.languages.DFS(_.languages, (function(key, value) {
                            if (value === old && key != inside) {
                                this[key] = ret;
                            }
                        }));
                        return ret;
                    },
                    DFS: function DFS(o, callback, type, visited) {
                        visited = visited || {};
                        var objId = _.util.objId;
                        for (var i in o) {
                            if (o.hasOwnProperty(i)) {
                                callback.call(o, i, o[i], type || i);
                                var property = o[i];
                                var propertyType = _.util.type(property);
                                if (propertyType === "Object" && !visited[objId(property)]) {
                                    visited[objId(property)] = true;
                                    DFS(property, callback, null, visited);
                                } else if (propertyType === "Array" && !visited[objId(property)]) {
                                    visited[objId(property)] = true;
                                    DFS(property, callback, i, visited);
                                }
                            }
                        }
                    }
                },
                plugins: {},
                highlightAll: function(async, callback) {
                    _.highlightAllUnder(document, async, callback);
                },
                highlightAllUnder: function(container, async, callback) {
                    var env = {
                        callback: callback,
                        container: container,
                        selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
                    };
                    _.hooks.run("before-highlightall", env);
                    env.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));
                    _.hooks.run("before-all-elements-highlight", env);
                    for (var i = 0, element; element = env.elements[i++]; ) {
                        _.highlightElement(element, async === true, env.callback);
                    }
                },
                highlightElement: function(element, async, callback) {
                    var language = _.util.getLanguage(element);
                    var grammar = _.languages[language];
                    _.util.setLanguage(element, language);
                    var parent = element.parentElement;
                    if (parent && parent.nodeName.toLowerCase() === "pre") {
                        _.util.setLanguage(parent, language);
                    }
                    var code = element.textContent;
                    var env = {
                        element: element,
                        language: language,
                        grammar: grammar,
                        code: code
                    };
                    function insertHighlightedCode(highlightedCode) {
                        env.highlightedCode = highlightedCode;
                        _.hooks.run("before-insert", env);
                        env.element.innerHTML = env.highlightedCode;
                        _.hooks.run("after-highlight", env);
                        _.hooks.run("complete", env);
                        callback && callback.call(env.element);
                    }
                    _.hooks.run("before-sanity-check", env);
                    parent = env.element.parentElement;
                    if (parent && parent.nodeName.toLowerCase() === "pre" && !parent.hasAttribute("tabindex")) {
                        parent.setAttribute("tabindex", "0");
                    }
                    if (!env.code) {
                        _.hooks.run("complete", env);
                        callback && callback.call(env.element);
                        return;
                    }
                    _.hooks.run("before-highlight", env);
                    if (!env.grammar) {
                        insertHighlightedCode(_.util.encode(env.code));
                        return;
                    }
                    if (async && _self.Worker) {
                        var worker = new Worker(_.filename);
                        worker.onmessage = function(evt) {
                            insertHighlightedCode(evt.data);
                        };
                        worker.postMessage(JSON.stringify({
                            language: env.language,
                            code: env.code,
                            immediateClose: true
                        }));
                    } else {
                        insertHighlightedCode(_.highlight(env.code, env.grammar, env.language));
                    }
                },
                highlight: function(text, grammar, language) {
                    var env = {
                        code: text,
                        grammar: grammar,
                        language: language
                    };
                    _.hooks.run("before-tokenize", env);
                    if (!env.grammar) {
                        throw new Error('The language "' + env.language + '" has no grammar.');
                    }
                    env.tokens = _.tokenize(env.code, env.grammar);
                    _.hooks.run("after-tokenize", env);
                    return Token.stringify(_.util.encode(env.tokens), env.language);
                },
                tokenize: function(text, grammar) {
                    var rest = grammar.rest;
                    if (rest) {
                        for (var token in rest) {
                            grammar[token] = rest[token];
                        }
                        delete grammar.rest;
                    }
                    var tokenList = new LinkedList;
                    addAfter(tokenList, tokenList.head, text);
                    matchGrammar(text, tokenList, grammar, tokenList.head, 0);
                    return toArray(tokenList);
                },
                hooks: {
                    all: {},
                    add: function(name, callback) {
                        var hooks = _.hooks.all;
                        hooks[name] = hooks[name] || [];
                        hooks[name].push(callback);
                    },
                    run: function(name, env) {
                        var callbacks = _.hooks.all[name];
                        if (!callbacks || !callbacks.length) {
                            return;
                        }
                        for (var i = 0, callback; callback = callbacks[i++]; ) {
                            callback(env);
                        }
                    }
                },
                Token: Token
            };
            _self.Prism = _;
            function Token(type, content, alias, matchedStr) {
                this.type = type;
                this.content = content;
                this.alias = alias;
                this.length = (matchedStr || "").length | 0;
            }
            Token.stringify = function stringify(o, language) {
                if (typeof o == "string") {
                    return o;
                }
                if (Array.isArray(o)) {
                    var s = "";
                    o.forEach((function(e) {
                        s += stringify(e, language);
                    }));
                    return s;
                }
                var env = {
                    type: o.type,
                    content: stringify(o.content, language),
                    tag: "span",
                    classes: [ "token", o.type ],
                    attributes: {},
                    language: language
                };
                var aliases = o.alias;
                if (aliases) {
                    if (Array.isArray(aliases)) {
                        Array.prototype.push.apply(env.classes, aliases);
                    } else {
                        env.classes.push(aliases);
                    }
                }
                _.hooks.run("wrap", env);
                var attributes = "";
                for (var name in env.attributes) {
                    attributes += " " + name + '="' + (env.attributes[name] || "").replace(/"/g, "&quot;") + '"';
                }
                return "<" + env.tag + ' class="' + env.classes.join(" ") + '"' + attributes + ">" + env.content + "</" + env.tag + ">";
            };
            function matchPattern(pattern, pos, text, lookbehind) {
                pattern.lastIndex = pos;
                var match = pattern.exec(text);
                if (match && lookbehind && match[1]) {
                    var lookbehindLength = match[1].length;
                    match.index += lookbehindLength;
                    match[0] = match[0].slice(lookbehindLength);
                }
                return match;
            }
            function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {
                for (var token in grammar) {
                    if (!grammar.hasOwnProperty(token) || !grammar[token]) {
                        continue;
                    }
                    var patterns = grammar[token];
                    patterns = Array.isArray(patterns) ? patterns : [ patterns ];
                    for (var j = 0; j < patterns.length; ++j) {
                        if (rematch && rematch.cause == token + "," + j) {
                            return;
                        }
                        var patternObj = patterns[j];
                        var inside = patternObj.inside;
                        var lookbehind = !!patternObj.lookbehind;
                        var greedy = !!patternObj.greedy;
                        var alias = patternObj.alias;
                        if (greedy && !patternObj.pattern.global) {
                            var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];
                            patternObj.pattern = RegExp(patternObj.pattern.source, flags + "g");
                        }
                        var pattern = patternObj.pattern || patternObj;
                        for (var currentNode = startNode.next, pos = startPos; currentNode !== tokenList.tail; pos += currentNode.value.length, 
                        currentNode = currentNode.next) {
                            if (rematch && pos >= rematch.reach) {
                                break;
                            }
                            var str = currentNode.value;
                            if (tokenList.length > text.length) {
                                return;
                            }
                            if (str instanceof Token) {
                                continue;
                            }
                            var removeCount = 1;
                            var match;
                            if (greedy) {
                                match = matchPattern(pattern, pos, text, lookbehind);
                                if (!match || match.index >= text.length) {
                                    break;
                                }
                                var from = match.index;
                                var to = match.index + match[0].length;
                                var p = pos;
                                p += currentNode.value.length;
                                while (from >= p) {
                                    currentNode = currentNode.next;
                                    p += currentNode.value.length;
                                }
                                p -= currentNode.value.length;
                                pos = p;
                                if (currentNode.value instanceof Token) {
                                    continue;
                                }
                                for (var k = currentNode; k !== tokenList.tail && (p < to || typeof k.value === "string"); k = k.next) {
                                    removeCount++;
                                    p += k.value.length;
                                }
                                removeCount--;
                                str = text.slice(pos, p);
                                match.index -= pos;
                            } else {
                                match = matchPattern(pattern, 0, str, lookbehind);
                                if (!match) {
                                    continue;
                                }
                            }
                            var from = match.index;
                            var matchStr = match[0];
                            var before = str.slice(0, from);
                            var after = str.slice(from + matchStr.length);
                            var reach = pos + str.length;
                            if (rematch && reach > rematch.reach) {
                                rematch.reach = reach;
                            }
                            var removeFrom = currentNode.prev;
                            if (before) {
                                removeFrom = addAfter(tokenList, removeFrom, before);
                                pos += before.length;
                            }
                            removeRange(tokenList, removeFrom, removeCount);
                            var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);
                            currentNode = addAfter(tokenList, removeFrom, wrapped);
                            if (after) {
                                addAfter(tokenList, currentNode, after);
                            }
                            if (removeCount > 1) {
                                var nestedRematch = {
                                    cause: token + "," + j,
                                    reach: reach
                                };
                                matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);
                                if (rematch && nestedRematch.reach > rematch.reach) {
                                    rematch.reach = nestedRematch.reach;
                                }
                            }
                        }
                    }
                }
            }
            function LinkedList() {
                var head = {
                    value: null,
                    prev: null,
                    next: null
                };
                var tail = {
                    value: null,
                    prev: head,
                    next: null
                };
                head.next = tail;
                this.head = head;
                this.tail = tail;
                this.length = 0;
            }
            function addAfter(list, node, value) {
                var next = node.next;
                var newNode = {
                    value: value,
                    prev: node,
                    next: next
                };
                node.next = newNode;
                next.prev = newNode;
                list.length++;
                return newNode;
            }
            function removeRange(list, node, count) {
                var next = node.next;
                for (var i = 0; i < count && next !== list.tail; i++) {
                    next = next.next;
                }
                node.next = next;
                next.prev = node;
                list.length -= i;
            }
            function toArray(list) {
                var array = [];
                var node = list.head.next;
                while (node !== list.tail) {
                    array.push(node.value);
                    node = node.next;
                }
                return array;
            }
            if (!_self.document) {
                if (!_self.addEventListener) {
                    return _;
                }
                if (!_.disableWorkerMessageHandler) {
                    _self.addEventListener("message", (function(evt) {
                        var message = JSON.parse(evt.data);
                        var lang = message.language;
                        var code = message.code;
                        var immediateClose = message.immediateClose;
                        _self.postMessage(_.highlight(code, _.languages[lang], lang));
                        if (immediateClose) {
                            _self.close();
                        }
                    }), false);
                }
                return _;
            }
            var script = _.util.currentScript();
            if (script) {
                _.filename = script.src;
                if (script.hasAttribute("data-manual")) {
                    _.manual = true;
                }
            }
            function highlightAutomaticallyCallback() {
                if (!_.manual) {
                    _.highlightAll();
                }
            }
            if (!_.manual) {
                var readyState = document.readyState;
                if (readyState === "loading" || readyState === "interactive" && script && script.defer) {
                    document.addEventListener("DOMContentLoaded", highlightAutomaticallyCallback);
                } else {
                    if (window.requestAnimationFrame) {
                        window.requestAnimationFrame(highlightAutomaticallyCallback);
                    } else {
                        window.setTimeout(highlightAutomaticallyCallback, 16);
                    }
                }
            }
            return _;
        }(_self);
        if (module.exports) {
            module.exports = Prism;
        }
        if (typeof commonjsGlobal !== "undefined") {
            commonjsGlobal.Prism = Prism;
        }
        Prism.languages.markup = {
            comment: {
                pattern: /<!--(?:(?!<!--)[\s\S])*?-->/,
                greedy: true
            },
            prolog: {
                pattern: /<\?[\s\S]+?\?>/,
                greedy: true
            },
            doctype: {
                pattern: /<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,
                greedy: true,
                inside: {
                    "internal-subset": {
                        pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/,
                        lookbehind: true,
                        greedy: true,
                        inside: null
                    },
                    string: {
                        pattern: /"[^"]*"|'[^']*'/,
                        greedy: true
                    },
                    punctuation: /^<!|>$|[[\]]/,
                    "doctype-tag": /^DOCTYPE/i,
                    name: /[^\s<>'"]+/
                }
            },
            cdata: {
                pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
                greedy: true
            },
            tag: {
                pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,
                greedy: true,
                inside: {
                    tag: {
                        pattern: /^<\/?[^\s>\/]+/,
                        inside: {
                            punctuation: /^<\/?/,
                            namespace: /^[^\s>\/:]+:/
                        }
                    },
                    "special-attr": [],
                    "attr-value": {
                        pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,
                        inside: {
                            punctuation: [ {
                                pattern: /^=/,
                                alias: "attr-equals"
                            }, {
                                pattern: /^(\s*)["']|["']$/,
                                lookbehind: true
                            } ]
                        }
                    },
                    punctuation: /\/?>/,
                    "attr-name": {
                        pattern: /[^\s>\/]+/,
                        inside: {
                            namespace: /^[^\s>\/:]+:/
                        }
                    }
                }
            },
            entity: [ {
                pattern: /&[\da-z]{1,8};/i,
                alias: "named-entity"
            }, /&#x?[\da-f]{1,8};/i ]
        };
        Prism.languages.markup["tag"].inside["attr-value"].inside["entity"] = Prism.languages.markup["entity"];
        Prism.languages.markup["doctype"].inside["internal-subset"].inside = Prism.languages.markup;
        Prism.hooks.add("wrap", (function(env) {
            if (env.type === "entity") {
                env.attributes["title"] = env.content.replace(/&amp;/, "&");
            }
        }));
        Object.defineProperty(Prism.languages.markup.tag, "addInlined", {
            value: function addInlined(tagName, lang) {
                var includedCdataInside = {};
                includedCdataInside["language-" + lang] = {
                    pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,
                    lookbehind: true,
                    inside: Prism.languages[lang]
                };
                includedCdataInside["cdata"] = /^<!\[CDATA\[|\]\]>$/i;
                var inside = {
                    "included-cdata": {
                        pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
                        inside: includedCdataInside
                    }
                };
                inside["language-" + lang] = {
                    pattern: /[\s\S]+/,
                    inside: Prism.languages[lang]
                };
                var def = {};
                def[tagName] = {
                    pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, (function() {
                        return tagName;
                    })), "i"),
                    lookbehind: true,
                    greedy: true,
                    inside: inside
                };
                Prism.languages.insertBefore("markup", "cdata", def);
            }
        });
        Object.defineProperty(Prism.languages.markup.tag, "addAttribute", {
            value: function(attrName, lang) {
                Prism.languages.markup.tag.inside["special-attr"].push({
                    pattern: RegExp(/(^|["'\s])/.source + "(?:" + attrName + ")" + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source, "i"),
                    lookbehind: true,
                    inside: {
                        "attr-name": /^[^\s=]+/,
                        "attr-value": {
                            pattern: /=[\s\S]+/,
                            inside: {
                                value: {
                                    pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,
                                    lookbehind: true,
                                    alias: [ lang, "language-" + lang ],
                                    inside: Prism.languages[lang]
                                },
                                punctuation: [ {
                                    pattern: /^=/,
                                    alias: "attr-equals"
                                }, /"|'/ ]
                            }
                        }
                    }
                });
            }
        });
        Prism.languages.html = Prism.languages.markup;
        Prism.languages.mathml = Prism.languages.markup;
        Prism.languages.svg = Prism.languages.markup;
        Prism.languages.xml = Prism.languages.extend("markup", {});
        Prism.languages.ssml = Prism.languages.xml;
        Prism.languages.atom = Prism.languages.xml;
        Prism.languages.rss = Prism.languages.xml;
        (function(Prism) {
            var string = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;
            Prism.languages.css = {
                comment: /\/\*[\s\S]*?\*\//,
                atrule: {
                    pattern: RegExp("@[\\w-](?:" + /[^;{\s"']|\s+(?!\s)/.source + "|" + string.source + ")*?" + /(?:;|(?=\s*\{))/.source),
                    inside: {
                        rule: /^@[\w-]+/,
                        "selector-function-argument": {
                            pattern: /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,
                            lookbehind: true,
                            alias: "selector"
                        },
                        keyword: {
                            pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/,
                            lookbehind: true
                        }
                    }
                },
                url: {
                    pattern: RegExp("\\burl\\((?:" + string.source + "|" + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ")\\)", "i"),
                    greedy: true,
                    inside: {
                        function: /^url/i,
                        punctuation: /^\(|\)$/,
                        string: {
                            pattern: RegExp("^" + string.source + "$"),
                            alias: "url"
                        }
                    }
                },
                selector: {
                    pattern: RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|" + string.source + ")*(?=\\s*\\{)"),
                    lookbehind: true
                },
                string: {
                    pattern: string,
                    greedy: true
                },
                property: {
                    pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,
                    lookbehind: true
                },
                important: /!important\b/i,
                function: {
                    pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,
                    lookbehind: true
                },
                punctuation: /[(){};:,]/
            };
            Prism.languages.css["atrule"].inside.rest = Prism.languages.css;
            var markup = Prism.languages.markup;
            if (markup) {
                markup.tag.addInlined("style", "css");
                markup.tag.addAttribute("style", "css");
            }
        })(Prism);
        Prism.languages.clike = {
            comment: [ {
                pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
                lookbehind: true,
                greedy: true
            }, {
                pattern: /(^|[^\\:])\/\/.*/,
                lookbehind: true,
                greedy: true
            } ],
            string: {
                pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
                greedy: true
            },
            "class-name": {
                pattern: /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,
                lookbehind: true,
                inside: {
                    punctuation: /[.\\]/
                }
            },
            keyword: /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,
            boolean: /\b(?:false|true)\b/,
            function: /\b\w+(?=\()/,
            number: /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
            operator: /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,
            punctuation: /[{}[\];(),.:]/
        };
        Prism.languages.javascript = Prism.languages.extend("clike", {
            "class-name": [ Prism.languages.clike["class-name"], {
                pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,
                lookbehind: true
            } ],
            keyword: [ {
                pattern: /((?:^|\})\s*)catch\b/,
                lookbehind: true
            }, {
                pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,
                lookbehind: true
            } ],
            function: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,
            number: {
                pattern: RegExp(/(^|[^\w$])/.source + "(?:" + (/NaN|Infinity/.source + "|" + /0[bB][01]+(?:_[01]+)*n?/.source + "|" + /0[oO][0-7]+(?:_[0-7]+)*n?/.source + "|" + /0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source + "|" + /\d+(?:_\d+)*n/.source + "|" + /(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source) + ")" + /(?![\w$])/.source),
                lookbehind: true
            },
            operator: /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/
        });
        Prism.languages.javascript["class-name"][0].pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;
        Prism.languages.insertBefore("javascript", "keyword", {
            regex: {
                pattern: RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source + /\//.source + "(?:" + /(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source + "|" + /(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source + ")" + /(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),
                lookbehind: true,
                greedy: true,
                inside: {
                    "regex-source": {
                        pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
                        lookbehind: true,
                        alias: "language-regex",
                        inside: Prism.languages.regex
                    },
                    "regex-delimiter": /^\/|\/$/,
                    "regex-flags": /^[a-z]+$/
                }
            },
            "function-variable": {
                pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,
                alias: "function"
            },
            parameter: [ {
                pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,
                lookbehind: true,
                inside: Prism.languages.javascript
            }, {
                pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,
                lookbehind: true,
                inside: Prism.languages.javascript
            }, {
                pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,
                lookbehind: true,
                inside: Prism.languages.javascript
            }, {
                pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,
                lookbehind: true,
                inside: Prism.languages.javascript
            } ],
            constant: /\b[A-Z](?:[A-Z_]|\dx?)*\b/
        });
        Prism.languages.insertBefore("javascript", "string", {
            hashbang: {
                pattern: /^#!.*/,
                greedy: true,
                alias: "comment"
            },
            "template-string": {
                pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,
                greedy: true,
                inside: {
                    "template-punctuation": {
                        pattern: /^`|`$/,
                        alias: "string"
                    },
                    interpolation: {
                        pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
                        lookbehind: true,
                        inside: {
                            "interpolation-punctuation": {
                                pattern: /^\$\{|\}$/,
                                alias: "punctuation"
                            },
                            rest: Prism.languages.javascript
                        }
                    },
                    string: /[\s\S]+/
                }
            },
            "string-property": {
                pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,
                lookbehind: true,
                greedy: true,
                alias: "property"
            }
        });
        Prism.languages.insertBefore("javascript", "operator", {
            "literal-property": {
                pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,
                lookbehind: true,
                alias: "property"
            }
        });
        if (Prism.languages.markup) {
            Prism.languages.markup.tag.addInlined("script", "javascript");
            Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source, "javascript");
        }
        Prism.languages.js = Prism.languages.javascript;
        (function() {
            if (typeof Prism === "undefined" || typeof document === "undefined") {
                return;
            }
            if (!Element.prototype.matches) {
                Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
            }
            var LOADING_MESSAGE = "Loading…";
            var FAILURE_MESSAGE = function(status, message) {
                return "✖ Error " + status + " while fetching file: " + message;
            };
            var FAILURE_EMPTY_MESSAGE = "✖ Error: File does not exist or is empty";
            var EXTENSIONS = {
                js: "javascript",
                py: "python",
                rb: "ruby",
                ps1: "powershell",
                psm1: "powershell",
                sh: "bash",
                bat: "batch",
                h: "c",
                tex: "latex"
            };
            var STATUS_ATTR = "data-src-status";
            var STATUS_LOADING = "loading";
            var STATUS_LOADED = "loaded";
            var STATUS_FAILED = "failed";
            var SELECTOR = "pre[data-src]:not([" + STATUS_ATTR + '="' + STATUS_LOADED + '"])' + ":not([" + STATUS_ATTR + '="' + STATUS_LOADING + '"])';
            function loadFile(src, success, error) {
                var xhr = new XMLHttpRequest;
                xhr.open("GET", src, true);
                xhr.onreadystatechange = function() {
                    if (xhr.readyState == 4) {
                        if (xhr.status < 400 && xhr.responseText) {
                            success(xhr.responseText);
                        } else {
                            if (xhr.status >= 400) {
                                error(FAILURE_MESSAGE(xhr.status, xhr.statusText));
                            } else {
                                error(FAILURE_EMPTY_MESSAGE);
                            }
                        }
                    }
                };
                xhr.send(null);
            }
            function parseRange(range) {
                var m = /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(range || "");
                if (m) {
                    var start = Number(m[1]);
                    var comma = m[2];
                    var end = m[3];
                    if (!comma) {
                        return [ start, start ];
                    }
                    if (!end) {
                        return [ start, undefined ];
                    }
                    return [ start, Number(end) ];
                }
                return undefined;
            }
            Prism.hooks.add("before-highlightall", (function(env) {
                env.selector += ", " + SELECTOR;
            }));
            Prism.hooks.add("before-sanity-check", (function(env) {
                var pre = env.element;
                if (pre.matches(SELECTOR)) {
                    env.code = "";
                    pre.setAttribute(STATUS_ATTR, STATUS_LOADING);
                    var code = pre.appendChild(document.createElement("CODE"));
                    code.textContent = LOADING_MESSAGE;
                    var src = pre.getAttribute("data-src");
                    var language = env.language;
                    if (language === "none") {
                        var extension = (/\.(\w+)$/.exec(src) || [ , "none" ])[1];
                        language = EXTENSIONS[extension] || extension;
                    }
                    Prism.util.setLanguage(code, language);
                    Prism.util.setLanguage(pre, language);
                    var autoloader = Prism.plugins.autoloader;
                    if (autoloader) {
                        autoloader.loadLanguages(language);
                    }
                    loadFile(src, (function(text) {
                        pre.setAttribute(STATUS_ATTR, STATUS_LOADED);
                        var range = parseRange(pre.getAttribute("data-range"));
                        if (range) {
                            var lines = text.split(/\r\n?|\n/g);
                            var start = range[0];
                            var end = range[1] == null ? lines.length : range[1];
                            if (start < 0) {
                                start += lines.length;
                            }
                            start = Math.max(0, Math.min(start - 1, lines.length));
                            if (end < 0) {
                                end += lines.length;
                            }
                            end = Math.max(0, Math.min(end, lines.length));
                            text = lines.slice(start, end).join("\n");
                            if (!pre.hasAttribute("data-start")) {
                                pre.setAttribute("data-start", String(start + 1));
                            }
                        }
                        code.textContent = text;
                        Prism.highlightElement(code);
                    }), (function(error) {
                        pre.setAttribute(STATUS_ATTR, STATUS_FAILED);
                        code.textContent = error;
                    }));
                }
            }));
            Prism.plugins.fileHighlight = {
                highlight: function highlight(container) {
                    var elements = (container || document).querySelectorAll(SELECTOR);
                    for (var i = 0, element; element = elements[i++]; ) {
                        Prism.highlightElement(element);
                    }
                }
            };
            var logged = false;
            Prism.fileHighlight = function() {
                if (!logged) {
                    console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.");
                    logged = true;
                }
                Prism.plugins.fileHighlight.highlight.apply(this, arguments);
            };
        })();
    })(prism$1);
    return prism$1.exports;
}

var prismExports = requirePrism();

var prism = getDefaultExportFromCjs(prismExports);

function cached$1(fn) {
    const cache = Object.create(null);
    return function(str) {
        const key = isPrimitive(str) ? str : JSON.stringify(str);
        if (key in cache) {
            return cache[key];
        }
        return cache[key] = fn(str);
    };
}

const hyphenate = cached$1((str => str.replace(/([A-Z])/g, (m => "-" + m.toLowerCase()))));

function isPrimitive(value) {
    return typeof value === "string" || typeof value === "number";
}

function noop() {}

function isFn(obj) {
    return typeof obj === "function";
}

function isExternal(url) {
    const match = url.match(/^([^:/?#]+:)?(?:\/{2,}([^/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/);
    if (typeof match[1] === "string" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol) {
        return true;
    }
    if (typeof match[2] === "string" && match[2].length > 0 && match[2].replace(new RegExp(":(" + {
        "http:": 80,
        "https:": 443
    }[location.protocol] + ")?$"), "") !== location.host) {
        return true;
    }
    if (/^\/\\/.test(url)) {
        return true;
    }
    return false;
}

const cacheNode = {};

function getNode(el, noCache = false) {
    if (typeof el === "string") {
        if (typeof window.Vue !== "undefined") {
            return find(el);
        }
        el = noCache ? find(el) : cacheNode[el] || (cacheNode[el] = find(el));
    }
    return el;
}

function setHTML(el, content, replace) {
    const node = getNode(el);
    if (node) {
        node[replace ? "outerHTML" : "innerHTML"] = content;
    }
}

const $$1 = document;

const body = $$1.body;

const head = $$1.head;

function find(el, query = ":is()") {
    return typeof el !== "string" ? el.querySelector(query) : $$1.querySelector(el);
}

function findAll(el, query = ":is()") {
    return Array.from(typeof el !== "string" ? el.querySelectorAll(query) : $$1.querySelectorAll(el));
}

function create(node, tpl) {
    const element = $$1.createElement(node);
    if (tpl) {
        element.innerHTML = tpl;
    }
    return element;
}

function appendTo(target, el) {
    return target.appendChild(el);
}

function before(target, el) {
    return target.insertBefore(el, target.children[0]);
}

function on(el, type, handler) {
    isFn(type) ? window.addEventListener(el, type) : el.addEventListener(type, handler);
}

function off(el, type, handler) {
    isFn(type) ? window.removeEventListener(el, type) : el.removeEventListener(type, handler);
}

function style(content) {
    appendTo(head, create("style", content));
}

function documentReady(callback, doc = document) {
    const state = doc.readyState;
    if (state === "complete" || state === "interactive") {
        return setTimeout(callback, 0);
    }
    doc.addEventListener("DOMContentLoaded", callback);
}

var dom = Object.freeze({
    __proto__: null,
    $: $$1,
    appendTo: appendTo,
    before: before,
    body: body,
    create: create,
    documentReady: documentReady,
    find: find,
    findAll: findAll,
    getNode: getNode,
    head: head,
    off: off,
    on: on,
    setHTML: setHTML,
    style: style
});

const decode = decodeURIComponent;

const encode = encodeURIComponent;

const sidebarNavigationClassNames = [ "app-name-link", "page-link", "section-link" ];

function resolveHref(href) {
    try {
        return new URL(href, location.href).href;
    } catch {
        return href;
    }
}

function findLinkByHref(rootElm, href, selector = "a") {
    const resolvedHref = resolveHref(href);
    return Array.from(rootElm.querySelectorAll(selector)).find((linkElm => linkElm.href === resolvedHref)) || null;
}

function getClickedLink(event) {
    const target = event.target;
    return target instanceof Element ? target.closest("a") : null;
}

function isCurrentContextNavigation(event, linkElm) {
    return !(event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || linkElm.hasAttribute("download") || linkElm.target && linkElm.target !== "_self");
}

function getSidebarNavigationTarget(linkElm) {
    const sidebarElm = linkElm.closest(".sidebar");
    const className = sidebarNavigationClassNames.find((className => linkElm.classList.contains(className)));
    if (!sidebarElm || !className) {
        return;
    }
    return {
        className: className,
        href: linkElm.href
    };
}

function parseQuery(query) {
    const res = {};
    query = query.trim().replace(/^(\?|#|&)/, "");
    if (!query) {
        return res;
    }
    query.split("&").forEach((param => {
        const parts = param.replace(/\+/g, " ").split("=");
        res[parts[0]] = parts[1] && decode(parts[1]);
    }));
    return res;
}

function stringifyQuery(obj, ignores = []) {
    const qs = [];
    for (const key in obj) {
        if (ignores.indexOf(key) > -1) {
            continue;
        }
        qs.push(obj[key] ? `${encode(key)}=${encode(obj[key])}`.toLowerCase() : encode(key));
    }
    return qs.length ? `?${qs.join("&")}` : "";
}

function stripUrlExceptId(str) {
    const [path, queryString] = str.split("?");
    if (!queryString) {
        return str;
    }
    const params = new URLSearchParams(queryString);
    const id = params.get("id");
    if (id !== null) {
        return `${path}?id=${id}`;
    }
    return path;
}

const isAbsolutePath = cached$1((path => /(:|(\/{2}))/g.test(path)));

const removeParams = cached$1((path => path.split(/[?#]/)[0]));

const getParentPath = cached$1((path => {
    if (/\/$/g.test(path)) {
        return path;
    }
    const matchingParts = path.match(/(\S*\/)[^/]+$/);
    return matchingParts ? matchingParts[1] : "";
}));

const cleanPath = cached$1((path => path.replace(/^\/+/, "/").replace(/([^:])\/{2,}/g, "$1/")));

const resolvePath = cached$1((path => {
    const segments = path.replace(/^\//, "").split("/");
    const resolved = [];
    for (const segment of segments) {
        if (segment === "..") {
            resolved.pop();
        } else if (segment !== ".") {
            resolved.push(segment);
        }
    }
    return "/" + resolved.join("/");
}));

function normaliseFragment(path) {
    return path.split("/").filter((p => p.indexOf("#") === -1)).join("/");
}

function getPath(...args) {
    return cleanPath(args.map(normaliseFragment).join("/"));
}

const replaceSlug = cached$1((path => path.replace("#", "?id=")));

class History {
    #cached={};
    constructor(config) {
        this.config = config;
    }
    #getAlias(path, alias, last) {
        const match = Object.keys(alias).filter((key => {
            const re = this.#cached[key] || (this.#cached[key] = new RegExp(`^${key}$`));
            return re.test(path) && path !== last;
        }))[0];
        return match ? this.#getAlias(path.replace(this.#cached[match], alias[match]), alias, path) : path;
    }
    #getFileName(path, ext) {
        const [basePath, query] = path.split("?");
        const hasValidExt = new RegExp(`\\.(${ext.replace(/^\./, "")}|html)$`).test(basePath);
        const updatedPath = hasValidExt ? basePath : /\/$/g.test(basePath) ? `${basePath}README${ext}` : `${basePath}${ext}`;
        return query ? `${updatedPath}?${query}` : updatedPath;
    }
    getBasePath() {
        return this.config.basePath;
    }
    getFile(path = this.getCurrentPath(), isRelative = false) {
        const {config: config} = this;
        const base = this.getBasePath();
        const ext = typeof config.ext === "string" ? config.ext : ".md";
        path = config.alias ? this.#getAlias(path, config.alias) : path;
        path = this.#getFileName(path, ext);
        path = path === `/README${ext}` ? config.homepage || path : path;
        path = isAbsolutePath(path) ? path : getPath(base, path);
        if (isRelative) {
            path = path.replace(new RegExp(`^${base}`), "");
        }
        return path;
    }
    onchange(cb = noop) {
        cb();
    }
    getCurrentPath() {
        throw new Error("Subclass should implement");
    }
    normalize() {
        throw new Error("Subclass should implement");
    }
    parse(path) {
        throw new Error("Subclass should implement");
    }
    toURL(path, params, currentRoute) {
        const local = currentRoute && path[0] === "#";
        const route = this.parse(replaceSlug(path));
        route.query = {
            ...route.query,
            ...params
        };
        path = route.path + stringifyQuery(route.query);
        path = path.replace(/\.md(\?)|\.md$/, "$1");
        if (local) {
            const idIndex = currentRoute.indexOf("?");
            path = (idIndex > 0 ? currentRoute.substring(0, idIndex) : currentRoute) + path;
        }
        if (this.config.relativePath && path.indexOf("/") !== 0) {
            const currentDir = currentRoute.substring(0, currentRoute.lastIndexOf("/") + 1);
            return cleanPath(resolvePath(currentDir + path));
        }
        return cleanPath("/" + path);
    }
}

function replaceHash(path) {
    const i = location.href.indexOf("#");
    location.replace(location.href.slice(0, i >= 0 ? i : 0) + "#" + path);
}

class HashHistory extends History {
    mode="hash";
    getBasePath() {
        const path = window.location.pathname || "";
        const base = this.config.basePath;
        const basePath = path.endsWith(".html") ? path + "#/" + base : path + "/" + base;
        return /^(\/|https?:)/g.test(base) ? base : cleanPath(basePath);
    }
    getCurrentPath() {
        const href = location.href;
        const index = href.indexOf("#");
        return index === -1 ? "" : href.slice(index + 1);
    }
    onchange(cb = noop) {
        let navigating = false;
        let navigatingFocusTarget;
        on("click", (e => {
            const el = getClickedLink(e);
            if (el && isCurrentContextNavigation(e, el) && !isExternal(el.href)) {
                navigating = true;
                navigatingFocusTarget = getSidebarNavigationTarget(el);
                if (el.matches(".app-name-link, .page-link")) {
                    if (el.hash === location.hash) {
                        navigating = false;
                        navigatingFocusTarget = undefined;
                    }
                    return;
                }
                if (el.hash === location.hash) {
                    cb({
                        focusTarget: navigatingFocusTarget,
                        source: "navigate"
                    });
                    navigating = false;
                    navigatingFocusTarget = undefined;
                }
            }
        }));
        on("hashchange", (() => {
            const source = navigating ? "navigate" : "history";
            const focusTarget = navigating ? navigatingFocusTarget : undefined;
            navigating = false;
            navigatingFocusTarget = undefined;
            cb({
                focusTarget: focusTarget,
                source: source
            });
        }));
    }
    normalize() {
        let path = this.getCurrentPath();
        path = replaceSlug(path);
        if (path.charAt(0) === "/") {
            return replaceHash(path);
        }
        replaceHash("/" + path);
    }
    parse(path = location.href) {
        let query = "";
        const hashIndex = path.indexOf("#");
        if (hashIndex >= 0) {
            path = path.slice(hashIndex + 1);
        }
        const queryIndex = path.indexOf("?");
        if (queryIndex >= 0) {
            query = path.slice(queryIndex + 1);
            path = path.slice(0, queryIndex);
        }
        return {
            path: path,
            file: this.getFile(path, true),
            query: parseQuery(query),
            response: {}
        };
    }
    toURL(path, params, currentRoute) {
        return "#" + super.toURL(path, params, currentRoute);
    }
}

class HTML5History extends History {
    mode="history";
    getCurrentPath() {
        const base = this.getBasePath();
        let path = window.location.pathname;
        if (base && path.indexOf(base) === 0) {
            path = path.slice(base.length);
        }
        return (path || "/") + window.location.search + window.location.hash;
    }
    onchange(cb = noop) {
        on("click", (e => {
            const el = getClickedLink(e);
            if (el && isCurrentContextNavigation(e, el) && !isExternal(el.href)) {
                e.preventDefault();
                const url = el.href;
                window.history.pushState({
                    key: url
                }, "", url);
                cb({
                    focusTarget: getSidebarNavigationTarget(el),
                    source: "navigate"
                });
            }
        }));
        on("popstate", (() => {
            cb({
                source: "history"
            });
        }));
    }
    parse(path = location.href) {
        let query = "";
        const queryIndex = path.indexOf("?");
        if (queryIndex >= 0) {
            query = path.slice(queryIndex + 1);
            path = path.slice(0, queryIndex);
        }
        const base = getPath(location.origin);
        const baseIndex = path.indexOf(base);
        if (baseIndex > -1) {
            path = path.slice(baseIndex + base.length);
        }
        return {
            path: path,
            file: this.getFile(path),
            query: parseQuery(query),
            response: {}
        };
    }
    normalize() {}
}

let lastRoute = {};

function Router(Base) {
    return class Router extends Base {
        route={};
        updateRender() {
            this.router?.normalize();
            this.route = this.router?.parse() ?? {};
            body.setAttribute("data-page", this.route.file ?? "");
        }
        initRouter() {
            const config = this.config;
            const mode = config.routerMode || "hash";
            let router;
            if (mode === "history") {
                router = new HTML5History(config);
            } else {
                router = new HashHistory(config);
            }
            this.router = router;
            this.updateRender();
            lastRoute = this.route;
            router.onchange((params => {
                this.updateRender();
                this._updateRender();
                if (lastRoute.path === this.route.path) {
                    this.onNavigate(params.source, params.focusTarget);
                    return;
                }
                this.$fetch(noop, this.onNavigate.bind(this, params.source, params.focusTarget));
                lastRoute = this.route;
            }));
        }
    };
}

var RGX = /([^{]*?)\w(?=\})/g;

var MAP = {
    YYYY: "getFullYear",
    YY: "getYear",
    MM: function(d) {
        return d.getMonth() + 1;
    },
    DD: "getDate",
    HH: "getHours",
    mm: "getMinutes",
    ss: "getSeconds",
    fff: "getMilliseconds"
};

function tinydate(str, custom) {
    var parts = [], offset = 0;
    str.replace(RGX, (function(key, _, idx) {
        parts.push(str.substring(offset, idx - 1));
        offset = idx += key.length + 1;
        parts.push((function(d) {
            return ("00" + (typeof MAP[key] === "string" ? d[MAP[key]]() : MAP[key](d))).slice(-key.length);
        }));
    }));
    if (offset !== str.length) {
        parts.push(str.substring(offset));
    }
    return function(arg) {
        var out = "", i = 0, d = arg || new Date;
        for (;i < parts.length; i++) {
            out += typeof parts[i] === "string" ? parts[i] : parts[i](d);
        }
        return out;
    };
}

const computedStyle = getComputedStyle(document.documentElement, null);

const mobileBreakpoint = computedStyle.getPropertyValue("--_mobile-breakpoint");

function isMobile() {
    return window?.matchMedia?.(`(max-width: ${mobileBreakpoint})`)?.matches;
}

function z() {
    return {
        async: false,
        breaks: false,
        extensions: null,
        gfm: true,
        hooks: null,
        pedantic: false,
        renderer: null,
        silent: false,
        tokenizer: null,
        walkTokens: null
    };
}

var T = z();

function G(l) {
    T = l;
}

var _ = {
    exec: () => null
};

function d(l, e = "") {
    let t = typeof l == "string" ? l : l.source, n = {
        replace: (s, r) => {
            let i = typeof r == "string" ? r : r.source;
            return i = i.replace(m.caret, "$1"), t = t.replace(s, i), n;
        },
        getRegex: () => new RegExp(t, e)
    };
    return n;
}

var Re = ((l = "") => {
    try {
        return !!new RegExp("(?<=1)(?<!1)" + l);
    } catch {
        return false;
    }
})(), m = {
    codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm,
    outputLinkReplace: /\\([\[\]])/g,
    indentCodeCompensation: /^(\s+)(?:```)/,
    beginningSpace: /^\s+/,
    endingHash: /#$/,
    startingSpaceChar: /^ /,
    endingSpaceChar: / $/,
    nonSpaceChar: /[^ ]/,
    newLineCharGlobal: /\n/g,
    tabCharGlobal: /\t/g,
    multipleSpaceGlobal: /\s+/g,
    blankLine: /^[ \t]*$/,
    doubleBlankLine: /\n[ \t]*\n[ \t]*$/,
    blockquoteStart: /^ {0,3}>/,
    blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g,
    blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm,
    listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,
    listIsTask: /^\[[ xX]\] +\S/,
    listReplaceTask: /^\[[ xX]\] +/,
    listTaskCheckbox: /\[[ xX]\]/,
    anyLine: /\n.*\n/,
    hrefBrackets: /^<(.*)>$/,
    tableDelimiter: /[:|]/,
    tableAlignChars: /^\||\| *$/g,
    tableRowBlankLine: /\n[ \t]*$/,
    tableAlignRight: /^ *-+: *$/,
    tableAlignCenter: /^ *:-+: *$/,
    tableAlignLeft: /^ *:-+ *$/,
    startATag: /^<a /i,
    endATag: /^<\/a>/i,
    startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i,
    endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i,
    startAngleBracket: /^</,
    endAngleBracket: />$/,
    pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/,
    unicodeAlphaNumeric: /[\p{L}\p{N}]/u,
    escapeTest: /[&<>"']/,
    escapeReplace: /[&<>"']/g,
    escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,
    escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,
    caret: /(^|[^\[])\^/g,
    percentDecode: /%25/g,
    findPipe: /\|/g,
    splitPipe: / \|/,
    slashPipe: /\\\|/g,
    carriageReturn: /\r\n|\r/g,
    spaceLine: /^ +$/gm,
    notSpaceStart: /^\S*/,
    endingNewline: /\n$/,
    listItemRegex: l => new RegExp(`^( {0,3}${l})((?:[\t ][^\\n]*)?(?:\\n|$))`),
    nextBulletRegex: l => new RegExp(`^ {0,${Math.min(3, l - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`),
    hrRegex: l => new RegExp(`^ {0,${Math.min(3, l - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),
    fencesBeginRegex: l => new RegExp(`^ {0,${Math.min(3, l - 1)}}(?:\`\`\`|~~~)`),
    headingBeginRegex: l => new RegExp(`^ {0,${Math.min(3, l - 1)}}#`),
    htmlBeginRegex: l => new RegExp(`^ {0,${Math.min(3, l - 1)}}<(?:[a-z].*>|!--)`, "i"),
    blockquoteBeginRegex: l => new RegExp(`^ {0,${Math.min(3, l - 1)}}>`)
}, Te = /^(?:[ \t]*(?:\n|$))+/, Oe = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/, we = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, I = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, ye = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, Q = / {0,3}(?:[*+-]|\d{1,9}[.)])/, ie = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, oe = d(ie).replace(/bull/g, Q).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(), Pe = d(ie).replace(/bull/g, Q).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(), j = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, Se = /^[^\n]+/, F = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/, $e = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", F).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), Le = d(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, Q).getRegex(), v = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", U = /<!--(?:-?>|[\s\S]*?(?:-->|$))/, _e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), ae = d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(), Me = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(), K = {
    blockquote: Me,
    code: Oe,
    def: $e,
    fences: we,
    heading: ye,
    hr: I,
    html: _e,
    lheading: oe,
    list: Le,
    newline: Te,
    paragraph: ae,
    table: _,
    text: Se
}, re$1 = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3}\t)[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(), ze = {
    ...K,
    lheading: Pe,
    table: re$1,
    paragraph: d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re$1).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex()
}, Ee = {
    ...K,
    html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),
    def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
    heading: /^(#{1,6})(.*)(?:\n+|$)/,
    fences: _,
    lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
    paragraph: d(j).replace("hr", I).replace("heading", ` *#{1,6} *[^\n]`).replace("lheading", oe).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex()
}, Ae = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, Ce = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, le = /^( {2,}|\\)\n(?!\s*$)/, Ie = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/, E = /[\p{P}\p{S}]/u, H = /[\s\p{P}\p{S}]/u, W = /[^\s\p{P}\p{S}]/u, Be = d(/^((?![*_])punctSpace)/, "u").replace(/punctSpace/g, H).getRegex(), ue = /(?!~)[\p{P}\p{S}]/u, De = /(?!~)[\s\p{P}\p{S}]/u, qe = /(?:[^\s\p{P}\p{S}]|~)/u, ve = d(/link|precode-code|html/, "g").replace("link", /\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", Re ? "(?<!`)()" : "(^^|[^`])").replace("code", /(?<b>`+)[^`]+\k<b>(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(), pe = /^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/, He = d(pe, "u").replace(/punct/g, E).getRegex(), Ze = d(pe, "u").replace(/punct/g, ue).getRegex(), ce = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)", Ge = d(ce, "gu").replace(/notPunctSpace/g, W).replace(/punctSpace/g, H).replace(/punct/g, E).getRegex(), Ne = d(ce, "gu").replace(/notPunctSpace/g, qe).replace(/punctSpace/g, De).replace(/punct/g, ue).getRegex(), Qe = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, W).replace(/punctSpace/g, H).replace(/punct/g, E).getRegex(), je = d(/^~~?(?:((?!~)punct)|[^\s~])/, "u").replace(/punct/g, E).getRegex(), Fe = "^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)", Ue = d(Fe, "gu").replace(/notPunctSpace/g, W).replace(/punctSpace/g, H).replace(/punct/g, E).getRegex(), Ke = d(/\\(punct)/, "gu").replace(/punct/g, E).getRegex(), We = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("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])?)+(?![-_])/).getRegex(), Xe = d(U).replace("(?:--\x3e|$)", "--\x3e").getRegex(), Je = d("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment", Xe).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), q = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/, Ve = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), he = d(/^!?\[(label)\]\[(ref)\]/).replace("label", q).replace("ref", F).getRegex(), ke = d(/^!?\[(ref)\](?:\[\])?/).replace("ref", F).getRegex(), Ye = d("reflink|nolink(?!\\()", "g").replace("reflink", he).replace("nolink", ke).getRegex(), se = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/, X = {
    _backpedal: _,
    anyPunctuation: Ke,
    autolink: We,
    blockSkip: ve,
    br: le,
    code: Ce,
    del: _,
    delLDelim: _,
    delRDelim: _,
    emStrongLDelim: He,
    emStrongRDelimAst: Ge,
    emStrongRDelimUnd: Qe,
    escape: Ae,
    link: Ve,
    nolink: ke,
    punctuation: Be,
    reflink: he,
    reflinkSearch: Ye,
    tag: Je,
    text: Ie,
    url: _
}, et = {
    ...X,
    link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(),
    reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex()
}, N = {
    ...X,
    emStrongRDelimAst: Ne,
    emStrongLDelim: Ze,
    delLDelim: je,
    delRDelim: Ue,
    url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),
    _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,
    del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,
    text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol", se).getRegex()
}, tt = {
    ...N,
    br: d(le).replace("{2,}", "*").getRegex(),
    text: d(N.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex()
}, B = {
    normal: K,
    gfm: ze,
    pedantic: Ee
}, A = {
    normal: X,
    gfm: N,
    breaks: tt,
    pedantic: et
};

var nt = {
    "&": "&amp;",
    "<": "&lt;",
    ">": "&gt;",
    '"': "&quot;",
    "'": "&#39;"
}, de = l => nt[l];

function O(l, e) {
    if (e) {
        if (m.escapeTest.test(l)) return l.replace(m.escapeReplace, de);
    } else if (m.escapeTestNoEncode.test(l)) return l.replace(m.escapeReplaceNoEncode, de);
    return l;
}

function J(l) {
    try {
        l = encodeURI(l).replace(m.percentDecode, "%");
    } catch {
        return null;
    }
    return l;
}

function V(l, e) {
    let t = l.replace(m.findPipe, ((r, i, o) => {
        let u = false, a = i;
        for (;--a >= 0 && o[a] === "\\"; ) u = !u;
        return u ? "|" : " |";
    })), n = t.split(m.splitPipe), s = 0;
    if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), e) if (n.length > e) n.splice(e); else for (;n.length < e; ) n.push("");
    for (;s < n.length; s++) n[s] = n[s].trim().replace(m.slashPipe, "|");
    return n;
}

function $(l, e, t) {
    let n = l.length;
    if (n === 0) return "";
    let s = 0;
    for (;s < n; ) {
        let r = l.charAt(n - s - 1);
        if (r === e && true) s++; else break;
    }
    return l.slice(0, n - s);
}

function Y(l) {
    let e = l.split(`\n`), t = e.length - 1;
    for (;t >= 0 && m.blankLine.test(e[t]); ) t--;
    return e.length - t <= 2 ? l : e.slice(0, t + 1).join(`\n`);
}

function ge(l, e) {
    if (l.indexOf(e[1]) === -1) return -1;
    let t = 0;
    for (let n = 0; n < l.length; n++) if (l[n] === "\\") n++; else if (l[n] === e[0]) t++; else if (l[n] === e[1] && (t--, 
    t < 0)) return n;
    return t > 0 ? -2 : -1;
}

function fe(l, e = 0) {
    let t = e, n = "";
    for (let s of l) if (s === "\t") {
        let r = 4 - t % 4;
        n += " ".repeat(r), t += r;
    } else n += s, t++;
    return n;
}

function me(l, e, t, n, s) {
    let r = e.href, i = e.title || null, o = l[1].replace(s.other.outputLinkReplace, "$1");
    n.state.inLink = true;
    let u = {
        type: l[0].charAt(0) === "!" ? "image" : "link",
        raw: t,
        href: r,
        title: i,
        text: o,
        tokens: n.inlineTokens(o)
    };
    return n.state.inLink = false, u;
}

function rt(l, e, t) {
    let n = l.match(t.other.indentCodeCompensation);
    if (n === null) return e;
    let s = n[1];
    return e.split(`\n`).map((r => {
        let i = r.match(t.other.beginningSpace);
        if (i === null) return r;
        let [o] = i;
        return o.length >= s.length ? r.slice(s.length) : r;
    })).join(`\n`);
}

var w = class {
    options;
    rules;
    lexer;
    constructor(e) {
        this.options = e || T;
    }
    space(e) {
        let t = this.rules.block.newline.exec(e);
        if (t && t[0].length > 0) return {
            type: "space",
            raw: t[0]
        };
    }
    code(e) {
        let t = this.rules.block.code.exec(e);
        if (t) {
            let n = this.options.pedantic ? t[0] : Y(t[0]), s = n.replace(this.rules.other.codeRemoveIndent, "");
            return {
                type: "code",
                raw: n,
                codeBlockStyle: "indented",
                text: s
            };
        }
    }
    fences(e) {
        let t = this.rules.block.fences.exec(e);
        if (t) {
            let n = t[0], s = rt(n, t[3] || "", this.rules);
            return {
                type: "code",
                raw: n,
                lang: t[2] ? t[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t[2],
                text: s
            };
        }
    }
    heading(e) {
        let t = this.rules.block.heading.exec(e);
        if (t) {
            let n = t[2].trim();
            if (this.rules.other.endingHash.test(n)) {
                let s = $(n, "#");
                (this.options.pedantic || !s || this.rules.other.endingSpaceChar.test(s)) && (n = s.trim());
            }
            return {
                type: "heading",
                raw: $(t[0], `\n`),
                depth: t[1].length,
                text: n,
                tokens: this.lexer.inline(n)
            };
        }
    }
    hr(e) {
        let t = this.rules.block.hr.exec(e);
        if (t) return {
            type: "hr",
            raw: $(t[0], `\n`)
        };
    }
    blockquote(e) {
        let t = this.rules.block.blockquote.exec(e);
        if (t) {
            let n = $(t[0], `\n`).split(`\n`), s = "", r = "", i = [];
            for (;n.length > 0; ) {
                let o = false, u = [], a;
                for (a = 0; a < n.length; a++) if (this.rules.other.blockquoteStart.test(n[a])) u.push(n[a]), 
                o = true; else if (!o) u.push(n[a]); else break;
                n = n.slice(a);
                let c = u.join(`\n`), p = c.replace(this.rules.other.blockquoteSetextReplace, `\n    $1`).replace(this.rules.other.blockquoteSetextReplace2, "");
                s = s ? `${s}\n${c}` : c, r = r ? `${r}\n${p}` : p;
                let k = this.lexer.state.top;
                if (this.lexer.state.top = true, this.lexer.blockTokens(p, i, true), this.lexer.state.top = k, 
                n.length === 0) break;
                let h = i.at(-1);
                if (h?.type === "code") break;
                if (h?.type === "blockquote") {
                    let R = h, f = R.raw + `\n` + n.join(`\n`), S = this.blockquote(f);
                    i[i.length - 1] = S, s = s.substring(0, s.length - R.raw.length) + S.raw, r = r.substring(0, r.length - R.text.length) + S.text;
                    break;
                } else if (h?.type === "list") {
                    let R = h, f = R.raw + `\n` + n.join(`\n`), S = this.list(f);
                    i[i.length - 1] = S, s = s.substring(0, s.length - h.raw.length) + S.raw, r = r.substring(0, r.length - R.raw.length) + S.raw, 
                    n = f.substring(i.at(-1).raw.length).split(`\n`);
                    continue;
                }
            }
            return {
                type: "blockquote",
                raw: s,
                tokens: i,
                text: r
            };
        }
    }
    list(e) {
        let t = this.rules.block.list.exec(e);
        if (t) {
            let n = t[1].trim(), s = n.length > 1, r = {
                type: "list",
                raw: "",
                ordered: s,
                start: s ? +n.slice(0, -1) : "",
                loose: false,
                items: []
            };
            n = s ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = s ? n : "[*+-]");
            let i = this.rules.other.listItemRegex(n), o = false;
            for (;e; ) {
                let a = false, c = "", p = "";
                if (!(t = i.exec(e)) || this.rules.block.hr.test(e)) break;
                c = t[0], e = e.substring(c.length);
                let k = fe(t[2].split(`\n`, 1)[0], t[1].length), h = e.split(`\n`, 1)[0], R = !k.trim(), f = 0;
                if (this.options.pedantic ? (f = 2, p = k.trimStart()) : R ? f = t[1].length + 1 : (f = k.search(this.rules.other.nonSpaceChar), 
                f = f > 4 ? 1 : f, p = k.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (c += h + `\n`, 
                e = e.substring(h.length + 1), a = true), !a) {
                    let S = this.rules.other.nextBulletRegex(f), ee = this.rules.other.hrRegex(f), te = this.rules.other.fencesBeginRegex(f), ne = this.rules.other.headingBeginRegex(f), xe = this.rules.other.htmlBeginRegex(f), be = this.rules.other.blockquoteBeginRegex(f);
                    for (;e; ) {
                        let Z = e.split(`\n`, 1)[0], C;
                        if (h = Z, this.options.pedantic ? (h = h.replace(this.rules.other.listReplaceNesting, "  "), 
                        C = h) : C = h.replace(this.rules.other.tabCharGlobal, "    "), te.test(h) || ne.test(h) || xe.test(h) || be.test(h) || S.test(h) || ee.test(h)) break;
                        if (C.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) p += `\n` + C.slice(f); else {
                            if (R || k.replace(this.rules.other.tabCharGlobal, "    ").search(this.rules.other.nonSpaceChar) >= 4 || te.test(k) || ne.test(k) || ee.test(k)) break;
                            p += `\n` + h;
                        }
                        R = !h.trim(), c += Z + `\n`, e = e.substring(Z.length + 1), k = C.slice(f);
                    }
                }
                r.loose || (o ? r.loose = true : this.rules.other.doubleBlankLine.test(c) && (o = true)), 
                r.items.push({
                    type: "list_item",
                    raw: c,
                    task: !!this.options.gfm && this.rules.other.listIsTask.test(p),
                    loose: false,
                    text: p,
                    tokens: []
                }), r.raw += c;
            }
            let u = r.items.at(-1);
            if (u) u.raw = u.raw.trimEnd(), u.text = u.text.trimEnd(); else return;
            r.raw = r.raw.trimEnd();
            for (let a of r.items) {
                this.lexer.state.top = false, a.tokens = this.lexer.blockTokens(a.text, []);
                let c = a.tokens[0];
                if (a.task && (c?.type === "text" || c?.type === "paragraph")) {
                    a.text = a.text.replace(this.rules.other.listReplaceTask, ""), c.raw = c.raw.replace(this.rules.other.listReplaceTask, ""), 
                    c.text = c.text.replace(this.rules.other.listReplaceTask, "");
                    for (let k = this.lexer.inlineQueue.length - 1; k >= 0; k--) if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[k].src)) {
                        this.lexer.inlineQueue[k].src = this.lexer.inlineQueue[k].src.replace(this.rules.other.listReplaceTask, "");
                        break;
                    }
                    let p = this.rules.other.listTaskCheckbox.exec(a.raw);
                    if (p) {
                        let k = {
                            type: "checkbox",
                            raw: p[0] + " ",
                            checked: p[0] !== "[ ]"
                        };
                        a.checked = k.checked, r.loose ? a.tokens[0] && [ "paragraph", "text" ].includes(a.tokens[0].type) && "tokens" in a.tokens[0] && a.tokens[0].tokens ? (a.tokens[0].raw = k.raw + a.tokens[0].raw, 
                        a.tokens[0].text = k.raw + a.tokens[0].text, a.tokens[0].tokens.unshift(k)) : a.tokens.unshift({
                            type: "paragraph",
                            raw: k.raw,
                            text: k.raw,
                            tokens: [ k ]
                        }) : a.tokens.unshift(k);
                    }
                } else a.task && (a.task = false);
                if (!r.loose) {
                    let p = a.tokens.filter((h => h.type === "space")), k = p.length > 0 && p.some((h => this.rules.other.anyLine.test(h.raw)));
                    r.loose = k;
                }
            }
            if (r.loose) for (let a of r.items) {
                a.loose = true;
                for (let c of a.tokens) c.type === "text" && (c.type = "paragraph");
            }
            return r;
        }
    }
    html(e) {
        let t = this.rules.block.html.exec(e);
        if (t) {
            let n = Y(t[0]);
            return {
                type: "html",
                block: true,
                raw: n,
                pre: t[1] === "pre" || t[1] === "script" || t[1] === "style",
                text: n
            };
        }
    }
    def(e) {
        let t = this.rules.block.def.exec(e);
        if (t) {
            let n = t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " "), s = t[2] ? t[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "", r = t[3] ? t[3].substring(1, t[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : t[3];
            return {
                type: "def",
                tag: n,
                raw: $(t[0], `\n`),
                href: s,
                title: r
            };
        }
    }
    table(e) {
        let t = this.rules.block.table.exec(e);
        if (!t || !this.rules.other.tableDelimiter.test(t[2])) return;
        let n = V(t[1]), s = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), r = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split(`\n`) : [], i = {
            type: "table",
            raw: $(t[0], `\n`),
            header: [],
            align: [],
            rows: []
        };
        if (n.length === s.length) {
            for (let o of s) this.rules.other.tableAlignRight.test(o) ? i.align.push("right") : this.rules.other.tableAlignCenter.test(o) ? i.align.push("center") : this.rules.other.tableAlignLeft.test(o) ? i.align.push("left") : i.align.push(null);
            for (let o = 0; o < n.length; o++) i.header.push({
                text: n[o],
                tokens: this.lexer.inline(n[o]),
                header: true,
                align: i.align[o]
            });
            for (let o of r) i.rows.push(V(o, i.header.length).map(((u, a) => ({
                text: u,
                tokens: this.lexer.inline(u),
                header: false,
                align: i.align[a]
            }))));
            return i;
        }
    }
    lheading(e) {
        let t = this.rules.block.lheading.exec(e);
        if (t) {
            let n = t[1].trim();
            return {
                type: "heading",
                raw: $(t[0], `\n`),
                depth: t[2].charAt(0) === "=" ? 1 : 2,
                text: n,
                tokens: this.lexer.inline(n)
            };
        }
    }
    paragraph(e) {
        let t = this.rules.block.paragraph.exec(e);
        if (t) {
            let n = t[1].charAt(t[1].length - 1) === `\n` ? t[1].slice(0, -1) : t[1];
            return {
                type: "paragraph",
                raw: t[0],
                text: n,
                tokens: this.lexer.inline(n)
            };
        }
    }
    text(e) {
        let t = this.rules.block.text.exec(e);
        if (t) return {
            type: "text",
            raw: t[0],
            text: t[0],
            tokens: this.lexer.inline(t[0])
        };
    }
    escape(e) {
        let t = this.rules.inline.escape.exec(e);
        if (t) return {
            type: "escape",
            raw: t[0],
            text: t[1]
        };
    }
    tag(e) {
        let t = this.rules.inline.tag.exec(e);
        if (t) return !this.lexer.state.inLink && this.rules.other.startATag.test(t[0]) ? this.lexer.state.inLink = true : this.lexer.state.inLink && this.rules.other.endATag.test(t[0]) && (this.lexer.state.inLink = false), 
        !this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(t[0]) ? this.lexer.state.inRawBlock = true : this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(t[0]) && (this.lexer.state.inRawBlock = false), 
        {
            type: "html",
            raw: t[0],
            inLink: this.lexer.state.inLink,
            inRawBlock: this.lexer.state.inRawBlock,
            block: false,
            text: t[0]
        };
    }
    link(e) {
        let t = this.rules.inline.link.exec(e);
        if (t) {
            let n = t[2].trim();
            if (!this.options.pedantic && this.rules.other.startAngleBracket.test(n)) {
                if (!this.rules.other.endAngleBracket.test(n)) return;
                let i = $(n.slice(0, -1), "\\");
                if ((n.length - i.length) % 2 === 0) return;
            } else {
                let i = ge(t[2], "()");
                if (i === -2) return;
                if (i > -1) {
                    let u = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + i;
                    t[2] = t[2].substring(0, i), t[0] = t[0].substring(0, u).trim(), t[3] = "";
                }
            }
            let s = t[2], r = "";
            if (this.options.pedantic) {
                let i = this.rules.other.pedanticHrefTitle.exec(s);
                i && (s = i[1], r = i[3]);
            } else r = t[3] ? t[3].slice(1, -1) : "";
            return s = s.trim(), this.rules.other.startAngleBracket.test(s) && (this.options.pedantic && !this.rules.other.endAngleBracket.test(n) ? s = s.slice(1) : s = s.slice(1, -1)), 
            me(t, {
                href: s && s.replace(this.rules.inline.anyPunctuation, "$1"),
                title: r && r.replace(this.rules.inline.anyPunctuation, "$1")
            }, t[0], this.lexer, this.rules);
        }
    }
    reflink(e, t) {
        let n;
        if ((n = this.rules.inline.reflink.exec(e)) || (n = this.rules.inline.nolink.exec(e))) {
            let s = (n[2] || n[1]).replace(this.rules.other.multipleSpaceGlobal, " "), r = t[s.toLowerCase()];
            if (!r) {
                let i = n[0].charAt(0);
                return {
                    type: "text",
                    raw: i,
                    text: i
                };
            }
            return me(n, r, n[0], this.lexer, this.rules);
        }
    }
    emStrong(e, t, n = "") {
        let s = this.rules.inline.emStrongLDelim.exec(e);
        if (!s || !s[1] && !s[2] && !s[3] && !s[4] || s[4] && n.match(this.rules.other.unicodeAlphaNumeric)) return;
        if (!(s[1] || s[3] || "") || !n || this.rules.inline.punctuation.exec(n)) {
            let i = [ ...s[0] ].length - 1, o, u, a = i, c = 0, p = s[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;
            for (p.lastIndex = 0, t = t.slice(-1 * e.length + i); (s = p.exec(t)) !== null; ) {
                if (o = s[1] || s[2] || s[3] || s[4] || s[5] || s[6], !o) continue;
                if (u = [ ...o ].length, s[3] || s[4]) {
                    a += u;
                    continue;
                } else if ((s[5] || s[6]) && i % 3 && !((i + u) % 3)) {
                    c += u;
                    continue;
                }
                if (a -= u, a > 0) continue;
                u = Math.min(u, u + a + c);
                let k = [ ...s[0] ][0].length, h = e.slice(0, i + s.index + k + u);
                if (Math.min(i, u) % 2) {
                    let f = h.slice(1, -1);
                    return {
                        type: "em",
                        raw: h,
                        text: f,
                        tokens: this.lexer.inlineTokens(f)
                    };
                }
                let R = h.slice(2, -2);
                return {
                    type: "strong",
                    raw: h,
                    text: R,
                    tokens: this.lexer.inlineTokens(R)
                };
            }
        }
    }
    codespan(e) {
        let t = this.rules.inline.code.exec(e);
        if (t) {
            let n = t[2].replace(this.rules.other.newLineCharGlobal, " "), s = this.rules.other.nonSpaceChar.test(n), r = this.rules.other.startingSpaceChar.test(n) && this.rules.other.endingSpaceChar.test(n);
            return s && r && (n = n.substring(1, n.length - 1)), {
                type: "codespan",
                raw: t[0],
                text: n
            };
        }
    }
    br(e) {
        let t = this.rules.inline.br.exec(e);
        if (t) return {
            type: "br",
            raw: t[0]
        };
    }
    del(e, t, n = "") {
        let s = this.rules.inline.delLDelim.exec(e);
        if (!s) return;
        if (!(s[1] || "") || !n || this.rules.inline.punctuation.exec(n)) {
            let i = [ ...s[0] ].length - 1, o, u, a = i, c = this.rules.inline.delRDelim;
            for (c.lastIndex = 0, t = t.slice(-1 * e.length + i); (s = c.exec(t)) !== null; ) {
                if (o = s[1] || s[2] || s[3] || s[4] || s[5] || s[6], !o || (u = [ ...o ].length, 
                u !== i)) continue;
                if (s[3] || s[4]) {
                    a += u;
                    continue;
                }
                if (a -= u, a > 0) continue;
                u = Math.min(u, u + a);
                let p = [ ...s[0] ][0].length, k = e.slice(0, i + s.index + p + u), h = k.slice(i, -i);
                return {
                    type: "del",
                    raw: k,
                    text: h,
                    tokens: this.lexer.inlineTokens(h)
                };
            }
        }
    }
    autolink(e) {
        let t = this.rules.inline.autolink.exec(e);
        if (t) {
            let n, s;
            return t[2] === "@" ? (n = t[1], s = "mailto:" + n) : (n = t[1], s = n), {
                type: "link",
                raw: t[0],
                text: n,
                href: s,
                tokens: [ {
                    type: "text",
                    raw: n,
                    text: n
                } ]
            };
        }
    }
    url(e) {
        let t;
        if (t = this.rules.inline.url.exec(e)) {
            let n, s;
            if (t[2] === "@") n = t[0], s = "mailto:" + n; else {
                let r;
                do {
                    r = t[0], t[0] = this.rules.inline._backpedal.exec(t[0])?.[0] ?? "";
                } while (r !== t[0]);
                n = t[0], t[1] === "www." ? s = "http://" + t[0] : s = t[0];
            }
            return {
                type: "link",
                raw: t[0],
                text: n,
                href: s,
                tokens: [ {
                    type: "text",
                    raw: n,
                    text: n
                } ]
            };
        }
    }
    inlineText(e) {
        let t = this.rules.inline.text.exec(e);
        if (t) {
            let n = this.lexer.state.inRawBlock;
            return {
                type: "text",
                raw: t[0],
                text: t[0],
                escaped: n
            };
        }
    }
};

var x = class l {
    tokens;
    options;
    state;
    inlineQueue;
    tokenizer;
    constructor(e) {
        this.tokens = [], this.tokens.links = Object.create(null), this.options = e || T, 
        this.options.tokenizer = this.options.tokenizer || new w, this.tokenizer = this.options.tokenizer, 
        this.tokenizer.options = this.options, this.tokenizer.lexer = this, this.inlineQueue = [], 
        this.state = {
            inLink: false,
            inRawBlock: false,
            top: true
        };
        let t = {
            other: m,
            block: B.normal,
            inline: A.normal
        };
        this.options.pedantic ? (t.block = B.pedantic, t.inline = A.pedantic) : this.options.gfm && (t.block = B.gfm, 
        this.options.breaks ? t.inline = A.breaks : t.inline = A.gfm), this.tokenizer.rules = t;
    }
    static get rules() {
        return {
            block: B,
            inline: A
        };
    }
    static lex(e, t) {
        return new l(t).lex(e);
    }
    static lexInline(e, t) {
        return new l(t).inlineTokens(e);
    }
    lex(e) {
        e = e.replace(m.carriageReturn, `\n`), this.blockTokens(e, this.tokens);
        for (let t = 0; t < this.inlineQueue.length; t++) {
            let n = this.inlineQueue[t];
            this.inlineTokens(n.src, n.tokens);
        }
        return this.inlineQueue = [], this.tokens;
    }
    blockTokens(e, t = [], n = false) {
        this.tokenizer.lexer = this, this.options.pedantic && (e = e.replace(m.tabCharGlobal, "    ").replace(m.spaceLine, ""));
        let s = 1 / 0;
        for (;e; ) {
            if (e.length < s) s = e.length; else {
                this.infiniteLoopError(e.charCodeAt(0));
                break;
            }
            let r;
            if (this.options.extensions?.block?.some((o => (r = o.call({
                lexer: this
            }, e, t)) ? (e = e.substring(r.raw.length), t.push(r), true) : false))) continue;
            if (r = this.tokenizer.space(e)) {
                e = e.substring(r.raw.length);
                let o = t.at(-1);
                r.raw.length === 1 && o !== void 0 ? o.raw += `\n` : t.push(r);
                continue;
            }
            if (r = this.tokenizer.code(e)) {
                e = e.substring(r.raw.length);
                let o = t.at(-1);
                o?.type === "paragraph" || o?.type === "text" ? (o.raw += (o.raw.endsWith(`\n`) ? "" : `\n`) + r.raw, 
                o.text += `\n` + r.text, this.inlineQueue.at(-1).src = o.text) : t.push(r);
                continue;
            }
            if (r = this.tokenizer.fences(e)) {
                e = e.substring(r.raw.length), t.push(r);
                continue;
            }
            if (r = this.tokenizer.heading(e)) {
                e = e.substring(r.raw.length), t.push(r);
                continue;
            }
            if (r = this.tokenizer.hr(e)) {
                e = e.substring(r.raw.length), t.push(r);
                continue;
            }
            if (r = this.tokenizer.blockquote(e)) {
                e = e.substring(r.raw.length), t.push(r);
                continue;
            }
            if (r = this.tokenizer.list(e)) {
                e = e.substring(r.raw.length), t.push(r);
                continue;
            }
            if (r = this.tokenizer.html(e)) {
                e = e.substring(r.raw.length), t.push(r);
                continue;
            }
            if (r = this.tokenizer.def(e)) {
                e = e.substring(r.raw.length);
                let o = t.at(-1);
                o?.type === "paragraph" || o?.type === "text" ? (o.raw += (o.raw.endsWith(`\n`) ? "" : `\n`) + r.raw, 
                o.text += `\n` + r.raw, this.inlineQueue.at(-1).src = o.text) : this.tokens.links[r.tag] || (this.tokens.links[r.tag] = {
                    href: r.href,
                    title: r.title
                }, t.push(r));
                continue;
            }
            if (r = this.tokenizer.table(e)) {
                e = e.substring(r.raw.length), t.push(r);
                continue;
            }
            if (r = this.tokenizer.lheading(e)) {
                e = e.substring(r.raw.length), t.push(r);
                continue;
            }
            let i = e;
            if (this.options.extensions?.startBlock) {
                let o = 1 / 0, u = e.slice(1), a;
                this.options.extensions.startBlock.forEach((c => {
                    a = c.call({
                        lexer: this
                    }, u), typeof a == "number" && a >= 0 && (o = Math.min(o, a));
                })), o < 1 / 0 && o >= 0 && (i = e.substring(0, o + 1));
            }
            if (this.state.top && (r = this.tokenizer.paragraph(i))) {
                let o = t.at(-1);
                n && o?.type === "paragraph" ? (o.raw += (o.raw.endsWith(`\n`) ? "" : `\n`) + r.raw, 
                o.text += `\n` + r.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = o.text) : t.push(r), 
                n = i.length !== e.length, e = e.substring(r.raw.length);
                continue;
            }
            if (r = this.tokenizer.text(e)) {
                e = e.substring(r.raw.length);
                let o = t.at(-1);
                o?.type === "text" ? (o.raw += (o.raw.endsWith(`\n`) ? "" : `\n`) + r.raw, o.text += `\n` + r.text, 
                this.inlineQueue.pop(), this.inlineQueue.at(-1).src = o.text) : t.push(r);
                continue;
            }
            if (e) {
                this.infiniteLoopError(e.charCodeAt(0));
                break;
            }
        }
        return this.state.top = true, t;
    }
    inline(e, t = []) {
        return this.inlineQueue.push({
            src: e,
            tokens: t
        }), t;
    }
    inlineTokens(e, t = []) {
        this.tokenizer.lexer = this;
        let n = e, s = null;
        if (this.tokens.links) {
            let a = Object.keys(this.tokens.links);
            if (a.length > 0) for (;(s = this.tokenizer.rules.inline.reflinkSearch.exec(n)) !== null; ) a.includes(s[0].slice(s[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, s.index) + "[" + "a".repeat(s[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex));
        }
        for (;(s = this.tokenizer.rules.inline.anyPunctuation.exec(n)) !== null; ) n = n.slice(0, s.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);
        let r;
        for (;(s = this.tokenizer.rules.inline.blockSkip.exec(n)) !== null; ) r = s[2] ? s[2].length : 0, 
        n = n.slice(0, s.index + r) + "[" + "a".repeat(s[0].length - r - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
        n = this.options.hooks?.emStrongMask?.call({
            lexer: this
        }, n) ?? n;
        let i = false, o = "", u = 1 / 0;
        for (;e; ) {
            if (e.length < u) u = e.length; else {
                this.infiniteLoopError(e.charCodeAt(0));
                break;
            }
            i || (o = ""), i = false;
            let a;
            if (this.options.extensions?.inline?.some((p => (a = p.call({
                lexer: this
            }, e, t)) ? (e = e.substring(a.raw.length), t.push(a), true) : false))) continue;
            if (a = this.tokenizer.escape(e)) {
                e = e.substring(a.raw.length), t.push(a);
                continue;
            }
            if (a = this.tokenizer.tag(e)) {
                e = e.substring(a.raw.length), t.push(a);
                continue;
            }
            if (a = this.tokenizer.link(e)) {
                e = e.substring(a.raw.length), t.push(a);
                continue;
            }
            if (a = this.tokenizer.reflink(e, this.tokens.links)) {
                e = e.substring(a.raw.length);
                let p = t.at(-1);
                a.type === "text" && p?.type === "text" ? (p.raw += a.raw, p.text += a.text) : t.push(a);
                continue;
            }
            if (a = this.tokenizer.emStrong(e, n, o)) {
                e = e.substring(a.raw.length), t.push(a);
                continue;
            }
            if (a = this.tokenizer.codespan(e)) {
                e = e.substring(a.raw.length), t.push(a);
                continue;
            }
            if (a = this.tokenizer.br(e)) {
                e = e.substring(a.raw.length), t.push(a);
                continue;
            }
            if (a = this.tokenizer.del(e, n, o)) {
                e = e.substring(a.raw.length), t.push(a);
                continue;
            }
            if (a = this.tokenizer.autolink(e)) {
                e = e.substring(a.raw.length), t.push(a);
                continue;
            }
            if (!this.state.inLink && (a = this.tokenizer.url(e))) {
                e = e.substring(a.raw.length), t.push(a);
                continue;
            }
            let c = e;
            if (this.options.extensions?.startInline) {
                let p = 1 / 0, k = e.slice(1), h;
                this.options.extensions.startInline.forEach((R => {
                    h = R.call({
                        lexer: this
                    }, k), typeof h == "number" && h >= 0 && (p = Math.min(p, h));
                })), p < 1 / 0 && p >= 0 && (c = e.substring(0, p + 1));
            }
            if (a = this.tokenizer.inlineText(c)) {
                e = e.substring(a.raw.length), a.raw.slice(-1) !== "_" && (o = a.raw.slice(-1)), 
                i = true;
                let p = t.at(-1);
                p?.type === "text" ? (p.raw += a.raw, p.text += a.text) : t.push(a);
                continue;
            }
            if (e) {
                this.infiniteLoopError(e.charCodeAt(0));
                break;
            }
        }
        return t;
    }
    infiniteLoopError(e) {
        let t = "Infinite loop on byte: " + e;
        if (this.options.silent) console.error(t); else throw new Error(t);
    }
};

var y = class {
    options;
    parser;
    constructor(e) {
        this.options = e || T;
    }
    space(e) {
        return "";
    }
    code({text: e, lang: t, escaped: n}) {
        let s = (t || "").match(m.notSpaceStart)?.[0], r = e.replace(m.endingNewline, "") + `\n`;
        return s ? '<pre><code class="language-' + O(s) + '">' + (n ? r : O(r, true)) + `</code></pre>\n` : "<pre><code>" + (n ? r : O(r, true)) + `</code></pre>\n`;
    }
    blockquote({tokens: e}) {
        return `<blockquote>\n${this.parser.parse(e)}</blockquote>\n`;
    }
    html({text: e}) {
        return e;
    }
    def(e) {
        return "";
    }
    heading({tokens: e, depth: t}) {
        return `<h${t}>${this.parser.parseInline(e)}</h${t}>\n`;
    }
    hr(e) {
        return `<hr>\n`;
    }
    list(e) {
        let t = e.ordered, n = e.start, s = "";
        for (let o = 0; o < e.items.length; o++) {
            let u = e.items[o];
            s += this.listitem(u);
        }
        let r = t ? "ol" : "ul", i = t && n !== 1 ? ' start="' + n + '"' : "";
        return "<" + r + i + `>\n` + s + "</" + r + `>\n`;
    }
    listitem(e) {
        return `<li>${this.parser.parse(e.tokens)}</li>\n`;
    }
    checkbox({checked: e}) {
        return "<input " + (e ? 'checked="" ' : "") + 'disabled="" type="checkbox"> ';
    }
    paragraph({tokens: e}) {
        return `<p>${this.parser.parseInline(e)}</p>\n`;
    }
    table(e) {
        let t = "", n = "";
        for (let r = 0; r < e.header.length; r++) n += this.tablecell(e.header[r]);
        t += this.tablerow({
            text: n
        });
        let s = "";
        for (let r = 0; r < e.rows.length; r++) {
            let i = e.rows[r];
            n = "";
            for (let o = 0; o < i.length; o++) n += this.tablecell(i[o]);
            s += this.tablerow({
                text: n
            });
        }
        return s && (s = `<tbody>${s}</tbody>`), `<table>\n<thead>\n` + t + `</thead>\n` + s + `</table>\n`;
    }
    tablerow({text: e}) {
        return `<tr>\n${e}</tr>\n`;
    }
    tablecell(e) {
        let t = this.parser.parseInline(e.tokens), n = e.header ? "th" : "td";
        return (e.align ? `<${n} align="${e.align}">` : `<${n}>`) + t + `</${n}>\n`;
    }
    strong({tokens: e}) {
        return `<strong>${this.parser.parseInline(e)}</strong>`;
    }
    em({tokens: e}) {
        return `<em>${this.parser.parseInline(e)}</em>`;
    }
    codespan({text: e}) {
        return `<code>${O(e, true)}</code>`;
    }
    br(e) {
        return "<br>";
    }
    del({tokens: e}) {
        return `<del>${this.parser.parseInline(e)}</del>`;
    }
    link({href: e, title: t, tokens: n}) {
        let s = this.parser.parseInline(n), r = J(e);
        if (r === null) return s;
        e = r;
        let i = '<a href="' + e + '"';
        return t && (i += ' title="' + O(t) + '"'), i += ">" + s + "</a>", i;
    }
    image({href: e, title: t, text: n, tokens: s}) {
        s && (n = this.parser.parseInline(s, this.parser.textRenderer));
        let r = J(e);
        if (r === null) return O(n);
        e = r;
        let i = `<img src="${e}" alt="${O(n)}"`;
        return t && (i += ` title="${O(t)}"`), i += ">", i;
    }
    text(e) {
        return "tokens" in e && e.tokens ? this.parser.parseInline(e.tokens) : "escaped" in e && e.escaped ? e.text : O(e.text);
    }
};

var L = class {
    strong({text: e}) {
        return e;
    }
    em({text: e}) {
        return e;
    }
    codespan({text: e}) {
        return e;
    }
    del({text: e}) {
        return e;
    }
    html({text: e}) {
        return e;
    }
    text({text: e}) {
        return e;
    }
    link({text: e}) {
        return "" + e;
    }
    image({text: e}) {
        return "" + e;
    }
    br() {
        return "";
    }
    checkbox({raw: e}) {
        return e;
    }
};

var b = class l {
    options;
    renderer;
    textRenderer;
    constructor(e) {
        this.options = e || T, this.options.renderer = this.options.renderer || new y, this.renderer = this.options.renderer, 
        this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new L;
    }
    static parse(e, t) {
        return new l(t).parse(e);
    }
    static parseInline(e, t) {
        return new l(t).parseInline(e);
    }
    parse(e) {
        this.renderer.parser = this;
        let t = "";
        for (let n = 0; n < e.length; n++) {
            let s = e[n];
            if (this.options.extensions?.renderers?.[s.type]) {
                let i = s, o = this.options.extensions.renderers[i.type].call({
                    parser: this
                }, i);
                if (o !== false || ![ "space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text" ].includes(i.type)) {
                    t += o || "";
                    continue;
                }
            }
            let r = s;
            switch (r.type) {
              case "space":
                {
                    t += this.renderer.space(r);
                    break;
                }

              case "hr":
                {
                    t += this.renderer.hr(r);
                    break;
                }

              case "heading":
                {
                    t += this.renderer.heading(r);
                    break;
                }

              case "code":
                {
                    t += this.renderer.code(r);
                    break;
                }

              case "table":
                {
                    t += this.renderer.table(r);
                    break;
                }

              case "blockquote":
                {
                    t += this.renderer.blockquote(r);
                    break;
                }

              case "list":
                {
                    t += this.renderer.list(r);
                    break;
                }

              case "checkbox":
                {
                    t += this.renderer.checkbox(r);
                    break;
                }

              case "html":
                {
                    t += this.renderer.html(r);
                    break;
                }

              case "def":
                {
                    t += this.renderer.def(r);
                    break;
                }

              case "paragraph":
                {
                    t += this.renderer.paragraph(r);
                    break;
                }

              case "text":
                {
                    t += this.renderer.text(r);
                    break;
                }

              default:
                {
                    let i = 'Token with "' + r.type + '" type was not found.';
                    if (this.options.silent) return console.error(i), "";
                    throw new Error(i);
                }
            }
        }
        return t;
    }
    parseInline(e, t = this.renderer) {
        this.renderer.parser = this;
        let n = "";
        for (let s = 0; s < e.length; s++) {
            let r = e[s];
            if (this.options.extensions?.renderers?.[r.type]) {
                let o = this.options.extensions.renderers[r.type].call({
                    parser: this
                }, r);
                if (o !== false || ![ "escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text" ].includes(r.type)) {
                    n += o || "";
                    continue;
                }
            }
            let i = r;
            switch (i.type) {
              case "escape":
                {
                    n += t.text(i);
                    break;
                }

              case "html":
                {
                    n += t.html(i);
                    break;
                }

              case "link":
                {
                    n += t.link(i);
                    break;
                }

              case "image":
                {
                    n += t.image(i);
                    break;
                }

              case "checkbox":
                {
                    n += t.checkbox(i);
                    break;
                }

              case "strong":
                {
                    n += t.strong(i);
                    break;
                }

              case "em":
                {
                    n += t.em(i);
                    break;
                }

              case "codespan":
                {
                    n += t.codespan(i);
                    break;
                }

              case "br":
                {
                    n += t.br(i);
                    break;
                }

              case "del":
                {
                    n += t.del(i);
                    break;
                }

              case "text":
                {
                    n += t.text(i);
                    break;
                }

              default:
                {
                    let o = 'Token with "' + i.type + '" type was not found.';
                    if (this.options.silent) return console.error(o), "";
                    throw new Error(o);
                }
            }
        }
        return n;
    }
};

var P = class {
    options;
    block;
    constructor(e) {
        this.options = e || T;
    }
    static passThroughHooks=new Set([ "preprocess", "postprocess", "processAllTokens", "emStrongMask" ]);
    static passThroughHooksRespectAsync=new Set([ "preprocess", "postprocess", "processAllTokens" ]);
    preprocess(e) {
        return e;
    }
    postprocess(e) {
        return e;
    }
    processAllTokens(e) {
        return e;
    }
    emStrongMask(e) {
        return e;
    }
    provideLexer(e = this.block) {
        return e ? x.lex : x.lexInline;
    }
    provideParser(e = this.block) {
        return e ? b.parse : b.parseInline;
    }
};

var D = class {
    defaults=z();
    options=this.setOptions;
    parse=this.parseMarkdown(true);
    parseInline=this.parseMarkdown(false);
    Parser=b;
    Renderer=y;
    TextRenderer=L;
    Lexer=x;
    Tokenizer=w;
    Hooks=P;
    constructor(...e) {
        this.use(...e);
    }
    walkTokens(e, t) {
        let n = [];
        for (let s of e) switch (n = n.concat(t.call(this, s)), s.type) {
          case "table":
            {
                let r = s;
                for (let i of r.header) n = n.concat(this.walkTokens(i.tokens, t));
                for (let i of r.rows) for (let o of i) n = n.concat(this.walkTokens(o.tokens, t));
                break;
            }

          case "list":
            {
                let r = s;
                n = n.concat(this.walkTokens(r.items, t));
                break;
            }

          default:
            {
                let r = s;
                this.defaults.extensions?.childTokens?.[r.type] ? this.defaults.extensions.childTokens[r.type].forEach((i => {
                    let o = r[i].flat(1 / 0);
                    n = n.concat(this.walkTokens(o, t));
                })) : r.tokens && (n = n.concat(this.walkTokens(r.tokens, t)));
            }
        }
        return n;
    }
    use(...e) {
        let t = this.defaults.extensions || {
            renderers: {},
            childTokens: {}
        };
        return e.forEach((n => {
            let s = {
                ...n
            };
            if (s.async = this.defaults.async || s.async || false, n.extensions && (n.extensions.forEach((r => {
                if (!r.name) throw new Error("extension name required");
                if ("renderer" in r) {
                    let i = t.renderers[r.name];
                    i ? t.renderers[r.name] = function(...o) {
                        let u = r.renderer.apply(this, o);
                        return u === false && (u = i.apply(this, o)), u;
                    } : t.renderers[r.name] = r.renderer;
                }
                if ("tokenizer" in r) {
                    if (!r.level || r.level !== "block" && r.level !== "inline") throw new Error("extension level must be 'block' or 'inline'");
                    let i = t[r.level];
                    i ? i.unshift(r.tokenizer) : t[r.level] = [ r.tokenizer ], r.start && (r.level === "block" ? t.startBlock ? t.startBlock.push(r.start) : t.startBlock = [ r.start ] : r.level === "inline" && (t.startInline ? t.startInline.push(r.start) : t.startInline = [ r.start ]));
                }
                "childTokens" in r && r.childTokens && (t.childTokens[r.name] = r.childTokens);
            })), s.extensions = t), n.renderer) {
                let r = this.defaults.renderer || new y(this.defaults);
                for (let i in n.renderer) {
                    if (!(i in r)) throw new Error(`renderer '${i}' does not exist`);
                    if ([ "options", "parser" ].includes(i)) continue;
                    let o = i, u = n.renderer[o], a = r[o];
                    r[o] = (...c) => {
                        let p = u.apply(r, c);
                        return p === false && (p = a.apply(r, c)), p || "";
                    };
                }
                s.renderer = r;
            }
            if (n.tokenizer) {
                let r = this.defaults.tokenizer || new w(this.defaults);
                for (let i in n.tokenizer) {
                    if (!(i in r)) throw new Error(`tokenizer '${i}' does not exist`);
                    if ([ "options", "rules", "lexer" ].includes(i)) continue;
                    let o = i, u = n.tokenizer[o], a = r[o];
                    r[o] = (...c) => {
                        let p = u.apply(r, c);
                        return p === false && (p = a.apply(r, c)), p;
                    };
                }
                s.tokenizer = r;
            }
            if (n.hooks) {
                let r = this.defaults.hooks || new P;
                for (let i in n.hooks) {
                    if (!(i in r)) throw new Error(`hook '${i}' does not exist`);
                    if ([ "options", "block" ].includes(i)) continue;
                    let o = i, u = n.hooks[o], a = r[o];
                    P.passThroughHooks.has(i) ? r[o] = c => {
                        if (this.defaults.async && P.passThroughHooksRespectAsync.has(i)) return (async () => {
                            let k = await u.call(r, c);
                            return a.call(r, k);
                        })();
                        let p = u.call(r, c);
                        return a.call(r, p);
                    } : r[o] = (...c) => {
                        if (this.defaults.async) return (async () => {
                            let k = await u.apply(r, c);
                            return k === false && (k = await a.apply(r, c)), k;
                        })();
                        let p = u.apply(r, c);
                        return p === false && (p = a.apply(r, c)), p;
                    };
                }
                s.hooks = r;
            }
            if (n.walkTokens) {
                let r = this.defaults.walkTokens, i = n.walkTokens;
                s.walkTokens = function(o) {
                    let u = [];
                    return u.push(i.call(this, o)), r && (u = u.concat(r.call(this, o))), u;
                };
            }
            this.defaults = {
                ...this.defaults,
                ...s
            };
        })), this;
    }
    setOptions(e) {
        return this.defaults = {
            ...this.defaults,
            ...e
        }, this;
    }
    lexer(e, t) {
        return x.lex(e, t ?? this.defaults);
    }
    parser(e, t) {
        return b.parse(e, t ?? this.defaults);
    }
    parseMarkdown(e) {
        return (n, s) => {
            let r = {
                ...s
            }, i = {
                ...this.defaults,
                ...r
            }, o = this.onError(!!i.silent, !!i.async);
            if (this.defaults.async === true && r.async === false) return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));
            if (typeof n > "u" || n === null) return o(new Error("marked(): input parameter is undefined or null"));
            if (typeof n != "string") return o(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected"));
            if (i.hooks && (i.hooks.options = i, i.hooks.block = e), i.async) return (async () => {
                let u = i.hooks ? await i.hooks.preprocess(n) : n, c = await (i.hooks ? await i.hooks.provideLexer(e) : e ? x.lex : x.lexInline)(u, i), p = i.hooks ? await i.hooks.processAllTokens(c) : c;
                i.walkTokens && await Promise.all(this.walkTokens(p, i.walkTokens));
                let h = await (i.hooks ? await i.hooks.provideParser(e) : e ? b.parse : b.parseInline)(p, i);
                return i.hooks ? await i.hooks.postprocess(h) : h;
            })().catch(o);
            try {
                i.hooks && (n = i.hooks.preprocess(n));
                let a = (i.hooks ? i.hooks.provideLexer(e) : e ? x.lex : x.lexInline)(n, i);
                i.hooks && (a = i.hooks.processAllTokens(a)), i.walkTokens && this.walkTokens(a, i.walkTokens);
                let p = (i.hooks ? i.hooks.provideParser(e) : e ? b.parse : b.parseInline)(a, i);
                return i.hooks && (p = i.hooks.postprocess(p)), p;
            } catch (u) {
                return o(u);
            }
        };
    }
    onError(e, t) {
        return n => {
            if (n.message += `\nPlease report this to https://github.com/markedjs/marked.`, 
            e) {
                let s = "<p>An error occurred:</p><pre>" + O(n.message + "", true) + "</pre>";
                return t ? Promise.resolve(s) : s;
            }
            if (t) return Promise.reject(n);
            throw n;
        };
    }
};

var M = new D;

function g(l, e) {
    return M.parse(l, e);
}

g.options = g.setOptions = function(l) {
    return M.setOptions(l), g.defaults = M.defaults, G(g.defaults), g;
};

g.getDefaults = z;

g.defaults = T;

g.use = function(...l) {
    return M.use(...l), g.defaults = M.defaults, G(g.defaults), g;
};

g.walkTokens = function(l, e) {
    return M.walkTokens(l, e);
};

g.parseInline = M.parseInline;

g.Parser = b;

g.parser = b.parse;

g.Renderer = y;

g.TextRenderer = L;

g.Lexer = x;

g.lexer = x.lex;

g.Tokenizer = w;

g.Hooks = P;

g.parse = g;

g.options;

g.setOptions;

g.use;

g.walkTokens;

g.parseInline;

b.parse;

x.lex;

function corner(data, cornerExternalLinkTarget) {
    if (!data) {
        return "";
    }
    if (!/\/\//.test(data)) {
        data = "https://github.com/" + data;
    }
    data = data.replace(/^git\+/, "");
    cornerExternalLinkTarget = cornerExternalLinkTarget || "_blank";
    return `\n    <a href="${data}" target="${cornerExternalLinkTarget}" class="github-corner" aria-label="View source on GitHub">\n      <svg viewBox="0 0 250 250" aria-hidden="true">\n        <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>\n        <path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>\n        <path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path>\n      </svg>\n    </a>\n  `;
}

function main(config) {
    const {hideSidebar: hideSidebar, name: name, sidebarPosition: sidebarPosition} = config;
    const sidebarPositionClass = sidebarPosition === "right" ? " sidebar-right" : "";
    const aside = hideSidebar ? "" : `\n    <button class="sidebar-toggle${sidebarPositionClass}" tabindex="-1" title="Press \\ to toggle">\n      <div class="sidebar-toggle-button" tabindex="0" aria-label="Hide primary navigation" aria-keyshortcuts="Use shortcut key \\" aria-controls="__sidebar" role="button">\n        <span></span><span></span><span></span>\n      </div>\n    </button>\n    <aside id="__sidebar" class="sidebar${sidebarPositionClass}${!isMobile() ? " show" : ""}" tabindex="-1" role="none">\n      ${config.name ? `\n            <h1 class="app-name"><a class="app-name-link" data-nosearch>${config.logo ? `<img alt="${name}" src=${config.logo} />` : name}</a></h1>\n          ` : ""}\n      <div class="sidebar-nav" role="navigation" aria-label="primary">\x3c!--sidebar--\x3e</div>\n    </aside>\n  `;
    return `\n    <main role="presentation">\n      ${aside}\n      <section class="content">\n        <article id="main" class="markdown-section" role="main" tabindex="-1">\x3c!--main--\x3e</article>\n      </section>\n    </main>\n  `;
}

function cover() {
    return `\n    <section class="cover show" role="complementary" aria-label="cover">\n      <div class="mask"></div>\n      <div class="cover-main">\x3c!--cover--\x3e</div>\n    </section>\n  `;
}

function tree(toc, tpl = '<ul class="app-sub-sidebar">{inner}</ul>') {
    if (!toc || !toc.length) {
        return "";
    }
    let innerHTML = "";
    toc.forEach((node => {
        const title = node.title.replace(/(<([^>]+)>)/g, "");
        let current = `<li><a class="section-link" href="${node.slug}" title="${title}">${node.title}</a></li>`;
        if (node.children) {
            const children = tree(node.children, "<ul>{inner}</ul>");
            current = `<li><a class="section-link" href="${node.slug}" title="${title}">${node.title}</a>${children}</li>`;
        }
        innerHTML += current;
    }));
    return tpl.replace("{inner}", innerHTML);
}

function helper(className, content) {
    return `<p class="${className}">${content.slice(5).trim()}</p>`;
}

function theme(color) {
    return `<style>:root{--theme-color: ${color};}</style>`;
}

function genTree(toc, maxLevel) {
    const headlines = [];
    const last = {};
    toc.forEach((headline => {
        const level = headline.depth || 1;
        const len = level - 1;
        if (level > maxLevel) {
            return;
        }
        if (last[len]) {
            last[len].children = [ ...last[len].children || [], headline ];
        } else {
            headlines.push(headline);
        }
        last[level] = headline;
    }));
    return headlines;
}

let cache$1 = {};

const re = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g;

function lower(string) {
    return string.toLowerCase();
}

function slugify(str) {
    if (typeof str !== "string") {
        return "";
    }
    let slug = str.trim().normalize("NFC").replace(/\[([^\]]+)\]\([^)]+\)/g, "$1").replace(/\uFE0F/g, "").replace(/[\p{Emoji_Presentation}\p{Extended_Pictographic}]/gu, "").replace(/[A-Z]+/g, lower).replace(/<[^>]+>/g, "").replace(re, "").replace(/\s/g, "-").replace(/^(\d)/, "_$1");
    let count = cache$1[slug];
    count = Object.prototype.hasOwnProperty.call(cache$1, slug) ? count + 1 : 0;
    cache$1[slug] = count;
    if (count) {
        slug = slug + "-" + count;
    }
    return slug;
}

slugify.clear = function() {
    cache$1 = {};
};

var emojiData = {
    baseURL: "https://github.githubassets.com/images/icons/emoji/",
    data: {
        100: "unicode/1f4af.png?v8",
        1234: "unicode/1f522.png?v8",
        "+1": "unicode/1f44d.png?v8",
        "-1": "unicode/1f44e.png?v8",
        "1st_place_medal": "unicode/1f947.png?v8",
        "2nd_place_medal": "unicode/1f948.png?v8",
        "3rd_place_medal": "unicode/1f949.png?v8",
        "8ball": "unicode/1f3b1.png?v8",
        a: "unicode/1f170.png?v8",
        ab: "unicode/1f18e.png?v8",
        abacus: "unicode/1f9ee.png?v8",
        abc: "unicode/1f524.png?v8",
        abcd: "unicode/1f521.png?v8",
        accept: "unicode/1f251.png?v8",
        accessibility: "accessibility.png?v8",
        accordion: "unicode/1fa97.png?v8",
        adhesive_bandage: "unicode/1fa79.png?v8",
        adult: "unicode/1f9d1.png?v8",
        aerial_tramway: "unicode/1f6a1.png?v8",
        afghanistan: "unicode/1f1e6-1f1eb.png?v8",
        airplane: "unicode/2708.png?v8",
        aland_islands: "unicode/1f1e6-1f1fd.png?v8",
        alarm_clock: "unicode/23f0.png?v8",
        albania: "unicode/1f1e6-1f1f1.png?v8",
        alembic: "unicode/2697.png?v8",
        algeria: "unicode/1f1e9-1f1ff.png?v8",
        alien: "unicode/1f47d.png?v8",
        ambulance: "unicode/1f691.png?v8",
        american_samoa: "unicode/1f1e6-1f1f8.png?v8",
        amphora: "unicode/1f3fa.png?v8",
        anatomical_heart: "unicode/1fac0.png?v8",
        anchor: "unicode/2693.png?v8",
        andorra: "unicode/1f1e6-1f1e9.png?v8",
        angel: "unicode/1f47c.png?v8",
        anger: "unicode/1f4a2.png?v8",
        angola: "unicode/1f1e6-1f1f4.png?v8",
        angry: "unicode/1f620.png?v8",
        anguilla: "unicode/1f1e6-1f1ee.png?v8",
        anguished: "unicode/1f627.png?v8",
        ant: "unicode/1f41c.png?v8",
        antarctica: "unicode/1f1e6-1f1f6.png?v8",
        antigua_barbuda: "unicode/1f1e6-1f1ec.png?v8",
        apple: "unicode/1f34e.png?v8",
        aquarius: "unicode/2652.png?v8",
        argentina: "unicode/1f1e6-1f1f7.png?v8",
        aries: "unicode/2648.png?v8",
        armenia: "unicode/1f1e6-1f1f2.png?v8",
        arrow_backward: "unicode/25c0.png?v8",
        arrow_double_down: "unicode/23ec.png?v8",
        arrow_double_up: "unicode/23eb.png?v8",
        arrow_down: "unicode/2b07.png?v8",
        arrow_down_small: "unicode/1f53d.png?v8",
        arrow_forward: "unicode/25b6.png?v8",
        arrow_heading_down: "unicode/2935.png?v8",
        arrow_heading_up: "unicode/2934.png?v8",
        arrow_left: "unicode/2b05.png?v8",
        arrow_lower_left: "unicode/2199.png?v8",
        arrow_lower_right: "unicode/2198.png?v8",
        arrow_right: "unicode/27a1.png?v8",
        arrow_right_hook: "unicode/21aa.png?v8",
        arrow_up: "unicode/2b06.png?v8",
        arrow_up_down: "unicode/2195.png?v8",
        arrow_up_small: "unicode/1f53c.png?v8",
        arrow_upper_left: "unicode/2196.png?v8",
        arrow_upper_right: "unicode/2197.png?v8",
        arrows_clockwise: "unicode/1f503.png?v8",
        arrows_counterclockwise: "unicode/1f504.png?v8",
        art: "unicode/1f3a8.png?v8",
        articulated_lorry: "unicode/1f69b.png?v8",
        artificial_satellite: "unicode/1f6f0.png?v8",
        artist: "unicode/1f9d1-1f3a8.png?v8",
        aruba: "unicode/1f1e6-1f1fc.png?v8",
        ascension_island: "unicode/1f1e6-1f1e8.png?v8",
        asterisk: "unicode/002a-20e3.png?v8",
        astonished: "unicode/1f632.png?v8",
        astronaut: "unicode/1f9d1-1f680.png?v8",
        athletic_shoe: "unicode/1f45f.png?v8",
        atm: "unicode/1f3e7.png?v8",
        atom: "atom.png?v8",
        atom_symbol: "unicode/269b.png?v8",
        australia: "unicode/1f1e6-1f1fa.png?v8",
        austria: "unicode/1f1e6-1f1f9.png?v8",
        auto_rickshaw: "unicode/1f6fa.png?v8",
        avocado: "unicode/1f951.png?v8",
        axe: "unicode/1fa93.png?v8",
        azerbaijan: "unicode/1f1e6-1f1ff.png?v8",
        b: "unicode/1f171.png?v8",
        baby: "unicode/1f476.png?v8",
        baby_bottle: "unicode/1f37c.png?v8",
        baby_chick: "unicode/1f424.png?v8",
        baby_symbol: "unicode/1f6bc.png?v8",
        back: "unicode/1f519.png?v8",
        bacon: "unicode/1f953.png?v8",
        badger: "unicode/1f9a1.png?v8",
        badminton: "unicode/1f3f8.png?v8",
        bagel: "unicode/1f96f.png?v8",
        baggage_claim: "unicode/1f6c4.png?v8",
        baguette_bread: "unicode/1f956.png?v8",
        bahamas: "unicode/1f1e7-1f1f8.png?v8",
        bahrain: "unicode/1f1e7-1f1ed.png?v8",
        balance_scale: "unicode/2696.png?v8",
        bald_man: "unicode/1f468-1f9b2.png?v8",
        bald_woman: "unicode/1f469-1f9b2.png?v8",
        ballet_shoes: "unicode/1fa70.png?v8",
        balloon: "unicode/1f388.png?v8",
        ballot_box: "unicode/1f5f3.png?v8",
        ballot_box_with_check: "unicode/2611.png?v8",
        bamboo: "unicode/1f38d.png?v8",
        banana: "unicode/1f34c.png?v8",
        bangbang: "unicode/203c.png?v8",
        bangladesh: "unicode/1f1e7-1f1e9.png?v8",
        banjo: "unicode/1fa95.png?v8",
        bank: "unicode/1f3e6.png?v8",
        bar_chart: "unicode/1f4ca.png?v8",
        barbados: "unicode/1f1e7-1f1e7.png?v8",
        barber: "unicode/1f488.png?v8",
        baseball: "unicode/26be.png?v8",
        basecamp: "basecamp.png?v8",
        basecampy: "basecampy.png?v8",
        basket: "unicode/1f9fa.png?v8",
        basketball: "unicode/1f3c0.png?v8",
        basketball_man: "unicode/26f9-2642.png?v8",
        basketball_woman: "unicode/26f9-2640.png?v8",
        bat: "unicode/1f987.png?v8",
        bath: "unicode/1f6c0.png?v8",
        bathtub: "unicode/1f6c1.png?v8",
        battery: "unicode/1f50b.png?v8",
        beach_umbrella: "unicode/1f3d6.png?v8",
        beans: "unicode/1fad8.png?v8",
        bear: "unicode/1f43b.png?v8",
        bearded_person: "unicode/1f9d4.png?v8",
        beaver: "unicode/1f9ab.png?v8",
        bed: "unicode/1f6cf.png?v8",
        bee: "unicode/1f41d.png?v8",
        beer: "unicode/1f37a.png?v8",
        beers: "unicode/1f37b.png?v8",
        beetle: "unicode/1fab2.png?v8",
        beginner: "unicode/1f530.png?v8",
        belarus: "unicode/1f1e7-1f1fe.png?v8",
        belgium: "unicode/1f1e7-1f1ea.png?v8",
        belize: "unicode/1f1e7-1f1ff.png?v8",
        bell: "unicode/1f514.png?v8",
        bell_pepper: "unicode/1fad1.png?v8",
        bellhop_bell: "unicode/1f6ce.png?v8",
        benin: "unicode/1f1e7-1f1ef.png?v8",
        bento: "unicode/1f371.png?v8",
        bermuda: "unicode/1f1e7-1f1f2.png?v8",
        beverage_box: "unicode/1f9c3.png?v8",
        bhutan: "unicode/1f1e7-1f1f9.png?v8",
        bicyclist: "unicode/1f6b4.png?v8",
        bike: "unicode/1f6b2.png?v8",
        biking_man: "unicode/1f6b4-2642.png?v8",
        biking_woman: "unicode/1f6b4-2640.png?v8",
        bikini: "unicode/1f459.png?v8",
        billed_cap: "unicode/1f9e2.png?v8",
        biohazard: "unicode/2623.png?v8",
        bird: "unicode/1f426.png?v8",
        birthday: "unicode/1f382.png?v8",
        bison: "unicode/1f9ac.png?v8",
        biting_lip: "unicode/1fae6.png?v8",
        black_bird: "unicode/1f426-2b1b.png?v8",
        black_cat: "unicode/1f408-2b1b.png?v8",
        black_circle: "unicode/26ab.png?v8",
        black_flag: "unicode/1f3f4.png?v8",
        black_heart: "unicode/1f5a4.png?v8",
        black_joker: "unicode/1f0cf.png?v8",
        black_large_square: "unicode/2b1b.png?v8",
        black_medium_small_square: "unicode/25fe.png?v8",
        black_medium_square: "unicode/25fc.png?v8",
        black_nib: "unicode/2712.png?v8",
        black_small_square: "unicode/25aa.png?v8",
        black_square_button: "unicode/1f532.png?v8",
        blond_haired_man: "unicode/1f471-2642.png?v8",
        blond_haired_person: "unicode/1f471.png?v8",
        blond_haired_woman: "unicode/1f471-2640.png?v8",
        blonde_woman: "unicode/1f471-2640.png?v8",
        blossom: "unicode/1f33c.png?v8",
        blowfish: "unicode/1f421.png?v8",
        blue_book: "unicode/1f4d8.png?v8",
        blue_car: "unicode/1f699.png?v8",
        blue_heart: "unicode/1f499.png?v8",
        blue_square: "unicode/1f7e6.png?v8",
        blueberries: "unicode/1fad0.png?v8",
        blush: "unicode/1f60a.png?v8",
        boar: "unicode/1f417.png?v8",
        boat: "unicode/26f5.png?v8",
        bolivia: "unicode/1f1e7-1f1f4.png?v8",
        bomb: "unicode/1f4a3.png?v8",
        bone: "unicode/1f9b4.png?v8",
        book: "unicode/1f4d6.png?v8",
        bookmark: "unicode/1f516.png?v8",
        bookmark_tabs: "unicode/1f4d1.png?v8",
        books: "unicode/1f4da.png?v8",
        boom: "unicode/1f4a5.png?v8",
        boomerang: "unicode/1fa83.png?v8",
        boot: "unicode/1f462.png?v8",
        bosnia_herzegovina: "unicode/1f1e7-1f1e6.png?v8",
        botswana: "unicode/1f1e7-1f1fc.png?v8",
        bouncing_ball_man: "unicode/26f9-2642.png?v8",
        bouncing_ball_person: "unicode/26f9.png?v8",
        bouncing_ball_woman: "unicode/26f9-2640.png?v8",
        bouquet: "unicode/1f490.png?v8",
        bouvet_island: "unicode/1f1e7-1f1fb.png?v8",
        bow: "unicode/1f647.png?v8",
        bow_and_arrow: "unicode/1f3f9.png?v8",
        bowing_man: "unicode/1f647-2642.png?v8",
        bowing_woman: "unicode/1f647-2640.png?v8",
        bowl_with_spoon: "unicode/1f963.png?v8",
        bowling: "unicode/1f3b3.png?v8",
        bowtie: "bowtie.png?v8",
        boxing_glove: "unicode/1f94a.png?v8",
        boy: "unicode/1f466.png?v8",
        brain: "unicode/1f9e0.png?v8",
        brazil: "unicode/1f1e7-1f1f7.png?v8",
        bread: "unicode/1f35e.png?v8",
        breast_feeding: "unicode/1f931.png?v8",
        bricks: "unicode/1f9f1.png?v8",
        bride_with_veil: "unicode/1f470-2640.png?v8",
        bridge_at_night: "unicode/1f309.png?v8",
        briefcase: "unicode/1f4bc.png?v8",
        british_indian_ocean_territory: "unicode/1f1ee-1f1f4.png?v8",
        british_virgin_islands: "unicode/1f1fb-1f1ec.png?v8",
        broccoli: "unicode/1f966.png?v8",
        broken_heart: "unicode/1f494.png?v8",
        broom: "unicode/1f9f9.png?v8",
        brown_circle: "unicode/1f7e4.png?v8",
        brown_heart: "unicode/1f90e.png?v8",
        brown_square: "unicode/1f7eb.png?v8",
        brunei: "unicode/1f1e7-1f1f3.png?v8",
        bubble_tea: "unicode/1f9cb.png?v8",
        bubbles: "unicode/1fae7.png?v8",
        bucket: "unicode/1faa3.png?v8",
        bug: "unicode/1f41b.png?v8",
        building_construction: "unicode/1f3d7.png?v8",
        bulb: "unicode/1f4a1.png?v8",
        bulgaria: "unicode/1f1e7-1f1ec.png?v8",
        bullettrain_front: "unicode/1f685.png?v8",
        bullettrain_side: "unicode/1f684.png?v8",
        burkina_faso: "unicode/1f1e7-1f1eb.png?v8",
        burrito: "unicode/1f32f.png?v8",
        burundi: "unicode/1f1e7-1f1ee.png?v8",
        bus: "unicode/1f68c.png?v8",
        business_suit_levitating: "unicode/1f574.png?v8",
        busstop: "unicode/1f68f.png?v8",
        bust_in_silhouette: "unicode/1f464.png?v8",
        busts_in_silhouette: "unicode/1f465.png?v8",
        butter: "unicode/1f9c8.png?v8",
        butterfly: "unicode/1f98b.png?v8",
        cactus: "unicode/1f335.png?v8",
        cake: "unicode/1f370.png?v8",
        calendar: "unicode/1f4c6.png?v8",
        call_me_hand: "unicode/1f919.png?v8",
        calling: "unicode/1f4f2.png?v8",
        cambodia: "unicode/1f1f0-1f1ed.png?v8",
        camel: "unicode/1f42b.png?v8",
        camera: "unicode/1f4f7.png?v8",
        camera_flash: "unicode/1f4f8.png?v8",
        cameroon: "unicode/1f1e8-1f1f2.png?v8",
        camping: "unicode/1f3d5.png?v8",
        canada: "unicode/1f1e8-1f1e6.png?v8",
        canary_islands: "unicode/1f1ee-1f1e8.png?v8",
        cancer: "unicode/264b.png?v8",
        candle: "unicode/1f56f.png?v8",
        candy: "unicode/1f36c.png?v8",
        canned_food: "unicode/1f96b.png?v8",
        canoe: "unicode/1f6f6.png?v8",
        cape_verde: "unicode/1f1e8-1f1fb.png?v8",
        capital_abcd: "unicode/1f520.png?v8",
        capricorn: "unicode/2651.png?v8",
        car: "unicode/1f697.png?v8",
        card_file_box: "unicode/1f5c3.png?v8",
        card_index: "unicode/1f4c7.png?v8",
        card_index_dividers: "unicode/1f5c2.png?v8",
        caribbean_netherlands: "unicode/1f1e7-1f1f6.png?v8",
        carousel_horse: "unicode/1f3a0.png?v8",
        carpentry_saw: "unicode/1fa9a.png?v8",
        carrot: "unicode/1f955.png?v8",
        cartwheeling: "unicode/1f938.png?v8",
        cat: "unicode/1f431.png?v8",
        cat2: "unicode/1f408.png?v8",
        cayman_islands: "unicode/1f1f0-1f1fe.png?v8",
        cd: "unicode/1f4bf.png?v8",
        central_african_republic: "unicode/1f1e8-1f1eb.png?v8",
        ceuta_melilla: "unicode/1f1ea-1f1e6.png?v8",
        chad: "unicode/1f1f9-1f1e9.png?v8",
        chains: "unicode/26d3.png?v8",
        chair: "unicode/1fa91.png?v8",
        champagne: "unicode/1f37e.png?v8",
        chart: "unicode/1f4b9.png?v8",
        chart_with_downwards_trend: "unicode/1f4c9.png?v8",
        chart_with_upwards_trend: "unicode/1f4c8.png?v8",
        checkered_flag: "unicode/1f3c1.png?v8",
        cheese: "unicode/1f9c0.png?v8",
        cherries: "unicode/1f352.png?v8",
        cherry_blossom: "unicode/1f338.png?v8",
        chess_pawn: "unicode/265f.png?v8",
        chestnut: "unicode/1f330.png?v8",
        chicken: "unicode/1f414.png?v8",
        child: "unicode/1f9d2.png?v8",
        children_crossing: "unicode/1f6b8.png?v8",
        chile: "unicode/1f1e8-1f1f1.png?v8",
        chipmunk: "unicode/1f43f.png?v8",
        chocolate_bar: "unicode/1f36b.png?v8",
        chopsticks: "unicode/1f962.png?v8",
        christmas_island: "unicode/1f1e8-1f1fd.png?v8",
        christmas_tree: "unicode/1f384.png?v8",
        church: "unicode/26ea.png?v8",
        cinema: "unicode/1f3a6.png?v8",
        circus_tent: "unicode/1f3aa.png?v8",
        city_sunrise: "unicode/1f307.png?v8",
        city_sunset: "unicode/1f306.png?v8",
        cityscape: "unicode/1f3d9.png?v8",
        cl: "unicode/1f191.png?v8",
        clamp: "unicode/1f5dc.png?v8",
        clap: "unicode/1f44f.png?v8",
        clapper: "unicode/1f3ac.png?v8",
        classical_building: "unicode/1f3db.png?v8",
        climbing: "unicode/1f9d7.png?v8",
        climbing_man: "unicode/1f9d7-2642.png?v8",
        climbing_woman: "unicode/1f9d7-2640.png?v8",
        clinking_glasses: "unicode/1f942.png?v8",
        clipboard: "unicode/1f4cb.png?v8",
        clipperton_island: "unicode/1f1e8-1f1f5.png?v8",
        clock1: "unicode/1f550.png?v8",
        clock10: "unicode/1f559.png?v8",
        clock1030: "unicode/1f565.png?v8",
        clock11: "unicode/1f55a.png?v8",
        clock1130: "unicode/1f566.png?v8",
        clock12: "unicode/1f55b.png?v8",
        clock1230: "unicode/1f567.png?v8",
        clock130: "unicode/1f55c.png?v8",
        clock2: "unicode/1f551.png?v8",
        clock230: "unicode/1f55d.png?v8",
        clock3: "unicode/1f552.png?v8",
        clock330: "unicode/1f55e.png?v8",
        clock4: "unicode/1f553.png?v8",
        clock430: "unicode/1f55f.png?v8",
        clock5: "unicode/1f554.png?v8",
        clock530: "unicode/1f560.png?v8",
        clock6: "unicode/1f555.png?v8",
        clock630: "unicode/1f561.png?v8",
        clock7: "unicode/1f556.png?v8",
        clock730: "unicode/1f562.png?v8",
        clock8: "unicode/1f557.png?v8",
        clock830: "unicode/1f563.png?v8",
        clock9: "unicode/1f558.png?v8",
        clock930: "unicode/1f564.png?v8",
        closed_book: "unicode/1f4d5.png?v8",
        closed_lock_with_key: "unicode/1f510.png?v8",
        closed_umbrella: "unicode/1f302.png?v8",
        cloud: "unicode/2601.png?v8",
        cloud_with_lightning: "unicode/1f329.png?v8",
        cloud_with_lightning_and_rain: "unicode/26c8.png?v8",
        cloud_with_rain: "unicode/1f327.png?v8",
        cloud_with_snow: "unicode/1f328.png?v8",
        clown_face: "unicode/1f921.png?v8",
        clubs: "unicode/2663.png?v8",
        cn: "unicode/1f1e8-1f1f3.png?v8",
        coat: "unicode/1f9e5.png?v8",
        cockroach: "unicode/1fab3.png?v8",
        cocktail: "unicode/1f378.png?v8",
        coconut: "unicode/1f965.png?v8",
        cocos_islands: "unicode/1f1e8-1f1e8.png?v8",
        coffee: "unicode/2615.png?v8",
        coffin: "unicode/26b0.png?v8",
        coin: "unicode/1fa99.png?v8",
        cold_face: "unicode/1f976.png?v8",
        cold_sweat: "unicode/1f630.png?v8",
        collision: "unicode/1f4a5.png?v8",
        colombia: "unicode/1f1e8-1f1f4.png?v8",
        comet: "unicode/2604.png?v8",
        comoros: "unicode/1f1f0-1f1f2.png?v8",
        compass: "unicode/1f9ed.png?v8",
        computer: "unicode/1f4bb.png?v8",
        computer_mouse: "unicode/1f5b1.png?v8",
        confetti_ball: "unicode/1f38a.png?v8",
        confounded: "unicode/1f616.png?v8",
        confused: "unicode/1f615.png?v8",
        congo_brazzaville: "unicode/1f1e8-1f1ec.png?v8",
        congo_kinshasa: "unicode/1f1e8-1f1e9.png?v8",
        congratulations: "unicode/3297.png?v8",
        construction: "unicode/1f6a7.png?v8",
        construction_worker: "unicode/1f477.png?v8",
        construction_worker_man: "unicode/1f477-2642.png?v8",
        construction_worker_woman: "unicode/1f477-2640.png?v8",
        control_knobs: "unicode/1f39b.png?v8",
        convenience_store: "unicode/1f3ea.png?v8",
        cook: "unicode/1f9d1-1f373.png?v8",
        cook_islands: "unicode/1f1e8-1f1f0.png?v8",
        cookie: "unicode/1f36a.png?v8",
        cool: "unicode/1f192.png?v8",
        cop: "unicode/1f46e.png?v8",
        copilot: "copilot.png?v8",
        copyright: "unicode/00a9.png?v8",
        coral: "unicode/1fab8.png?v8",
        corn: "unicode/1f33d.png?v8",
        costa_rica: "unicode/1f1e8-1f1f7.png?v8",
        cote_divoire: "unicode/1f1e8-1f1ee.png?v8",
        couch_and_lamp: "unicode/1f6cb.png?v8",
        couple: "unicode/1f46b.png?v8",
        couple_with_heart: "unicode/1f491.png?v8",
        couple_with_heart_man_man: "unicode/1f468-2764-1f468.png?v8",
        couple_with_heart_woman_man: "unicode/1f469-2764-1f468.png?v8",
        couple_with_heart_woman_woman: "unicode/1f469-2764-1f469.png?v8",
        couplekiss: "unicode/1f48f.png?v8",
        couplekiss_man_man: "unicode/1f468-2764-1f48b-1f468.png?v8",
        couplekiss_man_woman: "unicode/1f469-2764-1f48b-1f468.png?v8",
        couplekiss_woman_woman: "unicode/1f469-2764-1f48b-1f469.png?v8",
        cow: "unicode/1f42e.png?v8",
        cow2: "unicode/1f404.png?v8",
        cowboy_hat_face: "unicode/1f920.png?v8",
        crab: "unicode/1f980.png?v8",
        crayon: "unicode/1f58d.png?v8",
        credit_card: "unicode/1f4b3.png?v8",
        crescent_moon: "unicode/1f319.png?v8",
        cricket: "unicode/1f997.png?v8",
        cricket_game: "unicode/1f3cf.png?v8",
        croatia: "unicode/1f1ed-1f1f7.png?v8",
        crocodile: "unicode/1f40a.png?v8",
        croissant: "unicode/1f950.png?v8",
        crossed_fingers: "unicode/1f91e.png?v8",
        crossed_flags: "unicode/1f38c.png?v8",
        crossed_swords: "unicode/2694.png?v8",
        crown: "unicode/1f451.png?v8",
        crutch: "unicode/1fa7c.png?v8",
        cry: "unicode/1f622.png?v8",
        crying_cat_face: "unicode/1f63f.png?v8",
        crystal_ball: "unicode/1f52e.png?v8",
        cuba: "unicode/1f1e8-1f1fa.png?v8",
        cucumber: "unicode/1f952.png?v8",
        cup_with_straw: "unicode/1f964.png?v8",
        cupcake: "unicode/1f9c1.png?v8",
        cupid: "unicode/1f498.png?v8",
        curacao: "unicode/1f1e8-1f1fc.png?v8",
        curling_stone: "unicode/1f94c.png?v8",
        curly_haired_man: "unicode/1f468-1f9b1.png?v8",
        curly_haired_woman: "unicode/1f469-1f9b1.png?v8",
        curly_loop: "unicode/27b0.png?v8",
        currency_exchange: "unicode/1f4b1.png?v8",
        curry: "unicode/1f35b.png?v8",
        cursing_face: "unicode/1f92c.png?v8",
        custard: "unicode/1f36e.png?v8",
        customs: "unicode/1f6c3.png?v8",
        cut_of_meat: "unicode/1f969.png?v8",
        cyclone: "unicode/1f300.png?v8",
        cyprus: "unicode/1f1e8-1f1fe.png?v8",
        czech_republic: "unicode/1f1e8-1f1ff.png?v8",
        dagger: "unicode/1f5e1.png?v8",
        dancer: "unicode/1f483.png?v8",
        dancers: "unicode/1f46f.png?v8",
        dancing_men: "unicode/1f46f-2642.png?v8",
        dancing_women: "unicode/1f46f-2640.png?v8",
        dango: "unicode/1f361.png?v8",
        dark_sunglasses: "unicode/1f576.png?v8",
        dart: "unicode/1f3af.png?v8",
        dash: "unicode/1f4a8.png?v8",
        date: "unicode/1f4c5.png?v8",
        de: "unicode/1f1e9-1f1ea.png?v8",
        deaf_man: "unicode/1f9cf-2642.png?v8",
        deaf_person: "unicode/1f9cf.png?v8",
        deaf_woman: "unicode/1f9cf-2640.png?v8",
        deciduous_tree: "unicode/1f333.png?v8",
        deer: "unicode/1f98c.png?v8",
        denmark: "unicode/1f1e9-1f1f0.png?v8",
        department_store: "unicode/1f3ec.png?v8",
        dependabot: "dependabot.png?v8",
        derelict_house: "unicode/1f3da.png?v8",
        desert: "unicode/1f3dc.png?v8",
        desert_island: "unicode/1f3dd.png?v8",
        desktop_computer: "unicode/1f5a5.png?v8",
        detective: "unicode/1f575.png?v8",
        diamond_shape_with_a_dot_inside: "unicode/1f4a0.png?v8",
        diamonds: "unicode/2666.png?v8",
        diego_garcia: "unicode/1f1e9-1f1ec.png?v8",
        disappointed: "unicode/1f61e.png?v8",
        disappointed_relieved: "unicode/1f625.png?v8",
        disguised_face: "unicode/1f978.png?v8",
        diving_mask: "unicode/1f93f.png?v8",
        diya_lamp: "unicode/1fa94.png?v8",
        dizzy: "unicode/1f4ab.png?v8",
        dizzy_face: "unicode/1f635.png?v8",
        djibouti: "unicode/1f1e9-1f1ef.png?v8",
        dna: "unicode/1f9ec.png?v8",
        do_not_litter: "unicode/1f6af.png?v8",
        dodo: "unicode/1f9a4.png?v8",
        dog: "unicode/1f436.png?v8",
        dog2: "unicode/1f415.png?v8",
        dollar: "unicode/1f4b5.png?v8",
        dolls: "unicode/1f38e.png?v8",
        dolphin: "unicode/1f42c.png?v8",
        dominica: "unicode/1f1e9-1f1f2.png?v8",
        dominican_republic: "unicode/1f1e9-1f1f4.png?v8",
        donkey: "unicode/1facf.png?v8",
        door: "unicode/1f6aa.png?v8",
        dotted_line_face: "unicode/1fae5.png?v8",
        doughnut: "unicode/1f369.png?v8",
        dove: "unicode/1f54a.png?v8",
        dragon: "unicode/1f409.png?v8",
        dragon_face: "unicode/1f432.png?v8",
        dress: "unicode/1f457.png?v8",
        dromedary_camel: "unicode/1f42a.png?v8",
        drooling_face: "unicode/1f924.png?v8",
        drop_of_blood: "unicode/1fa78.png?v8",
        droplet: "unicode/1f4a7.png?v8",
        drum: "unicode/1f941.png?v8",
        duck: "unicode/1f986.png?v8",
        dumpling: "unicode/1f95f.png?v8",
        dvd: "unicode/1f4c0.png?v8",
        "e-mail": "unicode/1f4e7.png?v8",
        eagle: "unicode/1f985.png?v8",
        ear: "unicode/1f442.png?v8",
        ear_of_rice: "unicode/1f33e.png?v8",
        ear_with_hearing_aid: "unicode/1f9bb.png?v8",
        earth_africa: "unicode/1f30d.png?v8",
        earth_americas: "unicode/1f30e.png?v8",
        earth_asia: "unicode/1f30f.png?v8",
        ecuador: "unicode/1f1ea-1f1e8.png?v8",
        egg: "unicode/1f95a.png?v8",
        eggplant: "unicode/1f346.png?v8",
        egypt: "unicode/1f1ea-1f1ec.png?v8",
        eight: "unicode/0038-20e3.png?v8",
        eight_pointed_black_star: "unicode/2734.png?v8",
        eight_spoked_asterisk: "unicode/2733.png?v8",
        eject_button: "unicode/23cf.png?v8",
        el_salvador: "unicode/1f1f8-1f1fb.png?v8",
        electric_plug: "unicode/1f50c.png?v8",
        electron: "electron.png?v8",
        elephant: "unicode/1f418.png?v8",
        elevator: "unicode/1f6d7.png?v8",
        elf: "unicode/1f9dd.png?v8",
        elf_man: "unicode/1f9dd-2642.png?v8",
        elf_woman: "unicode/1f9dd-2640.png?v8",
        email: "unicode/1f4e7.png?v8",
        empty_nest: "unicode/1fab9.png?v8",
        end: "unicode/1f51a.png?v8",
        england: "unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8",
        envelope: "unicode/2709.png?v8",
        envelope_with_arrow: "unicode/1f4e9.png?v8",
        equatorial_guinea: "unicode/1f1ec-1f1f6.png?v8",
        eritrea: "unicode/1f1ea-1f1f7.png?v8",
        es: "unicode/1f1ea-1f1f8.png?v8",
        estonia: "unicode/1f1ea-1f1ea.png?v8",
        ethiopia: "unicode/1f1ea-1f1f9.png?v8",
        eu: "unicode/1f1ea-1f1fa.png?v8",
        euro: "unicode/1f4b6.png?v8",
        european_castle: "unicode/1f3f0.png?v8",
        european_post_office: "unicode/1f3e4.png?v8",
        european_union: "unicode/1f1ea-1f1fa.png?v8",
        evergreen_tree: "unicode/1f332.png?v8",
        exclamation: "unicode/2757.png?v8",
        exploding_head: "unicode/1f92f.png?v8",
        expressionless: "unicode/1f611.png?v8",
        eye: "unicode/1f441.png?v8",
        eye_speech_bubble: "unicode/1f441-1f5e8.png?v8",
        eyeglasses: "unicode/1f453.png?v8",
        eyes: "unicode/1f440.png?v8",
        face_exhaling: "unicode/1f62e-1f4a8.png?v8",
        face_holding_back_tears: "unicode/1f979.png?v8",
        face_in_clouds: "unicode/1f636-1f32b.png?v8",
        face_with_diagonal_mouth: "unicode/1fae4.png?v8",
        face_with_head_bandage: "unicode/1f915.png?v8",
        face_with_open_eyes_and_hand_over_mouth: "unicode/1fae2.png?v8",
        face_with_peeking_eye: "unicode/1fae3.png?v8",
        face_with_spiral_eyes: "unicode/1f635-1f4ab.png?v8",
        face_with_thermometer: "unicode/1f912.png?v8",
        facepalm: "unicode/1f926.png?v8",
        facepunch: "unicode/1f44a.png?v8",
        factory: "unicode/1f3ed.png?v8",
        factory_worker: "unicode/1f9d1-1f3ed.png?v8",
        fairy: "unicode/1f9da.png?v8",
        fairy_man: "unicode/1f9da-2642.png?v8",
        fairy_woman: "unicode/1f9da-2640.png?v8",
        falafel: "unicode/1f9c6.png?v8",
        falkland_islands: "unicode/1f1eb-1f1f0.png?v8",
        fallen_leaf: "unicode/1f342.png?v8",
        family: "unicode/1f46a.png?v8",
        family_man_boy: "unicode/1f468-1f466.png?v8",
        family_man_boy_boy: "unicode/1f468-1f466-1f466.png?v8",
        family_man_girl: "unicode/1f468-1f467.png?v8",
        family_man_girl_boy: "unicode/1f468-1f467-1f466.png?v8",
        family_man_girl_girl: "unicode/1f468-1f467-1f467.png?v8",
        family_man_man_boy: "unicode/1f468-1f468-1f466.png?v8",
        family_man_man_boy_boy: "unicode/1f468-1f468-1f466-1f466.png?v8",
        family_man_man_girl: "unicode/1f468-1f468-1f467.png?v8",
        family_man_man_girl_boy: "unicode/1f468-1f468-1f467-1f466.png?v8",
        family_man_man_girl_girl: "unicode/1f468-1f468-1f467-1f467.png?v8",
        family_man_woman_boy: "unicode/1f468-1f469-1f466.png?v8",
        family_man_woman_boy_boy: "unicode/1f468-1f469-1f466-1f466.png?v8",
        family_man_woman_girl: "unicode/1f468-1f469-1f467.png?v8",
        family_man_woman_girl_boy: "unicode/1f468-1f469-1f467-1f466.png?v8",
        family_man_woman_girl_girl: "unicode/1f468-1f469-1f467-1f467.png?v8",
        family_woman_boy: "unicode/1f469-1f466.png?v8",
        family_woman_boy_boy: "unicode/1f469-1f466-1f466.png?v8",
        family_woman_girl: "unicode/1f469-1f467.png?v8",
        family_woman_girl_boy: "unicode/1f469-1f467-1f466.png?v8",
        family_woman_girl_girl: "unicode/1f469-1f467-1f467.png?v8",
        family_woman_woman_boy: "unicode/1f469-1f469-1f466.png?v8",
        family_woman_woman_boy_boy: "unicode/1f469-1f469-1f466-1f466.png?v8",
        family_woman_woman_girl: "unicode/1f469-1f469-1f467.png?v8",
        family_woman_woman_girl_boy: "unicode/1f469-1f469-1f467-1f466.png?v8",
        family_woman_woman_girl_girl: "unicode/1f469-1f469-1f467-1f467.png?v8",
        farmer: "unicode/1f9d1-1f33e.png?v8",
        faroe_islands: "unicode/1f1eb-1f1f4.png?v8",
        fast_forward: "unicode/23e9.png?v8",
        fax: "unicode/1f4e0.png?v8",
        fearful: "unicode/1f628.png?v8",
        feather: "unicode/1fab6.png?v8",
        feelsgood: "feelsgood.png?v8",
        feet: "unicode/1f43e.png?v8",
        female_detective: "unicode/1f575-2640.png?v8",
        female_sign: "unicode/2640.png?v8",
        ferris_wheel: "unicode/1f3a1.png?v8",
        ferry: "unicode/26f4.png?v8",
        field_hockey: "unicode/1f3d1.png?v8",
        fiji: "unicode/1f1eb-1f1ef.png?v8",
        file_cabinet: "unicode/1f5c4.png?v8",
        file_folder: "unicode/1f4c1.png?v8",
        film_projector: "unicode/1f4fd.png?v8",
        film_strip: "unicode/1f39e.png?v8",
        finland: "unicode/1f1eb-1f1ee.png?v8",
        finnadie: "finnadie.png?v8",
        fire: "unicode/1f525.png?v8",
        fire_engine: "unicode/1f692.png?v8",
        fire_extinguisher: "unicode/1f9ef.png?v8",
        firecracker: "unicode/1f9e8.png?v8",
        firefighter: "unicode/1f9d1-1f692.png?v8",
        fireworks: "unicode/1f386.png?v8",
        first_quarter_moon: "unicode/1f313.png?v8",
        first_quarter_moon_with_face: "unicode/1f31b.png?v8",
        fish: "unicode/1f41f.png?v8",
        fish_cake: "unicode/1f365.png?v8",
        fishing_pole_and_fish: "unicode/1f3a3.png?v8",
        fishsticks: "fishsticks.png?v8",
        fist: "unicode/270a.png?v8",
        fist_left: "unicode/1f91b.png?v8",
        fist_oncoming: "unicode/1f44a.png?v8",
        fist_raised: "unicode/270a.png?v8",
        fist_right: "unicode/1f91c.png?v8",
        five: "unicode/0035-20e3.png?v8",
        flags: "unicode/1f38f.png?v8",
        flamingo: "unicode/1f9a9.png?v8",
        flashlight: "unicode/1f526.png?v8",
        flat_shoe: "unicode/1f97f.png?v8",
        flatbread: "unicode/1fad3.png?v8",
        fleur_de_lis: "unicode/269c.png?v8",
        flight_arrival: "unicode/1f6ec.png?v8",
        flight_departure: "unicode/1f6eb.png?v8",
        flipper: "unicode/1f42c.png?v8",
        floppy_disk: "unicode/1f4be.png?v8",
        flower_playing_cards: "unicode/1f3b4.png?v8",
        flushed: "unicode/1f633.png?v8",
        flute: "unicode/1fa88.png?v8",
        fly: "unicode/1fab0.png?v8",
        flying_disc: "unicode/1f94f.png?v8",
        flying_saucer: "unicode/1f6f8.png?v8",
        fog: "unicode/1f32b.png?v8",
        foggy: "unicode/1f301.png?v8",
        folding_hand_fan: "unicode/1faad.png?v8",
        fondue: "unicode/1fad5.png?v8",
        foot: "unicode/1f9b6.png?v8",
        football: "unicode/1f3c8.png?v8",
        footprints: "unicode/1f463.png?v8",
        fork_and_knife: "unicode/1f374.png?v8",
        fortune_cookie: "unicode/1f960.png?v8",
        fountain: "unicode/26f2.png?v8",
        fountain_pen: "unicode/1f58b.png?v8",
        four: "unicode/0034-20e3.png?v8",
        four_leaf_clover: "unicode/1f340.png?v8",
        fox_face: "unicode/1f98a.png?v8",
        fr: "unicode/1f1eb-1f1f7.png?v8",
        framed_picture: "unicode/1f5bc.png?v8",
        free: "unicode/1f193.png?v8",
        french_guiana: "unicode/1f1ec-1f1eb.png?v8",
        french_polynesia: "unicode/1f1f5-1f1eb.png?v8",
        french_southern_territories: "unicode/1f1f9-1f1eb.png?v8",
        fried_egg: "unicode/1f373.png?v8",
        fried_shrimp: "unicode/1f364.png?v8",
        fries: "unicode/1f35f.png?v8",
        frog: "unicode/1f438.png?v8",
        frowning: "unicode/1f626.png?v8",
        frowning_face: "unicode/2639.png?v8",
        frowning_man: "unicode/1f64d-2642.png?v8",
        frowning_person: "unicode/1f64d.png?v8",
        frowning_woman: "unicode/1f64d-2640.png?v8",
        fu: "unicode/1f595.png?v8",
        fuelpump: "unicode/26fd.png?v8",
        full_moon: "unicode/1f315.png?v8",
        full_moon_with_face: "unicode/1f31d.png?v8",
        funeral_urn: "unicode/26b1.png?v8",
        gabon: "unicode/1f1ec-1f1e6.png?v8",
        gambia: "unicode/1f1ec-1f1f2.png?v8",
        game_die: "unicode/1f3b2.png?v8",
        garlic: "unicode/1f9c4.png?v8",
        gb: "unicode/1f1ec-1f1e7.png?v8",
        gear: "unicode/2699.png?v8",
        gem: "unicode/1f48e.png?v8",
        gemini: "unicode/264a.png?v8",
        genie: "unicode/1f9de.png?v8",
        genie_man: "unicode/1f9de-2642.png?v8",
        genie_woman: "unicode/1f9de-2640.png?v8",
        georgia: "unicode/1f1ec-1f1ea.png?v8",
        ghana: "unicode/1f1ec-1f1ed.png?v8",
        ghost: "unicode/1f47b.png?v8",
        gibraltar: "unicode/1f1ec-1f1ee.png?v8",
        gift: "unicode/1f381.png?v8",
        gift_heart: "unicode/1f49d.png?v8",
        ginger_root: "unicode/1fada.png?v8",
        giraffe: "unicode/1f992.png?v8",
        girl: "unicode/1f467.png?v8",
        globe_with_meridians: "unicode/1f310.png?v8",
        gloves: "unicode/1f9e4.png?v8",
        goal_net: "unicode/1f945.png?v8",
        goat: "unicode/1f410.png?v8",
        goberserk: "goberserk.png?v8",
        godmode: "godmode.png?v8",
        goggles: "unicode/1f97d.png?v8",
        golf: "unicode/26f3.png?v8",
        golfing: "unicode/1f3cc.png?v8",
        golfing_man: "unicode/1f3cc-2642.png?v8",
        golfing_woman: "unicode/1f3cc-2640.png?v8",
        goose: "unicode/1fabf.png?v8",
        gorilla: "unicode/1f98d.png?v8",
        grapes: "unicode/1f347.png?v8",
        greece: "unicode/1f1ec-1f1f7.png?v8",
        green_apple: "unicode/1f34f.png?v8",
        green_book: "unicode/1f4d7.png?v8",
        green_circle: "unicode/1f7e2.png?v8",
        green_heart: "unicode/1f49a.png?v8",
        green_salad: "unicode/1f957.png?v8",
        green_square: "unicode/1f7e9.png?v8",
        greenland: "unicode/1f1ec-1f1f1.png?v8",
        grenada: "unicode/1f1ec-1f1e9.png?v8",
        grey_exclamation: "unicode/2755.png?v8",
        grey_heart: "unicode/1fa76.png?v8",
        grey_question: "unicode/2754.png?v8",
        grimacing: "unicode/1f62c.png?v8",
        grin: "unicode/1f601.png?v8",
        grinning: "unicode/1f600.png?v8",
        guadeloupe: "unicode/1f1ec-1f1f5.png?v8",
        guam: "unicode/1f1ec-1f1fa.png?v8",
        guard: "unicode/1f482.png?v8",
        guardsman: "unicode/1f482-2642.png?v8",
        guardswoman: "unicode/1f482-2640.png?v8",
        guatemala: "unicode/1f1ec-1f1f9.png?v8",
        guernsey: "unicode/1f1ec-1f1ec.png?v8",
        guide_dog: "unicode/1f9ae.png?v8",
        guinea: "unicode/1f1ec-1f1f3.png?v8",
        guinea_bissau: "unicode/1f1ec-1f1fc.png?v8",
        guitar: "unicode/1f3b8.png?v8",
        gun: "unicode/1f52b.png?v8",
        guyana: "unicode/1f1ec-1f1fe.png?v8",
        hair_pick: "unicode/1faae.png?v8",
        haircut: "unicode/1f487.png?v8",
        haircut_man: "unicode/1f487-2642.png?v8",
        haircut_woman: "unicode/1f487-2640.png?v8",
        haiti: "unicode/1f1ed-1f1f9.png?v8",
        hamburger: "unicode/1f354.png?v8",
        hammer: "unicode/1f528.png?v8",
        hammer_and_pick: "unicode/2692.png?v8",
        hammer_and_wrench: "unicode/1f6e0.png?v8",
        hamsa: "unicode/1faac.png?v8",
        hamster: "unicode/1f439.png?v8",
        hand: "unicode/270b.png?v8",
        hand_over_mouth: "unicode/1f92d.png?v8",
        hand_with_index_finger_and_thumb_crossed: "unicode/1faf0.png?v8",
        handbag: "unicode/1f45c.png?v8",
        handball_person: "unicode/1f93e.png?v8",
        handshake: "unicode/1f91d.png?v8",
        hankey: "unicode/1f4a9.png?v8",
        hash: "unicode/0023-20e3.png?v8",
        hatched_chick: "unicode/1f425.png?v8",
        hatching_chick: "unicode/1f423.png?v8",
        headphones: "unicode/1f3a7.png?v8",
        headstone: "unicode/1faa6.png?v8",
        health_worker: "unicode/1f9d1-2695.png?v8",
        hear_no_evil: "unicode/1f649.png?v8",
        heard_mcdonald_islands: "unicode/1f1ed-1f1f2.png?v8",
        heart: "unicode/2764.png?v8",
        heart_decoration: "unicode/1f49f.png?v8",
        heart_eyes: "unicode/1f60d.png?v8",
        heart_eyes_cat: "unicode/1f63b.png?v8",
        heart_hands: "unicode/1faf6.png?v8",
        heart_on_fire: "unicode/2764-1f525.png?v8",
        heartbeat: "unicode/1f493.png?v8",
        heartpulse: "unicode/1f497.png?v8",
        hearts: "unicode/2665.png?v8",
        heavy_check_mark: "unicode/2714.png?v8",
        heavy_division_sign: "unicode/2797.png?v8",
        heavy_dollar_sign: "unicode/1f4b2.png?v8",
        heavy_equals_sign: "unicode/1f7f0.png?v8",
        heavy_exclamation_mark: "unicode/2757.png?v8",
        heavy_heart_exclamation: "unicode/2763.png?v8",
        heavy_minus_sign: "unicode/2796.png?v8",
        heavy_multiplication_x: "unicode/2716.png?v8",
        heavy_plus_sign: "unicode/2795.png?v8",
        hedgehog: "unicode/1f994.png?v8",
        helicopter: "unicode/1f681.png?v8",
        herb: "unicode/1f33f.png?v8",
        hibiscus: "unicode/1f33a.png?v8",
        high_brightness: "unicode/1f506.png?v8",
        high_heel: "unicode/1f460.png?v8",
        hiking_boot: "unicode/1f97e.png?v8",
        hindu_temple: "unicode/1f6d5.png?v8",
        hippopotamus: "unicode/1f99b.png?v8",
        hocho: "unicode/1f52a.png?v8",
        hole: "unicode/1f573.png?v8",
        honduras: "unicode/1f1ed-1f1f3.png?v8",
        honey_pot: "unicode/1f36f.png?v8",
        honeybee: "unicode/1f41d.png?v8",
        hong_kong: "unicode/1f1ed-1f1f0.png?v8",
        hook: "unicode/1fa9d.png?v8",
        horse: "unicode/1f434.png?v8",
        horse_racing: "unicode/1f3c7.png?v8",
        hospital: "unicode/1f3e5.png?v8",
        hot_face: "unicode/1f975.png?v8",
        hot_pepper: "unicode/1f336.png?v8",
        hotdog: "unicode/1f32d.png?v8",
        hotel: "unicode/1f3e8.png?v8",
        hotsprings: "unicode/2668.png?v8",
        hourglass: "unicode/231b.png?v8",
        hourglass_flowing_sand: "unicode/23f3.png?v8",
        house: "unicode/1f3e0.png?v8",
        house_with_garden: "unicode/1f3e1.png?v8",
        houses: "unicode/1f3d8.png?v8",
        hugs: "unicode/1f917.png?v8",
        hungary: "unicode/1f1ed-1f1fa.png?v8",
        hurtrealbad: "hurtrealbad.png?v8",
        hushed: "unicode/1f62f.png?v8",
        hut: "unicode/1f6d6.png?v8",
        hyacinth: "unicode/1fabb.png?v8",
        ice_cream: "unicode/1f368.png?v8",
        ice_cube: "unicode/1f9ca.png?v8",
        ice_hockey: "unicode/1f3d2.png?v8",
        ice_skate: "unicode/26f8.png?v8",
        icecream: "unicode/1f366.png?v8",
        iceland: "unicode/1f1ee-1f1f8.png?v8",
        id: "unicode/1f194.png?v8",
        identification_card: "unicode/1faaa.png?v8",
        ideograph_advantage: "unicode/1f250.png?v8",
        imp: "unicode/1f47f.png?v8",
        inbox_tray: "unicode/1f4e5.png?v8",
        incoming_envelope: "unicode/1f4e8.png?v8",
        index_pointing_at_the_viewer: "unicode/1faf5.png?v8",
        india: "unicode/1f1ee-1f1f3.png?v8",
        indonesia: "unicode/1f1ee-1f1e9.png?v8",
        infinity: "unicode/267e.png?v8",
        information_desk_person: "unicode/1f481.png?v8",
        information_source: "unicode/2139.png?v8",
        innocent: "unicode/1f607.png?v8",
        interrobang: "unicode/2049.png?v8",
        iphone: "unicode/1f4f1.png?v8",
        iran: "unicode/1f1ee-1f1f7.png?v8",
        iraq: "unicode/1f1ee-1f1f6.png?v8",
        ireland: "unicode/1f1ee-1f1ea.png?v8",
        isle_of_man: "unicode/1f1ee-1f1f2.png?v8",
        israel: "unicode/1f1ee-1f1f1.png?v8",
        it: "unicode/1f1ee-1f1f9.png?v8",
        izakaya_lantern: "unicode/1f3ee.png?v8",
        jack_o_lantern: "unicode/1f383.png?v8",
        jamaica: "unicode/1f1ef-1f1f2.png?v8",
        japan: "unicode/1f5fe.png?v8",
        japanese_castle: "unicode/1f3ef.png?v8",
        japanese_goblin: "unicode/1f47a.png?v8",
        japanese_ogre: "unicode/1f479.png?v8",
        jar: "unicode/1fad9.png?v8",
        jeans: "unicode/1f456.png?v8",
        jellyfish: "unicode/1fabc.png?v8",
        jersey: "unicode/1f1ef-1f1ea.png?v8",
        jigsaw: "unicode/1f9e9.png?v8",
        jordan: "unicode/1f1ef-1f1f4.png?v8",
        joy: "unicode/1f602.png?v8",
        joy_cat: "unicode/1f639.png?v8",
        joystick: "unicode/1f579.png?v8",
        jp: "unicode/1f1ef-1f1f5.png?v8",
        judge: "unicode/1f9d1-2696.png?v8",
        juggling_person: "unicode/1f939.png?v8",
        kaaba: "unicode/1f54b.png?v8",
        kangaroo: "unicode/1f998.png?v8",
        kazakhstan: "unicode/1f1f0-1f1ff.png?v8",
        kenya: "unicode/1f1f0-1f1ea.png?v8",
        key: "unicode/1f511.png?v8",
        keyboard: "unicode/2328.png?v8",
        keycap_ten: "unicode/1f51f.png?v8",
        khanda: "unicode/1faaf.png?v8",
        kick_scooter: "unicode/1f6f4.png?v8",
        kimono: "unicode/1f458.png?v8",
        kiribati: "unicode/1f1f0-1f1ee.png?v8",
        kiss: "unicode/1f48b.png?v8",
        kissing: "unicode/1f617.png?v8",
        kissing_cat: "unicode/1f63d.png?v8",
        kissing_closed_eyes: "unicode/1f61a.png?v8",
        kissing_heart: "unicode/1f618.png?v8",
        kissing_smiling_eyes: "unicode/1f619.png?v8",
        kite: "unicode/1fa81.png?v8",
        kiwi_fruit: "unicode/1f95d.png?v8",
        kneeling_man: "unicode/1f9ce-2642.png?v8",
        kneeling_person: "unicode/1f9ce.png?v8",
        kneeling_woman: "unicode/1f9ce-2640.png?v8",
        knife: "unicode/1f52a.png?v8",
        knot: "unicode/1faa2.png?v8",
        koala: "unicode/1f428.png?v8",
        koko: "unicode/1f201.png?v8",
        kosovo: "unicode/1f1fd-1f1f0.png?v8",
        kr: "unicode/1f1f0-1f1f7.png?v8",
        kuwait: "unicode/1f1f0-1f1fc.png?v8",
        kyrgyzstan: "unicode/1f1f0-1f1ec.png?v8",
        lab_coat: "unicode/1f97c.png?v8",
        label: "unicode/1f3f7.png?v8",
        lacrosse: "unicode/1f94d.png?v8",
        ladder: "unicode/1fa9c.png?v8",
        lady_beetle: "unicode/1f41e.png?v8",
        lantern: "unicode/1f3ee.png?v8",
        laos: "unicode/1f1f1-1f1e6.png?v8",
        large_blue_circle: "unicode/1f535.png?v8",
        large_blue_diamond: "unicode/1f537.png?v8",
        large_orange_diamond: "unicode/1f536.png?v8",
        last_quarter_moon: "unicode/1f317.png?v8",
        last_quarter_moon_with_face: "unicode/1f31c.png?v8",
        latin_cross: "unicode/271d.png?v8",
        latvia: "unicode/1f1f1-1f1fb.png?v8",
        laughing: "unicode/1f606.png?v8",
        leafy_green: "unicode/1f96c.png?v8",
        leaves: "unicode/1f343.png?v8",
        lebanon: "unicode/1f1f1-1f1e7.png?v8",
        ledger: "unicode/1f4d2.png?v8",
        left_luggage: "unicode/1f6c5.png?v8",
        left_right_arrow: "unicode/2194.png?v8",
        left_speech_bubble: "unicode/1f5e8.png?v8",
        leftwards_arrow_with_hook: "unicode/21a9.png?v8",
        leftwards_hand: "unicode/1faf2.png?v8",
        leftwards_pushing_hand: "unicode/1faf7.png?v8",
        leg: "unicode/1f9b5.png?v8",
        lemon: "unicode/1f34b.png?v8",
        leo: "unicode/264c.png?v8",
        leopard: "unicode/1f406.png?v8",
        lesotho: "unicode/1f1f1-1f1f8.png?v8",
        level_slider: "unicode/1f39a.png?v8",
        liberia: "unicode/1f1f1-1f1f7.png?v8",
        libra: "unicode/264e.png?v8",
        libya: "unicode/1f1f1-1f1fe.png?v8",
        liechtenstein: "unicode/1f1f1-1f1ee.png?v8",
        light_blue_heart: "unicode/1fa75.png?v8",
        light_rail: "unicode/1f688.png?v8",
        link: "unicode/1f517.png?v8",
        lion: "unicode/1f981.png?v8",
        lips: "unicode/1f444.png?v8",
        lipstick: "unicode/1f484.png?v8",
        lithuania: "unicode/1f1f1-1f1f9.png?v8",
        lizard: "unicode/1f98e.png?v8",
        llama: "unicode/1f999.png?v8",
        lobster: "unicode/1f99e.png?v8",
        lock: "unicode/1f512.png?v8",
        lock_with_ink_pen: "unicode/1f50f.png?v8",
        lollipop: "unicode/1f36d.png?v8",
        long_drum: "unicode/1fa98.png?v8",
        loop: "unicode/27bf.png?v8",
        lotion_bottle: "unicode/1f9f4.png?v8",
        lotus: "unicode/1fab7.png?v8",
        lotus_position: "unicode/1f9d8.png?v8",
        lotus_position_man: "unicode/1f9d8-2642.png?v8",
        lotus_position_woman: "unicode/1f9d8-2640.png?v8",
        loud_sound: "unicode/1f50a.png?v8",
        loudspeaker: "unicode/1f4e2.png?v8",
        love_hotel: "unicode/1f3e9.png?v8",
        love_letter: "unicode/1f48c.png?v8",
        love_you_gesture: "unicode/1f91f.png?v8",
        low_battery: "unicode/1faab.png?v8",
        low_brightness: "unicode/1f505.png?v8",
        luggage: "unicode/1f9f3.png?v8",
        lungs: "unicode/1fac1.png?v8",
        luxembourg: "unicode/1f1f1-1f1fa.png?v8",
        lying_face: "unicode/1f925.png?v8",
        m: "unicode/24c2.png?v8",
        macau: "unicode/1f1f2-1f1f4.png?v8",
        macedonia: "unicode/1f1f2-1f1f0.png?v8",
        madagascar: "unicode/1f1f2-1f1ec.png?v8",
        mag: "unicode/1f50d.png?v8",
        mag_right: "unicode/1f50e.png?v8",
        mage: "unicode/1f9d9.png?v8",
        mage_man: "unicode/1f9d9-2642.png?v8",
        mage_woman: "unicode/1f9d9-2640.png?v8",
        magic_wand: "unicode/1fa84.png?v8",
        magnet: "unicode/1f9f2.png?v8",
        mahjong: "unicode/1f004.png?v8",
        mailbox: "unicode/1f4eb.png?v8",
        mailbox_closed: "unicode/1f4ea.png?v8",
        mailbox_with_mail: "unicode/1f4ec.png?v8",
        mailbox_with_no_mail: "unicode/1f4ed.png?v8",
        malawi: "unicode/1f1f2-1f1fc.png?v8",
        malaysia: "unicode/1f1f2-1f1fe.png?v8",
        maldives: "unicode/1f1f2-1f1fb.png?v8",
        male_detective: "unicode/1f575-2642.png?v8",
        male_sign: "unicode/2642.png?v8",
        mali: "unicode/1f1f2-1f1f1.png?v8",
        malta: "unicode/1f1f2-1f1f9.png?v8",
        mammoth: "unicode/1f9a3.png?v8",
        man: "unicode/1f468.png?v8",
        man_artist: "unicode/1f468-1f3a8.png?v8",
        man_astronaut: "unicode/1f468-1f680.png?v8",
        man_beard: "unicode/1f9d4-2642.png?v8",
        man_cartwheeling: "unicode/1f938-2642.png?v8",
        man_cook: "unicode/1f468-1f373.png?v8",
        man_dancing: "unicode/1f57a.png?v8",
        man_facepalming: "unicode/1f926-2642.png?v8",
        man_factory_worker: "unicode/1f468-1f3ed.png?v8",
        man_farmer: "unicode/1f468-1f33e.png?v8",
        man_feeding_baby: "unicode/1f468-1f37c.png?v8",
        man_firefighter: "unicode/1f468-1f692.png?v8",
        man_health_worker: "unicode/1f468-2695.png?v8",
        man_in_manual_wheelchair: "unicode/1f468-1f9bd.png?v8",
        man_in_motorized_wheelchair: "unicode/1f468-1f9bc.png?v8",
        man_in_tuxedo: "unicode/1f935-2642.png?v8",
        man_judge: "unicode/1f468-2696.png?v8",
        man_juggling: "unicode/1f939-2642.png?v8",
        man_mechanic: "unicode/1f468-1f527.png?v8",
        man_office_worker: "unicode/1f468-1f4bc.png?v8",
        man_pilot: "unicode/1f468-2708.png?v8",
        man_playing_handball: "unicode/1f93e-2642.png?v8",
        man_playing_water_polo: "unicode/1f93d-2642.png?v8",
        man_scientist: "unicode/1f468-1f52c.png?v8",
        man_shrugging: "unicode/1f937-2642.png?v8",
        man_singer: "unicode/1f468-1f3a4.png?v8",
        man_student: "unicode/1f468-1f393.png?v8",
        man_teacher: "unicode/1f468-1f3eb.png?v8",
        man_technologist: "unicode/1f468-1f4bb.png?v8",
        man_with_gua_pi_mao: "unicode/1f472.png?v8",
        man_with_probing_cane: "unicode/1f468-1f9af.png?v8",
        man_with_turban: "unicode/1f473-2642.png?v8",
        man_with_veil: "unicode/1f470-2642.png?v8",
        mandarin: "unicode/1f34a.png?v8",
        mango: "unicode/1f96d.png?v8",
        mans_shoe: "unicode/1f45e.png?v8",
        mantelpiece_clock: "unicode/1f570.png?v8",
        manual_wheelchair: "unicode/1f9bd.png?v8",
        maple_leaf: "unicode/1f341.png?v8",
        maracas: "unicode/1fa87.png?v8",
        marshall_islands: "unicode/1f1f2-1f1ed.png?v8",
        martial_arts_uniform: "unicode/1f94b.png?v8",
        martinique: "unicode/1f1f2-1f1f6.png?v8",
        mask: "unicode/1f637.png?v8",
        massage: "unicode/1f486.png?v8",
        massage_man: "unicode/1f486-2642.png?v8",
        massage_woman: "unicode/1f486-2640.png?v8",
        mate: "unicode/1f9c9.png?v8",
        mauritania: "unicode/1f1f2-1f1f7.png?v8",
        mauritius: "unicode/1f1f2-1f1fa.png?v8",
        mayotte: "unicode/1f1fe-1f1f9.png?v8",
        meat_on_bone: "unicode/1f356.png?v8",
        mechanic: "unicode/1f9d1-1f527.png?v8",
        mechanical_arm: "unicode/1f9be.png?v8",
        mechanical_leg: "unicode/1f9bf.png?v8",
        medal_military: "unicode/1f396.png?v8",
        medal_sports: "unicode/1f3c5.png?v8",
        medical_symbol: "unicode/2695.png?v8",
        mega: "unicode/1f4e3.png?v8",
        melon: "unicode/1f348.png?v8",
        melting_face: "unicode/1fae0.png?v8",
        memo: "unicode/1f4dd.png?v8",
        men_wrestling: "unicode/1f93c-2642.png?v8",
        mending_heart: "unicode/2764-1fa79.png?v8",
        menorah: "unicode/1f54e.png?v8",
        mens: "unicode/1f6b9.png?v8",
        mermaid: "unicode/1f9dc-2640.png?v8",
        merman: "unicode/1f9dc-2642.png?v8",
        merperson: "unicode/1f9dc.png?v8",
        metal: "unicode/1f918.png?v8",
        metro: "unicode/1f687.png?v8",
        mexico: "unicode/1f1f2-1f1fd.png?v8",
        microbe: "unicode/1f9a0.png?v8",
        micronesia: "unicode/1f1eb-1f1f2.png?v8",
        microphone: "unicode/1f3a4.png?v8",
        microscope: "unicode/1f52c.png?v8",
        middle_finger: "unicode/1f595.png?v8",
        military_helmet: "unicode/1fa96.png?v8",
        milk_glass: "unicode/1f95b.png?v8",
        milky_way: "unicode/1f30c.png?v8",
        minibus: "unicode/1f690.png?v8",
        minidisc: "unicode/1f4bd.png?v8",
        mirror: "unicode/1fa9e.png?v8",
        mirror_ball: "unicode/1faa9.png?v8",
        mobile_phone_off: "unicode/1f4f4.png?v8",
        moldova: "unicode/1f1f2-1f1e9.png?v8",
        monaco: "unicode/1f1f2-1f1e8.png?v8",
        money_mouth_face: "unicode/1f911.png?v8",
        money_with_wings: "unicode/1f4b8.png?v8",
        moneybag: "unicode/1f4b0.png?v8",
        mongolia: "unicode/1f1f2-1f1f3.png?v8",
        monkey: "unicode/1f412.png?v8",
        monkey_face: "unicode/1f435.png?v8",
        monocle_face: "unicode/1f9d0.png?v8",
        monorail: "unicode/1f69d.png?v8",
        montenegro: "unicode/1f1f2-1f1ea.png?v8",
        montserrat: "unicode/1f1f2-1f1f8.png?v8",
        moon: "unicode/1f314.png?v8",
        moon_cake: "unicode/1f96e.png?v8",
        moose: "unicode/1face.png?v8",
        morocco: "unicode/1f1f2-1f1e6.png?v8",
        mortar_board: "unicode/1f393.png?v8",
        mosque: "unicode/1f54c.png?v8",
        mosquito: "unicode/1f99f.png?v8",
        motor_boat: "unicode/1f6e5.png?v8",
        motor_scooter: "unicode/1f6f5.png?v8",
        motorcycle: "unicode/1f3cd.png?v8",
        motorized_wheelchair: "unicode/1f9bc.png?v8",
        motorway: "unicode/1f6e3.png?v8",
        mount_fuji: "unicode/1f5fb.png?v8",
        mountain: "unicode/26f0.png?v8",
        mountain_bicyclist: "unicode/1f6b5.png?v8",
        mountain_biking_man: "unicode/1f6b5-2642.png?v8",
        mountain_biking_woman: "unicode/1f6b5-2640.png?v8",
        mountain_cableway: "unicode/1f6a0.png?v8",
        mountain_railway: "unicode/1f69e.png?v8",
        mountain_snow: "unicode/1f3d4.png?v8",
        mouse: "unicode/1f42d.png?v8",
        mouse2: "unicode/1f401.png?v8",
        mouse_trap: "unicode/1faa4.png?v8",
        movie_camera: "unicode/1f3a5.png?v8",
        moyai: "unicode/1f5ff.png?v8",
        mozambique: "unicode/1f1f2-1f1ff.png?v8",
        mrs_claus: "unicode/1f936.png?v8",
        muscle: "unicode/1f4aa.png?v8",
        mushroom: "unicode/1f344.png?v8",
        musical_keyboard: "unicode/1f3b9.png?v8",
        musical_note: "unicode/1f3b5.png?v8",
        musical_score: "unicode/1f3bc.png?v8",
        mute: "unicode/1f507.png?v8",
        mx_claus: "unicode/1f9d1-1f384.png?v8",
        myanmar: "unicode/1f1f2-1f1f2.png?v8",
        nail_care: "unicode/1f485.png?v8",
        name_badge: "unicode/1f4db.png?v8",
        namibia: "unicode/1f1f3-1f1e6.png?v8",
        national_park: "unicode/1f3de.png?v8",
        nauru: "unicode/1f1f3-1f1f7.png?v8",
        nauseated_face: "unicode/1f922.png?v8",
        nazar_amulet: "unicode/1f9ff.png?v8",
        neckbeard: "neckbeard.png?v8",
        necktie: "unicode/1f454.png?v8",
        negative_squared_cross_mark: "unicode/274e.png?v8",
        nepal: "unicode/1f1f3-1f1f5.png?v8",
        nerd_face: "unicode/1f913.png?v8",
        nest_with_eggs: "unicode/1faba.png?v8",
        nesting_dolls: "unicode/1fa86.png?v8",
        netherlands: "unicode/1f1f3-1f1f1.png?v8",
        neutral_face: "unicode/1f610.png?v8",
        new: "unicode/1f195.png?v8",
        new_caledonia: "unicode/1f1f3-1f1e8.png?v8",
        new_moon: "unicode/1f311.png?v8",
        new_moon_with_face: "unicode/1f31a.png?v8",
        new_zealand: "unicode/1f1f3-1f1ff.png?v8",
        newspaper: "unicode/1f4f0.png?v8",
        newspaper_roll: "unicode/1f5de.png?v8",
        next_track_button: "unicode/23ed.png?v8",
        ng: "unicode/1f196.png?v8",
        ng_man: "unicode/1f645-2642.png?v8",
        ng_woman: "unicode/1f645-2640.png?v8",
        nicaragua: "unicode/1f1f3-1f1ee.png?v8",
        niger: "unicode/1f1f3-1f1ea.png?v8",
        nigeria: "unicode/1f1f3-1f1ec.png?v8",
        night_with_stars: "unicode/1f303.png?v8",
        nine: "unicode/0039-20e3.png?v8",
        ninja: "unicode/1f977.png?v8",
        niue: "unicode/1f1f3-1f1fa.png?v8",
        no_bell: "unicode/1f515.png?v8",
        no_bicycles: "unicode/1f6b3.png?v8",
        no_entry: "unicode/26d4.png?v8",
        no_entry_sign: "unicode/1f6ab.png?v8",
        no_good: "unicode/1f645.png?v8",
        no_good_man: "unicode/1f645-2642.png?v8",
        no_good_woman: "unicode/1f645-2640.png?v8",
        no_mobile_phones: "unicode/1f4f5.png?v8",
        no_mouth: "unicode/1f636.png?v8",
        no_pedestrians: "unicode/1f6b7.png?v8",
        no_smoking: "unicode/1f6ad.png?v8",
        "non-potable_water": "unicode/1f6b1.png?v8",
        norfolk_island: "unicode/1f1f3-1f1eb.png?v8",
        north_korea: "unicode/1f1f0-1f1f5.png?v8",
        northern_mariana_islands: "unicode/1f1f2-1f1f5.png?v8",
        norway: "unicode/1f1f3-1f1f4.png?v8",
        nose: "unicode/1f443.png?v8",
        notebook: "unicode/1f4d3.png?v8",
        notebook_with_decorative_cover: "unicode/1f4d4.png?v8",
        notes: "unicode/1f3b6.png?v8",
        nut_and_bolt: "unicode/1f529.png?v8",
        o: "unicode/2b55.png?v8",
        o2: "unicode/1f17e.png?v8",
        ocean: "unicode/1f30a.png?v8",
        octocat: "octocat.png?v8",
        octopus: "unicode/1f419.png?v8",
        oden: "unicode/1f362.png?v8",
        office: "unicode/1f3e2.png?v8",
        office_worker: "unicode/1f9d1-1f4bc.png?v8",
        oil_drum: "unicode/1f6e2.png?v8",
        ok: "unicode/1f197.png?v8",
        ok_hand: "unicode/1f44c.png?v8",
        ok_man: "unicode/1f646-2642.png?v8",
        ok_person: "unicode/1f646.png?v8",
        ok_woman: "unicode/1f646-2640.png?v8",
        old_key: "unicode/1f5dd.png?v8",
        older_adult: "unicode/1f9d3.png?v8",
        older_man: "unicode/1f474.png?v8",
        older_woman: "unicode/1f475.png?v8",
        olive: "unicode/1fad2.png?v8",
        om: "unicode/1f549.png?v8",
        oman: "unicode/1f1f4-1f1f2.png?v8",
        on: "unicode/1f51b.png?v8",
        oncoming_automobile: "unicode/1f698.png?v8",
        oncoming_bus: "unicode/1f68d.png?v8",
        oncoming_police_car: "unicode/1f694.png?v8",
        oncoming_taxi: "unicode/1f696.png?v8",
        one: "unicode/0031-20e3.png?v8",
        one_piece_swimsuit: "unicode/1fa71.png?v8",
        onion: "unicode/1f9c5.png?v8",
        open_book: "unicode/1f4d6.png?v8",
        open_file_folder: "unicode/1f4c2.png?v8",
        open_hands: "unicode/1f450.png?v8",
        open_mouth: "unicode/1f62e.png?v8",
        open_umbrella: "unicode/2602.png?v8",
        ophiuchus: "unicode/26ce.png?v8",
        orange: "unicode/1f34a.png?v8",
        orange_book: "unicode/1f4d9.png?v8",
        orange_circle: "unicode/1f7e0.png?v8",
        orange_heart: "unicode/1f9e1.png?v8",
        orange_square: "unicode/1f7e7.png?v8",
        orangutan: "unicode/1f9a7.png?v8",
        orthodox_cross: "unicode/2626.png?v8",
        otter: "unicode/1f9a6.png?v8",
        outbox_tray: "unicode/1f4e4.png?v8",
        owl: "unicode/1f989.png?v8",
        ox: "unicode/1f402.png?v8",
        oyster: "unicode/1f9aa.png?v8",
        package: "unicode/1f4e6.png?v8",
        page_facing_up: "unicode/1f4c4.png?v8",
        page_with_curl: "unicode/1f4c3.png?v8",
        pager: "unicode/1f4df.png?v8",
        paintbrush: "unicode/1f58c.png?v8",
        pakistan: "unicode/1f1f5-1f1f0.png?v8",
        palau: "unicode/1f1f5-1f1fc.png?v8",
        palestinian_territories: "unicode/1f1f5-1f1f8.png?v8",
        palm_down_hand: "unicode/1faf3.png?v8",
        palm_tree: "unicode/1f334.png?v8",
        palm_up_hand: "unicode/1faf4.png?v8",
        palms_up_together: "unicode/1f932.png?v8",
        panama: "unicode/1f1f5-1f1e6.png?v8",
        pancakes: "unicode/1f95e.png?v8",
        panda_face: "unicode/1f43c.png?v8",
        paperclip: "unicode/1f4ce.png?v8",
        paperclips: "unicode/1f587.png?v8",
        papua_new_guinea: "unicode/1f1f5-1f1ec.png?v8",
        parachute: "unicode/1fa82.png?v8",
        paraguay: "unicode/1f1f5-1f1fe.png?v8",
        parasol_on_ground: "unicode/26f1.png?v8",
        parking: "unicode/1f17f.png?v8",
        parrot: "unicode/1f99c.png?v8",
        part_alternation_mark: "unicode/303d.png?v8",
        partly_sunny: "unicode/26c5.png?v8",
        partying_face: "unicode/1f973.png?v8",
        passenger_ship: "unicode/1f6f3.png?v8",
        passport_control: "unicode/1f6c2.png?v8",
        pause_button: "unicode/23f8.png?v8",
        paw_prints: "unicode/1f43e.png?v8",
        pea_pod: "unicode/1fadb.png?v8",
        peace_symbol: "unicode/262e.png?v8",
        peach: "unicode/1f351.png?v8",
        peacock: "unicode/1f99a.png?v8",
        peanuts: "unicode/1f95c.png?v8",
        pear: "unicode/1f350.png?v8",
        pen: "unicode/1f58a.png?v8",
        pencil: "unicode/1f4dd.png?v8",
        pencil2: "unicode/270f.png?v8",
        penguin: "unicode/1f427.png?v8",
        pensive: "unicode/1f614.png?v8",
        people_holding_hands: "unicode/1f9d1-1f91d-1f9d1.png?v8",
        people_hugging: "unicode/1fac2.png?v8",
        performing_arts: "unicode/1f3ad.png?v8",
        persevere: "unicode/1f623.png?v8",
        person_bald: "unicode/1f9d1-1f9b2.png?v8",
        person_curly_hair: "unicode/1f9d1-1f9b1.png?v8",
        person_feeding_baby: "unicode/1f9d1-1f37c.png?v8",
        person_fencing: "unicode/1f93a.png?v8",
        person_in_manual_wheelchair: "unicode/1f9d1-1f9bd.png?v8",
        person_in_motorized_wheelchair: "unicode/1f9d1-1f9bc.png?v8",
        person_in_tuxedo: "unicode/1f935.png?v8",
        person_red_hair: "unicode/1f9d1-1f9b0.png?v8",
        person_white_hair: "unicode/1f9d1-1f9b3.png?v8",
        person_with_crown: "unicode/1fac5.png?v8",
        person_with_probing_cane: "unicode/1f9d1-1f9af.png?v8",
        person_with_turban: "unicode/1f473.png?v8",
        person_with_veil: "unicode/1f470.png?v8",
        peru: "unicode/1f1f5-1f1ea.png?v8",
        petri_dish: "unicode/1f9eb.png?v8",
        philippines: "unicode/1f1f5-1f1ed.png?v8",
        phone: "unicode/260e.png?v8",
        pick: "unicode/26cf.png?v8",
        pickup_truck: "unicode/1f6fb.png?v8",
        pie: "unicode/1f967.png?v8",
        pig: "unicode/1f437.png?v8",
        pig2: "unicode/1f416.png?v8",
        pig_nose: "unicode/1f43d.png?v8",
        pill: "unicode/1f48a.png?v8",
        pilot: "unicode/1f9d1-2708.png?v8",
        pinata: "unicode/1fa85.png?v8",
        pinched_fingers: "unicode/1f90c.png?v8",
        pinching_hand: "unicode/1f90f.png?v8",
        pineapple: "unicode/1f34d.png?v8",
        ping_pong: "unicode/1f3d3.png?v8",
        pink_heart: "unicode/1fa77.png?v8",
        pirate_flag: "unicode/1f3f4-2620.png?v8",
        pisces: "unicode/2653.png?v8",
        pitcairn_islands: "unicode/1f1f5-1f1f3.png?v8",
        pizza: "unicode/1f355.png?v8",
        placard: "unicode/1faa7.png?v8",
        place_of_worship: "unicode/1f6d0.png?v8",
        plate_with_cutlery: "unicode/1f37d.png?v8",
        play_or_pause_button: "unicode/23ef.png?v8",
        playground_slide: "unicode/1f6dd.png?v8",
        pleading_face: "unicode/1f97a.png?v8",
        plunger: "unicode/1faa0.png?v8",
        point_down: "unicode/1f447.png?v8",
        point_left: "unicode/1f448.png?v8",
        point_right: "unicode/1f449.png?v8",
        point_up: "unicode/261d.png?v8",
        point_up_2: "unicode/1f446.png?v8",
        poland: "unicode/1f1f5-1f1f1.png?v8",
        polar_bear: "unicode/1f43b-2744.png?v8",
        police_car: "unicode/1f693.png?v8",
        police_officer: "unicode/1f46e.png?v8",
        policeman: "unicode/1f46e-2642.png?v8",
        policewoman: "unicode/1f46e-2640.png?v8",
        poodle: "unicode/1f429.png?v8",
        poop: "unicode/1f4a9.png?v8",
        popcorn: "unicode/1f37f.png?v8",
        portugal: "unicode/1f1f5-1f1f9.png?v8",
        post_office: "unicode/1f3e3.png?v8",
        postal_horn: "unicode/1f4ef.png?v8",
        postbox: "unicode/1f4ee.png?v8",
        potable_water: "unicode/1f6b0.png?v8",
        potato: "unicode/1f954.png?v8",
        potted_plant: "unicode/1fab4.png?v8",
        pouch: "unicode/1f45d.png?v8",
        poultry_leg: "unicode/1f357.png?v8",
        pound: "unicode/1f4b7.png?v8",
        pouring_liquid: "unicode/1fad7.png?v8",
        pout: "unicode/1f621.png?v8",
        pouting_cat: "unicode/1f63e.png?v8",
        pouting_face: "unicode/1f64e.png?v8",
        pouting_man: "unicode/1f64e-2642.png?v8",
        pouting_woman: "unicode/1f64e-2640.png?v8",
        pray: "unicode/1f64f.png?v8",
        prayer_beads: "unicode/1f4ff.png?v8",
        pregnant_man: "unicode/1fac3.png?v8",
        pregnant_person: "unicode/1fac4.png?v8",
        pregnant_woman: "unicode/1f930.png?v8",
        pretzel: "unicode/1f968.png?v8",
        previous_track_button: "unicode/23ee.png?v8",
        prince: "unicode/1f934.png?v8",
        princess: "unicode/1f478.png?v8",
        printer: "unicode/1f5a8.png?v8",
        probing_cane: "unicode/1f9af.png?v8",
        puerto_rico: "unicode/1f1f5-1f1f7.png?v8",
        punch: "unicode/1f44a.png?v8",
        purple_circle: "unicode/1f7e3.png?v8",
        purple_heart: "unicode/1f49c.png?v8",
        purple_square: "unicode/1f7ea.png?v8",
        purse: "unicode/1f45b.png?v8",
        pushpin: "unicode/1f4cc.png?v8",
        put_litter_in_its_place: "unicode/1f6ae.png?v8",
        qatar: "unicode/1f1f6-1f1e6.png?v8",
        question: "unicode/2753.png?v8",
        rabbit: "unicode/1f430.png?v8",
        rabbit2: "unicode/1f407.png?v8",
        raccoon: "unicode/1f99d.png?v8",
        racehorse: "unicode/1f40e.png?v8",
        racing_car: "unicode/1f3ce.png?v8",
        radio: "unicode/1f4fb.png?v8",
        radio_button: "unicode/1f518.png?v8",
        radioactive: "unicode/2622.png?v8",
        rage: "unicode/1f621.png?v8",
        rage1: "rage1.png?v8",
        rage2: "rage2.png?v8",
        rage3: "rage3.png?v8",
        rage4: "rage4.png?v8",
        railway_car: "unicode/1f683.png?v8",
        railway_track: "unicode/1f6e4.png?v8",
        rainbow: "unicode/1f308.png?v8",
        rainbow_flag: "unicode/1f3f3-1f308.png?v8",
        raised_back_of_hand: "unicode/1f91a.png?v8",
        raised_eyebrow: "unicode/1f928.png?v8",
        raised_hand: "unicode/270b.png?v8",
        raised_hand_with_fingers_splayed: "unicode/1f590.png?v8",
        raised_hands: "unicode/1f64c.png?v8",
        raising_hand: "unicode/1f64b.png?v8",
        raising_hand_man: "unicode/1f64b-2642.png?v8",
        raising_hand_woman: "unicode/1f64b-2640.png?v8",
        ram: "unicode/1f40f.png?v8",
        ramen: "unicode/1f35c.png?v8",
        rat: "unicode/1f400.png?v8",
        razor: "unicode/1fa92.png?v8",
        receipt: "unicode/1f9fe.png?v8",
        record_button: "unicode/23fa.png?v8",
        recycle: "unicode/267b.png?v8",
        red_car: "unicode/1f697.png?v8",
        red_circle: "unicode/1f534.png?v8",
        red_envelope: "unicode/1f9e7.png?v8",
        red_haired_man: "unicode/1f468-1f9b0.png?v8",
        red_haired_woman: "unicode/1f469-1f9b0.png?v8",
        red_square: "unicode/1f7e5.png?v8",
        registered: "unicode/00ae.png?v8",
        relaxed: "unicode/263a.png?v8",
        relieved: "unicode/1f60c.png?v8",
        reminder_ribbon: "unicode/1f397.png?v8",
        repeat: "unicode/1f501.png?v8",
        repeat_one: "unicode/1f502.png?v8",
        rescue_worker_helmet: "unicode/26d1.png?v8",
        restroom: "unicode/1f6bb.png?v8",
        reunion: "unicode/1f1f7-1f1ea.png?v8",
        revolving_hearts: "unicode/1f49e.png?v8",
        rewind: "unicode/23ea.png?v8",
        rhinoceros: "unicode/1f98f.png?v8",
        ribbon: "unicode/1f380.png?v8",
        rice: "unicode/1f35a.png?v8",
        rice_ball: "unicode/1f359.png?v8",
        rice_cracker: "unicode/1f358.png?v8",
        rice_scene: "unicode/1f391.png?v8",
        right_anger_bubble: "unicode/1f5ef.png?v8",
        rightwards_hand: "unicode/1faf1.png?v8",
        rightwards_pushing_hand: "unicode/1faf8.png?v8",
        ring: "unicode/1f48d.png?v8",
        ring_buoy: "unicode/1f6df.png?v8",
        ringed_planet: "unicode/1fa90.png?v8",
        robot: "unicode/1f916.png?v8",
        rock: "unicode/1faa8.png?v8",
        rocket: "unicode/1f680.png?v8",
        rofl: "unicode/1f923.png?v8",
        roll_eyes: "unicode/1f644.png?v8",
        roll_of_paper: "unicode/1f9fb.png?v8",
        roller_coaster: "unicode/1f3a2.png?v8",
        roller_skate: "unicode/1f6fc.png?v8",
        romania: "unicode/1f1f7-1f1f4.png?v8",
        rooster: "unicode/1f413.png?v8",
        rose: "unicode/1f339.png?v8",
        rosette: "unicode/1f3f5.png?v8",
        rotating_light: "unicode/1f6a8.png?v8",
        round_pushpin: "unicode/1f4cd.png?v8",
        rowboat: "unicode/1f6a3.png?v8",
        rowing_man: "unicode/1f6a3-2642.png?v8",
        rowing_woman: "unicode/1f6a3-2640.png?v8",
        ru: "unicode/1f1f7-1f1fa.png?v8",
        rugby_football: "unicode/1f3c9.png?v8",
        runner: "unicode/1f3c3.png?v8",
        running: "unicode/1f3c3.png?v8",
        running_man: "unicode/1f3c3-2642.png?v8",
        running_shirt_with_sash: "unicode/1f3bd.png?v8",
        running_woman: "unicode/1f3c3-2640.png?v8",
        rwanda: "unicode/1f1f7-1f1fc.png?v8",
        sa: "unicode/1f202.png?v8",
        safety_pin: "unicode/1f9f7.png?v8",
        safety_vest: "unicode/1f9ba.png?v8",
        sagittarius: "unicode/2650.png?v8",
        sailboat: "unicode/26f5.png?v8",
        sake: "unicode/1f376.png?v8",
        salt: "unicode/1f9c2.png?v8",
        saluting_face: "unicode/1fae1.png?v8",
        samoa: "unicode/1f1fc-1f1f8.png?v8",
        san_marino: "unicode/1f1f8-1f1f2.png?v8",
        sandal: "unicode/1f461.png?v8",
        sandwich: "unicode/1f96a.png?v8",
        santa: "unicode/1f385.png?v8",
        sao_tome_principe: "unicode/1f1f8-1f1f9.png?v8",
        sari: "unicode/1f97b.png?v8",
        sassy_man: "unicode/1f481-2642.png?v8",
        sassy_woman: "unicode/1f481-2640.png?v8",
        satellite: "unicode/1f4e1.png?v8",
        satisfied: "unicode/1f606.png?v8",
        saudi_arabia: "unicode/1f1f8-1f1e6.png?v8",
        sauna_man: "unicode/1f9d6-2642.png?v8",
        sauna_person: "unicode/1f9d6.png?v8",
        sauna_woman: "unicode/1f9d6-2640.png?v8",
        sauropod: "unicode/1f995.png?v8",
        saxophone: "unicode/1f3b7.png?v8",
        scarf: "unicode/1f9e3.png?v8",
        school: "unicode/1f3eb.png?v8",
        school_satchel: "unicode/1f392.png?v8",
        scientist: "unicode/1f9d1-1f52c.png?v8",
        scissors: "unicode/2702.png?v8",
        scorpion: "unicode/1f982.png?v8",
        scorpius: "unicode/264f.png?v8",
        scotland: "unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8",
        scream: "unicode/1f631.png?v8",
        scream_cat: "unicode/1f640.png?v8",
        screwdriver: "unicode/1fa9b.png?v8",
        scroll: "unicode/1f4dc.png?v8",
        seal: "unicode/1f9ad.png?v8",
        seat: "unicode/1f4ba.png?v8",
        secret: "unicode/3299.png?v8",
        see_no_evil: "unicode/1f648.png?v8",
        seedling: "unicode/1f331.png?v8",
        selfie: "unicode/1f933.png?v8",
        senegal: "unicode/1f1f8-1f1f3.png?v8",
        serbia: "unicode/1f1f7-1f1f8.png?v8",
        service_dog: "unicode/1f415-1f9ba.png?v8",
        seven: "unicode/0037-20e3.png?v8",
        sewing_needle: "unicode/1faa1.png?v8",
        seychelles: "unicode/1f1f8-1f1e8.png?v8",
        shaking_face: "unicode/1fae8.png?v8",
        shallow_pan_of_food: "unicode/1f958.png?v8",
        shamrock: "unicode/2618.png?v8",
        shark: "unicode/1f988.png?v8",
        shaved_ice: "unicode/1f367.png?v8",
        sheep: "unicode/1f411.png?v8",
        shell: "unicode/1f41a.png?v8",
        shield: "unicode/1f6e1.png?v8",
        shinto_shrine: "unicode/26e9.png?v8",
        ship: "unicode/1f6a2.png?v8",
        shipit: "shipit.png?v8",
        shirt: "unicode/1f455.png?v8",
        shit: "unicode/1f4a9.png?v8",
        shoe: "unicode/1f45e.png?v8",
        shopping: "unicode/1f6cd.png?v8",
        shopping_cart: "unicode/1f6d2.png?v8",
        shorts: "unicode/1fa73.png?v8",
        shower: "unicode/1f6bf.png?v8",
        shrimp: "unicode/1f990.png?v8",
        shrug: "unicode/1f937.png?v8",
        shushing_face: "unicode/1f92b.png?v8",
        sierra_leone: "unicode/1f1f8-1f1f1.png?v8",
        signal_strength: "unicode/1f4f6.png?v8",
        singapore: "unicode/1f1f8-1f1ec.png?v8",
        singer: "unicode/1f9d1-1f3a4.png?v8",
        sint_maarten: "unicode/1f1f8-1f1fd.png?v8",
        six: "unicode/0036-20e3.png?v8",
        six_pointed_star: "unicode/1f52f.png?v8",
        skateboard: "unicode/1f6f9.png?v8",
        ski: "unicode/1f3bf.png?v8",
        skier: "unicode/26f7.png?v8",
        skull: "unicode/1f480.png?v8",
        skull_and_crossbones: "unicode/2620.png?v8",
        skunk: "unicode/1f9a8.png?v8",
        sled: "unicode/1f6f7.png?v8",
        sleeping: "unicode/1f634.png?v8",
        sleeping_bed: "unicode/1f6cc.png?v8",
        sleepy: "unicode/1f62a.png?v8",
        slightly_frowning_face: "unicode/1f641.png?v8",
        slightly_smiling_face: "unicode/1f642.png?v8",
        slot_machine: "unicode/1f3b0.png?v8",
        sloth: "unicode/1f9a5.png?v8",
        slovakia: "unicode/1f1f8-1f1f0.png?v8",
        slovenia: "unicode/1f1f8-1f1ee.png?v8",
        small_airplane: "unicode/1f6e9.png?v8",
        small_blue_diamond: "unicode/1f539.png?v8",
        small_orange_diamond: "unicode/1f538.png?v8",
        small_red_triangle: "unicode/1f53a.png?v8",
        small_red_triangle_down: "unicode/1f53b.png?v8",
        smile: "unicode/1f604.png?v8",
        smile_cat: "unicode/1f638.png?v8",
        smiley: "unicode/1f603.png?v8",
        smiley_cat: "unicode/1f63a.png?v8",
        smiling_face_with_tear: "unicode/1f972.png?v8",
        smiling_face_with_three_hearts: "unicode/1f970.png?v8",
        smiling_imp: "unicode/1f608.png?v8",
        smirk: "unicode/1f60f.png?v8",
        smirk_cat: "unicode/1f63c.png?v8",
        smoking: "unicode/1f6ac.png?v8",
        snail: "unicode/1f40c.png?v8",
        snake: "unicode/1f40d.png?v8",
        sneezing_face: "unicode/1f927.png?v8",
        snowboarder: "unicode/1f3c2.png?v8",
        snowflake: "unicode/2744.png?v8",
        snowman: "unicode/26c4.png?v8",
        snowman_with_snow: "unicode/2603.png?v8",
        soap: "unicode/1f9fc.png?v8",
        sob: "unicode/1f62d.png?v8",
        soccer: "unicode/26bd.png?v8",
        socks: "unicode/1f9e6.png?v8",
        softball: "unicode/1f94e.png?v8",
        solomon_islands: "unicode/1f1f8-1f1e7.png?v8",
        somalia: "unicode/1f1f8-1f1f4.png?v8",
        soon: "unicode/1f51c.png?v8",
        sos: "unicode/1f198.png?v8",
        sound: "unicode/1f509.png?v8",
        south_africa: "unicode/1f1ff-1f1e6.png?v8",
        south_georgia_south_sandwich_islands: "unicode/1f1ec-1f1f8.png?v8",
        south_sudan: "unicode/1f1f8-1f1f8.png?v8",
        space_invader: "unicode/1f47e.png?v8",
        spades: "unicode/2660.png?v8",
        spaghetti: "unicode/1f35d.png?v8",
        sparkle: "unicode/2747.png?v8",
        sparkler: "unicode/1f387.png?v8",
        sparkles: "unicode/2728.png?v8",
        sparkling_heart: "unicode/1f496.png?v8",
        speak_no_evil: "unicode/1f64a.png?v8",
        speaker: "unicode/1f508.png?v8",
        speaking_head: "unicode/1f5e3.png?v8",
        speech_balloon: "unicode/1f4ac.png?v8",
        speedboat: "unicode/1f6a4.png?v8",
        spider: "unicode/1f577.png?v8",
        spider_web: "unicode/1f578.png?v8",
        spiral_calendar: "unicode/1f5d3.png?v8",
        spiral_notepad: "unicode/1f5d2.png?v8",
        sponge: "unicode/1f9fd.png?v8",
        spoon: "unicode/1f944.png?v8",
        squid: "unicode/1f991.png?v8",
        sri_lanka: "unicode/1f1f1-1f1f0.png?v8",
        st_barthelemy: "unicode/1f1e7-1f1f1.png?v8",
        st_helena: "unicode/1f1f8-1f1ed.png?v8",
        st_kitts_nevis: "unicode/1f1f0-1f1f3.png?v8",
        st_lucia: "unicode/1f1f1-1f1e8.png?v8",
        st_martin: "unicode/1f1f2-1f1eb.png?v8",
        st_pierre_miquelon: "unicode/1f1f5-1f1f2.png?v8",
        st_vincent_grenadines: "unicode/1f1fb-1f1e8.png?v8",
        stadium: "unicode/1f3df.png?v8",
        standing_man: "unicode/1f9cd-2642.png?v8",
        standing_person: "unicode/1f9cd.png?v8",
        standing_woman: "unicode/1f9cd-2640.png?v8",
        star: "unicode/2b50.png?v8",
        star2: "unicode/1f31f.png?v8",
        star_and_crescent: "unicode/262a.png?v8",
        star_of_david: "unicode/2721.png?v8",
        star_struck: "unicode/1f929.png?v8",
        stars: "unicode/1f320.png?v8",
        station: "unicode/1f689.png?v8",
        statue_of_liberty: "unicode/1f5fd.png?v8",
        steam_locomotive: "unicode/1f682.png?v8",
        stethoscope: "unicode/1fa7a.png?v8",
        stew: "unicode/1f372.png?v8",
        stop_button: "unicode/23f9.png?v8",
        stop_sign: "unicode/1f6d1.png?v8",
        stopwatch: "unicode/23f1.png?v8",
        straight_ruler: "unicode/1f4cf.png?v8",
        strawberry: "unicode/1f353.png?v8",
        stuck_out_tongue: "unicode/1f61b.png?v8",
        stuck_out_tongue_closed_eyes: "unicode/1f61d.png?v8",
        stuck_out_tongue_winking_eye: "unicode/1f61c.png?v8",
        student: "unicode/1f9d1-1f393.png?v8",
        studio_microphone: "unicode/1f399.png?v8",
        stuffed_flatbread: "unicode/1f959.png?v8",
        sudan: "unicode/1f1f8-1f1e9.png?v8",
        sun_behind_large_cloud: "unicode/1f325.png?v8",
        sun_behind_rain_cloud: "unicode/1f326.png?v8",
        sun_behind_small_cloud: "unicode/1f324.png?v8",
        sun_with_face: "unicode/1f31e.png?v8",
        sunflower: "unicode/1f33b.png?v8",
        sunglasses: "unicode/1f60e.png?v8",
        sunny: "unicode/2600.png?v8",
        sunrise: "unicode/1f305.png?v8",
        sunrise_over_mountains: "unicode/1f304.png?v8",
        superhero: "unicode/1f9b8.png?v8",
        superhero_man: "unicode/1f9b8-2642.png?v8",
        superhero_woman: "unicode/1f9b8-2640.png?v8",
        supervillain: "unicode/1f9b9.png?v8",
        supervillain_man: "unicode/1f9b9-2642.png?v8",
        supervillain_woman: "unicode/1f9b9-2640.png?v8",
        surfer: "unicode/1f3c4.png?v8",
        surfing_man: "unicode/1f3c4-2642.png?v8",
        surfing_woman: "unicode/1f3c4-2640.png?v8",
        suriname: "unicode/1f1f8-1f1f7.png?v8",
        sushi: "unicode/1f363.png?v8",
        suspect: "suspect.png?v8",
        suspension_railway: "unicode/1f69f.png?v8",
        svalbard_jan_mayen: "unicode/1f1f8-1f1ef.png?v8",
        swan: "unicode/1f9a2.png?v8",
        swaziland: "unicode/1f1f8-1f1ff.png?v8",
        sweat: "unicode/1f613.png?v8",
        sweat_drops: "unicode/1f4a6.png?v8",
        sweat_smile: "unicode/1f605.png?v8",
        sweden: "unicode/1f1f8-1f1ea.png?v8",
        sweet_potato: "unicode/1f360.png?v8",
        swim_brief: "unicode/1fa72.png?v8",
        swimmer: "unicode/1f3ca.png?v8",
        swimming_man: "unicode/1f3ca-2642.png?v8",
        swimming_woman: "unicode/1f3ca-2640.png?v8",
        switzerland: "unicode/1f1e8-1f1ed.png?v8",
        symbols: "unicode/1f523.png?v8",
        synagogue: "unicode/1f54d.png?v8",
        syria: "unicode/1f1f8-1f1fe.png?v8",
        syringe: "unicode/1f489.png?v8",
        "t-rex": "unicode/1f996.png?v8",
        taco: "unicode/1f32e.png?v8",
        tada: "unicode/1f389.png?v8",
        taiwan: "unicode/1f1f9-1f1fc.png?v8",
        tajikistan: "unicode/1f1f9-1f1ef.png?v8",
        takeout_box: "unicode/1f961.png?v8",
        tamale: "unicode/1fad4.png?v8",
        tanabata_tree: "unicode/1f38b.png?v8",
        tangerine: "unicode/1f34a.png?v8",
        tanzania: "unicode/1f1f9-1f1ff.png?v8",
        taurus: "unicode/2649.png?v8",
        taxi: "unicode/1f695.png?v8",
        tea: "unicode/1f375.png?v8",
        teacher: "unicode/1f9d1-1f3eb.png?v8",
        teapot: "unicode/1fad6.png?v8",
        technologist: "unicode/1f9d1-1f4bb.png?v8",
        teddy_bear: "unicode/1f9f8.png?v8",
        telephone: "unicode/260e.png?v8",
        telephone_receiver: "unicode/1f4de.png?v8",
        telescope: "unicode/1f52d.png?v8",
        tennis: "unicode/1f3be.png?v8",
        tent: "unicode/26fa.png?v8",
        test_tube: "unicode/1f9ea.png?v8",
        thailand: "unicode/1f1f9-1f1ed.png?v8",
        thermometer: "unicode/1f321.png?v8",
        thinking: "unicode/1f914.png?v8",
        thong_sandal: "unicode/1fa74.png?v8",
        thought_balloon: "unicode/1f4ad.png?v8",
        thread: "unicode/1f9f5.png?v8",
        three: "unicode/0033-20e3.png?v8",
        thumbsdown: "unicode/1f44e.png?v8",
        thumbsup: "unicode/1f44d.png?v8",
        ticket: "unicode/1f3ab.png?v8",
        tickets: "unicode/1f39f.png?v8",
        tiger: "unicode/1f42f.png?v8",
        tiger2: "unicode/1f405.png?v8",
        timer_clock: "unicode/23f2.png?v8",
        timor_leste: "unicode/1f1f9-1f1f1.png?v8",
        tipping_hand_man: "unicode/1f481-2642.png?v8",
        tipping_hand_person: "unicode/1f481.png?v8",
        tipping_hand_woman: "unicode/1f481-2640.png?v8",
        tired_face: "unicode/1f62b.png?v8",
        tm: "unicode/2122.png?v8",
        togo: "unicode/1f1f9-1f1ec.png?v8",
        toilet: "unicode/1f6bd.png?v8",
        tokelau: "unicode/1f1f9-1f1f0.png?v8",
        tokyo_tower: "unicode/1f5fc.png?v8",
        tomato: "unicode/1f345.png?v8",
        tonga: "unicode/1f1f9-1f1f4.png?v8",
        tongue: "unicode/1f445.png?v8",
        toolbox: "unicode/1f9f0.png?v8",
        tooth: "unicode/1f9b7.png?v8",
        toothbrush: "unicode/1faa5.png?v8",
        top: "unicode/1f51d.png?v8",
        tophat: "unicode/1f3a9.png?v8",
        tornado: "unicode/1f32a.png?v8",
        tr: "unicode/1f1f9-1f1f7.png?v8",
        trackball: "unicode/1f5b2.png?v8",
        tractor: "unicode/1f69c.png?v8",
        traffic_light: "unicode/1f6a5.png?v8",
        train: "unicode/1f68b.png?v8",
        train2: "unicode/1f686.png?v8",
        tram: "unicode/1f68a.png?v8",
        transgender_flag: "unicode/1f3f3-26a7.png?v8",
        transgender_symbol: "unicode/26a7.png?v8",
        triangular_flag_on_post: "unicode/1f6a9.png?v8",
        triangular_ruler: "unicode/1f4d0.png?v8",
        trident: "unicode/1f531.png?v8",
        trinidad_tobago: "unicode/1f1f9-1f1f9.png?v8",
        tristan_da_cunha: "unicode/1f1f9-1f1e6.png?v8",
        triumph: "unicode/1f624.png?v8",
        troll: "unicode/1f9cc.png?v8",
        trolleybus: "unicode/1f68e.png?v8",
        trollface: "trollface.png?v8",
        trophy: "unicode/1f3c6.png?v8",
        tropical_drink: "unicode/1f379.png?v8",
        tropical_fish: "unicode/1f420.png?v8",
        truck: "unicode/1f69a.png?v8",
        trumpet: "unicode/1f3ba.png?v8",
        tshirt: "unicode/1f455.png?v8",
        tulip: "unicode/1f337.png?v8",
        tumbler_glass: "unicode/1f943.png?v8",
        tunisia: "unicode/1f1f9-1f1f3.png?v8",
        turkey: "unicode/1f983.png?v8",
        turkmenistan: "unicode/1f1f9-1f1f2.png?v8",
        turks_caicos_islands: "unicode/1f1f9-1f1e8.png?v8",
        turtle: "unicode/1f422.png?v8",
        tuvalu: "unicode/1f1f9-1f1fb.png?v8",
        tv: "unicode/1f4fa.png?v8",
        twisted_rightwards_arrows: "unicode/1f500.png?v8",
        two: "unicode/0032-20e3.png?v8",
        two_hearts: "unicode/1f495.png?v8",
        two_men_holding_hands: "unicode/1f46c.png?v8",
        two_women_holding_hands: "unicode/1f46d.png?v8",
        u5272: "unicode/1f239.png?v8",
        u5408: "unicode/1f234.png?v8",
        u55b6: "unicode/1f23a.png?v8",
        u6307: "unicode/1f22f.png?v8",
        u6708: "unicode/1f237.png?v8",
        u6709: "unicode/1f236.png?v8",
        u6e80: "unicode/1f235.png?v8",
        u7121: "unicode/1f21a.png?v8",
        u7533: "unicode/1f238.png?v8",
        u7981: "unicode/1f232.png?v8",
        u7a7a: "unicode/1f233.png?v8",
        uganda: "unicode/1f1fa-1f1ec.png?v8",
        uk: "unicode/1f1ec-1f1e7.png?v8",
        ukraine: "unicode/1f1fa-1f1e6.png?v8",
        umbrella: "unicode/2614.png?v8",
        unamused: "unicode/1f612.png?v8",
        underage: "unicode/1f51e.png?v8",
        unicorn: "unicode/1f984.png?v8",
        united_arab_emirates: "unicode/1f1e6-1f1ea.png?v8",
        united_nations: "unicode/1f1fa-1f1f3.png?v8",
        unlock: "unicode/1f513.png?v8",
        up: "unicode/1f199.png?v8",
        upside_down_face: "unicode/1f643.png?v8",
        uruguay: "unicode/1f1fa-1f1fe.png?v8",
        us: "unicode/1f1fa-1f1f8.png?v8",
        us_outlying_islands: "unicode/1f1fa-1f1f2.png?v8",
        us_virgin_islands: "unicode/1f1fb-1f1ee.png?v8",
        uzbekistan: "unicode/1f1fa-1f1ff.png?v8",
        v: "unicode/270c.png?v8",
        vampire: "unicode/1f9db.png?v8",
        vampire_man: "unicode/1f9db-2642.png?v8",
        vampire_woman: "unicode/1f9db-2640.png?v8",
        vanuatu: "unicode/1f1fb-1f1fa.png?v8",
        vatican_city: "unicode/1f1fb-1f1e6.png?v8",
        venezuela: "unicode/1f1fb-1f1ea.png?v8",
        vertical_traffic_light: "unicode/1f6a6.png?v8",
        vhs: "unicode/1f4fc.png?v8",
        vibration_mode: "unicode/1f4f3.png?v8",
        video_camera: "unicode/1f4f9.png?v8",
        video_game: "unicode/1f3ae.png?v8",
        vietnam: "unicode/1f1fb-1f1f3.png?v8",
        violin: "unicode/1f3bb.png?v8",
        virgo: "unicode/264d.png?v8",
        volcano: "unicode/1f30b.png?v8",
        volleyball: "unicode/1f3d0.png?v8",
        vomiting_face: "unicode/1f92e.png?v8",
        vs: "unicode/1f19a.png?v8",
        vulcan_salute: "unicode/1f596.png?v8",
        waffle: "unicode/1f9c7.png?v8",
        wales: "unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8",
        walking: "unicode/1f6b6.png?v8",
        walking_man: "unicode/1f6b6-2642.png?v8",
        walking_woman: "unicode/1f6b6-2640.png?v8",
        wallis_futuna: "unicode/1f1fc-1f1eb.png?v8",
        waning_crescent_moon: "unicode/1f318.png?v8",
        waning_gibbous_moon: "unicode/1f316.png?v8",
        warning: "unicode/26a0.png?v8",
        wastebasket: "unicode/1f5d1.png?v8",
        watch: "unicode/231a.png?v8",
        water_buffalo: "unicode/1f403.png?v8",
        water_polo: "unicode/1f93d.png?v8",
        watermelon: "unicode/1f349.png?v8",
        wave: "unicode/1f44b.png?v8",
        wavy_dash: "unicode/3030.png?v8",
        waxing_crescent_moon: "unicode/1f312.png?v8",
        waxing_gibbous_moon: "unicode/1f314.png?v8",
        wc: "unicode/1f6be.png?v8",
        weary: "unicode/1f629.png?v8",
        wedding: "unicode/1f492.png?v8",
        weight_lifting: "unicode/1f3cb.png?v8",
        weight_lifting_man: "unicode/1f3cb-2642.png?v8",
        weight_lifting_woman: "unicode/1f3cb-2640.png?v8",
        western_sahara: "unicode/1f1ea-1f1ed.png?v8",
        whale: "unicode/1f433.png?v8",
        whale2: "unicode/1f40b.png?v8",
        wheel: "unicode/1f6de.png?v8",
        wheel_of_dharma: "unicode/2638.png?v8",
        wheelchair: "unicode/267f.png?v8",
        white_check_mark: "unicode/2705.png?v8",
        white_circle: "unicode/26aa.png?v8",
        white_flag: "unicode/1f3f3.png?v8",
        white_flower: "unicode/1f4ae.png?v8",
        white_haired_man: "unicode/1f468-1f9b3.png?v8",
        white_haired_woman: "unicode/1f469-1f9b3.png?v8",
        white_heart: "unicode/1f90d.png?v8",
        white_large_square: "unicode/2b1c.png?v8",
        white_medium_small_square: "unicode/25fd.png?v8",
        white_medium_square: "unicode/25fb.png?v8",
        white_small_square: "unicode/25ab.png?v8",
        white_square_button: "unicode/1f533.png?v8",
        wilted_flower: "unicode/1f940.png?v8",
        wind_chime: "unicode/1f390.png?v8",
        wind_face: "unicode/1f32c.png?v8",
        window: "unicode/1fa9f.png?v8",
        wine_glass: "unicode/1f377.png?v8",
        wing: "unicode/1fabd.png?v8",
        wink: "unicode/1f609.png?v8",
        wireless: "unicode/1f6dc.png?v8",
        wolf: "unicode/1f43a.png?v8",
        woman: "unicode/1f469.png?v8",
        woman_artist: "unicode/1f469-1f3a8.png?v8",
        woman_astronaut: "unicode/1f469-1f680.png?v8",
        woman_beard: "unicode/1f9d4-2640.png?v8",
        woman_cartwheeling: "unicode/1f938-2640.png?v8",
        woman_cook: "unicode/1f469-1f373.png?v8",
        woman_dancing: "unicode/1f483.png?v8",
        woman_facepalming: "unicode/1f926-2640.png?v8",
        woman_factory_worker: "unicode/1f469-1f3ed.png?v8",
        woman_farmer: "unicode/1f469-1f33e.png?v8",
        woman_feeding_baby: "unicode/1f469-1f37c.png?v8",
        woman_firefighter: "unicode/1f469-1f692.png?v8",
        woman_health_worker: "unicode/1f469-2695.png?v8",
        woman_in_manual_wheelchair: "unicode/1f469-1f9bd.png?v8",
        woman_in_motorized_wheelchair: "unicode/1f469-1f9bc.png?v8",
        woman_in_tuxedo: "unicode/1f935-2640.png?v8",
        woman_judge: "unicode/1f469-2696.png?v8",
        woman_juggling: "unicode/1f939-2640.png?v8",
        woman_mechanic: "unicode/1f469-1f527.png?v8",
        woman_office_worker: "unicode/1f469-1f4bc.png?v8",
        woman_pilot: "unicode/1f469-2708.png?v8",
        woman_playing_handball: "unicode/1f93e-2640.png?v8",
        woman_playing_water_polo: "unicode/1f93d-2640.png?v8",
        woman_scientist: "unicode/1f469-1f52c.png?v8",
        woman_shrugging: "unicode/1f937-2640.png?v8",
        woman_singer: "unicode/1f469-1f3a4.png?v8",
        woman_student: "unicode/1f469-1f393.png?v8",
        woman_teacher: "unicode/1f469-1f3eb.png?v8",
        woman_technologist: "unicode/1f469-1f4bb.png?v8",
        woman_with_headscarf: "unicode/1f9d5.png?v8",
        woman_with_probing_cane: "unicode/1f469-1f9af.png?v8",
        woman_with_turban: "unicode/1f473-2640.png?v8",
        woman_with_veil: "unicode/1f470-2640.png?v8",
        womans_clothes: "unicode/1f45a.png?v8",
        womans_hat: "unicode/1f452.png?v8",
        women_wrestling: "unicode/1f93c-2640.png?v8",
        womens: "unicode/1f6ba.png?v8",
        wood: "unicode/1fab5.png?v8",
        woozy_face: "unicode/1f974.png?v8",
        world_map: "unicode/1f5fa.png?v8",
        worm: "unicode/1fab1.png?v8",
        worried: "unicode/1f61f.png?v8",
        wrench: "unicode/1f527.png?v8",
        wrestling: "unicode/1f93c.png?v8",
        writing_hand: "unicode/270d.png?v8",
        x: "unicode/274c.png?v8",
        x_ray: "unicode/1fa7b.png?v8",
        yarn: "unicode/1f9f6.png?v8",
        yawning_face: "unicode/1f971.png?v8",
        yellow_circle: "unicode/1f7e1.png?v8",
        yellow_heart: "unicode/1f49b.png?v8",
        yellow_square: "unicode/1f7e8.png?v8",
        yemen: "unicode/1f1fe-1f1ea.png?v8",
        yen: "unicode/1f4b4.png?v8",
        yin_yang: "unicode/262f.png?v8",
        yo_yo: "unicode/1fa80.png?v8",
        yum: "unicode/1f60b.png?v8",
        zambia: "unicode/1f1ff-1f1f2.png?v8",
        zany_face: "unicode/1f92a.png?v8",
        zap: "unicode/26a1.png?v8",
        zebra: "unicode/1f993.png?v8",
        zero: "unicode/0030-20e3.png?v8",
        zimbabwe: "unicode/1f1ff-1f1fc.png?v8",
        zipper_mouth_face: "unicode/1f910.png?v8",
        zombie: "unicode/1f9df.png?v8",
        zombie_man: "unicode/1f9df-2642.png?v8",
        zombie_woman: "unicode/1f9df-2640.png?v8",
        zzz: "unicode/1f4a4.png?v8"
    }
};

function replaceEmojiShorthand(m, $1, useNativeEmoji) {
    const emojiMatch = emojiData.data[$1];
    let result = m;
    if (emojiMatch) {
        if (useNativeEmoji && /unicode/.test(emojiMatch)) {
            const emojiUnicode = emojiMatch.replace("unicode/", "").replace(/\.png.*/, "").split("-").map((u => `&#x${u};`)).join("&zwj;").concat("&#xFE0E;");
            result = `<span class="emoji">${emojiUnicode}</span>`;
        } else {
            result = `<img src="${emojiData.baseURL}${emojiMatch}.png" alt="${$1}" class="emoji" loading="lazy">`;
        }
    }
    return result;
}

function emojify(text, useNativeEmoji) {
    return text.replace(/<(code|pre|script|template)[^>]*?>[\s\S]+?<\/(code|pre|script|template)>/g, (m => m.replace(/:/g, "__colon__"))).replace(/<!--[\s\S]+?-->/g, (m => m.replace(/:/g, "__colon__"))).replace(/([a-z]{2,}:)?\/\/[^\s'">)]+/gi, (m => m.replace(/:/g, "__colon__"))).replace(/:([a-z0-9_\-+]+?):/g, ((m, $1) => replaceEmojiShorthand(m, $1, useNativeEmoji))).replace(/__colon__/g, ":");
}

function getAndRemoveConfig(str = "") {
    const config = {};
    if (str) {
        str = str.replace(/^('|")/, "").replace(/('|")$/, "").replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g, ((m, key, value) => {
            if (key.indexOf(":") !== -1) {
                return m;
            }
            value = value && value.replace(/&quot;/g, "") || true;
            if (value !== true && config[key] !== undefined) {
                if (!Array.isArray(config[key]) && value !== config[key]) {
                    config[key] = [ config[key] ];
                }
                config[key].includes(value) || config[key].push(value);
            } else {
                config[key] = value;
            }
            return "";
        })).trim();
    }
    return {
        str: str,
        config: config
    };
}

function removeAtag(str = "") {
    return str.replace(/(<\/?a.*?>)/gi, "");
}

function getAndRemoveDocsifyIgnoreConfig(content = "") {
    let ignoreAllSubs, ignoreSubHeading;
    if (/<!-- {docsify-ignore} -->/g.test(content)) {
        content = content.replace("\x3c!-- {docsify-ignore} --\x3e", "");
        ignoreSubHeading = true;
    }
    if (/{docsify-ignore}/g.test(content)) {
        content = content.replace("{docsify-ignore}", "");
        ignoreSubHeading = true;
    }
    if (/<!-- {docsify-ignore-all} -->/g.test(content)) {
        content = content.replace("\x3c!-- {docsify-ignore-all} --\x3e", "");
        ignoreAllSubs = true;
    }
    if (/{docsify-ignore-all}/g.test(content)) {
        content = content.replace("{docsify-ignore-all}", "");
        ignoreAllSubs = true;
    }
    return {
        content: content,
        ignoreAllSubs: ignoreAllSubs,
        ignoreSubHeading: ignoreSubHeading
    };
}

function escapeHtml(string) {
    const entityMap = {
        "&": "&amp;",
        "<": "&lt;",
        ">": "&gt;",
        '"': "&quot;",
        "'": "&#39;"
    };
    return String(string).replace(/[&<>"']/g, (s => entityMap[s]));
}

const imageCompiler = ({renderer: renderer, contentBase: contentBase, router: router}) => renderer.image = ({href: href, title: title, text: text}) => {
    let url = href;
    const attrs = [];
    const {str: str, config: config} = getAndRemoveConfig(title);
    title = str;
    if (config["no-zoom"]) {
        attrs.push("data-no-zoom");
    }
    if (title) {
        attrs.push(`title="${escapeHtml(title)}"`);
    }
    if (config.size) {
        const [width, height] = config.size.split("x");
        if (height) {
            attrs.push(`width="${width}" height="${height}"`);
        } else {
            attrs.push(`width="${width}"`);
        }
    }
    if (config.class) {
        let classes = config.class;
        if (Array.isArray(config.class)) {
            classes = config.class.join(" ");
        }
        attrs.push(`class="${classes}"`);
    }
    if (config.id) {
        attrs.push(`id="${config.id}"`);
    }
    if (!isAbsolutePath(href)) {
        url = getPath(contentBase, getParentPath(router.getCurrentPath()), href);
    }
    return `<img src="${escapeHtml(url)}" data-origin="${escapeHtml(href)}" alt="${escapeHtml(text)}" ${attrs.join(" ")} />`;
};

const headingCompiler = ({renderer: renderer, router: router, compiler: compiler}) => renderer.heading = function({tokens: tokens, depth: depth, text: text}) {
    const parsedText = this.parser.parseInline(tokens);
    let {str: str, config: config} = getAndRemoveConfig(parsedText);
    const nextToc = {
        depth: depth,
        title: str
    };
    const {content: content, ignoreAllSubs: ignoreAllSubs, ignoreSubHeading: ignoreSubHeading} = getAndRemoveDocsifyIgnoreConfig(str);
    str = content.trim();
    nextToc.title = removeAtag(str);
    nextToc.ignoreAllSubs = ignoreAllSubs;
    nextToc.ignoreSubHeading = ignoreSubHeading;
    const slug = slugify(config.id || text);
    const url = router.toURL(router.getCurrentPath(), {
        id: slug
    });
    nextToc.slug = stripUrlExceptId(url);
    if (compiler.blockquoteDepth === 0) {
        compiler.toc.push(nextToc);
    }
    return `<h${depth} id="${slug}" tabindex="-1"><a href="${url}" data-id="${slug}" class="anchor"><span>${str}</span></a></h${depth}>`;
};

(function(Prism) {
    function getPlaceholder(language, index) {
        return "___" + language.toUpperCase() + index + "___";
    }
    Object.defineProperties(Prism.languages["markup-templating"] = {}, {
        buildPlaceholders: {
            value: function(env, language, placeholderPattern, replaceFilter) {
                if (env.language !== language) {
                    return;
                }
                var tokenStack = env.tokenStack = [];
                env.code = env.code.replace(placeholderPattern, (function(match) {
                    if (typeof replaceFilter === "function" && !replaceFilter(match)) {
                        return match;
                    }
                    var i = tokenStack.length;
                    var placeholder;
                    while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) {
                        ++i;
                    }
                    tokenStack[i] = match;
                    return placeholder;
                }));
                env.grammar = Prism.languages.markup;
            }
        },
        tokenizePlaceholders: {
            value: function(env, language) {
                if (env.language !== language || !env.tokenStack) {
                    return;
                }
                env.grammar = Prism.languages[language];
                var j = 0;
                var keys = Object.keys(env.tokenStack);
                function walkTokens(tokens) {
                    for (var i = 0; i < tokens.length; i++) {
                        if (j >= keys.length) {
                            break;
                        }
                        var token = tokens[i];
                        if (typeof token === "string" || token.content && typeof token.content === "string") {
                            var k = keys[j];
                            var t = env.tokenStack[k];
                            var s = typeof token === "string" ? token : token.content;
                            var placeholder = getPlaceholder(language, k);
                            var index = s.indexOf(placeholder);
                            if (index > -1) {
                                ++j;
                                var before = s.substring(0, index);
                                var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), "language-" + language, t);
                                var after = s.substring(index + placeholder.length);
                                var replacement = [];
                                if (before) {
                                    replacement.push.apply(replacement, walkTokens([ before ]));
                                }
                                replacement.push(middle);
                                if (after) {
                                    replacement.push.apply(replacement, walkTokens([ after ]));
                                }
                                if (typeof token === "string") {
                                    tokens.splice.apply(tokens, [ i, 1 ].concat(replacement));
                                } else {
                                    token.content = replacement;
                                }
                            }
                        } else if (token.content) {
                            walkTokens(token.content);
                        }
                    }
                    return tokens;
                }
                walkTokens(env.tokens);
            }
        }
    });
})(Prism);

const lang_dependencies = {
    javascript: "clike",
    actionscript: "javascript",
    apex: [ "clike", "sql" ],
    arduino: "cpp",
    aspnet: [ "markup", "csharp" ],
    birb: "clike",
    bison: "c",
    c: "clike",
    csharp: "clike",
    cpp: "c",
    cfscript: "clike",
    chaiscript: [ "clike", "cpp" ],
    cilkc: "c",
    cilkcpp: "cpp",
    coffeescript: "javascript",
    crystal: "ruby",
    "css-extras": "css",
    d: "clike",
    dart: "clike",
    django: "markup-templating",
    ejs: [ "javascript", "markup-templating" ],
    etlua: [ "lua", "markup-templating" ],
    erb: [ "ruby", "markup-templating" ],
    fsharp: "clike",
    "firestore-security-rules": "clike",
    flow: "javascript",
    ftl: "markup-templating",
    gml: "clike",
    glsl: "c",
    go: "clike",
    gradle: "clike",
    groovy: "clike",
    haml: "ruby",
    handlebars: "markup-templating",
    haxe: "clike",
    hlsl: "c",
    idris: "haskell",
    java: "clike",
    javadoc: [ "markup", "java", "javadoclike" ],
    jolie: "clike",
    jsdoc: [ "javascript", "javadoclike", "typescript" ],
    "js-extras": "javascript",
    json5: "json",
    jsonp: "json",
    "js-templates": "javascript",
    kotlin: "clike",
    latte: [ "clike", "markup-templating", "php" ],
    less: "css",
    lilypond: "scheme",
    liquid: "markup-templating",
    markdown: "markup",
    "markup-templating": "markup",
    mongodb: "javascript",
    n4js: "javascript",
    objectivec: "c",
    opencl: "c",
    parser: "markup",
    php: "markup-templating",
    phpdoc: [ "php", "javadoclike" ],
    "php-extras": "php",
    plsql: "sql",
    processing: "clike",
    protobuf: "clike",
    pug: [ "markup", "javascript" ],
    purebasic: "clike",
    purescript: "haskell",
    qsharp: "clike",
    qml: "javascript",
    qore: "clike",
    racket: "scheme",
    cshtml: [ "markup", "csharp" ],
    jsx: [ "markup", "javascript" ],
    tsx: [ "jsx", "typescript" ],
    reason: "clike",
    ruby: "clike",
    sass: "css",
    scss: "css",
    scala: "java",
    "shell-session": "bash",
    smarty: "markup-templating",
    solidity: "clike",
    soy: "markup-templating",
    sparql: "turtle",
    sqf: "clike",
    squirrel: "clike",
    stata: [ "mata", "java", "python" ],
    "t4-cs": [ "t4-templating", "csharp" ],
    "t4-vb": [ "t4-templating", "vbnet" ],
    tap: "yaml",
    tt2: [ "clike", "markup-templating" ],
    textile: "markup",
    twig: "markup-templating",
    typescript: "javascript",
    v: "clike",
    vala: "clike",
    vbnet: "basic",
    velocity: "markup",
    wiki: "markup",
    xeora: "markup",
    "xml-doc": "markup",
    xquery: "markup"
};

const lang_aliases = {
    html: "markup",
    xml: "markup",
    svg: "markup",
    mathml: "markup",
    ssml: "markup",
    atom: "markup",
    rss: "markup",
    js: "javascript",
    g4: "antlr4",
    ino: "arduino",
    "arm-asm": "armasm",
    art: "arturo",
    adoc: "asciidoc",
    avs: "avisynth",
    avdl: "avro-idl",
    gawk: "awk",
    sh: "bash",
    shell: "bash",
    shortcode: "bbcode",
    rbnf: "bnf",
    oscript: "bsl",
    cs: "csharp",
    dotnet: "csharp",
    cfc: "cfscript",
    "cilk-c": "cilkc",
    "cilk-cpp": "cilkcpp",
    cilk: "cilkcpp",
    coffee: "coffeescript",
    conc: "concurnas",
    jinja2: "django",
    "dns-zone": "dns-zone-file",
    dockerfile: "docker",
    gv: "dot",
    eta: "ejs",
    xlsx: "excel-formula",
    xls: "excel-formula",
    gamemakerlanguage: "gml",
    po: "gettext",
    gni: "gn",
    ld: "linker-script",
    "go-mod": "go-module",
    hbs: "handlebars",
    mustache: "handlebars",
    hs: "haskell",
    idr: "idris",
    gitignore: "ignore",
    hgignore: "ignore",
    npmignore: "ignore",
    webmanifest: "json",
    kt: "kotlin",
    kts: "kotlin",
    kum: "kumir",
    tex: "latex",
    context: "latex",
    ly: "lilypond",
    emacs: "lisp",
    elisp: "lisp",
    "emacs-lisp": "lisp",
    md: "markdown",
    moon: "moonscript",
    n4jsd: "n4js",
    nani: "naniscript",
    objc: "objectivec",
    qasm: "openqasm",
    objectpascal: "pascal",
    px: "pcaxis",
    pcode: "peoplecode",
    plantuml: "plant-uml",
    pq: "powerquery",
    mscript: "powerquery",
    pbfasm: "purebasic",
    purs: "purescript",
    py: "python",
    qs: "qsharp",
    rkt: "racket",
    razor: "cshtml",
    rpy: "renpy",
    res: "rescript",
    robot: "robotframework",
    rb: "ruby",
    "sh-session": "shell-session",
    shellsession: "shell-session",
    smlnj: "sml",
    sol: "solidity",
    sln: "solution-file",
    rq: "sparql",
    sclang: "supercollider",
    t4: "t4-cs",
    trickle: "tremor",
    troy: "tremor",
    trig: "turtle",
    ts: "typescript",
    tsconfig: "typoscript",
    uscript: "unrealscript",
    uc: "unrealscript",
    url: "uri",
    vb: "visual-basic",
    vba: "visual-basic",
    webidl: "web-idl",
    mathematica: "wolfram",
    nb: "wolfram",
    wl: "wolfram",
    xeoracube: "xeora",
    yml: "yaml"
};

const depTreeCache = {};

const sanitizeCodeLang = lang => {
    const codeLang = typeof lang === "string" && lang.trim().length ? lang.trim() : "markup";
    const prismLang = lang_aliases[codeLang] || codeLang;
    return {
        codeLang: codeLang,
        prismLang: prismLang,
        escapedLang: escapeHtml(codeLang)
    };
};

function checkLangDependenciesAllLoaded(lang) {
    if (!lang) {
        return;
    }
    lang = lang_aliases[lang] || lang;
    const validLang = lang_dependencies[lang];
    if (!validLang) {
        return;
    }
    if (!depTreeCache[lang]) {
        const dummy = {
            loaded: true,
            dependencies: []
        };
        buildAndCheckDepTree(lang, dummy, dummy);
        const depTree = dummy.dependencies[0];
        depTreeCache[lang] = depTree;
        if (!dummy.loaded) {
            const prettyOutput = prettyPrint(depTree, 1);
            console.warn(`The language '${lang}' required dependencies for code block highlighting are not satisfied.`, `Priority dependencies from low to high, consider to place all the necessary dependencies by priority (higher first): \n`, prettyOutput);
        }
    }
}

const buildAndCheckDepTree = (lang, parent, dummy) => {
    if (!lang) {
        return;
    }
    const cur = {
        cur: lang,
        loaded: true,
        dependencies: []
    };
    let deps = lang_dependencies[lang] || [];
    if (!(lang in prismExports.languages)) {
        dummy.loaded = false;
        cur.loaded = false;
    }
    if (typeof deps === "string") {
        deps = [ deps ];
    }
    deps.forEach((dep => {
        buildAndCheckDepTree(dep, cur, dummy);
    }));
    parent.dependencies.push(cur);
};

const prettyPrint = (depTree, level) => {
    let cur = `${"  ".repeat(level * 3)} ${depTree.cur} ${depTree.loaded ? "(+)" : "(-)"}`;
    if (depTree.dependencies.length) {
        depTree.dependencies.forEach((dep => {
            cur += prettyPrint(dep, level + 1);
        }));
    }
    return "\n" + cur;
};

const highlightCodeCompiler = ({renderer: renderer}) => renderer.code = function({text: text, lang: lang = "markup"}) {
    const {escapedLang: escapedLang, prismLang: prismLang} = sanitizeCodeLang(lang);
    checkLangDependenciesAllLoaded(prismLang);
    const langOrMarkup = prismExports.languages[prismLang] || prismExports.languages.markup;
    const code = prismExports.highlight(text.replace(/@DOCSIFY_QM@/g, "`"), langOrMarkup, prismLang);
    return `<pre data-lang="${escapedLang}" class="language-${escapedLang}"><code class="lang-${escapedLang} language-${escapedLang}" tabindex="0">${code}</code></pre>`;
};

function renderParagraphText(text) {
    if (text.startsWith("!&gt;")) {
        return helper("callout important", text);
    }
    if (text.startsWith("?&gt;")) {
        return helper("callout tip", text);
    }
    return `<p>${text}</p>`;
}

const paragraphCompiler = ({renderer: renderer}) => renderer.paragraph = function({tokens: tokens, embedTokenMap: embedTokenMap}) {
    let result;
    if (embedTokenMap && tokens?.length) {
        const parts = [];
        let inlineBuffer = [];
        const flushInlineBuffer = () => {
            if (!inlineBuffer.length) {
                return;
            }
            const text = this.parser.parseInline(inlineBuffer);
            parts.push(renderParagraphText(text));
            inlineBuffer = [];
        };
        tokens.forEach(((inlineToken, inlineIndex) => {
            const embedToken = embedTokenMap[inlineIndex];
            if (embedToken?.length) {
                flushInlineBuffer();
                parts.push(this.parser.parse(embedToken));
            } else {
                inlineBuffer.push(inlineToken);
            }
        }));
        flushInlineBuffer();
        result = parts.join("");
    } else {
        const text = this.parser.parseInline(tokens);
        result = renderParagraphText(text);
    }
    return result;
};

const blockquoteCompiler = ({renderer: renderer, compiler: compiler}) => renderer.blockquote = function({tokens: tokens}) {
    let openTag = "<blockquote>";
    let closeTag = "</blockquote>";
    const firstParagraphIndex = tokens.findIndex((t => t.type === "paragraph"));
    const firstParagraph = tokens[firstParagraphIndex];
    if (firstParagraph) {
        const calloutData = firstParagraph.raw.match(/^(\[!(\w+)\])/);
        if (calloutData) {
            const calloutMark = calloutData[1];
            const calloutType = calloutData[2].toLowerCase();
            tokens = tokens.slice();
            const paragraph = {
                ...firstParagraph
            };
            if (firstParagraph.tokens) {
                paragraph.tokens = firstParagraph.tokens.map((t => ({
                    ...t
                })));
            }
            tokens[firstParagraphIndex] = paragraph;
            paragraph.raw = paragraph.raw.replace(calloutMark, "").trimStart();
            if (paragraph.tokens && paragraph.tokens.length > 0) {
                paragraph.tokens.forEach((t => {
                    if (t.raw) {
                        t.raw = t.raw.replace(calloutMark, "");
                    }
                    if (t.text) {
                        t.text = t.text.replace(calloutMark, "");
                    }
                }));
            }
            if (!paragraph.raw.trim()) {
                tokens.splice(firstParagraphIndex, 1);
            }
            openTag = `<div class="callout ${calloutType}">`;
            closeTag = `</div>`;
        }
    }
    compiler.blockquoteDepth++;
    let body = "";
    try {
        body = this.parser.parse(tokens);
    } finally {
        compiler.blockquoteDepth--;
    }
    return `${openTag}${body}${closeTag}`;
};

const taskListCompiler = ({renderer: renderer}) => renderer.list = function(token) {
    const ordered = token.ordered;
    const start = token.start;
    let body = "";
    for (let j = 0; j < token.items.length; j++) {
        const item = token.items[j];
        body += this.listitem?.(item);
    }
    const isTaskList = /<li class="task-list-item">/.test(body.split('class="task-list"')[0]);
    const isStartReq = start && start > 1;
    const tag = ordered ? "ol" : "ul";
    const tagAttrs = [ isTaskList ? 'class="task-list"' : "", isStartReq ? `start="${start}"` : "" ].join(" ").trim();
    return `<${tag} ${tagAttrs}>${body}</${tag}>`;
};

const taskListItemCompiler = ({renderer: renderer}) => renderer.listitem = function(item) {
    let text = "";
    if (item.task) {
        const checkbox = this.checkbox?.({
            checked: !!item.checked
        });
        if (item.loose) {
            if (item.tokens.length > 0 && item.tokens[0].type === "paragraph") {
                item.tokens[0].text = checkbox + " " + item.tokens[0].text;
                if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") {
                    item.tokens[0].tokens[0].text = checkbox + " " + item.tokens[0].tokens[0].text;
                }
            } else {
                item.tokens.unshift({
                    type: "text",
                    raw: checkbox + " ",
                    text: checkbox + " "
                });
            }
        }
    }
    text += this.parser?.parse(item.tokens, !!item.loose);
    const isTaskItem = /^(<input.*type="checkbox"[^>]*>)/.test(text);
    const html = isTaskItem ? `<li class="task-list-item"><label>${text}</label></li>` : `<li>${text}</li>`;
    return html;
};

const linkCompiler = ({renderer: renderer, router: router, linkTarget: defaultLinkTarget, compiler: compiler}) => renderer.link = function({href: href, title: title = "", tokens: tokens}) {
    const attrs = [];
    const text = this.parser.parseInline(tokens) || "";
    const {str: str, config: config} = getAndRemoveConfig(title);
    const isAbsolute = isAbsolutePath(href);
    const isNotCompilable = compiler._matchNotCompileLink(href);
    const isMailto = href.startsWith("mailto:");
    const linkTarget = config.target || defaultLinkTarget;
    const linkRel = linkTarget === "_blank" ? compiler.config.externalLinkRel || "noopener" : "";
    title = str;
    if (!isAbsolute && !isNotCompilable && !config.ignore) {
        if (href === compiler.config.homepage) {
            href = "README";
        }
        href = router.toURL(href, null, router.getCurrentPath());
        if (config.target && !isMailto) {
            attrs.push(`target="${linkTarget}"`);
        }
    } else {
        if (!isAbsolute && href.startsWith("./")) {
            href = router.toURL(href, null, router.getCurrentPath()).replace(/^#\//, "/");
        }
        if (!isMailto) {
            attrs.push(`target="${linkTarget}"`);
            if (linkRel !== "") {
                attrs.push(`rel="${linkRel}"`);
            }
        }
    }
    if (config.disabled) {
        attrs.push("disabled");
        href = "javascript:void(0)";
    }
    if (config.class) {
        let classes = config.class;
        if (Array.isArray(config.class)) {
            classes = config.class.join(" ");
        }
        attrs.push(`class="${classes}"`);
    }
    if (config.id) {
        attrs.push(`id="${config.id}"`);
    }
    if (title) {
        attrs.push(`title="${escapeHtml(title)}"`);
    }
    return `<a href="${escapeHtml(href)}" ${attrs.join(" ")}>${text}</a>`;
};

const compileMedia = {
    markdown(url) {
        return {
            url: url
        };
    },
    mermaid(url) {
        return {
            url: url
        };
    },
    iframe(url, title) {
        return {
            html: `<iframe src="${escapeHtml(url)}" ${title || "width=100% height=400"}></iframe>`
        };
    },
    video(url, title) {
        return {
            html: `<video src="${escapeHtml(url)}" ${title || "controls"}>Not Supported</video>`
        };
    },
    audio(url, title) {
        return {
            html: `<audio src="${escapeHtml(url)}" ${title || "controls"}>Not Supported</audio>`
        };
    },
    code(url, title) {
        let lang = url.match(/\.(\w+)$/);
        lang = title || lang && lang[1];
        if (lang === "md") {
            lang = "markdown";
        }
        return {
            url: url,
            lang: lang
        };
    }
};

const tableCellCompiler = ({renderer: renderer}) => renderer.tablecell = function(token) {
    let content;
    if (token.embedTokenMap && token.tokens?.length) {
        content = "";
        token.tokens.forEach(((inlineToken, inlineIndex) => {
            const embedToken = token.embedTokenMap[inlineIndex];
            if (embedToken?.length) {
                content += this.parser.parse(embedToken);
            } else {
                content += this.parser.parseInline([ inlineToken ]);
            }
        }));
    } else if (token.embedTokens && token.embedTokens.length > 0) {
        content = this.parser.parse(token.embedTokens);
    } else {
        content = this.parser.parseInline(token.tokens);
    }
    const type = token.header ? "th" : "td";
    const tag = token.align ? `<${type} align="${token.align}">` : `<${type}>`;
    return tag + content + `</${type}>\n`;
};

const cachedLinks = {};

class Compiler {
    constructor(config, router) {
        this.config = config;
        this.router = router;
        this.cacheTree = {};
        this.toc = [];
        this.blockquoteDepth = 0;
        this.cacheTOC = {};
        this.linkTarget = config.externalLinkTarget || "_blank";
        this.linkRel = this.linkTarget === "_blank" ? config.externalLinkRel || "noopener" : "";
        this.contentBase = router.getBasePath();
        this.renderer = this._initRenderer();
        let compile;
        const mdConf = config.markdown || {};
        if (isFn(mdConf)) {
            compile = mdConf(g, this.renderer);
        } else {
            g.setOptions(Object.assign(mdConf, {
                renderer: Object.assign(this.renderer, mdConf.renderer)
            }));
            compile = g;
        }
        this._marked = compile;
        this.compile = text => {
            let isCached = true;
            const result = cached$1((_ => {
                isCached = false;
                let html = "";
                if (!text) {
                    return text;
                }
                if (isPrimitive(text)) {
                    html = compile(text);
                } else {
                    html = compile.parser(text);
                }
                html = config.noEmoji ? html : emojify(html, config.nativeEmoji);
                slugify.clear();
                return html;
            }))(text);
            const curFileName = this.router.parse().file;
            if (isCached) {
                this.toc = this.cacheTOC[curFileName];
            } else {
                this.cacheTOC[curFileName] = [ ...this.toc ];
            }
            return result;
        };
    }
    compileEmbed(href, title) {
        const {str: str, config: config} = getAndRemoveConfig(title);
        let embed;
        title = str;
        if (config.include) {
            if (!isAbsolutePath(href)) {
                href = getPath(this.contentBase, getParentPath(this.router.getCurrentPath()), href);
            }
            let media;
            const mediaType = Array.isArray(config.type) ? config.type[0] : config.type;
            if (mediaType && (media = compileMedia[mediaType])) {
                embed = media.call(this, href, title);
                embed.type = mediaType;
            } else {
                let type = "code";
                if (/\.(md|markdown)/.test(href)) {
                    type = "markdown";
                } else if (/\.mmd/.test(href)) {
                    type = "mermaid";
                } else if (/\.html?/.test(href)) {
                    type = "iframe";
                } else if (/\.(mp4|ogg)/.test(href)) {
                    type = "video";
                } else if (/\.mp3/.test(href)) {
                    type = "audio";
                }
                embed = compileMedia[type](href, title);
                embed.type = type;
            }
            embed.fragment = config.fragment;
            embed.omitFragmentLine = config.omitFragmentLine;
            return embed;
        }
    }
    _matchNotCompileLink(link) {
        const links = this.config.noCompileLinks || [];
        for (const n of links) {
            const re = cachedLinks[n] || (cachedLinks[n] = new RegExp(`^${n}$`));
            if (re.test(link)) {
                return link;
            }
        }
    }
    _initRenderer() {
        const renderer = new g.Renderer;
        const {linkTarget: linkTarget, router: router, contentBase: contentBase} = this;
        const origin = {};
        origin.heading = headingCompiler({
            renderer: renderer,
            router: router,
            compiler: this
        });
        origin.blockquoteCompiler = blockquoteCompiler({
            renderer: renderer,
            compiler: this
        });
        origin.code = highlightCodeCompiler({
            renderer: renderer
        });
        origin.link = linkCompiler({
            renderer: renderer,
            router: router,
            linkTarget: linkTarget,
            compiler: this
        });
        origin.paragraph = paragraphCompiler({
            renderer: renderer
        });
        origin.image = imageCompiler({
            renderer: renderer,
            contentBase: contentBase,
            router: router
        });
        origin.list = taskListCompiler({
            renderer: renderer
        });
        origin.listitem = taskListItemCompiler({
            renderer: renderer
        });
        origin.tablecell = tableCellCompiler({
            renderer: renderer
        });
        renderer.origin = origin;
        return renderer;
    }
    sidebar(text, level) {
        const {toc: toc} = this;
        const currentPath = this.router.getCurrentPath();
        let html = "";
        if (typeof text === "string") {
            return this.compile(text);
        }
        for (let i = 0; i < toc.length; i++) {
            if (toc[i].ignoreSubHeading) {
                const deletedHeaderLevel = toc[i].depth;
                toc.splice(i, 1);
                while (i < toc.length && toc[i].depth > deletedHeaderLevel) {
                    toc.splice(i, 1);
                }
                i--;
            }
        }
        const tree$1 = this.cacheTree[currentPath] || genTree(toc, level);
        html = tree(tree$1);
        this.cacheTree[currentPath] = tree$1;
        return html;
    }
    resetToc() {
        this.toc = [];
    }
    subSidebar(level) {
        const currentPath = this.router.getCurrentPath();
        const {cacheTree: cacheTree, toc: toc} = this;
        toc[0] && toc[0].ignoreAllSubs && toc.splice(0);
        toc[0] && toc[0].depth === 1 && toc.shift();
        for (let i = 0; i < toc.length; i++) {
            toc[i].ignoreSubHeading && toc.splice(i, 1) && i--;
        }
        const tree$1 = cacheTree[currentPath] || genTree(toc, level);
        cacheTree[currentPath] = tree$1;
        this.toc = [];
        return tree(tree$1);
    }
    header(text, level) {
        const tokenHeading = {
            type: "heading",
            raw: text,
            depth: level,
            text: text,
            tokens: [ {
                type: "text",
                raw: text,
                text: text
            } ]
        };
        return this.renderer.heading(tokenHeading);
    }
    cover(text) {
        const cacheToc = this.toc.slice();
        const html = this.compile(text);
        this.toc = cacheToc.slice();
        return html;
    }
}

var _createClass = function() {
    function defineProperties(target, props) {
        for (var i = 0; i < props.length; i++) {
            var descriptor = props[i];
            descriptor.enumerable = descriptor.enumerable || false;
            descriptor.configurable = true;
            if ("value" in descriptor) descriptor.writable = true;
            Object.defineProperty(target, descriptor.key, descriptor);
        }
    }
    return function(Constructor, protoProps, staticProps) {
        if (protoProps) defineProperties(Constructor.prototype, protoProps);
        if (staticProps) defineProperties(Constructor, staticProps);
        return Constructor;
    };
}();

var _templateObject = _taggedTemplateLiteral([ "", "" ], [ "", "" ]);

function _taggedTemplateLiteral(strings, raw) {
    return Object.freeze(Object.defineProperties(strings, {
        raw: {
            value: Object.freeze(raw)
        }
    }));
}

function _classCallCheck(instance, Constructor) {
    if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
    }
}

var TemplateTag = function() {
    function TemplateTag() {
        var _this = this;
        for (var _len = arguments.length, transformers = Array(_len), _key = 0; _key < _len; _key++) {
            transformers[_key] = arguments[_key];
        }
        _classCallCheck(this, TemplateTag);
        this.tag = function(strings) {
            for (var _len2 = arguments.length, expressions = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
                expressions[_key2 - 1] = arguments[_key2];
            }
            if (typeof strings === "function") {
                return _this.interimTag.bind(_this, strings);
            }
            if (typeof strings === "string") {
                return _this.transformEndResult(strings);
            }
            strings = strings.map(_this.transformString.bind(_this));
            return _this.transformEndResult(strings.reduce(_this.processSubstitutions.bind(_this, expressions)));
        };
        if (transformers.length > 0 && Array.isArray(transformers[0])) {
            transformers = transformers[0];
        }
        this.transformers = transformers.map((function(transformer) {
            return typeof transformer === "function" ? transformer() : transformer;
        }));
        return this.tag;
    }
    _createClass(TemplateTag, [ {
        key: "interimTag",
        value: function interimTag(previousTag, template) {
            for (var _len3 = arguments.length, substitutions = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
                substitutions[_key3 - 2] = arguments[_key3];
            }
            return this.tag(_templateObject, previousTag.apply(undefined, [ template ].concat(substitutions)));
        }
    }, {
        key: "processSubstitutions",
        value: function processSubstitutions(substitutions, resultSoFar, remainingPart) {
            var substitution = this.transformSubstitution(substitutions.shift(), resultSoFar);
            return "".concat(resultSoFar, substitution, remainingPart);
        }
    }, {
        key: "transformString",
        value: function transformString(str) {
            var cb = function cb(res, transform) {
                return transform.onString ? transform.onString(res) : res;
            };
            return this.transformers.reduce(cb, str);
        }
    }, {
        key: "transformSubstitution",
        value: function transformSubstitution(substitution, resultSoFar) {
            var cb = function cb(res, transform) {
                return transform.onSubstitution ? transform.onSubstitution(res, resultSoFar) : res;
            };
            return this.transformers.reduce(cb, substitution);
        }
    }, {
        key: "transformEndResult",
        value: function transformEndResult(endResult) {
            var cb = function cb(res, transform) {
                return transform.onEndResult ? transform.onEndResult(res) : res;
            };
            return this.transformers.reduce(cb, endResult);
        }
    } ]);
    return TemplateTag;
}();

var trimResultTransformer = function trimResultTransformer() {
    var side = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
    return {
        onEndResult: function onEndResult(endResult) {
            if (side === "") {
                return endResult.trim();
            }
            side = side.toLowerCase();
            if (side === "start" || side === "left") {
                return endResult.replace(/^\s*/, "");
            }
            if (side === "end" || side === "right") {
                return endResult.replace(/\s*$/, "");
            }
            throw new Error("Side not supported: " + side);
        }
    };
};

function _toConsumableArray(arr) {
    if (Array.isArray(arr)) {
        for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
            arr2[i] = arr[i];
        }
        return arr2;
    } else {
        return Array.from(arr);
    }
}

var stripIndentTransformer = function stripIndentTransformer() {
    var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "initial";
    return {
        onEndResult: function onEndResult(endResult) {
            if (type === "initial") {
                var match = endResult.match(/^[^\S\n]*(?=\S)/gm);
                var indent = match && Math.min.apply(Math, _toConsumableArray(match.map((function(el) {
                    return el.length;
                }))));
                if (indent) {
                    var regexp = new RegExp("^.{" + indent + "}", "gm");
                    return endResult.replace(regexp, "");
                }
                return endResult;
            }
            if (type === "all") {
                return endResult.replace(/^[^\S\n]+/gm, "");
            }
            throw new Error("Unknown type: " + type);
        }
    };
};

var replaceResultTransformer = function replaceResultTransformer(replaceWhat, replaceWith) {
    return {
        onEndResult: function onEndResult(endResult) {
            if (replaceWhat == null || replaceWith == null) {
                throw new Error("replaceResultTransformer requires at least 2 arguments.");
            }
            return endResult.replace(replaceWhat, replaceWith);
        }
    };
};

var replaceSubstitutionTransformer = function replaceSubstitutionTransformer(replaceWhat, replaceWith) {
    return {
        onSubstitution: function onSubstitution(substitution, resultSoFar) {
            if (replaceWhat == null || replaceWith == null) {
                throw new Error("replaceSubstitutionTransformer requires at least 2 arguments.");
            }
            if (substitution == null) {
                return substitution;
            } else {
                return substitution.toString().replace(replaceWhat, replaceWith);
            }
        }
    };
};

var defaults = {
    separator: "",
    conjunction: "",
    serial: false
};

var inlineArrayTransformer = function inlineArrayTransformer() {
    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaults;
    return {
        onSubstitution: function onSubstitution(substitution, resultSoFar) {
            if (Array.isArray(substitution)) {
                var arrayLength = substitution.length;
                var separator = opts.separator;
                var conjunction = opts.conjunction;
                var serial = opts.serial;
                var indent = resultSoFar.match(/(\n?[^\S\n]+)$/);
                if (indent) {
                    substitution = substitution.join(separator + indent[1]);
                } else {
                    substitution = substitution.join(separator + " ");
                }
                if (conjunction && arrayLength > 1) {
                    var separatorIndex = substitution.lastIndexOf(separator);
                    substitution = substitution.slice(0, separatorIndex) + (serial ? separator : "") + " " + conjunction + substitution.slice(separatorIndex + 1);
                }
            }
            return substitution;
        }
    };
};

var splitStringTransformer = function splitStringTransformer(splitBy) {
    return {
        onSubstitution: function onSubstitution(substitution, resultSoFar) {
            {
                if (typeof substitution === "string" && substitution.includes(splitBy)) {
                    substitution = substitution.split(splitBy);
                }
            }
            return substitution;
        }
    };
};

var isValidValue = function isValidValue(x) {
    return x != null && !Number.isNaN(x) && typeof x !== "boolean";
};

var removeNonPrintingValuesTransformer = function removeNonPrintingValuesTransformer() {
    return {
        onSubstitution: function onSubstitution(substitution) {
            if (Array.isArray(substitution)) {
                return substitution.filter(isValidValue);
            }
            if (isValidValue(substitution)) {
                return substitution;
            }
            return "";
        }
    };
};

new TemplateTag(inlineArrayTransformer({
    separator: ","
}), stripIndentTransformer, trimResultTransformer);

new TemplateTag(inlineArrayTransformer({
    separator: ",",
    conjunction: "and"
}), stripIndentTransformer, trimResultTransformer);

new TemplateTag(inlineArrayTransformer({
    separator: ",",
    conjunction: "or"
}), stripIndentTransformer, trimResultTransformer);

new TemplateTag(splitStringTransformer("\n"), removeNonPrintingValuesTransformer, inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);

new TemplateTag(splitStringTransformer("\n"), inlineArrayTransformer, stripIndentTransformer, trimResultTransformer, replaceSubstitutionTransformer(/&/g, "&amp;"), replaceSubstitutionTransformer(/</g, "&lt;"), replaceSubstitutionTransformer(/>/g, "&gt;"), replaceSubstitutionTransformer(/"/g, "&quot;"), replaceSubstitutionTransformer(/'/g, "&#x27;"), replaceSubstitutionTransformer(/`/g, "&#x60;"));

new TemplateTag(replaceResultTransformer(/(?:\n(?:\s*))+/g, " "), trimResultTransformer);

new TemplateTag(replaceResultTransformer(/(?:\n\s*)/g, ""), trimResultTransformer);

new TemplateTag(inlineArrayTransformer({
    separator: ","
}), replaceResultTransformer(/(?:\s+)/g, " "), trimResultTransformer);

new TemplateTag(inlineArrayTransformer({
    separator: ",",
    conjunction: "or"
}), replaceResultTransformer(/(?:\s+)/g, " "), trimResultTransformer);

new TemplateTag(inlineArrayTransformer({
    separator: ",",
    conjunction: "and"
}), replaceResultTransformer(/(?:\s+)/g, " "), trimResultTransformer);

new TemplateTag(inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);

new TemplateTag(inlineArrayTransformer, replaceResultTransformer(/(?:\s+)/g, " "), trimResultTransformer);

var stripIndent = new TemplateTag(stripIndentTransformer, trimResultTransformer);

new TemplateTag(stripIndentTransformer("all"), trimResultTransformer);

let barEl;

let timeId;

function init() {
    const div = create("div");
    div.classList.add("progress");
    div.setAttribute("role", "progressbar");
    div.setAttribute("aria-valuemin", "0");
    div.setAttribute("aria-valuemax", "100");
    div.setAttribute("aria-label", "Loading...");
    appendTo(body, div);
    barEl = div;
}

function progressbar(info) {
    const {loaded: loaded, total: total, step: step} = info;
    let num;
    !barEl && init();
    if (typeof step !== "undefined") {
        num = parseInt(barEl.style.width || 0, 10) + step;
        num = num > 80 ? 80 : num;
    } else {
        num = Math.floor(loaded / total * 100);
    }
    barEl.style.opacity = 1;
    barEl.style.width = num >= 95 ? "100%" : num + "%";
    barEl.setAttribute("aria-valuenow", num >= 95 ? 100 : num);
    if (num >= 95) {
        clearTimeout(timeId);
        timeId = setTimeout((_ => {
            barEl.style.opacity = 0;
            barEl.style.width = "0%";
            barEl.removeAttribute("aria-valuenow");
        }), 200);
    }
}

const cache = {};

function get(url, hasBar = false, headers = {}) {
    const xhr = new XMLHttpRequest;
    const cached = cache[url];
    if (cached) {
        return {
            then: cb => cb(cached.content, cached.opt, cached.response),
            abort: noop
        };
    }
    xhr.open("GET", url);
    for (const i of Object.keys(headers)) {
        xhr.setRequestHeader(i, headers[i]);
    }
    xhr.send();
    return {
        then(success, error = noop) {
            const getResponseStatus = event => ({
                ok: event.target.status >= 200 && event.target.status < 300,
                status: event.target.status,
                statusText: event.target.statusText
            });
            if (hasBar) {
                const id = setInterval((_ => progressbar({
                    step: Math.floor(Math.random() * 5 + 1)
                })), 500);
                xhr.addEventListener("progress", progressbar);
                xhr.addEventListener("loadend", (evt => {
                    progressbar(evt);
                    clearInterval(id);
                }));
            }
            xhr.addEventListener("error", (event => {
                error(event, getResponseStatus(event));
            }));
            xhr.addEventListener("load", (event => {
                const target = event.target;
                if (target.status >= 400) {
                    error(event, getResponseStatus(event));
                } else {
                    if (typeof target.response !== "string") {
                        throw new TypeError("Unsupported content type.");
                    }
                    const result = cache[url] = {
                        content: target.response,
                        opt: {
                            updatedAt: xhr.getResponseHeader("last-modified") ?? ""
                        },
                        response: getResponseStatus(event)
                    };
                    success(result.content, result.opt, result.response);
                }
            }));
        },
        abort: _ => xhr.readyState !== 4 && xhr.abort()
    };
}

const cached = {};

function extractFragmentContent(text, fragment, fullLine) {
    if (!fragment) {
        return text;
    }
    let fragmentRegex = `(?:###|\\/\\/\\/)\\s*\\[${fragment}\\]`;
    const contentRegex = `[\\s\\S]*?`;
    if (fullLine) {
        fragmentRegex = `.*${fragmentRegex}.*\n`;
    }
    const pattern = new RegExp(`(?:${fragmentRegex})(${contentRegex})(?:${fragmentRegex})`);
    const match = text.match(pattern);
    return stripIndent((match || [])[1] || "").trim();
}

function walkFetchEmbed({embedTokens: embedTokens, compile: compile, fetch: fetch, frontMatter: frontMatter}, cb) {
    if (!embedTokens.length) {
        return cb({});
    }
    const processStep = step => {
        const currentToken = embedTokens[step];
        const next = text => {
            let embedToken;
            if (text) {
                if (currentToken.embed.type === "markdown") {
                    let path = currentToken.embed.url.split("/");
                    path.pop();
                    path = path.join("/");
                    text = text.replace(/\[([^[\]]+)\]\(([^)]+)\)/g, (x => {
                        const linkBeginIndex = x.indexOf("(");
                        if (x.slice(linkBeginIndex, linkBeginIndex + 2) === "(.") {
                            return x.substring(0, linkBeginIndex) + `(${window.location.protocol}//${window.location.host}${path}/` + x.substring(linkBeginIndex + 1, x.length - 1) + ")";
                        }
                        return x;
                    }));
                    const frontMatterInstalled = frontMatter?.installed;
                    if (frontMatterInstalled) {
                        text = frontMatter?.parseMarkdown(text);
                    }
                    if (currentToken.embed.fragment) {
                        text = extractFragmentContent(text, currentToken.embed.fragment, currentToken.embed.omitFragmentLine);
                    }
                    embedToken = compile.lexer(text);
                } else if (currentToken.embed.type === "code") {
                    if (currentToken.embed.fragment) {
                        text = extractFragmentContent(text, currentToken.embed.fragment, currentToken.embed.omitFragmentLine);
                    }
                    embedToken = compile.lexer("```" + currentToken.embed.lang + "\n" + text.replace(/`/g, "@DOCSIFY_QM@") + "\n```\n");
                } else if (currentToken.embed.type === "mermaid") {
                    embedToken = [ {
                        type: "html",
                        text: `<div class="mermaid">\n${text}\n</div>`
                    } ];
                    embedToken.links = {};
                } else {
                    embedToken = [ {
                        type: "html",
                        text: text
                    } ];
                    embedToken.links = {};
                }
            }
            cb({
                token: currentToken,
                embedToken: embedToken,
                rowIndex: currentToken.rowIndex,
                cellIndex: currentToken.cellIndex,
                tokenRef: currentToken.tokenRef
            });
            if (step + 1 >= embedTokens.length) {
                cb({});
            } else {
                processStep(step + 1);
            }
        };
        if (currentToken.embed.url) {
            get(currentToken.embed.url).then(next, (() => next()));
        } else {
            next(currentToken.embed.html);
        }
    };
    processStep(0);
}

function prerenderEmbed({compiler: compiler, raw: raw = "", fetch: fetch}, done) {
    const hit = cached[raw];
    if (hit) {
        const copy = hit.slice();
        copy.links = hit.links;
        return done(copy);
    }
    const compile = compiler._marked;
    const frontMatter = compiler.config.frontMatter;
    let tokens = compile.lexer(raw);
    const embedTokens = [];
    const links = tokens.links;
    tokens.forEach(((token, index) => {
        if (token.type === "paragraph") {
            (token.tokens || []).forEach(((inlineToken, inlineIndex) => {
                if (inlineToken.type !== "link") {
                    return;
                }
                const embed = compiler.compileEmbed(inlineToken.href, inlineToken.title);
                if (embed) {
                    embedTokens.push({
                        index: index,
                        tokenRef: token,
                        inlineIndex: inlineIndex,
                        embed: embed
                    });
                }
            }));
        } else if (token.type === "table") {
            token.rows.forEach(((row, rowIndex) => {
                row.forEach(((cell, cellIndex) => {
                    (cell.tokens || []).forEach(((inlineToken, inlineIndex) => {
                        if (inlineToken.type !== "link") {
                            return;
                        }
                        const embed = compiler.compileEmbed(inlineToken.href, inlineToken.title);
                        if (embed) {
                            embedTokens.push({
                                index: index,
                                tokenRef: token,
                                rowIndex: rowIndex,
                                cellIndex: cellIndex,
                                inlineIndex: inlineIndex,
                                embed: embed
                            });
                        }
                    }));
                }));
            }));
        }
    }));
    const moves = [];
    const tokenInsertState = new WeakMap;
    walkFetchEmbed({
        compile: compile,
        embedTokens: embedTokens,
        fetch: fetch,
        frontMatter: frontMatter
    }, (({embedToken: embedToken, token: token, rowIndex: rowIndex, cellIndex: cellIndex, tokenRef: tokenRef}) => {
        if (token && embedToken) {
            Object.assign(links, embedToken.links);
            if (typeof rowIndex === "number" && typeof cellIndex === "number") {
                const cell = tokenRef.rows[rowIndex][cellIndex];
                if (typeof token.inlineIndex === "number") {
                    cell.embedTokenMap ||= {};
                    const existing = cell.embedTokenMap[token.inlineIndex];
                    cell.embedTokenMap[token.inlineIndex] = existing ? existing.concat(embedToken) : embedToken;
                }
                if (cell.embedTokens && cell.embedTokens.length) {
                    cell.embedTokens = cell.embedTokens.concat(embedToken);
                } else {
                    cell.embedTokens = embedToken;
                }
            } else if (tokenRef.type === "paragraph") {
                if (typeof token.inlineIndex === "number") {
                    tokenRef.embedTokenMap ||= {};
                    const existing = tokenRef.embedTokenMap[token.inlineIndex];
                    tokenRef.embedTokenMap[token.inlineIndex] = existing ? existing.concat(embedToken) : embedToken;
                }
                if (tokenRef.embedTokens && tokenRef.embedTokens.length) {
                    tokenRef.embedTokens = tokenRef.embedTokens.concat(embedToken);
                } else {
                    tokenRef.embedTokens = embedToken;
                }
            } else {
                const state = tokenInsertState.get(tokenRef);
                if (state) {
                    const insertAt = state.nextIndex;
                    tokens = tokens.slice(0, insertAt).concat(embedToken, tokens.slice(insertAt));
                    moves.push({
                        start: insertAt,
                        delta: embedToken.length
                    });
                    state.nextIndex = insertAt + embedToken.length;
                } else {
                    let index = token.index;
                    moves.forEach((pos => {
                        if (index > pos.start) {
                            index += pos.delta;
                        }
                    }));
                    tokens = tokens.slice(0, index).concat(embedToken, tokens.slice(index + 1));
                    moves.push({
                        start: index,
                        delta: embedToken.length - 1
                    });
                    tokenInsertState.set(tokenRef, {
                        nextIndex: index + embedToken.length
                    });
                }
            }
        } else if (!token) {
            cached[raw] = tokens.concat();
            tokens.links = cached[raw].links = links;
            done(tokens);
        }
    }));
}

function Render(Base) {
    return class Render extends Base {
        compiler;
        #vueGlobalData;
        #addTextAsTitleAttribute(cssSelector) {
            findAll(cssSelector).forEach((elm => {
                const e = elm;
                if (!e.title && e.innerText) {
                    e.title = e.innerText;
                }
            }));
        }
        #normalizeSidebarPageLinks(sidebarNavEl) {
            findAll(sidebarNavEl, "li > p").forEach((paragraph => {
                const link = paragraph.firstElementChild;
                const onlyContainsLink = [ ...paragraph.childNodes ].every((node => node === link || node.nodeType === 3 && !node.textContent?.trim()));
                if (!paragraph.attributes.length && paragraph.children.length === 1 && link?.tagName === "A" && onlyContainsLink) {
                    paragraph.replaceWith(link);
                }
            }));
        }
        #executeScript() {
            const script = findAll(".markdown-section>script").filter((s => !/template/.test(s.type)))[0];
            if (!script) {
                return false;
            }
            const code = script.innerText.trim();
            if (!code) {
                return false;
            }
            new Function(code)();
        }
        #formatUpdated(html, updated, fn) {
            updated = typeof fn === "function" ? fn(updated) : typeof fn === "string" ? tinydate(fn)(new Date(updated)) : updated;
            return html.replace(/{docsify-updated}/g, updated);
        }
        #renderMain(html) {
            const docsifyConfig = this.config;
            const markdownElm = find(".markdown-section");
            const vueVersion = "Vue" in window && window.Vue.version && Number(window.Vue.version.charAt(0));
            const isMountedVue = elm => {
                const isVue2 = Boolean(elm.__vue__ && elm.__vue__._isVue);
                const isVue3 = Boolean(elm._vnode && elm._vnode.__v_skip);
                return isVue2 || isVue3;
            };
            if ("Vue" in window) {
                const mountedElms = findAll(".markdown-section > *").filter((elm => isMountedVue(elm)));
                for (const mountedElm of mountedElms) {
                    if (vueVersion === 2) {
                        mountedElm.__vue__?.$destroy?.();
                    } else if (vueVersion === 3) {
                        mountedElm.__vue_app__?.unmount();
                    }
                }
            }
            setHTML(markdownElm, html);
            if (docsifyConfig.executeScript || "Vue" in window && docsifyConfig.executeScript !== false) {
                this.#executeScript();
            }
            if ("Vue" in window) {
                const vueGlobalOptions = docsifyConfig.vueGlobalOptions || {};
                const vueMountData = [];
                const vueComponentNames = Object.keys(docsifyConfig.vueComponents || {});
                if (vueVersion === 2 && vueComponentNames.length) {
                    vueComponentNames.forEach((name => {
                        const isNotRegistered = !window.Vue.options.components[name];
                        if (isNotRegistered) {
                            window.Vue.component(name, docsifyConfig.vueComponents[name]);
                        }
                    }));
                }
                if (!this.#vueGlobalData && vueGlobalOptions.data && typeof vueGlobalOptions.data === "function") {
                    this.#vueGlobalData = vueGlobalOptions.data();
                }
                vueMountData.push(...Object.keys(docsifyConfig.vueMounts || {}).map((cssSelector => [ find(markdownElm, cssSelector), docsifyConfig.vueMounts[cssSelector] ])).filter((([elm, vueConfig]) => elm)));
                const reHasBraces = /{{2}[^{}]*}{2}/;
                const reHasDirective = /<[^>/]+\s([@:]|v-)[\w-:.[\]]+[=>\s]/;
                vueMountData.push(...findAll(".markdown-section > *").filter((elm => !vueMountData.some((([e, c]) => e === elm)))).filter((elm => {
                    const selector = vueComponentNames.join(",");
                    const hasComponents = selector ? Boolean(elm.querySelector(selector)) : false;
                    const isVueMount = elm.tagName.toLowerCase() in (docsifyConfig.vueComponents || {}) || hasComponents || reHasBraces.test(elm.outerHTML) || reHasDirective.test(elm.outerHTML);
                    return isVueMount;
                })).map((elm => {
                    const vueConfig = {
                        ...vueGlobalOptions
                    };
                    if (this.#vueGlobalData) {
                        vueConfig.data = () => this.#vueGlobalData;
                    }
                    return [ elm, vueConfig ];
                })));
                if (vueMountData.length === 0) {
                    return;
                }
                for (const [mountElm, vueConfig] of vueMountData) {
                    const isVueAttr = "data-isvue";
                    const isSkipElm = mountElm.matches("pre, :not([v-template]):has(pre), script") || isMountedVue(mountElm) || mountElm.querySelector(`[${isVueAttr}]`);
                    if (!isSkipElm) {
                        mountElm.setAttribute(isVueAttr, "");
                        if (vueVersion === 2) {
                            vueConfig.el = undefined;
                            new window.Vue(vueConfig).$mount(mountElm);
                        } else if (vueVersion === 3) {
                            const app = window.Vue.createApp(vueConfig);
                            vueComponentNames.forEach((name => {
                                const config = docsifyConfig.vueComponents[name];
                                app.component(name, config);
                            }));
                            app.mount(mountElm);
                        }
                    }
                }
            }
        }
        #renderNameLink(vm) {
            const el = getNode(".app-name-link");
            const nameLink = vm.config.nameLink;
            const path = vm.route.path;
            if (!el) {
                return;
            }
            if (isPrimitive(vm.config.nameLink)) {
                el.setAttribute("href", nameLink);
            } else if (typeof nameLink === "object") {
                const match = Object.keys(nameLink).filter((key => path.indexOf(key) > -1))[0];
                el.setAttribute("href", nameLink[match]);
            }
        }
        #renderSkipLink(vm) {
            const {skipLink: skipLink} = vm.config;
            if (skipLink !== false) {
                const el = getNode("#skip-to-content");
                let skipLinkText = typeof skipLink === "string" ? skipLink : "Skip to main content";
                if (skipLink?.constructor === Object) {
                    const matchingPath = Object.keys(skipLink).find((path => vm.route.path.startsWith(path.startsWith("/") ? path : `/${path}`)));
                    const matchingText = matchingPath && skipLink[matchingPath];
                    skipLinkText = matchingText || skipLinkText;
                }
                if (el) {
                    el.innerHTML = skipLinkText;
                } else {
                    const html = `<button type="button" id="skip-to-content" class="primary">${skipLinkText}</button>`;
                    body.insertAdjacentHTML("afterbegin", html);
                }
            }
        }
        _renderSidebar(text) {
            const {collapseSidebarGroups: collapseSidebarGroups, collapsibleSidebarGroups: collapsibleSidebarGroups, maxLevel: maxLevel, subMaxLevel: subMaxLevel, loadSidebar: loadSidebar, hideSidebar: hideSidebar} = this.config;
            const sidebarEl = getNode("aside.sidebar");
            const sidebarNavEl = getNode(".sidebar-nav");
            const sidebarToggleEl = getNode("button.sidebar-toggle");
            if (hideSidebar) {
                sidebarEl?.remove();
                sidebarToggleEl?.remove();
                return null;
            }
            if (!this.compiler) {
                throw new Error("Compiler is not initialized");
            }
            const sidebarGroupStates = new Map(findAll(sidebarNavEl, 'li.group > .group-toggle[role="button"][data-group-id]').map((elm => [ elm.getAttribute("data-group-id"), elm.closest("li")?.classList.contains("collapse") ])));
            setHTML(".sidebar-nav", this.compiler.sidebar(text, maxLevel));
            this.#normalizeSidebarPageLinks(sidebarNavEl);
            sidebarToggleEl.setAttribute("aria-expanded", String(!isMobile()));
            const activeEl = findLinkByHref(sidebarNavEl, this.router.toURL(this.route.path), "a");
            this.#addTextAsTitleAttribute(".sidebar-nav a");
            if (loadSidebar && activeEl) {
                const activeItem = activeEl.closest("li");
                activeItem?.insertAdjacentHTML("beforeend", this.compiler.subSidebar(subMaxLevel) || "");
                if (activeItem?.querySelector(":scope > .app-sub-sidebar")) {
                    activeEl.setAttribute("aria-expanded", "true");
                }
            } else {
                this.compiler.resetToc();
            }
            this._bindEventOnRendered(activeEl);
            const pageLinks = findAll(sidebarNavEl, 'li > a:not(.section-link, [target="_blank"])');
            const pageLinkGroups = findAll(sidebarEl, "li").filter((elm => elm.querySelector(":scope > ul") && !elm.querySelector(":scope > a")));
            pageLinks.forEach((elm => {
                elm.classList.add("page-link");
            }));
            pageLinkGroups.forEach((elm => {
                elm.classList.add("group");
                let groupTitle = [ ...elm.children ].find((child => child.tagName === "P" && !child.querySelector("a")));
                const styledGroupTitle = groupTitle && !groupTitle.children.length ? groupTitle : null;
                if (!groupTitle) {
                    const sublist = [ ...elm.children ].find((child => child.tagName === "UL"));
                    const titleNodes = [];
                    for (const child of elm.childNodes) {
                        if (child === sublist) {
                            break;
                        }
                        titleNodes.push(child);
                    }
                    if (sublist && titleNodes.some((node => node.textContent?.trim()))) {
                        const newGroupTitle = document.createElement("p");
                        titleNodes.forEach((node => newGroupTitle.append(node)));
                        groupTitle = newGroupTitle;
                        elm.insertBefore(newGroupTitle, sublist);
                    }
                }
                styledGroupTitle?.classList.add("group-title");
                const rootList = elm.parentElement;
                if (collapsibleSidebarGroups && groupTitle && rootList?.parentElement === sidebarNavEl) {
                    const groupId = `${[ ...sidebarNavEl.children ].indexOf(rootList)}:${[ ...rootList.children ].indexOf(elm)}`;
                    const isCollapsed = sidebarGroupStates.get(groupId) ?? collapseSidebarGroups;
                    elm.classList.toggle("collapse", isCollapsed);
                    groupTitle.classList.add("group-toggle");
                    groupTitle.setAttribute("data-group-id", groupId);
                    groupTitle.setAttribute("role", "button");
                    groupTitle.setAttribute("tabindex", "0");
                    groupTitle.setAttribute("aria-expanded", String(!isCollapsed));
                }
            }));
        }
        _bindEventOnRendered(activeEl) {
            const {autoHeader: autoHeader} = this.config;
            this.onRender();
            if (autoHeader && activeEl) {
                const main = getNode("#main");
                const hasH1 = main.querySelector("h1");
                if (!hasH1) {
                    const h1HTML = this.compiler.header(activeEl.innerText, 1);
                    const h1Node = create("div", h1HTML).firstElementChild;
                    if (h1Node) {
                        before(main, h1Node);
                    }
                }
            }
        }
        _renderNav(text) {
            if (!text) {
                return;
            }
            const html = this.compiler.compile(text);
            [ ".app-nav", ".app-nav-merged" ].forEach((selector => {
                setHTML(selector, html);
                if (this.config.navbarPreservePath) {
                    this.#appendNavbarPath(selector);
                }
                this.#addTextAsTitleAttribute(`${selector} a`);
            }));
        }
        #appendNavbarPath(selector) {
            const nav = find(selector);
            if (!nav) {
                return;
            }
            const links = findAll(nav, "a").reduce(((links, link) => {
                const anchor = link;
                const href = anchor.getAttribute("href");
                if (!href || isExternal(anchor.href) || href.startsWith("#") && !href.startsWith("#/")) {
                    return links;
                }
                const route = this.router.parse(href);
                const path = cleanPath(`/${route.path}`);
                if (route.query.id || path !== "/" && !path.endsWith("/")) {
                    return links;
                }
                links.push({
                    link: anchor,
                    path: path,
                    query: route.query
                });
                return links;
            }), []);
            const currentPath = cleanPath(`/${this.route.path}`);
            const currentRoot = links.filter((({path: path}) => currentPath.startsWith(path))).sort(((a, b) => b.path.length - a.path.length))[0];
            if (!currentRoot) {
                return;
            }
            const suffix = currentPath.slice(currentRoot.path.length);
            links.forEach((({link: link, path: path, query: query}) => {
                link.setAttribute("href", this.router.toURL(`${path}${suffix}`, query));
            }));
        }
        _renderMain(text, opt = {}, next) {
            const {response: response} = this.route;
            if (response && !response.ok && (!text || response.status !== 404)) {
                text = `# ${response.status} - ${response.statusText}`;
            }
            this.callHook("beforeEach", text, (result => {
                let html;
                const callback = () => {
                    if (opt.updatedAt) {
                        html = this.#formatUpdated(html, opt.updatedAt, this.config.formatUpdated);
                    }
                    this.callHook("afterEach", html, (hookData => {
                        this.#renderMain(hookData);
                        next();
                    }));
                };
                if (this.isHTML) {
                    html = this.result = text;
                    callback();
                } else {
                    prerenderEmbed({
                        compiler: this.compiler,
                        raw: result,
                        fetch: undefined
                    }, (tokens => {
                        html = this.compiler.compile(tokens);
                        callback();
                    }));
                }
            }));
        }
        _renderCover(text, coverOnly) {
            const el = getNode(".cover");
            const rootElm = document.documentElement;
            const coverBg = getComputedStyle(rootElm).getPropertyValue("--cover-bg");
            getNode("main").classList[coverOnly ? "add" : "remove"]("hidden");
            if (!text) {
                el.classList.remove("show");
                return;
            }
            el.classList.add("show");
            let html = this.coverIsHTML ? text : this.compiler.cover(text);
            if (!coverBg) {
                const mdBgMatch = html.trim().match('<p><img.*?data-origin="(.*?)".*?alt="(.*?)"[^>]*?>([^<]*?)</p>$');
                let mdCoverBg;
                if (mdBgMatch) {
                    const [bgMatch, bgValue, bgType] = mdBgMatch;
                    if (bgType === "color") {
                        mdCoverBg = bgValue;
                    } else {
                        const path = !isAbsolutePath(bgValue) ? getPath(this.router.getBasePath(), bgValue) : bgValue;
                        mdCoverBg = `center center / cover url(${path})`;
                    }
                    html = html.replace(bgMatch, "");
                } else {
                    const degrees = Math.round(Math.random() * 120 / 2);
                    let hue1 = Math.round(Math.random() * 360);
                    let hue2 = Math.round(Math.random() * 360);
                    if (Math.abs(hue1 - hue2) < 50) {
                        const hueShift = Math.round(Math.random() * 25) + 25;
                        hue1 = Math.max(hue1, hue2) + hueShift;
                        hue2 = Math.min(hue1, hue2) - hueShift;
                    }
                    if (window?.CSS?.supports("color", "oklch(0 0 0 / 1%)")) {
                        const l = 90;
                        const c = 20;
                        mdCoverBg = `linear-gradient(\n              ${degrees}deg,\n              oklch(${l}% ${c}% ${hue1}) 0%,\n              oklch(${l}% ${c}% ${hue2}) 100%\n            )`.replace(/\s+/g, " ");
                    } else {
                        const s = 100;
                        const l = 85;
                        const o = 100;
                        mdCoverBg = `linear-gradient(\n              ${degrees}deg,\n              hsl(${hue1} ${s}% ${l}% / ${o}%) 0%,\n              hsl(${hue2} ${s}% ${l}% / ${o}%) 100%\n            )`.replace(/\s+/g, " ");
                    }
                }
                rootElm.style.setProperty("--cover-bg", mdCoverBg);
            }
            setHTML(".cover-main", html);
            findAll(".cover-main > p:last-of-type > a:not([class])").forEach((elm => {
                const buttonType = elm.matches(":first-child") ? "primary" : "secondary";
                elm.classList.add("button", buttonType);
            }));
        }
        _updateRender() {
            this.#renderNameLink(this);
            this.#renderSkipLink(this);
        }
        initRender() {
            const config = this.config;
            this.compiler = new Compiler(config, this.router);
            window.__current_docsify_compiler__ = this.compiler;
            const id = config.el || "#app";
            const el = find(id);
            if (el) {
                let html = "";
                if (config.repo) {
                    html += corner(config.repo, config.cornerExternalLinkTarget);
                }
                if (config.coverpage) {
                    html += cover();
                }
                if (config.logo) {
                    const isBase64 = /^data:image/.test(config.logo);
                    const isExternal = /(?:http[s]?:)?\/\//.test(config.logo);
                    const isRelative = /^\./.test(config.logo);
                    if (!isBase64 && !isExternal && !isRelative) {
                        config.logo = getPath(this.router.getBasePath(), config.logo);
                    }
                }
                html += main(config);
                setHTML(el, html, true);
            } else {
                this.rendered = true;
            }
            if (config.loadNavbar) {
                const navEl = find("nav") || create("nav");
                const isMergedSidebar = config.mergeNavbar;
                navEl.classList.add("app-nav");
                navEl.setAttribute("aria-label", "secondary");
                body.prepend(navEl);
                if (isMergedSidebar) {
                    const mergedNavEl = create("div");
                    const sidebarEl = find(".sidebar");
                    const sidebarNavEl = find(".sidebar-nav");
                    mergedNavEl?.classList.add("app-nav-merged");
                    sidebarEl?.insertBefore(mergedNavEl, sidebarNavEl);
                }
            }
            if (config.themeColor) {
                const themeNode = create("div", theme(config.themeColor)).firstElementChild;
                if (themeNode) {
                    $$1.head.appendChild(themeNode);
                }
            }
            this._updateRender();
            body.classList.add("ready");
        }
    };
}

function Fetch(Base) {
    return class Fetch extends Base {
        #loadNested(path, qs, file, next, vm, first) {
            path = first ? path : path.replace(/\/$/, "");
            path = getParentPath(path);
            if (!path) {
                next("");
                return;
            }
            get(vm.router.getFile(path + file) + qs, false, vm.config.requestHeaders).then(next, (_error => this.#loadNested(path, qs, file, next, vm)));
        }
        #last;
        #abort=() => this.#last && this.#last.abort && this.#last.abort();
        #request=(url, requestHeaders) => {
            this.#abort();
            this.#last = get(url, true, requestHeaders);
            return this.#last;
        };
        #get404Path=(path, config) => {
            const {notFoundPage: notFoundPage, ext: ext} = config;
            const defaultPath = "_404" + (ext || ".md");
            let key;
            let path404;
            switch (typeof notFoundPage) {
              case "boolean":
                path404 = defaultPath;
                break;

              case "string":
                path404 = notFoundPage;
                break;

              case "object":
                key = Object.keys(notFoundPage).sort(((a, b) => b.length - a.length)).filter((k => path.match(new RegExp("^" + k))))[0];
                path404 = key && notFoundPage[key] || defaultPath;
                break;
            }
            return path404;
        };
        _loadSideAndNav(path, qs, loadSidebar, cb) {
            return () => {
                const renderSidebar = result => {
                    this._renderSidebar(result);
                    cb();
                };
                if (!loadSidebar) {
                    renderSidebar(null);
                    return;
                }
                this.#loadNested(path, qs, loadSidebar, renderSidebar, this, true);
            };
        }
        _fetch(cb = noop) {
            const {query: query} = this.route;
            const {path: path} = this.route;
            if (isExternal(path)) {
                history.replaceState(null, "", "#");
                this.router.normalize();
            } else {
                const qs = stringifyQuery(query, [ "id" ]);
                const {loadNavbar: loadNavbar, requestHeaders: requestHeaders, loadSidebar: loadSidebar} = this.config;
                const file = this.router.getFile(path);
                this.isRemoteUrl = isExternal(file);
                this.isHTML = /\.html$/g.test(file);
                const contentFetched = (text, opt, response) => {
                    this.route.response = response;
                    this._renderMain(text, opt, this._loadSideAndNav(path, qs, loadSidebar, cb));
                };
                const contentFailedToFetch = (_error, response) => {
                    this.route.response = response;
                    this._fetchFallbackPage(path, qs, cb) || this._fetch404(file, qs, cb);
                };
                if (!this.isRemoteUrl) {
                    this.matchVirtualRoute(path).then((contents => {
                        if (typeof contents === "string") {
                            contentFetched(contents);
                        } else {
                            this.#request(file + qs, requestHeaders).then(contentFetched, contentFailedToFetch);
                        }
                    }));
                } else {
                    this.#request(file + qs, requestHeaders).then(contentFetched, contentFailedToFetch);
                }
                loadNavbar && this.#loadNested(path, qs, loadNavbar, (text => this._renderNav(text)), this, true);
            }
        }
        _fetchCover() {
            const {coverpage: coverpage, requestHeaders: requestHeaders} = this.config;
            const query = this.route.query;
            const root = getParentPath(this.route.path);
            if (coverpage) {
                let path = null;
                const routePath = this.route.path;
                if (typeof coverpage === "string") {
                    if (routePath === "/") {
                        path = coverpage;
                    }
                } else if (Array.isArray(coverpage)) {
                    path = coverpage.indexOf(routePath) > -1 && "_coverpage";
                } else {
                    const cover = coverpage[routePath];
                    path = cover === true ? "_coverpage" : cover;
                }
                const coverOnly = Boolean(path) && this.config.onlyCover;
                if (path) {
                    path = this.router.getFile(root + path);
                    this.coverIsHTML = /\.html$/g.test(path);
                    get(path + stringifyQuery(query, [ "id" ]), false, requestHeaders).then((text => this._renderCover(text, coverOnly)));
                } else {
                    this._renderCover(null, coverOnly);
                }
                return coverOnly;
            }
        }
        $fetch(cb = noop, onNavigate = this.onNavigate.bind(this)) {
            const done = () => {
                this.callHook("doneEach");
                cb();
            };
            const onlyCover = this._fetchCover();
            if (onlyCover) {
                done();
            } else {
                this._fetch((() => {
                    onNavigate();
                    done();
                }));
            }
        }
        _fetchFallbackPage(path, qs, cb = noop) {
            const {requestHeaders: requestHeaders, fallbackLanguages: fallbackLanguages, fallbackDefaultLanguage: fallbackDefaultLanguage, loadSidebar: loadSidebar} = this.config;
            if (!fallbackLanguages) {
                return false;
            }
            const local = path.split("/")[1];
            if (fallbackLanguages.indexOf(local) === -1) {
                return false;
            }
            const newPath = this.router.getFile(path.replace(new RegExp(`^/${local}`), fallbackDefaultLanguage));
            const req = this.#request(newPath + qs, requestHeaders);
            req.then(((text, opt) => this._renderMain(text, opt, this._loadSideAndNav(path, qs, loadSidebar, cb))), (_error => this._fetch404(path, qs, cb)));
            return true;
        }
        _fetch404(path, qs, cb = noop) {
            const {loadSidebar: loadSidebar, requestHeaders: requestHeaders, notFoundPage: notFoundPage} = this.config;
            const fnLoadSideAndNav = this._loadSideAndNav(path, qs, loadSidebar, cb);
            if (notFoundPage) {
                const path404 = this.#get404Path(path, this.config);
                this.#request(this.router.getFile(path404), requestHeaders).then(((text, opt) => this._renderMain(text, opt, fnLoadSideAndNav)), (_error => this._renderMain(null, {}, fnLoadSideAndNav)));
                return true;
            }
            this._renderMain(null, {}, fnLoadSideAndNav);
            return false;
        }
        initFetch() {
            this.$fetch((() => this.callHook("ready")));
        }
    };
}

function Events(Base) {
    return class Events extends Base {
        #intersectionObserver=new IntersectionObserver((() => {}));
        #isScrolling=false;
        #cancelAnchorScroll=noop;
        #title=$$1.title;
        initEvent() {
            const {topMargin: topMargin} = this.config;
            if (topMargin) {
                const value = typeof topMargin === "number" ? `${topMargin}px` : topMargin;
                document.documentElement.style.setProperty("--scroll-padding-top", value);
            }
            this.#initCover();
            this.#initSkipToContent();
            this.#initSidebar();
            this.#initSidebarToggle();
            this.#initKeyBindings();
        }
        #initCover() {
            const coverElm = find("section.cover");
            if (!coverElm) {
                body.classList.add("sticky");
                return;
            }
            const observer = new IntersectionObserver((entries => {
                const isIntersecting = entries[0].isIntersecting;
                const op = isIntersecting ? "remove" : "add";
                body.classList[op]("sticky");
            }), {
                threshold: .01
            });
            observer.observe(coverElm);
        }
        #initHeadings() {
            const headingElms = findAll("#main :where(h1, h2, h3, h4, h5, h6)");
            const headingsInView = new Set;
            let isInitialLoad = true;
            this.#intersectionObserver?.disconnect();
            this.#intersectionObserver = new IntersectionObserver((entries => {
                if (isInitialLoad) {
                    isInitialLoad = false;
                    return;
                }
                if (this.#isScrolling) {
                    return;
                }
                for (const entry of entries) {
                    const op = entry.isIntersecting ? "add" : "delete";
                    headingsInView[op](entry.target);
                }
                let activeHeading;
                if (headingsInView.size === 1) {
                    activeHeading = headingsInView.values().next().value;
                } else if (headingsInView.size > 1) {
                    activeHeading = Array.from(headingsInView).reduce(((closest, current) => !closest || closest.compareDocumentPosition(current) & Node.DOCUMENT_POSITION_FOLLOWING ? current : closest), null);
                }
                if (activeHeading) {
                    const id = activeHeading.getAttribute("id");
                    const href = this.router.toURL(this.router.getCurrentPath(), {
                        id: id
                    });
                    const newSidebarActiveElm = this.#markSidebarActiveElm(href);
                    newSidebarActiveElm?.scrollIntoView({
                        behavior: "instant",
                        block: "nearest",
                        inline: "nearest"
                    });
                }
            }), {
                rootMargin: "0% 0% -50% 0%"
            });
            headingElms.forEach((elm => {
                this.#intersectionObserver.observe(elm);
            }));
        }
        #initKeyBindings() {
            const {keyBindings: keyBindings} = this.config;
            const modifierKeys = [ "alt", "ctrl", "meta", "shift" ];
            if (keyBindings && keyBindings.constructor === Object) {
                Object.values(keyBindings || []).forEach((bindingConfig => {
                    const {bindings: bindings} = bindingConfig;
                    if (!bindings) {
                        return;
                    }
                    bindingConfig.bindings = Array.isArray(bindings) ? bindings : [ bindings ];
                    bindingConfig.bindings = bindingConfig.bindings.map((keys => {
                        const sortedKeys = [ [], [] ];
                        if (typeof keys === "string") {
                            keys = keys.split("+");
                        }
                        keys.forEach((key => {
                            const isModifierKey = modifierKeys.includes(key);
                            const targetArray = sortedKeys[isModifierKey ? 0 : 1];
                            const newKeyValue = key.trim().toLowerCase();
                            targetArray.push(newKeyValue);
                        }));
                        sortedKeys.forEach((arr => arr.sort()));
                        return sortedKeys.flat();
                    }));
                }));
                on("keydown", (e => {
                    const isTextEntry = document.activeElement.matches("input, select, textarea");
                    if (isTextEntry) {
                        return;
                    }
                    const bindingConfigs = Object.values(keyBindings || []);
                    const matchingConfigs = bindingConfigs.filter((({bindings: bindings}) => bindings && bindings.some((keys => keys.every((k => modifierKeys.includes(k) && e[k + "Key"] || e.key === k || e.code.toLowerCase() === k || e.code.toLowerCase() === `key${k}`))))));
                    matchingConfigs.forEach((({callback: callback}) => {
                        e.preventDefault();
                        callback(e);
                    }));
                }));
            }
        }
        #initSidebar() {
            const sidebarElm = document.querySelector(".sidebar");
            if (!sidebarElm) {
                return;
            }
            window?.matchMedia?.(`(max-width: ${mobileBreakpoint})`).addEventListener("change", (evt => {
                this.#toggleSidebar(!evt.matches);
            }));
            on(sidebarElm, "click", (({target: target}) => {
                const groupToggle = target.closest('.group-toggle[role="button"]');
                if (groupToggle) {
                    this.#toggleSidebarGroup(groupToggle);
                    return;
                }
                const linkElm = target.closest("a");
                const linkParent = linkElm?.closest("li");
                const hasSubSidebar = linkParent?.querySelector(".app-sub-sidebar");
                if (hasSubSidebar) {
                    const isCollapsed = linkParent.classList.toggle("collapse");
                    linkElm?.setAttribute("aria-expanded", String(!isCollapsed));
                }
            }));
            on(sidebarElm, "keydown", (event => {
                const groupToggle = event.target.closest('.group-toggle[role="button"]');
                if (groupToggle && (event.key === "Enter" || event.key === " ")) {
                    event.preventDefault();
                    this.#toggleSidebarGroup(groupToggle);
                }
            }));
        }
        #toggleSidebarGroup(groupToggle) {
            const group = groupToggle.closest("li");
            if (!group) {
                return;
            }
            const isCollapsed = group.classList.toggle("collapse");
            groupToggle.setAttribute("aria-expanded", String(!isCollapsed));
        }
        #initSidebarToggle() {
            const contentElm = find("main > .content");
            const toggleElm = find("button.sidebar-toggle");
            if (!toggleElm) {
                return;
            }
            let lastContentFocusElm;
            on(contentElm, "focusin", (e => {
                const focusAttr = "data-restore-focus";
                lastContentFocusElm?.removeAttribute(focusAttr);
                lastContentFocusElm = e.target;
                lastContentFocusElm.setAttribute(focusAttr, "");
            }));
            on(toggleElm, "click", (e => {
                e.stopPropagation();
                this.#toggleSidebar();
            }));
        }
        #initSkipToContent() {
            const skipElm = document.querySelector("#skip-to-content");
            if (!skipElm) {
                return;
            }
            skipElm.addEventListener("click", (evt => {
                const focusElm = this.#focusContent();
                evt.preventDefault();
                focusElm?.scrollIntoView({
                    behavior: "smooth"
                });
            }));
        }
        onRender() {
            const {name: name, pageTitleFormatter: pageTitleFormatter} = this.config;
            const currentPath = this.router.toURL(this.router.getCurrentPath());
            const currentSection = find(`.sidebar a[href='${currentPath}']`)?.getAttribute("title");
            const plainName = typeof pageTitleFormatter === "function" && typeof name === "string" ? pageTitleFormatter(name) : name ? name.replace(/<[^>]+>/g, "").trim() : name;
            const currentTitle = plainName ? currentSection ? `${currentSection} - ${plainName}` : plainName : currentSection;
            $$1.title = currentTitle || this.#title;
            this.#markAppNavActiveElm();
            this.#markSidebarCurrentPage();
            this.#initHeadings();
        }
        onNavigate(source, focusTarget) {
            const {auto2top: auto2top, topMargin: topMargin} = this.config;
            const {path: path, query: query} = this.route;
            const activeSidebarElm = this.#markSidebarActiveElm();
            if (source !== "history") {
                if (query.id) {
                    const headingElm = find(`.markdown-section :where(h1, h2, h3, h4, h5, h6)[id="${query.id}"]`);
                    if (headingElm) {
                        this.#scrollToHeading(headingElm);
                    }
                } else if (source === "navigate") {
                    if (auto2top) {
                        document.scrollingElement.scrollTop = topMargin ?? 0;
                    }
                }
            }
            const isNavigate = source === "navigate";
            const hasId = "id" in query;
            const noSubSidebar = !activeSidebarElm?.querySelector(".app-sub-sidebar");
            const shouldCloseSidebar = path === "/" || isNavigate && (hasId || noSubSidebar);
            if (shouldCloseSidebar && isMobile()) {
                this.#toggleSidebar(false);
            }
            if (hasId || isNavigate) {
                const sidebarFocused = isNavigate && this.#focusSidebarNavigation(focusTarget);
                if (!sidebarFocused) {
                    this.#focusContent();
                }
            }
        }
        #focusContent(options = {}) {
            const settings = {
                preventScroll: true,
                ...options
            };
            const {query: query} = this.route;
            const focusEl = query.id ? find(`#${query.id}`) : find("#main :where(h1, h2, h3, h4, h5, h6)") || find("#main");
            if (focusEl) {
                if (!focusEl.hasAttribute("tabindex")) {
                    focusEl.setAttribute("tabindex", "-1");
                    focusEl.setAttribute("data-added-tabindex", "true");
                }
                if (focusEl.hasAttribute("data-added-tabindex")) {
                    focusEl.scrollIntoView({
                        behavior: "smooth"
                    });
                }
                focusEl.focus(settings);
            }
            return focusEl;
        }
        #focusSidebarNavigation(target) {
            if (!target || isMobile()) {
                return false;
            }
            const sidebarElm = find(".sidebar");
            if (!sidebarElm) {
                return false;
            }
            const focusElm = findAll(sidebarElm, "a").find((linkElm => linkElm.classList.contains(target.className) && linkElm.href === target.href));
            if (!focusElm) {
                return false;
            }
            focusElm.focus({
                preventScroll: true
            });
            return true;
        }
        #markAppNavActiveElm() {
            const href = resolveHref(this.router.toURL(this.route.path));
            [ ".app-nav", ".app-nav-merged" ].forEach((selector => {
                const navElm = find(selector);
                if (!navElm) {
                    return;
                }
                const newActive = findAll(navElm, "a").sort(((a, b) => b.href.length - a.href.length)).find((a => href.includes(a.href)))?.closest("li");
                const oldActive = find(navElm, "li.active");
                if (newActive && newActive !== oldActive) {
                    oldActive?.classList.remove("active");
                    newActive.classList.add("active");
                }
            }));
        }
        #markSidebarActiveElm(href) {
            href ??= this.router.toURL(this.router.getCurrentPath());
            const sidebar = find(".sidebar");
            if (!sidebar) {
                return;
            }
            const matchingHref = stripUrlExceptId(href);
            const oldActive = find(sidebar, "li.active");
            const newActive = findLinkByHref(sidebar, matchingHref, ".sidebar-nav a")?.closest("li");
            if (newActive && newActive !== oldActive) {
                oldActive?.classList.remove("active");
                newActive.classList.add("active");
            }
            return newActive;
        }
        #markSidebarCurrentPage(href) {
            href ??= this.router.toURL(this.route.path);
            const sidebar = find(".sidebar");
            if (!sidebar) {
                return;
            }
            const path = href?.split("?")[0];
            const oldPage = find(sidebar, "li[aria-current]");
            const newPage = path ? findLinkByHref(sidebar, path, ".sidebar-nav a")?.closest("li") : undefined;
            if (newPage && newPage !== oldPage) {
                oldPage?.removeAttribute("aria-current");
                newPage.setAttribute("aria-current", "page");
            }
            return newPage;
        }
        #toggleSidebar(force) {
            const sidebarElm = find(".sidebar");
            if (!sidebarElm) {
                return;
            }
            const ariaElms = findAll('[aria-controls="__sidebar"]');
            const inertElms = findAll("body > *:not(main, script), main > .content");
            const isShow = sidebarElm.classList.toggle("show", force);
            ariaElms.forEach((toggleElm => {
                const expanded = force ?? sidebarElm.classList.contains("show");
                toggleElm.setAttribute("aria-expanded", String(expanded));
                toggleElm.setAttribute("aria-label", expanded ? "Hide primary navigation" : "Show primary navigation");
            }));
            if (isShow && isMobile()) {
                inertElms.forEach((elm => elm.setAttribute("inert", "")));
            } else {
                inertElms.forEach((elm => elm.removeAttribute("inert")));
            }
            if (isShow) {
                sidebarElm.focus();
            } else {
                const restoreElm = document.querySelector("main > .content [data-restore-focus]");
                if (restoreElm) {
                    restoreElm.focus({
                        preventScroll: true
                    });
                }
            }
        }
        #scrollToHeading(headingElm) {
            this.#cancelAnchorScroll();
            const contentElm = find(".markdown-section");
            const userEvents = [ "keydown", "mousedown", "touchstart", "wheel" ];
            const timers = {};
            let animationFrame = 0;
            let correctionFrame = 0;
            let cancelled = false;
            let cancel = noop;
            let hasScrolled = false;
            let scrollScheduled = false;
            let remainingImages = 0;
            let cleanup = () => {};
            const imageListeners = [];
            const pendingImageCorrections = [];
            const removeUserListeners = () => {
                userEvents.forEach((eventName => {
                    window.removeEventListener(eventName, cancel);
                }));
            };
            const removeImageListeners = () => {
                imageListeners.forEach((({image: image, eventName: eventName, listener: listener}) => {
                    image.removeEventListener(eventName, listener);
                }));
                imageListeners.length = 0;
            };
            const scrollToHeading = () => {
                if (cancelled) {
                    return;
                }
                if (!document.contains(headingElm)) {
                    cancel();
                    return;
                }
                hasScrolled = true;
                this.#watchNextScroll();
                headingElm.scrollIntoView({
                    behavior: "smooth",
                    block: "start"
                });
                if (remainingImages === 0) {
                    cleanup();
                }
            };
            const scheduleScroll = () => {
                if (hasScrolled || scrollScheduled) {
                    return;
                }
                scrollScheduled = true;
                clearTimeout(timers.wait);
                animationFrame = requestAnimationFrame(scrollToHeading);
            };
            const scheduleCorrection = (image, previousHeight) => {
                if (cancelled || !hasScrolled) {
                    return;
                }
                pendingImageCorrections.push({
                    image: image,
                    previousHeight: previousHeight
                });
                if (correctionFrame) {
                    return;
                }
                correctionFrame = requestAnimationFrame((() => {
                    correctionFrame = 0;
                    if (cancelled) {
                        return;
                    }
                    if (!document.contains(headingElm)) {
                        cleanup();
                        return;
                    }
                    let heightChange = 0;
                    for (const {image: image, previousHeight: previousHeight} of pendingImageCorrections) {
                        const isBeforeHeading = image.compareDocumentPosition(headingElm) & Node.DOCUMENT_POSITION_FOLLOWING;
                        const currentHeight = image.getBoundingClientRect().height;
                        if (isBeforeHeading) {
                            heightChange += currentHeight - previousHeight;
                        }
                    }
                    pendingImageCorrections.length = 0;
                    if (Math.abs(heightChange) < 1) {
                        if (remainingImages === 0) {
                            cleanup();
                        }
                        return;
                    }
                    const scrollingElm = document.scrollingElement;
                    if (!scrollingElm) {
                        cleanup();
                        return;
                    }
                    const scrollPaddingTop = parseFloat(getComputedStyle(scrollingElm).scrollPaddingTop) || 0;
                    const headingTop = headingElm.getBoundingClientRect().top;
                    const scrollAdjustment = headingTop - scrollPaddingTop;
                    if (Math.abs(scrollAdjustment) < 1) {
                        if (remainingImages === 0) {
                            cleanup();
                        }
                        return;
                    }
                    this.#watchNextScroll();
                    scrollingElm.scrollTop += scrollAdjustment;
                    if (remainingImages === 0) {
                        cleanup();
                    }
                }));
            };
            cleanup = () => {
                if (cancelled) {
                    return;
                }
                cancelled = true;
                cancelAnimationFrame(animationFrame);
                cancelAnimationFrame(correctionFrame);
                clearTimeout(timers.wait);
                removeImageListeners();
                removeUserListeners();
                this.#cancelAnchorScroll = noop;
            };
            cancel = cleanup;
            const waitForImages = () => {
                const images = (contentElm ? Array.from(contentElm.querySelectorAll("img")) : []).filter((image => !image.complete && image.compareDocumentPosition(headingElm) & Node.DOCUMENT_POSITION_FOLLOWING));
                if (!images.length) {
                    scheduleScroll();
                    return;
                }
                remainingImages = images.length;
                const onImageSettled = (image, previousHeight) => {
                    remainingImages -= 1;
                    if (hasScrolled) {
                        scheduleCorrection(image, previousHeight);
                    } else if (remainingImages === 0) {
                        scheduleScroll();
                    }
                    if (remainingImages === 0 && hasScrolled && !correctionFrame) {
                        cleanup();
                    }
                };
                images.forEach((image => {
                    let settled = false;
                    const previousHeight = image.getBoundingClientRect().height;
                    const listener = () => {
                        if (settled) {
                            return;
                        }
                        settled = true;
                        onImageSettled(image, previousHeight);
                    };
                    image.addEventListener("load", listener, {
                        once: true
                    });
                    image.addEventListener("error", listener, {
                        once: true
                    });
                    imageListeners.push({
                        image: image,
                        eventName: "load",
                        listener: listener
                    }, {
                        image: image,
                        eventName: "error",
                        listener: listener
                    });
                }));
                timers.wait = setTimeout(scheduleScroll, 300);
            };
            userEvents.forEach((eventName => {
                window.addEventListener(eventName, cancel, {
                    once: true,
                    passive: true
                });
            }));
            waitForImages();
            this.#cancelAnchorScroll = cancel;
        }
        #watchNextScroll() {
            document.addEventListener("scroll", (() => {
                this.#isScrolling = true;
                if ("onscrollend" in window) {
                    document.addEventListener("scrollend", (() => this.#isScrolling = false), {
                        once: true
                    });
                } else {
                    let scrollTimer;
                    const callback = () => {
                        clearTimeout(scrollTimer);
                        scrollTimer = setTimeout((() => {
                            document.removeEventListener("scroll", callback);
                            this.#isScrolling = false;
                        }), 100);
                    };
                    document.addEventListener("scroll", callback, false);
                    callback();
                }
            }), {
                once: true
            });
        }
    };
}

function makeExactMatcher(matcher) {
    const matcherWithBeginningOfInput = matcher.startsWith("^") ? matcher : `^${matcher}`;
    const matcherWithBeginningAndEndOfInput = matcherWithBeginningOfInput.endsWith("$") ? matcherWithBeginningOfInput : `${matcherWithBeginningOfInput}$`;
    return matcherWithBeginningAndEndOfInput;
}

function createNextFunction() {
    let storedCb = () => {};
    function next(value) {
        storedCb(value);
    }
    function onNext(cb) {
        storedCb = cb;
    }
    return [ next, onNext ];
}

function VirtualRoutes(Base) {
    return class VirtualRoutes extends Base {
        routes() {
            return this.config.routes || {};
        }
        matchVirtualRoute(path) {
            const virtualRoutes = this.routes();
            const virtualRoutePaths = Object.keys(virtualRoutes);
            let done = () => null;
            function asyncMatchNextRoute() {
                const virtualRoutePath = virtualRoutePaths.shift();
                if (!virtualRoutePath) {
                    return done(null);
                }
                const matcher = makeExactMatcher(virtualRoutePath);
                const matched = path.match(matcher);
                if (!matched) {
                    return asyncMatchNextRoute();
                }
                const virtualRouteContentOrFn = virtualRoutes[virtualRoutePath];
                if (typeof virtualRouteContentOrFn === "string") {
                    const contents = virtualRouteContentOrFn;
                    return done(contents);
                }
                if (typeof virtualRouteContentOrFn === "function") {
                    const fn = virtualRouteContentOrFn;
                    const [next, onNext] = createNextFunction();
                    onNext((contents => {
                        if (typeof contents === "string") {
                            return done(contents);
                        } else if (contents === false) {
                            return done(null);
                        } else {
                            return asyncMatchNextRoute();
                        }
                    }));
                    if (fn.length <= 2) {
                        const returnedValue = fn(path, matched);
                        return next(returnedValue);
                    } else {
                        return fn(path, matched, next);
                    }
                }
                return asyncMatchNextRoute();
            }
            return {
                then(cb) {
                    done = cb;
                    asyncMatchNextRoute();
                }
            };
        }
    };
}

const currentScript = document.currentScript;

const defaultDocsifyConfig = () => ({
    alias: {},
    auto2top: false,
    autoHeader: false,
    basePath: "",
    catchPluginErrors: true,
    collapseSidebarGroups: false,
    collapsibleSidebarGroups: false,
    cornerExternalLinkTarget: "_blank",
    coverpage: "",
    el: "#app",
    executeScript: null,
    ext: ".md",
    externalLinkRel: "noopener",
    externalLinkTarget: "_blank",
    fallbackLanguages: null,
    fallbackDefaultLanguage: "",
    formatUpdated: "",
    pageTitleFormatter: null,
    frontMatter: null,
    hideSidebar: false,
    homepage: "README.md",
    keyBindings: {},
    loadNavbar: null,
    loadSidebar: null,
    logo: false,
    markdown: null,
    maxLevel: 6,
    mergeNavbar: false,
    navbarPreservePath: false,
    name: "",
    nameLink: window.location.pathname,
    nativeEmoji: false,
    noCompileLinks: [],
    noEmoji: false,
    notFoundPage: false,
    onlyCover: false,
    plugins: [],
    relativePath: false,
    repo: "",
    requestHeaders: {},
    routerMode: "hash",
    routes: {},
    skipLink: "Skip to main content",
    sidebarPosition: "left",
    subMaxLevel: 0,
    vueComponents: {},
    vueGlobalOptions: {},
    vueMounts: {},
    get themeColor() {
        return this.__themeColor;
    },
    set themeColor(value) {
        if (value) {
            this.__themeColor = value;
            console.warn(stripIndent(`\n          $docsify.themeColor is deprecated as of v5. Use the "--theme-color" CSS property to customize your theme color.\n          <style>\n            :root {\n              --theme-color: deeppink;\n            }\n          </style>\n        `).trim());
        }
    },
    __themeColor: "",
    get topMargin() {
        return this.__topMargin;
    },
    set topMargin(value) {
        if (value) {
            this.__topMargin = value;
            console.warn(stripIndent(`\n          $docsify.topMargin is deprecated as of v5. Use the "--scroll-padding-top" CSS property to specify a scroll margin when using a sticky navbar.\n          <style>\n            :root {\n              --scroll-padding-top: 10px;\n            }\n          </style>\n        `).trim());
        }
    },
    __topMargin: 0
});

function config(vm, config = {}) {
    config = Object.assign(defaultDocsifyConfig(), window.$docsify, typeof window.$docsify === "function" ? window.$docsify(vm) : undefined, config);
    if (config.keyBindings !== false) {
        config.keyBindings = Object.assign({
            toggleSidebar: {
                bindings: [ "\\" ],
                callback(e) {
                    const toggleElm = document.querySelector(".sidebar-toggle-button");
                    if (toggleElm) {
                        toggleElm.click();
                    }
                }
            }
        }, config.keyBindings);
    }
    const script = currentScript || Array.from(document.getElementsByTagName("script")).filter((n => /docsify\./.test(n.src)))[0];
    if (script) {
        for (const prop of Object.keys(config)) {
            const val = script.getAttribute("data-" + hyphenate(prop));
            if (isPrimitive(val)) {
                console.warn(`DEPRECATION: data-* attributes on the docsify global script (f.e. ${"data-" + hyphenate(prop)}) are deprecated.`);
                config[prop] = val === "" ? true : val;
            }
        }
    }
    if (config.loadSidebar === true) {
        config.loadSidebar = "_sidebar" + config.ext;
    }
    if (config.loadNavbar === true) {
        config.loadNavbar = "_navbar" + config.ext;
    }
    if (config.coverpage === true) {
        config.coverpage = "_coverpage" + config.ext;
    }
    if (config.name === true) {
        config.name = "";
    }
    return config;
}

function Lifecycle(Base) {
    return class Lifecycle extends Base {
        _hooks={};
        _lifecycle={};
        initLifecycle() {
            const hooks = [ "init", "mounted", "beforeEach", "afterEach", "doneEach", "ready" ];
            hooks.forEach((hook => {
                const arr = this._hooks[hook] = [];
                this._lifecycle[hook] = fn => arr.push(fn);
            }));
        }
        callHook(hookName, data, next = noop) {
            const queue = this._hooks[hookName];
            const catchPluginErrors = this.config.catchPluginErrors;
            const step = function(index) {
                const hookFn = queue[index];
                if (index >= queue.length) {
                    next(data);
                } else if (typeof hookFn === "function") {
                    const errTitle = "Docsify plugin error";
                    if (hookFn.length === 2) {
                        try {
                            hookFn(data, (result => {
                                data = result === undefined ? data : result;
                                step(index + 1);
                            }));
                        } catch (err) {
                            if (catchPluginErrors) {
                                console.error(errTitle, err);
                            } else {
                                throw err;
                            }
                            step(index + 1);
                        }
                    } else {
                        try {
                            const result = hookFn(data);
                            data = result === undefined ? data : result;
                            step(index + 1);
                        } catch (err) {
                            if (catchPluginErrors) {
                                console.error(errTitle, err);
                            } else {
                                throw err;
                            }
                            step(index + 1);
                        }
                    }
                } else {
                    step(index + 1);
                }
            };
            step(0);
        }
    };
}

var index = Object.freeze({
    __proto__: null,
    cached: cached$1,
    cleanPath: cleanPath,
    findLinkByHref: findLinkByHref,
    getClickedLink: getClickedLink,
    getParentPath: getParentPath,
    getPath: getPath,
    getSidebarNavigationTarget: getSidebarNavigationTarget,
    hyphenate: hyphenate,
    isAbsolutePath: isAbsolutePath,
    isCurrentContextNavigation: isCurrentContextNavigation,
    isExternal: isExternal,
    isFn: isFn,
    isMobile: isMobile,
    isPrimitive: isPrimitive,
    mobileBreakpoint: mobileBreakpoint,
    noop: noop,
    parseQuery: parseQuery,
    removeParams: removeParams,
    replaceSlug: replaceSlug,
    resolveHref: resolveHref,
    resolvePath: resolvePath,
    stringifyQuery: stringifyQuery,
    stripUrlExceptId: stripUrlExceptId
});

class Docsify extends(Fetch(Events(Render(VirtualRoutes(Router(Lifecycle(Object))))))){
    config;
    constructor(conf = {}) {
        super();
        this.config = config(this, conf);
        this.initLifecycle();
        this.initPlugin();
        this.callHook("init");
        this.initRouter();
        this.initRender();
        this.initEvent();
        this.initFetch();
        this.callHook("mounted");
    }
    initPlugin() {
        this.config.plugins.forEach((fn => {
            try {
                isFn(fn) && fn(this._lifecycle, this);
            } catch (err) {
                if (this.config.catchPluginErrors) {
                    const errTitle = "Docsify plugin error";
                    console.error(errTitle, err);
                } else {
                    throw err;
                }
            }
        }));
    }
}

const version = "5.1.0";

export { Compiler, Docsify, dom, get, g as marked, prism, slugify, index as util, version };