{"mappings":"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","names":["ccount","value","character","source","count","index","asciiAlpha","regexCheck","asciiAlphanumeric","asciiAtext","asciiControl","code","asciiDigit","asciiHexDigit","asciiPunctuation","markdownLineEnding","markdownLineEndingOrSpace","markdownSpace","unicodePunctuation","unicodeWhitespace","regex","check","escapeStringRegexp","string","convert","test","ok","castFactory","anyFactory","propertiesFactory","typeFactory","tests","checks","index","any","parameters","check","checkAsRecord","all","node","nodeAsRecord","key","type","testFunction","value","parent","looksLikeANode","empty","CONTINUE","EXIT","SKIP","visitParents","tree","test","visitor","reverse","check","is","convert","step","factory","node","index","parents","value","name","visit","result","subresult","offset","grandparents","toResult","nodeAsParent","child","findAndReplace","tree","list","options","ignored","convert","pairs","toPairs","pairIndex","visitParents","visitor","node","parents","index","grandparent","parent","siblings","handler","find","replace","start","change","nodes","match","position","matchObject","value","tupleOrList","result","tuple","toExpression","toFunction","escapeStringRegexp","inConstruct","notInConstruct","gfmAutolinkLiteralFromMarkdown","transformGfmAutolinkLiterals","enterLiteralAutolink","enterLiteralAutolinkValue","exitLiteralAutolink","exitLiteralAutolinkEmail","exitLiteralAutolinkHttp","exitLiteralAutolinkWww","gfmAutolinkLiteralToMarkdown","token","node","tree","findAndReplace","findUrl","findEmail","_","protocol","domain","path","match","prefix","previous","isCorrectDomain","parts","splitUrl","result","atext","label","url","trailExec","trail","closingParenIndex","openingParens","ccount","closingParens","email","code","unicodeWhitespace","unicodePunctuation","normalizeIdentifier","value","footnoteReference","footnoteReferencePeek","enterFootnoteCallString","enterFootnoteCall","token","enterFootnoteDefinitionLabelString","enterFootnoteDefinition","exitFootnoteCallString","label","node","normalizeIdentifier","exitFootnoteCall","exitFootnoteDefinitionLabelString","exitFootnoteDefinition","_","state","info","tracker","value","exit","subexit","gfmFootnoteFromMarkdown","gfmFootnoteToMarkdown","options","firstLineBlank","footnoteDefinition","mapAll","mapExceptFirst","line","index","blank","constructsWithoutStrikethrough","handleDelete","peekDelete","gfmStrikethroughFromMarkdown","enterStrikethrough","exitStrikethrough","gfmStrikethroughToMarkdown","token","node","_","state","info","tracker","exit","value","defaultStringLength","value","markdownTable","table","options","settings","align","stringLength","alignments","cellMatrix","sizeMatrix","longestCellByColumn","mostCellsPerRow","rowIndex","row","sizes","columnIndex","cell","serialize","size","toAlignment","code","before","after","lines","line","blockquote","node","_","state","info","exit","tracker","value","map","line","blank","patternInScope","stack","pattern","listInScope","list","none","index","hardBreak","_","_1","state","info","index","patternInScope","longestStreak","value","substring","source","index","expected","count","max","formatCodeAsIndented","node","state","checkFence","state","marker","code","node","_","state","info","marker","checkFence","raw","suffix","formatCodeAsIndented","exit","value","map","tracker","sequence","longestStreak","subexit","line","blank","checkQuote","state","marker","definition","node","_","state","info","quote","checkQuote","suffix","exit","subexit","tracker","value","checkEmphasis","state","marker","encodeCharacterReference","code","classifyCharacter","code","markdownLineEndingOrSpace","unicodeWhitespace","unicodePunctuation","encodeInfo","outside","inside","marker","outsideKind","classifyCharacter","insideKind","emphasis","emphasisPeek","node","_","state","info","marker","checkEmphasis","exit","tracker","before","between","betweenHead","open","encodeInfo","encodeCharacterReference","betweenTail","close","after","_1","visit","tree","testOrVisitor","visitorOrReverse","maybeReverse","reverse","test","visitor","visitParents","overload","node","parents","parent","index","emptyOptions","toString","value","options","settings","includeImageAlt","includeHtml","one","node","all","values","result","index","formatHeadingAsSetext","node","state","literalWithBreak","visit","EXIT","toString","heading","node","_","state","info","rank","tracker","formatHeadingAsSetext","exit","subexit","value","sequence","encodeCharacterReference","html","htmlPeek","node","image","imagePeek","node","_","state","info","quote","checkQuote","suffix","exit","subexit","tracker","value","imageReference","imageReferencePeek","node","_","state","info","type","exit","subexit","tracker","value","alt","stack","reference","inlineCode","inlineCodePeek","node","_","state","value","sequence","index","pattern","expression","match","position","formatLinkAsAutolink","node","state","raw","toString","link","linkPeek","node","_","state","info","quote","checkQuote","suffix","tracker","exit","subexit","formatLinkAsAutolink","stack","value","linkReference","linkReferencePeek","node","_","state","info","type","exit","subexit","tracker","value","text","stack","reference","checkBullet","state","marker","checkBulletOther","state","bullet","checkBullet","bulletOther","checkBulletOrdered","state","marker","checkRule","state","marker","list","node","parent","state","info","exit","bulletCurrent","bullet","checkBulletOrdered","checkBullet","bulletOther","checkBulletOther","useDifferentMarker","firstListItem","checkRule","index","item","value","checkListItemIndent","state","style","listItem","node","parent","state","info","listItemIndent","checkListItemIndent","bullet","checkBullet","size","tracker","exit","value","map","line","index","blank","paragraph","node","_","state","info","exit","subexit","value","phrasing","convert","root","node","_","state","info","d","phrasing","checkStrong","state","marker","strong","strongPeek","node","_","state","info","marker","checkStrong","exit","tracker","before","between","betweenHead","open","encodeInfo","encodeCharacterReference","betweenTail","close","after","_1","text","node","_","state","info","checkRuleRepetition","state","repetition","thematicBreak","_","_1","state","value","checkRule","checkRuleRepetition","handle","blockquote","hardBreak","code","definition","emphasis","heading","html","image","imageReference","inlineCode","link","linkReference","list","listItem","paragraph","root","strong","text","thematicBreak","gfmTableFromMarkdown","enterTable","enterCell","enterRow","exitCodeText","exitTable","exit","token","align","d","value","replace","node","$0","$1","gfmTableToMarkdown","options","settings","padding","alignDelimiters","stringLength","around","inlineCodeWithTable","handleTable","handleTableCell","handleTableRow","_","state","info","serializeData","handleTableAsData","row","handleTableRowAsData","subexit","matrix","markdownTable","children","index","result","parent","handle","gfmTaskListItemFromMarkdown","exitCheck","exitParagraphWithTaskListItem","gfmTaskListItemToMarkdown","listItemWithTaskListItem","token","node","parent","head","siblings","index","firstParaghraph","sibling","state","info","checkable","checkbox","tracker","value","handle","check","$0","gfmFromMarkdown","gfmAutolinkLiteralFromMarkdown","gfmFootnoteFromMarkdown","gfmStrikethroughFromMarkdown","gfmTableFromMarkdown","gfmTaskListItemFromMarkdown","gfmToMarkdown","options","gfmAutolinkLiteralToMarkdown","gfmFootnoteToMarkdown","gfmStrikethroughToMarkdown","gfmTableToMarkdown","gfmTaskListItemToMarkdown","splice","list","start","remove","items","end","chunkStart","parameters","hasOwnProperty","combineExtensions","extensions","all","index","syntaxExtension","extension","hook","left","right","code","value","constructs","existing","list","before","splice","wwwPrefix","tokenizeWwwPrefix","domain","tokenizeDomain","path","tokenizePath","trail","tokenizeTrail","emailDomainDotTrail","tokenizeEmailDomainDotTrail","wwwAutolink","tokenizeWwwAutolink","previousWww","protocolAutolink","tokenizeProtocolAutolink","previousProtocol","emailAutolink","tokenizeEmailAutolink","previousEmail","text","gfmAutolinkLiteral","code","effects","ok","nok","self","dot","data","start","gfmAtext","previousUnbalanced","atext","emailDomain","emailDomainAfter","emailDomainDot","asciiAlphanumeric","asciiAlpha","wwwStart","wwwAfter","buffer","seen","protocolStart","protocolPrefixInside","protocol","protocolSlashesInside","afterProtocol","asciiControl","markdownLineEndingOrSpace","unicodeWhitespace","unicodePunctuation","protocolAfter","size","wwwPrefixInside","wwwPrefixAfter","underscoreInLastSegment","underscoreInLastLastSegment","domainInside","domainAfter","domainAtPunctuation","sizeOpen","sizeClose","pathInside","pathAtPunctuation","trailCharacterReferenceStart","trailBracketAfter","trailCharacterReferenceInside","after","events","index","result","token","resolveAll","constructs","events","context","called","index","resolve","factorySpace","effects","ok","type","max","limit","size","start","code","markdownSpace","prefix","blankLine","tokenizeBlankLine","effects","ok","nok","start","code","markdownSpace","factorySpace","after","markdownLineEnding","indent","tokenizeIndent","gfmFootnote","tokenizeDefinitionStart","tokenizeDefinitionContinuation","gfmFootnoteDefinitionEnd","tokenizeGfmFootnoteCall","tokenizePotentialGfmFootnoteCall","resolveToPotentialGfmFootnoteCall","effects","ok","nok","self","index","defined","labelStart","token","start","code","id","normalizeIdentifier","events","context","call","marker","string","chunk","replacement","size","data","callStart","callData","markdownLineEndingOrSpace","callEscape","identifier","labelAtMarker","labelInside","labelAfter","labelEscape","factorySpace","whitespaceAfter","blankLine","afterPrefix","tail","gfmStrikethrough","options","single","tokenizer","tokenizeStrikethrough","resolveAllStrikethrough","events","context","index","open","strikethrough","text","nextEvents","insideSpan","splice","resolveAll","effects","ok","nok","previous","size","start","code","more","before","classifyCharacter","token","after","EditMap","index","remove","add","addImplementation","events","b","vecs","slice","element","editMap","at","gfmTableAlign","events","index","inDelimiterRow","align","event","alignIndex","gfmTable","tokenizeTable","resolveTable","effects","ok","nok","self","size","sizeB","seen","start","code","index","type","tail","next","bodyRowStart","headRowBefore","headRowStart","headRowBreak","markdownLineEnding","headDelimiterStart","markdownSpace","factorySpace","headRowData","markdownLineEndingOrSpace","headRowEscape","headDelimiterBefore","headDelimiterValueBefore","headDelimiterCellBefore","headDelimiterNok","headDelimiterLeftAlignmentAfter","headDelimiterCellAfter","headDelimiterFiller","headDelimiterRightAlignmentAfter","bodyRowBreak","bodyRowData","bodyRowEscape","events","context","inFirstCellAwaitingPipe","rowKind","lastCell","cell","afterHeadAwaitingFirstBodyRow","lastTableEnd","currentTable","currentBody","currentCell","map","EditMap","event","token","flushTableEnd","flushCell","gfmTableAlign","range","rowEnd","previousCell","groupName","valueName","getPoint","now","relatedStart","relatedEnd","valueToken","end","a","b","table","tableBody","exits","related","side","tasklistCheck","tokenizeTasklistCheck","gfmTaskListItem","effects","ok","nok","self","open","code","inside","markdownLineEndingOrSpace","close","after","markdownLineEnding","markdownSpace","spaceThenNonSpace","factorySpace","gfm","options","combineExtensions","gfmAutolinkLiteral","gfmFootnote","gfmStrikethrough","gfmTable","gfmTaskListItem","emptyOptions","remarkGfm","options","self","settings","data","micromarkExtensions","fromMarkdownExtensions","toMarkdownExtensions","gfm","gfmFromMarkdown","gfmToMarkdown"],"sources":["../esm/npm/remark-gfm@4.0.1/node_modules/ccount/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-util-character/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/escape-string-regexp/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/unist-util-is/lib/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/unist-util-visit-parents/lib/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-find-and-replace/lib/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-gfm-autolink-literal/lib/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-util-normalize-identifier/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-gfm-footnote/lib/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-gfm-strikethrough/lib/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/markdown-table/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/blockquote.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/pattern-in-scope.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/break.js","../esm/npm/remark-gfm@4.0.1/node_modules/longest-streak/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/format-code-as-indented.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/check-fence.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/code.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/check-quote.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/definition.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/check-emphasis.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/encode-character-reference.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-util-classify-character/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/encode-info.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/emphasis.js","../esm/npm/remark-gfm@4.0.1/node_modules/unist-util-visit/lib/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-string/lib/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/format-heading-as-setext.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/heading.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/html.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/image.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/image-reference.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/inline-code.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/format-link-as-autolink.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/link.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/link-reference.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/check-bullet.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/check-bullet-other.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/check-bullet-ordered.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/check-rule.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/list.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/check-list-item-indent.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/list-item.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/paragraph.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-phrasing/lib/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/root.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/check-strong.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/strong.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/text.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/util/check-rule-repetition.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/thematic-break.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-to-markdown/lib/handle/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-gfm-table/lib/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-gfm-task-list-item/lib/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/mdast-util-gfm/lib/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-util-chunked/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-util-combine-extensions/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-extension-gfm-autolink-literal/lib/syntax.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-util-resolve-all/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-factory-space/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-core-commonmark/lib/blank-line.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-extension-gfm-footnote/lib/syntax.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-extension-gfm-strikethrough/lib/syntax.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-extension-gfm-table/lib/edit-map.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-extension-gfm-table/lib/infer.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-extension-gfm-table/lib/syntax.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-extension-gfm-task-list-item/lib/syntax.js","../esm/npm/remark-gfm@4.0.1/node_modules/micromark-extension-gfm/index.js","../esm/npm/remark-gfm@4.0.1/node_modules/remark-gfm/lib/index.js"],"sourcesContent":["/**\n * Count how often a character (or substring) is used in a string.\n *\n * @param {string} value\n *   Value to search in.\n * @param {string} character\n *   Character (or substring) to look for.\n * @return {number}\n *   Number of times `character` occurred in `value`.\n */\nexport function ccount(value, character) {\n  const source = String(value)\n\n  if (typeof character !== 'string') {\n    throw new TypeError('Expected character')\n  }\n\n  let count = 0\n  let index = source.indexOf(character)\n\n  while (index !== -1) {\n    count++\n    index = source.indexOf(character, index + character.length)\n  }\n\n  return count\n}\n","/**\n * @import {Code} from 'micromark-util-types'\n */\n\n/**\n * Check whether the character code represents an ASCII alpha (`a` through `z`,\n * case insensitive).\n *\n * An **ASCII alpha** is an ASCII upper alpha or ASCII lower alpha.\n *\n * An **ASCII upper alpha** is a character in the inclusive range U+0041 (`A`)\n * to U+005A (`Z`).\n *\n * An **ASCII lower alpha** is a character in the inclusive range U+0061 (`a`)\n * to U+007A (`z`).\n *\n * @param code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport const asciiAlpha = regexCheck(/[A-Za-z]/);\n\n/**\n * Check whether the character code represents an ASCII alphanumeric (`a`\n * through `z`, case insensitive, or `0` through `9`).\n *\n * An **ASCII alphanumeric** is an ASCII digit (see `asciiDigit`) or ASCII alpha\n * (see `asciiAlpha`).\n *\n * @param code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport const asciiAlphanumeric = regexCheck(/[\\dA-Za-z]/);\n\n/**\n * Check whether the character code represents an ASCII atext.\n *\n * atext is an ASCII alphanumeric (see `asciiAlphanumeric`), or a character in\n * the inclusive ranges U+0023 NUMBER SIGN (`#`) to U+0027 APOSTROPHE (`'`),\n * U+002A ASTERISK (`*`), U+002B PLUS SIGN (`+`), U+002D DASH (`-`), U+002F\n * SLASH (`/`), U+003D EQUALS TO (`=`), U+003F QUESTION MARK (`?`), U+005E\n * CARET (`^`) to U+0060 GRAVE ACCENT (`` ` ``), or U+007B LEFT CURLY BRACE\n * (`{`) to U+007E TILDE (`~`).\n *\n * See:\n * **\\[RFC5322]**:\n * [Internet Message Format](https://tools.ietf.org/html/rfc5322).\n * P. Resnick.\n * IETF.\n *\n * @param code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport const asciiAtext = regexCheck(/[#-'*+\\--9=?A-Z^-~]/);\n\n/**\n * Check whether a character code is an ASCII control character.\n *\n * An **ASCII control** is a character in the inclusive range U+0000 NULL (NUL)\n * to U+001F (US), or U+007F (DEL).\n *\n * @param {Code} code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport function asciiControl(code) {\n  return (\n    // Special whitespace codes (which have negative values), C0 and Control\n    // character DEL\n    code !== null \u0026\u0026 (code \u003c 32 || code === 127)\n  );\n}\n\n/**\n * Check whether the character code represents an ASCII digit (`0` through `9`).\n *\n * An **ASCII digit** is a character in the inclusive range U+0030 (`0`) to\n * U+0039 (`9`).\n *\n * @param code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport const asciiDigit = regexCheck(/\\d/);\n\n/**\n * Check whether the character code represents an ASCII hex digit (`a` through\n * `f`, case insensitive, or `0` through `9`).\n *\n * An **ASCII hex digit** is an ASCII digit (see `asciiDigit`), ASCII upper hex\n * digit, or an ASCII lower hex digit.\n *\n * An **ASCII upper hex digit** is a character in the inclusive range U+0041\n * (`A`) to U+0046 (`F`).\n *\n * An **ASCII lower hex digit** is a character in the inclusive range U+0061\n * (`a`) to U+0066 (`f`).\n *\n * @param code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport const asciiHexDigit = regexCheck(/[\\dA-Fa-f]/);\n\n/**\n * Check whether the character code represents ASCII punctuation.\n *\n * An **ASCII punctuation** is a character in the inclusive ranges U+0021\n * EXCLAMATION MARK (`!`) to U+002F SLASH (`/`), U+003A COLON (`:`) to U+0040 AT\n * SIGN (`@`), U+005B LEFT SQUARE BRACKET (`[`) to U+0060 GRAVE ACCENT\n * (`` ` ``), or U+007B LEFT CURLY BRACE (`{`) to U+007E TILDE (`~`).\n *\n * @param code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport const asciiPunctuation = regexCheck(/[!-/:-@[-`{-~]/);\n\n/**\n * Check whether a character code is a markdown line ending.\n *\n * A **markdown line ending** is the virtual characters M-0003 CARRIAGE RETURN\n * LINE FEED (CRLF), M-0004 LINE FEED (LF) and M-0005 CARRIAGE RETURN (CR).\n *\n * In micromark, the actual character U+000A LINE FEED (LF) and U+000D CARRIAGE\n * RETURN (CR) are replaced by these virtual characters depending on whether\n * they occurred together.\n *\n * @param {Code} code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport function markdownLineEnding(code) {\n  return code !== null \u0026\u0026 code \u003c -2;\n}\n\n/**\n * Check whether a character code is a markdown line ending (see\n * `markdownLineEnding`) or markdown space (see `markdownSpace`).\n *\n * @param {Code} code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport function markdownLineEndingOrSpace(code) {\n  return code !== null \u0026\u0026 (code \u003c 0 || code === 32);\n}\n\n/**\n * Check whether a character code is a markdown space.\n *\n * A **markdown space** is the concrete character U+0020 SPACE (SP) and the\n * virtual characters M-0001 VIRTUAL SPACE (VS) and M-0002 HORIZONTAL TAB (HT).\n *\n * In micromark, the actual character U+0009 CHARACTER TABULATION (HT) is\n * replaced by one M-0002 HORIZONTAL TAB (HT) and between 0 and 3 M-0001 VIRTUAL\n * SPACE (VS) characters, depending on the column at which the tab occurred.\n *\n * @param {Code} code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport function markdownSpace(code) {\n  return code === -2 || code === -1 || code === 32;\n}\n\n// Size note: removing ASCII from the regex and using `asciiPunctuation` here\n// In fact adds to the bundle size.\n/**\n * Check whether the character code represents Unicode punctuation.\n *\n * A **Unicode punctuation** is a character in the Unicode `Pc` (Punctuation,\n * Connector), `Pd` (Punctuation, Dash), `Pe` (Punctuation, Close), `Pf`\n * (Punctuation, Final quote), `Pi` (Punctuation, Initial quote), `Po`\n * (Punctuation, Other), or `Ps` (Punctuation, Open) categories, or an ASCII\n * punctuation (see `asciiPunctuation`).\n *\n * See:\n * **\\[UNICODE]**:\n * [The Unicode Standard](https://www.unicode.org/versions/).\n * Unicode Consortium.\n *\n * @param code\n *   Code.\n * @returns\n *   Whether it matches.\n */\nexport const unicodePunctuation = regexCheck(/\\p{P}|\\p{S}/u);\n\n/**\n * Check whether the character code represents Unicode whitespace.\n *\n * Note that this does handle micromark specific markdown whitespace characters.\n * See `markdownLineEndingOrSpace` to check that.\n *\n * A **Unicode whitespace** is a character in the Unicode `Zs` (Separator,\n * Space) category, or U+0009 CHARACTER TABULATION (HT), U+000A LINE FEED (LF),\n * U+000C (FF), or U+000D CARRIAGE RETURN (CR) (**\\[UNICODE]**).\n *\n * See:\n * **\\[UNICODE]**:\n * [The Unicode Standard](https://www.unicode.org/versions/).\n * Unicode Consortium.\n *\n * @param code\n *   Code.\n * @returns\n *   Whether it matches.\n */\nexport const unicodeWhitespace = regexCheck(/\\s/);\n\n/**\n * Create a code check from a regex.\n *\n * @param {RegExp} regex\n *   Expression.\n * @returns {(code: Code) =\u003e boolean}\n *   Check.\n */\nfunction regexCheck(regex) {\n  return check;\n\n  /**\n   * Check whether a code matches the bound regex.\n   *\n   * @param {Code} code\n   *   Character code.\n   * @returns {boolean}\n   *   Whether the character code matches the bound regex.\n   */\n  function check(code) {\n    return code !== null \u0026\u0026 code \u003e -1 \u0026\u0026 regex.test(String.fromCharCode(code));\n  }\n}","export default function escapeStringRegexp(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\t// Escape characters with special meaning either inside or outside character sets.\n\t// Use a simple backslash escape when it’s always valid, and a `\\xnn` escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar.\n\treturn string\n\t\t.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$\u0026')\n\t\t.replace(/-/g, '\\\\x2d');\n}\n","/**\n * @import {Node, Parent} from 'unist'\n */\n\n/**\n * @template Fn\n * @template Fallback\n * @typedef {Fn extends (value: any) =\u003e value is infer Thing ? Thing : Fallback} Predicate\n */\n\n/**\n * @callback Check\n *   Check that an arbitrary value is a node.\n * @param {unknown} this\n *   The given context.\n * @param {unknown} [node]\n *   Anything (typically a node).\n * @param {number | null | undefined} [index]\n *   The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n *   The node’s parent.\n * @returns {boolean}\n *   Whether this is a node and passes a test.\n *\n * @typedef {Record\u003cstring, unknown\u003e | Node} Props\n *   Object to check for equivalence.\n *\n *   Note: `Node` is included as it is common but is not indexable.\n *\n * @typedef {Array\u003cProps | TestFunction | string\u003e | ReadonlyArray\u003cProps | TestFunction | string\u003e | Props | TestFunction | string | null | undefined} Test\n *   Check for an arbitrary node.\n *\n * @callback TestFunction\n *   Check if a node passes a test.\n * @param {unknown} this\n *   The given context.\n * @param {Node} node\n *   A node.\n * @param {number | undefined} [index]\n *   The node’s position in its parent.\n * @param {Parent | undefined} [parent]\n *   The node’s parent.\n * @returns {boolean | undefined | void}\n *   Whether this node passes the test.\n *\n *   Note: `void` is included until TS sees no return as `undefined`.\n */\n\n/**\n * Check if `node` is a `Node` and whether it passes the given test.\n *\n * @param {unknown} node\n *   Thing to check, typically `Node`.\n * @param {Test} test\n *   A check for a specific node.\n * @param {number | null | undefined} index\n *   The node’s position in its parent.\n * @param {Parent | null | undefined} parent\n *   The node’s parent.\n * @param {unknown} context\n *   Context object (`this`) to pass to `test` functions.\n * @returns {boolean}\n *   Whether `node` is a node and passes a test.\n */\nexport const is =\n  // Note: overloads in JSDoc can’t yet use different `@template`s.\n  /**\n   * @type {(\n   *   (\u003cCondition extends ReadonlyArray\u003cstring\u003e\u003e(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) =\u003e node is Node \u0026 {type: Condition[number]}) \u0026\n   *   (\u003cCondition extends Array\u003cstring\u003e\u003e(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) =\u003e node is Node \u0026 {type: Condition[number]}) \u0026\n   *   (\u003cCondition extends string\u003e(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) =\u003e node is Node \u0026 {type: Condition}) \u0026\n   *   (\u003cCondition extends Props\u003e(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) =\u003e node is Node \u0026 Condition) \u0026\n   *   (\u003cCondition extends TestFunction\u003e(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) =\u003e node is Node \u0026 Predicate\u003cCondition, Node\u003e) \u0026\n   *   ((node?: null | undefined) =\u003e false) \u0026\n   *   ((node: unknown, test?: null | undefined, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) =\u003e node is Node) \u0026\n   *   ((node: unknown, test?: Test, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) =\u003e boolean)\n   * )}\n   */\n  (\n    /**\n     * @param {unknown} [node]\n     * @param {Test} [test]\n     * @param {number | null | undefined} [index]\n     * @param {Parent | null | undefined} [parent]\n     * @param {unknown} [context]\n     * @returns {boolean}\n     */\n    // eslint-disable-next-line max-params\n    function (node, test, index, parent, context) {\n      const check = convert(test)\n\n      if (\n        index !== undefined \u0026\u0026\n        index !== null \u0026\u0026\n        (typeof index !== 'number' ||\n          index \u003c 0 ||\n          index === Number.POSITIVE_INFINITY)\n      ) {\n        throw new Error('Expected positive finite index')\n      }\n\n      if (\n        parent !== undefined \u0026\u0026\n        parent !== null \u0026\u0026\n        (!is(parent) || !parent.children)\n      ) {\n        throw new Error('Expected parent node')\n      }\n\n      if (\n        (parent === undefined || parent === null) !==\n        (index === undefined || index === null)\n      ) {\n        throw new Error('Expected both parent and index')\n      }\n\n      return looksLikeANode(node)\n        ? check.call(context, node, index, parent)\n        : false\n    }\n  )\n\n/**\n * Generate an assertion from a test.\n *\n * Useful if you’re going to test many nodes, for example when creating a\n * utility where something else passes a compatible test.\n *\n * The created function is a bit faster because it expects valid input only:\n * a `node`, `index`, and `parent`.\n *\n * @param {Test} test\n *   *   when nullish, checks if `node` is a `Node`.\n *   *   when `string`, works like passing `(node) =\u003e node.type === test`.\n *   *   when `function` checks if function passed the node is true.\n *   *   when `object`, checks that all keys in test are in node, and that they have (strictly) equal values.\n *   *   when `array`, checks if any one of the subtests pass.\n * @returns {Check}\n *   An assertion.\n */\nexport const convert =\n  // Note: overloads in JSDoc can’t yet use different `@template`s.\n  /**\n   * @type {(\n   *   (\u003cCondition extends string\u003e(test: Condition) =\u003e (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) =\u003e node is Node \u0026 {type: Condition}) \u0026\n   *   (\u003cCondition extends Props\u003e(test: Condition) =\u003e (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) =\u003e node is Node \u0026 Condition) \u0026\n   *   (\u003cCondition extends TestFunction\u003e(test: Condition) =\u003e (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) =\u003e node is Node \u0026 Predicate\u003cCondition, Node\u003e) \u0026\n   *   ((test?: null | undefined) =\u003e (node?: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) =\u003e node is Node) \u0026\n   *   ((test?: Test) =\u003e Check)\n   * )}\n   */\n  (\n    /**\n     * @param {Test} [test]\n     * @returns {Check}\n     */\n    function (test) {\n      if (test === null || test === undefined) {\n        return ok\n      }\n\n      if (typeof test === 'function') {\n        return castFactory(test)\n      }\n\n      if (typeof test === 'object') {\n        return Array.isArray(test)\n          ? anyFactory(test)\n          : // Cast because `ReadonlyArray` goes into the above but `isArray`\n            // narrows to `Array`.\n            propertiesFactory(/** @type {Props} */ (test))\n      }\n\n      if (typeof test === 'string') {\n        return typeFactory(test)\n      }\n\n      throw new Error('Expected function, string, or object as test')\n    }\n  )\n\n/**\n * @param {Array\u003cProps | TestFunction | string\u003e} tests\n * @returns {Check}\n */\nfunction anyFactory(tests) {\n  /** @type {Array\u003cCheck\u003e} */\n  const checks = []\n  let index = -1\n\n  while (++index \u003c tests.length) {\n    checks[index] = convert(tests[index])\n  }\n\n  return castFactory(any)\n\n  /**\n   * @this {unknown}\n   * @type {TestFunction}\n   */\n  function any(...parameters) {\n    let index = -1\n\n    while (++index \u003c checks.length) {\n      if (checks[index].apply(this, parameters)) return true\n    }\n\n    return false\n  }\n}\n\n/**\n * Turn an object into a test for a node with a certain fields.\n *\n * @param {Props} check\n * @returns {Check}\n */\nfunction propertiesFactory(check) {\n  const checkAsRecord = /** @type {Record\u003cstring, unknown\u003e} */ (check)\n\n  return castFactory(all)\n\n  /**\n   * @param {Node} node\n   * @returns {boolean}\n   */\n  function all(node) {\n    const nodeAsRecord = /** @type {Record\u003cstring, unknown\u003e} */ (\n      /** @type {unknown} */ (node)\n    )\n\n    /** @type {string} */\n    let key\n\n    for (key in check) {\n      if (nodeAsRecord[key] !== checkAsRecord[key]) return false\n    }\n\n    return true\n  }\n}\n\n/**\n * Turn a string into a test for a node with a certain type.\n *\n * @param {string} check\n * @returns {Check}\n */\nfunction typeFactory(check) {\n  return castFactory(type)\n\n  /**\n   * @param {Node} node\n   */\n  function type(node) {\n    return node \u0026\u0026 node.type === check\n  }\n}\n\n/**\n * Turn a custom test into a test for a node that passes that test.\n *\n * @param {TestFunction} testFunction\n * @returns {Check}\n */\nfunction castFactory(testFunction) {\n  return check\n\n  /**\n   * @this {unknown}\n   * @type {Check}\n   */\n  function check(value, index, parent) {\n    return Boolean(\n      looksLikeANode(value) \u0026\u0026\n        testFunction.call(\n          this,\n          value,\n          typeof index === 'number' ? index : undefined,\n          parent || undefined\n        )\n    )\n  }\n}\n\nfunction ok() {\n  return true\n}\n\n/**\n * @param {unknown} value\n * @returns {value is Node}\n */\nfunction looksLikeANode(value) {\n  return value !== null \u0026\u0026 typeof value === 'object' \u0026\u0026 'type' in value\n}\n","/**\n * @import {Node as UnistNode, Parent as UnistParent} from 'unist'\n */\n\n/**\n * @typedef {Exclude\u003cimport('unist-util-is').Test, undefined\u003e | undefined} Test\n *   Test from `unist-util-is`.\n *\n *   Note: we have remove and add `undefined`, because otherwise when generating\n *   automatic `.d.ts` files, TS tries to flatten paths from a local perspective,\n *   which doesn’t work when publishing on npm.\n */\n\n/**\n * @typedef {(\n *   Fn extends (value: any) =\u003e value is infer Thing\n *   ? Thing\n *   : Fallback\n * )} Predicate\n *   Get the value of a type guard `Fn`.\n * @template Fn\n *   Value; typically function that is a type guard (such as `(x): x is Y`).\n * @template Fallback\n *   Value to yield if `Fn` is not a type guard.\n */\n\n/**\n * @typedef {(\n *   Check extends null | undefined // No test.\n *   ? Value\n *   : Value extends {type: Check} // String (type) test.\n *   ? Value\n *   : Value extends Check // Partial test.\n *   ? Value\n *   : Check extends Function // Function test.\n *   ? Predicate\u003cCheck, Value\u003e extends Value\n *     ? Predicate\u003cCheck, Value\u003e\n *     : never\n *   : never // Some other test?\n * )} MatchesOne\n *   Check whether a node matches a primitive check in the type system.\n * @template Value\n *   Value; typically unist `Node`.\n * @template Check\n *   Value; typically `unist-util-is`-compatible test, but not arrays.\n */\n\n/**\n * @typedef {(\n *   Check extends ReadonlyArray\u003cinfer T\u003e\n *   ? MatchesOne\u003cValue, T\u003e\n *   : Check extends Array\u003cinfer T\u003e\n *   ? MatchesOne\u003cValue, T\u003e\n *   : MatchesOne\u003cValue, Check\u003e\n * )} Matches\n *   Check whether a node matches a check in the type system.\n * @template Value\n *   Value; typically unist `Node`.\n * @template Check\n *   Value; typically `unist-util-is`-compatible test.\n */\n\n/**\n * @typedef {0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10} Uint\n *   Number; capped reasonably.\n */\n\n/**\n * @typedef {I extends 0 ? 1 : I extends 1 ? 2 : I extends 2 ? 3 : I extends 3 ? 4 : I extends 4 ? 5 : I extends 5 ? 6 : I extends 6 ? 7 : I extends 7 ? 8 : I extends 8 ? 9 : 10} Increment\n *   Increment a number in the type system.\n * @template {Uint} [I=0]\n *   Index.\n */\n\n/**\n * @typedef {(\n *   Node extends UnistParent\n *   ? Node extends {children: Array\u003cinfer Children\u003e}\n *     ? Child extends Children ? Node : never\n *     : never\n *   : never\n * )} InternalParent\n *   Collect nodes that can be parents of `Child`.\n * @template {UnistNode} Node\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n */\n\n/**\n * @typedef {InternalParent\u003cInclusiveDescendant\u003cTree\u003e, Child\u003e} Parent\n *   Collect nodes in `Tree` that can be parents of `Child`.\n * @template {UnistNode} Tree\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n */\n\n/**\n * @typedef {(\n *   Depth extends Max\n *   ? never\n *   :\n *     | InternalParent\u003cNode, Child\u003e\n *     | InternalAncestor\u003cNode, InternalParent\u003cNode, Child\u003e, Max, Increment\u003cDepth\u003e\u003e\n * )} InternalAncestor\n *   Collect nodes in `Tree` that can be ancestors of `Child`.\n * @template {UnistNode} Node\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n * @template {Uint} [Max=10]\n *   Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n *   Current depth.\n */\n\n/**\n * @typedef {InternalAncestor\u003cInclusiveDescendant\u003cTree\u003e, Child\u003e} Ancestor\n *   Collect nodes in `Tree` that can be ancestors of `Child`.\n * @template {UnistNode} Tree\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n */\n\n/**\n * @typedef {(\n *   Tree extends UnistParent\n *     ? Depth extends Max\n *       ? Tree\n *       : Tree | InclusiveDescendant\u003cTree['children'][number], Max, Increment\u003cDepth\u003e\u003e\n *     : Tree\n * )} InclusiveDescendant\n *   Collect all (inclusive) descendants of `Tree`.\n *\n *   \u003e 👉 **Note**: for performance reasons, this seems to be the fastest way to\n *   \u003e recurse without actually running into an infinite loop, which the\n *   \u003e previous version did.\n *   \u003e\n *   \u003e Practically, a max of `2` is typically enough assuming a `Root` is\n *   \u003e passed, but it doesn’t improve performance.\n *   \u003e It gets higher with `List \u003e ListItem \u003e Table \u003e TableRow \u003e TableCell`.\n *   \u003e Using up to `10` doesn’t hurt or help either.\n * @template {UnistNode} Tree\n *   Tree type.\n * @template {Uint} [Max=10]\n *   Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n *   Current depth.\n */\n\n/**\n * @typedef {'skip' | boolean} Action\n *   Union of the action types.\n *\n * @typedef {number} Index\n *   Move to the sibling at `index` next (after node itself is completely\n *   traversed).\n *\n *   Useful if mutating the tree, such as removing the node the visitor is\n *   currently on, or any of its previous siblings.\n *   Results less than 0 or greater than or equal to `children.length` stop\n *   traversing the parent.\n *\n * @typedef {[(Action | null | undefined | void)?, (Index | null | undefined)?]} ActionTuple\n *   List with one or two values, the first an action, the second an index.\n *\n * @typedef {Action | ActionTuple | Index | null | undefined | void} VisitorResult\n *   Any value that can be returned from a visitor.\n */\n\n/**\n * @callback Visitor\n *   Handle a node (matching `test`, if given).\n *\n *   Visitors are free to transform `node`.\n *   They can also transform the parent of node (the last of `ancestors`).\n *\n *   Replacing `node` itself, if `SKIP` is not returned, still causes its\n *   descendants to be walked (which is a bug).\n *\n *   When adding or removing previous siblings of `node` (or next siblings, in\n *   case of reverse), the `Visitor` should return a new `Index` to specify the\n *   sibling to traverse after `node` is traversed.\n *   Adding or removing next siblings of `node` (or previous siblings, in case\n *   of reverse) is handled as expected without needing to return a new `Index`.\n *\n *   Removing the children property of an ancestor still results in them being\n *   traversed.\n * @param {Visited} node\n *   Found node.\n * @param {Array\u003cVisitedParents\u003e} ancestors\n *   Ancestors of `node`.\n * @returns {VisitorResult}\n *   What to do next.\n *\n *   An `Index` is treated as a tuple of `[CONTINUE, Index]`.\n *   An `Action` is treated as a tuple of `[Action]`.\n *\n *   Passing a tuple back only makes sense if the `Action` is `SKIP`.\n *   When the `Action` is `EXIT`, that action can be returned.\n *   When the `Action` is `CONTINUE`, `Index` can be returned.\n * @template {UnistNode} [Visited=UnistNode]\n *   Visited node type.\n * @template {UnistParent} [VisitedParents=UnistParent]\n *   Ancestor type.\n */\n\n/**\n * @typedef {Visitor\u003cMatches\u003cInclusiveDescendant\u003cTree\u003e, Check\u003e, Ancestor\u003cTree, Matches\u003cInclusiveDescendant\u003cTree\u003e, Check\u003e\u003e\u003e} BuildVisitor\n *   Build a typed `Visitor` function from a tree and a test.\n *\n *   It will infer which values are passed as `node` and which as `parents`.\n * @template {UnistNode} [Tree=UnistNode]\n *   Tree type.\n * @template {Test} [Check=Test]\n *   Test type.\n */\n\nimport {convert} from 'unist-util-is'\nimport {color} from 'unist-util-visit-parents/do-not-use-color'\n\n/** @type {Readonly\u003cActionTuple\u003e} */\nconst empty = []\n\n/**\n * Continue traversing as normal.\n */\nexport const CONTINUE = true\n\n/**\n * Stop traversing immediately.\n */\nexport const EXIT = false\n\n/**\n * Do not traverse this node’s children.\n */\nexport const SKIP = 'skip'\n\n/**\n * Visit nodes, with ancestral information.\n *\n * This algorithm performs *depth-first* *tree traversal* in *preorder*\n * (**NLR**) or if `reverse` is given, in *reverse preorder* (**NRL**).\n *\n * You can choose for which nodes `visitor` is called by passing a `test`.\n * For complex tests, you should test yourself in `visitor`, as it will be\n * faster and will have improved type information.\n *\n * Walking the tree is an intensive task.\n * Make use of the return values of the visitor when possible.\n * Instead of walking a tree multiple times, walk it once, use `unist-util-is`\n * to check if a node matches, and then perform different operations.\n *\n * You can change the tree.\n * See `Visitor` for more info.\n *\n * @overload\n * @param {Tree} tree\n * @param {Check} check\n * @param {BuildVisitor\u003cTree, Check\u003e} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @overload\n * @param {Tree} tree\n * @param {BuildVisitor\u003cTree\u003e} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @param {UnistNode} tree\n *   Tree to traverse.\n * @param {Visitor | Test} test\n *   `unist-util-is`-compatible test\n * @param {Visitor | boolean | null | undefined} [visitor]\n *   Handle each node.\n * @param {boolean | null | undefined} [reverse]\n *   Traverse in reverse preorder (NRL) instead of the default preorder (NLR).\n * @returns {undefined}\n *   Nothing.\n *\n * @template {UnistNode} Tree\n *   Node type.\n * @template {Test} Check\n *   `unist-util-is`-compatible test.\n */\nexport function visitParents(tree, test, visitor, reverse) {\n  /** @type {Test} */\n  let check\n\n  if (typeof test === 'function' \u0026\u0026 typeof visitor !== 'function') {\n    reverse = visitor\n    // @ts-expect-error no visitor given, so `visitor` is test.\n    visitor = test\n  } else {\n    // @ts-expect-error visitor given, so `test` isn’t a visitor.\n    check = test\n  }\n\n  const is = convert(check)\n  const step = reverse ? -1 : 1\n\n  factory(tree, undefined, [])()\n\n  /**\n   * @param {UnistNode} node\n   * @param {number | undefined} index\n   * @param {Array\u003cUnistParent\u003e} parents\n   */\n  function factory(node, index, parents) {\n    const value = /** @type {Record\u003cstring, unknown\u003e} */ (\n      node \u0026\u0026 typeof node === 'object' ? node : {}\n    )\n\n    if (typeof value.type === 'string') {\n      const name =\n        // `hast`\n        typeof value.tagName === 'string'\n          ? value.tagName\n          : // `xast`\n            typeof value.name === 'string'\n            ? value.name\n            : undefined\n\n      Object.defineProperty(visit, 'name', {\n        value:\n          'node (' + color(node.type + (name ? '\u003c' + name + '\u003e' : '')) + ')'\n      })\n    }\n\n    return visit\n\n    function visit() {\n      /** @type {Readonly\u003cActionTuple\u003e} */\n      let result = empty\n      /** @type {Readonly\u003cActionTuple\u003e} */\n      let subresult\n      /** @type {number} */\n      let offset\n      /** @type {Array\u003cUnistParent\u003e} */\n      let grandparents\n\n      if (!test || is(node, index, parents[parents.length - 1] || undefined)) {\n        // @ts-expect-error: `visitor` is now a visitor.\n        result = toResult(visitor(node, parents))\n\n        if (result[0] === EXIT) {\n          return result\n        }\n      }\n\n      if ('children' in node \u0026\u0026 node.children) {\n        const nodeAsParent = /** @type {UnistParent} */ (node)\n\n        if (nodeAsParent.children \u0026\u0026 result[0] !== SKIP) {\n          offset = (reverse ? nodeAsParent.children.length : -1) + step\n          grandparents = parents.concat(nodeAsParent)\n\n          while (offset \u003e -1 \u0026\u0026 offset \u003c nodeAsParent.children.length) {\n            const child = nodeAsParent.children[offset]\n\n            subresult = factory(child, offset, grandparents)()\n\n            if (subresult[0] === EXIT) {\n              return subresult\n            }\n\n            offset =\n              typeof subresult[1] === 'number' ? subresult[1] : offset + step\n          }\n        }\n      }\n\n      return result\n    }\n  }\n}\n\n/**\n * Turn a return value into a clean result.\n *\n * @param {VisitorResult} value\n *   Valid return values from visitors.\n * @returns {Readonly\u003cActionTuple\u003e}\n *   Clean result.\n */\nfunction toResult(value) {\n  if (Array.isArray(value)) {\n    return value\n  }\n\n  if (typeof value === 'number') {\n    return [CONTINUE, value]\n  }\n\n  return value === null || value === undefined ? empty : [value]\n}\n","/**\n * @import {Nodes, Parents, PhrasingContent, Root, Text} from 'mdast'\n * @import {BuildVisitor, Test, VisitorResult} from 'unist-util-visit-parents'\n */\n\n/**\n * @typedef RegExpMatchObject\n *   Info on the match.\n * @property {number} index\n *   The index of the search at which the result was found.\n * @property {string} input\n *   A copy of the search string in the text node.\n * @property {[...Array\u003cParents\u003e, Text]} stack\n *   All ancestors of the text node, where the last node is the text itself.\n *\n * @typedef {RegExp | string} Find\n *   Pattern to find.\n *\n *   Strings are escaped and then turned into global expressions.\n *\n * @typedef {Array\u003cFindAndReplaceTuple\u003e} FindAndReplaceList\n *   Several find and replaces, in array form.\n *\n * @typedef {[Find, Replace?]} FindAndReplaceTuple\n *   Find and replace in tuple form.\n *\n * @typedef {ReplaceFunction | string | null | undefined} Replace\n *   Thing to replace with.\n *\n * @callback ReplaceFunction\n *   Callback called when a search matches.\n * @param {...any} parameters\n *   The parameters are the result of corresponding search expression:\n *\n *   * `value` (`string`) — whole match\n *   * `...capture` (`Array\u003cstring\u003e`) — matches from regex capture groups\n *   * `match` (`RegExpMatchObject`) — info on the match\n * @returns {Array\u003cPhrasingContent\u003e | PhrasingContent | string | false | null | undefined}\n *   Thing to replace with.\n *\n *   * when `null`, `undefined`, `''`, remove the match\n *   * …or when `false`, do not replace at all\n *   * …or when `string`, replace with a text node of that value\n *   * …or when `Node` or `Array\u003cNode\u003e`, replace with those nodes\n *\n * @typedef {[RegExp, ReplaceFunction]} Pair\n *   Normalized find and replace.\n *\n * @typedef {Array\u003cPair\u003e} Pairs\n *   All find and replaced.\n *\n * @typedef Options\n *   Configuration.\n * @property {Test | null | undefined} [ignore]\n *   Test for which nodes to ignore (optional).\n */\n\nimport escape from 'escape-string-regexp'\nimport {visitParents} from 'unist-util-visit-parents'\nimport {convert} from 'unist-util-is'\n\n/**\n * Find patterns in a tree and replace them.\n *\n * The algorithm searches the tree in *preorder* for complete values in `Text`\n * nodes.\n * Partial matches are not supported.\n *\n * @param {Nodes} tree\n *   Tree to change.\n * @param {FindAndReplaceList | FindAndReplaceTuple} list\n *   Patterns to find.\n * @param {Options | null | undefined} [options]\n *   Configuration (when `find` is not `Find`).\n * @returns {undefined}\n *   Nothing.\n */\nexport function findAndReplace(tree, list, options) {\n  const settings = options || {}\n  const ignored = convert(settings.ignore || [])\n  const pairs = toPairs(list)\n  let pairIndex = -1\n\n  while (++pairIndex \u003c pairs.length) {\n    visitParents(tree, 'text', visitor)\n  }\n\n  /** @type {BuildVisitor\u003cRoot, 'text'\u003e} */\n  function visitor(node, parents) {\n    let index = -1\n    /** @type {Parents | undefined} */\n    let grandparent\n\n    while (++index \u003c parents.length) {\n      const parent = parents[index]\n      /** @type {Array\u003cNodes\u003e | undefined} */\n      const siblings = grandparent ? grandparent.children : undefined\n\n      if (\n        ignored(\n          parent,\n          siblings ? siblings.indexOf(parent) : undefined,\n          grandparent\n        )\n      ) {\n        return\n      }\n\n      grandparent = parent\n    }\n\n    if (grandparent) {\n      return handler(node, parents)\n    }\n  }\n\n  /**\n   * Handle a text node which is not in an ignored parent.\n   *\n   * @param {Text} node\n   *   Text node.\n   * @param {Array\u003cParents\u003e} parents\n   *   Parents.\n   * @returns {VisitorResult}\n   *   Result.\n   */\n  function handler(node, parents) {\n    const parent = parents[parents.length - 1]\n    const find = pairs[pairIndex][0]\n    const replace = pairs[pairIndex][1]\n    let start = 0\n    /** @type {Array\u003cNodes\u003e} */\n    const siblings = parent.children\n    const index = siblings.indexOf(node)\n    let change = false\n    /** @type {Array\u003cPhrasingContent\u003e} */\n    let nodes = []\n\n    find.lastIndex = 0\n\n    let match = find.exec(node.value)\n\n    while (match) {\n      const position = match.index\n      /** @type {RegExpMatchObject} */\n      const matchObject = {\n        index: match.index,\n        input: match.input,\n        stack: [...parents, node]\n      }\n      let value = replace(...match, matchObject)\n\n      if (typeof value === 'string') {\n        value = value.length \u003e 0 ? {type: 'text', value} : undefined\n      }\n\n      // It wasn’t a match after all.\n      if (value === false) {\n        // False acts as if there was no match.\n        // So we need to reset `lastIndex`, which currently being at the end of\n        // the current match, to the beginning.\n        find.lastIndex = position + 1\n      } else {\n        if (start !== position) {\n          nodes.push({\n            type: 'text',\n            value: node.value.slice(start, position)\n          })\n        }\n\n        if (Array.isArray(value)) {\n          nodes.push(...value)\n        } else if (value) {\n          nodes.push(value)\n        }\n\n        start = position + match[0].length\n        change = true\n      }\n\n      if (!find.global) {\n        break\n      }\n\n      match = find.exec(node.value)\n    }\n\n    if (change) {\n      if (start \u003c node.value.length) {\n        nodes.push({type: 'text', value: node.value.slice(start)})\n      }\n\n      parent.children.splice(index, 1, ...nodes)\n    } else {\n      nodes = [node]\n    }\n\n    return index + nodes.length\n  }\n}\n\n/**\n * Turn a tuple or a list of tuples into pairs.\n *\n * @param {FindAndReplaceList | FindAndReplaceTuple} tupleOrList\n *   Schema.\n * @returns {Pairs}\n *   Clean pairs.\n */\nfunction toPairs(tupleOrList) {\n  /** @type {Pairs} */\n  const result = []\n\n  if (!Array.isArray(tupleOrList)) {\n    throw new TypeError('Expected find and replace tuple or list of tuples')\n  }\n\n  /** @type {FindAndReplaceList} */\n  // @ts-expect-error: correct.\n  const list =\n    !tupleOrList[0] || Array.isArray(tupleOrList[0])\n      ? tupleOrList\n      : [tupleOrList]\n\n  let index = -1\n\n  while (++index \u003c list.length) {\n    const tuple = list[index]\n    result.push([toExpression(tuple[0]), toFunction(tuple[1])])\n  }\n\n  return result\n}\n\n/**\n * Turn a find into an expression.\n *\n * @param {Find} find\n *   Find.\n * @returns {RegExp}\n *   Expression.\n */\nfunction toExpression(find) {\n  return typeof find === 'string' ? new RegExp(escape(find), 'g') : find\n}\n\n/**\n * Turn a replace into a function.\n *\n * @param {Replace} replace\n *   Replace.\n * @returns {ReplaceFunction}\n *   Function.\n */\nfunction toFunction(replace) {\n  return typeof replace === 'function'\n    ? replace\n    : function () {\n        return replace\n      }\n}\n","/**\n * @import {RegExpMatchObject, ReplaceFunction} from 'mdast-util-find-and-replace'\n * @import {CompileContext, Extension as FromMarkdownExtension, Handle as FromMarkdownHandle, Transform as FromMarkdownTransform} from 'mdast-util-from-markdown'\n * @import {ConstructName, Options as ToMarkdownExtension} from 'mdast-util-to-markdown'\n * @import {Link, PhrasingContent} from 'mdast'\n */\n\nimport {ccount} from 'ccount'\nimport {ok as assert} from 'devlop'\nimport {unicodePunctuation, unicodeWhitespace} from 'micromark-util-character'\nimport {findAndReplace} from 'mdast-util-find-and-replace'\n\n/** @type {ConstructName} */\nconst inConstruct = 'phrasing'\n/** @type {Array\u003cConstructName\u003e} */\nconst notInConstruct = ['autolink', 'link', 'image', 'label']\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM autolink\n * literals in markdown.\n *\n * @returns {FromMarkdownExtension}\n *   Extension for `mdast-util-to-markdown` to enable GFM autolink literals.\n */\nexport function gfmAutolinkLiteralFromMarkdown() {\n  return {\n    transforms: [transformGfmAutolinkLiterals],\n    enter: {\n      literalAutolink: enterLiteralAutolink,\n      literalAutolinkEmail: enterLiteralAutolinkValue,\n      literalAutolinkHttp: enterLiteralAutolinkValue,\n      literalAutolinkWww: enterLiteralAutolinkValue\n    },\n    exit: {\n      literalAutolink: exitLiteralAutolink,\n      literalAutolinkEmail: exitLiteralAutolinkEmail,\n      literalAutolinkHttp: exitLiteralAutolinkHttp,\n      literalAutolinkWww: exitLiteralAutolinkWww\n    }\n  }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM autolink\n * literals in markdown.\n *\n * @returns {ToMarkdownExtension}\n *   Extension for `mdast-util-to-markdown` to enable GFM autolink literals.\n */\nexport function gfmAutolinkLiteralToMarkdown() {\n  return {\n    unsafe: [\n      {\n        character: '@',\n        before: '[+\\\\-.\\\\w]',\n        after: '[\\\\-.\\\\w]',\n        inConstruct,\n        notInConstruct\n      },\n      {\n        character: '.',\n        before: '[Ww]',\n        after: '[\\\\-.\\\\w]',\n        inConstruct,\n        notInConstruct\n      },\n      {\n        character: ':',\n        before: '[ps]',\n        after: '\\\\/',\n        inConstruct,\n        notInConstruct\n      }\n    ]\n  }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterLiteralAutolink(token) {\n  this.enter({type: 'link', title: null, url: '', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterLiteralAutolinkValue(token) {\n  this.config.enter.autolinkProtocol.call(this, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolinkHttp(token) {\n  this.config.exit.autolinkProtocol.call(this, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolinkWww(token) {\n  this.config.exit.data.call(this, token)\n  const node = this.stack[this.stack.length - 1]\n  assert(node.type === 'link')\n  node.url = 'http://' + this.sliceSerialize(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolinkEmail(token) {\n  this.config.exit.autolinkEmail.call(this, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolink(token) {\n  this.exit(token)\n}\n\n/** @type {FromMarkdownTransform} */\nfunction transformGfmAutolinkLiterals(tree) {\n  findAndReplace(\n    tree,\n    [\n      [/(https?:\\/\\/|www(?=\\.))([-.\\w]+)([^ \\t\\r\\n]*)/gi, findUrl],\n      [/(?\u003c=^|\\s|\\p{P}|\\p{S})([-.\\w+]+)@([-\\w]+(?:\\.[-\\w]+)+)/gu, findEmail]\n    ],\n    {ignore: ['link', 'linkReference']}\n  )\n}\n\n/**\n * @type {ReplaceFunction}\n * @param {string} _\n * @param {string} protocol\n * @param {string} domain\n * @param {string} path\n * @param {RegExpMatchObject} match\n * @returns {Array\u003cPhrasingContent\u003e | Link | false}\n */\n// eslint-disable-next-line max-params\nfunction findUrl(_, protocol, domain, path, match) {\n  let prefix = ''\n\n  // Not an expected previous character.\n  if (!previous(match)) {\n    return false\n  }\n\n  // Treat `www` as part of the domain.\n  if (/^w/i.test(protocol)) {\n    domain = protocol + domain\n    protocol = ''\n    prefix = 'http://'\n  }\n\n  if (!isCorrectDomain(domain)) {\n    return false\n  }\n\n  const parts = splitUrl(domain + path)\n\n  if (!parts[0]) return false\n\n  /** @type {Link} */\n  const result = {\n    type: 'link',\n    title: null,\n    url: prefix + protocol + parts[0],\n    children: [{type: 'text', value: protocol + parts[0]}]\n  }\n\n  if (parts[1]) {\n    return [result, {type: 'text', value: parts[1]}]\n  }\n\n  return result\n}\n\n/**\n * @type {ReplaceFunction}\n * @param {string} _\n * @param {string} atext\n * @param {string} label\n * @param {RegExpMatchObject} match\n * @returns {Link | false}\n */\nfunction findEmail(_, atext, label, match) {\n  if (\n    // Not an expected previous character.\n    !previous(match, true) ||\n    // Label ends in not allowed character.\n    /[-\\d_]$/.test(label)\n  ) {\n    return false\n  }\n\n  return {\n    type: 'link',\n    title: null,\n    url: 'mailto:' + atext + '@' + label,\n    children: [{type: 'text', value: atext + '@' + label}]\n  }\n}\n\n/**\n * @param {string} domain\n * @returns {boolean}\n */\nfunction isCorrectDomain(domain) {\n  const parts = domain.split('.')\n\n  if (\n    parts.length \u003c 2 ||\n    (parts[parts.length - 1] \u0026\u0026\n      (/_/.test(parts[parts.length - 1]) ||\n        !/[a-zA-Z\\d]/.test(parts[parts.length - 1]))) ||\n    (parts[parts.length - 2] \u0026\u0026\n      (/_/.test(parts[parts.length - 2]) ||\n        !/[a-zA-Z\\d]/.test(parts[parts.length - 2])))\n  ) {\n    return false\n  }\n\n  return true\n}\n\n/**\n * @param {string} url\n * @returns {[string, string | undefined]}\n */\nfunction splitUrl(url) {\n  const trailExec = /[!\"\u0026'),.:;\u003c\u003e?\\]}]+$/.exec(url)\n\n  if (!trailExec) {\n    return [url, undefined]\n  }\n\n  url = url.slice(0, trailExec.index)\n\n  let trail = trailExec[0]\n  let closingParenIndex = trail.indexOf(')')\n  const openingParens = ccount(url, '(')\n  let closingParens = ccount(url, ')')\n\n  while (closingParenIndex !== -1 \u0026\u0026 openingParens \u003e closingParens) {\n    url += trail.slice(0, closingParenIndex + 1)\n    trail = trail.slice(closingParenIndex + 1)\n    closingParenIndex = trail.indexOf(')')\n    closingParens++\n  }\n\n  return [url, trail]\n}\n\n/**\n * @param {RegExpMatchObject} match\n * @param {boolean | null | undefined} [email=false]\n * @returns {boolean}\n */\nfunction previous(match, email) {\n  const code = match.input.charCodeAt(match.index - 1)\n\n  return (\n    (match.index === 0 ||\n      unicodeWhitespace(code) ||\n      unicodePunctuation(code)) \u0026\u0026\n    // If it’s an email, the previous character should not be a slash.\n    (!email || code !== 47)\n  )\n}\n","/**\n * Normalize an identifier (as found in references, definitions).\n *\n * Collapses markdown whitespace, trim, and then lower- and uppercase.\n *\n * Some characters are considered “uppercase”, such as U+03F4 (`ϴ`), but if their\n * lowercase counterpart (U+03B8 (`θ`)) is uppercased will result in a different\n * uppercase character (U+0398 (`Θ`)).\n * So, to get a canonical form, we perform both lower- and uppercase.\n *\n * Using uppercase last makes sure keys will never interact with default\n * prototypal values (such as `constructor`): nothing in the prototype of\n * `Object` is uppercase.\n *\n * @param {string} value\n *   Identifier to normalize.\n * @returns {string}\n *   Normalized identifier.\n */\nexport function normalizeIdentifier(value) {\n  return value\n  // Collapse markdown whitespace.\n  .replace(/[\\t\\n\\r ]+/g, \" \")\n  // Trim.\n  .replace(/^ | $/g, '')\n  // Some characters are considered “uppercase”, but if their lowercase\n  // counterpart is uppercased will result in a different uppercase\n  // character.\n  // Hence, to get that form, we perform both lower- and uppercase.\n  // Upper case makes sure keys will not interact with default prototypal\n  // methods: no method is uppercase.\n  .toLowerCase().toUpperCase();\n}","/**\n * @import {\n *   CompileContext,\n *   Extension as FromMarkdownExtension,\n *   Handle as FromMarkdownHandle\n * } from 'mdast-util-from-markdown'\n * @import {ToMarkdownOptions} from 'mdast-util-gfm-footnote'\n * @import {\n *   Handle as ToMarkdownHandle,\n *   Map,\n *   Options as ToMarkdownExtension\n * } from 'mdast-util-to-markdown'\n * @import {FootnoteDefinition, FootnoteReference} from 'mdast'\n */\n\nimport {ok as assert} from 'devlop'\nimport {normalizeIdentifier} from 'micromark-util-normalize-identifier'\n\nfootnoteReference.peek = footnoteReferencePeek\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCallString() {\n  this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCall(token) {\n  this.enter({type: 'footnoteReference', identifier: '', label: ''}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinitionLabelString() {\n  this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinition(token) {\n  this.enter(\n    {type: 'footnoteDefinition', identifier: '', label: '', children: []},\n    token\n  )\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCallString(token) {\n  const label = this.resume()\n  const node = this.stack[this.stack.length - 1]\n  assert(node.type === 'footnoteReference')\n  node.identifier = normalizeIdentifier(\n    this.sliceSerialize(token)\n  ).toLowerCase()\n  node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCall(token) {\n  this.exit(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinitionLabelString(token) {\n  const label = this.resume()\n  const node = this.stack[this.stack.length - 1]\n  assert(node.type === 'footnoteDefinition')\n  node.identifier = normalizeIdentifier(\n    this.sliceSerialize(token)\n  ).toLowerCase()\n  node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinition(token) {\n  this.exit(token)\n}\n\n/** @type {ToMarkdownHandle} */\nfunction footnoteReferencePeek() {\n  return '['\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {FootnoteReference} node\n */\nfunction footnoteReference(node, _, state, info) {\n  const tracker = state.createTracker(info)\n  let value = tracker.move('[^')\n  const exit = state.enter('footnoteReference')\n  const subexit = state.enter('reference')\n  value += tracker.move(\n    state.safe(state.associationId(node), {after: ']', before: value})\n  )\n  subexit()\n  exit()\n  value += tracker.move(']')\n  return value\n}\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @returns {FromMarkdownExtension}\n *   Extension for `mdast-util-from-markdown`.\n */\nexport function gfmFootnoteFromMarkdown() {\n  return {\n    enter: {\n      gfmFootnoteCallString: enterFootnoteCallString,\n      gfmFootnoteCall: enterFootnoteCall,\n      gfmFootnoteDefinitionLabelString: enterFootnoteDefinitionLabelString,\n      gfmFootnoteDefinition: enterFootnoteDefinition\n    },\n    exit: {\n      gfmFootnoteCallString: exitFootnoteCallString,\n      gfmFootnoteCall: exitFootnoteCall,\n      gfmFootnoteDefinitionLabelString: exitFootnoteDefinitionLabelString,\n      gfmFootnoteDefinition: exitFootnoteDefinition\n    }\n  }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @param {ToMarkdownOptions | null | undefined} [options]\n *   Configuration (optional).\n * @returns {ToMarkdownExtension}\n *   Extension for `mdast-util-to-markdown`.\n */\nexport function gfmFootnoteToMarkdown(options) {\n  // To do: next major: change default.\n  let firstLineBlank = false\n\n  if (options \u0026\u0026 options.firstLineBlank) {\n    firstLineBlank = true\n  }\n\n  return {\n    handlers: {footnoteDefinition, footnoteReference},\n    // This is on by default already.\n    unsafe: [{character: '[', inConstruct: ['label', 'phrasing', 'reference']}]\n  }\n\n  /**\n   * @type {ToMarkdownHandle}\n   * @param {FootnoteDefinition} node\n   */\n  function footnoteDefinition(node, _, state, info) {\n    const tracker = state.createTracker(info)\n    let value = tracker.move('[^')\n    const exit = state.enter('footnoteDefinition')\n    const subexit = state.enter('label')\n    value += tracker.move(\n      state.safe(state.associationId(node), {before: value, after: ']'})\n    )\n    subexit()\n\n    value += tracker.move(']:')\n\n    if (node.children \u0026\u0026 node.children.length \u003e 0) {\n      tracker.shift(4)\n\n      value += tracker.move(\n        (firstLineBlank ? '\\n' : ' ') +\n          state.indentLines(\n            state.containerFlow(node, tracker.current()),\n            firstLineBlank ? mapAll : mapExceptFirst\n          )\n      )\n    }\n\n    exit()\n\n    return value\n  }\n}\n\n/** @type {Map} */\nfunction mapExceptFirst(line, index, blank) {\n  return index === 0 ? line : mapAll(line, index, blank)\n}\n\n/** @type {Map} */\nfunction mapAll(line, index, blank) {\n  return (blank ? '' : '    ') + line\n}\n","/**\n * @typedef {import('mdast').Delete} Delete\n *\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n *\n * @typedef {import('mdast-util-to-markdown').ConstructName} ConstructName\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n */\n\n/**\n * List of constructs that occur in phrasing (paragraphs, headings), but cannot\n * contain strikethrough.\n * So they sort of cancel each other out.\n * Note: could use a better name.\n *\n * Note: keep in sync with: \u003chttps://github.com/syntax-tree/mdast-util-to-markdown/blob/8ce8dbf/lib/unsafe.js#L14\u003e\n *\n * @type {Array\u003cConstructName\u003e}\n */\nconst constructsWithoutStrikethrough = [\n  'autolink',\n  'destinationLiteral',\n  'destinationRaw',\n  'reference',\n  'titleQuote',\n  'titleApostrophe'\n]\n\nhandleDelete.peek = peekDelete\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM\n * strikethrough in markdown.\n *\n * @returns {FromMarkdownExtension}\n *   Extension for `mdast-util-from-markdown` to enable GFM strikethrough.\n */\nexport function gfmStrikethroughFromMarkdown() {\n  return {\n    canContainEols: ['delete'],\n    enter: {strikethrough: enterStrikethrough},\n    exit: {strikethrough: exitStrikethrough}\n  }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM\n * strikethrough in markdown.\n *\n * @returns {ToMarkdownExtension}\n *   Extension for `mdast-util-to-markdown` to enable GFM strikethrough.\n */\nexport function gfmStrikethroughToMarkdown() {\n  return {\n    unsafe: [\n      {\n        character: '~',\n        inConstruct: 'phrasing',\n        notInConstruct: constructsWithoutStrikethrough\n      }\n    ],\n    handlers: {delete: handleDelete}\n  }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterStrikethrough(token) {\n  this.enter({type: 'delete', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitStrikethrough(token) {\n  this.exit(token)\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {Delete} node\n */\nfunction handleDelete(node, _, state, info) {\n  const tracker = state.createTracker(info)\n  const exit = state.enter('strikethrough')\n  let value = tracker.move('~~')\n  value += state.containerPhrasing(node, {\n    ...tracker.current(),\n    before: value,\n    after: '~'\n  })\n  value += tracker.move('~~')\n  exit()\n  return value\n}\n\n/** @type {ToMarkdownHandle} */\nfunction peekDelete() {\n  return '~'\n}\n","// To do: next major: remove.\n/**\n * @typedef {Options} MarkdownTableOptions\n *   Configuration.\n */\n\n/**\n * @typedef Options\n *   Configuration.\n * @property {boolean | null | undefined} [alignDelimiters=true]\n *   Whether to align the delimiters (default: `true`);\n *   they are aligned by default:\n *\n *   ```markdown\n *   | Alpha | B     |\n *   | ----- | ----- |\n *   | C     | Delta |\n *   ```\n *\n *   Pass `false` to make them staggered:\n *\n *   ```markdown\n *   | Alpha | B |\n *   | - | - |\n *   | C | Delta |\n *   ```\n * @property {ReadonlyArray\u003cstring | null | undefined\u003e | string | null | undefined} [align]\n *   How to align columns (default: `''`);\n *   one style for all columns or styles for their respective columns;\n *   each style is either `'l'` (left), `'r'` (right), or `'c'` (center);\n *   other values are treated as `''`, which doesn’t place the colon in the\n *   alignment row but does align left;\n *   *only the lowercased first character is used, so `Right` is fine.*\n * @property {boolean | null | undefined} [delimiterEnd=true]\n *   Whether to end each row with the delimiter (default: `true`).\n *\n *   \u003e 👉 **Note**: please don’t use this: it could create fragile structures\n *   \u003e that aren’t understandable to some markdown parsers.\n *\n *   When `true`, there are ending delimiters:\n *\n *   ```markdown\n *   | Alpha | B     |\n *   | ----- | ----- |\n *   | C     | Delta |\n *   ```\n *\n *   When `false`, there are no ending delimiters:\n *\n *   ```markdown\n *   | Alpha | B\n *   | ----- | -----\n *   | C     | Delta\n *   ```\n * @property {boolean | null | undefined} [delimiterStart=true]\n *   Whether to begin each row with the delimiter (default: `true`).\n *\n *   \u003e 👉 **Note**: please don’t use this: it could create fragile structures\n *   \u003e that aren’t understandable to some markdown parsers.\n *\n *   When `true`, there are starting delimiters:\n *\n *   ```markdown\n *   | Alpha | B     |\n *   | ----- | ----- |\n *   | C     | Delta |\n *   ```\n *\n *   When `false`, there are no starting delimiters:\n *\n *   ```markdown\n *   Alpha | B     |\n *   ----- | ----- |\n *   C     | Delta |\n *   ```\n * @property {boolean | null | undefined} [padding=true]\n *   Whether to add a space of padding between delimiters and cells\n *   (default: `true`).\n *\n *   When `true`, there is padding:\n *\n *   ```markdown\n *   | Alpha | B     |\n *   | ----- | ----- |\n *   | C     | Delta |\n *   ```\n *\n *   When `false`, there is no padding:\n *\n *   ```markdown\n *   |Alpha|B    |\n *   |-----|-----|\n *   |C    |Delta|\n *   ```\n * @property {((value: string) =\u003e number) | null | undefined} [stringLength]\n *   Function to detect the length of table cell content (optional);\n *   this is used when aligning the delimiters (`|`) between table cells;\n *   full-width characters and emoji mess up delimiter alignment when viewing\n *   the markdown source;\n *   to fix this, you can pass this function,\n *   which receives the cell content and returns its “visible” size;\n *   note that what is and isn’t visible depends on where the text is displayed.\n *\n *   Without such a function, the following:\n *\n *   ```js\n *   markdownTable([\n *     ['Alpha', 'Bravo'],\n *     ['中文', 'Charlie'],\n *     ['👩‍❤️‍👩', 'Delta']\n *   ])\n *   ```\n *\n *   Yields:\n *\n *   ```markdown\n *   | Alpha | Bravo |\n *   | - | - |\n *   | 中文 | Charlie |\n *   | 👩‍❤️‍👩 | Delta |\n *   ```\n *\n *   With [`string-width`](https://github.com/sindresorhus/string-width):\n *\n *   ```js\n *   import stringWidth from 'string-width'\n *\n *   markdownTable(\n *     [\n *       ['Alpha', 'Bravo'],\n *       ['中文', 'Charlie'],\n *       ['👩‍❤️‍👩', 'Delta']\n *     ],\n *     {stringLength: stringWidth}\n *   )\n *   ```\n *\n *   Yields:\n *\n *   ```markdown\n *   | Alpha | Bravo   |\n *   | ----- | ------- |\n *   | 中文  | Charlie |\n *   | 👩‍❤️‍👩    | Delta   |\n *   ```\n */\n\n/**\n * @param {string} value\n *   Cell value.\n * @returns {number}\n *   Cell size.\n */\nfunction defaultStringLength(value) {\n  return value.length\n}\n\n/**\n * Generate a markdown\n * ([GFM](https://docs.github.com/en/github/writing-on-github/working-with-advanced-formatting/organizing-information-with-tables))\n * table.\n *\n * @param {ReadonlyArray\u003cReadonlyArray\u003cstring | null | undefined\u003e\u003e} table\n *   Table data (matrix of strings).\n * @param {Readonly\u003cOptions\u003e | null | undefined} [options]\n *   Configuration (optional).\n * @returns {string}\n *   Result.\n */\nexport function markdownTable(table, options) {\n  const settings = options || {}\n  // To do: next major: change to spread.\n  const align = (settings.align || []).concat()\n  const stringLength = settings.stringLength || defaultStringLength\n  /** @type {Array\u003cnumber\u003e} Character codes as symbols for alignment per column. */\n  const alignments = []\n  /** @type {Array\u003cArray\u003cstring\u003e\u003e} Cells per row. */\n  const cellMatrix = []\n  /** @type {Array\u003cArray\u003cnumber\u003e\u003e} Sizes of each cell per row. */\n  const sizeMatrix = []\n  /** @type {Array\u003cnumber\u003e} */\n  const longestCellByColumn = []\n  let mostCellsPerRow = 0\n  let rowIndex = -1\n\n  // This is a superfluous loop if we don’t align delimiters, but otherwise we’d\n  // do superfluous work when aligning, so optimize for aligning.\n  while (++rowIndex \u003c table.length) {\n    /** @type {Array\u003cstring\u003e} */\n    const row = []\n    /** @type {Array\u003cnumber\u003e} */\n    const sizes = []\n    let columnIndex = -1\n\n    if (table[rowIndex].length \u003e mostCellsPerRow) {\n      mostCellsPerRow = table[rowIndex].length\n    }\n\n    while (++columnIndex \u003c table[rowIndex].length) {\n      const cell = serialize(table[rowIndex][columnIndex])\n\n      if (settings.alignDelimiters !== false) {\n        const size = stringLength(cell)\n        sizes[columnIndex] = size\n\n        if (\n          longestCellByColumn[columnIndex] === undefined ||\n          size \u003e longestCellByColumn[columnIndex]\n        ) {\n          longestCellByColumn[columnIndex] = size\n        }\n      }\n\n      row.push(cell)\n    }\n\n    cellMatrix[rowIndex] = row\n    sizeMatrix[rowIndex] = sizes\n  }\n\n  // Figure out which alignments to use.\n  let columnIndex = -1\n\n  if (typeof align === 'object' \u0026\u0026 'length' in align) {\n    while (++columnIndex \u003c mostCellsPerRow) {\n      alignments[columnIndex] = toAlignment(align[columnIndex])\n    }\n  } else {\n    const code = toAlignment(align)\n\n    while (++columnIndex \u003c mostCellsPerRow) {\n      alignments[columnIndex] = code\n    }\n  }\n\n  // Inject the alignment row.\n  columnIndex = -1\n  /** @type {Array\u003cstring\u003e} */\n  const row = []\n  /** @type {Array\u003cnumber\u003e} */\n  const sizes = []\n\n  while (++columnIndex \u003c mostCellsPerRow) {\n    const code = alignments[columnIndex]\n    let before = ''\n    let after = ''\n\n    if (code === 99 /* `c` */) {\n      before = ':'\n      after = ':'\n    } else if (code === 108 /* `l` */) {\n      before = ':'\n    } else if (code === 114 /* `r` */) {\n      after = ':'\n    }\n\n    // There *must* be at least one hyphen-minus in each alignment cell.\n    let size =\n      settings.alignDelimiters === false\n        ? 1\n        : Math.max(\n            1,\n            longestCellByColumn[columnIndex] - before.length - after.length\n          )\n\n    const cell = before + '-'.repeat(size) + after\n\n    if (settings.alignDelimiters !== false) {\n      size = before.length + size + after.length\n\n      if (size \u003e longestCellByColumn[columnIndex]) {\n        longestCellByColumn[columnIndex] = size\n      }\n\n      sizes[columnIndex] = size\n    }\n\n    row[columnIndex] = cell\n  }\n\n  // Inject the alignment row.\n  cellMatrix.splice(1, 0, row)\n  sizeMatrix.splice(1, 0, sizes)\n\n  rowIndex = -1\n  /** @type {Array\u003cstring\u003e} */\n  const lines = []\n\n  while (++rowIndex \u003c cellMatrix.length) {\n    const row = cellMatrix[rowIndex]\n    const sizes = sizeMatrix[rowIndex]\n    columnIndex = -1\n    /** @type {Array\u003cstring\u003e} */\n    const line = []\n\n    while (++columnIndex \u003c mostCellsPerRow) {\n      const cell = row[columnIndex] || ''\n      let before = ''\n      let after = ''\n\n      if (settings.alignDelimiters !== false) {\n        const size =\n          longestCellByColumn[columnIndex] - (sizes[columnIndex] || 0)\n        const code = alignments[columnIndex]\n\n        if (code === 114 /* `r` */) {\n          before = ' '.repeat(size)\n        } else if (code === 99 /* `c` */) {\n          if (size % 2) {\n            before = ' '.repeat(size / 2 + 0.5)\n            after = ' '.repeat(size / 2 - 0.5)\n          } else {\n            before = ' '.repeat(size / 2)\n            after = before\n          }\n        } else {\n          after = ' '.repeat(size)\n        }\n      }\n\n      if (settings.delimiterStart !== false \u0026\u0026 !columnIndex) {\n        line.push('|')\n      }\n\n      if (\n        settings.padding !== false \u0026\u0026\n        // Don’t add the opening space if we’re not aligning and the cell is\n        // empty: there will be a closing space.\n        !(settings.alignDelimiters === false \u0026\u0026 cell === '') \u0026\u0026\n        (settings.delimiterStart !== false || columnIndex)\n      ) {\n        line.push(' ')\n      }\n\n      if (settings.alignDelimiters !== false) {\n        line.push(before)\n      }\n\n      line.push(cell)\n\n      if (settings.alignDelimiters !== false) {\n        line.push(after)\n      }\n\n      if (settings.padding !== false) {\n        line.push(' ')\n      }\n\n      if (\n        settings.delimiterEnd !== false ||\n        columnIndex !== mostCellsPerRow - 1\n      ) {\n        line.push('|')\n      }\n    }\n\n    lines.push(\n      settings.delimiterEnd === false\n        ? line.join('').replace(/ +$/, '')\n        : line.join('')\n    )\n  }\n\n  return lines.join('\\n')\n}\n\n/**\n * @param {string | null | undefined} [value]\n *   Value to serialize.\n * @returns {string}\n *   Result.\n */\nfunction serialize(value) {\n  return value === null || value === undefined ? '' : String(value)\n}\n\n/**\n * @param {string | null | undefined} value\n *   Value.\n * @returns {number}\n *   Alignment.\n */\nfunction toAlignment(value) {\n  const code = typeof value === 'string' ? value.codePointAt(0) : 0\n\n  return code === 67 /* `C` */ || code === 99 /* `c` */\n    ? 99 /* `c` */\n    : code === 76 /* `L` */ || code === 108 /* `l` */\n      ? 108 /* `l` */\n      : code === 82 /* `R` */ || code === 114 /* `r` */\n        ? 114 /* `r` */\n        : 0\n}\n","/**\n * @import {Blockquote, Parents} from 'mdast'\n * @import {Info, Map, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {Blockquote} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function blockquote(node, _, state, info) {\n  const exit = state.enter('blockquote')\n  const tracker = state.createTracker(info)\n  tracker.move('\u003e ')\n  tracker.shift(2)\n  const value = state.indentLines(\n    state.containerFlow(node, tracker.current()),\n    map\n  )\n  exit()\n  return value\n}\n\n/** @type {Map} */\nfunction map(line, _, blank) {\n  return '\u003e' + (blank ? '' : ' ') + line\n}\n","/**\n * @import {ConstructName, Unsafe} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {Array\u003cConstructName\u003e} stack\n * @param {Unsafe} pattern\n * @returns {boolean}\n */\nexport function patternInScope(stack, pattern) {\n  return (\n    listInScope(stack, pattern.inConstruct, true) \u0026\u0026\n    !listInScope(stack, pattern.notInConstruct, false)\n  )\n}\n\n/**\n * @param {Array\u003cConstructName\u003e} stack\n * @param {Unsafe['inConstruct']} list\n * @param {boolean} none\n * @returns {boolean}\n */\nfunction listInScope(stack, list, none) {\n  if (typeof list === 'string') {\n    list = [list]\n  }\n\n  if (!list || list.length === 0) {\n    return none\n  }\n\n  let index = -1\n\n  while (++index \u003c list.length) {\n    if (stack.includes(list[index])) {\n      return true\n    }\n  }\n\n  return false\n}\n","/**\n * @import {Break, Parents} from 'mdast'\n * @import {Info, State} from 'mdast-util-to-markdown'\n */\n\nimport {patternInScope} from '../util/pattern-in-scope.js'\n\n/**\n * @param {Break} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function hardBreak(_, _1, state, info) {\n  let index = -1\n\n  while (++index \u003c state.unsafe.length) {\n    // If we can’t put eols in this construct (setext headings, tables), use a\n    // space instead.\n    if (\n      state.unsafe[index].character === '\\n' \u0026\u0026\n      patternInScope(state.stack, state.unsafe[index])\n    ) {\n      return /[ \\t]/.test(info.before) ? '' : ' '\n    }\n  }\n\n  return '\\\\\\n'\n}\n","/**\n * Get the count of the longest repeating streak of `substring` in `value`.\n *\n * @param {string} value\n *   Content to search in.\n * @param {string} substring\n *   Substring to look for, typically one character.\n * @returns {number}\n *   Count of most frequent adjacent `substring`s in `value`.\n */\nexport function longestStreak(value, substring) {\n  const source = String(value)\n  let index = source.indexOf(substring)\n  let expected = index\n  let count = 0\n  let max = 0\n\n  if (typeof substring !== 'string') {\n    throw new TypeError('Expected substring')\n  }\n\n  while (index !== -1) {\n    if (index === expected) {\n      if (++count \u003e max) {\n        max = count\n      }\n    } else {\n      count = 1\n    }\n\n    expected = index + substring.length\n    index = source.indexOf(substring, expected)\n  }\n\n  return max\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Code} from 'mdast'\n */\n\n/**\n * @param {Code} node\n * @param {State} state\n * @returns {boolean}\n */\nexport function formatCodeAsIndented(node, state) {\n  return Boolean(\n    state.options.fences === false \u0026\u0026\n      node.value \u0026\u0026\n      // If there’s no info…\n      !node.lang \u0026\u0026\n      // And there’s a non-whitespace character…\n      /[^ \\r\\n]/.test(node.value) \u0026\u0026\n      // And the value doesn’t start or end in a blank…\n      !/^[\\t ]*(?:[\\r\\n]|$)|(?:^|[\\r\\n])[\\t ]*$/.test(node.value)\n  )\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude\u003cOptions['fence'], null | undefined\u003e}\n */\nexport function checkFence(state) {\n  const marker = state.options.fence || '`'\n\n  if (marker !== '`' \u0026\u0026 marker !== '~') {\n    throw new Error(\n      'Cannot serialize code with `' +\n        marker +\n        '` for `options.fence`, expected `` ` `` or `~`'\n    )\n  }\n\n  return marker\n}\n","/**\n * @import {Info, Map, State} from 'mdast-util-to-markdown'\n * @import {Code, Parents} from 'mdast'\n */\n\nimport {longestStreak} from 'longest-streak'\nimport {formatCodeAsIndented} from '../util/format-code-as-indented.js'\nimport {checkFence} from '../util/check-fence.js'\n\n/**\n * @param {Code} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function code(node, _, state, info) {\n  const marker = checkFence(state)\n  const raw = node.value || ''\n  const suffix = marker === '`' ? 'GraveAccent' : 'Tilde'\n\n  if (formatCodeAsIndented(node, state)) {\n    const exit = state.enter('codeIndented')\n    const value = state.indentLines(raw, map)\n    exit()\n    return value\n  }\n\n  const tracker = state.createTracker(info)\n  const sequence = marker.repeat(Math.max(longestStreak(raw, marker) + 1, 3))\n  const exit = state.enter('codeFenced')\n  let value = tracker.move(sequence)\n\n  if (node.lang) {\n    const subexit = state.enter(`codeFencedLang${suffix}`)\n    value += tracker.move(\n      state.safe(node.lang, {\n        before: value,\n        after: ' ',\n        encode: ['`'],\n        ...tracker.current()\n      })\n    )\n    subexit()\n  }\n\n  if (node.lang \u0026\u0026 node.meta) {\n    const subexit = state.enter(`codeFencedMeta${suffix}`)\n    value += tracker.move(' ')\n    value += tracker.move(\n      state.safe(node.meta, {\n        before: value,\n        after: '\\n',\n        encode: ['`'],\n        ...tracker.current()\n      })\n    )\n    subexit()\n  }\n\n  value += tracker.move('\\n')\n\n  if (raw) {\n    value += tracker.move(raw + '\\n')\n  }\n\n  value += tracker.move(sequence)\n  exit()\n  return value\n}\n\n/** @type {Map} */\nfunction map(line, _, blank) {\n  return (blank ? '' : '    ') + line\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude\u003cOptions['quote'], null | undefined\u003e}\n */\nexport function checkQuote(state) {\n  const marker = state.options.quote || '\"'\n\n  if (marker !== '\"' \u0026\u0026 marker !== \"'\") {\n    throw new Error(\n      'Cannot serialize title with `' +\n        marker +\n        '` for `options.quote`, expected `\"`, or `\\'`'\n    )\n  }\n\n  return marker\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Definition, Parents} from 'mdast'\n */\n\nimport {checkQuote} from '../util/check-quote.js'\n\n/**\n * @param {Definition} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function definition(node, _, state, info) {\n  const quote = checkQuote(state)\n  const suffix = quote === '\"' ? 'Quote' : 'Apostrophe'\n  const exit = state.enter('definition')\n  let subexit = state.enter('label')\n  const tracker = state.createTracker(info)\n  let value = tracker.move('[')\n  value += tracker.move(\n    state.safe(state.associationId(node), {\n      before: value,\n      after: ']',\n      ...tracker.current()\n    })\n  )\n  value += tracker.move(']: ')\n\n  subexit()\n\n  if (\n    // If there’s no url, or…\n    !node.url ||\n    // If there are control characters or whitespace.\n    /[\\0- \\u007F]/.test(node.url)\n  ) {\n    subexit = state.enter('destinationLiteral')\n    value += tracker.move('\u003c')\n    value += tracker.move(\n      state.safe(node.url, {before: value, after: '\u003e', ...tracker.current()})\n    )\n    value += tracker.move('\u003e')\n  } else {\n    // No whitespace, raw is prettier.\n    subexit = state.enter('destinationRaw')\n    value += tracker.move(\n      state.safe(node.url, {\n        before: value,\n        after: node.title ? ' ' : '\\n',\n        ...tracker.current()\n      })\n    )\n  }\n\n  subexit()\n\n  if (node.title) {\n    subexit = state.enter(`title${suffix}`)\n    value += tracker.move(' ' + quote)\n    value += tracker.move(\n      state.safe(node.title, {\n        before: value,\n        after: quote,\n        ...tracker.current()\n      })\n    )\n    value += tracker.move(quote)\n    subexit()\n  }\n\n  exit()\n\n  return value\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude\u003cOptions['emphasis'], null | undefined\u003e}\n */\nexport function checkEmphasis(state) {\n  const marker = state.options.emphasis || '*'\n\n  if (marker !== '*' \u0026\u0026 marker !== '_') {\n    throw new Error(\n      'Cannot serialize emphasis with `' +\n        marker +\n        '` for `options.emphasis`, expected `*`, or `_`'\n    )\n  }\n\n  return marker\n}\n","/**\n * Encode a code point as a character reference.\n *\n * @param {number} code\n *   Code point to encode.\n * @returns {string}\n *   Encoded character reference.\n */\nexport function encodeCharacterReference(code) {\n  return '\u0026#x' + code.toString(16).toUpperCase() + ';'\n}\n","/**\n * @import {Code} from 'micromark-util-types'\n */\n\nimport { markdownLineEndingOrSpace, unicodePunctuation, unicodeWhitespace } from 'micromark-util-character';\n/**\n * Classify whether a code represents whitespace, punctuation, or something\n * else.\n *\n * Used for attention (emphasis, strong), whose sequences can open or close\n * based on the class of surrounding characters.\n *\n * \u003e 👉 **Note**: eof (`null`) is seen as whitespace.\n *\n * @param {Code} code\n *   Code.\n * @returns {typeof constants.characterGroupWhitespace | typeof constants.characterGroupPunctuation | undefined}\n *   Group.\n */\nexport function classifyCharacter(code) {\n  if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n    return 1;\n  }\n  if (unicodePunctuation(code)) {\n    return 2;\n  }\n}","/**\n * @import {EncodeSides} from '../types.js'\n */\n\nimport {classifyCharacter} from 'micromark-util-classify-character'\n\n/**\n * Check whether to encode (as a character reference) the characters\n * surrounding an attention run.\n *\n * Which characters are around an attention run influence whether it works or\n * not.\n *\n * See \u003chttps://github.com/orgs/syntax-tree/discussions/60\u003e for more info.\n * See this markdown in a particular renderer to see what works:\n *\n * ```markdown\n * |                         | A (letter inside) | B (punctuation inside) | C (whitespace inside) | D (nothing inside) |\n * | ----------------------- | ----------------- | ---------------------- | --------------------- | ------------------ |\n * | 1 (letter outside)      | x*y*z             | x*.*z                  | x* *z                 | x**z               |\n * | 2 (punctuation outside) | .*y*.             | .*.*.                  | .* *.                 | .**.               |\n * | 3 (whitespace outside)  | x *y* z           | x *.* z                | x * * z               | x ** z             |\n * | 4 (nothing outside)     | *x*               | *.*                    | * *                   | **                 |\n * ```\n *\n * @param {number} outside\n *   Code point on the outer side of the run.\n * @param {number} inside\n *   Code point on the inner side of the run.\n * @param {'*' | '_'} marker\n *   Marker of the run.\n *   Underscores are handled more strictly (they form less often) than\n *   asterisks.\n * @returns {EncodeSides}\n *   Whether to encode characters.\n */\n// Important: punctuation must never be encoded.\n// Punctuation is solely used by markdown constructs.\n// And by encoding itself.\n// Encoding them will break constructs or double encode things.\nexport function encodeInfo(outside, inside, marker) {\n  const outsideKind = classifyCharacter(outside)\n  const insideKind = classifyCharacter(inside)\n\n  // Letter outside:\n  if (outsideKind === undefined) {\n    return insideKind === undefined\n      ? // Letter inside:\n        // we have to encode *both* letters for `_` as it is looser.\n        // it already forms for `*` (and GFMs `~`).\n        marker === '_'\n        ? {inside: true, outside: true}\n        : {inside: false, outside: false}\n      : insideKind === 1\n        ? // Whitespace inside: encode both (letter, whitespace).\n          {inside: true, outside: true}\n        : // Punctuation inside: encode outer (letter)\n          {inside: false, outside: true}\n  }\n\n  // Whitespace outside:\n  if (outsideKind === 1) {\n    return insideKind === undefined\n      ? // Letter inside: already forms.\n        {inside: false, outside: false}\n      : insideKind === 1\n        ? // Whitespace inside: encode both (whitespace).\n          {inside: true, outside: true}\n        : // Punctuation inside: already forms.\n          {inside: false, outside: false}\n  }\n\n  // Punctuation outside:\n  return insideKind === undefined\n    ? // Letter inside: already forms.\n      {inside: false, outside: false}\n    : insideKind === 1\n      ? // Whitespace inside: encode inner (whitespace).\n        {inside: true, outside: false}\n      : // Punctuation inside: already forms.\n        {inside: false, outside: false}\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Emphasis, Parents} from 'mdast'\n */\n\nimport {checkEmphasis} from '../util/check-emphasis.js'\nimport {encodeCharacterReference} from '../util/encode-character-reference.js'\nimport {encodeInfo} from '../util/encode-info.js'\n\nemphasis.peek = emphasisPeek\n\n/**\n * @param {Emphasis} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function emphasis(node, _, state, info) {\n  const marker = checkEmphasis(state)\n  const exit = state.enter('emphasis')\n  const tracker = state.createTracker(info)\n  const before = tracker.move(marker)\n\n  let between = tracker.move(\n    state.containerPhrasing(node, {\n      after: marker,\n      before,\n      ...tracker.current()\n    })\n  )\n  const betweenHead = between.charCodeAt(0)\n  const open = encodeInfo(\n    info.before.charCodeAt(info.before.length - 1),\n    betweenHead,\n    marker\n  )\n\n  if (open.inside) {\n    between = encodeCharacterReference(betweenHead) + between.slice(1)\n  }\n\n  const betweenTail = between.charCodeAt(between.length - 1)\n  const close = encodeInfo(info.after.charCodeAt(0), betweenTail, marker)\n\n  if (close.inside) {\n    between = between.slice(0, -1) + encodeCharacterReference(betweenTail)\n  }\n\n  const after = tracker.move(marker)\n\n  exit()\n\n  state.attentionEncodeSurroundingInfo = {\n    after: close.outside,\n    before: open.outside\n  }\n  return before + between + after\n}\n\n/**\n * @param {Emphasis} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @returns {string}\n */\nfunction emphasisPeek(_, _1, state) {\n  return state.options.emphasis || '*'\n}\n","/**\n * @import {Node as UnistNode, Parent as UnistParent} from 'unist'\n * @import {VisitorResult} from 'unist-util-visit-parents'\n */\n\n/**\n * @typedef {Exclude\u003cimport('unist-util-is').Test, undefined\u003e | undefined} Test\n *   Test from `unist-util-is`.\n *\n *   Note: we have remove and add `undefined`, because otherwise when generating\n *   automatic `.d.ts` files, TS tries to flatten paths from a local perspective,\n *   which doesn’t work when publishing on npm.\n */\n\n// To do: use types from `unist-util-visit-parents` when it’s released.\n\n/**\n * @typedef {(\n *   Fn extends (value: any) =\u003e value is infer Thing\n *   ? Thing\n *   : Fallback\n * )} Predicate\n *   Get the value of a type guard `Fn`.\n * @template Fn\n *   Value; typically function that is a type guard (such as `(x): x is Y`).\n * @template Fallback\n *   Value to yield if `Fn` is not a type guard.\n */\n\n/**\n * @typedef {(\n *   Check extends null | undefined // No test.\n *   ? Value\n *   : Value extends {type: Check} // String (type) test.\n *   ? Value\n *   : Value extends Check // Partial test.\n *   ? Value\n *   : Check extends Function // Function test.\n *   ? Predicate\u003cCheck, Value\u003e extends Value\n *     ? Predicate\u003cCheck, Value\u003e\n *     : never\n *   : never // Some other test?\n * )} MatchesOne\n *   Check whether a node matches a primitive check in the type system.\n * @template Value\n *   Value; typically unist `Node`.\n * @template Check\n *   Value; typically `unist-util-is`-compatible test, but not arrays.\n */\n\n/**\n * @typedef {(\n *   Check extends ReadonlyArray\u003cany\u003e\n *   ? MatchesOne\u003cValue, Check[number]\u003e\n *   : MatchesOne\u003cValue, Check\u003e\n * )} Matches\n *   Check whether a node matches a check in the type system.\n * @template Value\n *   Value; typically unist `Node`.\n * @template Check\n *   Value; typically `unist-util-is`-compatible test.\n */\n\n/**\n * @typedef {0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10} Uint\n *   Number; capped reasonably.\n */\n\n/**\n * @typedef {I extends 0 ? 1 : I extends 1 ? 2 : I extends 2 ? 3 : I extends 3 ? 4 : I extends 4 ? 5 : I extends 5 ? 6 : I extends 6 ? 7 : I extends 7 ? 8 : I extends 8 ? 9 : 10} Increment\n *   Increment a number in the type system.\n * @template {Uint} [I=0]\n *   Index.\n */\n\n/**\n * @typedef {(\n *   Node extends UnistParent\n *   ? Node extends {children: Array\u003cinfer Children\u003e}\n *     ? Child extends Children ? Node : never\n *     : never\n *   : never\n * )} InternalParent\n *   Collect nodes that can be parents of `Child`.\n * @template {UnistNode} Node\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n */\n\n/**\n * @typedef {InternalParent\u003cInclusiveDescendant\u003cTree\u003e, Child\u003e} Parent\n *   Collect nodes in `Tree` that can be parents of `Child`.\n * @template {UnistNode} Tree\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n */\n\n/**\n * @typedef {(\n *   Depth extends Max\n *   ? never\n *   :\n *     | InternalParent\u003cNode, Child\u003e\n *     | InternalAncestor\u003cNode, InternalParent\u003cNode, Child\u003e, Max, Increment\u003cDepth\u003e\u003e\n * )} InternalAncestor\n *   Collect nodes in `Tree` that can be ancestors of `Child`.\n * @template {UnistNode} Node\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n * @template {Uint} [Max=10]\n *   Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n *   Current depth.\n */\n\n/**\n * @typedef {(\n *   Tree extends UnistParent\n *     ? Depth extends Max\n *       ? Tree\n *       : Tree | InclusiveDescendant\u003cTree['children'][number], Max, Increment\u003cDepth\u003e\u003e\n *     : Tree\n * )} InclusiveDescendant\n *   Collect all (inclusive) descendants of `Tree`.\n *\n *   \u003e 👉 **Note**: for performance reasons, this seems to be the fastest way to\n *   \u003e recurse without actually running into an infinite loop, which the\n *   \u003e previous version did.\n *   \u003e\n *   \u003e Practically, a max of `2` is typically enough assuming a `Root` is\n *   \u003e passed, but it doesn’t improve performance.\n *   \u003e It gets higher with `List \u003e ListItem \u003e Table \u003e TableRow \u003e TableCell`.\n *   \u003e Using up to `10` doesn’t hurt or help either.\n * @template {UnistNode} Tree\n *   Tree type.\n * @template {Uint} [Max=10]\n *   Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n *   Current depth.\n */\n\n/**\n * @callback Visitor\n *   Handle a node (matching `test`, if given).\n *\n *   Visitors are free to transform `node`.\n *   They can also transform `parent`.\n *\n *   Replacing `node` itself, if `SKIP` is not returned, still causes its\n *   descendants to be walked (which is a bug).\n *\n *   When adding or removing previous siblings of `node` (or next siblings, in\n *   case of reverse), the `Visitor` should return a new `Index` to specify the\n *   sibling to traverse after `node` is traversed.\n *   Adding or removing next siblings of `node` (or previous siblings, in case\n *   of reverse) is handled as expected without needing to return a new `Index`.\n *\n *   Removing the children property of `parent` still results in them being\n *   traversed.\n * @param {Visited} node\n *   Found node.\n * @param {Visited extends UnistNode ? number | undefined : never} index\n *   Index of `node` in `parent`.\n * @param {Ancestor extends UnistParent ? Ancestor | undefined : never} parent\n *   Parent of `node`.\n * @returns {VisitorResult}\n *   What to do next.\n *\n *   An `Index` is treated as a tuple of `[CONTINUE, Index]`.\n *   An `Action` is treated as a tuple of `[Action]`.\n *\n *   Passing a tuple back only makes sense if the `Action` is `SKIP`.\n *   When the `Action` is `EXIT`, that action can be returned.\n *   When the `Action` is `CONTINUE`, `Index` can be returned.\n * @template {UnistNode} [Visited=UnistNode]\n *   Visited node type.\n * @template {UnistParent} [Ancestor=UnistParent]\n *   Ancestor type.\n */\n\n/**\n * @typedef {Visitor\u003cVisited, Parent\u003cAncestor, Visited\u003e\u003e} BuildVisitorFromMatch\n *   Build a typed `Visitor` function from a node and all possible parents.\n *\n *   It will infer which values are passed as `node` and which as `parent`.\n * @template {UnistNode} Visited\n *   Node type.\n * @template {UnistParent} Ancestor\n *   Parent type.\n */\n\n/**\n * @typedef {(\n *   BuildVisitorFromMatch\u003c\n *     Matches\u003cDescendant, Check\u003e,\n *     Extract\u003cDescendant, UnistParent\u003e\n *   \u003e\n * )} BuildVisitorFromDescendants\n *   Build a typed `Visitor` function from a list of descendants and a test.\n *\n *   It will infer which values are passed as `node` and which as `parent`.\n * @template {UnistNode} Descendant\n *   Node type.\n * @template {Test} Check\n *   Test type.\n */\n\n/**\n * @typedef {(\n *   BuildVisitorFromDescendants\u003c\n *     InclusiveDescendant\u003cTree\u003e,\n *     Check\n *   \u003e\n * )} BuildVisitor\n *   Build a typed `Visitor` function from a tree and a test.\n *\n *   It will infer which values are passed as `node` and which as `parent`.\n * @template {UnistNode} [Tree=UnistNode]\n *   Node type.\n * @template {Test} [Check=Test]\n *   Test type.\n */\n\nimport {visitParents} from 'unist-util-visit-parents'\n\nexport {CONTINUE, EXIT, SKIP} from 'unist-util-visit-parents'\n\n/**\n * Visit nodes.\n *\n * This algorithm performs *depth-first* *tree traversal* in *preorder*\n * (**NLR**) or if `reverse` is given, in *reverse preorder* (**NRL**).\n *\n * You can choose for which nodes `visitor` is called by passing a `test`.\n * For complex tests, you should test yourself in `visitor`, as it will be\n * faster and will have improved type information.\n *\n * Walking the tree is an intensive task.\n * Make use of the return values of the visitor when possible.\n * Instead of walking a tree multiple times, walk it once, use `unist-util-is`\n * to check if a node matches, and then perform different operations.\n *\n * You can change the tree.\n * See `Visitor` for more info.\n *\n * @overload\n * @param {Tree} tree\n * @param {Check} check\n * @param {BuildVisitor\u003cTree, Check\u003e} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @overload\n * @param {Tree} tree\n * @param {BuildVisitor\u003cTree\u003e} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @param {UnistNode} tree\n *   Tree to traverse.\n * @param {Visitor | Test} testOrVisitor\n *   `unist-util-is`-compatible test (optional, omit to pass a visitor).\n * @param {Visitor | boolean | null | undefined} [visitorOrReverse]\n *   Handle each node (when test is omitted, pass `reverse`).\n * @param {boolean | null | undefined} [maybeReverse=false]\n *   Traverse in reverse preorder (NRL) instead of the default preorder (NLR).\n * @returns {undefined}\n *   Nothing.\n *\n * @template {UnistNode} Tree\n *   Node type.\n * @template {Test} Check\n *   `unist-util-is`-compatible test.\n */\nexport function visit(tree, testOrVisitor, visitorOrReverse, maybeReverse) {\n  /** @type {boolean | null | undefined} */\n  let reverse\n  /** @type {Test} */\n  let test\n  /** @type {Visitor} */\n  let visitor\n\n  if (\n    typeof testOrVisitor === 'function' \u0026\u0026\n    typeof visitorOrReverse !== 'function'\n  ) {\n    test = undefined\n    visitor = testOrVisitor\n    reverse = visitorOrReverse\n  } else {\n    // @ts-expect-error: assume the overload with test was given.\n    test = testOrVisitor\n    // @ts-expect-error: assume the overload with test was given.\n    visitor = visitorOrReverse\n    reverse = maybeReverse\n  }\n\n  visitParents(tree, test, overload, reverse)\n\n  /**\n   * @param {UnistNode} node\n   * @param {Array\u003cUnistParent\u003e} parents\n   */\n  function overload(node, parents) {\n    const parent = parents[parents.length - 1]\n    const index = parent ? parent.children.indexOf(node) : undefined\n    return visitor(node, index, parent)\n  }\n}\n","/**\n * @typedef {import('mdast').Nodes} Nodes\n *\n * @typedef Options\n *   Configuration (optional).\n * @property {boolean | null | undefined} [includeImageAlt=true]\n *   Whether to use `alt` for `image`s (default: `true`).\n * @property {boolean | null | undefined} [includeHtml=true]\n *   Whether to use `value` of HTML (default: `true`).\n */\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Get the text content of a node or list of nodes.\n *\n * Prefers the node’s plain-text fields, otherwise serializes its children,\n * and if the given value is an array, serialize the nodes in it.\n *\n * @param {unknown} [value]\n *   Thing to serialize, typically `Node`.\n * @param {Options | null | undefined} [options]\n *   Configuration (optional).\n * @returns {string}\n *   Serialized `value`.\n */\nexport function toString(value, options) {\n  const settings = options || emptyOptions\n  const includeImageAlt =\n    typeof settings.includeImageAlt === 'boolean'\n      ? settings.includeImageAlt\n      : true\n  const includeHtml =\n    typeof settings.includeHtml === 'boolean' ? settings.includeHtml : true\n\n  return one(value, includeImageAlt, includeHtml)\n}\n\n/**\n * One node or several nodes.\n *\n * @param {unknown} value\n *   Thing to serialize.\n * @param {boolean} includeImageAlt\n *   Include image `alt`s.\n * @param {boolean} includeHtml\n *   Include HTML.\n * @returns {string}\n *   Serialized node.\n */\nfunction one(value, includeImageAlt, includeHtml) {\n  if (node(value)) {\n    if ('value' in value) {\n      return value.type === 'html' \u0026\u0026 !includeHtml ? '' : value.value\n    }\n\n    if (includeImageAlt \u0026\u0026 'alt' in value \u0026\u0026 value.alt) {\n      return value.alt\n    }\n\n    if ('children' in value) {\n      return all(value.children, includeImageAlt, includeHtml)\n    }\n  }\n\n  if (Array.isArray(value)) {\n    return all(value, includeImageAlt, includeHtml)\n  }\n\n  return ''\n}\n\n/**\n * Serialize a list of nodes.\n *\n * @param {Array\u003cunknown\u003e} values\n *   Thing to serialize.\n * @param {boolean} includeImageAlt\n *   Include image `alt`s.\n * @param {boolean} includeHtml\n *   Include HTML.\n * @returns {string}\n *   Serialized nodes.\n */\nfunction all(values, includeImageAlt, includeHtml) {\n  /** @type {Array\u003cstring\u003e} */\n  const result = []\n  let index = -1\n\n  while (++index \u003c values.length) {\n    result[index] = one(values[index], includeImageAlt, includeHtml)\n  }\n\n  return result.join('')\n}\n\n/**\n * Check if `value` looks like a node.\n *\n * @param {unknown} value\n *   Thing.\n * @returns {value is Nodes}\n *   Whether `value` is a node.\n */\nfunction node(value) {\n  return Boolean(value \u0026\u0026 typeof value === 'object')\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Heading} from 'mdast'\n */\n\nimport {EXIT, visit} from 'unist-util-visit'\nimport {toString} from 'mdast-util-to-string'\n\n/**\n * @param {Heading} node\n * @param {State} state\n * @returns {boolean}\n */\nexport function formatHeadingAsSetext(node, state) {\n  let literalWithBreak = false\n\n  // Look for literals with a line break.\n  // Note that this also\n  visit(node, function (node) {\n    if (\n      ('value' in node \u0026\u0026 /\\r?\\n|\\r/.test(node.value)) ||\n      node.type === 'break'\n    ) {\n      literalWithBreak = true\n      return EXIT\n    }\n  })\n\n  return Boolean(\n    (!node.depth || node.depth \u003c 3) \u0026\u0026\n      toString(node) \u0026\u0026\n      (state.options.setext || literalWithBreak)\n  )\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Heading, Parents} from 'mdast'\n */\n\nimport {encodeCharacterReference} from '../util/encode-character-reference.js'\nimport {formatHeadingAsSetext} from '../util/format-heading-as-setext.js'\n\n/**\n * @param {Heading} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function heading(node, _, state, info) {\n  const rank = Math.max(Math.min(6, node.depth || 1), 1)\n  const tracker = state.createTracker(info)\n\n  if (formatHeadingAsSetext(node, state)) {\n    const exit = state.enter('headingSetext')\n    const subexit = state.enter('phrasing')\n    const value = state.containerPhrasing(node, {\n      ...tracker.current(),\n      before: '\\n',\n      after: '\\n'\n    })\n    subexit()\n    exit()\n\n    return (\n      value +\n      '\\n' +\n      (rank === 1 ? '=' : '-').repeat(\n        // The whole size…\n        value.length -\n          // Minus the position of the character after the last EOL (or\n          // 0 if there is none)…\n          (Math.max(value.lastIndexOf('\\r'), value.lastIndexOf('\\n')) + 1)\n      )\n    )\n  }\n\n  const sequence = '#'.repeat(rank)\n  const exit = state.enter('headingAtx')\n  const subexit = state.enter('phrasing')\n\n  // Note: for proper tracking, we should reset the output positions when there\n  // is no content returned, because then the space is not output.\n  // Practically, in that case, there is no content, so it doesn’t matter that\n  // we’ve tracked one too many characters.\n  tracker.move(sequence + ' ')\n\n  let value = state.containerPhrasing(node, {\n    before: '# ',\n    after: '\\n',\n    ...tracker.current()\n  })\n\n  if (/^[\\t ]/.test(value)) {\n    // To do: what effect has the character reference on tracking?\n    value = encodeCharacterReference(value.charCodeAt(0)) + value.slice(1)\n  }\n\n  value = value ? sequence + ' ' + value : sequence\n\n  if (state.options.closeAtx) {\n    value += ' ' + sequence\n  }\n\n  subexit()\n  exit()\n\n  return value\n}\n","/**\n * @import {Html} from 'mdast'\n */\n\nhtml.peek = htmlPeek\n\n/**\n * @param {Html} node\n * @returns {string}\n */\nexport function html(node) {\n  return node.value || ''\n}\n\n/**\n * @returns {string}\n */\nfunction htmlPeek() {\n  return '\u003c'\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Image, Parents} from 'mdast'\n */\n\nimport {checkQuote} from '../util/check-quote.js'\n\nimage.peek = imagePeek\n\n/**\n * @param {Image} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function image(node, _, state, info) {\n  const quote = checkQuote(state)\n  const suffix = quote === '\"' ? 'Quote' : 'Apostrophe'\n  const exit = state.enter('image')\n  let subexit = state.enter('label')\n  const tracker = state.createTracker(info)\n  let value = tracker.move('![')\n  value += tracker.move(\n    state.safe(node.alt, {before: value, after: ']', ...tracker.current()})\n  )\n  value += tracker.move('](')\n\n  subexit()\n\n  if (\n    // If there’s no url but there is a title…\n    (!node.url \u0026\u0026 node.title) ||\n    // If there are control characters or whitespace.\n    /[\\0- \\u007F]/.test(node.url)\n  ) {\n    subexit = state.enter('destinationLiteral')\n    value += tracker.move('\u003c')\n    value += tracker.move(\n      state.safe(node.url, {before: value, after: '\u003e', ...tracker.current()})\n    )\n    value += tracker.move('\u003e')\n  } else {\n    // No whitespace, raw is prettier.\n    subexit = state.enter('destinationRaw')\n    value += tracker.move(\n      state.safe(node.url, {\n        before: value,\n        after: node.title ? ' ' : ')',\n        ...tracker.current()\n      })\n    )\n  }\n\n  subexit()\n\n  if (node.title) {\n    subexit = state.enter(`title${suffix}`)\n    value += tracker.move(' ' + quote)\n    value += tracker.move(\n      state.safe(node.title, {\n        before: value,\n        after: quote,\n        ...tracker.current()\n      })\n    )\n    value += tracker.move(quote)\n    subexit()\n  }\n\n  value += tracker.move(')')\n  exit()\n\n  return value\n}\n\n/**\n * @returns {string}\n */\nfunction imagePeek() {\n  return '!'\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {ImageReference, Parents} from 'mdast'\n */\n\nimageReference.peek = imageReferencePeek\n\n/**\n * @param {ImageReference} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function imageReference(node, _, state, info) {\n  const type = node.referenceType\n  const exit = state.enter('imageReference')\n  let subexit = state.enter('label')\n  const tracker = state.createTracker(info)\n  let value = tracker.move('![')\n  const alt = state.safe(node.alt, {\n    before: value,\n    after: ']',\n    ...tracker.current()\n  })\n  value += tracker.move(alt + '][')\n\n  subexit()\n  // Hide the fact that we’re in phrasing, because escapes don’t work.\n  const stack = state.stack\n  state.stack = []\n  subexit = state.enter('reference')\n  // Note: for proper tracking, we should reset the output positions when we end\n  // up making a `shortcut` reference, because then there is no brace output.\n  // Practically, in that case, there is no content, so it doesn’t matter that\n  // we’ve tracked one too many characters.\n  const reference = state.safe(state.associationId(node), {\n    before: value,\n    after: ']',\n    ...tracker.current()\n  })\n  subexit()\n  state.stack = stack\n  exit()\n\n  if (type === 'full' || !alt || alt !== reference) {\n    value += tracker.move(reference + ']')\n  } else if (type === 'shortcut') {\n    // Remove the unwanted `[`.\n    value = value.slice(0, -1)\n  } else {\n    value += tracker.move(']')\n  }\n\n  return value\n}\n\n/**\n * @returns {string}\n */\nfunction imageReferencePeek() {\n  return '!'\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {InlineCode, Parents} from 'mdast'\n */\n\ninlineCode.peek = inlineCodePeek\n\n/**\n * @param {InlineCode} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @returns {string}\n */\nexport function inlineCode(node, _, state) {\n  let value = node.value || ''\n  let sequence = '`'\n  let index = -1\n\n  // If there is a single grave accent on its own in the code, use a fence of\n  // two.\n  // If there are two in a row, use one.\n  while (new RegExp('(^|[^`])' + sequence + '([^`]|$)').test(value)) {\n    sequence += '`'\n  }\n\n  // If this is not just spaces or eols (tabs don’t count), and either the\n  // first or last character are a space, eol, or tick, then pad with spaces.\n  if (\n    /[^ \\r\\n]/.test(value) \u0026\u0026\n    ((/^[ \\r\\n]/.test(value) \u0026\u0026 /[ \\r\\n]$/.test(value)) || /^`|`$/.test(value))\n  ) {\n    value = ' ' + value + ' '\n  }\n\n  // We have a potential problem: certain characters after eols could result in\n  // blocks being seen.\n  // For example, if someone injected the string `'\\n# b'`, then that would\n  // result in an ATX heading.\n  // We can’t escape characters in `inlineCode`, but because eols are\n  // transformed to spaces when going from markdown to HTML anyway, we can swap\n  // them out.\n  while (++index \u003c state.unsafe.length) {\n    const pattern = state.unsafe[index]\n    const expression = state.compilePattern(pattern)\n    /** @type {RegExpExecArray | null} */\n    let match\n\n    // Only look for `atBreak`s.\n    // Btw: note that `atBreak` patterns will always start the regex at LF or\n    // CR.\n    if (!pattern.atBreak) continue\n\n    while ((match = expression.exec(value))) {\n      let position = match.index\n\n      // Support CRLF (patterns only look for one of the characters).\n      if (\n        value.charCodeAt(position) === 10 /* `\\n` */ \u0026\u0026\n        value.charCodeAt(position - 1) === 13 /* `\\r` */\n      ) {\n        position--\n      }\n\n      value = value.slice(0, position) + ' ' + value.slice(match.index + 1)\n    }\n  }\n\n  return sequence + value + sequence\n}\n\n/**\n * @returns {string}\n */\nfunction inlineCodePeek() {\n  return '`'\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Link} from 'mdast'\n */\n\nimport {toString} from 'mdast-util-to-string'\n\n/**\n * @param {Link} node\n * @param {State} state\n * @returns {boolean}\n */\nexport function formatLinkAsAutolink(node, state) {\n  const raw = toString(node)\n\n  return Boolean(\n    !state.options.resourceLink \u0026\u0026\n      // If there’s a url…\n      node.url \u0026\u0026\n      // And there’s a no title…\n      !node.title \u0026\u0026\n      // And the content of `node` is a single text node…\n      node.children \u0026\u0026\n      node.children.length === 1 \u0026\u0026\n      node.children[0].type === 'text' \u0026\u0026\n      // And if the url is the same as the content…\n      (raw === node.url || 'mailto:' + raw === node.url) \u0026\u0026\n      // And that starts w/ a protocol…\n      /^[a-z][a-z+.-]+:/i.test(node.url) \u0026\u0026\n      // And that doesn’t contain ASCII control codes (character escapes and\n      // references don’t work), space, or angle brackets…\n      !/[\\0- \u003c\u003e\\u007F]/.test(node.url)\n  )\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Link, Parents} from 'mdast'\n * @import {Exit} from '../types.js'\n */\n\nimport {checkQuote} from '../util/check-quote.js'\nimport {formatLinkAsAutolink} from '../util/format-link-as-autolink.js'\n\nlink.peek = linkPeek\n\n/**\n * @param {Link} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function link(node, _, state, info) {\n  const quote = checkQuote(state)\n  const suffix = quote === '\"' ? 'Quote' : 'Apostrophe'\n  const tracker = state.createTracker(info)\n  /** @type {Exit} */\n  let exit\n  /** @type {Exit} */\n  let subexit\n\n  if (formatLinkAsAutolink(node, state)) {\n    // Hide the fact that we’re in phrasing, because escapes don’t work.\n    const stack = state.stack\n    state.stack = []\n    exit = state.enter('autolink')\n    let value = tracker.move('\u003c')\n    value += tracker.move(\n      state.containerPhrasing(node, {\n        before: value,\n        after: '\u003e',\n        ...tracker.current()\n      })\n    )\n    value += tracker.move('\u003e')\n    exit()\n    state.stack = stack\n    return value\n  }\n\n  exit = state.enter('link')\n  subexit = state.enter('label')\n  let value = tracker.move('[')\n  value += tracker.move(\n    state.containerPhrasing(node, {\n      before: value,\n      after: '](',\n      ...tracker.current()\n    })\n  )\n  value += tracker.move('](')\n  subexit()\n\n  if (\n    // If there’s no url but there is a title…\n    (!node.url \u0026\u0026 node.title) ||\n    // If there are control characters or whitespace.\n    /[\\0- \\u007F]/.test(node.url)\n  ) {\n    subexit = state.enter('destinationLiteral')\n    value += tracker.move('\u003c')\n    value += tracker.move(\n      state.safe(node.url, {before: value, after: '\u003e', ...tracker.current()})\n    )\n    value += tracker.move('\u003e')\n  } else {\n    // No whitespace, raw is prettier.\n    subexit = state.enter('destinationRaw')\n    value += tracker.move(\n      state.safe(node.url, {\n        before: value,\n        after: node.title ? ' ' : ')',\n        ...tracker.current()\n      })\n    )\n  }\n\n  subexit()\n\n  if (node.title) {\n    subexit = state.enter(`title${suffix}`)\n    value += tracker.move(' ' + quote)\n    value += tracker.move(\n      state.safe(node.title, {\n        before: value,\n        after: quote,\n        ...tracker.current()\n      })\n    )\n    value += tracker.move(quote)\n    subexit()\n  }\n\n  value += tracker.move(')')\n\n  exit()\n  return value\n}\n\n/**\n * @param {Link} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @returns {string}\n */\nfunction linkPeek(node, _, state) {\n  return formatLinkAsAutolink(node, state) ? '\u003c' : '['\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {LinkReference, Parents} from 'mdast'\n */\n\nlinkReference.peek = linkReferencePeek\n\n/**\n * @param {LinkReference} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function linkReference(node, _, state, info) {\n  const type = node.referenceType\n  const exit = state.enter('linkReference')\n  let subexit = state.enter('label')\n  const tracker = state.createTracker(info)\n  let value = tracker.move('[')\n  const text = state.containerPhrasing(node, {\n    before: value,\n    after: ']',\n    ...tracker.current()\n  })\n  value += tracker.move(text + '][')\n\n  subexit()\n  // Hide the fact that we’re in phrasing, because escapes don’t work.\n  const stack = state.stack\n  state.stack = []\n  subexit = state.enter('reference')\n  // Note: for proper tracking, we should reset the output positions when we end\n  // up making a `shortcut` reference, because then there is no brace output.\n  // Practically, in that case, there is no content, so it doesn’t matter that\n  // we’ve tracked one too many characters.\n  const reference = state.safe(state.associationId(node), {\n    before: value,\n    after: ']',\n    ...tracker.current()\n  })\n  subexit()\n  state.stack = stack\n  exit()\n\n  if (type === 'full' || !text || text !== reference) {\n    value += tracker.move(reference + ']')\n  } else if (type === 'shortcut') {\n    // Remove the unwanted `[`.\n    value = value.slice(0, -1)\n  } else {\n    value += tracker.move(']')\n  }\n\n  return value\n}\n\n/**\n * @returns {string}\n */\nfunction linkReferencePeek() {\n  return '['\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude\u003cOptions['bullet'], null | undefined\u003e}\n */\nexport function checkBullet(state) {\n  const marker = state.options.bullet || '*'\n\n  if (marker !== '*' \u0026\u0026 marker !== '+' \u0026\u0026 marker !== '-') {\n    throw new Error(\n      'Cannot serialize items with `' +\n        marker +\n        '` for `options.bullet`, expected `*`, `+`, or `-`'\n    )\n  }\n\n  return marker\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\nimport {checkBullet} from './check-bullet.js'\n\n/**\n * @param {State} state\n * @returns {Exclude\u003cOptions['bullet'], null | undefined\u003e}\n */\nexport function checkBulletOther(state) {\n  const bullet = checkBullet(state)\n  const bulletOther = state.options.bulletOther\n\n  if (!bulletOther) {\n    return bullet === '*' ? '-' : '*'\n  }\n\n  if (bulletOther !== '*' \u0026\u0026 bulletOther !== '+' \u0026\u0026 bulletOther !== '-') {\n    throw new Error(\n      'Cannot serialize items with `' +\n        bulletOther +\n        '` for `options.bulletOther`, expected `*`, `+`, or `-`'\n    )\n  }\n\n  if (bulletOther === bullet) {\n    throw new Error(\n      'Expected `bullet` (`' +\n        bullet +\n        '`) and `bulletOther` (`' +\n        bulletOther +\n        '`) to be different'\n    )\n  }\n\n  return bulletOther\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude\u003cOptions['bulletOrdered'], null | undefined\u003e}\n */\nexport function checkBulletOrdered(state) {\n  const marker = state.options.bulletOrdered || '.'\n\n  if (marker !== '.' \u0026\u0026 marker !== ')') {\n    throw new Error(\n      'Cannot serialize items with `' +\n        marker +\n        '` for `options.bulletOrdered`, expected `.` or `)`'\n    )\n  }\n\n  return marker\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude\u003cOptions['rule'], null | undefined\u003e}\n */\nexport function checkRule(state) {\n  const marker = state.options.rule || '*'\n\n  if (marker !== '*' \u0026\u0026 marker !== '-' \u0026\u0026 marker !== '_') {\n    throw new Error(\n      'Cannot serialize rules with `' +\n        marker +\n        '` for `options.rule`, expected `*`, `-`, or `_`'\n    )\n  }\n\n  return marker\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {List, Parents} from 'mdast'\n */\n\nimport {checkBullet} from '../util/check-bullet.js'\nimport {checkBulletOther} from '../util/check-bullet-other.js'\nimport {checkBulletOrdered} from '../util/check-bullet-ordered.js'\nimport {checkRule} from '../util/check-rule.js'\n\n/**\n * @param {List} node\n * @param {Parents | undefined} parent\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function list(node, parent, state, info) {\n  const exit = state.enter('list')\n  const bulletCurrent = state.bulletCurrent\n  /** @type {string} */\n  let bullet = node.ordered ? checkBulletOrdered(state) : checkBullet(state)\n  /** @type {string} */\n  const bulletOther = node.ordered\n    ? bullet === '.'\n      ? ')'\n      : '.'\n    : checkBulletOther(state)\n  let useDifferentMarker =\n    parent \u0026\u0026 state.bulletLastUsed ? bullet === state.bulletLastUsed : false\n\n  if (!node.ordered) {\n    const firstListItem = node.children ? node.children[0] : undefined\n\n    // If there’s an empty first list item directly in two list items,\n    // we have to use a different bullet:\n    //\n    // ```markdown\n    // * - *\n    // ```\n    //\n    // …because otherwise it would become one big thematic break.\n    if (\n      // Bullet could be used as a thematic break marker:\n      (bullet === '*' || bullet === '-') \u0026\u0026\n      // Empty first list item:\n      firstListItem \u0026\u0026\n      (!firstListItem.children || !firstListItem.children[0]) \u0026\u0026\n      // Directly in two other list items:\n      state.stack[state.stack.length - 1] === 'list' \u0026\u0026\n      state.stack[state.stack.length - 2] === 'listItem' \u0026\u0026\n      state.stack[state.stack.length - 3] === 'list' \u0026\u0026\n      state.stack[state.stack.length - 4] === 'listItem' \u0026\u0026\n      // That are each the first child.\n      state.indexStack[state.indexStack.length - 1] === 0 \u0026\u0026\n      state.indexStack[state.indexStack.length - 2] === 0 \u0026\u0026\n      state.indexStack[state.indexStack.length - 3] === 0\n    ) {\n      useDifferentMarker = true\n    }\n\n    // If there’s a thematic break at the start of the first list item,\n    // we have to use a different bullet:\n    //\n    // ```markdown\n    // * ---\n    // ```\n    //\n    // …because otherwise it would become one big thematic break.\n    if (checkRule(state) === bullet \u0026\u0026 firstListItem) {\n      let index = -1\n\n      while (++index \u003c node.children.length) {\n        const item = node.children[index]\n\n        if (\n          item \u0026\u0026\n          item.type === 'listItem' \u0026\u0026\n          item.children \u0026\u0026\n          item.children[0] \u0026\u0026\n          item.children[0].type === 'thematicBreak'\n        ) {\n          useDifferentMarker = true\n          break\n        }\n      }\n    }\n  }\n\n  if (useDifferentMarker) {\n    bullet = bulletOther\n  }\n\n  state.bulletCurrent = bullet\n  const value = state.containerFlow(node, info)\n  state.bulletLastUsed = bullet\n  state.bulletCurrent = bulletCurrent\n  exit()\n  return value\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude\u003cOptions['listItemIndent'], null | undefined\u003e}\n */\nexport function checkListItemIndent(state) {\n  const style = state.options.listItemIndent || 'one'\n\n  if (style !== 'tab' \u0026\u0026 style !== 'one' \u0026\u0026 style !== 'mixed') {\n    throw new Error(\n      'Cannot serialize items with `' +\n        style +\n        '` for `options.listItemIndent`, expected `tab`, `one`, or `mixed`'\n    )\n  }\n\n  return style\n}\n","/**\n * @import {Info, Map, State} from 'mdast-util-to-markdown'\n * @import {ListItem, Parents} from 'mdast'\n */\n\nimport {checkBullet} from '../util/check-bullet.js'\nimport {checkListItemIndent} from '../util/check-list-item-indent.js'\n\n/**\n * @param {ListItem} node\n * @param {Parents | undefined} parent\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function listItem(node, parent, state, info) {\n  const listItemIndent = checkListItemIndent(state)\n  let bullet = state.bulletCurrent || checkBullet(state)\n\n  // Add the marker value for ordered lists.\n  if (parent \u0026\u0026 parent.type === 'list' \u0026\u0026 parent.ordered) {\n    bullet =\n      (typeof parent.start === 'number' \u0026\u0026 parent.start \u003e -1\n        ? parent.start\n        : 1) +\n      (state.options.incrementListMarker === false\n        ? 0\n        : parent.children.indexOf(node)) +\n      bullet\n  }\n\n  let size = bullet.length + 1\n\n  if (\n    listItemIndent === 'tab' ||\n    (listItemIndent === 'mixed' \u0026\u0026\n      ((parent \u0026\u0026 parent.type === 'list' \u0026\u0026 parent.spread) || node.spread))\n  ) {\n    size = Math.ceil(size / 4) * 4\n  }\n\n  const tracker = state.createTracker(info)\n  tracker.move(bullet + ' '.repeat(size - bullet.length))\n  tracker.shift(size)\n  const exit = state.enter('listItem')\n  const value = state.indentLines(\n    state.containerFlow(node, tracker.current()),\n    map\n  )\n  exit()\n\n  return value\n\n  /** @type {Map} */\n  function map(line, index, blank) {\n    if (index) {\n      return (blank ? '' : ' '.repeat(size)) + line\n    }\n\n    return (blank ? bullet : bullet + ' '.repeat(size - bullet.length)) + line\n  }\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Paragraph, Parents} from 'mdast'\n */\n\n/**\n * @param {Paragraph} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function paragraph(node, _, state, info) {\n  const exit = state.enter('paragraph')\n  const subexit = state.enter('phrasing')\n  const value = state.containerPhrasing(node, info)\n  subexit()\n  exit()\n  return value\n}\n","/**\n * @typedef {import('mdast').Html} Html\n * @typedef {import('mdast').PhrasingContent} PhrasingContent\n */\n\nimport {convert} from 'unist-util-is'\n\n/**\n * Check if the given value is *phrasing content*.\n *\n * \u003e 👉 **Note**: Excludes `html`, which can be both phrasing or flow.\n *\n * @param node\n *   Thing to check, typically `Node`.\n * @returns\n *   Whether `value` is phrasing content.\n */\n\nexport const phrasing =\n  /** @type {(node?: unknown) =\u003e node is Exclude\u003cPhrasingContent, Html\u003e} */\n  (\n    convert([\n      'break',\n      'delete',\n      'emphasis',\n      // To do: next major: removed since footnotes were added to GFM.\n      'footnote',\n      'footnoteReference',\n      'image',\n      'imageReference',\n      'inlineCode',\n      // Enabled by `mdast-util-math`:\n      'inlineMath',\n      'link',\n      'linkReference',\n      // Enabled by `mdast-util-mdx`:\n      'mdxJsxTextElement',\n      // Enabled by `mdast-util-mdx`:\n      'mdxTextExpression',\n      'strong',\n      'text',\n      // Enabled by `mdast-util-directive`:\n      'textDirective'\n    ])\n  )\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Parents, Root} from 'mdast'\n */\n\nimport {phrasing} from 'mdast-util-phrasing'\n\n/**\n * @param {Root} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function root(node, _, state, info) {\n  // Note: `html` nodes are ambiguous.\n  const hasPhrasing = node.children.some(function (d) {\n    return phrasing(d)\n  })\n\n  const container = hasPhrasing ? state.containerPhrasing : state.containerFlow\n  return container.call(state, node, info)\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude\u003cOptions['strong'], null | undefined\u003e}\n */\nexport function checkStrong(state) {\n  const marker = state.options.strong || '*'\n\n  if (marker !== '*' \u0026\u0026 marker !== '_') {\n    throw new Error(\n      'Cannot serialize strong with `' +\n        marker +\n        '` for `options.strong`, expected `*`, or `_`'\n    )\n  }\n\n  return marker\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Parents, Strong} from 'mdast'\n */\n\nimport {checkStrong} from '../util/check-strong.js'\nimport {encodeCharacterReference} from '../util/encode-character-reference.js'\nimport {encodeInfo} from '../util/encode-info.js'\n\nstrong.peek = strongPeek\n\n/**\n * @param {Strong} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function strong(node, _, state, info) {\n  const marker = checkStrong(state)\n  const exit = state.enter('strong')\n  const tracker = state.createTracker(info)\n  const before = tracker.move(marker + marker)\n\n  let between = tracker.move(\n    state.containerPhrasing(node, {\n      after: marker,\n      before,\n      ...tracker.current()\n    })\n  )\n  const betweenHead = between.charCodeAt(0)\n  const open = encodeInfo(\n    info.before.charCodeAt(info.before.length - 1),\n    betweenHead,\n    marker\n  )\n\n  if (open.inside) {\n    between = encodeCharacterReference(betweenHead) + between.slice(1)\n  }\n\n  const betweenTail = between.charCodeAt(between.length - 1)\n  const close = encodeInfo(info.after.charCodeAt(0), betweenTail, marker)\n\n  if (close.inside) {\n    between = between.slice(0, -1) + encodeCharacterReference(betweenTail)\n  }\n\n  const after = tracker.move(marker + marker)\n\n  exit()\n\n  state.attentionEncodeSurroundingInfo = {\n    after: close.outside,\n    before: open.outside\n  }\n  return before + between + after\n}\n\n/**\n * @param {Strong} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @returns {string}\n */\nfunction strongPeek(_, _1, state) {\n  return state.options.strong || '*'\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Parents, Text} from 'mdast'\n */\n\n/**\n * @param {Text} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function text(node, _, state, info) {\n  return state.safe(node.value, info)\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude\u003cOptions['ruleRepetition'], null | undefined\u003e}\n */\nexport function checkRuleRepetition(state) {\n  const repetition = state.options.ruleRepetition || 3\n\n  if (repetition \u003c 3) {\n    throw new Error(\n      'Cannot serialize rules with repetition `' +\n        repetition +\n        '` for `options.ruleRepetition`, expected `3` or more'\n    )\n  }\n\n  return repetition\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Parents, ThematicBreak} from 'mdast'\n */\n\nimport {checkRuleRepetition} from '../util/check-rule-repetition.js'\nimport {checkRule} from '../util/check-rule.js'\n\n/**\n * @param {ThematicBreak} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @returns {string}\n */\nexport function thematicBreak(_, _1, state) {\n  const value = (\n    checkRule(state) + (state.options.ruleSpaces ? ' ' : '')\n  ).repeat(checkRuleRepetition(state))\n\n  return state.options.ruleSpaces ? value.slice(0, -1) : value\n}\n","import {blockquote} from './blockquote.js'\nimport {hardBreak} from './break.js'\nimport {code} from './code.js'\nimport {definition} from './definition.js'\nimport {emphasis} from './emphasis.js'\nimport {heading} from './heading.js'\nimport {html} from './html.js'\nimport {image} from './image.js'\nimport {imageReference} from './image-reference.js'\nimport {inlineCode} from './inline-code.js'\nimport {link} from './link.js'\nimport {linkReference} from './link-reference.js'\nimport {list} from './list.js'\nimport {listItem} from './list-item.js'\nimport {paragraph} from './paragraph.js'\nimport {root} from './root.js'\nimport {strong} from './strong.js'\nimport {text} from './text.js'\nimport {thematicBreak} from './thematic-break.js'\n\n/**\n * Default (CommonMark) handlers.\n */\nexport const handle = {\n  blockquote,\n  break: hardBreak,\n  code,\n  definition,\n  emphasis,\n  hardBreak,\n  heading,\n  html,\n  image,\n  imageReference,\n  inlineCode,\n  link,\n  linkReference,\n  list,\n  listItem,\n  paragraph,\n  root,\n  strong,\n  text,\n  thematicBreak\n}\n","/**\n * @typedef {import('mdast').InlineCode} InlineCode\n * @typedef {import('mdast').Table} Table\n * @typedef {import('mdast').TableCell} TableCell\n * @typedef {import('mdast').TableRow} TableRow\n *\n * @typedef {import('markdown-table').Options} MarkdownTableOptions\n *\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n *\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').State} State\n * @typedef {import('mdast-util-to-markdown').Info} Info\n */\n\n/**\n * @typedef Options\n *   Configuration.\n * @property {boolean | null | undefined} [tableCellPadding=true]\n *   Whether to add a space of padding between delimiters and cells (default:\n *   `true`).\n * @property {boolean | null | undefined} [tablePipeAlign=true]\n *   Whether to align the delimiters (default: `true`).\n * @property {MarkdownTableOptions['stringLength'] | null | undefined} [stringLength]\n *   Function to detect the length of table cell content, used when aligning\n *   the delimiters between cells (optional).\n */\n\nimport {ok as assert} from 'devlop'\nimport {markdownTable} from 'markdown-table'\nimport {defaultHandlers} from 'mdast-util-to-markdown'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM tables in\n * markdown.\n *\n * @returns {FromMarkdownExtension}\n *   Extension for `mdast-util-from-markdown` to enable GFM tables.\n */\nexport function gfmTableFromMarkdown() {\n  return {\n    enter: {\n      table: enterTable,\n      tableData: enterCell,\n      tableHeader: enterCell,\n      tableRow: enterRow\n    },\n    exit: {\n      codeText: exitCodeText,\n      table: exitTable,\n      tableData: exit,\n      tableHeader: exit,\n      tableRow: exit\n    }\n  }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterTable(token) {\n  const align = token._align\n  assert(align, 'expected `_align` on table')\n  this.enter(\n    {\n      type: 'table',\n      align: align.map(function (d) {\n        return d === 'none' ? null : d\n      }),\n      children: []\n    },\n    token\n  )\n  this.data.inTable = true\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitTable(token) {\n  this.exit(token)\n  this.data.inTable = undefined\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterRow(token) {\n  this.enter({type: 'tableRow', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exit(token) {\n  this.exit(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterCell(token) {\n  this.enter({type: 'tableCell', children: []}, token)\n}\n\n// Overwrite the default code text data handler to unescape escaped pipes when\n// they are in tables.\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitCodeText(token) {\n  let value = this.resume()\n\n  if (this.data.inTable) {\n    value = value.replace(/\\\\([\\\\|])/g, replace)\n  }\n\n  const node = this.stack[this.stack.length - 1]\n  assert(node.type === 'inlineCode')\n  node.value = value\n  this.exit(token)\n}\n\n/**\n * @param {string} $0\n * @param {string} $1\n * @returns {string}\n */\nfunction replace($0, $1) {\n  // Pipes work, backslashes don’t (but can’t escape pipes).\n  return $1 === '|' ? $1 : $0\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM tables in\n * markdown.\n *\n * @param {Options | null | undefined} [options]\n *   Configuration.\n * @returns {ToMarkdownExtension}\n *   Extension for `mdast-util-to-markdown` to enable GFM tables.\n */\nexport function gfmTableToMarkdown(options) {\n  const settings = options || {}\n  const padding = settings.tableCellPadding\n  const alignDelimiters = settings.tablePipeAlign\n  const stringLength = settings.stringLength\n  const around = padding ? ' ' : '|'\n\n  return {\n    unsafe: [\n      {character: '\\r', inConstruct: 'tableCell'},\n      {character: '\\n', inConstruct: 'tableCell'},\n      // A pipe, when followed by a tab or space (padding), or a dash or colon\n      // (unpadded delimiter row), could result in a table.\n      {atBreak: true, character: '|', after: '[\\t :-]'},\n      // A pipe in a cell must be encoded.\n      {character: '|', inConstruct: 'tableCell'},\n      // A colon must be followed by a dash, in which case it could start a\n      // delimiter row.\n      {atBreak: true, character: ':', after: '-'},\n      // A delimiter row can also start with a dash, when followed by more\n      // dashes, a colon, or a pipe.\n      // This is a stricter version than the built in check for lists, thematic\n      // breaks, and setex heading underlines though:\n      // \u003chttps://github.com/syntax-tree/mdast-util-to-markdown/blob/51a2038/lib/unsafe.js#L57\u003e\n      {atBreak: true, character: '-', after: '[:|-]'}\n    ],\n    handlers: {\n      inlineCode: inlineCodeWithTable,\n      table: handleTable,\n      tableCell: handleTableCell,\n      tableRow: handleTableRow\n    }\n  }\n\n  /**\n   * @type {ToMarkdownHandle}\n   * @param {Table} node\n   */\n  function handleTable(node, _, state, info) {\n    return serializeData(handleTableAsData(node, state, info), node.align)\n  }\n\n  /**\n   * This function isn’t really used normally, because we handle rows at the\n   * table level.\n   * But, if someone passes in a table row, this ensures we make somewhat sense.\n   *\n   * @type {ToMarkdownHandle}\n   * @param {TableRow} node\n   */\n  function handleTableRow(node, _, state, info) {\n    const row = handleTableRowAsData(node, state, info)\n    const value = serializeData([row])\n    // `markdown-table` will always add an align row\n    return value.slice(0, value.indexOf('\\n'))\n  }\n\n  /**\n   * @type {ToMarkdownHandle}\n   * @param {TableCell} node\n   */\n  function handleTableCell(node, _, state, info) {\n    const exit = state.enter('tableCell')\n    const subexit = state.enter('phrasing')\n    const value = state.containerPhrasing(node, {\n      ...info,\n      before: around,\n      after: around\n    })\n    subexit()\n    exit()\n    return value\n  }\n\n  /**\n   * @param {Array\u003cArray\u003cstring\u003e\u003e} matrix\n   * @param {Array\u003cstring | null | undefined\u003e | null | undefined} [align]\n   */\n  function serializeData(matrix, align) {\n    return markdownTable(matrix, {\n      align,\n      // @ts-expect-error: `markdown-table` types should support `null`.\n      alignDelimiters,\n      // @ts-expect-error: `markdown-table` types should support `null`.\n      padding,\n      // @ts-expect-error: `markdown-table` types should support `null`.\n      stringLength\n    })\n  }\n\n  /**\n   * @param {Table} node\n   * @param {State} state\n   * @param {Info} info\n   */\n  function handleTableAsData(node, state, info) {\n    const children = node.children\n    let index = -1\n    /** @type {Array\u003cArray\u003cstring\u003e\u003e} */\n    const result = []\n    const subexit = state.enter('table')\n\n    while (++index \u003c children.length) {\n      result[index] = handleTableRowAsData(children[index], state, info)\n    }\n\n    subexit()\n\n    return result\n  }\n\n  /**\n   * @param {TableRow} node\n   * @param {State} state\n   * @param {Info} info\n   */\n  function handleTableRowAsData(node, state, info) {\n    const children = node.children\n    let index = -1\n    /** @type {Array\u003cstring\u003e} */\n    const result = []\n    const subexit = state.enter('tableRow')\n\n    while (++index \u003c children.length) {\n      // Note: the positional info as used here is incorrect.\n      // Making it correct would be impossible due to aligning cells?\n      // And it would need copy/pasting `markdown-table` into this project.\n      result[index] = handleTableCell(children[index], node, state, info)\n    }\n\n    subexit()\n\n    return result\n  }\n\n  /**\n   * @type {ToMarkdownHandle}\n   * @param {InlineCode} node\n   */\n  function inlineCodeWithTable(node, parent, state) {\n    let value = defaultHandlers.inlineCode(node, parent, state)\n\n    if (state.stack.includes('tableCell')) {\n      value = value.replace(/\\|/g, '\\\\$\u0026')\n    }\n\n    return value\n  }\n}\n","/**\n * @typedef {import('mdast').ListItem} ListItem\n * @typedef {import('mdast').Paragraph} Paragraph\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n */\n\nimport {ok as assert} from 'devlop'\nimport {defaultHandlers} from 'mdast-util-to-markdown'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM task\n * list items in markdown.\n *\n * @returns {FromMarkdownExtension}\n *   Extension for `mdast-util-from-markdown` to enable GFM task list items.\n */\nexport function gfmTaskListItemFromMarkdown() {\n  return {\n    exit: {\n      taskListCheckValueChecked: exitCheck,\n      taskListCheckValueUnchecked: exitCheck,\n      paragraph: exitParagraphWithTaskListItem\n    }\n  }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM task list\n * items in markdown.\n *\n * @returns {ToMarkdownExtension}\n *   Extension for `mdast-util-to-markdown` to enable GFM task list items.\n */\nexport function gfmTaskListItemToMarkdown() {\n  return {\n    unsafe: [{atBreak: true, character: '-', after: '[:|-]'}],\n    handlers: {listItem: listItemWithTaskListItem}\n  }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitCheck(token) {\n  // We’re always in a paragraph, in a list item.\n  const node = this.stack[this.stack.length - 2]\n  assert(node.type === 'listItem')\n  node.checked = token.type === 'taskListCheckValueChecked'\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitParagraphWithTaskListItem(token) {\n  const parent = this.stack[this.stack.length - 2]\n\n  if (\n    parent \u0026\u0026\n    parent.type === 'listItem' \u0026\u0026\n    typeof parent.checked === 'boolean'\n  ) {\n    const node = this.stack[this.stack.length - 1]\n    assert(node.type === 'paragraph')\n    const head = node.children[0]\n\n    if (head \u0026\u0026 head.type === 'text') {\n      const siblings = parent.children\n      let index = -1\n      /** @type {Paragraph | undefined} */\n      let firstParaghraph\n\n      while (++index \u003c siblings.length) {\n        const sibling = siblings[index]\n        if (sibling.type === 'paragraph') {\n          firstParaghraph = sibling\n          break\n        }\n      }\n\n      if (firstParaghraph === node) {\n        // Must start with a space or a tab.\n        head.value = head.value.slice(1)\n\n        if (head.value.length === 0) {\n          node.children.shift()\n        } else if (\n          node.position \u0026\u0026\n          head.position \u0026\u0026\n          typeof head.position.start.offset === 'number'\n        ) {\n          head.position.start.column++\n          head.position.start.offset++\n          node.position.start = Object.assign({}, head.position.start)\n        }\n      }\n    }\n  }\n\n  this.exit(token)\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {ListItem} node\n */\nfunction listItemWithTaskListItem(node, parent, state, info) {\n  const head = node.children[0]\n  const checkable =\n    typeof node.checked === 'boolean' \u0026\u0026 head \u0026\u0026 head.type === 'paragraph'\n  const checkbox = '[' + (node.checked ? 'x' : ' ') + '] '\n  const tracker = state.createTracker(info)\n\n  if (checkable) {\n    tracker.move(checkbox)\n  }\n\n  let value = defaultHandlers.listItem(node, parent, state, {\n    ...info,\n    ...tracker.current()\n  })\n\n  if (checkable) {\n    value = value.replace(/^(?:[*+-]|\\d+\\.)([\\r\\n]| {1,3})/, check)\n  }\n\n  return value\n\n  /**\n   * @param {string} $0\n   * @returns {string}\n   */\n  function check($0) {\n    return $0 + checkbox\n  }\n}\n","/**\n * @import {Extension as FromMarkdownExtension} from 'mdast-util-from-markdown'\n * @import {Options} from 'mdast-util-gfm'\n * @import {Options as ToMarkdownExtension} from 'mdast-util-to-markdown'\n */\n\nimport {\n  gfmAutolinkLiteralFromMarkdown,\n  gfmAutolinkLiteralToMarkdown\n} from 'mdast-util-gfm-autolink-literal'\nimport {\n  gfmFootnoteFromMarkdown,\n  gfmFootnoteToMarkdown\n} from 'mdast-util-gfm-footnote'\nimport {\n  gfmStrikethroughFromMarkdown,\n  gfmStrikethroughToMarkdown\n} from 'mdast-util-gfm-strikethrough'\nimport {gfmTableFromMarkdown, gfmTableToMarkdown} from 'mdast-util-gfm-table'\nimport {\n  gfmTaskListItemFromMarkdown,\n  gfmTaskListItemToMarkdown\n} from 'mdast-util-gfm-task-list-item'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM (autolink\n * literals, footnotes, strikethrough, tables, tasklists).\n *\n * @returns {Array\u003cFromMarkdownExtension\u003e}\n *   Extension for `mdast-util-from-markdown` to enable GFM (autolink literals,\n *   footnotes, strikethrough, tables, tasklists).\n */\nexport function gfmFromMarkdown() {\n  return [\n    gfmAutolinkLiteralFromMarkdown(),\n    gfmFootnoteFromMarkdown(),\n    gfmStrikethroughFromMarkdown(),\n    gfmTableFromMarkdown(),\n    gfmTaskListItemFromMarkdown()\n  ]\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM (autolink\n * literals, footnotes, strikethrough, tables, tasklists).\n *\n * @param {Options | null | undefined} [options]\n *   Configuration (optional).\n * @returns {ToMarkdownExtension}\n *   Extension for `mdast-util-to-markdown` to enable GFM (autolink literals,\n *   footnotes, strikethrough, tables, tasklists).\n */\nexport function gfmToMarkdown(options) {\n  return {\n    extensions: [\n      gfmAutolinkLiteralToMarkdown(),\n      gfmFootnoteToMarkdown(options),\n      gfmStrikethroughToMarkdown(),\n      gfmTableToMarkdown(options),\n      gfmTaskListItemToMarkdown()\n    ]\n  }\n}\n","/**\n * Like `Array#splice`, but smarter for giant arrays.\n *\n * `Array#splice` takes all items to be inserted as individual argument which\n * causes a stack overflow in V8 when trying to insert 100k items for instance.\n *\n * Otherwise, this does not return the removed items, and takes `items` as an\n * array instead of rest parameters.\n *\n * @template {unknown} T\n *   Item type.\n * @param {Array\u003cT\u003e} list\n *   List to operate on.\n * @param {number} start\n *   Index to remove/insert at (can be negative).\n * @param {number} remove\n *   Number of items to remove.\n * @param {Array\u003cT\u003e} items\n *   Items to inject into `list`.\n * @returns {undefined}\n *   Nothing.\n */\nexport function splice(list, start, remove, items) {\n  const end = list.length;\n  let chunkStart = 0;\n  /** @type {Array\u003cunknown\u003e} */\n  let parameters;\n\n  // Make start between zero and `end` (included).\n  if (start \u003c 0) {\n    start = -start \u003e end ? 0 : end + start;\n  } else {\n    start = start \u003e end ? end : start;\n  }\n  remove = remove \u003e 0 ? remove : 0;\n\n  // No need to chunk the items if there’s only a couple (10k) items.\n  if (items.length \u003c 10000) {\n    parameters = Array.from(items);\n    parameters.unshift(start, remove);\n    // @ts-expect-error Hush, it’s fine.\n    list.splice(...parameters);\n  } else {\n    // Delete `remove` items starting from `start`\n    if (remove) list.splice(start, remove);\n\n    // Insert the items in chunks to not cause stack overflows.\n    while (chunkStart \u003c items.length) {\n      parameters = items.slice(chunkStart, chunkStart + 10000);\n      parameters.unshift(start, 0);\n      // @ts-expect-error Hush, it’s fine.\n      list.splice(...parameters);\n      chunkStart += 10000;\n      start += 10000;\n    }\n  }\n}\n\n/**\n * Append `items` (an array) at the end of `list` (another array).\n * When `list` was empty, returns `items` instead.\n *\n * This prevents a potentially expensive operation when `list` is empty,\n * and adds items in batches to prevent V8 from hanging.\n *\n * @template {unknown} T\n *   Item type.\n * @param {Array\u003cT\u003e} list\n *   List to operate on.\n * @param {Array\u003cT\u003e} items\n *   Items to add to `list`.\n * @returns {Array\u003cT\u003e}\n *   Either `list` or `items`.\n */\nexport function push(list, items) {\n  if (list.length \u003e 0) {\n    splice(list, list.length, 0, items);\n    return list;\n  }\n  return items;\n}","/**\n * @import {\n *   Extension,\n *   Handles,\n *   HtmlExtension,\n *   NormalizedExtension\n * } from 'micromark-util-types'\n */\n\nimport {splice} from 'micromark-util-chunked'\n\nconst hasOwnProperty = {}.hasOwnProperty\n\n/**\n * Combine multiple syntax extensions into one.\n *\n * @param {ReadonlyArray\u003cExtension\u003e} extensions\n *   List of syntax extensions.\n * @returns {NormalizedExtension}\n *   A single combined extension.\n */\nexport function combineExtensions(extensions) {\n  /** @type {NormalizedExtension} */\n  const all = {}\n  let index = -1\n\n  while (++index \u003c extensions.length) {\n    syntaxExtension(all, extensions[index])\n  }\n\n  return all\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {NormalizedExtension} all\n *   Extension to merge into.\n * @param {Extension} extension\n *   Extension to merge.\n * @returns {undefined}\n *   Nothing.\n */\nfunction syntaxExtension(all, extension) {\n  /** @type {keyof Extension} */\n  let hook\n\n  for (hook in extension) {\n    const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n    /** @type {Record\u003cstring, unknown\u003e} */\n    const left = maybe || (all[hook] = {})\n    /** @type {Record\u003cstring, unknown\u003e | undefined} */\n    const right = extension[hook]\n    /** @type {string} */\n    let code\n\n    if (right) {\n      for (code in right) {\n        if (!hasOwnProperty.call(left, code)) left[code] = []\n        const value = right[code]\n        constructs(\n          // @ts-expect-error Looks like a list.\n          left[code],\n          Array.isArray(value) ? value : value ? [value] : []\n        )\n      }\n    }\n  }\n}\n\n/**\n * Merge `list` into `existing` (both lists of constructs).\n * Mutates `existing`.\n *\n * @param {Array\u003cunknown\u003e} existing\n *   List of constructs to merge into.\n * @param {Array\u003cunknown\u003e} list\n *   List of constructs to merge.\n * @returns {undefined}\n *   Nothing.\n */\nfunction constructs(existing, list) {\n  let index = -1\n  /** @type {Array\u003cunknown\u003e} */\n  const before = []\n\n  while (++index \u003c list.length) {\n    // @ts-expect-error Looks like an object.\n    ;(list[index].add === 'after' ? existing : before).push(list[index])\n  }\n\n  splice(existing, 0, 0, before)\n}\n\n/**\n * Combine multiple HTML extensions into one.\n *\n * @param {ReadonlyArray\u003cHtmlExtension\u003e} htmlExtensions\n *   List of HTML extensions.\n * @returns {HtmlExtension}\n *   Single combined HTML extension.\n */\nexport function combineHtmlExtensions(htmlExtensions) {\n  /** @type {HtmlExtension} */\n  const handlers = {}\n  let index = -1\n\n  while (++index \u003c htmlExtensions.length) {\n    htmlExtension(handlers, htmlExtensions[index])\n  }\n\n  return handlers\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {HtmlExtension} all\n *   Extension to merge into.\n * @param {HtmlExtension} extension\n *   Extension to merge.\n * @returns {undefined}\n *   Nothing.\n */\nfunction htmlExtension(all, extension) {\n  /** @type {keyof HtmlExtension} */\n  let hook\n\n  for (hook in extension) {\n    const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n    const left = maybe || (all[hook] = {})\n    const right = extension[hook]\n    /** @type {keyof Handles} */\n    let type\n\n    if (right) {\n      for (type in right) {\n        // @ts-expect-error assume document vs regular handler are managed correctly.\n        left[type] = right[type]\n      }\n    }\n  }\n}\n","/**\n * @import {Code, ConstructRecord, Event, Extension, Previous, State, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { asciiAlpha, asciiAlphanumeric, asciiControl, markdownLineEndingOrSpace, unicodePunctuation, unicodeWhitespace } from 'micromark-util-character';\nconst wwwPrefix = {\n  tokenize: tokenizeWwwPrefix,\n  partial: true\n};\nconst domain = {\n  tokenize: tokenizeDomain,\n  partial: true\n};\nconst path = {\n  tokenize: tokenizePath,\n  partial: true\n};\nconst trail = {\n  tokenize: tokenizeTrail,\n  partial: true\n};\nconst emailDomainDotTrail = {\n  tokenize: tokenizeEmailDomainDotTrail,\n  partial: true\n};\nconst wwwAutolink = {\n  name: 'wwwAutolink',\n  tokenize: tokenizeWwwAutolink,\n  previous: previousWww\n};\nconst protocolAutolink = {\n  name: 'protocolAutolink',\n  tokenize: tokenizeProtocolAutolink,\n  previous: previousProtocol\n};\nconst emailAutolink = {\n  name: 'emailAutolink',\n  tokenize: tokenizeEmailAutolink,\n  previous: previousEmail\n};\n\n/** @type {ConstructRecord} */\nconst text = {};\n\n/**\n * Create an extension for `micromark` to support GitHub autolink literal\n * syntax.\n *\n * @returns {Extension}\n *   Extension for `micromark` that can be passed in `extensions` to enable GFM\n *   autolink literal syntax.\n */\nexport function gfmAutolinkLiteral() {\n  return {\n    text\n  };\n}\n\n/** @type {Code} */\nlet code = 48;\n\n// Add alphanumerics.\nwhile (code \u003c 123) {\n  text[code] = emailAutolink;\n  code++;\n  if (code === 58) code = 65;else if (code === 91) code = 97;\n}\ntext[43] = emailAutolink;\ntext[45] = emailAutolink;\ntext[46] = emailAutolink;\ntext[95] = emailAutolink;\ntext[72] = [emailAutolink, protocolAutolink];\ntext[104] = [emailAutolink, protocolAutolink];\ntext[87] = [emailAutolink, wwwAutolink];\ntext[119] = [emailAutolink, wwwAutolink];\n\n// To do: perform email autolink literals on events, afterwards.\n// That’s where `markdown-rs` and `cmark-gfm` perform it.\n// It should look for `@`, then for atext backwards, and then for a label\n// forwards.\n// To do: `mailto:`, `xmpp:` protocol as prefix.\n\n/**\n * Email autolink literal.\n *\n * ```markdown\n * \u003e | a contact@example.org b\n *       ^^^^^^^^^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeEmailAutolink(effects, ok, nok) {\n  const self = this;\n  /** @type {boolean | undefined} */\n  let dot;\n  /** @type {boolean} */\n  let data;\n  return start;\n\n  /**\n   * Start of email autolink literal.\n   *\n   * ```markdown\n   * \u003e | a contact@example.org b\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    if (!gfmAtext(code) || !previousEmail.call(self, self.previous) || previousUnbalanced(self.events)) {\n      return nok(code);\n    }\n    effects.enter('literalAutolink');\n    effects.enter('literalAutolinkEmail');\n    return atext(code);\n  }\n\n  /**\n   * In email atext.\n   *\n   * ```markdown\n   * \u003e | a contact@example.org b\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function atext(code) {\n    if (gfmAtext(code)) {\n      effects.consume(code);\n      return atext;\n    }\n    if (code === 64) {\n      effects.consume(code);\n      return emailDomain;\n    }\n    return nok(code);\n  }\n\n  /**\n   * In email domain.\n   *\n   * The reference code is a bit overly complex as it handles the `@`, of which\n   * there may be just one.\n   * Source: \u003chttps://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L318\u003e\n   *\n   * ```markdown\n   * \u003e | a contact@example.org b\n   *               ^\n   * ```\n   *\n   * @type {State}\n   */\n  function emailDomain(code) {\n    // Dot followed by alphanumerical (not `-` or `_`).\n    if (code === 46) {\n      return effects.check(emailDomainDotTrail, emailDomainAfter, emailDomainDot)(code);\n    }\n\n    // Alphanumerical, `-`, and `_`.\n    if (code === 45 || code === 95 || asciiAlphanumeric(code)) {\n      data = true;\n      effects.consume(code);\n      return emailDomain;\n    }\n\n    // To do: `/` if xmpp.\n\n    // Note: normally we’d truncate trailing punctuation from the link.\n    // However, email autolink literals cannot contain any of those markers,\n    // except for `.`, but that can only occur if it isn’t trailing.\n    // So we can ignore truncating!\n    return emailDomainAfter(code);\n  }\n\n  /**\n   * In email domain, on dot that is not a trail.\n   *\n   * ```markdown\n   * \u003e | a contact@example.org b\n   *                      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function emailDomainDot(code) {\n    effects.consume(code);\n    dot = true;\n    return emailDomain;\n  }\n\n  /**\n   * After email domain.\n   *\n   * ```markdown\n   * \u003e | a contact@example.org b\n   *                          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function emailDomainAfter(code) {\n    // Domain must not be empty, must include a dot, and must end in alphabetical.\n    // Source: \u003chttps://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L332\u003e.\n    if (data \u0026\u0026 dot \u0026\u0026 asciiAlpha(self.previous)) {\n      effects.exit('literalAutolinkEmail');\n      effects.exit('literalAutolink');\n      return ok(code);\n    }\n    return nok(code);\n  }\n}\n\n/**\n * `www` autolink literal.\n *\n * ```markdown\n * \u003e | a www.example.org b\n *       ^^^^^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeWwwAutolink(effects, ok, nok) {\n  const self = this;\n  return wwwStart;\n\n  /**\n   * Start of www autolink literal.\n   *\n   * ```markdown\n   * \u003e | www.example.com/a?b#c\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function wwwStart(code) {\n    if (code !== 87 \u0026\u0026 code !== 119 || !previousWww.call(self, self.previous) || previousUnbalanced(self.events)) {\n      return nok(code);\n    }\n    effects.enter('literalAutolink');\n    effects.enter('literalAutolinkWww');\n    // Note: we *check*, so we can discard the `www.` we parsed.\n    // If it worked, we consider it as a part of the domain.\n    return effects.check(wwwPrefix, effects.attempt(domain, effects.attempt(path, wwwAfter), nok), nok)(code);\n  }\n\n  /**\n   * After a www autolink literal.\n   *\n   * ```markdown\n   * \u003e | www.example.com/a?b#c\n   *                          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function wwwAfter(code) {\n    effects.exit('literalAutolinkWww');\n    effects.exit('literalAutolink');\n    return ok(code);\n  }\n}\n\n/**\n * Protocol autolink literal.\n *\n * ```markdown\n * \u003e | a https://example.org b\n *       ^^^^^^^^^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeProtocolAutolink(effects, ok, nok) {\n  const self = this;\n  let buffer = '';\n  let seen = false;\n  return protocolStart;\n\n  /**\n   * Start of protocol autolink literal.\n   *\n   * ```markdown\n   * \u003e | https://example.com/a?b#c\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function protocolStart(code) {\n    if ((code === 72 || code === 104) \u0026\u0026 previousProtocol.call(self, self.previous) \u0026\u0026 !previousUnbalanced(self.events)) {\n      effects.enter('literalAutolink');\n      effects.enter('literalAutolinkHttp');\n      buffer += String.fromCodePoint(code);\n      effects.consume(code);\n      return protocolPrefixInside;\n    }\n    return nok(code);\n  }\n\n  /**\n   * In protocol.\n   *\n   * ```markdown\n   * \u003e | https://example.com/a?b#c\n   *     ^^^^^\n   * ```\n   *\n   * @type {State}\n   */\n  function protocolPrefixInside(code) {\n    // `5` is size of `https`\n    if (asciiAlpha(code) \u0026\u0026 buffer.length \u003c 5) {\n      // @ts-expect-error: definitely number.\n      buffer += String.fromCodePoint(code);\n      effects.consume(code);\n      return protocolPrefixInside;\n    }\n    if (code === 58) {\n      const protocol = buffer.toLowerCase();\n      if (protocol === 'http' || protocol === 'https') {\n        effects.consume(code);\n        return protocolSlashesInside;\n      }\n    }\n    return nok(code);\n  }\n\n  /**\n   * In slashes.\n   *\n   * ```markdown\n   * \u003e | https://example.com/a?b#c\n   *           ^^\n   * ```\n   *\n   * @type {State}\n   */\n  function protocolSlashesInside(code) {\n    if (code === 47) {\n      effects.consume(code);\n      if (seen) {\n        return afterProtocol;\n      }\n      seen = true;\n      return protocolSlashesInside;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After protocol, before domain.\n   *\n   * ```markdown\n   * \u003e | https://example.com/a?b#c\n   *             ^\n   * ```\n   *\n   * @type {State}\n   */\n  function afterProtocol(code) {\n    // To do: this is different from `markdown-rs`:\n    // https://github.com/wooorm/markdown-rs/blob/b3a921c761309ae00a51fe348d8a43adbc54b518/src/construct/gfm_autolink_literal.rs#L172-L182\n    return code === null || asciiControl(code) || markdownLineEndingOrSpace(code) || unicodeWhitespace(code) || unicodePunctuation(code) ? nok(code) : effects.attempt(domain, effects.attempt(path, protocolAfter), nok)(code);\n  }\n\n  /**\n   * After a protocol autolink literal.\n   *\n   * ```markdown\n   * \u003e | https://example.com/a?b#c\n   *                              ^\n   * ```\n   *\n   * @type {State}\n   */\n  function protocolAfter(code) {\n    effects.exit('literalAutolinkHttp');\n    effects.exit('literalAutolink');\n    return ok(code);\n  }\n}\n\n/**\n * `www` prefix.\n *\n * ```markdown\n * \u003e | a www.example.org b\n *       ^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeWwwPrefix(effects, ok, nok) {\n  let size = 0;\n  return wwwPrefixInside;\n\n  /**\n   * In www prefix.\n   *\n   * ```markdown\n   * \u003e | www.example.com\n   *     ^^^^\n   * ```\n   *\n   * @type {State}\n   */\n  function wwwPrefixInside(code) {\n    if ((code === 87 || code === 119) \u0026\u0026 size \u003c 3) {\n      size++;\n      effects.consume(code);\n      return wwwPrefixInside;\n    }\n    if (code === 46 \u0026\u0026 size === 3) {\n      effects.consume(code);\n      return wwwPrefixAfter;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After www prefix.\n   *\n   * ```markdown\n   * \u003e | www.example.com\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function wwwPrefixAfter(code) {\n    // If there is *anything*, we can link.\n    return code === null ? nok(code) : ok(code);\n  }\n}\n\n/**\n * Domain.\n *\n * ```markdown\n * \u003e | a https://example.org b\n *               ^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDomain(effects, ok, nok) {\n  /** @type {boolean | undefined} */\n  let underscoreInLastSegment;\n  /** @type {boolean | undefined} */\n  let underscoreInLastLastSegment;\n  /** @type {boolean | undefined} */\n  let seen;\n  return domainInside;\n\n  /**\n   * In domain.\n   *\n   * ```markdown\n   * \u003e | https://example.com/a\n   *             ^^^^^^^^^^^\n   * ```\n   *\n   * @type {State}\n   */\n  function domainInside(code) {\n    // Check whether this marker, which is a trailing punctuation\n    // marker, optionally followed by more trailing markers, and then\n    // followed by an end.\n    if (code === 46 || code === 95) {\n      return effects.check(trail, domainAfter, domainAtPunctuation)(code);\n    }\n\n    // GH documents that only alphanumerics (other than `-`, `.`, and `_`) can\n    // occur, which sounds like ASCII only, but they also support `www.點看.com`,\n    // so that’s Unicode.\n    // Instead of some new production for Unicode alphanumerics, markdown\n    // already has that for Unicode punctuation and whitespace, so use those.\n    // Source: \u003chttps://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L12\u003e.\n    if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code) || code !== 45 \u0026\u0026 unicodePunctuation(code)) {\n      return domainAfter(code);\n    }\n    seen = true;\n    effects.consume(code);\n    return domainInside;\n  }\n\n  /**\n   * In domain, at potential trailing punctuation, that was not trailing.\n   *\n   * ```markdown\n   * \u003e | https://example.com\n   *                    ^\n   * ```\n   *\n   * @type {State}\n   */\n  function domainAtPunctuation(code) {\n    // There is an underscore in the last segment of the domain\n    if (code === 95) {\n      underscoreInLastSegment = true;\n    }\n    // Otherwise, it’s a `.`: save the last segment underscore in the\n    // penultimate segment slot.\n    else {\n      underscoreInLastLastSegment = underscoreInLastSegment;\n      underscoreInLastSegment = undefined;\n    }\n    effects.consume(code);\n    return domainInside;\n  }\n\n  /**\n   * After domain.\n   *\n   * ```markdown\n   * \u003e | https://example.com/a\n   *                        ^\n   * ```\n   *\n   * @type {State} */\n  function domainAfter(code) {\n    // Note: that’s GH says a dot is needed, but it’s not true:\n    // \u003chttps://github.com/github/cmark-gfm/issues/279\u003e\n    if (underscoreInLastLastSegment || underscoreInLastSegment || !seen) {\n      return nok(code);\n    }\n    return ok(code);\n  }\n}\n\n/**\n * Path.\n *\n * ```markdown\n * \u003e | a https://example.org/stuff b\n *                          ^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizePath(effects, ok) {\n  let sizeOpen = 0;\n  let sizeClose = 0;\n  return pathInside;\n\n  /**\n   * In path.\n   *\n   * ```markdown\n   * \u003e | https://example.com/a\n   *                        ^^\n   * ```\n   *\n   * @type {State}\n   */\n  function pathInside(code) {\n    if (code === 40) {\n      sizeOpen++;\n      effects.consume(code);\n      return pathInside;\n    }\n\n    // To do: `markdown-rs` also needs this.\n    // If this is a paren, and there are less closings than openings,\n    // we don’t check for a trail.\n    if (code === 41 \u0026\u0026 sizeClose \u003c sizeOpen) {\n      return pathAtPunctuation(code);\n    }\n\n    // Check whether this trailing punctuation marker is optionally\n    // followed by more trailing markers, and then followed\n    // by an end.\n    if (code === 33 || code === 34 || code === 38 || code === 39 || code === 41 || code === 42 || code === 44 || code === 46 || code === 58 || code === 59 || code === 60 || code === 63 || code === 93 || code === 95 || code === 126) {\n      return effects.check(trail, ok, pathAtPunctuation)(code);\n    }\n    if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n      return ok(code);\n    }\n    effects.consume(code);\n    return pathInside;\n  }\n\n  /**\n   * In path, at potential trailing punctuation, that was not trailing.\n   *\n   * ```markdown\n   * \u003e | https://example.com/a\"b\n   *                          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function pathAtPunctuation(code) {\n    // Count closing parens.\n    if (code === 41) {\n      sizeClose++;\n    }\n    effects.consume(code);\n    return pathInside;\n  }\n}\n\n/**\n * Trail.\n *\n * This calls `ok` if this *is* the trail, followed by an end, which means\n * the entire trail is not part of the link.\n * It calls `nok` if this *is* part of the link.\n *\n * ```markdown\n * \u003e | https://example.com\").\n *                        ^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTrail(effects, ok, nok) {\n  return trail;\n\n  /**\n   * In trail of domain or path.\n   *\n   * ```markdown\n   * \u003e | https://example.com\").\n   *                        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function trail(code) {\n    // Regular trailing punctuation.\n    if (code === 33 || code === 34 || code === 39 || code === 41 || code === 42 || code === 44 || code === 46 || code === 58 || code === 59 || code === 63 || code === 95 || code === 126) {\n      effects.consume(code);\n      return trail;\n    }\n\n    // `\u0026` followed by one or more alphabeticals and then a `;`, is\n    // as a whole considered as trailing punctuation.\n    // In all other cases, it is considered as continuation of the URL.\n    if (code === 38) {\n      effects.consume(code);\n      return trailCharacterReferenceStart;\n    }\n\n    // Needed because we allow literals after `[`, as we fix:\n    // \u003chttps://github.com/github/cmark-gfm/issues/278\u003e.\n    // Check that it is not followed by `(` or `[`.\n    if (code === 93) {\n      effects.consume(code);\n      return trailBracketAfter;\n    }\n    if (\n    // `\u003c` is an end.\n    code === 60 ||\n    // So is whitespace.\n    code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n      return ok(code);\n    }\n    return nok(code);\n  }\n\n  /**\n   * In trail, after `]`.\n   *\n   * \u003e 👉 **Note**: this deviates from `cmark-gfm` to fix a bug.\n   * \u003e See end of \u003chttps://github.com/github/cmark-gfm/issues/278\u003e for more.\n   *\n   * ```markdown\n   * \u003e | https://example.com](\n   *                         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function trailBracketAfter(code) {\n    // Whitespace or something that could start a resource or reference is the end.\n    // Switch back to trail otherwise.\n    if (code === null || code === 40 || code === 91 || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n      return ok(code);\n    }\n    return trail(code);\n  }\n\n  /**\n   * In character-reference like trail, after `\u0026`.\n   *\n   * ```markdown\n   * \u003e | https://example.com\u0026amp;).\n   *                         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function trailCharacterReferenceStart(code) {\n    // When non-alpha, it’s not a trail.\n    return asciiAlpha(code) ? trailCharacterReferenceInside(code) : nok(code);\n  }\n\n  /**\n   * In character-reference like trail.\n   *\n   * ```markdown\n   * \u003e | https://example.com\u0026amp;).\n   *                         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function trailCharacterReferenceInside(code) {\n    // Switch back to trail if this is well-formed.\n    if (code === 59) {\n      effects.consume(code);\n      return trail;\n    }\n    if (asciiAlpha(code)) {\n      effects.consume(code);\n      return trailCharacterReferenceInside;\n    }\n\n    // It’s not a trail.\n    return nok(code);\n  }\n}\n\n/**\n * Dot in email domain trail.\n *\n * This calls `ok` if this *is* the trail, followed by an end, which means\n * the trail is not part of the link.\n * It calls `nok` if this *is* part of the link.\n *\n * ```markdown\n * \u003e | contact@example.org.\n *                        ^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeEmailDomainDotTrail(effects, ok, nok) {\n  return start;\n\n  /**\n   * Dot.\n   *\n   * ```markdown\n   * \u003e | contact@example.org.\n   *                    ^   ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    // Must be dot.\n    effects.consume(code);\n    return after;\n  }\n\n  /**\n   * After dot.\n   *\n   * ```markdown\n   * \u003e | contact@example.org.\n   *                     ^   ^\n   * ```\n   *\n   * @type {State}\n   */\n  function after(code) {\n    // Not a trail if alphanumeric.\n    return asciiAlphanumeric(code) ? nok(code) : ok(code);\n  }\n}\n\n/**\n * See:\n * \u003chttps://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L156\u003e.\n *\n * @type {Previous}\n */\nfunction previousWww(code) {\n  return code === null || code === 40 || code === 42 || code === 95 || code === 91 || code === 93 || code === 126 || markdownLineEndingOrSpace(code);\n}\n\n/**\n * See:\n * \u003chttps://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L214\u003e.\n *\n * @type {Previous}\n */\nfunction previousProtocol(code) {\n  return !asciiAlpha(code);\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Previous}\n */\nfunction previousEmail(code) {\n  // Do not allow a slash “inside” atext.\n  // The reference code is a bit weird, but that’s what it results in.\n  // Source: \u003chttps://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L307\u003e.\n  // Other than slash, every preceding character is allowed.\n  return !(code === 47 || gfmAtext(code));\n}\n\n/**\n * @param {Code} code\n * @returns {boolean}\n */\nfunction gfmAtext(code) {\n  return code === 43 || code === 45 || code === 46 || code === 95 || asciiAlphanumeric(code);\n}\n\n/**\n * @param {Array\u003cEvent\u003e} events\n * @returns {boolean}\n */\nfunction previousUnbalanced(events) {\n  let index = events.length;\n  let result = false;\n  while (index--) {\n    const token = events[index][1];\n    if ((token.type === 'labelLink' || token.type === 'labelImage') \u0026\u0026 !token._balanced) {\n      result = true;\n      break;\n    }\n\n    // If we’ve seen this token, and it was marked as not having any unbalanced\n    // bracket before it, we can exit.\n    if (token._gfmAutolinkLiteralWalkedInto) {\n      result = false;\n      break;\n    }\n  }\n  if (events.length \u003e 0 \u0026\u0026 !result) {\n    // Mark the last token as “walked into” w/o finding\n    // anything.\n    events[events.length - 1][1]._gfmAutolinkLiteralWalkedInto = true;\n  }\n  return result;\n}","/**\n * @import {Event, Resolver, TokenizeContext} from 'micromark-util-types'\n */\n\n/**\n * Call all `resolveAll`s.\n *\n * @param {ReadonlyArray\u003c{resolveAll?: Resolver | undefined}\u003e} constructs\n *   List of constructs, optionally with `resolveAll`s.\n * @param {Array\u003cEvent\u003e} events\n *   List of events.\n * @param {TokenizeContext} context\n *   Context used by `tokenize`.\n * @returns {Array\u003cEvent\u003e}\n *   Changed events.\n */\nexport function resolveAll(constructs, events, context) {\n  /** @type {Array\u003cResolver\u003e} */\n  const called = []\n  let index = -1\n\n  while (++index \u003c constructs.length) {\n    const resolve = constructs[index].resolveAll\n\n    if (resolve \u0026\u0026 !called.includes(resolve)) {\n      events = resolve(events, context)\n      called.push(resolve)\n    }\n  }\n\n  return events\n}\n","/**\n * @import {Effects, State, TokenType} from 'micromark-util-types'\n */\n\nimport { markdownSpace } from 'micromark-util-character';\n\n// To do: implement `spaceOrTab`, `spaceOrTabMinMax`, `spaceOrTabWithOptions`.\n\n/**\n * Parse spaces and tabs.\n *\n * There is no `nok` parameter:\n *\n * *   spaces in markdown are often optional, in which case this factory can be\n *     used and `ok` will be switched to whether spaces were found or not\n * *   one line ending or space can be detected with `markdownSpace(code)` right\n *     before using `factorySpace`\n *\n * ###### Examples\n *\n * Where `␉` represents a tab (plus how much it expands) and `␠` represents a\n * single space.\n *\n * ```markdown\n * ␉\n * ␠␠␠␠\n * ␉␠\n * ```\n *\n * @param {Effects} effects\n *   Context.\n * @param {State} ok\n *   State switched to when successful.\n * @param {TokenType} type\n *   Type (`' \\t'`).\n * @param {number | undefined} [max=Infinity]\n *   Max (exclusive).\n * @returns {State}\n *   Start state.\n */\nexport function factorySpace(effects, ok, type, max) {\n  const limit = max ? max - 1 : Number.POSITIVE_INFINITY;\n  let size = 0;\n  return start;\n\n  /** @type {State} */\n  function start(code) {\n    if (markdownSpace(code)) {\n      effects.enter(type);\n      return prefix(code);\n    }\n    return ok(code);\n  }\n\n  /** @type {State} */\n  function prefix(code) {\n    if (markdownSpace(code) \u0026\u0026 size++ \u003c limit) {\n      effects.consume(code);\n      return prefix;\n    }\n    effects.exit(type);\n    return ok(code);\n  }\n}","/**\n * @import {\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const blankLine = {\n  partial: true,\n  tokenize: tokenizeBlankLine\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeBlankLine(effects, ok, nok) {\n  return start;\n\n  /**\n   * Start of blank line.\n   *\n   * \u003e 👉 **Note**: `␠` represents a space character.\n   *\n   * ```markdown\n   * \u003e | ␠␠␊\n   *     ^\n   * \u003e | ␊\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    return markdownSpace(code) ? factorySpace(effects, after, \"linePrefix\")(code) : after(code);\n  }\n\n  /**\n   * At eof/eol, after optional whitespace.\n   *\n   * \u003e 👉 **Note**: `␠` represents a space character.\n   *\n   * ```markdown\n   * \u003e | ␠␠␊\n   *       ^\n   * \u003e | ␊\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function after(code) {\n    return code === null || markdownLineEnding(code) ? ok(code) : nok(code);\n  }\n}","/**\n * @import {Event, Exiter, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { blankLine } from 'micromark-core-commonmark';\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEndingOrSpace } from 'micromark-util-character';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\nconst indent = {\n  tokenize: tokenizeIndent,\n  partial: true\n};\n\n// To do: micromark should support a `_hiddenGfmFootnoteSupport`, which only\n// affects label start (image).\n// That will let us drop `tokenizePotentialGfmFootnote*`.\n// It currently has a `_hiddenFootnoteSupport`, which affects that and more.\n// That can be removed when `micromark-extension-footnote` is archived.\n\n/**\n * Create an extension for `micromark` to enable GFM footnote syntax.\n *\n * @returns {Extension}\n *   Extension for `micromark` that can be passed in `extensions` to\n *   enable GFM footnote syntax.\n */\nexport function gfmFootnote() {\n  /** @type {Extension} */\n  return {\n    document: {\n      [91]: {\n        name: 'gfmFootnoteDefinition',\n        tokenize: tokenizeDefinitionStart,\n        continuation: {\n          tokenize: tokenizeDefinitionContinuation\n        },\n        exit: gfmFootnoteDefinitionEnd\n      }\n    },\n    text: {\n      [91]: {\n        name: 'gfmFootnoteCall',\n        tokenize: tokenizeGfmFootnoteCall\n      },\n      [93]: {\n        name: 'gfmPotentialFootnoteCall',\n        add: 'after',\n        tokenize: tokenizePotentialGfmFootnoteCall,\n        resolveTo: resolveToPotentialGfmFootnoteCall\n      }\n    }\n  };\n}\n\n// To do: remove after micromark update.\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizePotentialGfmFootnoteCall(effects, ok, nok) {\n  const self = this;\n  let index = self.events.length;\n  const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n  /** @type {Token} */\n  let labelStart;\n\n  // Find an opening.\n  while (index--) {\n    const token = self.events[index][1];\n    if (token.type === \"labelImage\") {\n      labelStart = token;\n      break;\n    }\n\n    // Exit if we’ve walked far enough.\n    if (token.type === 'gfmFootnoteCall' || token.type === \"labelLink\" || token.type === \"label\" || token.type === \"image\" || token.type === \"link\") {\n      break;\n    }\n  }\n  return start;\n\n  /**\n   * @type {State}\n   */\n  function start(code) {\n    if (!labelStart || !labelStart._balanced) {\n      return nok(code);\n    }\n    const id = normalizeIdentifier(self.sliceSerialize({\n      start: labelStart.end,\n      end: self.now()\n    }));\n    if (id.codePointAt(0) !== 94 || !defined.includes(id.slice(1))) {\n      return nok(code);\n    }\n    effects.enter('gfmFootnoteCallLabelMarker');\n    effects.consume(code);\n    effects.exit('gfmFootnoteCallLabelMarker');\n    return ok(code);\n  }\n}\n\n// To do: remove after micromark update.\n/** @type {Resolver} */\nfunction resolveToPotentialGfmFootnoteCall(events, context) {\n  let index = events.length;\n  /** @type {Token | undefined} */\n  let labelStart;\n\n  // Find an opening.\n  while (index--) {\n    if (events[index][1].type === \"labelImage\" \u0026\u0026 events[index][0] === 'enter') {\n      labelStart = events[index][1];\n      break;\n    }\n  }\n  // Change the `labelImageMarker` to a `data`.\n  events[index + 1][1].type = \"data\";\n  events[index + 3][1].type = 'gfmFootnoteCallLabelMarker';\n\n  // The whole (without `!`):\n  /** @type {Token} */\n  const call = {\n    type: 'gfmFootnoteCall',\n    start: Object.assign({}, events[index + 3][1].start),\n    end: Object.assign({}, events[events.length - 1][1].end)\n  };\n  // The `^` marker\n  /** @type {Token} */\n  const marker = {\n    type: 'gfmFootnoteCallMarker',\n    start: Object.assign({}, events[index + 3][1].end),\n    end: Object.assign({}, events[index + 3][1].end)\n  };\n  // Increment the end 1 character.\n  marker.end.column++;\n  marker.end.offset++;\n  marker.end._bufferIndex++;\n  /** @type {Token} */\n  const string = {\n    type: 'gfmFootnoteCallString',\n    start: Object.assign({}, marker.end),\n    end: Object.assign({}, events[events.length - 1][1].start)\n  };\n  /** @type {Token} */\n  const chunk = {\n    type: \"chunkString\",\n    contentType: 'string',\n    start: Object.assign({}, string.start),\n    end: Object.assign({}, string.end)\n  };\n\n  /** @type {Array\u003cEvent\u003e} */\n  const replacement = [\n  // Take the `labelImageMarker` (now `data`, the `!`)\n  events[index + 1], events[index + 2], ['enter', call, context],\n  // The `[`\n  events[index + 3], events[index + 4],\n  // The `^`.\n  ['enter', marker, context], ['exit', marker, context],\n  // Everything in between.\n  ['enter', string, context], ['enter', chunk, context], ['exit', chunk, context], ['exit', string, context],\n  // The ending (`]`, properly parsed and labelled).\n  events[events.length - 2], events[events.length - 1], ['exit', call, context]];\n  events.splice(index, events.length - index + 1, ...replacement);\n  return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeGfmFootnoteCall(effects, ok, nok) {\n  const self = this;\n  const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n  let size = 0;\n  /** @type {boolean} */\n  let data;\n\n  // Note: the implementation of `markdown-rs` is different, because it houses\n  // core *and* extensions in one project.\n  // Therefore, it can include footnote logic inside `label-end`.\n  // We can’t do that, but luckily, we can parse footnotes in a simpler way than\n  // needed for labels.\n  return start;\n\n  /**\n   * Start of footnote label.\n   *\n   * ```markdown\n   * \u003e | a [^b] c\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter('gfmFootnoteCall');\n    effects.enter('gfmFootnoteCallLabelMarker');\n    effects.consume(code);\n    effects.exit('gfmFootnoteCallLabelMarker');\n    return callStart;\n  }\n\n  /**\n   * After `[`, at `^`.\n   *\n   * ```markdown\n   * \u003e | a [^b] c\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function callStart(code) {\n    if (code !== 94) return nok(code);\n    effects.enter('gfmFootnoteCallMarker');\n    effects.consume(code);\n    effects.exit('gfmFootnoteCallMarker');\n    effects.enter('gfmFootnoteCallString');\n    effects.enter('chunkString').contentType = 'string';\n    return callData;\n  }\n\n  /**\n   * In label.\n   *\n   * ```markdown\n   * \u003e | a [^b] c\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function callData(code) {\n    if (\n    // Too long.\n    size \u003e 999 ||\n    // Closing brace with nothing.\n    code === 93 \u0026\u0026 !data ||\n    // Space or tab is not supported by GFM for some reason.\n    // `\\n` and `[` not being supported makes sense.\n    code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n      return nok(code);\n    }\n    if (code === 93) {\n      effects.exit('chunkString');\n      const token = effects.exit('gfmFootnoteCallString');\n      if (!defined.includes(normalizeIdentifier(self.sliceSerialize(token)))) {\n        return nok(code);\n      }\n      effects.enter('gfmFootnoteCallLabelMarker');\n      effects.consume(code);\n      effects.exit('gfmFootnoteCallLabelMarker');\n      effects.exit('gfmFootnoteCall');\n      return ok;\n    }\n    if (!markdownLineEndingOrSpace(code)) {\n      data = true;\n    }\n    size++;\n    effects.consume(code);\n    return code === 92 ? callEscape : callData;\n  }\n\n  /**\n   * On character after escape.\n   *\n   * ```markdown\n   * \u003e | a [^b\\c] d\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function callEscape(code) {\n    if (code === 91 || code === 92 || code === 93) {\n      effects.consume(code);\n      size++;\n      return callData;\n    }\n    return callData(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionStart(effects, ok, nok) {\n  const self = this;\n  const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n  /** @type {string} */\n  let identifier;\n  let size = 0;\n  /** @type {boolean | undefined} */\n  let data;\n  return start;\n\n  /**\n   * Start of GFM footnote definition.\n   *\n   * ```markdown\n   * \u003e | [^a]: b\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter('gfmFootnoteDefinition')._container = true;\n    effects.enter('gfmFootnoteDefinitionLabel');\n    effects.enter('gfmFootnoteDefinitionLabelMarker');\n    effects.consume(code);\n    effects.exit('gfmFootnoteDefinitionLabelMarker');\n    return labelAtMarker;\n  }\n\n  /**\n   * In label, at caret.\n   *\n   * ```markdown\n   * \u003e | [^a]: b\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function labelAtMarker(code) {\n    if (code === 94) {\n      effects.enter('gfmFootnoteDefinitionMarker');\n      effects.consume(code);\n      effects.exit('gfmFootnoteDefinitionMarker');\n      effects.enter('gfmFootnoteDefinitionLabelString');\n      effects.enter('chunkString').contentType = 'string';\n      return labelInside;\n    }\n    return nok(code);\n  }\n\n  /**\n   * In label.\n   *\n   * \u003e 👉 **Note**: `cmark-gfm` prevents whitespace from occurring in footnote\n   * \u003e definition labels.\n   *\n   * ```markdown\n   * \u003e | [^a]: b\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function labelInside(code) {\n    if (\n    // Too long.\n    size \u003e 999 ||\n    // Closing brace with nothing.\n    code === 93 \u0026\u0026 !data ||\n    // Space or tab is not supported by GFM for some reason.\n    // `\\n` and `[` not being supported makes sense.\n    code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n      return nok(code);\n    }\n    if (code === 93) {\n      effects.exit('chunkString');\n      const token = effects.exit('gfmFootnoteDefinitionLabelString');\n      identifier = normalizeIdentifier(self.sliceSerialize(token));\n      effects.enter('gfmFootnoteDefinitionLabelMarker');\n      effects.consume(code);\n      effects.exit('gfmFootnoteDefinitionLabelMarker');\n      effects.exit('gfmFootnoteDefinitionLabel');\n      return labelAfter;\n    }\n    if (!markdownLineEndingOrSpace(code)) {\n      data = true;\n    }\n    size++;\n    effects.consume(code);\n    return code === 92 ? labelEscape : labelInside;\n  }\n\n  /**\n   * After `\\`, at a special character.\n   *\n   * \u003e 👉 **Note**: `cmark-gfm` currently does not support escaped brackets:\n   * \u003e \u003chttps://github.com/github/cmark-gfm/issues/240\u003e\n   *\n   * ```markdown\n   * \u003e | [^a\\*b]: c\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function labelEscape(code) {\n    if (code === 91 || code === 92 || code === 93) {\n      effects.consume(code);\n      size++;\n      return labelInside;\n    }\n    return labelInside(code);\n  }\n\n  /**\n   * After definition label.\n   *\n   * ```markdown\n   * \u003e | [^a]: b\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function labelAfter(code) {\n    if (code === 58) {\n      effects.enter('definitionMarker');\n      effects.consume(code);\n      effects.exit('definitionMarker');\n      if (!defined.includes(identifier)) {\n        defined.push(identifier);\n      }\n\n      // Any whitespace after the marker is eaten, forming indented code\n      // is not possible.\n      // No space is also fine, just like a block quote marker.\n      return factorySpace(effects, whitespaceAfter, 'gfmFootnoteDefinitionWhitespace');\n    }\n    return nok(code);\n  }\n\n  /**\n   * After definition prefix.\n   *\n   * ```markdown\n   * \u003e | [^a]: b\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function whitespaceAfter(code) {\n    // `markdown-rs` has a wrapping token for the prefix that is closed here.\n    return ok(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionContinuation(effects, ok, nok) {\n  /// Start of footnote definition continuation.\n  ///\n  /// ```markdown\n  ///   | [^a]: b\n  /// \u003e |     c\n  ///     ^\n  /// ```\n  //\n  // Either a blank line, which is okay, or an indented thing.\n  return effects.check(blankLine, ok, effects.attempt(indent, ok, nok));\n}\n\n/** @type {Exiter} */\nfunction gfmFootnoteDefinitionEnd(effects) {\n  effects.exit('gfmFootnoteDefinition');\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeIndent(effects, ok, nok) {\n  const self = this;\n  return factorySpace(effects, afterPrefix, 'gfmFootnoteDefinitionIndent', 4 + 1);\n\n  /**\n   * @type {State}\n   */\n  function afterPrefix(code) {\n    const tail = self.events[self.events.length - 1];\n    return tail \u0026\u0026 tail[1].type === 'gfmFootnoteDefinitionIndent' \u0026\u0026 tail[2].sliceSerialize(tail[1], true).length === 4 ? ok(code) : nok(code);\n  }\n}","/**\n * @import {Options} from 'micromark-extension-gfm-strikethrough'\n * @import {Event, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { splice } from 'micromark-util-chunked';\nimport { classifyCharacter } from 'micromark-util-classify-character';\nimport { resolveAll } from 'micromark-util-resolve-all';\n/**\n * Create an extension for `micromark` to enable GFM strikethrough syntax.\n *\n * @param {Options | null | undefined} [options={}]\n *   Configuration.\n * @returns {Extension}\n *   Extension for `micromark` that can be passed in `extensions`, to\n *   enable GFM strikethrough syntax.\n */\nexport function gfmStrikethrough(options) {\n  const options_ = options || {};\n  let single = options_.singleTilde;\n  const tokenizer = {\n    name: 'strikethrough',\n    tokenize: tokenizeStrikethrough,\n    resolveAll: resolveAllStrikethrough\n  };\n  if (single === null || single === undefined) {\n    single = true;\n  }\n  return {\n    text: {\n      [126]: tokenizer\n    },\n    insideSpan: {\n      null: [tokenizer]\n    },\n    attentionMarkers: {\n      null: [126]\n    }\n  };\n\n  /**\n   * Take events and resolve strikethrough.\n   *\n   * @type {Resolver}\n   */\n  function resolveAllStrikethrough(events, context) {\n    let index = -1;\n\n    // Walk through all events.\n    while (++index \u003c events.length) {\n      // Find a token that can close.\n      if (events[index][0] === 'enter' \u0026\u0026 events[index][1].type === 'strikethroughSequenceTemporary' \u0026\u0026 events[index][1]._close) {\n        let open = index;\n\n        // Now walk back to find an opener.\n        while (open--) {\n          // Find a token that can open the closer.\n          if (events[open][0] === 'exit' \u0026\u0026 events[open][1].type === 'strikethroughSequenceTemporary' \u0026\u0026 events[open][1]._open \u0026\u0026\n          // If the sizes are the same:\n          events[index][1].end.offset - events[index][1].start.offset === events[open][1].end.offset - events[open][1].start.offset) {\n            events[index][1].type = 'strikethroughSequence';\n            events[open][1].type = 'strikethroughSequence';\n\n            /** @type {Token} */\n            const strikethrough = {\n              type: 'strikethrough',\n              start: Object.assign({}, events[open][1].start),\n              end: Object.assign({}, events[index][1].end)\n            };\n\n            /** @type {Token} */\n            const text = {\n              type: 'strikethroughText',\n              start: Object.assign({}, events[open][1].end),\n              end: Object.assign({}, events[index][1].start)\n            };\n\n            // Opening.\n            /** @type {Array\u003cEvent\u003e} */\n            const nextEvents = [['enter', strikethrough, context], ['enter', events[open][1], context], ['exit', events[open][1], context], ['enter', text, context]];\n            const insideSpan = context.parser.constructs.insideSpan.null;\n            if (insideSpan) {\n              // Between.\n              splice(nextEvents, nextEvents.length, 0, resolveAll(insideSpan, events.slice(open + 1, index), context));\n            }\n\n            // Closing.\n            splice(nextEvents, nextEvents.length, 0, [['exit', text, context], ['enter', events[index][1], context], ['exit', events[index][1], context], ['exit', strikethrough, context]]);\n            splice(events, open - 1, index - open + 3, nextEvents);\n            index = open + nextEvents.length - 2;\n            break;\n          }\n        }\n      }\n    }\n    index = -1;\n    while (++index \u003c events.length) {\n      if (events[index][1].type === 'strikethroughSequenceTemporary') {\n        events[index][1].type = \"data\";\n      }\n    }\n    return events;\n  }\n\n  /**\n   * @this {TokenizeContext}\n   * @type {Tokenizer}\n   */\n  function tokenizeStrikethrough(effects, ok, nok) {\n    const previous = this.previous;\n    const events = this.events;\n    let size = 0;\n    return start;\n\n    /** @type {State} */\n    function start(code) {\n      if (previous === 126 \u0026\u0026 events[events.length - 1][1].type !== \"characterEscape\") {\n        return nok(code);\n      }\n      effects.enter('strikethroughSequenceTemporary');\n      return more(code);\n    }\n\n    /** @type {State} */\n    function more(code) {\n      const before = classifyCharacter(previous);\n      if (code === 126) {\n        // If this is the third marker, exit.\n        if (size \u003e 1) return nok(code);\n        effects.consume(code);\n        size++;\n        return more;\n      }\n      if (size \u003c 2 \u0026\u0026 !single) return nok(code);\n      const token = effects.exit('strikethroughSequenceTemporary');\n      const after = classifyCharacter(code);\n      token._open = !after || after === 2 \u0026\u0026 Boolean(before);\n      token._close = !before || before === 2 \u0026\u0026 Boolean(after);\n      return ok(code);\n    }\n  }\n}","/**\n * @import {Event} from 'micromark-util-types'\n */\n\n// Port of `edit_map.rs` from `markdown-rs`.\n// This should move to `markdown-js` later.\n\n// Deal with several changes in events, batching them together.\n//\n// Preferably, changes should be kept to a minimum.\n// Sometimes, it’s needed to change the list of events, because parsing can be\n// messy, and it helps to expose a cleaner interface of events to the compiler\n// and other users.\n// It can also help to merge many adjacent similar events.\n// And, in other cases, it’s needed to parse subcontent: pass some events\n// through another tokenizer and inject the result.\n\n/**\n * @typedef {[number, number, Array\u003cEvent\u003e]} Change\n * @typedef {[number, number, number]} Jump\n */\n\n/**\n * Tracks a bunch of edits.\n */\nexport class EditMap {\n  /**\n   * Create a new edit map.\n   */\n  constructor() {\n    /**\n     * Record of changes.\n     *\n     * @type {Array\u003cChange\u003e}\n     */\n    this.map = [];\n  }\n\n  /**\n   * Create an edit: a remove and/or add at a certain place.\n   *\n   * @param {number} index\n   * @param {number} remove\n   * @param {Array\u003cEvent\u003e} add\n   * @returns {undefined}\n   */\n  add(index, remove, add) {\n    addImplementation(this, index, remove, add);\n  }\n\n  // To do: add this when moving to `micromark`.\n  // /**\n  //  * Create an edit: but insert `add` before existing additions.\n  //  *\n  //  * @param {number} index\n  //  * @param {number} remove\n  //  * @param {Array\u003cEvent\u003e} add\n  //  * @returns {undefined}\n  //  */\n  // addBefore(index, remove, add) {\n  //   addImplementation(this, index, remove, add, true)\n  // }\n\n  /**\n   * Done, change the events.\n   *\n   * @param {Array\u003cEvent\u003e} events\n   * @returns {undefined}\n   */\n  consume(events) {\n    this.map.sort(function (a, b) {\n      return a[0] - b[0];\n    });\n\n    /* c8 ignore next 3 -- `resolve` is never called without tables, so without edits. */\n    if (this.map.length === 0) {\n      return;\n    }\n\n    // To do: if links are added in events, like they are in `markdown-rs`,\n    // this is needed.\n    // // Calculate jumps: where items in the current list move to.\n    // /** @type {Array\u003cJump\u003e} */\n    // const jumps = []\n    // let index = 0\n    // let addAcc = 0\n    // let removeAcc = 0\n    // while (index \u003c this.map.length) {\n    //   const [at, remove, add] = this.map[index]\n    //   removeAcc += remove\n    //   addAcc += add.length\n    //   jumps.push([at, removeAcc, addAcc])\n    //   index += 1\n    // }\n    //\n    // . shiftLinks(events, jumps)\n\n    let index = this.map.length;\n    /** @type {Array\u003cArray\u003cEvent\u003e\u003e} */\n    const vecs = [];\n    while (index \u003e 0) {\n      index -= 1;\n      vecs.push(events.slice(this.map[index][0] + this.map[index][1]), this.map[index][2]);\n\n      // Truncate rest.\n      events.length = this.map[index][0];\n    }\n    vecs.push(events.slice());\n    events.length = 0;\n    let slice = vecs.pop();\n    while (slice) {\n      for (const element of slice) {\n        events.push(element);\n      }\n      slice = vecs.pop();\n    }\n\n    // Truncate everything.\n    this.map.length = 0;\n  }\n}\n\n/**\n * Create an edit.\n *\n * @param {EditMap} editMap\n * @param {number} at\n * @param {number} remove\n * @param {Array\u003cEvent\u003e} add\n * @returns {undefined}\n */\nfunction addImplementation(editMap, at, remove, add) {\n  let index = 0;\n\n  /* c8 ignore next 3 -- `resolve` is never called without tables, so without edits. */\n  if (remove === 0 \u0026\u0026 add.length === 0) {\n    return;\n  }\n  while (index \u003c editMap.map.length) {\n    if (editMap.map[index][0] === at) {\n      editMap.map[index][1] += remove;\n\n      // To do: before not used by tables, use when moving to micromark.\n      // if (before) {\n      //   add.push(...editMap.map[index][2])\n      //   editMap.map[index][2] = add\n      // } else {\n      editMap.map[index][2].push(...add);\n      // }\n\n      return;\n    }\n    index += 1;\n  }\n  editMap.map.push([at, remove, add]);\n}\n\n// /**\n//  * Shift `previous` and `next` links according to `jumps`.\n//  *\n//  * This fixes links in case there are events removed or added between them.\n//  *\n//  * @param {Array\u003cEvent\u003e} events\n//  * @param {Array\u003cJump\u003e} jumps\n//  */\n// function shiftLinks(events, jumps) {\n//   let jumpIndex = 0\n//   let index = 0\n//   let add = 0\n//   let rm = 0\n\n//   while (index \u003c events.length) {\n//     const rmCurr = rm\n\n//     while (jumpIndex \u003c jumps.length \u0026\u0026 jumps[jumpIndex][0] \u003c= index) {\n//       add = jumps[jumpIndex][2]\n//       rm = jumps[jumpIndex][1]\n//       jumpIndex += 1\n//     }\n\n//     // Ignore items that will be removed.\n//     if (rm \u003e rmCurr) {\n//       index += rm - rmCurr\n//     } else {\n//       // ?\n//       // if let Some(link) = \u0026events[index].link {\n//       //     if let Some(next) = link.next {\n//       //         events[next].link.as_mut().unwrap().previous = Some(index + add - rm);\n//       //         while jumpIndex \u003c jumps.len() \u0026\u0026 jumps[jumpIndex].0 \u003c= next {\n//       //             add = jumps[jumpIndex].2;\n//       //             rm = jumps[jumpIndex].1;\n//       //             jumpIndex += 1;\n//       //         }\n//       //         events[index].link.as_mut().unwrap().next = Some(next + add - rm);\n//       //         index = next;\n//       //         continue;\n//       //     }\n//       // }\n//       index += 1\n//     }\n//   }\n// }","/**\n * @import {Event} from 'micromark-util-types'\n */\n\n/**\n * @typedef {'center' | 'left' | 'none' | 'right'} Align\n */\n\n/**\n * Figure out the alignment of a GFM table.\n *\n * @param {Readonly\u003cArray\u003cEvent\u003e\u003e} events\n *   List of events.\n * @param {number} index\n *   Table enter event.\n * @returns {Array\u003cAlign\u003e}\n *   List of aligns.\n */\nexport function gfmTableAlign(events, index) {\n  let inDelimiterRow = false;\n  /** @type {Array\u003cAlign\u003e} */\n  const align = [];\n  while (index \u003c events.length) {\n    const event = events[index];\n    if (inDelimiterRow) {\n      if (event[0] === 'enter') {\n        // Start of alignment value: set a new column.\n        // To do: `markdown-rs` uses `tableDelimiterCellValue`.\n        if (event[1].type === 'tableContent') {\n          align.push(events[index + 1][1].type === 'tableDelimiterMarker' ? 'left' : 'none');\n        }\n      }\n      // Exits:\n      // End of alignment value: change the column.\n      // To do: `markdown-rs` uses `tableDelimiterCellValue`.\n      else if (event[1].type === 'tableContent') {\n        if (events[index - 1][1].type === 'tableDelimiterMarker') {\n          const alignIndex = align.length - 1;\n          align[alignIndex] = align[alignIndex] === 'left' ? 'center' : 'right';\n        }\n      }\n      // Done!\n      else if (event[1].type === 'tableDelimiterRow') {\n        break;\n      }\n    } else if (event[0] === 'enter' \u0026\u0026 event[1].type === 'tableDelimiterRow') {\n      inDelimiterRow = true;\n    }\n    index += 1;\n  }\n  return align;\n}","/**\n * @import {Event, Extension, Point, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\n/**\n * @typedef {[number, number, number, number]} Range\n *   Cell info.\n *\n * @typedef {0 | 1 | 2 | 3} RowKind\n *   Where we are: `1` for head row, `2` for delimiter row, `3` for body row.\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nimport { EditMap } from './edit-map.js';\nimport { gfmTableAlign } from './infer.js';\n\n/**\n * Create an HTML extension for `micromark` to support GitHub tables syntax.\n *\n * @returns {Extension}\n *   Extension for `micromark` that can be passed in `extensions` to enable GFM\n *   table syntax.\n */\nexport function gfmTable() {\n  return {\n    flow: {\n      null: {\n        name: 'table',\n        tokenize: tokenizeTable,\n        resolveAll: resolveTable\n      }\n    }\n  };\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTable(effects, ok, nok) {\n  const self = this;\n  let size = 0;\n  let sizeB = 0;\n  /** @type {boolean | undefined} */\n  let seen;\n  return start;\n\n  /**\n   * Start of a GFM table.\n   *\n   * If there is a valid table row or table head before, then we try to parse\n   * another row.\n   * Otherwise, we try to parse a head.\n   *\n   * ```markdown\n   * \u003e | | a |\n   *     ^\n   *   | | - |\n   * \u003e | | b |\n   *     ^\n   * ```\n   * @type {State}\n   */\n  function start(code) {\n    let index = self.events.length - 1;\n    while (index \u003e -1) {\n      const type = self.events[index][1].type;\n      if (type === \"lineEnding\" ||\n      // Note: markdown-rs uses `whitespace` instead of `linePrefix`\n      type === \"linePrefix\") index--;else break;\n    }\n    const tail = index \u003e -1 ? self.events[index][1].type : null;\n    const next = tail === 'tableHead' || tail === 'tableRow' ? bodyRowStart : headRowBefore;\n\n    // Don’t allow lazy body rows.\n    if (next === bodyRowStart \u0026\u0026 self.parser.lazy[self.now().line]) {\n      return nok(code);\n    }\n    return next(code);\n  }\n\n  /**\n   * Before table head row.\n   *\n   * ```markdown\n   * \u003e | | a |\n   *     ^\n   *   | | - |\n   *   | | b |\n   * ```\n   *\n   * @type {State}\n   */\n  function headRowBefore(code) {\n    effects.enter('tableHead');\n    effects.enter('tableRow');\n    return headRowStart(code);\n  }\n\n  /**\n   * Before table head row, after whitespace.\n   *\n   * ```markdown\n   * \u003e | | a |\n   *     ^\n   *   | | - |\n   *   | | b |\n   * ```\n   *\n   * @type {State}\n   */\n  function headRowStart(code) {\n    if (code === 124) {\n      return headRowBreak(code);\n    }\n\n    // To do: micromark-js should let us parse our own whitespace in extensions,\n    // like `markdown-rs`:\n    //\n    // ```js\n    // // 4+ spaces.\n    // if (markdownSpace(code)) {\n    //   return nok(code)\n    // }\n    // ```\n\n    seen = true;\n    // Count the first character, that isn’t a pipe, double.\n    sizeB += 1;\n    return headRowBreak(code);\n  }\n\n  /**\n   * At break in table head row.\n   *\n   * ```markdown\n   * \u003e | | a |\n   *     ^\n   *       ^\n   *         ^\n   *   | | - |\n   *   | | b |\n   * ```\n   *\n   * @type {State}\n   */\n  function headRowBreak(code) {\n    if (code === null) {\n      // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n      return nok(code);\n    }\n    if (markdownLineEnding(code)) {\n      // If anything other than one pipe (ignoring whitespace) was used, it’s fine.\n      if (sizeB \u003e 1) {\n        sizeB = 0;\n        // To do: check if this works.\n        // Feel free to interrupt:\n        self.interrupt = true;\n        effects.exit('tableRow');\n        effects.enter(\"lineEnding\");\n        effects.consume(code);\n        effects.exit(\"lineEnding\");\n        return headDelimiterStart;\n      }\n\n      // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n      return nok(code);\n    }\n    if (markdownSpace(code)) {\n      // To do: check if this is fine.\n      // effects.attempt(State::Next(StateName::GfmTableHeadRowBreak), State::Nok)\n      // State::Retry(space_or_tab(tokenizer))\n      return factorySpace(effects, headRowBreak, \"whitespace\")(code);\n    }\n    sizeB += 1;\n    if (seen) {\n      seen = false;\n      // Header cell count.\n      size += 1;\n    }\n    if (code === 124) {\n      effects.enter('tableCellDivider');\n      effects.consume(code);\n      effects.exit('tableCellDivider');\n      // Whether a delimiter was seen.\n      seen = true;\n      return headRowBreak;\n    }\n\n    // Anything else is cell data.\n    effects.enter(\"data\");\n    return headRowData(code);\n  }\n\n  /**\n   * In table head row data.\n   *\n   * ```markdown\n   * \u003e | | a |\n   *       ^\n   *   | | - |\n   *   | | b |\n   * ```\n   *\n   * @type {State}\n   */\n  function headRowData(code) {\n    if (code === null || code === 124 || markdownLineEndingOrSpace(code)) {\n      effects.exit(\"data\");\n      return headRowBreak(code);\n    }\n    effects.consume(code);\n    return code === 92 ? headRowEscape : headRowData;\n  }\n\n  /**\n   * In table head row escape.\n   *\n   * ```markdown\n   * \u003e | | a\\-b |\n   *         ^\n   *   | | ---- |\n   *   | | c    |\n   * ```\n   *\n   * @type {State}\n   */\n  function headRowEscape(code) {\n    if (code === 92 || code === 124) {\n      effects.consume(code);\n      return headRowData;\n    }\n    return headRowData(code);\n  }\n\n  /**\n   * Before delimiter row.\n   *\n   * ```markdown\n   *   | | a |\n   * \u003e | | - |\n   *     ^\n   *   | | b |\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterStart(code) {\n    // Reset `interrupt`.\n    self.interrupt = false;\n\n    // Note: in `markdown-rs`, we need to handle piercing here too.\n    if (self.parser.lazy[self.now().line]) {\n      return nok(code);\n    }\n    effects.enter('tableDelimiterRow');\n    // Track if we’ve seen a `:` or `|`.\n    seen = false;\n    if (markdownSpace(code)) {\n      return factorySpace(effects, headDelimiterBefore, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code);\n    }\n    return headDelimiterBefore(code);\n  }\n\n  /**\n   * Before delimiter row, after optional whitespace.\n   *\n   * Reused when a `|` is found later, to parse another cell.\n   *\n   * ```markdown\n   *   | | a |\n   * \u003e | | - |\n   *     ^\n   *   | | b |\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterBefore(code) {\n    if (code === 45 || code === 58) {\n      return headDelimiterValueBefore(code);\n    }\n    if (code === 124) {\n      seen = true;\n      // If we start with a pipe, we open a cell marker.\n      effects.enter('tableCellDivider');\n      effects.consume(code);\n      effects.exit('tableCellDivider');\n      return headDelimiterCellBefore;\n    }\n\n    // More whitespace / empty row not allowed at start.\n    return headDelimiterNok(code);\n  }\n\n  /**\n   * After `|`, before delimiter cell.\n   *\n   * ```markdown\n   *   | | a |\n   * \u003e | | - |\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterCellBefore(code) {\n    if (markdownSpace(code)) {\n      return factorySpace(effects, headDelimiterValueBefore, \"whitespace\")(code);\n    }\n    return headDelimiterValueBefore(code);\n  }\n\n  /**\n   * Before delimiter cell value.\n   *\n   * ```markdown\n   *   | | a |\n   * \u003e | | - |\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterValueBefore(code) {\n    // Align: left.\n    if (code === 58) {\n      sizeB += 1;\n      seen = true;\n      effects.enter('tableDelimiterMarker');\n      effects.consume(code);\n      effects.exit('tableDelimiterMarker');\n      return headDelimiterLeftAlignmentAfter;\n    }\n\n    // Align: none.\n    if (code === 45) {\n      sizeB += 1;\n      // To do: seems weird that this *isn’t* left aligned, but that state is used?\n      return headDelimiterLeftAlignmentAfter(code);\n    }\n    if (code === null || markdownLineEnding(code)) {\n      return headDelimiterCellAfter(code);\n    }\n    return headDelimiterNok(code);\n  }\n\n  /**\n   * After delimiter cell left alignment marker.\n   *\n   * ```markdown\n   *   | | a  |\n   * \u003e | | :- |\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterLeftAlignmentAfter(code) {\n    if (code === 45) {\n      effects.enter('tableDelimiterFiller');\n      return headDelimiterFiller(code);\n    }\n\n    // Anything else is not ok after the left-align colon.\n    return headDelimiterNok(code);\n  }\n\n  /**\n   * In delimiter cell filler.\n   *\n   * ```markdown\n   *   | | a |\n   * \u003e | | - |\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterFiller(code) {\n    if (code === 45) {\n      effects.consume(code);\n      return headDelimiterFiller;\n    }\n\n    // Align is `center` if it was `left`, `right` otherwise.\n    if (code === 58) {\n      seen = true;\n      effects.exit('tableDelimiterFiller');\n      effects.enter('tableDelimiterMarker');\n      effects.consume(code);\n      effects.exit('tableDelimiterMarker');\n      return headDelimiterRightAlignmentAfter;\n    }\n    effects.exit('tableDelimiterFiller');\n    return headDelimiterRightAlignmentAfter(code);\n  }\n\n  /**\n   * After delimiter cell right alignment marker.\n   *\n   * ```markdown\n   *   | |  a |\n   * \u003e | | -: |\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterRightAlignmentAfter(code) {\n    if (markdownSpace(code)) {\n      return factorySpace(effects, headDelimiterCellAfter, \"whitespace\")(code);\n    }\n    return headDelimiterCellAfter(code);\n  }\n\n  /**\n   * After delimiter cell.\n   *\n   * ```markdown\n   *   | |  a |\n   * \u003e | | -: |\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterCellAfter(code) {\n    if (code === 124) {\n      return headDelimiterBefore(code);\n    }\n    if (code === null || markdownLineEnding(code)) {\n      // Exit when:\n      // * there was no `:` or `|` at all (it’s a thematic break or setext\n      //   underline instead)\n      // * the header cell count is not the delimiter cell count\n      if (!seen || size !== sizeB) {\n        return headDelimiterNok(code);\n      }\n\n      // Note: in markdown-rs`, a reset is needed here.\n      effects.exit('tableDelimiterRow');\n      effects.exit('tableHead');\n      // To do: in `markdown-rs`, resolvers need to be registered manually.\n      // effects.register_resolver(ResolveName::GfmTable)\n      return ok(code);\n    }\n    return headDelimiterNok(code);\n  }\n\n  /**\n   * In delimiter row, at a disallowed byte.\n   *\n   * ```markdown\n   *   | | a |\n   * \u003e | | x |\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterNok(code) {\n    // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n    return nok(code);\n  }\n\n  /**\n   * Before table body row.\n   *\n   * ```markdown\n   *   | | a |\n   *   | | - |\n   * \u003e | | b |\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function bodyRowStart(code) {\n    // Note: in `markdown-rs` we need to manually take care of a prefix,\n    // but in `micromark-js` that is done for us, so if we’re here, we’re\n    // never at whitespace.\n    effects.enter('tableRow');\n    return bodyRowBreak(code);\n  }\n\n  /**\n   * At break in table body row.\n   *\n   * ```markdown\n   *   | | a |\n   *   | | - |\n   * \u003e | | b |\n   *     ^\n   *       ^\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function bodyRowBreak(code) {\n    if (code === 124) {\n      effects.enter('tableCellDivider');\n      effects.consume(code);\n      effects.exit('tableCellDivider');\n      return bodyRowBreak;\n    }\n    if (code === null || markdownLineEnding(code)) {\n      effects.exit('tableRow');\n      return ok(code);\n    }\n    if (markdownSpace(code)) {\n      return factorySpace(effects, bodyRowBreak, \"whitespace\")(code);\n    }\n\n    // Anything else is cell content.\n    effects.enter(\"data\");\n    return bodyRowData(code);\n  }\n\n  /**\n   * In table body row data.\n   *\n   * ```markdown\n   *   | | a |\n   *   | | - |\n   * \u003e | | b |\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function bodyRowData(code) {\n    if (code === null || code === 124 || markdownLineEndingOrSpace(code)) {\n      effects.exit(\"data\");\n      return bodyRowBreak(code);\n    }\n    effects.consume(code);\n    return code === 92 ? bodyRowEscape : bodyRowData;\n  }\n\n  /**\n   * In table body row escape.\n   *\n   * ```markdown\n   *   | | a    |\n   *   | | ---- |\n   * \u003e | | b\\-c |\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function bodyRowEscape(code) {\n    if (code === 92 || code === 124) {\n      effects.consume(code);\n      return bodyRowData;\n    }\n    return bodyRowData(code);\n  }\n}\n\n/** @type {Resolver} */\n\nfunction resolveTable(events, context) {\n  let index = -1;\n  let inFirstCellAwaitingPipe = true;\n  /** @type {RowKind} */\n  let rowKind = 0;\n  /** @type {Range} */\n  let lastCell = [0, 0, 0, 0];\n  /** @type {Range} */\n  let cell = [0, 0, 0, 0];\n  let afterHeadAwaitingFirstBodyRow = false;\n  let lastTableEnd = 0;\n  /** @type {Token | undefined} */\n  let currentTable;\n  /** @type {Token | undefined} */\n  let currentBody;\n  /** @type {Token | undefined} */\n  let currentCell;\n  const map = new EditMap();\n  while (++index \u003c events.length) {\n    const event = events[index];\n    const token = event[1];\n    if (event[0] === 'enter') {\n      // Start of head.\n      if (token.type === 'tableHead') {\n        afterHeadAwaitingFirstBodyRow = false;\n\n        // Inject previous (body end and) table end.\n        if (lastTableEnd !== 0) {\n          flushTableEnd(map, context, lastTableEnd, currentTable, currentBody);\n          currentBody = undefined;\n          lastTableEnd = 0;\n        }\n\n        // Inject table start.\n        currentTable = {\n          type: 'table',\n          start: Object.assign({}, token.start),\n          // Note: correct end is set later.\n          end: Object.assign({}, token.end)\n        };\n        map.add(index, 0, [['enter', currentTable, context]]);\n      } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') {\n        inFirstCellAwaitingPipe = true;\n        currentCell = undefined;\n        lastCell = [0, 0, 0, 0];\n        cell = [0, index + 1, 0, 0];\n\n        // Inject table body start.\n        if (afterHeadAwaitingFirstBodyRow) {\n          afterHeadAwaitingFirstBodyRow = false;\n          currentBody = {\n            type: 'tableBody',\n            start: Object.assign({}, token.start),\n            // Note: correct end is set later.\n            end: Object.assign({}, token.end)\n          };\n          map.add(index, 0, [['enter', currentBody, context]]);\n        }\n        rowKind = token.type === 'tableDelimiterRow' ? 2 : currentBody ? 3 : 1;\n      }\n      // Cell data.\n      else if (rowKind \u0026\u0026 (token.type === \"data\" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) {\n        inFirstCellAwaitingPipe = false;\n\n        // First value in cell.\n        if (cell[2] === 0) {\n          if (lastCell[1] !== 0) {\n            cell[0] = cell[1];\n            currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell);\n            lastCell = [0, 0, 0, 0];\n          }\n          cell[2] = index;\n        }\n      } else if (token.type === 'tableCellDivider') {\n        if (inFirstCellAwaitingPipe) {\n          inFirstCellAwaitingPipe = false;\n        } else {\n          if (lastCell[1] !== 0) {\n            cell[0] = cell[1];\n            currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell);\n          }\n          lastCell = cell;\n          cell = [lastCell[1], index, 0, 0];\n        }\n      }\n    }\n    // Exit events.\n    else if (token.type === 'tableHead') {\n      afterHeadAwaitingFirstBodyRow = true;\n      lastTableEnd = index;\n    } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') {\n      lastTableEnd = index;\n      if (lastCell[1] !== 0) {\n        cell[0] = cell[1];\n        currentCell = flushCell(map, context, lastCell, rowKind, index, currentCell);\n      } else if (cell[1] !== 0) {\n        currentCell = flushCell(map, context, cell, rowKind, index, currentCell);\n      }\n      rowKind = 0;\n    } else if (rowKind \u0026\u0026 (token.type === \"data\" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) {\n      cell[3] = index;\n    }\n  }\n  if (lastTableEnd !== 0) {\n    flushTableEnd(map, context, lastTableEnd, currentTable, currentBody);\n  }\n  map.consume(context.events);\n\n  // To do: move this into `html`, when events are exposed there.\n  // That’s what `markdown-rs` does.\n  // That needs updates to `mdast-util-gfm-table`.\n  index = -1;\n  while (++index \u003c context.events.length) {\n    const event = context.events[index];\n    if (event[0] === 'enter' \u0026\u0026 event[1].type === 'table') {\n      event[1]._align = gfmTableAlign(context.events, index);\n    }\n  }\n  return events;\n}\n\n/**\n * Generate a cell.\n *\n * @param {EditMap} map\n * @param {Readonly\u003cTokenizeContext\u003e} context\n * @param {Readonly\u003cRange\u003e} range\n * @param {RowKind} rowKind\n * @param {number | undefined} rowEnd\n * @param {Token | undefined} previousCell\n * @returns {Token | undefined}\n */\n// eslint-disable-next-line max-params\nfunction flushCell(map, context, range, rowKind, rowEnd, previousCell) {\n  // `markdown-rs` uses:\n  // rowKind === 2 ? 'tableDelimiterCell' : 'tableCell'\n  const groupName = rowKind === 1 ? 'tableHeader' : rowKind === 2 ? 'tableDelimiter' : 'tableData';\n  // `markdown-rs` uses:\n  // rowKind === 2 ? 'tableDelimiterCellValue' : 'tableCellText'\n  const valueName = 'tableContent';\n\n  // Insert an exit for the previous cell, if there is one.\n  //\n  // ```markdown\n  // \u003e | | aa | bb | cc |\n  //          ^-- exit\n  //           ^^^^-- this cell\n  // ```\n  if (range[0] !== 0) {\n    previousCell.end = Object.assign({}, getPoint(context.events, range[0]));\n    map.add(range[0], 0, [['exit', previousCell, context]]);\n  }\n\n  // Insert enter of this cell.\n  //\n  // ```markdown\n  // \u003e | | aa | bb | cc |\n  //           ^-- enter\n  //           ^^^^-- this cell\n  // ```\n  const now = getPoint(context.events, range[1]);\n  previousCell = {\n    type: groupName,\n    start: Object.assign({}, now),\n    // Note: correct end is set later.\n    end: Object.assign({}, now)\n  };\n  map.add(range[1], 0, [['enter', previousCell, context]]);\n\n  // Insert text start at first data start and end at last data end, and\n  // remove events between.\n  //\n  // ```markdown\n  // \u003e | | aa | bb | cc |\n  //            ^-- enter\n  //             ^-- exit\n  //           ^^^^-- this cell\n  // ```\n  if (range[2] !== 0) {\n    const relatedStart = getPoint(context.events, range[2]);\n    const relatedEnd = getPoint(context.events, range[3]);\n    /** @type {Token} */\n    const valueToken = {\n      type: valueName,\n      start: Object.assign({}, relatedStart),\n      end: Object.assign({}, relatedEnd)\n    };\n    map.add(range[2], 0, [['enter', valueToken, context]]);\n    if (rowKind !== 2) {\n      // Fix positional info on remaining events\n      const start = context.events[range[2]];\n      const end = context.events[range[3]];\n      start[1].end = Object.assign({}, end[1].end);\n      start[1].type = \"chunkText\";\n      start[1].contentType = \"text\";\n\n      // Remove if needed.\n      if (range[3] \u003e range[2] + 1) {\n        const a = range[2] + 1;\n        const b = range[3] - range[2] - 1;\n        map.add(a, b, []);\n      }\n    }\n    map.add(range[3] + 1, 0, [['exit', valueToken, context]]);\n  }\n\n  // Insert an exit for the last cell, if at the row end.\n  //\n  // ```markdown\n  // \u003e | | aa | bb | cc |\n  //                    ^-- exit\n  //               ^^^^^^-- this cell (the last one contains two “between” parts)\n  // ```\n  if (rowEnd !== undefined) {\n    previousCell.end = Object.assign({}, getPoint(context.events, rowEnd));\n    map.add(rowEnd, 0, [['exit', previousCell, context]]);\n    previousCell = undefined;\n  }\n  return previousCell;\n}\n\n/**\n * Generate table end (and table body end).\n *\n * @param {Readonly\u003cEditMap\u003e} map\n * @param {Readonly\u003cTokenizeContext\u003e} context\n * @param {number} index\n * @param {Token} table\n * @param {Token | undefined} tableBody\n */\n// eslint-disable-next-line max-params\nfunction flushTableEnd(map, context, index, table, tableBody) {\n  /** @type {Array\u003cEvent\u003e} */\n  const exits = [];\n  const related = getPoint(context.events, index);\n  if (tableBody) {\n    tableBody.end = Object.assign({}, related);\n    exits.push(['exit', tableBody, context]);\n  }\n  table.end = Object.assign({}, related);\n  exits.push(['exit', table, context]);\n  map.add(index + 1, 0, exits);\n}\n\n/**\n * @param {Readonly\u003cArray\u003cEvent\u003e\u003e} events\n * @param {number} index\n * @returns {Readonly\u003cPoint\u003e}\n */\nfunction getPoint(events, index) {\n  const event = events[index];\n  const side = event[0] === 'enter' ? 'start' : 'end';\n  return event[1][side];\n}","/**\n * @import {Extension, State, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nconst tasklistCheck = {\n  name: 'tasklistCheck',\n  tokenize: tokenizeTasklistCheck\n};\n\n/**\n * Create an HTML extension for `micromark` to support GFM task list items\n * syntax.\n *\n * @returns {Extension}\n *   Extension for `micromark` that can be passed in `htmlExtensions` to\n *   support GFM task list items when serializing to HTML.\n */\nexport function gfmTaskListItem() {\n  return {\n    text: {\n      [91]: tasklistCheck\n    }\n  };\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTasklistCheck(effects, ok, nok) {\n  const self = this;\n  return open;\n\n  /**\n   * At start of task list item check.\n   *\n   * ```markdown\n   * \u003e | * [x] y.\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function open(code) {\n    if (\n    // Exit if there’s stuff before.\n    self.previous !== null ||\n    // Exit if not in the first content that is the first child of a list\n    // item.\n    !self._gfmTasklistFirstContentOfListItem) {\n      return nok(code);\n    }\n    effects.enter('taskListCheck');\n    effects.enter('taskListCheckMarker');\n    effects.consume(code);\n    effects.exit('taskListCheckMarker');\n    return inside;\n  }\n\n  /**\n   * In task list item check.\n   *\n   * ```markdown\n   * \u003e | * [x] y.\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function inside(code) {\n    // Currently we match how GH works in files.\n    // To match how GH works in comments, use `markdownSpace` (`[\\t ]`) instead\n    // of `markdownLineEndingOrSpace` (`[\\t\\n\\r ]`).\n    if (markdownLineEndingOrSpace(code)) {\n      effects.enter('taskListCheckValueUnchecked');\n      effects.consume(code);\n      effects.exit('taskListCheckValueUnchecked');\n      return close;\n    }\n    if (code === 88 || code === 120) {\n      effects.enter('taskListCheckValueChecked');\n      effects.consume(code);\n      effects.exit('taskListCheckValueChecked');\n      return close;\n    }\n    return nok(code);\n  }\n\n  /**\n   * At close of task list item check.\n   *\n   * ```markdown\n   * \u003e | * [x] y.\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function close(code) {\n    if (code === 93) {\n      effects.enter('taskListCheckMarker');\n      effects.consume(code);\n      effects.exit('taskListCheckMarker');\n      effects.exit('taskListCheck');\n      return after;\n    }\n    return nok(code);\n  }\n\n  /**\n   * @type {State}\n   */\n  function after(code) {\n    // EOL in paragraph means there must be something else after it.\n    if (markdownLineEnding(code)) {\n      return ok(code);\n    }\n\n    // Space or tab?\n    // Check what comes after.\n    if (markdownSpace(code)) {\n      return effects.check({\n        tokenize: spaceThenNonSpace\n      }, ok, nok)(code);\n    }\n\n    // EOF, or non-whitespace, both wrong.\n    return nok(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction spaceThenNonSpace(effects, ok, nok) {\n  return factorySpace(effects, after, \"whitespace\");\n\n  /**\n   * After whitespace, after task list item check.\n   *\n   * ```markdown\n   * \u003e | * [x] y.\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function after(code) {\n    // EOF means there was nothing, so bad.\n    // EOL means there’s content after it, so good.\n    // Impossible to have more spaces.\n    // Anything else is good.\n    return code === null ? nok(code) : ok(code);\n  }\n}","/**\n * @typedef {import('micromark-extension-gfm-footnote').HtmlOptions} HtmlOptions\n * @typedef {import('micromark-extension-gfm-strikethrough').Options} Options\n * @typedef {import('micromark-util-types').Extension} Extension\n * @typedef {import('micromark-util-types').HtmlExtension} HtmlExtension\n */\n\nimport {\n  combineExtensions,\n  combineHtmlExtensions\n} from 'micromark-util-combine-extensions'\nimport {\n  gfmAutolinkLiteral,\n  gfmAutolinkLiteralHtml\n} from 'micromark-extension-gfm-autolink-literal'\nimport {gfmFootnote, gfmFootnoteHtml} from 'micromark-extension-gfm-footnote'\nimport {\n  gfmStrikethrough,\n  gfmStrikethroughHtml\n} from 'micromark-extension-gfm-strikethrough'\nimport {gfmTable, gfmTableHtml} from 'micromark-extension-gfm-table'\nimport {gfmTagfilterHtml} from 'micromark-extension-gfm-tagfilter'\nimport {\n  gfmTaskListItem,\n  gfmTaskListItemHtml\n} from 'micromark-extension-gfm-task-list-item'\n\n/**\n * Create an extension for `micromark` to enable GFM syntax.\n *\n * @param {Options | null | undefined} [options]\n *   Configuration (optional).\n *\n *   Passed to `micromark-extens-gfm-strikethrough`.\n * @returns {Extension}\n *   Extension for `micromark` that can be passed in `extensions` to enable GFM\n *   syntax.\n */\nexport function gfm(options) {\n  return combineExtensions([\n    gfmAutolinkLiteral(),\n    gfmFootnote(),\n    gfmStrikethrough(options),\n    gfmTable(),\n    gfmTaskListItem()\n  ])\n}\n\n/**\n * Create an extension for `micromark` to support GFM when serializing to HTML.\n *\n * @param {HtmlOptions | null | undefined} [options]\n *   Configuration (optional).\n *\n *   Passed to `micromark-extens-gfm-footnote`.\n * @returns {HtmlExtension}\n *   Extension for `micromark` that can be passed in `htmlExtensions` to\n *   support GFM when serializing to HTML.\n */\nexport function gfmHtml(options) {\n  return combineHtmlExtensions([\n    gfmAutolinkLiteralHtml(),\n    gfmFootnoteHtml(options),\n    gfmStrikethroughHtml(),\n    gfmTableHtml(),\n    gfmTagfilterHtml(),\n    gfmTaskListItemHtml()\n  ])\n}\n","/**\n * @import {Root} from 'mdast'\n * @import {Options} from 'remark-gfm'\n * @import {} from 'remark-parse'\n * @import {} from 'remark-stringify'\n * @import {Processor} from 'unified'\n */\n\nimport {gfmFromMarkdown, gfmToMarkdown} from 'mdast-util-gfm'\nimport {gfm} from 'micromark-extension-gfm'\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Add support GFM (autolink literals, footnotes, strikethrough, tables,\n * tasklists).\n *\n * @param {Options | null | undefined} [options]\n *   Configuration (optional).\n * @returns {undefined}\n *   Nothing.\n */\nexport default function remarkGfm(options) {\n  // @ts-expect-error: TS is wrong about `this`.\n  // eslint-disable-next-line unicorn/no-this-assignment\n  const self = /** @type {Processor\u003cRoot\u003e} */ (this)\n  const settings = options || emptyOptions\n  const data = self.data()\n\n  const micromarkExtensions =\n    data.micromarkExtensions || (data.micromarkExtensions = [])\n  const fromMarkdownExtensions =\n    data.fromMarkdownExtensions || (data.fromMarkdownExtensions = [])\n  const toMarkdownExtensions =\n    data.toMarkdownExtensions || (data.toMarkdownExtensions = [])\n\n  micromarkExtensions.push(gfm(settings))\n  fromMarkdownExtensions.push(gfmFromMarkdown())\n  toMarkdownExtensions.push(gfmToMarkdown(settings))\n}\n"],"version":3}
