{"version":3,"sources":["jsdelivr-header.js","/npm/emmet-monaco-es@5.5.0/dist/emmet-monaco.esm.js"],"names":[],"mappings":"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","file":"/npm/emmet-monaco-es@5.5.0/dist/emmet-monaco.esm.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/emmet-monaco-es@5.5.0/dist/emmet-monaco.esm.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * Check if given code is a number\n */\nfunction isNumber$1(code) {\n    return code > 47 && code < 58;\n}\n/**\n * Check if given character code is alpha code (letter through A to Z)\n */\nfunction isAlpha$1(code, from, to) {\n    from = from || 65; // A\n    to = to || 90; // Z\n    code &= ~32; // quick hack to convert any char code to uppercase char code\n    return code >= from && code <= to;\n}\nfunction isAlphaNumericWord(code) {\n    return isNumber$1(code) || isAlphaWord(code);\n}\nfunction isAlphaWord(code) {\n    return code === 95 /* _ */ || isAlpha$1(code);\n}\n/**\n * Check for Umlauts i.e. ä, Ä, ö, Ö, ü and Ü\n */\nfunction isUmlaut(code) {\n    return code === 196\n        || code == 214\n        || code === 220\n        || code === 228\n        || code === 246\n        || code === 252;\n}\n/**\n * Check if given character code is a white-space character: a space character\n * or line breaks\n */\nfunction isWhiteSpace$3(code) {\n    return code === 32 /* space */\n        || code === 9 /* tab */\n        || code === 160; /* non-breaking space */\n}\n/**\n * Check if given character code is a space character\n */\nfunction isSpace(code) {\n    return isWhiteSpace$3(code)\n        || code === 10 /* LF */\n        || code === 13; /* CR */\n}\n/**\n * Check if given character code is a quote character\n */\nfunction isQuote$2(code) {\n    return code === 39 /* ' */ || code === 34 /* \" */;\n}\n\n/**\n * A streaming, character code-based string reader\n */\nclass Scanner {\n    constructor(str, start, end) {\n        if (end == null && typeof str === 'string') {\n            end = str.length;\n        }\n        this.string = str;\n        this.pos = this.start = start || 0;\n        this.end = end || 0;\n    }\n    /**\n     * Returns true only if the stream is at the end of the file.\n     */\n    eof() {\n        return this.pos >= this.end;\n    }\n    /**\n     * Creates a new stream instance which is limited to given `start` and `end`\n     * range. E.g. its `eof()` method will look at `end` property, not actual\n     * stream end\n     */\n    limit(start, end) {\n        return new Scanner(this.string, start, end);\n    }\n    /**\n     * Returns the next character code in the stream without advancing it.\n     * Will return NaN at the end of the file.\n     */\n    peek() {\n        return this.string.charCodeAt(this.pos);\n    }\n    /**\n     * Returns the next character in the stream and advances it.\n     * Also returns <code>undefined</code> when no more characters are available.\n     */\n    next() {\n        if (this.pos < this.string.length) {\n            return this.string.charCodeAt(this.pos++);\n        }\n    }\n    /**\n     * `match` can be a character code or a function that takes a character code\n     * and returns a boolean. If the next character in the stream 'matches'\n     * the given argument, it is consumed and returned.\n     * Otherwise, `false` is returned.\n     */\n    eat(match) {\n        const ch = this.peek();\n        const ok = typeof match === 'function' ? match(ch) : ch === match;\n        if (ok) {\n            this.next();\n        }\n        return ok;\n    }\n    /**\n     * Repeatedly calls <code>eat</code> with the given argument, until it\n     * fails. Returns <code>true</code> if any characters were eaten.\n     */\n    eatWhile(match) {\n        const start = this.pos;\n        while (!this.eof() && this.eat(match)) { /* */ }\n        return this.pos !== start;\n    }\n    /**\n     * Backs up the stream n characters. Backing it up further than the\n     * start of the current token will cause things to break, so be careful.\n     */\n    backUp(n) {\n        this.pos -= (n || 1);\n    }\n    /**\n     * Get the string between the start of the current token and the\n     * current stream position.\n     */\n    current() {\n        return this.substring(this.start, this.pos);\n    }\n    /**\n     * Returns substring for given range\n     */\n    substring(start, end) {\n        return this.string.slice(start, end);\n    }\n    /**\n     * Creates error object with current stream state\n     */\n    error(message, pos = this.pos) {\n        return new ScannerError(`${message} at ${pos + 1}`, pos, this.string);\n    }\n}\nclass ScannerError extends Error {\n    constructor(message, pos, str) {\n        super(message);\n        this.pos = pos;\n        this.string = str;\n    }\n}\n\nfunction tokenScanner$1(tokens) {\n    return {\n        tokens,\n        start: 0,\n        pos: 0,\n        size: tokens.length\n    };\n}\nfunction peek$3(scanner) {\n    return scanner.tokens[scanner.pos];\n}\nfunction next(scanner) {\n    return scanner.tokens[scanner.pos++];\n}\nfunction slice(scanner, from = scanner.start, to = scanner.pos) {\n    return scanner.tokens.slice(from, to);\n}\nfunction readable$1(scanner) {\n    return scanner.pos < scanner.size;\n}\nfunction consume$2(scanner, test) {\n    const token = peek$3(scanner);\n    if (token && test(token)) {\n        scanner.pos++;\n        return true;\n    }\n    return false;\n}\nfunction error$1(scanner, message, token = peek$3(scanner)) {\n    if (token && token.start != null) {\n        message += ` at ${token.start}`;\n    }\n    const err = new Error(message);\n    err['pos'] = token && token.start;\n    return err;\n}\n\nfunction abbreviation(abbr, options = {}) {\n    const scanner = tokenScanner$1(abbr);\n    const result = statements(scanner, options);\n    if (readable$1(scanner)) {\n        throw error$1(scanner, 'Unexpected character');\n    }\n    return result;\n}\nfunction statements(scanner, options) {\n    const result = {\n        type: 'TokenGroup',\n        elements: []\n    };\n    let ctx = result;\n    let node;\n    const stack = [];\n    while (readable$1(scanner)) {\n        if (node = element$2(scanner, options) || group(scanner, options)) {\n            ctx.elements.push(node);\n            if (consume$2(scanner, isChildOperator)) {\n                stack.push(ctx);\n                ctx = node;\n            }\n            else if (consume$2(scanner, isSiblingOperator$1)) {\n                continue;\n            }\n            else if (consume$2(scanner, isClimbOperator)) {\n                do {\n                    if (stack.length) {\n                        ctx = stack.pop();\n                    }\n                } while (consume$2(scanner, isClimbOperator));\n            }\n        }\n        else {\n            break;\n        }\n    }\n    return result;\n}\n/**\n * Consumes group from given scanner\n */\nfunction group(scanner, options) {\n    if (consume$2(scanner, isGroupStart)) {\n        const result = statements(scanner, options);\n        const token = next(scanner);\n        if (isBracket$2(token, 'group', false)) {\n            result.repeat = repeater$1(scanner);\n        }\n        return result;\n    }\n}\n/**\n * Consumes single element from given scanner\n */\nfunction element$2(scanner, options) {\n    let attr;\n    const elem = {\n        type: 'TokenElement',\n        name: void 0,\n        attributes: void 0,\n        value: void 0,\n        repeat: void 0,\n        selfClose: false,\n        elements: []\n    };\n    if (elementName(scanner, options)) {\n        elem.name = slice(scanner);\n    }\n    while (readable$1(scanner)) {\n        scanner.start = scanner.pos;\n        if (!elem.repeat && !isEmpty(elem) && consume$2(scanner, isRepeater)) {\n            elem.repeat = scanner.tokens[scanner.pos - 1];\n        }\n        else if (!elem.value && text(scanner)) {\n            elem.value = getText(scanner);\n        }\n        else if (attr = shortAttribute(scanner, 'id', options) || shortAttribute(scanner, 'class', options) || attributeSet(scanner)) {\n            if (!elem.attributes) {\n                elem.attributes = Array.isArray(attr) ? attr.slice() : [attr];\n            }\n            else {\n                elem.attributes = elem.attributes.concat(attr);\n            }\n        }\n        else {\n            if (!isEmpty(elem) && consume$2(scanner, isCloseOperator)) {\n                elem.selfClose = true;\n                if (!elem.repeat && consume$2(scanner, isRepeater)) {\n                    elem.repeat = scanner.tokens[scanner.pos - 1];\n                }\n            }\n            break;\n        }\n    }\n    return !isEmpty(elem) ? elem : void 0;\n}\n/**\n * Consumes attribute set from given scanner\n */\nfunction attributeSet(scanner) {\n    if (consume$2(scanner, isAttributeSetStart)) {\n        const attributes = [];\n        let attr;\n        while (readable$1(scanner)) {\n            if (attr = attribute(scanner)) {\n                attributes.push(attr);\n            }\n            else if (consume$2(scanner, isAttributeSetEnd)) {\n                break;\n            }\n            else if (!consume$2(scanner, isWhiteSpace$2)) {\n                throw error$1(scanner, `Unexpected \"${peek$3(scanner).type}\" token`);\n            }\n        }\n        return attributes;\n    }\n}\n/**\n * Consumes attribute shorthand (class or id) from given scanner\n */\nfunction shortAttribute(scanner, type, options) {\n    if (isOperator$1(peek$3(scanner), type)) {\n        scanner.pos++;\n        // Consume multiple operators\n        let count = 1;\n        while (isOperator$1(peek$3(scanner), type)) {\n            scanner.pos++;\n            count++;\n        }\n        const attr = {\n            name: [createLiteral$1(type)]\n        };\n        if (count > 1) {\n            attr.multiple = true;\n        }\n        // Consume expression after shorthand start for React-like components\n        if (options.jsx && text(scanner)) {\n            attr.value = getText(scanner);\n            attr.expression = true;\n        }\n        else {\n            attr.value = literal$1$1(scanner) ? slice(scanner) : void 0;\n        }\n        return attr;\n    }\n}\n/**\n * Consumes single attribute from given scanner\n */\nfunction attribute(scanner) {\n    if (quoted(scanner)) {\n        // Consumed quoted value: it’s a value for default attribute\n        return {\n            value: slice(scanner)\n        };\n    }\n    if (literal$1$1(scanner, true)) {\n        const name = slice(scanner);\n        let value;\n        if (consume$2(scanner, isEquals)) {\n            if (quoted(scanner) || literal$1$1(scanner, true)) {\n                value = slice(scanner);\n            }\n        }\n        return { name, value };\n    }\n}\nfunction repeater$1(scanner) {\n    return isRepeater(peek$3(scanner))\n        ? scanner.tokens[scanner.pos++]\n        : void 0;\n}\n/**\n * Consumes quoted value from given scanner, if possible\n */\nfunction quoted(scanner) {\n    const start = scanner.pos;\n    const quote = peek$3(scanner);\n    if (isQuote$1(quote)) {\n        scanner.pos++;\n        while (readable$1(scanner)) {\n            if (isQuote$1(next(scanner), quote.single)) {\n                scanner.start = start;\n                return true;\n            }\n        }\n        throw error$1(scanner, 'Unclosed quote', quote);\n    }\n    return false;\n}\n/**\n * Consumes literal (unquoted value) from given scanner\n */\nfunction literal$1$1(scanner, allowBrackets) {\n    const start = scanner.pos;\n    const brackets = {\n        attribute: 0,\n        expression: 0,\n        group: 0\n    };\n    while (readable$1(scanner)) {\n        const token = peek$3(scanner);\n        if (brackets.expression) {\n            // If we’re inside expression, we should consume all content in it\n            if (isBracket$2(token, 'expression')) {\n                brackets[token.context] += token.open ? 1 : -1;\n            }\n        }\n        else if (isQuote$1(token) || isOperator$1(token) || isWhiteSpace$2(token) || isRepeater(token)) {\n            break;\n        }\n        else if (isBracket$2(token)) {\n            if (!allowBrackets) {\n                break;\n            }\n            if (token.open) {\n                brackets[token.context]++;\n            }\n            else if (!brackets[token.context]) {\n                // Stop if found unmatched closing brace: it must be handled\n                // by parent consumer\n                break;\n            }\n            else {\n                brackets[token.context]--;\n            }\n        }\n        scanner.pos++;\n    }\n    if (start !== scanner.pos) {\n        scanner.start = start;\n        return true;\n    }\n    return false;\n}\n/**\n * Consumes element name from given scanner\n */\nfunction elementName(scanner, options) {\n    const start = scanner.pos;\n    if (options.jsx && consume$2(scanner, isCapitalizedLiteral)) {\n        // Check for edge case: consume immediate capitalized class names\n        // for React-like components, e.g. `Foo.Bar.Baz`\n        while (readable$1(scanner)) {\n            const { pos } = scanner;\n            if (!consume$2(scanner, isClassNameOperator) || !consume$2(scanner, isCapitalizedLiteral)) {\n                scanner.pos = pos;\n                break;\n            }\n        }\n    }\n    while (readable$1(scanner) && consume$2(scanner, isElementName$1)) {\n        // empty\n    }\n    if (scanner.pos !== start) {\n        scanner.start = start;\n        return true;\n    }\n    return false;\n}\n/**\n * Consumes text value from given scanner\n */\nfunction text(scanner) {\n    const start = scanner.pos;\n    if (consume$2(scanner, isTextStart)) {\n        let brackets = 0;\n        while (readable$1(scanner)) {\n            const token = next(scanner);\n            if (isBracket$2(token, 'expression')) {\n                if (token.open) {\n                    brackets++;\n                }\n                else if (!brackets) {\n                    break;\n                }\n                else {\n                    brackets--;\n                }\n            }\n        }\n        scanner.start = start;\n        return true;\n    }\n    return false;\n}\nfunction getText(scanner) {\n    let from = scanner.start;\n    let to = scanner.pos;\n    if (isBracket$2(scanner.tokens[from], 'expression', true)) {\n        from++;\n    }\n    if (isBracket$2(scanner.tokens[to - 1], 'expression', false)) {\n        to--;\n    }\n    return slice(scanner, from, to);\n}\nfunction isBracket$2(token, context, isOpen) {\n    return Boolean(token && token.type === 'Bracket'\n        && (!context || token.context === context)\n        && (isOpen == null || token.open === isOpen));\n}\nfunction isOperator$1(token, type) {\n    return Boolean(token && token.type === 'Operator' && (!type || token.operator === type));\n}\nfunction isQuote$1(token, isSingle) {\n    return Boolean(token && token.type === 'Quote' && (isSingle == null || token.single === isSingle));\n}\nfunction isWhiteSpace$2(token) {\n    return Boolean(token && token.type === 'WhiteSpace');\n}\nfunction isEquals(token) {\n    return isOperator$1(token, 'equal');\n}\nfunction isRepeater(token) {\n    return Boolean(token && token.type === 'Repeater');\n}\nfunction isLiteral$2(token) {\n    return token.type === 'Literal';\n}\nfunction isCapitalizedLiteral(token) {\n    if (isLiteral$2(token)) {\n        const ch = token.value.charCodeAt(0);\n        return ch >= 65 && ch <= 90;\n    }\n    return false;\n}\nfunction isElementName$1(token) {\n    return token.type === 'Literal' || token.type === 'RepeaterNumber' || token.type === 'RepeaterPlaceholder';\n}\nfunction isClassNameOperator(token) {\n    return isOperator$1(token, 'class');\n}\nfunction isAttributeSetStart(token) {\n    return isBracket$2(token, 'attribute', true);\n}\nfunction isAttributeSetEnd(token) {\n    return isBracket$2(token, 'attribute', false);\n}\nfunction isTextStart(token) {\n    return isBracket$2(token, 'expression', true);\n}\nfunction isGroupStart(token) {\n    return isBracket$2(token, 'group', true);\n}\nfunction createLiteral$1(value) {\n    return { type: 'Literal', value };\n}\nfunction isEmpty(elem) {\n    return !elem.name && !elem.value && !elem.attributes;\n}\nfunction isChildOperator(token) {\n    return isOperator$1(token, 'child');\n}\nfunction isSiblingOperator$1(token) {\n    return isOperator$1(token, 'sibling');\n}\nfunction isClimbOperator(token) {\n    return isOperator$1(token, 'climb');\n}\nfunction isCloseOperator(token) {\n    return isOperator$1(token, 'close');\n}\n\nvar Chars$3;\n(function (Chars) {\n    /** `{` character */\n    Chars[Chars[\"CurlyBracketOpen\"] = 123] = \"CurlyBracketOpen\";\n    /** `}` character */\n    Chars[Chars[\"CurlyBracketClose\"] = 125] = \"CurlyBracketClose\";\n    /** `\\\\` character */\n    Chars[Chars[\"Escape\"] = 92] = \"Escape\";\n    /** `=` character */\n    Chars[Chars[\"Equals\"] = 61] = \"Equals\";\n    /** `[` character */\n    Chars[Chars[\"SquareBracketOpen\"] = 91] = \"SquareBracketOpen\";\n    /** `]` character */\n    Chars[Chars[\"SquareBracketClose\"] = 93] = \"SquareBracketClose\";\n    /** `*` character */\n    Chars[Chars[\"Asterisk\"] = 42] = \"Asterisk\";\n    /** `#` character */\n    Chars[Chars[\"Hash\"] = 35] = \"Hash\";\n    /** `$` character */\n    Chars[Chars[\"Dollar\"] = 36] = \"Dollar\";\n    /** `-` character */\n    Chars[Chars[\"Dash\"] = 45] = \"Dash\";\n    /** `.` character */\n    Chars[Chars[\"Dot\"] = 46] = \"Dot\";\n    /** `/` character */\n    Chars[Chars[\"Slash\"] = 47] = \"Slash\";\n    /** `:` character */\n    Chars[Chars[\"Colon\"] = 58] = \"Colon\";\n    /** `!` character */\n    Chars[Chars[\"Excl\"] = 33] = \"Excl\";\n    /** `@` character */\n    Chars[Chars[\"At\"] = 64] = \"At\";\n    /** `_` character */\n    Chars[Chars[\"Underscore\"] = 95] = \"Underscore\";\n    /** `(` character */\n    Chars[Chars[\"RoundBracketOpen\"] = 40] = \"RoundBracketOpen\";\n    /** `)` character */\n    Chars[Chars[\"RoundBracketClose\"] = 41] = \"RoundBracketClose\";\n    /** `+` character */\n    Chars[Chars[\"Sibling\"] = 43] = \"Sibling\";\n    /** `>` character */\n    Chars[Chars[\"Child\"] = 62] = \"Child\";\n    /** `^` character */\n    Chars[Chars[\"Climb\"] = 94] = \"Climb\";\n    /** `'` character */\n    Chars[Chars[\"SingleQuote\"] = 39] = \"SingleQuote\";\n    /** `\"\"` character */\n    Chars[Chars[\"DoubleQuote\"] = 34] = \"DoubleQuote\";\n})(Chars$3 || (Chars$3 = {}));\n/**\n * If consumes escape character, sets current stream range to escaped value\n */\nfunction escaped(scanner) {\n    if (scanner.eat(Chars$3.Escape)) {\n        scanner.start = scanner.pos;\n        if (!scanner.eof()) {\n            scanner.pos++;\n        }\n        return true;\n    }\n    return false;\n}\n\nfunction tokenize$1(source) {\n    const scanner = new Scanner(source);\n    const result = [];\n    const ctx = {\n        group: 0,\n        attribute: 0,\n        expression: 0,\n        quote: 0\n    };\n    let ch = 0;\n    let token;\n    while (!scanner.eof()) {\n        ch = scanner.peek();\n        token = getToken$1(scanner, ctx);\n        if (token) {\n            result.push(token);\n            if (token.type === 'Quote') {\n                ctx.quote = ch === ctx.quote ? 0 : ch;\n            }\n            else if (token.type === 'Bracket') {\n                ctx[token.context] += token.open ? 1 : -1;\n            }\n        }\n        else {\n            throw scanner.error('Unexpected character');\n        }\n    }\n    return result;\n}\n/**\n * Returns next token from given scanner, if possible\n */\nfunction getToken$1(scanner, ctx) {\n    return field$2(scanner, ctx)\n        || repeaterPlaceholder(scanner)\n        || repeaterNumber(scanner)\n        || repeater(scanner)\n        || whiteSpace$1(scanner)\n        || literal$2(scanner, ctx)\n        || operator$1(scanner)\n        || quote(scanner)\n        || bracket$1(scanner);\n}\n/**\n * Consumes literal from given scanner\n */\nfunction literal$2(scanner, ctx) {\n    const start = scanner.pos;\n    const expressionStart = ctx.expression;\n    let value = '';\n    while (!scanner.eof()) {\n        // Consume escaped sequence no matter of context\n        if (escaped(scanner)) {\n            value += scanner.current();\n            continue;\n        }\n        const ch = scanner.peek();\n        if (ch === Chars$3.Slash && !ctx.quote && !ctx.expression && !ctx.attribute) {\n            // Special case for `/` character between numbers in class names\n            const prev = scanner.string.charCodeAt(scanner.pos - 1);\n            const next = scanner.string.charCodeAt(scanner.pos + 1);\n            if (isNumber$1(prev) && isNumber$1(next)) {\n                value += scanner.string[scanner.pos++];\n                continue;\n            }\n        }\n        if (ch === ctx.quote || ch === Chars$3.Dollar || isAllowedOperator(ch, ctx)) {\n            // 1. Found matching quote\n            // 2. The `$` character has special meaning in every context\n            // 3. Depending on context, some characters should be treated as operators\n            break;\n        }\n        if (expressionStart) {\n            // Consume nested expressions, e.g. span{{foo}}\n            if (ch === Chars$3.CurlyBracketOpen) {\n                ctx.expression++;\n            }\n            else if (ch === Chars$3.CurlyBracketClose) {\n                if (ctx.expression > expressionStart) {\n                    ctx.expression--;\n                }\n                else {\n                    break;\n                }\n            }\n        }\n        else if (!ctx.quote) {\n            // Consuming element name\n            if (!ctx.attribute && !isElementName(ch)) {\n                break;\n            }\n            if (isAllowedSpace(ch, ctx) || isAllowedRepeater(ch, ctx) || isQuote$2(ch) || bracketType(ch)) {\n                // Stop for characters not allowed in unquoted literal\n                break;\n            }\n        }\n        value += scanner.string[scanner.pos++];\n    }\n    if (start !== scanner.pos) {\n        scanner.start = start;\n        return {\n            type: 'Literal',\n            value,\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes white space characters as string literal from given scanner\n */\nfunction whiteSpace$1(scanner) {\n    const start = scanner.pos;\n    if (scanner.eatWhile(isSpace)) {\n        return {\n            type: 'WhiteSpace',\n            start,\n            end: scanner.pos,\n            value: scanner.substring(start, scanner.pos)\n        };\n    }\n}\n/**\n * Consumes quote from given scanner\n */\nfunction quote(scanner) {\n    const ch = scanner.peek();\n    if (isQuote$2(ch)) {\n        return {\n            type: 'Quote',\n            single: ch === Chars$3.SingleQuote,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes bracket from given scanner\n */\nfunction bracket$1(scanner) {\n    const ch = scanner.peek();\n    const context = bracketType(ch);\n    if (context) {\n        return {\n            type: 'Bracket',\n            open: isOpenBracket$2(ch),\n            context,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes operator from given scanner\n */\nfunction operator$1(scanner) {\n    const op = operatorType$1(scanner.peek());\n    if (op) {\n        return {\n            type: 'Operator',\n            operator: op,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes node repeat token from current stream position and returns its\n * parsed value\n */\nfunction repeater(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(Chars$3.Asterisk)) {\n        scanner.start = scanner.pos;\n        let count = 1;\n        let implicit = false;\n        if (scanner.eatWhile(isNumber$1)) {\n            count = Number(scanner.current());\n        }\n        else {\n            implicit = true;\n        }\n        return {\n            type: 'Repeater',\n            count,\n            value: 0,\n            implicit,\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes repeater placeholder `$#` from given scanner\n */\nfunction repeaterPlaceholder(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(Chars$3.Dollar) && scanner.eat(Chars$3.Hash)) {\n        return {\n            type: 'RepeaterPlaceholder',\n            value: void 0,\n            start,\n            end: scanner.pos\n        };\n    }\n    scanner.pos = start;\n}\n/**\n * Consumes numbering token like `$` from given scanner state\n */\nfunction repeaterNumber(scanner) {\n    const start = scanner.pos;\n    if (scanner.eatWhile(Chars$3.Dollar)) {\n        const size = scanner.pos - start;\n        let reverse = false;\n        let base = 1;\n        let parent = 0;\n        if (scanner.eat(Chars$3.At)) {\n            // Consume numbering modifiers\n            while (scanner.eat(Chars$3.Climb)) {\n                parent++;\n            }\n            reverse = scanner.eat(Chars$3.Dash);\n            scanner.start = scanner.pos;\n            if (scanner.eatWhile(isNumber$1)) {\n                base = Number(scanner.current());\n            }\n        }\n        scanner.start = start;\n        return {\n            type: 'RepeaterNumber',\n            size,\n            reverse,\n            base,\n            parent,\n            start,\n            end: scanner.pos\n        };\n    }\n}\nfunction field$2(scanner, ctx) {\n    const start = scanner.pos;\n    // Fields are allowed inside expressions and attributes\n    if ((ctx.expression || ctx.attribute) && scanner.eat(Chars$3.Dollar) && scanner.eat(Chars$3.CurlyBracketOpen)) {\n        scanner.start = scanner.pos;\n        let index;\n        let name = '';\n        if (scanner.eatWhile(isNumber$1)) {\n            // It’s a field\n            index = Number(scanner.current());\n            name = scanner.eat(Chars$3.Colon) ? consumePlaceholder$2(scanner) : '';\n        }\n        else if (isAlpha$1(scanner.peek())) {\n            // It’s a variable\n            name = consumePlaceholder$2(scanner);\n        }\n        if (scanner.eat(Chars$3.CurlyBracketClose)) {\n            return {\n                type: 'Field',\n                index, name,\n                start,\n                end: scanner.pos\n            };\n        }\n        throw scanner.error('Expecting }');\n    }\n    // If we reached here then there’s no valid field here, revert\n    // back to starting position\n    scanner.pos = start;\n}\n/**\n * Consumes a placeholder: value right after `:` in field. Could be empty\n */\nfunction consumePlaceholder$2(stream) {\n    const stack = [];\n    stream.start = stream.pos;\n    while (!stream.eof()) {\n        if (stream.eat(Chars$3.CurlyBracketOpen)) {\n            stack.push(stream.pos);\n        }\n        else if (stream.eat(Chars$3.CurlyBracketClose)) {\n            if (!stack.length) {\n                stream.pos--;\n                break;\n            }\n            stack.pop();\n        }\n        else {\n            stream.pos++;\n        }\n    }\n    if (stack.length) {\n        stream.pos = stack.pop();\n        throw stream.error(`Expecting }`);\n    }\n    return stream.current();\n}\n/**\n * Check if given character code is an operator and it’s allowed in current context\n */\nfunction isAllowedOperator(ch, ctx) {\n    const op = operatorType$1(ch);\n    if (!op || ctx.quote || ctx.expression) {\n        // No operators inside quoted values or expressions\n        return false;\n    }\n    // Inside attributes, only `equals` is allowed\n    return !ctx.attribute || op === 'equal';\n}\n/**\n * Check if given character is a space character and is allowed to be consumed\n * as a space token in current context\n */\nfunction isAllowedSpace(ch, ctx) {\n    return isSpace(ch) && !ctx.expression;\n}\n/**\n * Check if given character can be consumed as repeater in current context\n */\nfunction isAllowedRepeater(ch, ctx) {\n    return ch === Chars$3.Asterisk && !ctx.attribute && !ctx.expression;\n}\n/**\n * If given character is a bracket, returns it’s type\n */\nfunction bracketType(ch) {\n    if (ch === Chars$3.RoundBracketOpen || ch === Chars$3.RoundBracketClose) {\n        return 'group';\n    }\n    if (ch === Chars$3.SquareBracketOpen || ch === Chars$3.SquareBracketClose) {\n        return 'attribute';\n    }\n    if (ch === Chars$3.CurlyBracketOpen || ch === Chars$3.CurlyBracketClose) {\n        return 'expression';\n    }\n}\n/**\n * If given character is an operator, returns it’s type\n */\nfunction operatorType$1(ch) {\n    return (ch === Chars$3.Child && 'child')\n        || (ch === Chars$3.Sibling && 'sibling')\n        || (ch === Chars$3.Climb && 'climb')\n        || (ch === Chars$3.Dot && 'class')\n        || (ch === Chars$3.Hash && 'id')\n        || (ch === Chars$3.Slash && 'close')\n        || (ch === Chars$3.Equals && 'equal')\n        || void 0;\n}\n/**\n * Check if given character is an open bracket\n */\nfunction isOpenBracket$2(ch) {\n    return ch === Chars$3.CurlyBracketOpen\n        || ch === Chars$3.SquareBracketOpen\n        || ch === Chars$3.RoundBracketOpen;\n}\n/**\n * Check if given character is allowed in element name\n */\nfunction isElementName(ch) {\n    return isAlphaNumericWord(ch)\n        || isUmlaut(ch)\n        || ch === Chars$3.Dash\n        || ch === Chars$3.Colon\n        || ch === Chars$3.Excl;\n}\n\nconst operators = {\n    child: '>',\n    class: '.',\n    climb: '^',\n    id: '#',\n    equal: '=',\n    close: '/',\n    sibling: '+'\n};\nconst tokenVisitor = {\n    Literal(token) {\n        return token.value;\n    },\n    Quote(token) {\n        return token.single ? '\\'' : '\"';\n    },\n    Bracket(token) {\n        if (token.context === 'attribute') {\n            return token.open ? '[' : ']';\n        }\n        else if (token.context === 'expression') {\n            return token.open ? '{' : '}';\n        }\n        else {\n            return token.open ? '(' : '}';\n        }\n    },\n    Operator(token) {\n        return operators[token.operator];\n    },\n    Field(token, state) {\n        if (token.index != null) {\n            // It’s a field: by default, return TextMate-compatible field\n            return token.name\n                ? `\\${${token.index}:${token.name}}`\n                : `\\${${token.index}`;\n        }\n        else if (token.name) {\n            // It’s a variable\n            return state.getVariable(token.name);\n        }\n        return '';\n    },\n    RepeaterPlaceholder(token, state) {\n        // Find closest implicit repeater\n        let repeater;\n        for (let i = state.repeaters.length - 1; i >= 0; i--) {\n            if (state.repeaters[i].implicit) {\n                repeater = state.repeaters[i];\n                break;\n            }\n        }\n        state.inserted = true;\n        return state.getText(repeater && repeater.value);\n    },\n    RepeaterNumber(token, state) {\n        let value = 1;\n        const lastIx = state.repeaters.length - 1;\n        // const repeaterIx = Math.max(0, state.repeaters.length - 1 - token.parent);\n        const repeater = state.repeaters[lastIx];\n        if (repeater) {\n            value = token.reverse\n                ? token.base + repeater.count - repeater.value - 1\n                : token.base + repeater.value;\n            if (token.parent) {\n                const parentIx = Math.max(0, lastIx - token.parent);\n                if (parentIx !== lastIx) {\n                    const parentRepeater = state.repeaters[parentIx];\n                    value += repeater.count * parentRepeater.value;\n                }\n            }\n        }\n        let result = String(value);\n        while (result.length < token.size) {\n            result = '0' + result;\n        }\n        return result;\n    },\n    WhiteSpace(token) {\n        return token.value;\n    }\n};\n/**\n * Converts given value token to string\n */\nfunction stringify$1(token, state) {\n    if (!tokenVisitor[token.type]) {\n        throw new Error(`Unknown token ${token.type}`);\n    }\n    return tokenVisitor[token.type](token, state);\n}\n\nconst urlRegex = /^((https?:|ftp:|file:)?\\/\\/|(www|ftp)\\.)[^ ]*$/;\nconst emailRegex = /^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,5}$/;\n/**\n * Converts given token-based abbreviation into simplified and unrolled node-based\n * abbreviation\n */\nfunction convert(abbr, options = {}) {\n    let textInserted = false;\n    let cleanText;\n    if (options.text) {\n        if (Array.isArray(options.text)) {\n            cleanText = options.text.filter(s => s.trim());\n        }\n        else {\n            cleanText = options.text;\n        }\n    }\n    const result = {\n        type: 'Abbreviation',\n        children: convertGroup(abbr, {\n            inserted: false,\n            repeaters: [],\n            text: options.text,\n            cleanText,\n            repeatGuard: options.maxRepeat || Number.POSITIVE_INFINITY,\n            getText(pos) {\n                var _a;\n                textInserted = true;\n                let value;\n                if (Array.isArray(options.text)) {\n                    if (pos !== undefined && pos >= 0 && pos < cleanText.length) {\n                        return cleanText[pos];\n                    }\n                    value = pos !== undefined ? options.text[pos] : options.text.join('\\n');\n                }\n                else {\n                    value = (_a = options.text) !== null && _a !== void 0 ? _a : '';\n                }\n                return value;\n            },\n            getVariable(name) {\n                const varValue = options.variables && options.variables[name];\n                return varValue != null ? varValue : name;\n            }\n        })\n    };\n    if (options.text != null && !textInserted) {\n        // Text given but no implicitly repeated elements: insert it into\n        // deepest child\n        const deepest = deepestNode(last$1(result.children));\n        if (deepest) {\n            const text = Array.isArray(options.text) ? options.text.join('\\n') : options.text;\n            insertText(deepest, text);\n            if (deepest.name === 'a' && options.href) {\n                // Automatically update value of `<a>` element if inserting URL or email\n                insertHref(deepest, text);\n            }\n        }\n    }\n    return result;\n}\n/**\n * Converts given statement to abbreviation nodes\n */\nfunction convertStatement(node, state) {\n    let result = [];\n    if (node.repeat) {\n        // Node is repeated: we should create copies of given node\n        // and supply context token with actual repeater state\n        const original = node.repeat;\n        const repeat = Object.assign({}, original);\n        repeat.count = repeat.implicit && Array.isArray(state.text)\n            ? state.cleanText.length\n            : (repeat.count || 1);\n        let items;\n        state.repeaters.push(repeat);\n        for (let i = 0; i < repeat.count; i++) {\n            repeat.value = i;\n            node.repeat = repeat;\n            items = isGroup(node)\n                ? convertGroup(node, state)\n                : convertElement(node, state);\n            if (repeat.implicit && !state.inserted) {\n                // It’s an implicit repeater but no repeater placeholders found inside,\n                // we should insert text into deepest node\n                const target = last$1(items);\n                const deepest = target && deepestNode(target);\n                if (deepest) {\n                    insertText(deepest, state.getText(repeat.value));\n                }\n            }\n            result = result.concat(items);\n            // We should output at least one repeated item even if it’s reached\n            // repeat limit\n            if (--state.repeatGuard <= 0) {\n                break;\n            }\n        }\n        state.repeaters.pop();\n        node.repeat = original;\n        if (repeat.implicit) {\n            state.inserted = true;\n        }\n    }\n    else {\n        result = result.concat(isGroup(node) ? convertGroup(node, state) : convertElement(node, state));\n    }\n    return result;\n}\nfunction convertElement(node, state) {\n    let children = [];\n    const elem = {\n        type: 'AbbreviationNode',\n        name: node.name && stringifyName(node.name, state),\n        value: node.value && stringifyValue$1(node.value, state),\n        attributes: void 0,\n        children,\n        repeat: node.repeat && Object.assign({}, node.repeat),\n        selfClosing: node.selfClose,\n    };\n    let result = [elem];\n    for (const child of node.elements) {\n        children = children.concat(convertStatement(child, state));\n    }\n    if (node.attributes) {\n        elem.attributes = [];\n        for (const attr of node.attributes) {\n            elem.attributes.push(convertAttribute(attr, state));\n        }\n    }\n    // In case if current node is a text-only snippet without fields, we should\n    // put all children as siblings\n    if (!elem.name && !elem.attributes && elem.value && !elem.value.some(isField$1)) {\n        // XXX it’s unclear that `children` is not bound to `elem`\n        // due to concat operation\n        result = result.concat(children);\n    }\n    else {\n        elem.children = children;\n    }\n    return result;\n}\nfunction convertGroup(node, state) {\n    let result = [];\n    for (const child of node.elements) {\n        result = result.concat(convertStatement(child, state));\n    }\n    if (node.repeat) {\n        result = attachRepeater(result, node.repeat);\n    }\n    return result;\n}\nfunction convertAttribute(node, state) {\n    let implied = false;\n    let isBoolean = false;\n    let valueType = node.expression ? 'expression' : 'raw';\n    let value;\n    const name = node.name && stringifyName(node.name, state);\n    if (name && name[0] === '!') {\n        implied = true;\n    }\n    if (name && name[name.length - 1] === '.') {\n        isBoolean = true;\n    }\n    if (node.value) {\n        const tokens = node.value.slice();\n        if (isQuote$1(tokens[0])) {\n            // It’s a quoted value: remove quotes from output but mark attribute\n            // value as quoted\n            const quote = tokens.shift();\n            if (tokens.length && last$1(tokens).type === quote.type) {\n                tokens.pop();\n            }\n            valueType = quote.single ? 'singleQuote' : 'doubleQuote';\n        }\n        else if (isBracket$2(tokens[0], 'expression', true)) {\n            // Value is expression: remove brackets but mark value type\n            valueType = 'expression';\n            tokens.shift();\n            if (isBracket$2(last$1(tokens), 'expression', false)) {\n                tokens.pop();\n            }\n        }\n        value = stringifyValue$1(tokens, state);\n    }\n    return {\n        name: isBoolean || implied\n            ? name.slice(implied ? 1 : 0, isBoolean ? -1 : void 0)\n            : name,\n        value,\n        boolean: isBoolean,\n        implied,\n        valueType,\n        multiple: node.multiple\n    };\n}\n/**\n * Converts given token list to string\n */\nfunction stringifyName(tokens, state) {\n    let str = '';\n    for (let i = 0; i < tokens.length; i++) {\n        str += stringify$1(tokens[i], state);\n    }\n    return str;\n}\n/**\n * Converts given token list to value list\n */\nfunction stringifyValue$1(tokens, state) {\n    const result = [];\n    let str = '';\n    for (let i = 0, token; i < tokens.length; i++) {\n        token = tokens[i];\n        if (isField$1(token)) {\n            // We should keep original fields in output since some editors has their\n            // own syntax for field or doesn’t support fields at all so we should\n            // capture actual field location in output stream\n            if (str) {\n                result.push(str);\n                str = '';\n            }\n            result.push(token);\n        }\n        else {\n            str += stringify$1(token, state);\n        }\n    }\n    if (str) {\n        result.push(str);\n    }\n    return result;\n}\nfunction isGroup(node) {\n    return node.type === 'TokenGroup';\n}\nfunction isField$1(token) {\n    return typeof token === 'object' && token.type === 'Field' && token.index != null;\n}\nfunction last$1(arr) {\n    return arr[arr.length - 1];\n}\nfunction deepestNode(node) {\n    return node.children.length ? deepestNode(last$1(node.children)) : node;\n}\nfunction insertText(node, text) {\n    if (node.value) {\n        const lastToken = last$1(node.value);\n        if (typeof lastToken === 'string') {\n            node.value[node.value.length - 1] += text;\n        }\n        else {\n            node.value.push(text);\n        }\n    }\n    else {\n        node.value = [text];\n    }\n}\nfunction insertHref(node, text) {\n    var _a;\n    let href = '';\n    if (urlRegex.test(text)) {\n        href = text;\n        if (!/\\w+:/.test(href) && !href.startsWith('//')) {\n            href = `http://${href}`;\n        }\n    }\n    else if (emailRegex.test(text)) {\n        href = `mailto:${text}`;\n    }\n    const hrefAttribute = (_a = node.attributes) === null || _a === void 0 ? void 0 : _a.find(attr => attr.name === 'href');\n    if (!hrefAttribute) {\n        if (!node.attributes) {\n            node.attributes = [];\n        }\n        node.attributes.push({ name: 'href', value: [href], valueType: 'doubleQuote' });\n    }\n    else if (!hrefAttribute.value) {\n        hrefAttribute.value = [href];\n    }\n}\nfunction attachRepeater(items, repeater) {\n    for (const item of items) {\n        if (!item.repeat) {\n            item.repeat = Object.assign({}, repeater);\n        }\n    }\n    return items;\n}\n\n/**\n * Parses given abbreviation into node tree\n */\nfunction parseAbbreviation(abbr, options) {\n    try {\n        const tokens = typeof abbr === 'string' ? tokenize$1(abbr) : abbr;\n        return convert(abbreviation(tokens, options), options);\n    }\n    catch (err) {\n        if (err instanceof ScannerError && typeof abbr === 'string') {\n            err.message += `\\n${abbr}\\n${'-'.repeat(err.pos)}^`;\n        }\n        throw err;\n    }\n}\n\nvar OperatorType;\n(function (OperatorType) {\n    OperatorType[\"Sibling\"] = \"+\";\n    OperatorType[\"Important\"] = \"!\";\n    OperatorType[\"ArgumentDelimiter\"] = \",\";\n    OperatorType[\"ValueDelimiter\"] = \"-\";\n    OperatorType[\"PropertyDelimiter\"] = \":\";\n})(OperatorType || (OperatorType = {}));\n\nvar Chars$2;\n(function (Chars) {\n    /** `#` character */\n    Chars[Chars[\"Hash\"] = 35] = \"Hash\";\n    /** `$` character */\n    Chars[Chars[\"Dollar\"] = 36] = \"Dollar\";\n    /** `-` character */\n    Chars[Chars[\"Dash\"] = 45] = \"Dash\";\n    /** `.` character */\n    Chars[Chars[\"Dot\"] = 46] = \"Dot\";\n    /** `:` character */\n    Chars[Chars[\"Colon\"] = 58] = \"Colon\";\n    /** `,` character */\n    Chars[Chars[\"Comma\"] = 44] = \"Comma\";\n    /** `!` character */\n    Chars[Chars[\"Excl\"] = 33] = \"Excl\";\n    /** `@` character */\n    Chars[Chars[\"At\"] = 64] = \"At\";\n    /** `%` character */\n    Chars[Chars[\"Percent\"] = 37] = \"Percent\";\n    /** `_` character */\n    Chars[Chars[\"Underscore\"] = 95] = \"Underscore\";\n    /** `(` character */\n    Chars[Chars[\"RoundBracketOpen\"] = 40] = \"RoundBracketOpen\";\n    /** `)` character */\n    Chars[Chars[\"RoundBracketClose\"] = 41] = \"RoundBracketClose\";\n    /** `{` character */\n    Chars[Chars[\"CurlyBracketOpen\"] = 123] = \"CurlyBracketOpen\";\n    /** `}` character */\n    Chars[Chars[\"CurlyBracketClose\"] = 125] = \"CurlyBracketClose\";\n    /** `+` character */\n    Chars[Chars[\"Sibling\"] = 43] = \"Sibling\";\n    /** `'` character */\n    Chars[Chars[\"SingleQuote\"] = 39] = \"SingleQuote\";\n    /** `\"` character */\n    Chars[Chars[\"DoubleQuote\"] = 34] = \"DoubleQuote\";\n    /** `t` character */\n    Chars[Chars[\"Transparent\"] = 116] = \"Transparent\";\n    /** `/` character */\n    Chars[Chars[\"Slash\"] = 47] = \"Slash\";\n})(Chars$2 || (Chars$2 = {}));\n\nfunction tokenize(abbr, isValue) {\n    let brackets = 0;\n    let token;\n    const scanner = new Scanner(abbr);\n    const tokens = [];\n    while (!scanner.eof()) {\n        token = getToken(scanner, brackets === 0 && !isValue);\n        if (!token) {\n            throw scanner.error('Unexpected character');\n        }\n        if (token.type === 'Bracket') {\n            if (!brackets && token.open) {\n                mergeTokens(scanner, tokens);\n            }\n            brackets += token.open ? 1 : -1;\n            if (brackets < 0) {\n                throw scanner.error('Unexpected bracket', token.start);\n            }\n        }\n        tokens.push(token);\n        // Forcibly consume next operator after unit-less numeric value or color:\n        // next dash `-` must be used as value delimiter\n        if (shouldConsumeDashAfter(token) && (token = operator(scanner))) {\n            tokens.push(token);\n        }\n    }\n    return tokens;\n}\n/**\n * Returns next token from given scanner, if possible\n */\nfunction getToken(scanner, short) {\n    return field$1(scanner)\n        || customProperty(scanner)\n        || numberValue(scanner)\n        || colorValue(scanner)\n        || stringValue(scanner)\n        || bracket(scanner)\n        || operator(scanner)\n        || whiteSpace(scanner)\n        || literal$1(scanner, short);\n}\nfunction field$1(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(Chars$2.Dollar) && scanner.eat(Chars$2.CurlyBracketOpen)) {\n        scanner.start = scanner.pos;\n        let index;\n        let name = '';\n        if (scanner.eatWhile(isNumber$1)) {\n            // It’s a field\n            index = Number(scanner.current());\n            name = scanner.eat(Chars$2.Colon) ? consumePlaceholder$1(scanner) : '';\n        }\n        else if (isAlpha$1(scanner.peek())) {\n            // It’s a variable\n            name = consumePlaceholder$1(scanner);\n        }\n        if (scanner.eat(Chars$2.CurlyBracketClose)) {\n            return {\n                type: 'Field',\n                index, name,\n                start,\n                end: scanner.pos\n            };\n        }\n        throw scanner.error('Expecting }');\n    }\n    // If we reached here then there’s no valid field here, revert\n    // back to starting position\n    scanner.pos = start;\n}\n/**\n * Consumes a placeholder: value right after `:` in field. Could be empty\n */\nfunction consumePlaceholder$1(stream) {\n    const stack = [];\n    stream.start = stream.pos;\n    while (!stream.eof()) {\n        if (stream.eat(Chars$2.CurlyBracketOpen)) {\n            stack.push(stream.pos);\n        }\n        else if (stream.eat(Chars$2.CurlyBracketClose)) {\n            if (!stack.length) {\n                stream.pos--;\n                break;\n            }\n            stack.pop();\n        }\n        else {\n            stream.pos++;\n        }\n    }\n    if (stack.length) {\n        stream.pos = stack.pop();\n        throw stream.error(`Expecting }`);\n    }\n    return stream.current();\n}\n/**\n * Consumes literal from given scanner\n * @param short Use short notation for consuming value.\n * The difference between “short” and “full” notation is that first one uses\n * alpha characters only and used for extracting keywords from abbreviation,\n * while “full” notation also supports numbers and dashes\n */\nfunction literal$1(scanner, short) {\n    const start = scanner.pos;\n    if (scanner.eat(isIdentPrefix)) {\n        // SCSS or LESS variable\n        // NB a bit dirty hack: if abbreviation starts with identifier prefix,\n        // consume alpha characters only to allow embedded variables\n        scanner.eatWhile(start ? isKeyword : isLiteral$1);\n    }\n    else if (scanner.eat(isAlphaWord)) {\n        scanner.eatWhile(short ? isLiteral$1 : isKeyword);\n    }\n    else {\n        // Allow dots only at the beginning of literal\n        scanner.eat(Chars$2.Dot);\n        scanner.eatWhile(isLiteral$1);\n    }\n    if (start !== scanner.pos) {\n        scanner.start = start;\n        return createLiteral(scanner, scanner.start = start);\n    }\n}\nfunction createLiteral(scanner, start = scanner.start, end = scanner.pos) {\n    return {\n        type: 'Literal',\n        value: scanner.substring(start, end),\n        start,\n        end\n    };\n}\n/**\n * Consumes numeric CSS value (number with optional unit) from current stream,\n * if possible\n */\nfunction numberValue(scanner) {\n    const start = scanner.pos;\n    if (consumeNumber(scanner)) {\n        scanner.start = start;\n        const rawValue = scanner.current();\n        // eat unit, which can be a % or alpha word\n        scanner.start = scanner.pos;\n        scanner.eat(Chars$2.Percent) || scanner.eatWhile(isAlphaWord);\n        return {\n            type: 'NumberValue',\n            value: Number(rawValue),\n            rawValue,\n            unit: scanner.current(),\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes quoted string value from given scanner\n */\nfunction stringValue(scanner) {\n    const ch = scanner.peek();\n    const start = scanner.pos;\n    let finished = false;\n    if (isQuote$2(ch)) {\n        scanner.pos++;\n        while (!scanner.eof()) {\n            // Do not throw error on malformed string\n            if (scanner.eat(ch)) {\n                finished = true;\n                break;\n            }\n            else {\n                scanner.pos++;\n            }\n        }\n        scanner.start = start;\n        return {\n            type: 'StringValue',\n            value: scanner.substring(start + 1, scanner.pos - (finished ? 1 : 0)),\n            quote: ch === Chars$2.SingleQuote ? 'single' : 'double',\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes a color token from given string\n */\nfunction colorValue(scanner) {\n    // supported color variations:\n    // #abc   → #aabbccc\n    // #0     → #000000\n    // #fff.5 → rgba(255, 255, 255, 0.5)\n    // #t     → transparent\n    const start = scanner.pos;\n    if (scanner.eat(Chars$2.Hash)) {\n        const valueStart = scanner.pos;\n        let color = '';\n        let alpha = '';\n        if (scanner.eatWhile(isHex)) {\n            color = scanner.substring(valueStart, scanner.pos);\n            alpha = colorAlpha(scanner);\n        }\n        else if (scanner.eat(Chars$2.Transparent)) {\n            color = '0';\n            alpha = colorAlpha(scanner) || '0';\n        }\n        else {\n            alpha = colorAlpha(scanner);\n        }\n        if (color || alpha || scanner.eof()) {\n            const { r, g, b, a } = parseColor(color, alpha);\n            return {\n                type: 'ColorValue',\n                r, g, b, a,\n                raw: scanner.substring(start + 1, scanner.pos),\n                start,\n                end: scanner.pos\n            };\n        }\n        else {\n            // Consumed # but no actual value: invalid color value, treat it as literal\n            return createLiteral(scanner, start);\n        }\n    }\n    scanner.pos = start;\n}\n/**\n * Consumes alpha value of color: `.1`\n */\nfunction colorAlpha(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(Chars$2.Dot)) {\n        scanner.start = start;\n        if (scanner.eatWhile(isNumber$1)) {\n            return scanner.current();\n        }\n        return '1';\n    }\n    return '';\n}\n/**\n * Consumes white space characters as string literal from given scanner\n */\nfunction whiteSpace(scanner) {\n    const start = scanner.pos;\n    if (scanner.eatWhile(isSpace)) {\n        return {\n            type: 'WhiteSpace',\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes custom CSS property: --foo-bar\n */\nfunction customProperty(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(Chars$2.Dash) && scanner.eat(Chars$2.Dash)) {\n        scanner.start = start;\n        scanner.eatWhile(isKeyword);\n        return {\n            type: 'CustomProperty',\n            value: scanner.current(),\n            start,\n            end: scanner.pos\n        };\n    }\n    scanner.pos = start;\n}\n/**\n * Consumes bracket from given scanner\n */\nfunction bracket(scanner) {\n    const ch = scanner.peek();\n    if (isBracket$1(ch)) {\n        return {\n            type: 'Bracket',\n            open: ch === Chars$2.RoundBracketOpen,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes operator from given scanner\n */\nfunction operator(scanner) {\n    const op = operatorType(scanner.peek());\n    if (op) {\n        return {\n            type: 'Operator',\n            operator: op,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Eats number value from given stream\n * @return Returns `true` if number was consumed\n */\nfunction consumeNumber(stream) {\n    const start = stream.pos;\n    stream.eat(Chars$2.Dash);\n    const afterNegative = stream.pos;\n    const hasDecimal = stream.eatWhile(isNumber$1);\n    const prevPos = stream.pos;\n    if (stream.eat(Chars$2.Dot)) {\n        // It’s perfectly valid to have numbers like `1.`, which enforces\n        // value to float unit type\n        const hasFloat = stream.eatWhile(isNumber$1);\n        if (!hasDecimal && !hasFloat) {\n            // Lone dot\n            stream.pos = prevPos;\n        }\n    }\n    // Edge case: consumed dash only: not a number, bail-out\n    if (stream.pos === afterNegative) {\n        stream.pos = start;\n    }\n    return stream.pos !== start;\n}\nfunction isIdentPrefix(code) {\n    return code === Chars$2.At || code === Chars$2.Dollar;\n}\n/**\n * If given character is an operator, returns it’s type\n */\nfunction operatorType(ch) {\n    return (ch === Chars$2.Sibling && OperatorType.Sibling)\n        || (ch === Chars$2.Excl && OperatorType.Important)\n        || (ch === Chars$2.Comma && OperatorType.ArgumentDelimiter)\n        || (ch === Chars$2.Colon && OperatorType.PropertyDelimiter)\n        || (ch === Chars$2.Dash && OperatorType.ValueDelimiter)\n        || void 0;\n}\n/**\n * Check if given code is a hex value (/0-9a-f/)\n */\nfunction isHex(code) {\n    return isNumber$1(code) || isAlpha$1(code, 65, 70); // A-F\n}\nfunction isKeyword(code) {\n    return isAlphaNumericWord(code) || code === Chars$2.Dash;\n}\nfunction isBracket$1(code) {\n    return code === Chars$2.RoundBracketOpen || code === Chars$2.RoundBracketClose;\n}\nfunction isLiteral$1(code) {\n    return isAlphaWord(code) || code === Chars$2.Percent || code === Chars$2.Slash;\n}\n/**\n * Parses given color value from abbreviation into RGBA format\n */\nfunction parseColor(value, alpha) {\n    let r = '0';\n    let g = '0';\n    let b = '0';\n    let a = Number(alpha != null && alpha !== '' ? alpha : 1);\n    if (value === 't') {\n        a = 0;\n    }\n    else {\n        switch (value.length) {\n            case 0:\n                break;\n            case 1:\n                r = g = b = value + value;\n                break;\n            case 2:\n                r = g = b = value;\n                break;\n            case 3:\n                r = value[0] + value[0];\n                g = value[1] + value[1];\n                b = value[2] + value[2];\n                break;\n            default:\n                value += value;\n                r = value.slice(0, 2);\n                g = value.slice(2, 4);\n                b = value.slice(4, 6);\n        }\n    }\n    return {\n        r: parseInt(r, 16),\n        g: parseInt(g, 16),\n        b: parseInt(b, 16),\n        a\n    };\n}\n/**\n * Check if scanner reader must consume dash after given token.\n * Used in cases where user must explicitly separate numeric values\n */\nfunction shouldConsumeDashAfter(token) {\n    return token.type === 'ColorValue' || (token.type === 'NumberValue' && !token.unit);\n}\n/**\n * Merges last adjacent tokens into a single literal.\n * This function is used to overcome edge case when function name was parsed\n * as a list of separate tokens. For example, a `scale3d()` value will be\n * parsed as literal and number tokens (`scale` and `3d`) which is a perfectly\n * valid abbreviation but undesired result. This function will detect last adjacent\n * literal and number values and combine them into single literal\n */\nfunction mergeTokens(scanner, tokens) {\n    let start = 0;\n    let end = 0;\n    while (tokens.length) {\n        const token = last(tokens);\n        if (token.type === 'Literal' || token.type === 'NumberValue') {\n            start = token.start;\n            if (!end) {\n                end = token.end;\n            }\n            tokens.pop();\n        }\n        else {\n            break;\n        }\n    }\n    if (start !== end) {\n        tokens.push(createLiteral(scanner, start, end));\n    }\n}\nfunction last(arr) {\n    return arr[arr.length - 1];\n}\n\nfunction tokenScanner(tokens) {\n    return {\n        tokens,\n        start: 0,\n        pos: 0,\n        size: tokens.length\n    };\n}\nfunction peek$2(scanner) {\n    return scanner.tokens[scanner.pos];\n}\nfunction readable(scanner) {\n    return scanner.pos < scanner.size;\n}\nfunction consume$1(scanner, test) {\n    if (test(peek$2(scanner))) {\n        scanner.pos++;\n        return true;\n    }\n    return false;\n}\nfunction error(scanner, message, token = peek$2(scanner)) {\n    if (token && token.start != null) {\n        message += ` at ${token.start}`;\n    }\n    const err = new Error(message);\n    err['pos'] = token && token.start;\n    return err;\n}\n\nfunction parser(tokens, options = {}) {\n    const scanner = tokenScanner(tokens);\n    const result = [];\n    let property;\n    while (readable(scanner)) {\n        if (property = consumeProperty(scanner, options)) {\n            result.push(property);\n        }\n        else if (!consume$1(scanner, isSiblingOperator)) {\n            throw error(scanner, 'Unexpected token');\n        }\n    }\n    return result;\n}\n/**\n * Consumes single CSS property\n */\nfunction consumeProperty(scanner, options) {\n    let name;\n    let important = false;\n    let valueFragment;\n    const value = [];\n    const token = peek$2(scanner);\n    const valueMode = !!options.value;\n    if (!valueMode && isLiteral(token) && !isFunctionStart(scanner)) {\n        scanner.pos++;\n        name = token.value;\n        // Consume any following value delimiter after property name\n        consume$1(scanner, isValueDelimiter);\n    }\n    // Skip whitespace right after property name, if any\n    if (valueMode) {\n        consume$1(scanner, isWhiteSpace$1);\n    }\n    while (readable(scanner)) {\n        if (consume$1(scanner, isImportant)) {\n            important = true;\n        }\n        else if (valueFragment = consumeValue(scanner, valueMode)) {\n            value.push(valueFragment);\n        }\n        else if (!consume$1(scanner, isFragmentDelimiter)) {\n            break;\n        }\n    }\n    if (name || value.length || important) {\n        return { name, value, important };\n    }\n}\n/**\n * Consumes single value fragment, e.g. all value tokens before comma\n */\nfunction consumeValue(scanner, inArgument) {\n    const result = [];\n    let token;\n    let args;\n    while (readable(scanner)) {\n        token = peek$2(scanner);\n        if (isValue(token)) {\n            scanner.pos++;\n            if (isLiteral(token) && (args = consumeArguments(scanner))) {\n                result.push({\n                    type: 'FunctionCall',\n                    name: token.value,\n                    arguments: args\n                });\n            }\n            else {\n                result.push(token);\n            }\n        }\n        else if (isValueDelimiter(token) || (inArgument && isWhiteSpace$1(token))) {\n            scanner.pos++;\n        }\n        else {\n            break;\n        }\n    }\n    return result.length\n        ? { type: 'CSSValue', value: result }\n        : void 0;\n}\nfunction consumeArguments(scanner) {\n    const start = scanner.pos;\n    if (consume$1(scanner, isOpenBracket$1)) {\n        const args = [];\n        let value;\n        while (readable(scanner) && !consume$1(scanner, isCloseBracket$1)) {\n            if (value = consumeValue(scanner, true)) {\n                args.push(value);\n            }\n            else if (!consume$1(scanner, isWhiteSpace$1) && !consume$1(scanner, isArgumentDelimiter)) {\n                throw error(scanner, 'Unexpected token');\n            }\n        }\n        scanner.start = start;\n        return args;\n    }\n}\nfunction isLiteral(token) {\n    return token && token.type === 'Literal';\n}\nfunction isBracket(token, open) {\n    return token && token.type === 'Bracket' && (open == null || token.open === open);\n}\nfunction isOpenBracket$1(token) {\n    return isBracket(token, true);\n}\nfunction isCloseBracket$1(token) {\n    return isBracket(token, false);\n}\nfunction isWhiteSpace$1(token) {\n    return token && token.type === 'WhiteSpace';\n}\nfunction isOperator(token, operator) {\n    return token && token.type === 'Operator' && (!operator || token.operator === operator);\n}\nfunction isSiblingOperator(token) {\n    return isOperator(token, OperatorType.Sibling);\n}\nfunction isArgumentDelimiter(token) {\n    return isOperator(token, OperatorType.ArgumentDelimiter);\n}\nfunction isFragmentDelimiter(token) {\n    return isArgumentDelimiter(token);\n}\nfunction isImportant(token) {\n    return isOperator(token, OperatorType.Important);\n}\nfunction isValue(token) {\n    return token.type === 'StringValue'\n        || token.type === 'ColorValue'\n        || token.type === 'NumberValue'\n        || token.type === 'Literal'\n        || token.type === 'Field'\n        || token.type === 'CustomProperty';\n}\nfunction isValueDelimiter(token) {\n    return isOperator(token, OperatorType.PropertyDelimiter)\n        || isOperator(token, OperatorType.ValueDelimiter);\n}\nfunction isFunctionStart(scanner) {\n    const t1 = scanner.tokens[scanner.pos];\n    const t2 = scanner.tokens[scanner.pos + 1];\n    return t1 && t2 && isLiteral(t1) && t2.type === 'Bracket';\n}\n\n/**\n * Parses given abbreviation into property set\n */\nfunction parse$2(abbr, options) {\n    try {\n        const tokens = typeof abbr === 'string' ? tokenize(abbr, options && options.value) : abbr;\n        return parser(tokens, options);\n    }\n    catch (err) {\n        if (err instanceof ScannerError && typeof abbr === 'string') {\n            err.message += `\\n${abbr}\\n${'-'.repeat(err.pos)}^`;\n        }\n        throw err;\n    }\n}\n\n/**\n * Merges attributes in current node: de-duplicates attributes with the same name\n * and merges class names\n */\nfunction mergeAttributes(node, config) {\n    if (!node.attributes) {\n        return;\n    }\n    const attributes = [];\n    const lookup = {};\n    for (const attr of node.attributes) {\n        if (attr.name) {\n            const attrName = attr.name;\n            if (attrName in lookup) {\n                const prev = lookup[attrName];\n                if (attrName === 'class') {\n                    prev.value = mergeValue(prev.value, attr.value, ' ');\n                }\n                else {\n                    mergeDeclarations(prev, attr, config);\n                }\n            }\n            else {\n                // Create new attribute instance so we can safely modify it later\n                attributes.push(lookup[attrName] = Object.assign({}, attr));\n            }\n        }\n        else {\n            attributes.push(attr);\n        }\n    }\n    node.attributes = attributes;\n}\n/**\n * Merges two token lists into single list. Adjacent strings are merged together\n */\nfunction mergeValue(prev, next, glue) {\n    if (prev && next) {\n        if (prev.length && glue) {\n            append(prev, glue);\n        }\n        for (const t of next) {\n            append(prev, t);\n        }\n        return prev;\n    }\n    const result = prev || next;\n    return result && result.slice();\n}\n/**\n * Merges data from `src` attribute into `dest` and returns it\n */\nfunction mergeDeclarations(dest, src, config) {\n    dest.name = src.name;\n    if (!config.options['output.reverseAttributes']) {\n        dest.value = src.value;\n    }\n    // Keep high-priority properties\n    if (!dest.implied) {\n        dest.implied = src.implied;\n    }\n    if (!dest.boolean) {\n        dest.boolean = src.boolean;\n    }\n    if (dest.valueType !== 'expression') {\n        dest.valueType = src.valueType;\n    }\n    return dest;\n}\nfunction append(tokens, value) {\n    const lastIx = tokens.length - 1;\n    if (typeof tokens[lastIx] === 'string' && typeof value === 'string') {\n        tokens[lastIx] += value;\n    }\n    else {\n        tokens.push(value);\n    }\n}\n\n/**\n * Walks over each child node of given markup abbreviation AST node (not including\n * given one) and invokes `fn` on each node.\n * The `fn` callback accepts context node, list of ancestor nodes and optional\n * state object\n */\nfunction walk$1(node, fn, state) {\n    const ancestors = [node];\n    const callback = (ctx) => {\n        fn(ctx, ancestors, state);\n        ancestors.push(ctx);\n        ctx.children.forEach(callback);\n        ancestors.pop();\n    };\n    node.children.forEach(callback);\n}\n/**\n * Finds first child node that matches given `callback`\n */\nfunction find$1(node, callback) {\n    for (let i = 0; i < node.children.length; i++) {\n        const child = node.children[i];\n        if (callback(child)) {\n            return child;\n        }\n        const result = find$1(child, callback);\n        if (result) {\n            return result;\n        }\n    }\n}\n/**\n * Finds node which is the deepest for in current node or node itself.\n */\nfunction findDeepest(node) {\n    let parent;\n    while (node.children.length) {\n        parent = node;\n        node = node.children[node.children.length - 1];\n    }\n    return { parent, node };\n}\nfunction isNode(node) {\n    return node.type === 'AbbreviationNode';\n}\n\n/**\n * Finds matching snippet from `registry` and resolves it into a parsed abbreviation.\n * Resolved node is then updated or replaced with matched abbreviation tree.\n *\n * A HTML registry basically contains aliases to another Emmet abbreviations,\n * e.g. a predefined set of name, attributes and so on, possibly a complex\n * abbreviation with multiple elements. So we have to get snippet, parse it\n * and recursively resolve it.\n */\nfunction resolveSnippets(abbr, config) {\n    const stack = [];\n    const reversed = config.options['output.reverseAttributes'];\n    const { warn } = config;\n    const resolve = (child) => {\n        const snippet = child.name && config.snippets[child.name];\n        // A snippet in stack means circular reference.\n        // It can be either a user error or a perfectly valid snippet like\n        // \"img\": \"img[src alt]/\", e.g. an element with predefined shape.\n        // In any case, simply stop parsing and keep element as is\n        if (!snippet || stack.includes(snippet)) {\n            return null;\n        }\n        let snippetAbbr;\n        try {\n            // User may add invlid snippet. In this case, silently bail out\n            snippetAbbr = parseAbbreviation(snippet, config);\n        }\n        catch (err) {\n            warn === null || warn === void 0 ? void 0 : warn(`Unable to parse \"${snippet}\" snippet`, err);\n            return null;\n        }\n        stack.push(snippet);\n        walkResolve(snippetAbbr, resolve);\n        stack.pop();\n        // Add attributes from current node into every top-level node of parsed abbreviation\n        for (const topNode of snippetAbbr.children) {\n            if (child.attributes) {\n                const from = topNode.attributes || [];\n                const to = child.attributes || [];\n                topNode.attributes = reversed ? to.concat(from) : from.concat(to);\n            }\n            mergeNodes(child, topNode);\n        }\n        return snippetAbbr;\n    };\n    walkResolve(abbr, resolve);\n    return abbr;\n}\nfunction walkResolve(node, resolve, config) {\n    let children = [];\n    for (const child of node.children) {\n        const resolved = resolve(child);\n        if (resolved) {\n            children = children.concat(resolved.children);\n            const deepest = findDeepest(resolved);\n            if (isNode(deepest.node)) {\n                deepest.node.children = deepest.node.children.concat(walkResolve(child, resolve));\n            }\n        }\n        else {\n            children.push(child);\n            child.children = walkResolve(child, resolve);\n        }\n    }\n    return node.children = children;\n}\n/**\n * Adds data from first node into second node\n */\nfunction mergeNodes(from, to) {\n    if (from.selfClosing) {\n        to.selfClosing = true;\n    }\n    if (from.value != null) {\n        to.value = from.value;\n    }\n    if (from.repeat) {\n        to.repeat = from.repeat;\n    }\n}\n\nconst expressionStart = '{';\nconst expressionEnd = '}';\nfunction createOutputStream(options, level = 0) {\n    return {\n        options,\n        value: '',\n        level,\n        offset: 0,\n        line: 0,\n        column: 0\n    };\n}\n/**\n * Pushes plain string into output stream without newline processing\n */\nfunction push(stream, text) {\n    const processText = stream.options['output.text'];\n    _push(stream, processText(text, stream.offset, stream.line, stream.column));\n}\n/**\n * Pushes given string with possible newline formatting into output\n */\nfunction pushString(stream, value) {\n    // If given value contains newlines, we should push content line-by-line and\n    // use `pushNewline()` to maintain proper line/column state\n    const lines = splitByLines$1(value);\n    for (let i = 0, il = lines.length - 1; i <= il; i++) {\n        push(stream, lines[i]);\n        if (i !== il) {\n            pushNewline(stream, true);\n        }\n    }\n}\n/**\n * Pushes new line into given output stream\n */\nfunction pushNewline(stream, indent) {\n    const baseIndent = stream.options['output.baseIndent'];\n    const newline = stream.options['output.newline'];\n    push(stream, newline + baseIndent);\n    stream.line++;\n    stream.column = baseIndent.length;\n    if (indent) {\n        pushIndent(stream, indent === true ? stream.level : indent);\n    }\n}\n/**\n * Adds indentation of `size` to current output stream\n */\nfunction pushIndent(stream, size = stream.level) {\n    const indent = stream.options['output.indent'];\n    push(stream, indent.repeat(Math.max(size, 0)));\n}\n/**\n * Pushes field/tabstop into output stream\n */\nfunction pushField(stream, index, placeholder) {\n    const field = stream.options['output.field'];\n    // NB: use `_push` instead of `push` to skip text processing\n    _push(stream, field(index, placeholder, stream.offset, stream.line, stream.column));\n}\n/**\n * Returns given tag name formatted according to given config\n */\nfunction tagName(name, config) {\n    return strCase(name, config.options['output.tagCase']);\n}\n/**\n * Returns given attribute name formatted according to given config\n */\nfunction attrName(name, config) {\n    return strCase(name, config.options['output.attributeCase']);\n}\n/**\n * Returns character for quoting value of given attribute\n */\nfunction attrQuote(attr, config, isOpen) {\n    if (attr.valueType === 'expression') {\n        return isOpen ? expressionStart : expressionEnd;\n    }\n    return config.options['output.attributeQuotes'] === 'single' ? '\\'' : '\"';\n}\n/**\n * Check if given attribute is boolean\n */\nfunction isBooleanAttribute(attr, config) {\n    return attr.boolean\n        || config.options['output.booleanAttributes'].includes((attr.name || '').toLowerCase());\n}\n/**\n * Returns a token for self-closing tag, depending on current options\n */\nfunction selfClose(config) {\n    switch (config.options['output.selfClosingStyle']) {\n        case 'xhtml': return ' /';\n        case 'xml': return '/';\n        default: return '';\n    }\n}\n/**\n * Check if given tag name belongs to inline-level element\n * @param node Parsed node or tag name\n */\nfunction isInline(node, config) {\n    if (typeof node === 'string') {\n        return config.options.inlineElements.includes(node.toLowerCase());\n    }\n    // inline node is a node either with inline-level name or text-only node\n    return node.name ? isInline(node.name, config) : Boolean(node.value && !node.attributes);\n}\n/**\n * Splits given text by lines\n */\nfunction splitByLines$1(text) {\n    return text.split(/\\r\\n|\\r|\\n/g);\n}\n/**\n * Pushes raw string into output stream without any processing\n */\nfunction _push(stream, text) {\n    stream.value += text;\n    stream.offset += text.length;\n    stream.column += text.length;\n}\nfunction strCase(str, type) {\n    if (type) {\n        return type === 'upper' ? str.toUpperCase() : str.toLowerCase();\n    }\n    return str;\n}\n\nconst elementMap = {\n    p: 'span',\n    ul: 'li',\n    ol: 'li',\n    table: 'tr',\n    tr: 'td',\n    tbody: 'tr',\n    thead: 'tr',\n    tfoot: 'tr',\n    colgroup: 'col',\n    select: 'option',\n    optgroup: 'option',\n    audio: 'source',\n    video: 'source',\n    object: 'param',\n    map: 'area'\n};\nfunction implicitTag(node, ancestors, config) {\n    if (!node.name && node.attributes) {\n        resolveImplicitTag(node, ancestors, config);\n    }\n}\nfunction resolveImplicitTag(node, ancestors, config) {\n    const parent = getParentElement(ancestors);\n    const contextName = config.context ? config.context.name : '';\n    const parentName = lowercase(parent ? parent.name : contextName);\n    node.name = elementMap[parentName]\n        || (isInline(parentName, config) ? 'span' : 'div');\n}\nfunction lowercase(str) {\n    return (str || '').toLowerCase();\n}\n/**\n * Returns closest element node from given ancestors list\n */\nfunction getParentElement(ancestors) {\n    for (let i = ancestors.length - 1; i >= 0; i--) {\n        const elem = ancestors[i];\n        if (isNode(elem)) {\n            return elem;\n        }\n    }\n}\n\nvar latin = {\n\t\"common\": [\"lorem\", \"ipsum\", \"dolor\", \"sit\", \"amet\", \"consectetur\", \"adipisicing\", \"elit\"],\n\t\"words\": [\"exercitationem\", \"perferendis\", \"perspiciatis\", \"laborum\", \"eveniet\",\n\t\t\"sunt\", \"iure\", \"nam\", \"nobis\", \"eum\", \"cum\", \"officiis\", \"excepturi\",\n\t\t\"odio\", \"consectetur\", \"quasi\", \"aut\", \"quisquam\", \"vel\", \"eligendi\",\n\t\t\"itaque\", \"non\", \"odit\", \"tempore\", \"quaerat\", \"dignissimos\",\n\t\t\"facilis\", \"neque\", \"nihil\", \"expedita\", \"vitae\", \"vero\", \"ipsum\",\n\t\t\"nisi\", \"animi\", \"cumque\", \"pariatur\", \"velit\", \"modi\", \"natus\",\n\t\t\"iusto\", \"eaque\", \"sequi\", \"illo\", \"sed\", \"ex\", \"et\", \"voluptatibus\",\n\t\t\"tempora\", \"veritatis\", \"ratione\", \"assumenda\", \"incidunt\", \"nostrum\",\n\t\t\"placeat\", \"aliquid\", \"fuga\", \"provident\", \"praesentium\", \"rem\",\n\t\t\"necessitatibus\", \"suscipit\", \"adipisci\", \"quidem\", \"possimus\",\n\t\t\"voluptas\", \"debitis\", \"sint\", \"accusantium\", \"unde\", \"sapiente\",\n\t\t\"voluptate\", \"qui\", \"aspernatur\", \"laudantium\", \"soluta\", \"amet\",\n\t\t\"quo\", \"aliquam\", \"saepe\", \"culpa\", \"libero\", \"ipsa\", \"dicta\",\n\t\t\"reiciendis\", \"nesciunt\", \"doloribus\", \"autem\", \"impedit\", \"minima\",\n\t\t\"maiores\", \"repudiandae\", \"ipsam\", \"obcaecati\", \"ullam\", \"enim\",\n\t\t\"totam\", \"delectus\", \"ducimus\", \"quis\", \"voluptates\", \"dolores\",\n\t\t\"molestiae\", \"harum\", \"dolorem\", \"quia\", \"voluptatem\", \"molestias\",\n\t\t\"magni\", \"distinctio\", \"omnis\", \"illum\", \"dolorum\", \"voluptatum\", \"ea\",\n\t\t\"quas\", \"quam\", \"corporis\", \"quae\", \"blanditiis\", \"atque\", \"deserunt\",\n\t\t\"laboriosam\", \"earum\", \"consequuntur\", \"hic\", \"cupiditate\",\n\t\t\"quibusdam\", \"accusamus\", \"ut\", \"rerum\", \"error\", \"minus\", \"eius\",\n\t\t\"ab\", \"ad\", \"nemo\", \"fugit\", \"officia\", \"at\", \"in\", \"id\", \"quos\",\n\t\t\"reprehenderit\", \"numquam\", \"iste\", \"fugiat\", \"sit\", \"inventore\",\n\t\t\"beatae\", \"repellendus\", \"magnam\", \"recusandae\", \"quod\", \"explicabo\",\n\t\t\"doloremque\", \"aperiam\", \"consequatur\", \"asperiores\", \"commodi\",\n\t\t\"optio\", \"dolor\", \"labore\", \"temporibus\", \"repellat\", \"veniam\",\n\t\t\"architecto\", \"est\", \"esse\", \"mollitia\", \"nulla\", \"a\", \"similique\",\n\t\t\"eos\", \"alias\", \"dolore\", \"tenetur\", \"deleniti\", \"porro\", \"facere\",\n\t\t\"maxime\", \"corrupti\"]\n};\n\nvar ru = {\n\t\"common\": [\"далеко-далеко\", \"за\", \"словесными\", \"горами\", \"в стране\", \"гласных\", \"и согласных\", \"живут\", \"рыбные\", \"тексты\"],\n\t\"words\": [\"вдали\", \"от всех\", \"они\", \"буквенных\", \"домах\", \"на берегу\", \"семантика\",\n\t\t\"большого\", \"языкового\", \"океана\", \"маленький\", \"ручеек\", \"даль\",\n\t\t\"журчит\", \"по всей\", \"обеспечивает\", \"ее\",\"всеми\", \"необходимыми\",\n\t\t\"правилами\", \"эта\", \"парадигматическая\", \"страна\", \"которой\", \"жаренные\",\n\t\t\"предложения\", \"залетают\", \"прямо\", \"рот\", \"даже\", \"всемогущая\",\n\t\t\"пунктуация\", \"не\", \"имеет\", \"власти\", \"над\", \"рыбными\", \"текстами\",\n\t\t\"ведущими\", \"безорфографичный\", \"образ\", \"жизни\", \"однажды\", \"одна\",\n\t\t\"маленькая\", \"строчка\",\"рыбного\", \"текста\", \"имени\", \"lorem\", \"ipsum\",\n\t\t\"решила\", \"выйти\", \"большой\", \"мир\", \"грамматики\", \"великий\", \"оксмокс\",\n\t\t\"предупреждал\", \"о\", \"злых\", \"запятых\", \"диких\", \"знаках\", \"вопроса\",\n\t\t\"коварных\", \"точках\", \"запятой\", \"но\", \"текст\", \"дал\", \"сбить\",\n\t\t\"себя\", \"толку\", \"он\", \"собрал\", \"семь\", \"своих\", \"заглавных\", \"букв\",\n\t\t\"подпоясал\", \"инициал\", \"за\", \"пояс\", \"пустился\", \"дорогу\",\n\t\t\"взобравшись\", \"первую\", \"вершину\", \"курсивных\", \"гор\", \"бросил\",\n\t\t\"последний\", \"взгляд\", \"назад\", \"силуэт\", \"своего\", \"родного\", \"города\",\n\t\t\"буквоград\", \"заголовок\", \"деревни\", \"алфавит\", \"подзаголовок\", \"своего\",\n\t\t\"переулка\", \"грустный\", \"реторический\", \"вопрос\", \"скатился\", \"его\",\n\t\t\"щеке\", \"продолжил\", \"свой\", \"путь\", \"дороге\", \"встретил\", \"рукопись\",\n\t\t\"она\", \"предупредила\",  \"моей\", \"все\", \"переписывается\", \"несколько\",\n\t\t\"раз\", \"единственное\", \"что\", \"меня\", \"осталось\", \"это\", \"приставка\",\n\t\t\"возвращайся\", \"ты\", \"лучше\", \"свою\", \"безопасную\", \"страну\", \"послушавшись\",\n\t\t\"рукописи\", \"наш\", \"продолжил\", \"свой\", \"путь\", \"вскоре\", \"ему\",\n\t\t\"повстречался\", \"коварный\", \"составитель\", \"рекламных\", \"текстов\",\n\t\t\"напоивший\", \"языком\", \"речью\", \"заманивший\", \"свое\", \"агентство\",\n\t\t\"которое\", \"использовало\", \"снова\", \"снова\", \"своих\", \"проектах\",\n\t\t\"если\", \"переписали\", \"то\", \"живет\", \"там\", \"до\", \"сих\", \"пор\"]\n};\n\nvar sp = {\n\t\"common\": [\"mujer\", \"uno\", \"dolor\", \"más\", \"de\", \"poder\", \"mismo\", \"si\"],\n\t\"words\": [\"ejercicio\", \"preferencia\", \"perspicacia\", \"laboral\", \"paño\",\n\t\t\"suntuoso\", \"molde\", \"namibia\", \"planeador\", \"mirar\", \"demás\", \"oficinista\", \"excepción\",\n\t\t\"odio\", \"consecuencia\", \"casi\", \"auto\", \"chicharra\", \"velo\", \"elixir\",\n\t\t\"ataque\", \"no\", \"odio\", \"temporal\", \"cuórum\", \"dignísimo\",\n\t\t\"facilismo\", \"letra\", \"nihilista\", \"expedición\", \"alma\", \"alveolar\", \"aparte\",\n\t\t\"león\", \"animal\", \"como\", \"paria\", \"belleza\", \"modo\", \"natividad\",\n\t\t\"justo\", \"ataque\", \"séquito\", \"pillo\", \"sed\", \"ex\", \"y\", \"voluminoso\",\n\t\t\"temporalidad\", \"verdades\", \"racional\", \"asunción\", \"incidente\", \"marejada\",\n\t\t\"placenta\", \"amanecer\", \"fuga\", \"previsor\", \"presentación\", \"lejos\",\n\t\t\"necesariamente\", \"sospechoso\", \"adiposidad\", \"quindío\", \"pócima\",\n\t\t\"voluble\", \"débito\", \"sintió\", \"accesorio\", \"falda\", \"sapiencia\",\n\t\t\"volutas\", \"queso\", \"permacultura\", \"laudo\", \"soluciones\", \"entero\",\n\t\t\"pan\", \"litro\", \"tonelada\", \"culpa\", \"libertario\", \"mosca\", \"dictado\",\n\t\t\"reincidente\", \"nascimiento\", \"dolor\", \"escolar\", \"impedimento\", \"mínima\",\n\t\t\"mayores\", \"repugnante\", \"dulce\", \"obcecado\", \"montaña\", \"enigma\",\n\t\t\"total\", \"deletéreo\", \"décima\", \"cábala\", \"fotografía\", \"dolores\",\n\t\t\"molesto\", \"olvido\", \"paciencia\", \"resiliencia\", \"voluntad\", \"molestias\",\n\t\t\"magnífico\", \"distinción\", \"ovni\", \"marejada\", \"cerro\", \"torre\", \"y\",\n\t\t\"abogada\", \"manantial\", \"corporal\", \"agua\", \"crepúsculo\", \"ataque\", \"desierto\",\n\t\t\"laboriosamente\", \"angustia\", \"afortunado\", \"alma\", \"encefalograma\",\n\t\t\"materialidad\", \"cosas\", \"o\", \"renuncia\", \"error\", \"menos\", \"conejo\",\n\t\t\"abadía\", \"analfabeto\", \"remo\", \"fugacidad\", \"oficio\", \"en\", \"almácigo\", \"vos\", \"pan\",\n\t\t\"represión\", \"números\", \"triste\", \"refugiado\", \"trote\", \"inventor\",\n\t\t\"corchea\", \"repelente\", \"magma\", \"recusado\", \"patrón\", \"explícito\",\n\t\t\"paloma\", \"síndrome\", \"inmune\", \"autoinmune\", \"comodidad\",\n\t\t\"ley\", \"vietnamita\", \"demonio\", \"tasmania\", \"repeler\", \"apéndice\",\n\t\t\"arquitecto\", \"columna\", \"yugo\", \"computador\", \"mula\", \"a\", \"propósito\",\n\t\t\"fantasía\", \"alias\", \"rayo\", \"tenedor\", \"deleznable\", \"ventana\", \"cara\",\n\t\t\"anemia\", \"corrupto\"]\n};\n\nconst vocabularies = { ru, sp, latin };\nconst reLorem = /^lorem([a-z]*)(\\d*)(-\\d*)?$/i;\nfunction lorem(node, ancestors, config) {\n    let m;\n    if (node.name && (m = node.name.match(reLorem))) {\n        const db = vocabularies[m[1]] || vocabularies.latin;\n        const minWordCount = m[2] ? Math.max(1, Number(m[2])) : 30;\n        const maxWordCount = m[3] ? Math.max(minWordCount, Number(m[3].slice(1))) : minWordCount;\n        const wordCount = rand(minWordCount, maxWordCount);\n        const repeat = node.repeat || findRepeater(ancestors);\n        node.name = node.attributes = void 0;\n        node.value = [paragraph(db, wordCount, !repeat || repeat.value === 0)];\n        if (node.repeat && ancestors.length > 1) {\n            resolveImplicitTag(node, ancestors, config);\n        }\n    }\n}\n/**\n * Returns random integer between <code>from</code> and <code>to</code> values\n */\nfunction rand(from, to) {\n    return Math.floor(Math.random() * (to - from) + from);\n}\nfunction sample(arr, count) {\n    const len = arr.length;\n    const iterations = Math.min(len, count);\n    const result = [];\n    while (result.length < iterations) {\n        const str = arr[rand(0, len)];\n        if (!result.includes(str)) {\n            result.push(str);\n        }\n    }\n    return result;\n}\nfunction choice(val) {\n    return val[rand(0, val.length - 1)];\n}\nfunction sentence(words, end) {\n    if (words.length) {\n        words = [capitalize(words[0])].concat(words.slice(1));\n    }\n    return words.join(' ') + (end || choice('?!...')); // more dots than question marks\n}\nfunction capitalize(word) {\n    return word[0].toUpperCase() + word.slice(1);\n}\n/**\n * Insert commas at randomly selected words. This function modifies values\n * inside `words` array\n */\nfunction insertCommas(words) {\n    if (words.length < 2) {\n        return words;\n    }\n    words = words.slice();\n    const len = words.length;\n    const hasComma = /,$/;\n    let totalCommas = 0;\n    if (len > 3 && len <= 6) {\n        totalCommas = rand(0, 1);\n    }\n    else if (len > 6 && len <= 12) {\n        totalCommas = rand(0, 2);\n    }\n    else {\n        totalCommas = rand(1, 4);\n    }\n    for (let i = 0, pos; i < totalCommas; i++) {\n        pos = rand(0, len - 2);\n        if (!hasComma.test(words[pos])) {\n            words[pos] += ',';\n        }\n    }\n    return words;\n}\n/**\n * Generate a paragraph of \"Lorem ipsum\" text\n * @param dict Words dictionary\n * @param wordCount Words count in paragraph\n * @param startWithCommon Should paragraph start with common \"lorem ipsum\" sentence.\n */\nfunction paragraph(dict, wordCount, startWithCommon) {\n    const result = [];\n    let totalWords = 0;\n    let words;\n    if (startWithCommon && dict.common) {\n        words = dict.common.slice(0, wordCount);\n        totalWords += words.length;\n        result.push(sentence(insertCommas(words), '.'));\n    }\n    while (totalWords < wordCount) {\n        words = sample(dict.words, Math.min(rand(2, 30), wordCount - totalWords));\n        totalWords += words.length;\n        result.push(sentence(insertCommas(words)));\n    }\n    return result.join(' ');\n}\nfunction findRepeater(ancestors) {\n    for (let i = ancestors.length - 1; i >= 0; i--) {\n        const element = ancestors[i];\n        if (element.type === 'AbbreviationNode' && element.repeat) {\n            return element.repeat;\n        }\n    }\n}\n\n/**\n * XSL transformer: removes `select` attributes from certain nodes that contain\n * children\n */\nfunction xsl(node) {\n    if (matchesName(node.name) && node.attributes && (node.children.length || node.value)) {\n        node.attributes = node.attributes.filter(isAllowed);\n    }\n}\nfunction isAllowed(attr) {\n    return attr.name !== 'select';\n}\nfunction matchesName(name) {\n    return name === 'xsl:variable' || name === 'xsl:with-param';\n}\n\nconst reElement = /^(-+)([a-z0-9]+[a-z0-9-]*)/i;\nconst reModifier = /^(_+)([a-z0-9]+[a-z0-9-_]*)/i;\nconst blockCandidates1 = (className) => /^[a-z]\\-/i.test(className);\nconst blockCandidates2 = (className) => /^[a-z]/i.test(className);\nfunction bem(node, ancestors, config) {\n    expandClassNames(node);\n    expandShortNotation(node, ancestors, config);\n}\n/**\n * Expands existing class names in BEM notation in given `node`.\n * For example, if node contains `b__el_mod` class name, this method ensures\n * that element contains `b__el` class as well\n */\nfunction expandClassNames(node) {\n    const data = getBEMData(node);\n    const classNames = [];\n    for (const cl of data.classNames) {\n        // remove all modifiers and element prefixes from class name to get a base element name\n        const ix = cl.indexOf('_');\n        if (ix > 0 && !cl.startsWith('-')) {\n            classNames.push(cl.slice(0, ix));\n            classNames.push(cl.slice(ix));\n        }\n        else {\n            classNames.push(cl);\n        }\n    }\n    if (classNames.length) {\n        data.classNames = classNames.filter(uniqueClass);\n        data.block = findBlockName(data.classNames);\n        updateClass(node, data.classNames.join(' '));\n    }\n}\n/**\n * Expands short BEM notation, e.g. `-element` and `_modifier`\n */\nfunction expandShortNotation(node, ancestors, config) {\n    const data = getBEMData(node);\n    const classNames = [];\n    const { options } = config;\n    const path = ancestors.slice(1).concat(node);\n    for (let cl of data.classNames) {\n        let prefix = '';\n        let m;\n        const originalClass = cl;\n        // parse element definition (could be only one)\n        if (m = cl.match(reElement)) {\n            prefix = getBlockName(path, m[1].length, config.context) + options['bem.element'] + m[2];\n            classNames.push(prefix);\n            cl = cl.slice(m[0].length);\n        }\n        // parse modifiers definitions\n        if (m = cl.match(reModifier)) {\n            if (!prefix) {\n                prefix = getBlockName(path, m[1].length);\n                classNames.push(prefix);\n            }\n            classNames.push(`${prefix}${options['bem.modifier']}${m[2]}`);\n            cl = cl.slice(m[0].length);\n        }\n        if (cl === originalClass) {\n            // class name wasn’t modified: it’s not a BEM-specific class,\n            // add it as-is into output\n            classNames.push(originalClass);\n        }\n    }\n    const arrClassNames = classNames.filter(uniqueClass);\n    if (arrClassNames.length) {\n        updateClass(node, arrClassNames.join(' '));\n    }\n}\n/**\n * Returns BEM data from given abbreviation node\n */\nfunction getBEMData(node) {\n    if (!node._bem) {\n        let classValue = '';\n        if (node.attributes) {\n            for (const attr of node.attributes) {\n                if (attr.name === 'class' && attr.value) {\n                    classValue = stringifyValue(attr.value);\n                    break;\n                }\n            }\n        }\n        node._bem = parseBEM(classValue);\n    }\n    return node._bem;\n}\nfunction getBEMDataFromContext(context) {\n    if (!context._bem) {\n        context._bem = parseBEM(context.attributes && context.attributes.class || '');\n    }\n    return context._bem;\n}\n/**\n * Parses BEM data from given class name\n */\nfunction parseBEM(classValue) {\n    const classNames = classValue ? classValue.split(/\\s+/) : [];\n    return {\n        classNames,\n        block: findBlockName(classNames)\n    };\n}\n/**\n * Returns block name for given `node` by `prefix`, which tells the depth of\n * of parent node lookup\n */\nfunction getBlockName(ancestors, depth = 0, context) {\n    const maxParentIx = 0;\n    let parentIx = Math.max(ancestors.length - depth, maxParentIx);\n    do {\n        const parent = ancestors[parentIx];\n        if (parent) {\n            const data = getBEMData(parent);\n            if (data.block) {\n                return data.block;\n            }\n        }\n    } while (maxParentIx < parentIx--);\n    if (context) {\n        const data = getBEMDataFromContext(context);\n        if (data.block) {\n            return data.block;\n        }\n    }\n    return '';\n}\nfunction findBlockName(classNames) {\n    return find(classNames, blockCandidates1)\n        || find(classNames, blockCandidates2)\n        || void 0;\n}\n/**\n * Finds class name from given list which may be used as block name\n */\nfunction find(classNames, filter) {\n    for (const cl of classNames) {\n        if (reElement.test(cl) || reModifier.test(cl)) {\n            break;\n        }\n        if (filter(cl)) {\n            return cl;\n        }\n    }\n}\nfunction updateClass(node, value) {\n    for (const attr of node.attributes) {\n        if (attr.name === 'class') {\n            attr.value = [value];\n            break;\n        }\n    }\n}\nfunction stringifyValue(value) {\n    let result = '';\n    for (const t of value) {\n        result += typeof t === 'string' ? t : t.name;\n    }\n    return result;\n}\nfunction uniqueClass(item, ix, arr) {\n    return !!item && arr.indexOf(item) === ix;\n}\n\n/**\n * Preprocessor of `<label>` element: if it contains `<input>`, remove `for` attribute\n * and `id` from input\n */\nfunction label(node) {\n    if (node.name === 'label') {\n        const input = find$1(node, n => (n.name === 'input' || n.name === 'textarea'));\n        if (input) {\n            // Remove empty `for` attribute\n            if (node.attributes) {\n                node.attributes = node.attributes.filter(attr => {\n                    return !(attr.name === 'for' && isEmptyAttribute(attr));\n                });\n            }\n            // Remove empty `id` attribute\n            if (input.attributes) {\n                input.attributes = input.attributes.filter(attr => {\n                    return !(attr.name === 'id' && isEmptyAttribute(attr));\n                });\n            }\n        }\n    }\n}\nfunction isEmptyAttribute(attr) {\n    if (!attr.value) {\n        return true;\n    }\n    if (attr.value.length === 1) {\n        const token = attr.value[0];\n        if (token && typeof token !== 'string' && !token.name) {\n            // Attribute contains field\n            return true;\n        }\n    }\n    return false;\n}\n\nfunction walk(abbr, visitor, state) {\n    const callback = (ctx, index, items) => {\n        const { parent, current } = state;\n        state.parent = current;\n        state.current = ctx;\n        visitor(ctx, index, items, state, next);\n        state.current = current;\n        state.parent = parent;\n    };\n    const next = (node, index, items) => {\n        state.ancestors.push(state.current);\n        callback(node, index, items);\n        state.ancestors.pop();\n    };\n    abbr.children.forEach(callback);\n}\nfunction createWalkState(config) {\n    return {\n        // @ts-ignore: Will set value in iterator\n        current: null,\n        parent: void 0,\n        ancestors: [],\n        config,\n        field: 1,\n        out: createOutputStream(config.options)\n    };\n}\n\nconst caret = [{ type: 'Field', index: 0, name: '' }];\n/**\n * Check if given node is a snippet: a node without name and attributes\n */\nfunction isSnippet(node) {\n    return node ? !node.name && !node.attributes : false;\n}\n/**\n * Check if given node is inline-level element, e.g. element with explicitly\n * defined node name\n */\nfunction isInlineElement(node, config) {\n    return node ? isInline(node, config) : false;\n}\n/**\n * Check if given value token is a field\n */\nfunction isField(token) {\n    return typeof token === 'object' && token.type === 'Field';\n}\nfunction pushTokens(tokens, state) {\n    const { out } = state;\n    let largestIndex = -1;\n    for (const t of tokens) {\n        if (typeof t === 'string') {\n            pushString(out, t);\n        }\n        else {\n            pushField(out, state.field + t.index, t.name);\n            if (t.index > largestIndex) {\n                largestIndex = t.index;\n            }\n        }\n    }\n    if (largestIndex !== -1) {\n        state.field += largestIndex + 1;\n    }\n}\n/**\n * Splits given value token by lines: returns array where each entry is a token list\n * for a single line\n */\nfunction splitByLines(tokens) {\n    const result = [];\n    let line = [];\n    for (const t of tokens) {\n        if (typeof t === 'string') {\n            const lines = t.split(/\\r\\n?|\\n/g);\n            line.push(lines.shift() || '');\n            while (lines.length) {\n                result.push(line);\n                line = [lines.shift() || ''];\n            }\n        }\n        else {\n            line.push(t);\n        }\n    }\n    line.length && result.push(line);\n    return result;\n}\n/**\n * Check if given attribute should be outputted\n */\nfunction shouldOutputAttribute(attr) {\n    // In case if attribute is implied, check if it has a defined value:\n    // either non-empty value or quoted empty value\n    return !attr.implied || attr.valueType !== 'raw' || (!!attr.value && attr.value.length > 0);\n}\n\nvar TemplateChars;\n(function (TemplateChars) {\n    /** `[` character */\n    TemplateChars[TemplateChars[\"Start\"] = 91] = \"Start\";\n    /** `]` character */\n    TemplateChars[TemplateChars[\"End\"] = 93] = \"End\";\n    /* `_` character */\n    TemplateChars[TemplateChars[\"Underscore\"] = 95] = \"Underscore\";\n    /* `-` character */\n    TemplateChars[TemplateChars[\"Dash\"] = 45] = \"Dash\";\n})(TemplateChars || (TemplateChars = {}));\n/**\n * Splits given string into template tokens.\n * Template is a string which contains placeholders which are uppercase names\n * between `[` and `]`, for example: `[PLACEHOLDER]`.\n * Unlike other templates, a placeholder may contain extra characters before and\n * after name: `[%PLACEHOLDER.]`. If data for `PLACEHOLDER` is defined, it will\n * be outputted with with these extra character, otherwise will be completely omitted.\n */\nfunction template(text) {\n    const tokens = [];\n    const scanner = { pos: 0, text };\n    let placeholder;\n    let offset = scanner.pos;\n    let pos = scanner.pos;\n    while (scanner.pos < scanner.text.length) {\n        pos = scanner.pos;\n        if (placeholder = consumePlaceholder(scanner)) {\n            if (offset !== scanner.pos) {\n                tokens.push(text.slice(offset, pos));\n            }\n            tokens.push(placeholder);\n            offset = scanner.pos;\n        }\n        else {\n            scanner.pos++;\n        }\n    }\n    if (offset !== scanner.pos) {\n        tokens.push(text.slice(offset));\n    }\n    return tokens;\n}\n/**\n * Consumes placeholder like `[#ID]` from given scanner\n */\nfunction consumePlaceholder(scanner) {\n    if (peek$1(scanner) === TemplateChars.Start) {\n        const start = ++scanner.pos;\n        let namePos = start;\n        let afterPos = start;\n        let stack = 1;\n        while (scanner.pos < scanner.text.length) {\n            const code = peek$1(scanner);\n            if (isTokenStart(code)) {\n                namePos = scanner.pos;\n                while (isToken(peek$1(scanner))) {\n                    scanner.pos++;\n                }\n                afterPos = scanner.pos;\n            }\n            else {\n                if (code === TemplateChars.Start) {\n                    stack++;\n                }\n                else if (code === TemplateChars.End) {\n                    if (--stack === 0) {\n                        return {\n                            before: scanner.text.slice(start, namePos),\n                            after: scanner.text.slice(afterPos, scanner.pos++),\n                            name: scanner.text.slice(namePos, afterPos)\n                        };\n                    }\n                }\n                scanner.pos++;\n            }\n        }\n    }\n}\nfunction peek$1(scanner, pos = scanner.pos) {\n    return scanner.text.charCodeAt(pos);\n}\nfunction isTokenStart(code) {\n    return code >= 65 && code <= 90; // A-Z\n}\nfunction isToken(code) {\n    return isTokenStart(code)\n        || (code > 47 && code < 58) /* 0-9 */\n        || code === TemplateChars.Underscore\n        || code === TemplateChars.Dash;\n}\n\nfunction createCommentState(config) {\n    const { options } = config;\n    return {\n        enabled: options['comment.enabled'],\n        trigger: options['comment.trigger'],\n        before: options['comment.before'] ? template(options['comment.before']) : void 0,\n        after: options['comment.after'] ? template(options['comment.after']) : void 0\n    };\n}\n/**\n * Adds comment prefix for given node, if required\n */\nfunction commentNodeBefore(node, state) {\n    if (shouldComment(node, state) && state.comment.before) {\n        output(node, state.comment.before, state);\n    }\n}\n/**\n * Adds comment suffix for given node, if required\n */\nfunction commentNodeAfter(node, state) {\n    if (shouldComment(node, state) && state.comment.after) {\n        output(node, state.comment.after, state);\n    }\n}\n/**\n * Check if given node should be commented\n */\nfunction shouldComment(node, state) {\n    const { comment } = state;\n    if (!comment.enabled || !comment.trigger || !node.name || !node.attributes) {\n        return false;\n    }\n    for (const attr of node.attributes) {\n        if (attr.name && comment.trigger.includes(attr.name)) {\n            return true;\n        }\n    }\n    return false;\n}\n/**\n * Pushes given template tokens into output stream\n */\nfunction output(node, tokens, state) {\n    const attrs = {};\n    const { out } = state;\n    // Collect attributes payload\n    for (const attr of node.attributes) {\n        if (attr.name && attr.value) {\n            attrs[attr.name.toUpperCase()] = attr.value;\n        }\n    }\n    // Output parsed tokens\n    for (const token of tokens) {\n        if (typeof token === 'string') {\n            pushString(out, token);\n        }\n        else if (attrs[token.name]) {\n            pushString(out, token.before);\n            pushTokens(attrs[token.name], state);\n            pushString(out, token.after);\n        }\n    }\n}\n\nconst htmlTagRegex = /^<([\\w\\-:]+)[\\s>]/;\nconst reservedKeywords = new Set([\n    'for', 'while', 'of', 'async', 'await', 'const', 'let', 'var', 'continue',\n    'break', 'debugger', 'do', 'export', 'import', 'in', 'instanceof', 'new', 'return',\n    'switch', 'this', 'throw', 'try', 'catch', 'typeof', 'void', 'with', 'yield'\n]);\nfunction html(abbr, config) {\n    const state = createWalkState(config);\n    state.comment = createCommentState(config);\n    walk(abbr, element$1, state);\n    return state.out.value;\n}\n/**\n * Outputs `node` content to output stream of `state`\n * @param node Context node\n * @param index Index of `node` in `items`\n * @param items List of `node`’s siblings\n * @param state Current walk state\n */\nfunction element$1(node, index, items, state, next) {\n    const { out, config } = state;\n    const format = shouldFormat$1(node, index, items, state);\n    // Pick offset level for current node\n    const level = getIndent(state);\n    out.level += level;\n    format && pushNewline(out, true);\n    if (node.name) {\n        const name = tagName(node.name, config);\n        commentNodeBefore(node, state);\n        pushString(out, `<${name}`);\n        if (node.attributes) {\n            for (const attr of node.attributes) {\n                if (shouldOutputAttribute(attr)) {\n                    pushAttribute(attr, state);\n                }\n            }\n        }\n        if (node.selfClosing && !node.children.length && !node.value) {\n            pushString(out, `${selfClose(config)}>`);\n        }\n        else {\n            pushString(out, '>');\n            if (!pushSnippet(node, state, next)) {\n                if (node.value) {\n                    const innerFormat = node.value.some(hasNewline) || startsWithBlockTag(node.value, config);\n                    innerFormat && pushNewline(state.out, ++out.level);\n                    pushTokens(node.value, state);\n                    innerFormat && pushNewline(state.out, --out.level);\n                }\n                node.children.forEach(next);\n                if (!node.value && !node.children.length) {\n                    const innerFormat = config.options['output.formatLeafNode']\n                        || config.options['output.formatForce'].includes(node.name);\n                    innerFormat && pushNewline(state.out, ++out.level);\n                    pushTokens(caret, state);\n                    innerFormat && pushNewline(state.out, --out.level);\n                }\n            }\n            pushString(out, `</${name}>`);\n            commentNodeAfter(node, state);\n        }\n    }\n    else if (!pushSnippet(node, state, next) && node.value) {\n        // A text-only node (snippet)\n        pushTokens(node.value, state);\n        node.children.forEach(next);\n    }\n    if (format && index === items.length - 1 && state.parent) {\n        const offset = isSnippet(state.parent) ? 0 : 1;\n        pushNewline(out, out.level - offset);\n    }\n    out.level -= level;\n}\n/**\n * Outputs given attribute’s content into output stream\n */\nfunction pushAttribute(attr, state) {\n    const { out, config } = state;\n    if (attr.name) {\n        const attributes = config.options['markup.attributes'];\n        const valuePrefix = config.options['markup.valuePrefix'];\n        let { name, value } = attr;\n        let lQuote = attrQuote(attr, config, true);\n        let rQuote = attrQuote(attr, config);\n        if (attributes) {\n            name = getMultiValue(name, attributes, attr.multiple) || name;\n        }\n        name = attrName(name, config);\n        if (config.options['jsx.enabled'] && attr.multiple) {\n            lQuote = expressionStart;\n            rQuote = expressionEnd;\n        }\n        const prefix = valuePrefix\n            ? getMultiValue(attr.name, valuePrefix, attr.multiple)\n            : null;\n        if (prefix && (value === null || value === void 0 ? void 0 : value.length) === 1 && typeof value[0] === 'string') {\n            // Add given prefix in object notation\n            const val = value[0];\n            value = [isPropKey(val) ? `${prefix}.${val}` : `${prefix}['${val}']`];\n            if (config.options['jsx.enabled']) {\n                lQuote = expressionStart;\n                rQuote = expressionEnd;\n            }\n        }\n        if (isBooleanAttribute(attr, config) && !value) {\n            // If attribute value is omitted and it’s a boolean value, check for\n            // `compactBoolean` option: if it’s disabled, set value to attribute name\n            // (XML style)\n            if (!config.options['output.compactBoolean']) {\n                value = [name];\n            }\n        }\n        else if (!value) {\n            value = caret;\n        }\n        pushString(out, ' ' + name);\n        if (value) {\n            pushString(out, '=' + lQuote);\n            pushTokens(value, state);\n            pushString(out, rQuote);\n        }\n        else if (config.options['output.selfClosingStyle'] !== 'html') {\n            pushString(out, '=' + lQuote + rQuote);\n        }\n    }\n}\nfunction pushSnippet(node, state, next) {\n    if (node.value && node.children.length) {\n        // We have a value and child nodes. In case if value contains fields,\n        // we should output children as a content of first field\n        const fieldIx = node.value.findIndex(isField);\n        if (fieldIx !== -1) {\n            pushTokens(node.value.slice(0, fieldIx), state);\n            const line = state.out.line;\n            let pos = fieldIx + 1;\n            node.children.forEach(next);\n            // If there was a line change, trim leading whitespace for better result\n            if (state.out.line !== line && typeof node.value[pos] === 'string') {\n                pushString(state.out, node.value[pos++].trimLeft());\n            }\n            pushTokens(node.value.slice(pos), state);\n            return true;\n        }\n    }\n    return false;\n}\n/**\n * Check if given node should be formatted in its parent context\n */\nfunction shouldFormat$1(node, index, items, state) {\n    const { config, parent } = state;\n    if (!config.options['output.format']) {\n        return false;\n    }\n    if (index === 0 && !parent) {\n        // Do not format very first node\n        return false;\n    }\n    // Do not format single child of snippet\n    if (parent && isSnippet(parent) && items.length === 1) {\n        return false;\n    }\n    /**\n     * Adjacent text-only/snippet nodes\n     */\n    if (isSnippet(node)) {\n        // Adjacent text-only/snippet nodes\n        const format = isSnippet(items[index - 1]) || isSnippet(items[index + 1])\n            // Has newlines: looks like wrapping code fragment\n            || node.value.some(hasNewline)\n            // Format as wrapper: contains children which will be outputted as field content\n            || (node.value.some(isField) && node.children.length);\n        if (format) {\n            return true;\n        }\n    }\n    if (isInline(node, config)) {\n        // Check if inline node is the next sibling of block-level node\n        if (index === 0) {\n            // First node in parent: format if it’s followed by a block-level element\n            for (let i = 0; i < items.length; i++) {\n                if (!isInline(items[i], config)) {\n                    return true;\n                }\n            }\n        }\n        else if (!isInline(items[index - 1], config)) {\n            // Node is right after block-level element\n            return true;\n        }\n        if (config.options['output.inlineBreak']) {\n            // check for adjacent inline elements before and after current element\n            let adjacentInline = 1;\n            let before = index;\n            let after = index;\n            while (isInlineElement(items[--before], config)) {\n                adjacentInline++;\n            }\n            while (isInlineElement(items[++after], config)) {\n                adjacentInline++;\n            }\n            if (adjacentInline >= config.options['output.inlineBreak']) {\n                return true;\n            }\n        }\n        // Edge case: inline node contains node that should receive formatting\n        for (let i = 0, il = node.children.length; i < il; i++) {\n            if (shouldFormat$1(node.children[i], i, node.children, state)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    return true;\n}\n/**\n * Returns indentation offset for given node\n */\nfunction getIndent(state) {\n    const { config, parent } = state;\n    if (!parent || isSnippet(parent) || (parent.name && config.options['output.formatSkip'].includes(parent.name))) {\n        return 0;\n    }\n    return 1;\n}\n/**\n * Check if given node value contains newlines\n */\nfunction hasNewline(value) {\n    return typeof value === 'string' && /\\r|\\n/.test(value);\n}\n/**\n * Check if given node value starts with block-level tag\n */\nfunction startsWithBlockTag(value, config) {\n    if (value.length && typeof value[0] === 'string') {\n        const matches = htmlTagRegex.exec(value[0]);\n        if ((matches === null || matches === void 0 ? void 0 : matches.length) && !config.options['inlineElements'].includes(matches[1].toLowerCase())) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction getMultiValue(key, data, multiple) {\n    return (multiple && data[`${key}*`]) || data[key];\n}\nfunction isPropKey(name) {\n    return !reservedKeywords.has(name) && /^[a-zA-Z_$][\\w_$]*$/.test(name);\n}\n\nfunction indentFormat(abbr, config, options) {\n    const state = createWalkState(config);\n    state.options = options || {};\n    walk(abbr, element, state);\n    return state.out.value;\n}\n/**\n * Outputs `node` content to output stream of `state`\n * @param node Context node\n * @param index Index of `node` in `items`\n * @param items List of `node`’s siblings\n * @param state Current walk state\n */\nfunction element(node, index, items, state, next) {\n    const { out, options } = state;\n    const { primary, secondary } = collectAttributes(node);\n    // Pick offset level for current node\n    const level = state.parent ? 1 : 0;\n    out.level += level;\n    // Do not indent top-level elements\n    if (shouldFormat(node, index, items, state)) {\n        pushNewline(out, true);\n    }\n    if (node.name && (node.name !== 'div' || !primary.length)) {\n        pushString(out, (options.beforeName || '') + node.name + (options.afterName || ''));\n    }\n    pushPrimaryAttributes(primary, state);\n    pushSecondaryAttributes(secondary.filter(shouldOutputAttribute), state);\n    if (node.selfClosing && !node.value && !node.children.length) {\n        if (state.options.selfClose) {\n            pushString(out, state.options.selfClose);\n        }\n    }\n    else {\n        pushValue(node, state);\n        node.children.forEach(next);\n    }\n    out.level -= level;\n}\n/**\n * From given node, collects all attributes as `primary` (id, class) and\n * `secondary` (all the rest) lists. In most indent-based syntaxes, primary attribute\n * has special syntax\n */\nfunction collectAttributes(node) {\n    const primary = [];\n    const secondary = [];\n    if (node.attributes) {\n        for (const attr of node.attributes) {\n            if (isPrimaryAttribute(attr)) {\n                primary.push(attr);\n            }\n            else {\n                secondary.push(attr);\n            }\n        }\n    }\n    return { primary, secondary };\n}\n/**\n * Outputs given attributes as primary into output stream\n */\nfunction pushPrimaryAttributes(attrs, state) {\n    for (const attr of attrs) {\n        if (attr.value) {\n            if (attr.name === 'class') {\n                pushString(state.out, '.');\n                // All whitespace characters must be replaced with dots in class names\n                const tokens = attr.value.map(t => typeof t === 'string' ? t.replace(/\\s+/g, '.') : t);\n                pushTokens(tokens, state);\n            }\n            else {\n                // ID attribute\n                pushString(state.out, '#');\n                pushTokens(attr.value, state);\n            }\n        }\n    }\n}\n/**\n * Outputs given attributes as secondary into output stream\n */\nfunction pushSecondaryAttributes(attrs, state) {\n    if (attrs.length) {\n        const { out, config, options } = state;\n        options.beforeAttribute && pushString(out, options.beforeAttribute);\n        for (let i = 0; i < attrs.length; i++) {\n            const attr = attrs[i];\n            pushString(out, attrName(attr.name || '', config));\n            if (isBooleanAttribute(attr, config) && !attr.value) {\n                if (!config.options['output.compactBoolean'] && options.booleanValue) {\n                    pushString(out, '=' + options.booleanValue);\n                }\n            }\n            else {\n                pushString(out, '=' + attrQuote(attr, config, true));\n                pushTokens(attr.value || caret, state);\n                pushString(out, attrQuote(attr, config));\n            }\n            if (i !== attrs.length - 1 && options.glueAttribute) {\n                pushString(out, options.glueAttribute);\n            }\n        }\n        options.afterAttribute && pushString(out, options.afterAttribute);\n    }\n}\n/**\n * Outputs given node value into state output stream\n */\nfunction pushValue(node, state) {\n    // We should either output value or add caret but for leaf nodes only (no children)\n    if (!node.value && node.children.length) {\n        return;\n    }\n    const value = node.value || caret;\n    const lines = splitByLines(value);\n    const { out, options } = state;\n    if (lines.length === 1) {\n        if (node.name || node.attributes) {\n            push(out, ' ');\n        }\n        pushTokens(value, state);\n    }\n    else {\n        // We should format multi-line value with terminating `|` character\n        // and same line length\n        const lineLengths = [];\n        let maxLength = 0;\n        // Calculate lengths of all lines and max line length\n        for (const line of lines) {\n            const len = valueLength(line);\n            lineLengths.push(len);\n            if (len > maxLength) {\n                maxLength = len;\n            }\n        }\n        // Output each line, padded to max length\n        out.level++;\n        for (let i = 0; i < lines.length; i++) {\n            pushNewline(out, true);\n            options.beforeTextLine && push(out, options.beforeTextLine);\n            pushTokens(lines[i], state);\n            if (options.afterTextLine) {\n                push(out, ' '.repeat(maxLength - lineLengths[i]));\n                push(out, options.afterTextLine);\n            }\n        }\n        out.level--;\n    }\n}\nfunction isPrimaryAttribute(attr) {\n    return attr.name === 'class' || attr.name === 'id';\n}\n/**\n * Calculates string length from given tokens\n */\nfunction valueLength(tokens) {\n    let len = 0;\n    for (const token of tokens) {\n        len += typeof token === 'string' ? token.length : token.name.length;\n    }\n    return len;\n}\nfunction shouldFormat(node, index, items, state) {\n    // Do not format first top-level element or snippets\n    if (!state.parent && index === 0) {\n        return false;\n    }\n    return !isSnippet(node);\n}\n\nfunction haml(abbr, config) {\n    return indentFormat(abbr, config, {\n        beforeName: '%',\n        beforeAttribute: '(',\n        afterAttribute: ')',\n        glueAttribute: ' ',\n        afterTextLine: ' |',\n        booleanValue: 'true',\n        selfClose: '/'\n    });\n}\n\nfunction slim(abbr, config) {\n    return indentFormat(abbr, config, {\n        beforeAttribute: ' ',\n        glueAttribute: ' ',\n        beforeTextLine: '| ',\n        selfClose: '/'\n    });\n}\n\nfunction pug(abbr, config) {\n    return indentFormat(abbr, config, {\n        beforeAttribute: '(',\n        afterAttribute: ')',\n        glueAttribute: ', ',\n        beforeTextLine: '| ',\n        selfClose: config.options['output.selfClosingStyle'] === 'xml' ? '/' : ''\n    });\n}\n\nconst formatters = { html, haml, slim, pug };\n/**\n * Parses given Emmet abbreviation into a final abbreviation tree with all\n * required transformations applied\n */\nfunction parse$1(abbr, config) {\n    let oldTextValue;\n    if (typeof abbr === 'string') {\n        const parseOpt = Object.assign({}, config);\n        if (config.options['jsx.enabled']) {\n            parseOpt.jsx = true;\n        }\n        if (config.options['markup.href']) {\n            parseOpt.href = true;\n        }\n        abbr = parseAbbreviation(abbr, parseOpt);\n        // remove text field before snippets(abbr, config) call\n        // as abbreviation(abbr, parseOpt) already handled it\n        oldTextValue = config.text;\n        config.text = undefined;\n    }\n    // Run abbreviation resolve in two passes:\n    // 1. Map each node to snippets, which are abbreviations as well. A single snippet\n    // may produce multiple nodes\n    // 2. Transform every resolved node\n    abbr = resolveSnippets(abbr, config);\n    walk$1(abbr, transform, config);\n    config.text = oldTextValue !== null && oldTextValue !== void 0 ? oldTextValue : config.text;\n    return abbr;\n}\n/**\n * Converts given abbreviation to string according to provided `config`\n */\nfunction stringify(abbr, config) {\n    const formatter = formatters[config.syntax] || html;\n    return formatter(abbr, config);\n}\n/**\n * Modifies given node and prepares it for output\n */\nfunction transform(node, ancestors, config) {\n    implicitTag(node, ancestors, config);\n    mergeAttributes(node, config);\n    lorem(node, ancestors, config);\n    if (config.syntax === 'xsl') {\n        xsl(node);\n    }\n    if (config.type === 'markup') {\n        label(node);\n    }\n    if (config.options['bem.enabled']) {\n        bem(node, ancestors, config);\n    }\n}\n\nvar CSSSnippetType;\n(function (CSSSnippetType) {\n    CSSSnippetType[\"Raw\"] = \"Raw\";\n    CSSSnippetType[\"Property\"] = \"Property\";\n})(CSSSnippetType || (CSSSnippetType = {}));\nconst reProperty = /^([a-z-]+)(?:\\s*:\\s*([^\\n\\r;]+?);*)?$/;\nconst opt = { value: true };\n/**\n * Creates structure for holding resolved CSS snippet\n */\nfunction createSnippet(key, value) {\n    // A snippet could be a raw text snippet (e.g. arbitrary text string) or a\n    // CSS property with possible values separated by `|`.\n    // In latter case, we have to parse snippet as CSS abbreviation\n    const m = value.match(reProperty);\n    if (m) {\n        const keywords = {};\n        const parsed = m[2] ? m[2].split('|').map(parseValue) : [];\n        for (const item of parsed) {\n            for (const cssVal of item) {\n                collectKeywords(cssVal, keywords);\n            }\n        }\n        return {\n            type: CSSSnippetType.Property,\n            key,\n            property: m[1],\n            value: parsed,\n            keywords,\n            dependencies: []\n        };\n    }\n    return { type: CSSSnippetType.Raw, key, value };\n}\n/**\n * Nests more specific CSS properties into shorthand ones, e.g.\n * `background-position-x` -> `background-position` -> `background`\n */\nfunction nest(snippets) {\n    snippets = snippets.slice().sort(snippetsSort);\n    const stack = [];\n    let prev;\n    // For sorted list of CSS properties, create dependency graph where each\n    // shorthand property contains its more specific one, e.g.\n    // background -> background-position -> background-position-x\n    for (const cur of snippets.filter(isProperty)) {\n        // Check if current property belongs to one from parent stack.\n        // Since `snippets` array is sorted, items are perfectly aligned\n        // from shorthands to more specific variants\n        while (stack.length) {\n            prev = stack[stack.length - 1];\n            if (cur.property.startsWith(prev.property)\n                && cur.property.charCodeAt(prev.property.length) === 45 /* - */) {\n                prev.dependencies.push(cur);\n                stack.push(cur);\n                break;\n            }\n            stack.pop();\n        }\n        if (!stack.length) {\n            stack.push(cur);\n        }\n    }\n    return snippets;\n}\n/**\n * A sorting function for array of snippets\n */\nfunction snippetsSort(a, b) {\n    if (a.key === b.key) {\n        return 0;\n    }\n    return a.key < b.key ? -1 : 1;\n}\nfunction parseValue(value) {\n    return parse$2(value.trim(), opt)[0].value;\n}\nfunction isProperty(snippet) {\n    return snippet.type === CSSSnippetType.Property;\n}\nfunction collectKeywords(cssVal, dest) {\n    for (const v of cssVal.value) {\n        if (v.type === 'Literal') {\n            dest[v.value] = v;\n        }\n        else if (v.type === 'FunctionCall') {\n            dest[v.name] = v;\n        }\n        else if (v.type === 'Field') {\n            // Create literal from field, if available\n            const value = v.name.trim();\n            if (value) {\n                dest[value] = { type: 'Literal', value };\n            }\n        }\n    }\n}\n\n/**\n * Calculates how close `str1` matches `str2` using fuzzy match.\n * How matching works:\n * – first characters of both `str1` and `str2` *must* match\n * – `str1` length larger than `str2` length is allowed only when `unmatched` is true\n * – ideal match is when `str1` equals to `str2` (score: 1)\n * – next best match is `str2` starts with `str1` (score: 1 × percent of matched characters)\n * – other scores depend on how close characters of `str1` to the beginning of `str2`\n * @param partialMatch Allow length `str1` to be greater than `str2` length\n */\nfunction scoreMatch(str1, str2, partialMatch = false) {\n    str1 = str1.toLowerCase();\n    str2 = str2.toLowerCase();\n    if (str1 === str2) {\n        return 1;\n    }\n    // Both strings MUST start with the same character\n    if (!str1 || !str2 || str1.charCodeAt(0) !== str2.charCodeAt(0)) {\n        return 0;\n    }\n    const str1Len = str1.length;\n    const str2Len = str2.length;\n    if (!partialMatch && str1Len > str2Len) {\n        return 0;\n    }\n    // Characters from `str1` which are closer to the beginning of a `str2` should\n    // have higher score.\n    // For example, if `str2` is `abcde`, it’s max score is:\n    // 5 + 4 + 3 + 2 + 1 = 15 (sum of character positions in reverse order)\n    // Matching `abd` against `abcde` should produce:\n    // 5 + 4 + 2 = 11\n    // Acronym bonus for match right after `-`. Matching `abd` against `abc-de`\n    // should produce:\n    // 6 + 5 + 4 (use `d` position in `abd`, not in abc-de`)\n    const minLength = Math.min(str1Len, str2Len);\n    const maxLength = Math.max(str1Len, str2Len);\n    let i = 1;\n    let j = 1;\n    let score = maxLength;\n    let ch1 = 0;\n    let ch2 = 0;\n    let found = false;\n    let acronym = false;\n    while (i < str1Len) {\n        ch1 = str1.charCodeAt(i);\n        found = false;\n        acronym = false;\n        while (j < str2Len) {\n            ch2 = str2.charCodeAt(j);\n            if (ch1 === ch2) {\n                found = true;\n                score += maxLength - (acronym ? i : j);\n                break;\n            }\n            // add acronym bonus for exactly next match after unmatched `-`\n            acronym = ch2 === 45 /* - */;\n            j++;\n        }\n        if (!found) {\n            if (!partialMatch) {\n                return 0;\n            }\n            break;\n        }\n        i++;\n    }\n    const matchRatio = i / maxLength;\n    const delta = maxLength - minLength;\n    const maxScore = sum(maxLength) - sum(delta);\n    return (score * matchRatio) / maxScore;\n}\n/**\n * Calculates sum of first `n` numbers, e.g. 1+2+3+...n\n */\nfunction sum(n) {\n    return n * (n + 1) / 2;\n}\n\nfunction color(token, shortHex) {\n    if (!token.r && !token.g && !token.b && !token.a) {\n        return 'transparent';\n    }\n    else if (token.a === 1) {\n        return asHex(token, shortHex);\n    }\n    return asRGB(token);\n}\n/**\n * Output given color as hex value\n * @param short Produce short value (e.g. #fff instead of #ffffff), if possible\n */\nfunction asHex(token, short) {\n    const fn = (short && isShortHex(token.r) && isShortHex(token.g) && isShortHex(token.b))\n        ? toShortHex : toHex;\n    return '#' + fn(token.r) + fn(token.g) + fn(token.b);\n}\n/**\n * Output current color as `rgba?(...)` CSS color\n */\nfunction asRGB(token) {\n    const values = [token.r, token.g, token.b];\n    if (token.a !== 1) {\n        values.push(frac(token.a, 8));\n    }\n    return `${values.length === 3 ? 'rgb' : 'rgba'}(${values.join(', ')})`;\n}\nfunction frac(num, digits = 4) {\n    return num.toFixed(digits).replace(/\\.?0+$/, '');\n}\nfunction isShortHex(hex) {\n    return !(hex % 17);\n}\nfunction toShortHex(num) {\n    return (num >> 4).toString(16);\n}\nfunction toHex(num) {\n    return pad(num.toString(16), 2);\n}\nfunction pad(value, len) {\n    while (value.length < len) {\n        value = '0' + value;\n    }\n    return value;\n}\n\nconst CSSAbbreviationScope = {\n    /** Include all possible snippets in match */\n    Global: '@@global',\n    /** Include raw snippets only (e.g. no properties) in abbreviation match */\n    Section: '@@section',\n    /** Include properties only in abbreviation match */\n    Property: '@@property',\n    /** Resolve abbreviation in context of CSS property value */\n    Value: '@@value',\n};\nfunction css(abbr, config) {\n    var _a;\n    const out = createOutputStream(config.options);\n    const format = config.options['output.format'];\n    if (((_a = config.context) === null || _a === void 0 ? void 0 : _a.name) === CSSAbbreviationScope.Section) {\n        // For section context, filter out unmatched snippets\n        abbr = abbr.filter(node => node.snippet);\n    }\n    for (let i = 0; i < abbr.length; i++) {\n        if (format && i !== 0) {\n            pushNewline(out, true);\n        }\n        property(abbr[i], out, config);\n    }\n    return out.value;\n}\n/**\n * Outputs given abbreviation node into output stream\n */\nfunction property(node, out, config) {\n    const isJSON = config.options['stylesheet.json'];\n    if (node.name) {\n        // It’s a CSS property\n        const name = isJSON ? toCamelCase(node.name) : node.name;\n        pushString(out, name + config.options['stylesheet.between']);\n        if (node.value.length) {\n            propertyValue(node, out, config);\n        }\n        else {\n            pushField(out, 0, '');\n        }\n        if (isJSON) {\n            // For CSS-in-JS, always finalize property with comma\n            // NB: seems like `important` is not available in CSS-in-JS syntaxes\n            push(out, ',');\n        }\n        else {\n            outputImportant(node, out, true);\n            push(out, config.options['stylesheet.after']);\n        }\n    }\n    else {\n        // It’s a regular snippet, output plain tokens without any additional formatting\n        for (const cssVal of node.value) {\n            for (const v of cssVal.value) {\n                outputToken(v, out, config);\n            }\n        }\n        outputImportant(node, out, node.value.length > 0);\n    }\n}\nfunction propertyValue(node, out, config) {\n    const isJSON = config.options['stylesheet.json'];\n    const num = isJSON ? getSingleNumeric(node) : null;\n    if (num && (!num.unit || num.unit === 'px')) {\n        // For CSS-in-JS, if property contains single numeric value, output it\n        // as JS number\n        push(out, String(num.value));\n    }\n    else {\n        const quote = getQuote(config);\n        isJSON && push(out, quote);\n        for (let i = 0; i < node.value.length; i++) {\n            if (i !== 0) {\n                push(out, ', ');\n            }\n            outputValue(node.value[i], out, config);\n        }\n        isJSON && push(out, quote);\n    }\n}\nfunction outputImportant(node, out, separator) {\n    if (node.important) {\n        if (separator) {\n            push(out, ' ');\n        }\n        push(out, '!important');\n    }\n}\nfunction outputValue(value, out, config) {\n    for (let i = 0, prevEnd = -1; i < value.value.length; i++) {\n        const token = value.value[i];\n        // Handle edge case: a field is written close to previous token like this: `foo${bar}`.\n        // We should not add delimiter here\n        if (i !== 0 && (token.type !== 'Field' || token.start !== prevEnd)) {\n            push(out, ' ');\n        }\n        outputToken(token, out, config);\n        prevEnd = token['end'];\n    }\n}\nfunction outputToken(token, out, config) {\n    if (token.type === 'ColorValue') {\n        push(out, color(token, config.options['stylesheet.shortHex']));\n    }\n    else if (token.type === 'Literal' || token.type === 'CustomProperty') {\n        pushString(out, token.value);\n    }\n    else if (token.type === 'NumberValue') {\n        pushString(out, frac(token.value, 4) + token.unit);\n    }\n    else if (token.type === 'StringValue') {\n        const quote = token.quote === 'double' ? '\"' : '\\'';\n        pushString(out, quote + token.value + quote);\n    }\n    else if (token.type === 'Field') {\n        pushField(out, token.index, token.name);\n    }\n    else if (token.type === 'FunctionCall') {\n        push(out, token.name + '(');\n        for (let i = 0; i < token.arguments.length; i++) {\n            if (i) {\n                push(out, ', ');\n            }\n            outputValue(token.arguments[i], out, config);\n        }\n        push(out, ')');\n    }\n}\n/**\n * If value of given property is a single numeric value, returns this token\n */\nfunction getSingleNumeric(node) {\n    if (node.value.length === 1) {\n        const cssVal = node.value[0];\n        if (cssVal.value.length === 1 && cssVal.value[0].type === 'NumberValue') {\n            return cssVal.value[0];\n        }\n    }\n}\n/**\n * Converts kebab-case string to camelCase\n */\nfunction toCamelCase(str) {\n    return str.replace(/\\-(\\w)/g, (_, letter) => letter.toUpperCase());\n}\nfunction getQuote(config) {\n    return config.options['stylesheet.jsonDoubleQuotes'] ? '\"' : '\\'';\n}\n\nconst gradientName = 'lg';\n/**\n * Parses given Emmet abbreviation into a final abbreviation tree with all\n * required transformations applied\n */\nfunction parse(abbr, config) {\n    var _a;\n    const snippets = ((_a = config.cache) === null || _a === void 0 ? void 0 : _a.stylesheetSnippets) || convertSnippets(config.snippets);\n    const result = [];\n    if (config.cache) {\n        config.cache.stylesheetSnippets = snippets;\n    }\n    if (typeof abbr === 'string') {\n        abbr = parse$2(abbr, { value: isValueScope(config) });\n    }\n    const filteredSnippets = getSnippetsForScope(snippets, config);\n    for (const node of abbr) {\n        const resolved = resolveNode(node, filteredSnippets, config);\n        if (resolved) {\n            result.push(resolved);\n        }\n    }\n    return result;\n}\n/**\n * Converts given raw snippets into internal snippets representation\n */\nfunction convertSnippets(snippets) {\n    const result = [];\n    for (const key of Object.keys(snippets)) {\n        result.push(createSnippet(key, snippets[key]));\n    }\n    return nest(result);\n}\n/**\n * Resolves given node: finds matched CSS snippets using fuzzy match and resolves\n * keyword aliases from node value\n */\nfunction resolveNode(node, snippets, config) {\n    if (!resolveGradient(node, config)) {\n        const score = config.options['stylesheet.fuzzySearchMinScore'];\n        if (isValueScope(config)) {\n            // Resolve as value of given CSS property\n            const propName = config.context.name;\n            const snippet = snippets.find(s => s.type === CSSSnippetType.Property && s.property === propName);\n            resolveValueKeywords(node, config, snippet, score);\n            node.snippet = snippet;\n        }\n        else if (node.name) {\n            const snippet = findBestMatch(node.name, snippets, score, true);\n            node.snippet = snippet;\n            if (snippet) {\n                const resolved = snippet.type === CSSSnippetType.Property\n                    ? resolveAsProperty(node, snippet, config)\n                    : resolveAsSnippet(node, snippet);\n                if (resolved) {\n                    node = resolved;\n                }\n                else if (config.options['stylesheet.strictMatch']) {\n                    return null;\n                }\n            }\n        }\n    }\n    if (node.name || config.context) {\n        // Resolve numeric values for CSS properties only\n        resolveNumericValue(node, config);\n    }\n    return node;\n}\n/**\n * Resolves CSS gradient shortcut from given property, if possible\n */\nfunction resolveGradient(node, config) {\n    let gradientFn = null;\n    const cssVal = node.value.length === 1 ? node.value[0] : null;\n    if (cssVal && cssVal.value.length === 1) {\n        const v = cssVal.value[0];\n        if (v.type === 'FunctionCall' && v.name === gradientName) {\n            gradientFn = v;\n        }\n    }\n    if (gradientFn || node.name === gradientName) {\n        if (!gradientFn) {\n            gradientFn = {\n                type: 'FunctionCall',\n                name: 'linear-gradient',\n                arguments: [cssValue(field(0, ''))]\n            };\n        }\n        else {\n            gradientFn = Object.assign(Object.assign({}, gradientFn), { name: 'linear-gradient' });\n        }\n        if (!config.context) {\n            node.name = 'background-image';\n        }\n        node.value = [cssValue(gradientFn)];\n        return true;\n    }\n    return false;\n}\n/**\n * Resolves given parsed abbreviation node as CSS property\n */\nfunction resolveAsProperty(node, snippet, config) {\n    const abbr = node.name;\n    // Check for unmatched part of abbreviation\n    // For example, in `dib` abbreviation the matched part is `d` and `ib` should\n    // be considered as inline value. If unmatched fragment exists, we should check\n    // if it matches actual value of snippet. If either explicit value is specified\n    // or unmatched fragment did not resolve to to a keyword, we should consider\n    // matched snippet as invalid\n    const inlineValue = getUnmatchedPart(abbr, snippet.key);\n    if (inlineValue) {\n        if (node.value.length) {\n            // Already have value: unmatched part indicates matched snippet is invalid\n            return null;\n        }\n        const kw = resolveKeyword(inlineValue, config, snippet);\n        if (!kw) {\n            return null;\n        }\n        node.value.push(cssValue(kw));\n    }\n    node.name = snippet.property;\n    if (node.value.length) {\n        // Replace keyword alias from current abbreviation node with matched keyword\n        resolveValueKeywords(node, config, snippet);\n    }\n    else if (snippet.value.length) {\n        const defaultValue = snippet.value[0];\n        // https://github.com/emmetio/emmet/issues/558\n        // We should auto-select inserted value only if there’s multiple value\n        // choice\n        node.value = snippet.value.length === 1 || defaultValue.some(hasField)\n            ? defaultValue\n            : defaultValue.map(n => wrapWithField(n, config));\n    }\n    return node;\n}\nfunction resolveValueKeywords(node, config, snippet, minScore) {\n    for (const cssVal of node.value) {\n        const value = [];\n        for (const token of cssVal.value) {\n            if (token.type === 'Literal') {\n                value.push(resolveKeyword(token.value, config, snippet, minScore) || token);\n            }\n            else if (token.type === 'FunctionCall') {\n                // For function calls, we should find matching function call\n                // and merge arguments\n                const match = resolveKeyword(token.name, config, snippet, minScore);\n                if (match && match.type === 'FunctionCall') {\n                    value.push(Object.assign(Object.assign({}, match), { arguments: token.arguments.concat(match.arguments.slice(token.arguments.length)) }));\n                }\n                else {\n                    value.push(token);\n                }\n            }\n            else {\n                value.push(token);\n            }\n        }\n        cssVal.value = value;\n    }\n}\n/**\n * Resolves given parsed abbreviation node as a snippet: a plain code chunk\n */\nfunction resolveAsSnippet(node, snippet) {\n    // When resolving snippets, we have to do the following:\n    // 1. Replace field placeholders with actual field tokens.\n    // 2. If input values given, put them instead of fields\n    let offset = 0;\n    let m;\n    const reField = /\\$\\{(\\d+)(:[^}]+)?\\}/g;\n    const inputValue = node.value[0];\n    const outputValue = [];\n    while (m = reField.exec(snippet.value)) {\n        if (offset !== m.index) {\n            outputValue.push(literal(snippet.value.slice(offset, m.index)));\n        }\n        offset = m.index + m[0].length;\n        if (inputValue && inputValue.value.length) {\n            outputValue.push(inputValue.value.shift());\n        }\n        else {\n            outputValue.push(field(Number(m[1]), m[2] ? m[2].slice(1) : ''));\n        }\n    }\n    const tail = snippet.value.slice(offset);\n    if (tail) {\n        outputValue.push(literal(tail));\n    }\n    node.name = void 0;\n    node.value = [cssValue(...outputValue)];\n    return node;\n}\n/**\n * Finds best matching item from `items` array\n * @param abbr  Abbreviation to match\n * @param items List of items for match\n * @param minScore The minimum score the best matched item should have to be a valid match.\n */\nfunction findBestMatch(abbr, items, minScore = 0, partialMatch = false) {\n    let matchedItem = null;\n    let maxScore = 0;\n    for (const item of items) {\n        const score = scoreMatch(abbr, getScoringPart(item), partialMatch);\n        if (score === 1) {\n            // direct hit, no need to look further\n            return item;\n        }\n        if (score && score >= maxScore) {\n            maxScore = score;\n            matchedItem = item;\n        }\n    }\n    return maxScore >= minScore ? matchedItem : null;\n}\nfunction getScoringPart(item) {\n    return typeof item === 'string' ? item : item.key;\n}\n/**\n * Returns a part of `abbr` that wasn’t directly matched against `str`.\n * For example, if abbreviation `poas` is matched against `position`,\n * the unmatched part will be `as` since `a` wasn’t found in string stream\n */\nfunction getUnmatchedPart(abbr, str) {\n    for (let i = 0, lastPos = 0; i < abbr.length; i++) {\n        lastPos = str.indexOf(abbr[i], lastPos);\n        if (lastPos === -1) {\n            return abbr.slice(i);\n        }\n        lastPos++;\n    }\n    return '';\n}\n/**\n * Resolves given keyword shorthand into matched snippet keyword or global keyword,\n * if possible\n */\nfunction resolveKeyword(kw, config, snippet, minScore) {\n    let ref;\n    if (snippet) {\n        if (ref = findBestMatch(kw, Object.keys(snippet.keywords), minScore)) {\n            return snippet.keywords[ref];\n        }\n        for (const dep of snippet.dependencies) {\n            if (ref = findBestMatch(kw, Object.keys(dep.keywords), minScore)) {\n                return dep.keywords[ref];\n            }\n        }\n    }\n    if (ref = findBestMatch(kw, config.options['stylesheet.keywords'], minScore)) {\n        return literal(ref);\n    }\n    return null;\n}\n/**\n * Resolves numeric values in given abbreviation node\n */\nfunction resolveNumericValue(node, config) {\n    const aliases = config.options['stylesheet.unitAliases'];\n    const unitless = config.options['stylesheet.unitless'];\n    for (const v of node.value) {\n        for (const t of v.value) {\n            if (t.type === 'NumberValue') {\n                if (t.unit) {\n                    t.unit = aliases[t.unit] || t.unit;\n                }\n                else if (t.value !== 0 && !unitless.includes(node.name)) {\n                    t.unit = t.rawValue.includes('.')\n                        ? config.options['stylesheet.floatUnit']\n                        : config.options['stylesheet.intUnit'];\n                }\n            }\n        }\n    }\n}\n/**\n * Constructs CSS value token\n */\nfunction cssValue(...args) {\n    return {\n        type: 'CSSValue',\n        value: args\n    };\n}\n/**\n * Constructs literal token\n */\nfunction literal(value) {\n    return { type: 'Literal', value };\n}\n/**\n * Constructs field token\n */\nfunction field(index, name) {\n    return { type: 'Field', index, name };\n}\n/**\n * Check if given value contains fields\n */\nfunction hasField(value) {\n    for (const v of value.value) {\n        if (v.type === 'Field' || (v.type === 'FunctionCall' && v.arguments.some(hasField))) {\n            return true;\n        }\n    }\n    return false;\n}\n/**\n * Wraps tokens of given abbreviation with fields\n */\nfunction wrapWithField(node, config, state = { index: 1 }) {\n    let value = [];\n    for (const v of node.value) {\n        switch (v.type) {\n            case 'ColorValue':\n                value.push(field(state.index++, color(v, config.options['stylesheet.shortHex'])));\n                break;\n            case 'Literal':\n                value.push(field(state.index++, v.value));\n                break;\n            case 'NumberValue':\n                value.push(field(state.index++, `${v.value}${v.unit}`));\n                break;\n            case 'StringValue':\n                const q = v.quote === 'single' ? '\\'' : '\"';\n                value.push(field(state.index++, q + v.value + q));\n                break;\n            case 'FunctionCall':\n                value.push(field(state.index++, v.name), literal('('));\n                for (let i = 0, il = v.arguments.length; i < il; i++) {\n                    value = value.concat(wrapWithField(v.arguments[i], config, state).value);\n                    if (i !== il - 1) {\n                        value.push(literal(', '));\n                    }\n                }\n                value.push(literal(')'));\n                break;\n            default:\n                value.push(v);\n        }\n    }\n    return Object.assign(Object.assign({}, node), { value });\n}\n/**\n * Check if abbreviation should be expanded in CSS value context\n */\nfunction isValueScope(config) {\n    if (config.context) {\n        return config.context.name === CSSAbbreviationScope.Value || !config.context.name.startsWith('@@');\n    }\n    return false;\n}\n/**\n * Returns snippets for given scope\n */\nfunction getSnippetsForScope(snippets, config) {\n    if (config.context) {\n        if (config.context.name === CSSAbbreviationScope.Section) {\n            return snippets.filter(s => s.type === CSSSnippetType.Raw);\n        }\n        if (config.context.name === CSSAbbreviationScope.Property) {\n            return snippets.filter(s => s.type === CSSSnippetType.Property);\n        }\n    }\n    return snippets;\n}\n\nvar markupSnippets = {\n\t\"a\": \"a[href]\",\n\t\"a:blank\": \"a[href='http://${0}' target='_blank' rel='noopener noreferrer']\",\n\t\"a:link\": \"a[href='http://${0}']\",\n\t\"a:mail\": \"a[href='mailto:${0}']\",\n\t\"a:tel\": \"a[href='tel:+${0}']\",\n\t\"abbr\": \"abbr[title]\",\n\t\"acr|acronym\": \"acronym[title]\",\n\t\"base\": \"base[href]/\",\n\t\"basefont\": \"basefont/\",\n\t\"br\": \"br/\",\n\t\"frame\": \"frame/\",\n\t\"hr\": \"hr/\",\n\t\"bdo\": \"bdo[dir]\",\n\t\"bdo:r\": \"bdo[dir=rtl]\",\n\t\"bdo:l\": \"bdo[dir=ltr]\",\n\t\"col\": \"col/\",\n\t\"link\": \"link[rel=stylesheet href]/\",\n\t\"link:css\": \"link[href='${1:style}.css']\",\n\t\"link:print\": \"link[href='${1:print}.css' media=print]\",\n\t\"link:favicon\": \"link[rel='shortcut icon' type=image/x-icon href='${1:favicon.ico}']\",\n\t\"link:mf|link:manifest\": \"link[rel='manifest' href='${1:manifest.json}']\",\n\t\"link:touch\": \"link[rel=apple-touch-icon href='${1:favicon.png}']\",\n\t\"link:rss\": \"link[rel=alternate type=application/rss+xml title=RSS href='${1:rss.xml}']\",\n\t\"link:atom\": \"link[rel=alternate type=application/atom+xml title=Atom href='${1:atom.xml}']\",\n\t\"link:im|link:import\": \"link[rel=import href='${1:component}.html']\",\n\t\"meta\": \"meta/\",\n\t\"meta:utf\": \"meta[http-equiv=Content-Type content='text/html;charset=UTF-8']\",\n\t\"meta:vp\": \"meta[name=viewport content='width=${1:device-width}, initial-scale=${2:1.0}']\",\n\t\"meta:compat\": \"meta[http-equiv=X-UA-Compatible content='${1:IE=7}']\",\n\t\"meta:edge\": \"meta:compat[content='${1:ie=edge}']\",\n\t\"meta:redirect\": \"meta[http-equiv=refresh content='0; url=${1:http://example.com}']\",\n\t\"meta:refresh\": \"meta[http-equiv=refresh content='${1:5}']\",\n\t\"meta:kw\": \"meta[name=keywords content]\",\n\t\"meta:desc\": \"meta[name=description content]\",\n\t\"style\": \"style\",\n\t\"script\": \"script\",\n\t\"script:src\": \"script[src]\",\n\t\"script:module\": \"script[type=module src]\",\n\t\"img\": \"img[src alt]/\",\n\t\"img:s|img:srcset\": \"img[srcset src alt]\",\n\t\"img:z|img:sizes\": \"img[sizes srcset src alt]\",\n\t\"picture\": \"picture\",\n\t\"src|source\": \"source/\",\n\t\"src:sc|source:src\": \"source[src type]\",\n\t\"src:s|source:srcset\": \"source[srcset]\",\n\t\"src:t|source:type\": \"source[srcset type='${1:image/}']\",\n\t\"src:z|source:sizes\": \"source[sizes srcset]\",\n\t\"src:m|source:media\": \"source[media='(${1:min-width: })' srcset]\",\n\t\"src:mt|source:media:type\": \"source:media[type='${2:image/}']\",\n\t\"src:mz|source:media:sizes\": \"source:media[sizes srcset]\",\n\t\"src:zt|source:sizes:type\": \"source[sizes srcset type='${1:image/}']\",\n\t\"iframe\": \"iframe[src frameborder=0]\",\n\t\"embed\": \"embed[src type]/\",\n\t\"object\": \"object[data type]\",\n\t\"param\": \"param[name value]/\",\n\t\"map\": \"map[name]\",\n\t\"area\": \"area[shape coords href alt]/\",\n\t\"area:d\": \"area[shape=default]\",\n\t\"area:c\": \"area[shape=circle]\",\n\t\"area:r\": \"area[shape=rect]\",\n\t\"area:p\": \"area[shape=poly]\",\n\t\"form\": \"form[action]\",\n\t\"form:get\": \"form[method=get]\",\n\t\"form:post\": \"form[method=post]\",\n\t\"label\": \"label[for]\",\n\t\"input\": \"input[type=${1:text}]/\",\n\t\"inp\": \"input[name=${1} id=${1}]\",\n\t\"input:h|input:hidden\": \"input[type=hidden name]\",\n\t\"input:t|input:text\": \"inp[type=text]\",\n\t\"input:search\": \"inp[type=search]\",\n\t\"input:email\": \"inp[type=email]\",\n\t\"input:url\": \"inp[type=url]\",\n\t\"input:p|input:password\": \"inp[type=password]\",\n\t\"input:datetime\": \"inp[type=datetime]\",\n\t\"input:date\": \"inp[type=date]\",\n\t\"input:datetime-local\": \"inp[type=datetime-local]\",\n\t\"input:month\": \"inp[type=month]\",\n\t\"input:week\": \"inp[type=week]\",\n\t\"input:time\": \"inp[type=time]\",\n\t\"input:tel\": \"inp[type=tel]\",\n\t\"input:number\": \"inp[type=number]\",\n\t\"input:color\": \"inp[type=color]\",\n\t\"input:c|input:checkbox\": \"inp[type=checkbox]\",\n\t\"input:r|input:radio\": \"inp[type=radio]\",\n\t\"input:range\": \"inp[type=range]\",\n\t\"input:f|input:file\": \"inp[type=file]\",\n\t\"input:s|input:submit\": \"input[type=submit value]\",\n\t\"input:i|input:image\": \"input[type=image src alt]\",\n\t\"input:b|input:btn|input:button\": \"input[type=button value]\",\n\t\"input:reset\": \"input:button[type=reset]\",\n\t\"isindex\": \"isindex/\",\n\t\"select\": \"select[name=${1} id=${1}]\",\n\t\"select:d|select:disabled\": \"select[disabled.]\",\n\t\"opt|option\": \"option[value]\",\n\t\"textarea\": \"textarea[name=${1} id=${1}]\",\n\t\"tarea:c|textarea:cols\":\"textarea[name=${1} id=${1} cols=${2:30}]\",\n\t\"tarea:r|textarea:rows\":\"textarea[name=${1} id=${1} rows=${3:10}]\",\n\t\"tarea:cr|textarea:cols:rows\":\"textarea[name=${1} id=${1} cols=${2:30} rows=${3:10}]\",\n\t\"marquee\": \"marquee[behavior direction]\",\n\t\"menu:c|menu:context\": \"menu[type=context]\",\n\t\"menu:t|menu:toolbar\": \"menu[type=toolbar]\",\n\t\"video\": \"video[src]\",\n\t\"audio\": \"audio[src]\",\n\t\"html:xml\": \"html[xmlns=http://www.w3.org/1999/xhtml]\",\n\t\"keygen\": \"keygen/\",\n\t\"command\": \"command/\",\n\t\"btn:s|button:s|button:submit\" : \"button[type=submit]\",\n\t\"btn:r|button:r|button:reset\" : \"button[type=reset]\",\n\t\"btn:b|button:b|button:button\" : \"button[type=button]\",\n\t\"btn:d|button:d|button:disabled\" : \"button[disabled.]\",\n\t\"fst:d|fset:d|fieldset:d|fieldset:disabled\" : \"fieldset[disabled.]\",\n\n\t\"bq\": \"blockquote\",\n\t\"fig\": \"figure\",\n\t\"figc\": \"figcaption\",\n\t\"pic\": \"picture\",\n\t\"ifr\": \"iframe\",\n\t\"emb\": \"embed\",\n\t\"obj\": \"object\",\n\t\"cap\": \"caption\",\n\t\"colg\": \"colgroup\",\n\t\"fst\": \"fieldset\",\n\t\"btn\": \"button\",\n\t\"optg\": \"optgroup\",\n\t\"tarea\": \"textarea\",\n\t\"leg\": \"legend\",\n\t\"sect\": \"section\",\n\t\"art\": \"article\",\n\t\"hdr\": \"header\",\n\t\"ftr\": \"footer\",\n\t\"adr\": \"address\",\n\t\"dlg\": \"dialog\",\n\t\"str\": \"strong\",\n\t\"prog\": \"progress\",\n\t\"mn\": \"main\",\n\t\"tem\": \"template\",\n\t\"fset\": \"fieldset\",\n\t\"datal\": \"datalist\",\n\t\"kg\": \"keygen\",\n\t\"out\": \"output\",\n\t\"det\": \"details\",\n\t\"sum\": \"summary\",\n\t\"cmd\": \"command\",\n\t\"data\": \"data[value]\",\n\t\"meter\": \"meter[value]\",\n\t\"time\": \"time[datetime]\",\n\n\t\"ri:d|ri:dpr\": \"img:s\",\n\t\"ri:v|ri:viewport\": \"img:z\",\n\t\"ri:a|ri:art\": \"pic>src:m+img\",\n\t\"ri:t|ri:type\": \"pic>src:t+img\",\n\n\t\"!!!\": \"{<!DOCTYPE html>}\",\n\t\"doc\": \"html[lang=${lang}]>(head>meta[charset=${charset}]+meta:vp+title{${1:Document}})+body\",\n\t\"!|html:5\": \"!!!+doc\",\n\n\t\"c\": \"{<!-- ${0} -->}\",\n\t\"cc:ie\": \"{<!--[if IE]>${0}<![endif]-->}\",\n\t\"cc:noie\": \"{<!--[if !IE]><!-->${0}<!--<![endif]-->}\"\n};\n\nvar stylesheetSnippets = {\n\t\"@f\": \"@font-face {\\n\\tfont-family: ${1};\\n\\tsrc: url(${2});\\n}\",\n\t\"@ff\": \"@font-face {\\n\\tfont-family: '${1:FontName}';\\n\\tsrc: url('${2:FileName}.eot');\\n\\tsrc: url('${2:FileName}.eot?#iefix') format('embedded-opentype'),\\n\\t\\t url('${2:FileName}.woff') format('woff'),\\n\\t\\t url('${2:FileName}.ttf') format('truetype'),\\n\\t\\t url('${2:FileName}.svg#${1:FontName}') format('svg');\\n\\tfont-style: ${3:normal};\\n\\tfont-weight: ${4:normal};\\n}\",\n\t\"@i|@import\": \"@import url(${0});\",\n\t\"@kf\": \"@keyframes ${1:identifier} {\\n\\t${2}\\n}\",\n\t\"@m|@media\": \"@media ${1:screen} {\\n\\t${0}\\n}\",\n\t\"ac\": \"align-content:start|end|flex-start|flex-end|center|space-between|space-around|stretch|space-evenly\",\n\t\"ai\": \"align-items:start|end|flex-start|flex-end|center|baseline|stretch\",\n\t\"anim\": \"animation:${1:name} ${2:duration} ${3:timing-function} ${4:delay} ${5:iteration-count} ${6:direction} ${7:fill-mode}\",\n\t\"animdel\": \"animation-delay:time\",\n\t\"animdir\": \"animation-direction:normal|reverse|alternate|alternate-reverse\",\n\t\"animdur\": \"animation-duration:${1:0}s\",\n\t\"animfm\": \"animation-fill-mode:both|forwards|backwards\",\n\t\"animic\": \"animation-iteration-count:1|infinite\",\n\t\"animn\": \"animation-name\",\n\t\"animps\": \"animation-play-state:running|paused\",\n\t\"animtf\": \"animation-timing-function:linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(${1:0.1}, ${2:0.7}, ${3:1.0}, ${3:0.1})\",\n\t\"ap\": \"appearance:none\",\n\t\"as\": \"align-self:start|end|auto|flex-start|flex-end|center|baseline|stretch\",\n\t\"b\": \"bottom\",\n\t\"bd\": \"border:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdb\": \"border-bottom:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdbc\": \"border-bottom-color:${1:#000}\",\n\t\"bdbi\": \"border-bottom-image:url(${0})\",\n\t\"bdbk\": \"border-break:close\",\n\t\"bdbli\": \"border-bottom-left-image:url(${0})|continue\",\n\t\"bdblrs\": \"border-bottom-left-radius\",\n\t\"bdbri\": \"border-bottom-right-image:url(${0})|continue\",\n\t\"bdbrrs\": \"border-bottom-right-radius\",\n\t\"bdbs\": \"border-bottom-style\",\n\t\"bdbw\": \"border-bottom-width\",\n\t\"bdc\": \"border-color:${1:#000}\",\n\t\"bdci\": \"border-corner-image:url(${0})|continue\",\n\t\"bdcl\": \"border-collapse:collapse|separate\",\n\t\"bdf\": \"border-fit:repeat|clip|scale|stretch|overwrite|overflow|space\",\n\t\"bdi\": \"border-image:url(${0})\",\n\t\"bdl\": \"border-left:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdlc\": \"border-left-color:${1:#000}\",\n\t\"bdlen\": \"border-length\",\n\t\"bdli\": \"border-left-image:url(${0})\",\n\t\"bdls\": \"border-left-style\",\n\t\"bdlw\": \"border-left-width\",\n\t\"bdr\": \"border-right:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdrc\": \"border-right-color:${1:#000}\",\n\t\"bdri\": \"border-right-image:url(${0})\",\n\t\"bdrs\": \"border-radius\",\n\t\"bdrst\": \"border-right-style\",\n\t\"bdrw\": \"border-right-width\",\n\t\"bds\": \"border-style:none|hidden|dotted|dashed|solid|double|dot-dash|dot-dot-dash|wave|groove|ridge|inset|outset\",\n\t\"bdsp\": \"border-spacing\",\n\t\"bdt\": \"border-top:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdtc\": \"border-top-color:${1:#000}\",\n\t\"bdti\": \"border-top-image:url(${0})\",\n\t\"bdtli\": \"border-top-left-image:url(${0})|continue\",\n\t\"bdtlrs\": \"border-top-left-radius\",\n\t\"bdtri\": \"border-top-right-image:url(${0})|continue\",\n\t\"bdtrrs\": \"border-top-right-radius\",\n\t\"bdts\": \"border-top-style\",\n\t\"bdtw\": \"border-top-width\",\n\t\"bdw\": \"border-width\",\n  \"bbs\": \"border-block-start\",\n  \"bbe\": \"border-block-end\",\n  \"bis\": \"border-inline-start\",\n  \"bie\": \"border-inline-end\",\n\t\"bfv\": \"backface-visibility:hidden|visible\",\n\t\"bg\": \"background:${1:#000}\",\n\t\"bg:n\": \"background: none\",\n\t\"bga\": \"background-attachment:fixed|scroll\",\n\t\"bgbk\": \"background-break:bounding-box|each-box|continuous\",\n\t\"bgc\": \"background-color:${1:#fff}\",\n\t\"bgcp\": \"background-clip:padding-box|border-box|content-box|no-clip\",\n\t\"bgi\": \"background-image:url(${0})\",\n\t\"bgo\": \"background-origin:padding-box|border-box|content-box\",\n\t\"bgp\": \"background-position:${1:0} ${2:0}\",\n\t\"bgpx\": \"background-position-x\",\n\t\"bgpy\": \"background-position-y\",\n\t\"bgr\": \"background-repeat:no-repeat|repeat-x|repeat-y|space|round\",\n\t\"bgsz\": \"background-size:contain|cover\",\n  \"bs\": \"block-size\",\n\t\"bxsh\": \"box-shadow:${1:inset }${2:hoff} ${3:voff} ${4:blur} ${5:#000}|none\",\n\t\"bxsz\": \"box-sizing:border-box|content-box|border-box\",\n\t\"c\": \"color:${1:#000}\",\n  \"cg\": \"column-gap\",\n\t\"cr\": \"color:rgb(${1:0}, ${2:0}, ${3:0})\",\n\t\"cra\": \"color:rgba(${1:0}, ${2:0}, ${3:0}, ${4:.5})\",\n\t\"cl\": \"clear:both|left|right|none\",\n\t\"cm\": \"/* ${0} */\",\n\t\"cnt\": \"content:'${0}'|normal|open-quote|no-open-quote|close-quote|no-close-quote|attr(${0})|counter(${0})|counters(${0})\",\n\t\"coi\": \"counter-increment\",\n\t\"colm\": \"columns\",\n\t\"colmc\": \"column-count\",\n\t\"colmf\": \"column-fill\",\n\t\"colmg\": \"column-gap\",\n\t\"colmr\": \"column-rule\",\n\t\"colmrc\": \"column-rule-color\",\n\t\"colmrs\": \"column-rule-style\",\n\t\"colmrw\": \"column-rule-width\",\n\t\"colms\": \"column-span\",\n\t\"colmw\": \"column-width\",\n\t\"cor\": \"counter-reset\",\n\t\"cp\": \"clip:auto|rect(${1:top} ${2:right} ${3:bottom} ${4:left})\",\n\t\"cps\": \"caption-side:top|bottom\",\n\t\"cur\": \"cursor:pointer|auto|default|crosshair|hand|help|move|pointer|text\",\n\t\"d\": \"display:block|none|flex|inline-flex|inline|inline-block|grid|inline-grid|subgrid|list-item|run-in|contents|table|inline-table|table-caption|table-column|table-column-group|table-header-group|table-footer-group|table-row|table-row-group|table-cell|ruby|ruby-base|ruby-base-group|ruby-text|ruby-text-group\",\n\t\"ec\": \"empty-cells:show|hide\",\n\t\"f\": \"font:${1:1em} ${2:sans-serif}\",\n\t\"fd\": \"font-display:auto|block|swap|fallback|optional\",\n\t\"fef\": \"font-effect:none|engrave|emboss|outline\",\n\t\"fem\": \"font-emphasize\",\n\t\"femp\": \"font-emphasize-position:before|after\",\n\t\"fems\": \"font-emphasize-style:none|accent|dot|circle|disc\",\n\t\"ff\": \"font-family:serif|sans-serif|cursive|fantasy|monospace\",\n\t\"fft\": \"font-family:\\\"Times New Roman\\\", Times, Baskerville, Georgia, serif\",\n\t\"ffa\": \"font-family:Arial, \\\"Helvetica Neue\\\", Helvetica, sans-serif\",\n\t\"ffv\": \"font-family:Verdana, Geneva, sans-serif\",\n\t\"fl\": \"float:left|right|none\",\n\t\"fs\": \"font-style:italic|normal|oblique\",\n\t\"fsm\": \"font-smoothing:antialiased|subpixel-antialiased|none\",\n\t\"fst\": \"font-stretch:normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded\",\n\t\"fv\": \"font-variant:normal|small-caps\",\n\t\"fvs\": \"font-variation-settings:normal|inherit|initial|unset\",\n\t\"fw\": \"font-weight:normal|bold|bolder|lighter\",\n\t\"fx\": \"flex\",\n\t\"fxb\": \"flex-basis:fill|max-content|min-content|fit-content|content\",\n\t\"fxd\": \"flex-direction:row|row-reverse|column|column-reverse\",\n\t\"fxf\": \"flex-flow\",\n\t\"fxg\": \"flex-grow\",\n\t\"fxsh\": \"flex-shrink\",\n\t\"fxw\": \"flex-wrap:nowrap|wrap|wrap-reverse\",\n\t\"fsz\": \"font-size\",\n\t\"fsza\": \"font-size-adjust\",\n\t\"g\": \"gap\",\n\t\"gtc\": \"grid-template-columns:repeat(${0})|minmax()\",\n\t\"gtr\": \"grid-template-rows:repeat(${0})|minmax()\",\n\t\"gta\": \"grid-template-areas\",\n\t\"gt\": \"grid-template\",\n\t\"gg\": \"grid-gap\",\n\t\"gcg\": \"grid-column-gap\",\n\t\"grg\": \"grid-row-gap\",\n\t\"gac\": \"grid-auto-columns:auto|minmax()\",\n\t\"gar\": \"grid-auto-rows:auto|minmax()\",\n\t\"gaf\": \"grid-auto-flow:row|column|dense|inherit|initial|unset\",\n\t\"gd\": \"grid\",\n\t\"gc\": \"grid-column\",\n\t\"gcs\": \"grid-column-start\",\n\t\"gce\": \"grid-column-end\",\n\t\"gr\": \"grid-row\",\n\t\"grs\": \"grid-row-start\",\n\t\"gre\": \"grid-row-end\",\n\t\"ga\": \"grid-area\",\n\t\"h\": \"height\",\n  \"is\": \"inline-size\",\n\t\"jc\": \"justify-content:start|end|stretch|flex-start|flex-end|center|space-between|space-around|space-evenly\",\n\t\"ji\": \"justify-items:start|end|center|stretch\",\n\t\"js\": \"justify-self:start|end|center|stretch\",\n\t\"l\": \"left\",\n\t\"lg\": \"background-image:linear-gradient(${1})\",\n\t\"lh\": \"line-height\",\n\t\"lis\": \"list-style\",\n\t\"lisi\": \"list-style-image\",\n\t\"lisp\": \"list-style-position:inside|outside\",\n\t\"list\": \"list-style-type:disc|circle|square|decimal|decimal-leading-zero|lower-roman|upper-roman\",\n\t\"lts\": \"letter-spacing:normal\",\n\t\"m\": \"margin\",\n\t\"mah\": \"max-height\",\n\t\"mar\": \"max-resolution\",\n\t\"maw\": \"max-width\",\n\t\"mb\": \"margin-bottom\",\n\t\"mih\": \"min-height\",\n\t\"mir\": \"min-resolution\",\n\t\"miw\": \"min-width\",\n\t\"ml\": \"margin-left\",\n\t\"mr\": \"margin-right\",\n\t\"mt\": \"margin-top\",\n  \"mbs\": \"margin-block-start\",\n  \"mbe\": \"margin-block-end\",\n  \"mis\": \"margin-inline-start\",\n  \"mie\": \"margin-inline-end\",\n\t\"ol\": \"outline\",\n\t\"olc\": \"outline-color:${1:#000}|invert\",\n\t\"olo\": \"outline-offset\",\n\t\"ols\": \"outline-style:none|dotted|dashed|solid|double|groove|ridge|inset|outset\",\n\t\"olw\": \"outline-width:thin|medium|thick\",\n\t\"op|opa\": \"opacity\",\n\t\"ord\": \"order\",\n\t\"ori\": \"orientation:landscape|portrait\",\n\t\"orp\": \"orphans\",\n\t\"ov\": \"overflow:hidden|visible|hidden|scroll|auto\",\n\t\"ovs\": \"overflow-style:scrollbar|auto|scrollbar|panner|move|marquee\",\n\t\"ovx\": \"overflow-x:hidden|visible|hidden|scroll|auto\",\n\t\"ovy\": \"overflow-y:hidden|visible|hidden|scroll|auto\",\n\t\"p\": \"padding\",\n\t\"pb\": \"padding-bottom\",\n\t\"pgba\": \"page-break-after:auto|always|left|right\",\n\t\"pgbb\": \"page-break-before:auto|always|left|right\",\n\t\"pgbi\": \"page-break-inside:auto|avoid\",\n\t\"pl\": \"padding-left\",\n\t\"pos\": \"position:relative|absolute|relative|fixed|static\",\n\t\"pr\": \"padding-right\",\n\t\"pt\": \"padding-top\",\n  \"pbs\": \"padding-block-start\",\n  \"pbe\": \"padding-block-end\",\n  \"pis\": \"padding-inline-start\",\n  \"pie\": \"padding-inline-end\",\n  \"spbs\": \"scroll-padding-block-start\",\n  \"spbe\": \"scroll-padding-block-end\",\n  \"spis\": \"scroll-padding-inline-start\",\n  \"spie\": \"scroll-padding-inline-end\",\n\t\"q\": \"quotes\",\n\t\"qen\": \"quotes:'\\\\201C' '\\\\201D' '\\\\2018' '\\\\2019'\",\n\t\"qru\": \"quotes:'\\\\00AB' '\\\\00BB' '\\\\201E' '\\\\201C'\",\n\t\"r\": \"right\",\n  \"rg\": \"row-gap\",\n\t\"rsz\": \"resize:none|both|horizontal|vertical\",\n\t\"t\": \"top\",\n\t\"ta\": \"text-align:left|center|right|justify\",\n\t\"tal\": \"text-align-last:left|center|right\",\n\t\"tbl\": \"table-layout:fixed\",\n\t\"td\": \"text-decoration:none|underline|overline|line-through\",\n\t\"te\": \"text-emphasis:none|accent|dot|circle|disc|before|after\",\n\t\"th\": \"text-height:auto|font-size|text-size|max-size\",\n\t\"ti\": \"text-indent\",\n\t\"tj\": \"text-justify:auto|inter-word|inter-ideograph|inter-cluster|distribute|kashida|tibetan\",\n\t\"to\": \"text-outline:${1:0} ${2:0} ${3:#000}\",\n\t\"tov\": \"text-overflow:ellipsis|clip\",\n\t\"tr\": \"text-replace\",\n\t\"trf\": \"transform:${1}|skewX(${1:angle})|skewY(${1:angle})|scale(${1:x}, ${2:y})|scaleX(${1:x})|scaleY(${1:y})|scaleZ(${1:z})|scale3d(${1:x}, ${2:y}, ${3:z})|rotate(${1:angle})|rotateX(${1:angle})|rotateY(${1:angle})|rotateZ(${1:angle})|translate(${1:x}, ${2:y})|translateX(${1:x})|translateY(${1:y})|translateZ(${1:z})|translate3d(${1:tx}, ${2:ty}, ${3:tz})\",\n\t\"trfo\": \"transform-origin\",\n\t\"trfs\": \"transform-style:preserve-3d\",\n\t\"trs\": \"transition:${1:prop} ${2:time}\",\n\t\"trsde\": \"transition-delay:${1:time}\",\n\t\"trsdu\": \"transition-duration:${1:time}\",\n\t\"trsp\": \"transition-property:${1:prop}\",\n\t\"trstf\": \"transition-timing-function:${1:fn}\",\n\t\"tsh\": \"text-shadow:${1:hoff} ${2:voff} ${3:blur} ${4:#000}\",\n\t\"tt\": \"text-transform:uppercase|lowercase|capitalize|none\",\n\t\"tw\": \"text-wrap:none|normal|unrestricted|suppress\",\n\t\"us\": \"user-select:none\",\n\t\"v\": \"visibility:hidden|visible|collapse\",\n\t\"va\": \"vertical-align:top|super|text-top|middle|baseline|bottom|text-bottom|sub\",\n\t\"w|wid\": \"width\",\n\t\"whs\": \"white-space:nowrap|pre|pre-wrap|pre-line|normal\",\n\t\"whsc\": \"white-space-collapse:normal|keep-all|loose|break-strict|break-all\",\n\t\"wido\": \"widows\",\n\t\"wm\": \"writing-mode:lr-tb|lr-tb|lr-bt|rl-tb|rl-bt|tb-rl|tb-lr|bt-lr|bt-rl\",\n\t\"wob\": \"word-break:normal|keep-all|break-all\",\n\t\"wos\": \"word-spacing\",\n\t\"wow\": \"word-wrap:none|unrestricted|suppress|break-word|normal\",\n\t\"z\": \"z-index\",\n\t\"zom\": \"zoom:1\"\n};\n\nvar xslSnippets = {\n    \"tm|tmatch\": \"xsl:template[match mode]\",\n    \"tn|tname\": \"xsl:template[name]\",\n    \"call\": \"xsl:call-template[name]\",\n    \"ap\": \"xsl:apply-templates[select mode]\",\n    \"api\": \"xsl:apply-imports\",\n    \"imp\": \"xsl:import[href]\",\n    \"inc\": \"xsl:include[href]\",\n    \"ch\": \"xsl:choose\",\n    \"wh|xsl:when\": \"xsl:when[test]\",\n    \"ot\": \"xsl:otherwise\",\n    \"if\": \"xsl:if[test]\",\n    \"par\": \"xsl:param[name]\",\n    \"pare\": \"xsl:param[name select]\",\n    \"var\": \"xsl:variable[name]\",\n    \"vare\": \"xsl:variable[name select]\",\n    \"wp\": \"xsl:with-param[name select]\",\n    \"key\": \"xsl:key[name match use]\",\n    \"elem\": \"xsl:element[name]\",\n    \"attr\": \"xsl:attribute[name]\",\n    \"attrs\": \"xsl:attribute-set[name]\",\n    \"cp\": \"xsl:copy[select]\",\n    \"co\": \"xsl:copy-of[select]\",\n    \"val\": \"xsl:value-of[select]\",\n    \"for|each\": \"xsl:for-each[select]\",\n    \"tex\": \"xsl:text\",\n    \"com\": \"xsl:comment\",\n    \"msg\": \"xsl:message[terminate=no]\",\n    \"fall\": \"xsl:fallback\",\n    \"num\": \"xsl:number[value]\",\n    \"nam\": \"namespace-alias[stylesheet-prefix result-prefix]\",\n    \"pres\": \"xsl:preserve-space[elements]\",\n    \"strip\": \"xsl:strip-space[elements]\",\n    \"proc\": \"xsl:processing-instruction[name]\",\n    \"sort\": \"xsl:sort[select order]\",\n    \"choose\": \"xsl:choose>xsl:when+xsl:otherwise\",\n    \"xsl\": \"!!!+xsl:stylesheet[version=1.0 xmlns:xsl=http://www.w3.org/1999/XSL/Transform]>{\\n|}\",\n    \"!!!\": \"{<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>}\"\n};\n\nvar pugSnippets = {\n\t\"!!!\": \"{doctype html}\"\n};\n\nvar variables = {\n\t\"lang\": \"en\",\n\t\"locale\": \"en-US\",\n\t\"charset\": \"UTF-8\",\n\t\"indentation\": \"\\t\",\n\t\"newline\": \"\\n\"\n};\n\n/**\n * Default syntaxes for abbreviation types\n */\nconst defaultSyntaxes = {\n    markup: 'html',\n    stylesheet: 'css'\n};\nconst defaultOptions$1 = {\n    'inlineElements': [\n        'a', 'abbr', 'acronym', 'applet', 'b', 'basefont', 'bdo',\n        'big', 'br', 'button', 'cite', 'code', 'del', 'dfn', 'em', 'font', 'i',\n        'iframe', 'img', 'input', 'ins', 'kbd', 'label', 'map', 'object', 'q',\n        's', 'samp', 'select', 'small', 'span', 'strike', 'strong', 'sub', 'sup',\n        'textarea', 'tt', 'u', 'var'\n    ],\n    'output.indent': '\\t',\n    'output.baseIndent': '',\n    'output.newline': '\\n',\n    'output.tagCase': '',\n    'output.attributeCase': '',\n    'output.attributeQuotes': 'double',\n    'output.format': true,\n    'output.formatLeafNode': false,\n    'output.formatSkip': ['html'],\n    'output.formatForce': ['body'],\n    'output.inlineBreak': 3,\n    'output.compactBoolean': false,\n    'output.booleanAttributes': [\n        'contenteditable', 'seamless', 'async', 'autofocus',\n        'autoplay', 'checked', 'controls', 'defer', 'disabled', 'formnovalidate',\n        'hidden', 'ismap', 'loop', 'multiple', 'muted', 'novalidate', 'readonly',\n        'required', 'reversed', 'selected', 'typemustmatch'\n    ],\n    'output.reverseAttributes': false,\n    'output.selfClosingStyle': 'html',\n    'output.field': (index, placeholder) => placeholder,\n    'output.text': text => text,\n    'markup.href': true,\n    'comment.enabled': false,\n    'comment.trigger': ['id', 'class'],\n    'comment.before': '',\n    'comment.after': '\\n<!-- /[#ID][.CLASS] -->',\n    'bem.enabled': false,\n    'bem.element': '__',\n    'bem.modifier': '_',\n    'jsx.enabled': false,\n    'stylesheet.keywords': ['auto', 'inherit', 'unset', 'none'],\n    'stylesheet.unitless': ['z-index', 'line-height', 'opacity', 'font-weight', 'zoom', 'flex', 'flex-grow', 'flex-shrink'],\n    'stylesheet.shortHex': true,\n    'stylesheet.between': ': ',\n    'stylesheet.after': ';',\n    'stylesheet.intUnit': 'px',\n    'stylesheet.floatUnit': 'em',\n    'stylesheet.unitAliases': { e: 'em', p: '%', x: 'ex', r: 'rem' },\n    'stylesheet.json': false,\n    'stylesheet.jsonDoubleQuotes': false,\n    'stylesheet.fuzzySearchMinScore': 0,\n    'stylesheet.strictMatch': false\n};\nconst defaultConfig = {\n    type: 'markup',\n    syntax: 'html',\n    variables,\n    snippets: {},\n    options: defaultOptions$1\n};\n/**\n * Default per-syntax config\n */\nconst syntaxConfig = {\n    markup: {\n        snippets: parseSnippets(markupSnippets),\n    },\n    xhtml: {\n        options: {\n            'output.selfClosingStyle': 'xhtml'\n        }\n    },\n    xml: {\n        options: {\n            'output.selfClosingStyle': 'xml'\n        }\n    },\n    xsl: {\n        snippets: parseSnippets(xslSnippets),\n        options: {\n            'output.selfClosingStyle': 'xml'\n        }\n    },\n    jsx: {\n        options: {\n            'jsx.enabled': true,\n            'markup.attributes': {\n                'class': 'className',\n                'class*': 'styleName',\n                'for': 'htmlFor'\n            },\n            'markup.valuePrefix': {\n                'class*': 'styles'\n            }\n        }\n    },\n    vue: {\n        options: {\n            'markup.attributes': {\n                'class*': ':class',\n            }\n        }\n    },\n    svelte: {\n        options: {\n            'jsx.enabled': true\n        }\n    },\n    pug: {\n        snippets: parseSnippets(pugSnippets)\n    },\n    stylesheet: {\n        snippets: parseSnippets(stylesheetSnippets)\n    },\n    sass: {\n        options: {\n            'stylesheet.after': ''\n        }\n    },\n    stylus: {\n        options: {\n            'stylesheet.between': ' ',\n            'stylesheet.after': '',\n        }\n    }\n};\n/**\n * Parses raw snippets definitions with possibly multiple keys into a plan\n * snippet map\n */\nfunction parseSnippets(snippets) {\n    const result = {};\n    Object.keys(snippets).forEach(k => {\n        for (const name of k.split('|')) {\n            result[name] = snippets[k];\n        }\n    });\n    return result;\n}\nfunction resolveConfig(config = {}, globals = {}) {\n    const type = config.type || 'markup';\n    const syntax = config.syntax || defaultSyntaxes[type];\n    return Object.assign(Object.assign(Object.assign({}, defaultConfig), config), { type,\n        syntax, variables: mergedData(type, syntax, 'variables', config, globals), snippets: mergedData(type, syntax, 'snippets', config, globals), options: mergedData(type, syntax, 'options', config, globals) });\n}\nfunction mergedData(type, syntax, key, config, globals = {}) {\n    const typeDefaults = syntaxConfig[type];\n    const typeOverride = globals[type];\n    const syntaxDefaults = syntaxConfig[syntax];\n    const syntaxOverride = globals[syntax];\n    return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, defaultConfig[key]), (typeDefaults && typeDefaults[key])), (syntaxDefaults && syntaxDefaults[key])), (typeOverride && typeOverride[key])), (syntaxOverride && syntaxOverride[key])), config[key]);\n}\n\n/**\n * Creates structure for scanning given string in backward direction\n */\nfunction backwardScanner(text, start = 0) {\n    return { text, start, pos: text.length };\n}\n/**\n * Check if given scanner position is at start of scanned text\n */\nfunction sol(scanner) {\n    return scanner.pos === scanner.start;\n}\n/**\n * “Peeks” character code an current scanner location without advancing it\n */\nfunction peek(scanner, offset = 0) {\n    return scanner.text.charCodeAt(scanner.pos - 1 + offset);\n}\n/**\n * Returns current character code and moves character location one symbol back\n */\nfunction previous(scanner) {\n    if (!sol(scanner)) {\n        return scanner.text.charCodeAt(--scanner.pos);\n    }\n}\n/**\n * Consumes current character code if it matches given `match` code or function\n */\nfunction consume(scanner, match) {\n    if (sol(scanner)) {\n        return false;\n    }\n    const ok = typeof match === 'function'\n        ? match(peek(scanner))\n        : match === peek(scanner);\n    if (ok) {\n        scanner.pos--;\n    }\n    return !!ok;\n}\nfunction consumeWhile(scanner, match) {\n    const start = scanner.pos;\n    while (consume(scanner, match)) {\n        // empty\n    }\n    return scanner.pos < start;\n}\n\nvar Chars$1;\n(function (Chars) {\n    Chars[Chars[\"SingleQuote\"] = 39] = \"SingleQuote\";\n    Chars[Chars[\"DoubleQuote\"] = 34] = \"DoubleQuote\";\n    Chars[Chars[\"Escape\"] = 92] = \"Escape\";\n})(Chars$1 || (Chars$1 = {}));\n/**\n * Check if given character code is a quote\n */\nfunction isQuote(c) {\n    return c === Chars$1.SingleQuote || c === Chars$1.DoubleQuote;\n}\n/**\n * Consumes quoted value, if possible\n * @return Returns `true` is value was consumed\n */\nfunction consumeQuoted(scanner) {\n    const start = scanner.pos;\n    const quote = previous(scanner);\n    if (isQuote(quote)) {\n        while (!sol(scanner)) {\n            if (previous(scanner) === quote && peek(scanner) !== Chars$1.Escape) {\n                return true;\n            }\n        }\n    }\n    scanner.pos = start;\n    return false;\n}\n\nvar Brackets;\n(function (Brackets) {\n    Brackets[Brackets[\"SquareL\"] = 91] = \"SquareL\";\n    Brackets[Brackets[\"SquareR\"] = 93] = \"SquareR\";\n    Brackets[Brackets[\"RoundL\"] = 40] = \"RoundL\";\n    Brackets[Brackets[\"RoundR\"] = 41] = \"RoundR\";\n    Brackets[Brackets[\"CurlyL\"] = 123] = \"CurlyL\";\n    Brackets[Brackets[\"CurlyR\"] = 125] = \"CurlyR\";\n})(Brackets || (Brackets = {}));\nconst bracePairs = {\n    [Brackets.SquareL]: Brackets.SquareR,\n    [Brackets.RoundL]: Brackets.RoundR,\n    [Brackets.CurlyL]: Brackets.CurlyR,\n};\n\nvar Chars;\n(function (Chars) {\n    Chars[Chars[\"Tab\"] = 9] = \"Tab\";\n    Chars[Chars[\"Space\"] = 32] = \"Space\";\n    /** `-` character */\n    Chars[Chars[\"Dash\"] = 45] = \"Dash\";\n    /** `/` character */\n    Chars[Chars[\"Slash\"] = 47] = \"Slash\";\n    /** `:` character */\n    Chars[Chars[\"Colon\"] = 58] = \"Colon\";\n    /** `=` character */\n    Chars[Chars[\"Equals\"] = 61] = \"Equals\";\n    /** `<` character */\n    Chars[Chars[\"AngleLeft\"] = 60] = \"AngleLeft\";\n    /** `>` character */\n    Chars[Chars[\"AngleRight\"] = 62] = \"AngleRight\";\n})(Chars || (Chars = {}));\n/**\n * Check if given reader’s current position points at the end of HTML tag\n */\nfunction isHtml(scanner) {\n    const start = scanner.pos;\n    if (!consume(scanner, Chars.AngleRight)) {\n        return false;\n    }\n    let ok = false;\n    consume(scanner, Chars.Slash); // possibly self-closed element\n    while (!sol(scanner)) {\n        consumeWhile(scanner, isWhiteSpace);\n        if (consumeIdent(scanner)) {\n            // ate identifier: could be a tag name, boolean attribute or unquoted\n            // attribute value\n            if (consume(scanner, Chars.Slash)) {\n                // either closing tag or invalid tag\n                ok = consume(scanner, Chars.AngleLeft);\n                break;\n            }\n            else if (consume(scanner, Chars.AngleLeft)) {\n                // opening tag\n                ok = true;\n                break;\n            }\n            else if (consume(scanner, isWhiteSpace)) {\n                // boolean attribute\n                continue;\n            }\n            else if (consume(scanner, Chars.Equals)) {\n                // simple unquoted value or invalid attribute\n                if (consumeIdent(scanner)) {\n                    continue;\n                }\n                break;\n            }\n            else if (consumeAttributeWithUnquotedValue(scanner)) {\n                // identifier was a part of unquoted value\n                ok = true;\n                break;\n            }\n            // invalid tag\n            break;\n        }\n        if (consumeAttribute(scanner)) {\n            continue;\n        }\n        break;\n    }\n    scanner.pos = start;\n    return ok;\n}\n/**\n * Consumes HTML attribute from given string.\n * @return `true` if attribute was consumed.\n */\nfunction consumeAttribute(scanner) {\n    return consumeAttributeWithQuotedValue(scanner) || consumeAttributeWithUnquotedValue(scanner);\n}\nfunction consumeAttributeWithQuotedValue(scanner) {\n    const start = scanner.pos;\n    if (consumeQuoted(scanner) && consume(scanner, Chars.Equals) && consumeIdent(scanner)) {\n        return true;\n    }\n    scanner.pos = start;\n    return false;\n}\nfunction consumeAttributeWithUnquotedValue(scanner) {\n    const start = scanner.pos;\n    const stack = [];\n    while (!sol(scanner)) {\n        const ch = peek(scanner);\n        if (isCloseBracket(ch)) {\n            stack.push(ch);\n        }\n        else if (isOpenBracket(ch)) {\n            if (stack.pop() !== bracePairs[ch]) {\n                // Unexpected open bracket\n                break;\n            }\n        }\n        else if (!isUnquotedValue(ch)) {\n            break;\n        }\n        scanner.pos--;\n    }\n    if (start !== scanner.pos && consume(scanner, Chars.Equals) && consumeIdent(scanner)) {\n        return true;\n    }\n    scanner.pos = start;\n    return false;\n}\n/**\n * Consumes HTML identifier from stream\n */\nfunction consumeIdent(scanner) {\n    return consumeWhile(scanner, isIdent);\n}\n/**\n * Check if given character code belongs to HTML identifier\n */\nfunction isIdent(ch) {\n    return ch === Chars.Colon || ch === Chars.Dash || isAlpha(ch) || isNumber(ch);\n}\n/**\n * Check if given character code is alpha code (letter though A to Z)\n */\nfunction isAlpha(ch) {\n    ch &= ~32; // quick hack to convert any char code to uppercase char code\n    return ch >= 65 && ch <= 90; // A-Z\n}\n/**\n * Check if given code is a number\n */\nfunction isNumber(ch) {\n    return ch > 47 && ch < 58;\n}\n/**\n * Check if given code is a whitespace\n */\nfunction isWhiteSpace(ch) {\n    return ch === Chars.Space || ch === Chars.Tab;\n}\n/**\n * Check if given code may belong to unquoted attribute value\n */\nfunction isUnquotedValue(ch) {\n    return !isNaN(ch) && ch !== Chars.Equals && !isWhiteSpace(ch) && !isQuote(ch);\n}\nfunction isOpenBracket(ch) {\n    return ch === Brackets.CurlyL || ch === Brackets.RoundL || ch === Brackets.SquareL;\n}\nfunction isCloseBracket(ch) {\n    return ch === Brackets.CurlyR || ch === Brackets.RoundR || ch === Brackets.SquareR;\n}\n\nconst code = (ch) => ch.charCodeAt(0);\nconst specialChars = '#.*:$-_!@%^+>/'.split('').map(code);\nconst defaultOptions = {\n    type: 'markup',\n    lookAhead: true,\n    prefix: ''\n};\n/**\n * Extracts Emmet abbreviation from given string.\n * The goal of this module is to extract abbreviation from current editor’s line,\n * e.g. like this: `<span>.foo[title=bar|]</span>` -> `.foo[title=bar]`, where\n * `|` is a current caret position.\n * @param line A text line where abbreviation should be expanded\n * @param pos Caret position in line. If not given, uses end of line\n * @param options Extracting options\n */\nfunction extractAbbreviation$1(line, pos = line.length, options = {}) {\n    // make sure `pos` is within line range\n    const opt = Object.assign(Object.assign({}, defaultOptions), options);\n    pos = Math.min(line.length, Math.max(0, pos == null ? line.length : pos));\n    if (opt.lookAhead) {\n        pos = offsetPastAutoClosed(line, pos, opt);\n    }\n    let ch;\n    const start = getStartOffset(line, pos, opt.prefix || '');\n    if (start === -1) {\n        return void 0;\n    }\n    const scanner = backwardScanner(line, start);\n    scanner.pos = pos;\n    const stack = [];\n    while (!sol(scanner)) {\n        ch = peek(scanner);\n        if (stack.includes(Brackets.CurlyR)) {\n            if (ch === Brackets.CurlyR) {\n                stack.push(ch);\n                scanner.pos--;\n                continue;\n            }\n            if (ch !== Brackets.CurlyL) {\n                scanner.pos--;\n                continue;\n            }\n        }\n        if (isCloseBrace(ch, opt.type)) {\n            stack.push(ch);\n        }\n        else if (isOpenBrace(ch, opt.type)) {\n            if (stack.pop() !== bracePairs[ch]) {\n                // unexpected brace\n                break;\n            }\n        }\n        else if (stack.includes(Brackets.SquareR) || stack.includes(Brackets.CurlyR)) {\n            // respect all characters inside attribute sets or text nodes\n            scanner.pos--;\n            continue;\n        }\n        else if (isHtml(scanner) || !isAbbreviation(ch)) {\n            break;\n        }\n        scanner.pos--;\n    }\n    if (!stack.length && scanner.pos !== pos) {\n        // Found something, remove some invalid symbols from the\n        // beginning and return abbreviation\n        const abbreviation = line.slice(scanner.pos, pos).replace(/^[*+>^]+/, '');\n        return {\n            abbreviation,\n            location: pos - abbreviation.length,\n            start: options.prefix\n                ? start - options.prefix.length\n                : pos - abbreviation.length,\n            end: pos\n        };\n    }\n}\n/**\n * Returns new `line` index which is right after characters beyound `pos` that\n * editor will likely automatically close, e.g. }, ], and quotes\n */\nfunction offsetPastAutoClosed(line, pos, options) {\n    // closing quote is allowed only as a next character\n    if (isQuote(line.charCodeAt(pos))) {\n        pos++;\n    }\n    // offset pointer until non-autoclosed character is found\n    while (isCloseBrace(line.charCodeAt(pos), options.type)) {\n        pos++;\n    }\n    return pos;\n}\n/**\n * Returns start offset (left limit) in `line` where we should stop looking for\n * abbreviation: it’s nearest to `pos` location of `prefix` token\n */\nfunction getStartOffset(line, pos, prefix) {\n    if (!prefix) {\n        return 0;\n    }\n    const scanner = backwardScanner(line);\n    const compiledPrefix = prefix.split('').map(code);\n    scanner.pos = pos;\n    let result;\n    while (!sol(scanner)) {\n        if (consumePair(scanner, Brackets.SquareR, Brackets.SquareL) || consumePair(scanner, Brackets.CurlyR, Brackets.CurlyL)) {\n            continue;\n        }\n        result = scanner.pos;\n        if (consumeArray(scanner, compiledPrefix)) {\n            return result;\n        }\n        scanner.pos--;\n    }\n    return -1;\n}\n/**\n * Consumes full character pair, if possible\n */\nfunction consumePair(scanner, close, open) {\n    const start = scanner.pos;\n    if (consume(scanner, close)) {\n        while (!sol(scanner)) {\n            if (consume(scanner, open)) {\n                return true;\n            }\n            scanner.pos--;\n        }\n    }\n    scanner.pos = start;\n    return false;\n}\n/**\n * Consumes all character codes from given array, right-to-left, if possible\n */\nfunction consumeArray(scanner, arr) {\n    const start = scanner.pos;\n    let consumed = false;\n    for (let i = arr.length - 1; i >= 0 && !sol(scanner); i--) {\n        if (!consume(scanner, arr[i])) {\n            break;\n        }\n        consumed = i === 0;\n    }\n    if (!consumed) {\n        scanner.pos = start;\n    }\n    return consumed;\n}\nfunction isAbbreviation(ch) {\n    return (ch > 64 && ch < 91) // uppercase letter\n        || (ch > 96 && ch < 123) // lowercase letter\n        || (ch > 47 && ch < 58) // number\n        || specialChars.includes(ch); // special character\n}\nfunction isOpenBrace(ch, syntax) {\n    return ch === Brackets.RoundL || (syntax === 'markup' && (ch === Brackets.SquareL || ch === Brackets.CurlyL));\n}\nfunction isCloseBrace(ch, syntax) {\n    return ch === Brackets.RoundR || (syntax === 'markup' && (ch === Brackets.SquareR || ch === Brackets.CurlyR));\n}\n\nfunction expandAbbreviation$1(abbr, config) {\n    const resolvedConfig = resolveConfig(config);\n    return resolvedConfig.type === 'stylesheet'\n        ? stylesheet(abbr, resolvedConfig)\n        : markup(abbr, resolvedConfig);\n}\n/**\n * Expands given *markup* abbreviation (e.g. regular Emmet abbreviation that\n * produces structured output like HTML) and outputs it according to options\n * provided in config\n */\nfunction markup(abbr, config) {\n    return stringify(parse$1(abbr, config), config);\n}\n/**\n * Expands given *stylesheet* abbreviation (a special Emmet abbreviation designed for\n * stylesheet languages like CSS, SASS etc.) and outputs it according to options\n * provided in config\n */\nfunction stylesheet(abbr, config) {\n    return css(parse(abbr, config), config);\n}\n\nconst cssData = {\n    \"properties\": [\"additive-symbols\", \"align-content\", \"align-items\", \"justify-items\", \"justify-self\", \"justify-items\", \"align-self\", \"all\", \"alt\", \"animation\", \"animation-delay\", \"animation-direction\", \"animation-duration\", \"animation-fill-mode\", \"animation-iteration-count\", \"animation-name\", \"animation-play-state\", \"animation-timing-function\", \"backface-visibility\", \"background\", \"background-attachment\", \"background-blend-mode\", \"background-clip\", \"background-color\", \"background-image\", \"background-origin\", \"background-position\", \"background-position-x\", \"background-position-y\", \"background-repeat\", \"background-size\", \"behavior\", \"block-size\", \"border\", \"border-block-end\", \"border-block-start\", \"border-block-end-color\", \"border-block-start-color\", \"border-block-end-style\", \"border-block-start-style\", \"border-block-end-width\", \"border-block-start-width\", \"border-bottom\", \"border-bottom-color\", \"border-bottom-left-radius\", \"border-bottom-right-radius\", \"border-bottom-style\", \"border-bottom-width\", \"border-collapse\", \"border-color\", \"border-image\", \"border-image-outset\", \"border-image-repeat\", \"border-image-slice\", \"border-image-source\", \"border-image-width\", \"border-inline-end\", \"border-inline-start\", \"border-inline-end-color\", \"border-inline-start-color\", \"border-inline-end-style\", \"border-inline-start-style\", \"border-inline-end-width\", \"border-inline-start-width\", \"border-left\", \"border-left-color\", \"border-left-style\", \"border-left-width\", \"border-radius\", \"border-right\", \"border-right-color\", \"border-right-style\", \"border-right-width\", \"border-spacing\", \"border-style\", \"border-top\", \"border-top-color\", \"border-top-left-radius\", \"border-top-right-radius\", \"border-top-style\", \"border-top-width\", \"border-width\", \"bottom\", \"box-decoration-break\", \"box-shadow\", \"box-sizing\", \"break-after\", \"break-before\", \"break-inside\", \"caption-side\", \"caret-color\", \"clear\", \"clip\", \"clip-path\", \"clip-rule\", \"color\", \"color-interpolation-filters\", \"column-count\", \"column-fill\", \"column-gap\", \"column-rule\", \"column-rule-color\", \"column-rule-style\", \"column-rule-width\", \"columns\", \"column-span\", \"column-width\", \"contain\", \"content\", \"counter-increment\", \"counter-reset\", \"cursor\", \"direction\", \"display\", \"empty-cells\", \"enable-background\", \"fallback\", \"fill\", \"fill-opacity\", \"fill-rule\", \"filter\", \"flex\", \"flex-basis\", \"flex-direction\", \"flex-flow\", \"flex-grow\", \"flex-shrink\", \"flex-wrap\", \"float\", \"flood-color\", \"flood-opacity\", \"font\", \"font-family\", \"font-feature-settings\", \"font-kerning\", \"font-language-override\", \"font-size\", \"font-size-adjust\", \"font-stretch\", \"font-style\", \"font-synthesis\", \"font-variant\", \"font-variant-alternates\", \"font-variant-caps\", \"font-variant-east-asian\", \"font-variant-ligatures\", \"font-variant-numeric\", \"font-variant-position\", \"font-weight\", \"glyph-orientation-horizontal\", \"glyph-orientation-vertical\", \"grid-area\", \"grid-auto-columns\", \"grid-auto-flow\", \"grid-auto-rows\", \"grid-column\", \"grid-column-end\", \"grid-column-gap\", \"grid-column-start\", \"grid-gap\", \"grid-row\", \"grid-row-end\", \"grid-row-gap\", \"grid-row-start\", \"grid-template\", \"grid-template-areas\", \"grid-template-columns\", \"grid-template-rows\", \"height\", \"hyphens\", \"image-orientation\", \"image-rendering\", \"ime-mode\", \"inline-size\", \"isolation\", \"justify-content\", \"kerning\", \"left\", \"letter-spacing\", \"lighting-color\", \"line-break\", \"line-height\", \"list-style\", \"list-style-image\", \"list-style-position\", \"list-style-type\", \"margin\", \"margin-block-end\", \"margin-block-start\", \"margin-bottom\", \"margin-inline-end\", \"margin-inline-start\", \"margin-left\", \"margin-right\", \"margin-top\", \"marker\", \"marker-end\", \"marker-mid\", \"marker-start\", \"mask-type\", \"max-block-size\", \"max-height\", \"max-inline-size\", \"max-width\", \"min-block-size\", \"min-height\", \"min-inline-size\", \"min-width\", \"mix-blend-mode\", \"motion\", \"motion-offset\", \"motion-path\", \"motion-rotation\", \"-moz-animation\", \"-moz-animation-delay\", \"-moz-animation-direction\", \"-moz-animation-duration\", \"-moz-animation-iteration-count\", \"-moz-animation-name\", \"-moz-animation-play-state\", \"-moz-animation-timing-function\", \"-moz-appearance\", \"-moz-backface-visibility\", \"-moz-background-clip\", \"-moz-background-inline-policy\", \"-moz-background-origin\", \"-moz-border-bottom-colors\", \"-moz-border-image\", \"-moz-border-left-colors\", \"-moz-border-right-colors\", \"-moz-border-top-colors\", \"-moz-box-align\", \"-moz-box-direction\", \"-moz-box-flex\", \"-moz-box-flexgroup\", \"-moz-box-ordinal-group\", \"-moz-box-orient\", \"-moz-box-pack\", \"-moz-box-sizing\", \"-moz-column-count\", \"-moz-column-gap\", \"-moz-column-rule\", \"-moz-column-rule-color\", \"-moz-column-rule-style\", \"-moz-column-rule-width\", \"-moz-columns\", \"-moz-column-width\", \"-moz-font-feature-settings\", \"-moz-hyphens\", \"-moz-perspective\", \"-moz-perspective-origin\", \"-moz-text-align-last\", \"-moz-text-decoration-color\", \"-moz-text-decoration-line\", \"-moz-text-decoration-style\", \"-moz-text-size-adjust\", \"-moz-transform\", \"-moz-transform-origin\", \"-moz-transition\", \"-moz-transition-delay\", \"-moz-transition-duration\", \"-moz-transition-property\", \"-moz-transition-timing-function\", \"-moz-user-focus\", \"-moz-user-select\", \"-ms-accelerator\", \"-ms-behavior\", \"-ms-block-progression\", \"-ms-content-zoom-chaining\", \"-ms-content-zooming\", \"-ms-content-zoom-limit\", \"-ms-content-zoom-limit-max\", \"-ms-content-zoom-limit-min\", \"-ms-content-zoom-snap\", \"-ms-content-zoom-snap-points\", \"-ms-content-zoom-snap-type\", \"-ms-filter\", \"-ms-flex\", \"-ms-flex-align\", \"-ms-flex-direction\", \"-ms-flex-flow\", \"-ms-flex-item-align\", \"-ms-flex-line-pack\", \"-ms-flex-order\", \"-ms-flex-pack\", \"-ms-flex-wrap\", \"-ms-flow-from\", \"-ms-flow-into\", \"-ms-grid-column\", \"-ms-grid-column-align\", \"-ms-grid-columns\", \"-ms-grid-column-span\", \"-ms-grid-layer\", \"-ms-grid-row\", \"-ms-grid-row-align\", \"-ms-grid-rows\", \"-ms-grid-row-span\", \"-ms-high-contrast-adjust\", \"-ms-hyphenate-limit-chars\", \"-ms-hyphenate-limit-lines\", \"-ms-hyphenate-limit-zone\", \"-ms-hyphens\", \"-ms-ime-mode\", \"-ms-interpolation-mode\", \"-ms-layout-grid\", \"-ms-layout-grid-char\", \"-ms-layout-grid-line\", \"-ms-layout-grid-mode\", \"-ms-layout-grid-type\", \"-ms-line-break\", \"-ms-overflow-style\", \"-ms-perspective\", \"-ms-perspective-origin\", \"-ms-perspective-origin-x\", \"-ms-perspective-origin-y\", \"-ms-progress-appearance\", \"-ms-scrollbar-3dlight-color\", \"-ms-scrollbar-arrow-color\", \"-ms-scrollbar-base-color\", \"-ms-scrollbar-darkshadow-color\", \"-ms-scrollbar-face-color\", \"-ms-scrollbar-highlight-color\", \"-ms-scrollbar-shadow-color\", \"-ms-scrollbar-track-color\", \"-ms-scroll-chaining\", \"-ms-scroll-limit\", \"-ms-scroll-limit-x-max\", \"-ms-scroll-limit-x-min\", \"-ms-scroll-limit-y-max\", \"-ms-scroll-limit-y-min\", \"-ms-scroll-rails\", \"-ms-scroll-snap-points-x\", \"-ms-scroll-snap-points-y\", \"-ms-scroll-snap-type\", \"-ms-scroll-snap-x\", \"-ms-scroll-snap-y\", \"-ms-scroll-translation\", \"-ms-text-align-last\", \"-ms-text-autospace\", \"-ms-text-combine-horizontal\", \"-ms-text-justify\", \"-ms-text-kashida-space\", \"-ms-text-overflow\", \"-ms-text-size-adjust\", \"-ms-text-underline-position\", \"-ms-touch-action\", \"-ms-touch-select\", \"-ms-transform\", \"-ms-transform-origin\", \"-ms-transform-origin-x\", \"-ms-transform-origin-y\", \"-ms-transform-origin-z\", \"-ms-user-select\", \"-ms-word-break\", \"-ms-word-wrap\", \"-ms-wrap-flow\", \"-ms-wrap-margin\", \"-ms-wrap-through\", \"-ms-writing-mode\", \"-ms-zoom\", \"-ms-zoom-animation\", \"nav-down\", \"nav-index\", \"nav-left\", \"nav-right\", \"nav-up\", \"negative\", \"-o-animation\", \"-o-animation-delay\", \"-o-animation-direction\", \"-o-animation-duration\", \"-o-animation-fill-mode\", \"-o-animation-iteration-count\", \"-o-animation-name\", \"-o-animation-play-state\", \"-o-animation-timing-function\", \"object-fit\", \"object-position\", \"-o-border-image\", \"-o-object-fit\", \"-o-object-position\", \"opacity\", \"order\", \"orphans\", \"-o-table-baseline\", \"-o-tab-size\", \"-o-text-overflow\", \"-o-transform\", \"-o-transform-origin\", \"-o-transition\", \"-o-transition-delay\", \"-o-transition-duration\", \"-o-transition-property\", \"-o-transition-timing-function\", \"offset-block-end\", \"offset-block-start\", \"offset-inline-end\", \"offset-inline-start\", \"outline\", \"outline-color\", \"outline-offset\", \"outline-style\", \"outline-width\", \"overflow\", \"overflow-wrap\", \"overflow-x\", \"overflow-y\", \"pad\", \"padding\", \"padding-bottom\", \"padding-block-end\", \"padding-block-start\", \"padding-inline-end\", \"padding-inline-start\", \"padding-left\", \"padding-right\", \"padding-top\", \"page-break-after\", \"page-break-before\", \"page-break-inside\", \"paint-order\", \"perspective\", \"perspective-origin\", \"pointer-events\", \"position\", \"prefix\", \"quotes\", \"range\", \"resize\", \"right\", \"ruby-align\", \"ruby-overhang\", \"ruby-position\", \"ruby-span\", \"scrollbar-3dlight-color\", \"scrollbar-arrow-color\", \"scrollbar-base-color\", \"scrollbar-darkshadow-color\", \"scrollbar-face-color\", \"scrollbar-highlight-color\", \"scrollbar-shadow-color\", \"scrollbar-track-color\", \"scroll-behavior\", \"scroll-snap-coordinate\", \"scroll-snap-destination\", \"scroll-snap-points-x\", \"scroll-snap-points-y\", \"scroll-snap-type\", \"shape-image-threshold\", \"shape-margin\", \"shape-outside\", \"shape-rendering\", \"size\", \"src\", \"stop-color\", \"stop-opacity\", \"stroke\", \"stroke-dasharray\", \"stroke-dashoffset\", \"stroke-linecap\", \"stroke-linejoin\", \"stroke-miterlimit\", \"stroke-opacity\", \"stroke-width\", \"suffix\", \"system\", \"symbols\", \"table-layout\", \"tab-size\", \"text-align\", \"text-align-last\", \"text-anchor\", \"text-decoration\", \"text-decoration-color\", \"text-decoration-line\", \"text-decoration-style\", \"text-indent\", \"text-justify\", \"text-orientation\", \"text-overflow\", \"text-rendering\", \"text-shadow\", \"text-transform\", \"text-underline-position\", \"top\", \"touch-action\", \"transform\", \"transform-origin\", \"transform-style\", \"transition\", \"transition-delay\", \"transition-duration\", \"transition-property\", \"transition-timing-function\", \"unicode-bidi\", \"unicode-range\", \"user-select\", \"vertical-align\", \"visibility\", \"-webkit-animation\", \"-webkit-animation-delay\", \"-webkit-animation-direction\", \"-webkit-animation-duration\", \"-webkit-animation-fill-mode\", \"-webkit-animation-iteration-count\", \"-webkit-animation-name\", \"-webkit-animation-play-state\", \"-webkit-animation-timing-function\", \"-webkit-appearance\", \"-webkit-backdrop-filter\", \"-webkit-backface-visibility\", \"-webkit-background-clip\", \"-webkit-background-composite\", \"-webkit-background-origin\", \"-webkit-border-image\", \"-webkit-box-align\", \"-webkit-box-direction\", \"-webkit-box-flex\", \"-webkit-box-flex-group\", \"-webkit-box-ordinal-group\", \"-webkit-box-orient\", \"-webkit-box-pack\", \"-webkit-box-reflect\", \"-webkit-box-sizing\", \"-webkit-break-after\", \"-webkit-break-before\", \"-webkit-break-inside\", \"-webkit-column-break-after\", \"-webkit-column-break-before\", \"-webkit-column-break-inside\", \"-webkit-column-count\", \"-webkit-column-gap\", \"-webkit-column-rule\", \"-webkit-column-rule-color\", \"-webkit-column-rule-style\", \"-webkit-column-rule-width\", \"-webkit-columns\", \"-webkit-column-span\", \"-webkit-column-width\", \"-webkit-filter\", \"-webkit-flow-from\", \"-webkit-flow-into\", \"-webkit-font-feature-settings\", \"-webkit-hyphens\", \"-webkit-line-break\", \"-webkit-margin-bottom-collapse\", \"-webkit-margin-collapse\", \"-webkit-margin-start\", \"-webkit-margin-top-collapse\", \"-webkit-mask-clip\", \"-webkit-mask-image\", \"-webkit-mask-origin\", \"-webkit-mask-repeat\", \"-webkit-mask-size\", \"-webkit-nbsp-mode\", \"-webkit-overflow-scrolling\", \"-webkit-padding-start\", \"-webkit-perspective\", \"-webkit-perspective-origin\", \"-webkit-region-fragment\", \"-webkit-tap-highlight-color\", \"-webkit-text-fill-color\", \"-webkit-text-size-adjust\", \"-webkit-text-stroke\", \"-webkit-text-stroke-color\", \"-webkit-text-stroke-width\", \"-webkit-touch-callout\", \"-webkit-transform\", \"-webkit-transform-origin\", \"-webkit-transform-origin-x\", \"-webkit-transform-origin-y\", \"-webkit-transform-origin-z\", \"-webkit-transform-style\", \"-webkit-transition\", \"-webkit-transition-delay\", \"-webkit-transition-duration\", \"-webkit-transition-property\", \"-webkit-transition-timing-function\", \"-webkit-user-drag\", \"-webkit-user-modify\", \"-webkit-user-select\", \"white-space\", \"widows\", \"width\", \"will-change\", \"word-break\", \"word-spacing\", \"word-wrap\", \"writing-mode\", \"z-index\", \"zoom\"]\n};\nconst htmlData = {\n    \"tags\": [\n        \"body\", \"head\", \"html\",\n        \"address\", \"blockquote\", \"dd\", \"div\", \"section\", \"article\", \"aside\", \"header\", \"footer\", \"nav\", \"menu\", \"dl\", \"dt\", \"fieldset\", \"form\", \"frame\", \"frameset\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"iframe\", \"noframes\", \"object\", \"ol\", \"p\", \"ul\", \"applet\", \"center\", \"dir\", \"hr\", \"pre\",\n        \"a\", \"abbr\", \"acronym\", \"area\", \"b\", \"base\", \"basefont\", \"bdo\", \"big\", \"br\", \"button\", \"caption\", \"cite\", \"code\", \"col\", \"colgroup\", \"del\", \"dfn\", \"em\", \"font\", \"i\", \"img\", \"input\", \"ins\", \"isindex\", \"kbd\", \"label\", \"legend\", \"li\", \"link\", \"map\", \"meta\", \"noscript\", \"optgroup\", \"option\", \"param\", \"q\", \"s\", \"samp\", \"script\", \"select\", \"small\", \"span\", \"strike\", \"strong\", \"style\", \"sub\", \"sup\", \"table\", \"tbody\", \"td\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"title\", \"tr\", \"tt\", \"u\", \"var\",\n        \"canvas\", \"main\", \"figure\", \"plaintext\", \"figcaption\", \"hgroup\", \"details\", \"summary\"\n    ]\n};\n\n/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nconst snippetKeyCache = new Map();\nlet markupSnippetKeys;\nconst stylesheetCustomSnippetsKeyCache = new Map();\nconst htmlAbbreviationStartRegex = /^[a-z,A-Z,!,(,[,#,\\.\\{]/;\n// take off { for jsx because it interferes with the language\nconst jsxAbbreviationStartRegex = /^[a-z,A-Z,!,(,[,#,\\.]/;\nconst cssAbbreviationRegex = /^-?[a-z,A-Z,!,@,#]/;\nconst htmlAbbreviationRegex = /[a-z,A-Z\\.]/;\nconst commonlyUsedTags = [...htmlData.tags, 'lorem'];\nconst bemFilterSuffix = 'bem';\nconst filterDelimitor = '|';\nconst trimFilterSuffix = 't';\nconst commentFilterSuffix = 'c';\nconst maxFilters = 3;\n/**\n * Returns all applicable emmet expansions for abbreviation at given position in a CompletionList\n * @param model TextModel in which completions are requested\n * @param position Position in the document at which completions are requested\n * @param syntax Emmet supported language\n * @param emmetConfig Emmet Configurations as derived from VS Code\n */\nfunction doComplete(monaco, model, position, syntax, emmetConfig) {\n    var _a;\n    const isStyleSheetRes = isStyleSheet(syntax);\n    // Fetch markupSnippets so that we can provide possible abbreviation completions\n    // For example, when text at position is `a`, completions should return `a:blank`, `a:link`, `acr` etc.\n    if (!isStyleSheetRes) {\n        if (!snippetKeyCache.has(syntax)) {\n            const registry = Object.assign(Object.assign({}, getDefaultSnippets(syntax)), customSnippetsRegistry[syntax]);\n            snippetKeyCache.set(syntax, Object.keys(registry));\n        }\n        markupSnippetKeys = (_a = snippetKeyCache.get(syntax)) !== null && _a !== void 0 ? _a : [];\n    }\n    const extractOptions = {\n        lookAhead: !isStyleSheetRes,\n        type: getSyntaxType(syntax),\n    };\n    const extractedValue = extractAbbreviation(monaco, model, position, extractOptions);\n    if (!extractedValue)\n        return;\n    const { abbreviationRange, abbreviation, currentLineTillPosition, filter } = extractedValue;\n    const currentWord = getCurrentWord(currentLineTillPosition);\n    // Don't attempt to expand open tags\n    if (currentWord === abbreviation && currentLineTillPosition.endsWith(`<${abbreviation}`) && !isStyleSheetRes) {\n        return;\n    }\n    const expandOptions = getExpandOptions(syntax, filter);\n    let expandedText = '';\n    let expandedAbbr;\n    let completionItems = [];\n    // Create completion item after expanding given abbreviation\n    // if abbreviation is valid and expanded value is not noise\n    const createExpandedAbbr = (syntax, abbr) => {\n        if (!isAbbreviationValid(syntax, abbreviation))\n            return;\n        try {\n            expandedText = expandAbbreviation$1(abbr, expandOptions);\n            // manually patch https://github.com/microsoft/vscode/issues/120245 for now\n            if (isStyleSheetRes && '!important'.startsWith(abbr)) {\n                expandedText = '!important';\n            }\n        }\n        catch (e) { }\n        if (!expandedText || isExpandedTextNoise(syntax, abbr, expandedText, expandOptions.options)) {\n            return;\n        }\n        expandedAbbr = {\n            kind: monaco.languages.CompletionItemKind.Property,\n            label: abbreviation + (filter ? '|' + filter.replace(',', '|') : ''),\n            documentation: replaceTabStopsWithCursors(expandedText),\n            detail: 'Emmet abbreviation',\n            insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n            range: abbreviationRange,\n            insertText: escapeNonTabStopDollar(addFinalTabStop(expandedText)),\n        };\n        completionItems = [expandedAbbr];\n    };\n    createExpandedAbbr(syntax, abbreviation);\n    if (isStyleSheetRes) {\n        // When abbr is longer than usual emmet snippets and matches better with existing css property, then no emmet\n        if (abbreviation.length > 4 && cssData.properties.some((x) => x.startsWith(abbreviation))) {\n            return { suggestions: [], incomplete: true };\n        }\n        if (expandedAbbr && expandedText.length) {\n            expandedAbbr.range = abbreviationRange;\n            expandedAbbr.insertText = escapeNonTabStopDollar(addFinalTabStop(expandedText));\n            expandedAbbr.documentation = replaceTabStopsWithCursors(expandedText);\n            expandedAbbr.label = removeTabStops(expandedText);\n            expandedAbbr.filterText = abbreviation;\n            // Custom snippets should show up in completions if abbreviation is a prefix\n            const stylesheetCustomSnippetsKeys = stylesheetCustomSnippetsKeyCache.has(syntax)\n                ? stylesheetCustomSnippetsKeyCache.get(syntax)\n                : stylesheetCustomSnippetsKeyCache.get('css');\n            completionItems = makeSnippetSuggestion(monaco, stylesheetCustomSnippetsKeys !== null && stylesheetCustomSnippetsKeys !== void 0 ? stylesheetCustomSnippetsKeys : [], abbreviation, abbreviation, abbreviationRange, expandOptions, 'Emmet Custom Snippet', false);\n            if (!completionItems.find((x) => x.insertText === (expandedAbbr === null || expandedAbbr === void 0 ? void 0 : expandedAbbr.insertText))) {\n                // Fix for https://github.com/Microsoft/vscode/issues/28933#issuecomment-309236902\n                // When user types in propertyname, emmet uses it to match with snippet names, resulting in width -> widows or font-family -> font: family\n                // Filter out those cases here.\n                const abbrRegex = new RegExp('.*' +\n                    abbreviation\n                        .split('')\n                        .map((x) => (x === '$' || x === '+' ? '\\\\' + x : x))\n                        .join('.*') +\n                    '.*', 'i');\n                if (/\\d/.test(abbreviation) || abbrRegex.test(expandedAbbr.label)) {\n                    completionItems.push(expandedAbbr);\n                }\n            }\n        }\n    }\n    else {\n        let tagToFindMoreSuggestionsFor = abbreviation;\n        const newTagMatches = abbreviation.match(/(>|\\+)([\\w:-]+)$/);\n        if (newTagMatches && newTagMatches.length === 3) {\n            tagToFindMoreSuggestionsFor = newTagMatches[2];\n        }\n        if (syntax !== 'xml') {\n            const commonlyUsedTagSuggestions = makeSnippetSuggestion(monaco, commonlyUsedTags, tagToFindMoreSuggestionsFor, abbreviation, abbreviationRange, expandOptions, 'Emmet Abbreviation');\n            completionItems = completionItems.concat(commonlyUsedTagSuggestions);\n        }\n        if (emmetConfig.showAbbreviationSuggestions === true) {\n            const abbreviationSuggestions = makeSnippetSuggestion(monaco, markupSnippetKeys.filter((x) => !commonlyUsedTags.includes(x)), tagToFindMoreSuggestionsFor, abbreviation, abbreviationRange, expandOptions, 'Emmet Abbreviation');\n            // Workaround for the main expanded abbr not appearing before the snippet suggestions\n            if (expandedAbbr && abbreviationSuggestions.length > 0 && tagToFindMoreSuggestionsFor !== abbreviation) {\n                expandedAbbr.sortText = '0' + expandedAbbr.label;\n                abbreviationSuggestions.forEach((item) => {\n                    // Workaround for snippet suggestions items getting filtered out as the complete abbr does not start with snippetKey\n                    item.filterText = abbreviation;\n                    // Workaround for the main expanded abbr not appearing before the snippet suggestions\n                    item.sortText = '9' + abbreviation;\n                });\n            }\n            completionItems = completionItems.concat(abbreviationSuggestions);\n        }\n        // https://github.com/microsoft/vscode/issues/66680\n        if (syntax === 'html' &&\n            completionItems.length >= 2 &&\n            abbreviation.includes(':') &&\n            (expandedAbbr === null || expandedAbbr === void 0 ? void 0 : expandedAbbr.insertText) === `<${abbreviation}>\\${0}</${abbreviation}>`) {\n            completionItems = completionItems.filter((item) => item.label !== abbreviation);\n        }\n    }\n    if (emmetConfig.showSuggestionsAsSnippets === true) {\n        completionItems.forEach((x) => (x.kind = monaco.languages.CompletionItemKind.Snippet));\n    }\n    return completionItems.length ? { suggestions: completionItems, incomplete: true } : undefined;\n}\n/**\n * Create & return snippets for snippet keys that start with given prefix\n */\nfunction makeSnippetSuggestion(monaco, snippetKeys, prefix, abbreviation, abbreviationRange, expandOptions, snippetDetail, skipFullMatch = true) {\n    if (!prefix || !snippetKeys) {\n        return [];\n    }\n    const snippetCompletions = [];\n    snippetKeys.forEach((snippetKey) => {\n        if (!snippetKey.startsWith(prefix.toLowerCase()) || (skipFullMatch && snippetKey === prefix.toLowerCase())) {\n            return;\n        }\n        const currentAbbr = abbreviation + snippetKey.substr(prefix.length);\n        let expandedAbbr;\n        try {\n            expandedAbbr = expandAbbreviation$1(currentAbbr, expandOptions);\n        }\n        catch (e) { }\n        if (!expandedAbbr) {\n            return;\n        }\n        const item = {\n            kind: monaco.languages.CompletionItemKind.Property,\n            label: prefix + snippetKey.substr(prefix.length),\n            documentation: replaceTabStopsWithCursors(expandedAbbr),\n            detail: snippetDetail,\n            insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n            range: abbreviationRange,\n            insertText: escapeNonTabStopDollar(addFinalTabStop(expandedAbbr)),\n        };\n        snippetCompletions.push(item);\n    });\n    return snippetCompletions;\n}\nfunction getCurrentWord(currentLineTillPosition) {\n    if (currentLineTillPosition) {\n        const matches = currentLineTillPosition.match(/[\\w,:,-,\\.]*$/);\n        if (matches) {\n            return matches[0];\n        }\n    }\n}\nfunction replaceTabStopsWithCursors(expandedWord) {\n    return expandedWord.replace(/([^\\\\])\\$\\{\\d+\\}/g, '$1|').replace(/\\$\\{\\d+:([^\\}]+)\\}/g, '$1');\n}\nfunction removeTabStops(expandedWord) {\n    return expandedWord.replace(/([^\\\\])\\$\\{\\d+\\}/g, '$1').replace(/\\$\\{\\d+:([^\\}]+)\\}/g, '$1');\n}\nfunction escapeNonTabStopDollar(text) {\n    return text ? text.replace(/([^\\\\])(\\$)([^\\{])/g, '$1\\\\$2$3') : text;\n}\nfunction addFinalTabStop(text) {\n    if (!text || !text.trim()) {\n        return text;\n    }\n    let maxTabStop = -1;\n    let maxTabStopRanges = [];\n    let foundLastStop = false;\n    let replaceWithLastStop = false;\n    let i = 0;\n    const n = text.length;\n    try {\n        while (i < n && !foundLastStop) {\n            // Look for ${\n            if (text[i++] != '$' || text[i++] != '{') {\n                continue;\n            }\n            // Find tabstop\n            let numberStart = -1;\n            let numberEnd = -1;\n            while (i < n && /\\d/.test(text[i])) {\n                numberStart = numberStart < 0 ? i : numberStart;\n                numberEnd = i + 1;\n                i++;\n            }\n            // If ${ was not followed by a number and either } or :, then its not a tabstop\n            if (numberStart === -1 || numberEnd === -1 || i >= n || (text[i] != '}' && text[i] != ':')) {\n                continue;\n            }\n            // If ${0} was found, then break\n            const currentTabStop = text.substring(numberStart, numberEnd);\n            foundLastStop = currentTabStop === '0';\n            if (foundLastStop) {\n                break;\n            }\n            let foundPlaceholder = false;\n            if (text[i++] == ':') {\n                // TODO: Nested placeholders may break here\n                while (i < n) {\n                    if (text[i] == '}') {\n                        foundPlaceholder = true;\n                        break;\n                    }\n                    i++;\n                }\n            }\n            // Decide to replace currentTabStop with ${0} only if its the max among all tabstops and is not a placeholder\n            if (Number(currentTabStop) > Number(maxTabStop)) {\n                maxTabStop = Number(currentTabStop);\n                maxTabStopRanges = [{ numberStart, numberEnd }];\n                replaceWithLastStop = !foundPlaceholder;\n            }\n            else if (Number(currentTabStop) === maxTabStop) {\n                maxTabStopRanges.push({ numberStart, numberEnd });\n            }\n        }\n    }\n    catch (e) { }\n    if (replaceWithLastStop && !foundLastStop) {\n        for (let i = 0; i < maxTabStopRanges.length; i++) {\n            const rangeStart = maxTabStopRanges[i].numberStart;\n            const rangeEnd = maxTabStopRanges[i].numberEnd;\n            text = text.substr(0, rangeStart) + '0' + text.substr(rangeEnd);\n        }\n    }\n    return text;\n}\nlet customSnippetsRegistry = {};\nconst emmetSnippetField = (index, placeholder) => `\\${${index}${placeholder ? ':' + placeholder : ''}}`;\n/** Returns whether or not syntax is a supported stylesheet syntax, like CSS */\nfunction isStyleSheet(syntax) {\n    return syntax === 'css';\n}\n/** Returns the syntax type, either markup (e.g. for HTML) or stylesheet (e.g. for CSS) */\nfunction getSyntaxType(syntax) {\n    return isStyleSheet(syntax) ? 'stylesheet' : 'markup';\n}\n/** Returns the default syntax (html or css) to use for the snippets registry */\nfunction getDefaultSyntax(syntax) {\n    return isStyleSheet(syntax) ? 'css' : 'html';\n}\n/** Returns the default snippets that Emmet suggests */\nfunction getDefaultSnippets(syntax) {\n    const syntaxType = getSyntaxType(syntax);\n    const emptyUserConfig = { type: syntaxType, syntax };\n    const resolvedConfig = resolveConfig(emptyUserConfig);\n    // https://github.com/microsoft/vscode/issues/97632\n    // don't return markup (HTML) snippets for XML\n    return syntax === 'xml' ? {} : resolvedConfig.snippets;\n}\nfunction getFilters(text, pos) {\n    let filter;\n    for (let i = 0; i < maxFilters; i++) {\n        if (text.endsWith(`${filterDelimitor}${bemFilterSuffix}`, pos)) {\n            pos -= bemFilterSuffix.length + 1;\n            filter = filter ? bemFilterSuffix + ',' + filter : bemFilterSuffix;\n        }\n        else if (text.endsWith(`${filterDelimitor}${commentFilterSuffix}`, pos)) {\n            pos -= commentFilterSuffix.length + 1;\n            filter = filter ? commentFilterSuffix + ',' + filter : commentFilterSuffix;\n        }\n        else if (text.endsWith(`${filterDelimitor}${trimFilterSuffix}`, pos)) {\n            pos -= trimFilterSuffix.length + 1;\n            filter = filter ? trimFilterSuffix + ',' + filter : trimFilterSuffix;\n        }\n        else {\n            break;\n        }\n    }\n    return {\n        pos: pos,\n        filter: filter,\n    };\n}\n/**\n * Extracts abbreviation from the given position in the given document\n * @param model The TextModel from which abbreviation needs to be extracted\n * @param position The Position in the given document from where abbreviation needs to be extracted\n * @param options The options to pass to the @emmetio/extract-abbreviation module\n */\nfunction extractAbbreviation(monaco, model, position, options) {\n    const currentLine = model.getLineContent(position.lineNumber);\n    const currentLineTillPosition = currentLine.substr(0, position.column - 1);\n    const { pos, filter } = getFilters(currentLineTillPosition, position.column - 1);\n    const lengthOccupiedByFilter = filter ? filter.length + 1 : 0;\n    const result = extractAbbreviation$1(currentLine, pos, options);\n    if (!result)\n        return;\n    const rangeToReplace = new monaco.Range(position.lineNumber, result.location + 1, position.lineNumber, result.location + result.abbreviation.length + lengthOccupiedByFilter + 1);\n    return {\n        abbreviationRange: rangeToReplace,\n        abbreviation: result.abbreviation,\n        currentLineTillPosition,\n        filter,\n    };\n}\n/**\n * Returns a boolean denoting validity of given abbreviation in the context of given syntax\n * Not needed once https://github.com/emmetio/atom-plugin/issues/22 is fixed\n * @param syntax string\n * @param abbreviation string\n */\nfunction isAbbreviationValid(syntax, abbreviation) {\n    if (!abbreviation) {\n        return false;\n    }\n    if (isStyleSheet(syntax)) {\n        if (abbreviation.includes('#')) {\n            if (abbreviation.startsWith('#')) {\n                const hexColorRegex = /^#[\\d,a-f,A-F]{1,6}$/;\n                return hexColorRegex.test(abbreviation);\n            }\n            else if (commonlyUsedTags.includes(abbreviation.substring(0, abbreviation.indexOf('#')))) {\n                return false;\n            }\n        }\n        return cssAbbreviationRegex.test(abbreviation);\n    }\n    if (abbreviation.startsWith('!')) {\n        return !/[^!]/.test(abbreviation);\n    }\n    // Its common for users to type (sometextinsidebrackets), this should not be treated as an abbreviation\n    // Grouping in abbreviation is valid only if it's inside a text node or preceeded/succeeded with one of the symbols for nesting, sibling, repeater or climb up\n    // Also, cases such as `span[onclick=\"alert();\"]` are valid\n    if ((/\\(/.test(abbreviation) || /\\)/.test(abbreviation)) &&\n        !/\\{[^\\}\\{]*[\\(\\)]+[^\\}\\{]*\\}(?:[>\\+\\*\\^]|$)/.test(abbreviation) &&\n        !/\\(.*\\)[>\\+\\*\\^]/.test(abbreviation) &&\n        !/\\[[^\\[\\]\\(\\)]+=\".*\"\\]/.test(abbreviation) &&\n        !/[>\\+\\*\\^]\\(.*\\)/.test(abbreviation)) {\n        return false;\n    }\n    if (syntax === 'jsx') {\n        return jsxAbbreviationStartRegex.test(abbreviation) && htmlAbbreviationRegex.test(abbreviation);\n    }\n    return htmlAbbreviationStartRegex.test(abbreviation) && htmlAbbreviationRegex.test(abbreviation);\n}\nfunction isExpandedTextNoise(syntax, abbreviation, expandedText, options) {\n    var _a, _b;\n    // Unresolved css abbreviations get expanded to a blank property value\n    // Eg: abc -> abc: ; or abc:d -> abc: d; which is noise if it gets suggested for every word typed\n    if (isStyleSheet(syntax) && options) {\n        const between = (_a = options['stylesheet.between']) !== null && _a !== void 0 ? _a : ': ';\n        const after = (_b = options['stylesheet.after']) !== null && _b !== void 0 ? _b : ';';\n        // Remove overlapping between `abbreviation` and `between`, if any\n        let endPrefixIndex = abbreviation.indexOf(between[0], Math.max(abbreviation.length - between.length, 0));\n        endPrefixIndex = endPrefixIndex >= 0 ? endPrefixIndex : abbreviation.length;\n        const abbr = abbreviation.substring(0, endPrefixIndex);\n        return (expandedText === `${abbr}${between}\\${0}${after}` ||\n            expandedText.replace(/\\s/g, '') === abbreviation.replace(/\\s/g, '') + after);\n    }\n    // we don't want common html tags suggested for xml\n    if (syntax === 'xml' && commonlyUsedTags.some((tag) => tag.startsWith(abbreviation.toLowerCase()))) {\n        return true;\n    }\n    if (commonlyUsedTags.includes(abbreviation.toLowerCase()) || markupSnippetKeys.includes(abbreviation)) {\n        return false;\n    }\n    // Custom tags can have - or :\n    if (/[-,:]/.test(abbreviation) && !/--|::/.test(abbreviation) && !abbreviation.endsWith(':')) {\n        return false;\n    }\n    // Its common for users to type some text and end it with period, this should not be treated as an abbreviation\n    // Else it becomes noise.\n    // When user just types '.', return the expansion\n    // Otherwise emmet loses change to participate later\n    // For example in `.foo`. See https://github.com/Microsoft/vscode/issues/66013\n    if (abbreviation === '.') {\n        return false;\n    }\n    const dotMatches = abbreviation.match(/^([a-z,A-Z,\\d]*)\\.$/);\n    if (dotMatches) {\n        // Valid html tags such as `div.`\n        if (dotMatches[1] && htmlData.tags.includes(dotMatches[1])) {\n            return false;\n        }\n        return true;\n    }\n    // Fix for https://github.com/microsoft/vscode/issues/89746\n    // PascalCase tags are common in jsx code, which should not be treated as noise.\n    // Eg: MyAwesomComponent -> <MyAwesomComponent></MyAwesomComponent>\n    if (syntax === 'jsx' && /^([A-Z][A-Za-z0-9]*)+$/.test(abbreviation)) {\n        return false;\n    }\n    // Unresolved html abbreviations get expanded as if it were a tag\n    // Eg: abc -> <abc></abc> which is noise if it gets suggested for every word typed\n    return expandedText.toLowerCase() === `<${abbreviation.toLowerCase()}>\\${1}</${abbreviation.toLowerCase()}>`;\n}\n/**\n * Returns options to be used by emmet\n */\nfunction getExpandOptions(syntax, filter) {\n    var _a;\n    const filters = filter ? filter.split(',').map((x) => x.trim()) : [];\n    const bemEnabled = filters.includes('bem');\n    const commentEnabled = filters.includes('c');\n    const combinedOptions = {\n        'output.formatSkip': ['html'],\n        'output.formatForce': ['body'],\n        'output.field': emmetSnippetField,\n        'output.inlineBreak': 0,\n        'output.compactBoolean': false,\n        'output.reverseAttributes': false,\n        'markup.href': true,\n        'comment.enabled': commentEnabled,\n        'comment.trigger': ['id', 'class'],\n        'comment.before': '',\n        'comment.after': '\\n<!-- /[#ID][.CLASS] -->',\n        'bem.enabled': bemEnabled,\n        'bem.element': '__',\n        'bem.modifier': '_',\n        'jsx.enabled': syntax === 'jsx',\n        'stylesheet.shortHex': true,\n        'stylesheet.between': syntax === 'stylus' ? ' ' : ': ',\n        'stylesheet.after': syntax === 'sass' || syntax === 'stylus' ? '' : ';',\n        'stylesheet.intUnit': 'px',\n        'stylesheet.floatUnit': 'em',\n        'stylesheet.unitAliases': {\n            e: 'em',\n            p: '%',\n            x: 'ex',\n            r: 'rem',\n        },\n        'stylesheet.fuzzySearchMinScore': 0.3,\n        'output.format': true,\n        'output.selfClosingStyle': 'html',\n    };\n    const type = getSyntaxType(syntax);\n    const baseSyntax = getDefaultSyntax(syntax);\n    const snippets = type === 'stylesheet'\n        ? (_a = customSnippetsRegistry[syntax]) !== null && _a !== void 0 ? _a : customSnippetsRegistry[baseSyntax]\n        : customSnippetsRegistry[syntax];\n    return {\n        type,\n        options: combinedOptions,\n        variables: {},\n        snippets,\n        syntax,\n        // context: null,\n        text: undefined,\n        maxRepeat: 1000,\n        // cache: null\n    };\n}\n/**\n * Assigns snippets from one snippet file under emmet.extensionsPath to\n * customSnippetsRegistry, snippetKeyCache, and stylesheetCustomSnippetsKeyCache\n */\nfunction registerCustomSnippets(syntax, customSnippets) {\n    const baseSyntax = getDefaultSyntax(syntax);\n    if (baseSyntax !== syntax && customSnippetsRegistry[baseSyntax]) {\n        customSnippets = Object.assign({}, customSnippetsRegistry[baseSyntax], customSnippets);\n    }\n    if (isStyleSheet(syntax)) {\n        const prevSnippetKeys = stylesheetCustomSnippetsKeyCache.get(syntax);\n        const mergedSnippetKeys = Object.assign([], prevSnippetKeys, Object.keys(customSnippets));\n        stylesheetCustomSnippetsKeyCache.set(syntax, mergedSnippetKeys);\n    }\n    const prevSnippetsRegistry = customSnippetsRegistry[syntax];\n    const mergedSnippets = Object.assign({}, prevSnippetsRegistry, customSnippets);\n    customSnippetsRegistry[syntax] = mergedSnippets;\n}\n/**\n * Expands given abbreviation using given options\n * @param abbreviation string or parsed abbreviation\n * @param config options used by the @emmetio/expand-abbreviation module to expand given abbreviation\n */\nfunction expandAbbreviation(abbreviation, config) {\n    let expandedText;\n    const resolvedConfig = resolveConfig(config);\n    if (config.type === 'stylesheet') {\n        if (typeof abbreviation === 'string') {\n            expandedText = expandAbbreviation$1(abbreviation, resolvedConfig);\n        }\n        else {\n            expandedText = css(abbreviation, resolvedConfig);\n        }\n    }\n    else {\n        if (typeof abbreviation === 'string') {\n            expandedText = expandAbbreviation$1(abbreviation, resolvedConfig);\n        }\n        else {\n            expandedText = stringify(abbreviation, resolvedConfig);\n        }\n    }\n    return escapeNonTabStopDollar(addFinalTabStop(expandedText));\n}\n\nfunction isValidEmmetToken(tokens, index, syntax, language) {\n    const currentToken = tokens[index];\n    const currentTokenType = currentToken.type;\n    if (syntax === 'html') {\n        // prevent emmet triggered within attributes\n        return ((currentTokenType === '' && (index === 0 || tokens[index - 1].type === 'delimiter.html')) ||\n            // #7 compatible with https://github.com/NeekSandhu/monaco-textmate\n            tokens[0].type === 'text.html.basic');\n    }\n    if (syntax === 'css') {\n        if (currentTokenType === '')\n            return true;\n        // less / scss allow nesting\n        return currentTokenType === 'tag.' + language;\n    }\n    if (syntax === 'jsx') {\n        if (currentToken.language === 'mdx' && currentTokenType === '') {\n            return true;\n        }\n        // type must be `identifier` and not at start\n        return (!!index &&\n            ['identifier.js', 'type.identifier.js', 'identifier.ts', 'type.identifier.ts'].includes(currentTokenType));\n    }\n    return false;\n}\nconst tokenEnvCache = new WeakMap();\nfunction getTokenizationEnv(model) {\n    if (tokenEnvCache.has(model))\n        return tokenEnvCache.get(model);\n    let _tokenization = \n    // monaco-editor < 0.34.0\n    model._tokenization ||\n        // monaco-editor >= 0.35.0\n        model.tokenization._tokenization;\n    // monaco-editor <= 0.34.0\n    let _tokenizationStateStore = _tokenization === null || _tokenization === void 0 ? void 0 : _tokenization._tokenizationStateStore;\n    // monaco-editor >= 0.35.0\n    if (!_tokenization || !_tokenizationStateStore) {\n        const _t = model.tokenization;\n        const _tokens = \n        // monaco-editor <= 0.51.0\n        _t.grammarTokens ||\n            // monaco-editor >= 0.52.0\n            _t._tokens;\n        if (_tokens) {\n            _tokenization = _tokens._defaultBackgroundTokenizer;\n            _tokenizationStateStore = _tokenization._tokenizerWithStateStore;\n        }\n        else {\n            // monaco-editor >= 0.35.0 && < 0.37.0, source code was minified\n            Object.values(_t).some((val) => (_tokenization = val.tokenizeViewport && val));\n            Object.values(_tokenization).some((val) => (_tokenizationStateStore = val.tokenizationSupport && val));\n        }\n    }\n    const _tokenizationSupport = \n    // monaco-editor >= 0.32.0\n    _tokenizationStateStore.tokenizationSupport ||\n        // monaco-editor <= 0.31.0\n        _tokenization._tokenizationSupport;\n    const env = {\n        _stateStore: _tokenizationStateStore,\n        _support: _tokenizationSupport,\n    };\n    tokenEnvCache.set(model, env);\n    return env;\n}\n// vscode did a complex node analysis, we just use monaco's built-in tokenizer\n// to achieve almost the same effect\nfunction isValidLocationForEmmetAbbreviation(model, position, syntax, language) {\n    var _a;\n    const { column, lineNumber } = position;\n    // get current line's tokens\n    const { _stateStore, _support } = getTokenizationEnv(model);\n    // monaco-editor < 0.37.0 uses `getBeginState` while monaco-editor >= 0.37.0 uses `getStartState`\n    // note: lineNumber difference between two api\n    const state = ((_a = _stateStore.getBeginState) === null || _a === void 0 ? void 0 : _a.call(_stateStore, lineNumber - 1).clone()) || _stateStore.getStartState(lineNumber).clone();\n    const tokenizationResult = _support.tokenize(model.getLineContent(lineNumber), true, state, 0);\n    const tokens = tokenizationResult.tokens;\n    let valid = false;\n    // get token type at current column\n    for (let i = tokens.length - 1; i >= 0; i--) {\n        if (column - 1 > tokens[i].offset) {\n            valid = isValidEmmetToken(tokens, i, syntax, language);\n            break;\n        }\n    }\n    return valid;\n}\n\n// https://github.com/microsoft/vscode/blob/main/extensions/emmet/src/util.ts#L86\nconst LANGUAGE_MODES = {\n    html: ['!', '.', '}', ':', '*', '$', ']', '/', '>', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    jade: ['!', '.', '}', ':', '*', '$', ']', '/', '>', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    slim: ['!', '.', '}', ':', '*', '$', ']', '/', '>', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    haml: ['!', '.', '}', ':', '*', '$', ']', '/', '>', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    xml: ['.', '}', '*', '$', ']', '/', '>', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    xsl: ['!', '.', '}', '*', '$', '/', ']', '>', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    css: [':', '!', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    scss: [':', '!', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    sass: [':', '!', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    less: [':', '!', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    stylus: [':', '!', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    javascript: ['!', '.', '}', '*', '$', ']', '/', '>', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    typescript: ['!', '.', '}', '*', '$', ']', '/', '>', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n};\n// https://github.com/microsoft/vscode/blob/main/extensions/emmet/src/util.ts#L124\nconst MAPPED_MODES = {\n    handlebars: 'html',\n    php: 'html',\n    twig: 'html',\n};\nconst DEFAULT_CONFIG = {\n    showExpandedAbbreviation: 'always',\n    showAbbreviationSuggestions: true,\n    showSuggestionsAsSnippets: false,\n};\n/**\n * add completion provider\n * @param monaco monaco self\n * @param language added language\n * @param isMarkup is markup language\n * @param isLegalToken check whether given token is legal or not\n * @param getLegalEmmetSets get legal emmet substring from a string.\n */\nfunction registerProvider(monaco, languages, syntax) {\n    if (!monaco) {\n        console.error(\"emmet-monaco-es: 'monaco' should be either declared on window or passed as first parameter\");\n        return;\n    }\n    const providers = languages.map((language) => monaco.languages.registerCompletionItemProvider(language, {\n        triggerCharacters: LANGUAGE_MODES[MAPPED_MODES[language] || language],\n        provideCompletionItems: (model, position) => isValidLocationForEmmetAbbreviation(model, position, syntax, language)\n            ? doComplete(monaco, model, position, syntax, DEFAULT_CONFIG)\n            : undefined,\n    }));\n    return () => {\n        providers.forEach((provider) => provider.dispose());\n    };\n}\nfunction emmetHTML(monaco = window.monaco, languages = ['html']) {\n    return registerProvider(monaco, languages, 'html');\n}\nfunction emmetCSS(monaco = window.monaco, languages = ['css']) {\n    return registerProvider(monaco, languages, 'css');\n}\nfunction emmetJSX(monaco = window.monaco, languages = ['javascript']) {\n    return registerProvider(monaco, languages, 'jsx');\n}\n\nexport { emmetCSS, emmetHTML, emmetJSX, expandAbbreviation, registerCustomSnippets };\n"]}