diff --git a/CMarkGFM.hsc b/CMarkGFM.hsc
--- a/CMarkGFM.hsc
+++ b/CMarkGFM.hsc
@@ -15,11 +15,14 @@
   , optSourcePos
   , optHardBreaks
   , optSmart
+  , optSafe
   , optUnsafe
+  , optFootnotes
   , extStrikethrough
   , extTable
   , extAutolink
   , extTagfilter
+  , extTaskList
   , Node(..)
   , NodeType(..)
   , PosInfo(..)
@@ -250,6 +253,8 @@
   | TABLE [TableCellAlignment]
   | TABLE_ROW
   | TABLE_CELL
+  | FOOTNOTE_REFERENCE
+  | FOOTNOTE_DEFINITION
   deriving (Show, Read, Eq, Ord, Typeable, Data, Generic)
 
 data PosInfo = PosInfo{ startLine   :: Int
@@ -277,11 +282,20 @@
 optSmart :: CMarkOption
 optSmart = CMarkOption #const CMARK_OPT_SMART
 
+-- | optSafe is defined here for API compatibility, but it no longer has any
+-- effect. "Safe" mode is now the default: set optUnsafe to disable it.
+optSafe :: CMarkOption
+optSafe = CMarkOption #const CMARK_OPT_SAFE
+
 -- | Allow rendering of raw HTML and potentially dangerous URLs in links
 -- and images.
 optUnsafe :: CMarkOption
 optUnsafe = CMarkOption #const CMARK_OPT_UNSAFE
 
+-- | Enable footnote syntax support (equivalent of footnotes extension for official cmark-gfm)
+optFootnotes :: CMarkOption
+optFootnotes = CMarkOption #const CMARK_OPT_FOOTNOTES
+
 newtype CMarkExtension = CMarkExtension { unCMarkExtension :: String }
 
 extStrikethrough :: CMarkExtension
@@ -296,6 +310,9 @@
 extTagfilter :: CMarkExtension
 extTagfilter = CMarkExtension "tagfilter"
 
+extTaskList :: CMarkExtension
+extTaskList = CMarkExtension "tasklist"
+
 ptrToNodeType :: NodePtr -> IO NodeType
 ptrToNodeType ptr = do
   nodeType <- c_cmark_node_get_type ptr
@@ -341,6 +358,10 @@
          -> return SOFTBREAK
        #const CMARK_NODE_LINEBREAK
          -> return LINEBREAK
+       #const CMARK_NODE_FOOTNOTE_DEFINITION
+         -> return FOOTNOTE_DEFINITION
+       #const CMARK_NODE_FOOTNOTE_REFERENCE
+         -> return FOOTNOTE_REFERENCE
        _ -> if nodeType == fromIntegral (Unsafe.unsafePerformIO $ peek c_CMARK_NODE_STRIKETHROUGH) then
               return STRIKETHROUGH
             else if nodeType == fromIntegral (Unsafe.unsafePerformIO $ peek c_CMARK_NODE_TABLE) then
@@ -480,9 +501,13 @@
             SOFTBREAK   -> c_cmark_node_new (#const CMARK_NODE_SOFTBREAK)
             LINEBREAK   -> c_cmark_node_new (#const CMARK_NODE_LINEBREAK)
             STRIKETHROUGH -> c_cmark_node_new (fromIntegral . Unsafe.unsafePerformIO $ peek c_CMARK_NODE_STRIKETHROUGH)
-            TABLE _       -> error "constructing table not supported"
-            TABLE_ROW     -> error "constructing table row not supported"
-            TABLE_CELL    -> error "constructing table cell not supported"
+            TABLE _             -> error "constructing table not supported"
+            TABLE_ROW           -> error "constructing table row not supported"
+            TABLE_CELL          -> error "constructing table cell not supported"
+            FOOTNOTE_DEFINITION -> error "constructing footnotes not supported"
+            FOOTNOTE_REFERENCE -> error "constructing footnotes not supported"
+
+
   mapM_ (\child -> fromNode child >>= c_cmark_node_append_child node) children
   return node
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -44,22 +44,17 @@
   - **Ease of installation:** cmark is portable and has minimal
     dependencies.
 
-cmark does not provide Haskell versions of the whole [libcmark-gfm]
+cmark-gfm does not provide Haskell versions of the whole [libcmark-gfm]
 API, which is built around mutable `cmark_node` objects.  Instead, it
 provides functions for converting CommonMark to HTML (and other
 formats), and a function for converting CommonMark to a `Node`
 tree that can be processed further using Haskell.
 
-**A note on security:**  This library does not attempt to sanitize
-HTML output.  We recommend using [xss-sanitize] to filter the output,
-or enabling `optSafe` to filter out all raw HTML and potentially
-dangerous URLs.
-
 **A note on stability:**  There is a good chance the API will change
 significantly after this early release.
 
 [GitHub Flavored Markdown]: https://github.github.com/gfm/
-[libcmark-gfm]: http://github.com/github/cmark
+[libcmark-gfm]: http://github.com/github/cmark-gfm
 [benchmarks]: https://github.com/jgm/cmark/blob/master/benchmarks.md
 [cheapskate]: https://hackage.haskell.org/package/cheapskate
 [pandoc]: https://hackage.haskell.org/package/pandoc
diff --git a/bench/full-sample.md b/bench/full-sample.md
--- a/bench/full-sample.md
+++ b/bench/full-sample.md
@@ -499,6 +499,21 @@
 
  - - - - - - - - - deeply-nested one-element item
 
+- [ ] a task list
+- [x] a check item in the task list
+
+- [ ] loose task list item
+
+- [x] loose checked task list item
+
+- [ ] nested items in the task list
+  - [ ] nested item 1
+  - [x] checked nested item 2
+      - [ ] must go deeper
+      - [x] checked deeper nested item 2
+          - [ ] must go even deeper
+          - [x] checked even deeper nested item 2
+
 [1] [2] [3] [1] [2] [3]
 
 [looooooooooooooooooooooooooooooooooooooooooooooooooong label]
diff --git a/cbits/arena.c b/cbits/arena.c
--- a/cbits/arena.c
+++ b/cbits/arena.c
@@ -68,15 +68,16 @@
   const size_t align = sizeof(size_t) - 1;
   sz = (sz + align) & ~align;
 
+  struct arena_chunk *chunk;
   if (sz > A->sz) {
-    A->prev = alloc_arena_chunk(sz, A->prev);
-    return (uint8_t *) A->prev->ptr + sizeof(size_t);
-  }
-  if (sz > A->sz - A->used) {
-    A = alloc_arena_chunk(A->sz + A->sz / 2, A);
+    A->prev = chunk = alloc_arena_chunk(sz, A->prev);
+  } else if (sz > A->sz - A->used) {
+    A = chunk = alloc_arena_chunk(A->sz + A->sz / 2, A);
+  } else {
+    chunk = A;
   }
-  void *ptr = (uint8_t *) A->ptr + A->used;
-  A->used += sz;
+  void *ptr = (uint8_t *) chunk->ptr + chunk->used;
+  chunk->used += sz;
   *((size_t *) ptr) = sz - sizeof(size_t);
   return (uint8_t *) ptr + sizeof(size_t);
 }
@@ -98,6 +99,6 @@
 
 cmark_mem CMARK_ARENA_MEM_ALLOCATOR = {arena_calloc, arena_realloc, arena_free};
 
-cmark_mem *cmark_get_arena_mem_allocator() {
+cmark_mem *cmark_get_arena_mem_allocator(void) {
   return &CMARK_ARENA_MEM_ALLOCATOR;
 }
diff --git a/cbits/autolink.c b/cbits/autolink.c
--- a/cbits/autolink.c
+++ b/cbits/autolink.c
@@ -2,6 +2,7 @@
 #include <parser.h>
 #include <string.h>
 #include <utf8.h>
+#include <stddef.h>
 
 #if defined(_WIN32)
 #define strncasecmp _strnicmp
@@ -35,44 +36,25 @@
 }
 
 static size_t autolink_delim(uint8_t *data, size_t link_end) {
-  uint8_t cclose, copen;
   size_t i;
+  size_t closing = 0;
+  size_t opening = 0;
 
-  for (i = 0; i < link_end; ++i)
-    if (data[i] == '<') {
+  for (i = 0; i < link_end; ++i) {
+    const uint8_t c = data[i];
+    if (c == '<') {
       link_end = i;
       break;
+    } else if (c == '(') {
+      opening++;
+    } else if (c == ')') {
+      closing++;
     }
+  }
 
   while (link_end > 0) {
-    cclose = data[link_end - 1];
-
-    switch (cclose) {
+    switch (data[link_end - 1]) {
     case ')':
-      copen = '(';
-      break;
-    default:
-      copen = 0;
-    }
-
-    if (strchr("?!.,:*_~'\"", data[link_end - 1]) != NULL)
-      link_end--;
-
-    else if (data[link_end - 1] == ';') {
-      size_t new_end = link_end - 2;
-
-      while (new_end > 0 && cmark_isalpha(data[new_end]))
-        new_end--;
-
-      if (new_end < link_end - 2 && data[new_end] == '&')
-        link_end = new_end;
-      else
-        link_end--;
-    } else if (copen != 0) {
-      size_t closing = 0;
-      size_t opening = 0;
-      i = 0;
-
       /* Allow any number of matching brackets (as recognised in copen/cclose)
        * at the end of the URL.  If there is a greater number of closing
        * brackets than opening ones, we remove one character from the end of
@@ -80,34 +62,52 @@
        *
        * Examples (input text => output linked portion):
        *
-       *	http://www.pokemon.com/Pikachu_(Electric)
-       *		=> http://www.pokemon.com/Pikachu_(Electric)
+       *        http://www.pokemon.com/Pikachu_(Electric)
+       *                => http://www.pokemon.com/Pikachu_(Electric)
        *
-       *	http://www.pokemon.com/Pikachu_((Electric)
-       *		=> http://www.pokemon.com/Pikachu_((Electric)
+       *        http://www.pokemon.com/Pikachu_((Electric)
+       *                => http://www.pokemon.com/Pikachu_((Electric)
        *
-       *	http://www.pokemon.com/Pikachu_(Electric))
-       *		=> http://www.pokemon.com/Pikachu_(Electric)
+       *        http://www.pokemon.com/Pikachu_(Electric))
+       *                => http://www.pokemon.com/Pikachu_(Electric)
        *
-       *	http://www.pokemon.com/Pikachu_((Electric))
-       *		=> http://www.pokemon.com/Pikachu_((Electric))
+       *        http://www.pokemon.com/Pikachu_((Electric))
+       *                => http://www.pokemon.com/Pikachu_((Electric))
        */
-
-      while (i < link_end) {
-        if (data[i] == copen)
-          opening++;
-        else if (data[i] == cclose)
-          closing++;
-
-        i++;
+      if (closing <= opening) {
+        return link_end;
       }
+      closing--;
+      link_end--;
+      break;
+    case '?':
+    case '!':
+    case '.':
+    case ',':
+    case ':':
+    case '*':
+    case '_':
+    case '~':
+    case '\'':
+    case '"':
+      link_end--;
+      break;
+    case ';': {
+      size_t new_end = link_end - 2;
 
-      if (closing <= opening)
-        break;
+      while (new_end > 0 && cmark_isalpha(data[new_end]))
+        new_end--;
 
-      link_end--;
-    } else
+      if (new_end < link_end - 2 && data[new_end] == '&')
+        link_end = new_end;
+      else
+        link_end--;
       break;
+    }
+
+    default:
+      return link_end;
+    }
   }
 
   return link_end;
@@ -116,7 +116,20 @@
 static size_t check_domain(uint8_t *data, size_t size, int allow_short) {
   size_t i, np = 0, uscore1 = 0, uscore2 = 0;
 
+  /* The purpose of this code is to reject urls that contain an underscore
+   * in one of the last two segments. Examples:
+   *
+   *   www.xxx.yyy.zzz     autolinked
+   *   www.xxx.yyy._zzz    not autolinked
+   *   www.xxx._yyy.zzz    not autolinked
+   *   www._xxx.yyy.zzz    autolinked
+   *
+   * The reason is that domain names are allowed to include underscores,
+   * but host names are not. See: https://stackoverflow.com/a/2183140
+   */
   for (i = 1; i < size - 1; i++) {
+    if (data[i] == '\\' && i < size - 2)
+      i++;
     if (data[i] == '_')
       uscore2++;
     else if (data[i] == '.') {
@@ -127,8 +140,17 @@
       break;
   }
 
-  if (uscore1 > 0 || uscore2 > 0)
-    return 0;
+  if (uscore1 > 0 || uscore2 > 0) {
+    /* If the url is very long then accept it despite the underscores,
+     * to avoid quadratic behavior causing a denial of service. See:
+     * https://github.com/github/cmark-gfm/security/advisories/GHSA-29g3-96g3-jg6c
+     * Reasonable urls are unlikely to have more than 10 segments, so
+     * this extra condition shouldn't have any impact on normal usage.
+     */
+    if (np <= 10) {
+      return 0;
+    }
+  }
 
   if (allow_short) {
     /* We don't need a valid domain in the strict sense (with
@@ -165,7 +187,7 @@
   if (link_end == 0)
     return NULL;
 
-  while (link_end < size && !cmark_isspace(data[link_end]))
+  while (link_end < size && !cmark_isspace(data[link_end]) && data[link_end] != '<')
     link_end++;
 
   link_end = autolink_delim(data, link_end);
@@ -225,7 +247,7 @@
     return 0;
 
   link_end += domain_len;
-  while (link_end < size && !cmark_isspace(data[link_end]))
+  while (link_end < size && !cmark_isspace(data[link_end]) && data[link_end] != '<')
     link_end++;
 
   link_end = autolink_delim(data, link_end);
@@ -245,7 +267,12 @@
   cmark_node *text = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem);
   text->as.literal = url;
   cmark_node_append_child(node, text);
+  
+  node->start_line = text->start_line = node->end_line = text->end_line = cmark_inline_parser_get_line(inline_parser);
 
+  node->start_column = text->start_column = max_rewind - rewind;
+  node->end_column = text->end_column = cmark_inline_parser_get_column(inline_parser) - 1;
+
   return node;
 }
 
@@ -269,111 +296,167 @@
   // inline was finished in inlines.c.
 }
 
-static void postprocess_text(cmark_parser *parser, cmark_node *text, int offset, int depth) {
-  // postprocess_text can recurse very deeply if there is a very long line of
-  // '@' only.  Stop at a reasonable depth to ensure it cannot crash.
-  if (depth > 1000) return;
+static bool validate_protocol(const char protocol[], uint8_t *data, size_t rewind, size_t max_rewind) {
+  size_t len = strlen(protocol);
 
-  size_t link_end;
-  uint8_t *data = text->as.literal.data,
-    *at;
-  size_t size = text->as.literal.len;
-  int rewind, max_rewind,
-      nb = 0, np = 0, ns = 0;
+  if (len > (max_rewind - rewind)) {
+    return false;
+  }
 
-  if (offset < 0 || (size_t)offset >= size)
-    return;
+  // Check that the protocol matches
+  if (memcmp(data - rewind - len, protocol, len) != 0) {
+    return false;
+  }
 
-  data += offset;
-  size -= offset;
+  if (len == (max_rewind - rewind)) {
+    return true;
+  }
 
-  at = (uint8_t *)memchr(data, '@', size);
-  if (!at)
-    return;
+  char prev_char = data[-((ptrdiff_t)rewind) - len - 1];
 
-  max_rewind = (int)(at - data);
-  data += max_rewind;
-  size -= max_rewind;
+  // Make sure the character before the protocol is non-alphanumeric
+  return !cmark_isalnum(prev_char);
+}
 
-  for (rewind = 0; rewind < max_rewind; ++rewind) {
-    uint8_t c = data[-rewind - 1];
+static void postprocess_text(cmark_parser *parser, cmark_node *text) {
+  size_t start = 0;
+  size_t offset = 0;
+  // `text` is going to be split into a list of nodes containing shorter segments
+  // of text, so we detach the memory buffer from text and use `cmark_chunk_dup` to
+  // create references to it. Later, `cmark_chunk_to_cstr` is used to convert
+  // the references into allocated buffers. The detached buffer is freed before we
+  // return.
+  cmark_chunk detached_chunk = text->as.literal;
+  text->as.literal = cmark_chunk_dup(&detached_chunk, 0, detached_chunk.len);
 
-    if (cmark_isalnum(c))
-      continue;
+  uint8_t *data = text->as.literal.data;
+  size_t remaining = text->as.literal.len;
 
-    if (strchr(".+-_", c) != NULL)
-      continue;
+  while (true) {
+    size_t link_end;
+    uint8_t *at;
+    bool auto_mailto = true;
+    bool is_xmpp = false;
+    size_t rewind;
+    size_t max_rewind;
+    size_t np = 0;
 
-    if (c == '/')
-      ns++;
+    if (offset >= remaining)
+      break;
 
-    break;
-  }
+    at = (uint8_t *)memchr(data + start + offset, '@', remaining - offset);
+    if (!at)
+      break;
 
-  if (rewind == 0 || ns > 0) {
-    postprocess_text(parser, text, max_rewind + 1 + offset, depth + 1);
-    return;
-  }
+    max_rewind = at - (data + start + offset);
 
-  for (link_end = 0; link_end < size; ++link_end) {
-    uint8_t c = data[link_end];
+found_at:
+    for (rewind = 0; rewind < max_rewind; ++rewind) {
+      uint8_t c = data[start + offset + max_rewind - rewind - 1];
 
-    if (cmark_isalnum(c))
-      continue;
+      if (cmark_isalnum(c))
+        continue;
 
-    if (c == '@')
-      nb++;
-    else if (c == '.' && link_end < size - 1 && cmark_isalnum(data[link_end + 1]))
-      np++;
-    else if (c != '-' && c != '_')
+      if (strchr(".+-_", c) != NULL)
+        continue;
+
+      if (strchr(":", c) != NULL) {
+        if (validate_protocol("mailto:", data + start + offset + max_rewind, rewind, max_rewind)) {
+          auto_mailto = false;
+          continue;
+        }
+
+        if (validate_protocol("xmpp:", data + start + offset + max_rewind, rewind, max_rewind)) {
+          auto_mailto = false;
+          is_xmpp = true;
+          continue;
+        }
+      }
+
       break;
-  }
+    }
 
-  if (link_end < 2 || nb != 1 || np == 0 ||
-      (!cmark_isalpha(data[link_end - 1]) && data[link_end - 1] != '.')) {
-    postprocess_text(parser, text, max_rewind + 1 + offset, depth + 1);
-    return;
-  }
+    if (rewind == 0) {
+      offset += max_rewind + 1;
+      continue;
+    }
 
-  link_end = autolink_delim(data, link_end);
+    assert(data[start + offset + max_rewind] == '@');
+    for (link_end = 1; link_end < remaining - offset - max_rewind; ++link_end) {
+      uint8_t c = data[start + offset + max_rewind + link_end];
 
-  if (link_end == 0) {
-    postprocess_text(parser, text, max_rewind + 1 + offset, depth + 1);
-    return;
-  }
+      if (cmark_isalnum(c))
+        continue;
 
-  cmark_chunk_to_cstr(parser->mem, &text->as.literal);
+      if (c == '@') {
+        // Found another '@', so go back and try again with an updated offset and max_rewind.
+        offset += max_rewind + 1;
+        max_rewind = link_end - 1;
+        goto found_at;
+      } else if (c == '.' && link_end < remaining - offset - max_rewind - 1 &&
+               cmark_isalnum(data[start + offset + max_rewind + link_end + 1]))
+        np++;
+      else if (c == '/' && is_xmpp)
+        continue;
+      else if (c != '-' && c != '_')
+        break;
+    }
 
-  cmark_node *link_node = cmark_node_new_with_mem(CMARK_NODE_LINK, parser->mem);
-  cmark_strbuf buf;
-  cmark_strbuf_init(parser->mem, &buf, 10);
-  cmark_strbuf_puts(&buf, "mailto:");
-  cmark_strbuf_put(&buf, data - rewind, (bufsize_t)(link_end + rewind));
-  link_node->as.link.url = cmark_chunk_buf_detach(&buf);
+    if (link_end < 2 || np == 0 ||
+        (!cmark_isalpha(data[start + offset + max_rewind + link_end - 1]) &&
+         data[start + offset + max_rewind + link_end - 1] != '.')) {
+      offset += max_rewind + link_end;
+      continue;
+    }
 
-  cmark_node *link_text = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem);
-  cmark_chunk email = cmark_chunk_dup(
-      &text->as.literal,
-      offset + max_rewind - rewind,
+    link_end = autolink_delim(data + start + offset + max_rewind, link_end);
+
+    if (link_end == 0) {
+      offset += max_rewind + 1;
+      continue;
+    }
+
+    cmark_node *link_node = cmark_node_new_with_mem(CMARK_NODE_LINK, parser->mem);
+    cmark_strbuf buf;
+    cmark_strbuf_init(parser->mem, &buf, 10);
+    if (auto_mailto)
+      cmark_strbuf_puts(&buf, "mailto:");
+    cmark_strbuf_put(&buf, data + start + offset + max_rewind - rewind, (bufsize_t)(link_end + rewind));
+    link_node->as.link.url = cmark_chunk_buf_detach(&buf);
+
+    cmark_node *link_text = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem);
+    cmark_chunk email = cmark_chunk_dup(
+      &detached_chunk,
+      (bufsize_t)(start + offset + max_rewind - rewind),
       (bufsize_t)(link_end + rewind));
-  cmark_chunk_to_cstr(parser->mem, &email);
-  link_text->as.literal = email;
-  cmark_node_append_child(link_node, link_text);
+    cmark_chunk_to_cstr(parser->mem, &email);
+    link_text->as.literal = email;
+    cmark_node_append_child(link_node, link_text);
 
-  cmark_node_insert_after(text, link_node);
+    cmark_node_insert_after(text, link_node);
 
-  cmark_node *post = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem);
-  post->as.literal = cmark_chunk_dup(&text->as.literal,
-    (bufsize_t)(offset + max_rewind + link_end),
-    (bufsize_t)(size - link_end));
-  cmark_chunk_to_cstr(parser->mem, &post->as.literal);
+    cmark_node *post = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem);
+    post->as.literal = cmark_chunk_dup(&detached_chunk,
+                                       (bufsize_t)(start + offset + max_rewind + link_end),
+                                       (bufsize_t)(remaining - offset - max_rewind - link_end));
 
-  cmark_node_insert_after(link_node, post);
+    cmark_node_insert_after(link_node, post);
 
-  text->as.literal.len = offset + max_rewind - rewind;
-  text->as.literal.data[text->as.literal.len] = 0;
+    text->as.literal = cmark_chunk_dup(&detached_chunk, (bufsize_t)start, (bufsize_t)(offset + max_rewind - rewind));
+    cmark_chunk_to_cstr(parser->mem, &text->as.literal);
 
-  postprocess_text(parser, post, 0, depth + 1);
+    text = post;
+    start += offset + max_rewind + link_end;
+    remaining -= offset + max_rewind + link_end;
+    offset = 0;
+  }
+
+  // Convert the reference to allocated memory.
+  assert(!text->as.literal.alloc);
+  cmark_chunk_to_cstr(parser->mem, &text->as.literal);
+
+  // Free the detached buffer.
+  cmark_chunk_free(parser->mem, &detached_chunk);
 }
 
 static cmark_node *postprocess(cmark_syntax_extension *ext, cmark_parser *parser, cmark_node *root) {
@@ -400,7 +483,7 @@
     }
 
     if (ev == CMARK_EVENT_ENTER && node->type == CMARK_NODE_TEXT) {
-      postprocess_text(parser, node, 0, /*depth*/0);
+      postprocess_text(parser, node);
     }
   }
 
diff --git a/cbits/blocks.c b/cbits/blocks.c
--- a/cbits/blocks.c
+++ b/cbits/blocks.c
@@ -8,6 +8,7 @@
 #include <stdlib.h>
 #include <assert.h>
 #include <stdio.h>
+#include <limits.h>
 
 #include "cmark_ctype.h"
 #include "syntax_extension.h"
@@ -26,6 +27,14 @@
 #define CODE_INDENT 4
 #define TAB_STOP 4
 
+/**
+ * Very deeply nested lists can cause quadratic performance issues.
+ * This constant is used in open_new_blocks() to limit the nesting
+ * depth. It is unlikely that a non-contrived markdown document will
+ * be nested this deeply.
+ */
+#define MAX_LIST_DEPTH 100
+
 #ifndef MIN
 #define MIN(x, y) ((x < y) ? x : y)
 #endif
@@ -36,6 +45,10 @@
   return (node->flags & CMARK_NODE__LAST_LINE_BLANK) != 0;
 }
 
+static bool S_last_line_checked(const cmark_node *node) {
+  return (node->flags & CMARK_NODE__LAST_LINE_CHECKED) != 0;
+}
+
 static CMARK_INLINE cmark_node_type S_type(const cmark_node *node) {
   return (cmark_node_type)node->type;
 }
@@ -47,6 +60,10 @@
     node->flags &= ~CMARK_NODE__LAST_LINE_BLANK;
 }
 
+static void S_set_last_line_checked(cmark_node *node) {
+  node->flags |= CMARK_NODE__LAST_LINE_CHECKED;
+}
+
 static CMARK_INLINE bool S_is_line_end_char(char c) {
   return (c == '\n' || c == '\r');
 }
@@ -121,8 +138,6 @@
   parser->root = document;
   parser->current = document;
 
-  parser->last_buffer_ended_with_cr = false;
-
   parser->syntax_extensions = saved_exts;
   parser->inline_syntax_extensions = saved_inline_exts;
   parser->options = saved_options;
@@ -234,26 +249,43 @@
 
 // Check to see if a node ends with a blank line, descending
 // if needed into lists and sublists.
-static bool ends_with_blank_line(cmark_node *node) {
-  cmark_node *cur = node;
-  while (cur != NULL) {
-    if (S_last_line_blank(cur)) {
-      return true;
-    }
-    if (S_type(cur) == CMARK_NODE_LIST || S_type(cur) == CMARK_NODE_ITEM) {
-      cur = cur->last_child;
-    } else {
-      cur = NULL;
-    }
+static bool S_ends_with_blank_line(cmark_node *node) {
+  if (S_last_line_checked(node)) {
+    return(S_last_line_blank(node));
+  } else if ((S_type(node) == CMARK_NODE_LIST ||
+              S_type(node) == CMARK_NODE_ITEM) && node->last_child) {
+    S_set_last_line_checked(node);
+    return(S_ends_with_blank_line(node->last_child));
+  } else {
+    S_set_last_line_checked(node);
+    return (S_last_line_blank(node));
   }
-  return false;
 }
 
+// returns true if content remains after link defs are resolved.
+static bool resolve_reference_link_definitions(
+		cmark_parser *parser,
+                cmark_node *b) {
+  bufsize_t pos;
+  cmark_strbuf *node_content = &b->content;
+  cmark_chunk chunk = {node_content->ptr, node_content->size, 0};
+  while (chunk.len && chunk.data[0] == '[' &&
+         (pos = cmark_parse_reference_inline(parser->mem, &chunk,
+					     parser->refmap))) {
+
+    chunk.data += pos;
+    chunk.len -= pos;
+  }
+  cmark_strbuf_drop(node_content, (node_content->size - chunk.len));
+  return !is_blank(&b->content, 0);
+}
+
 static cmark_node *finalize(cmark_parser *parser, cmark_node *b) {
   bufsize_t pos;
   cmark_node *item;
   cmark_node *subitem;
   cmark_node *parent;
+  bool has_content;
 
   parent = b->parent;
   assert(b->flags &
@@ -283,15 +315,8 @@
   switch (S_type(b)) {
   case CMARK_NODE_PARAGRAPH:
   {
-    cmark_chunk chunk = {node_content->ptr, node_content->size, 0};
-    while (chunk.len && chunk.data[0] == '[' &&
-           (pos = cmark_parse_reference_inline(parser->mem, &chunk, parser->refmap))) {
-
-      chunk.data += pos;
-      chunk.len -= pos;
-    }
-    cmark_strbuf_drop(node_content, (node_content->size - chunk.len));
-    if (is_blank(node_content, 0)) {
+    has_content = resolve_reference_link_definitions(parser, b);
+    if (!has_content) {
       // remove blank node (former reference def)
       cmark_node_free(b);
     }
@@ -343,7 +368,8 @@
       // spaces between them:
       subitem = item->first_child;
       while (subitem) {
-        if (ends_with_blank_line(subitem) && (item->next || subitem->next)) {
+        if ((item->next || subitem->next) &&
+            S_ends_with_blank_line(subitem)) {
           b->as.list.tight = false;
           break;
         }
@@ -451,7 +477,6 @@
   while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
     cur = cmark_iter_get_node(iter);
     if (ev_type == CMARK_EVENT_EXIT && cur->type == CMARK_NODE_FOOTNOTE_DEFINITION) {
-      cmark_node_unlink(cur);
       cmark_footnote_create(map, cur);
     }
   }
@@ -468,6 +493,15 @@
         if (!footnote->ix)
           footnote->ix = ++ix;
 
+        // store a reference to this footnote reference's footnote definition
+        // this is used by renderers when generating label ids
+        cur->parent_footnote_def = footnote->node;
+
+        // keep track of a) count of how many times this footnote def has been
+        // referenced, and b) which reference index this footnote ref is at.
+        // this is used by renderers when generating links and backreferences.
+        cur->footnote.ref_ix = ++footnote->node->footnote.def_count;
+
         char n[32];
         snprintf(n, sizeof(n), "%d", footnote->ix);
         cmark_chunk_free(parser->mem, &cur->as.literal);
@@ -498,13 +532,16 @@
     qsort(map->sorted, map->size, sizeof(cmark_map_entry *), sort_footnote_by_ix);
     for (unsigned int i = 0; i < map->size; ++i) {
       cmark_footnote *footnote = (cmark_footnote *)map->sorted[i];
-      if (!footnote->ix)
+      if (!footnote->ix) {
+        cmark_node_unlink(footnote->node);
         continue;
+      }
       cmark_node_append_child(parser->root, footnote->node);
       footnote->node = NULL;
     }
   }
 
+  cmark_unlink_footnotes_map(map);
   cmark_map_free(map);
 }
 
@@ -611,6 +648,14 @@
   }
 
   finalize(parser, parser->root);
+
+  // Limit total size of extra content created from reference links to
+  // document size to avoid superlinear growth. Always allow 100KB.
+  if (parser->total_size > 100000)
+    parser->refmap->max_ref_size = parser->total_size;
+  else
+    parser->refmap->max_ref_size = 100000;
+
   process_inlines(parser, parser->refmap, parser->options);
   if (parser->options & CMARK_OPT_FOOTNOTES)
     process_footnotes(parser);
@@ -670,6 +715,11 @@
   const unsigned char *end = buffer + len;
   static const uint8_t repl[] = {239, 191, 189};
 
+  if (len > UINT_MAX - parser->total_size)
+    parser->total_size = UINT_MAX;
+  else
+    parser->total_size += len;
+
   if (parser->last_buffer_ended_with_cr && *buffer == '\n') {
     // skip NL if last buffer ended with CR ; see #117
     buffer++;
@@ -748,6 +798,40 @@
   }
 }
 
+// Check for thematic break.  On failure, return 0 and update
+// thematic_break_kill_pos with the index at which the
+// parse fails.  On success, return length of match.
+// "...three or more hyphens, asterisks,
+// or underscores on a line by themselves. If you wish, you may use
+// spaces between the hyphens or asterisks."
+static int S_scan_thematic_break(cmark_parser *parser, cmark_chunk *input,
+                                 bufsize_t offset) {
+  bufsize_t i;
+  char c;
+  char nextc = '\0';
+  int count;
+  i = offset;
+  c = peek_at(input, i);
+  if (!(c == '*' || c == '_' || c == '-')) {
+    parser->thematic_break_kill_pos = i;
+    return 0;
+  }
+  count = 1;
+  while ((nextc = peek_at(input, ++i))) {
+    if (nextc == c) {
+      count++;
+    } else if (nextc != ' ' && nextc != '\t') {
+      break;
+    }
+  }
+  if (count >= 3 && (nextc == '\r' || nextc == '\n')) {
+    return (i - offset) + 1;
+  } else {
+    parser->thematic_break_kill_pos = i;
+    return 0;
+  }
+}
+
 // Find first nonspace character from current offset, setting
 // parser->first_nonspace, parser->first_nonspace_column,
 // parser->indent, and parser->blank. Does not advance parser->offset.
@@ -1040,12 +1124,14 @@
   bufsize_t matched = 0;
   int lev = 0;
   bool save_partially_consumed_tab;
+  bool has_content;
   int save_offset;
   int save_column;
+  size_t depth = 0;
 
   while (cont_type != CMARK_NODE_CODE_BLOCK &&
          cont_type != CMARK_NODE_HTML_BLOCK) {
-
+    depth++;
     S_find_first_nonspace(parser, input);
     indented = parser->indent >= CODE_INDENT;
 
@@ -1112,27 +1198,36 @@
     } else if (!indented && cont_type == CMARK_NODE_PARAGRAPH &&
                (lev =
                     scan_setext_heading_line(input, parser->first_nonspace))) {
-      (*container)->type = (uint16_t)CMARK_NODE_HEADING;
-      (*container)->as.heading.level = lev;
-      (*container)->as.heading.setext = true;
-      S_advance_offset(parser, input, input->len - 1 - parser->offset, false);
+      // finalize paragraph, resolving reference links
+      has_content = resolve_reference_link_definitions(parser, *container);
+
+      if (has_content) {
+
+        (*container)->type = (uint16_t)CMARK_NODE_HEADING;
+        (*container)->as.heading.level = lev;
+        (*container)->as.heading.setext = true;
+        S_advance_offset(parser, input, input->len - 1 - parser->offset, false);
+      }
     } else if (!indented &&
                !(cont_type == CMARK_NODE_PARAGRAPH && !all_matched) &&
-               (matched = scan_thematic_break(input, parser->first_nonspace))) {
+	       (parser->thematic_break_kill_pos <= parser->first_nonspace) &&
+               (matched = S_scan_thematic_break(parser, input, parser->first_nonspace))) {
       // it's only now that we know the line is not part of a setext heading:
       *container = add_child(parser, *container, CMARK_NODE_THEMATIC_BREAK,
                              parser->first_nonspace + 1);
       S_advance_offset(parser, input, input->len - 1 - parser->offset, false);
     } else if (!indented &&
-               parser->options & CMARK_OPT_FOOTNOTES &&
+               (parser->options & CMARK_OPT_FOOTNOTES) &&
+               depth < MAX_LIST_DEPTH &&
                (matched = scan_footnote_definition(input, parser->first_nonspace))) {
       cmark_chunk c = cmark_chunk_dup(input, parser->first_nonspace + 2, matched - 2);
-      cmark_chunk_to_cstr(parser->mem, &c);
 
       while (c.data[c.len - 1] != ']')
         --c.len;
       --c.len;
 
+      cmark_chunk_to_cstr(parser->mem, &c);
+
       S_advance_offset(parser, input, parser->first_nonspace + matched - parser->offset, false);
       *container = add_child(parser, *container, CMARK_NODE_FOOTNOTE_DEFINITION, parser->first_nonspace + matched + 1);
       (*container)->as.literal = c;
@@ -1140,6 +1235,7 @@
       (*container)->internal_offset = matched;
     } else if ((!indented || cont_type == CMARK_NODE_LIST) &&
 	       parser->indent < 4 &&
+               depth < MAX_LIST_DEPTH &&
                (matched = parse_list_marker(
                     parser->mem, input, parser->first_nonspace,
                     (*container)->type == CMARK_NODE_PARAGRAPH, &data))) {
@@ -1377,6 +1473,7 @@
   parser->column = 0;
   parser->first_nonspace = 0;
   parser->first_nonspace_column = 0;
+  parser->thematic_break_kill_pos = 0;
   parser->indent = 0;
   parser->blank = false;
   parser->partially_consumed_tab = false;
diff --git a/cbits/buffer.c b/cbits/buffer.c
--- a/cbits/buffer.c
+++ b/cbits/buffer.c
@@ -10,7 +10,6 @@
 #include "config.h"
 #include "cmark_ctype.h"
 #include "buffer.h"
-#include "memory.h"
 
 /* Used as default value for cmark_strbuf->ptr so that people can always
  * assume ptr is non-NULL and zero terminated even for new cmark_strbufs.
diff --git a/cbits/chunk.h b/cbits/chunk.h
--- a/cbits/chunk.h
+++ b/cbits/chunk.h
@@ -6,7 +6,6 @@
 #include <assert.h>
 #include "cmark-gfm.h"
 #include "buffer.h"
-#include "memory.h"
 #include "cmark_ctype.h"
 
 #define CMARK_CHUNK_EMPTY                                                      \
diff --git a/cbits/cmark-gfm-core-extensions.h b/cbits/cmark-gfm-core-extensions.h
--- a/cbits/cmark-gfm-core-extensions.h
+++ b/cbits/cmark-gfm-core-extensions.h
@@ -6,23 +6,46 @@
 #endif
 
 #include "cmark-gfm-extension_api.h"
-#include "cmark-gfm-extensions_export.h"
+#include "cmark-gfm_export.h"
+#include <stdbool.h>
 #include <stdint.h>
 
-CMARK_GFM_EXTENSIONS_EXPORT
+CMARK_GFM_EXPORT
 void cmark_gfm_core_extensions_ensure_registered(void);
 
-CMARK_GFM_EXTENSIONS_EXPORT
+CMARK_GFM_EXPORT
 uint16_t cmark_gfm_extensions_get_table_columns(cmark_node *node);
 
-CMARK_GFM_EXTENSIONS_EXPORT
+/** Sets the number of columns for the table, returning 1 on success and 0 on error.
+ */
+CMARK_GFM_EXPORT
+int cmark_gfm_extensions_set_table_columns(cmark_node *node, uint16_t n_columns);
+
+CMARK_GFM_EXPORT
 uint8_t *cmark_gfm_extensions_get_table_alignments(cmark_node *node);
 
-CMARK_GFM_EXTENSIONS_EXPORT
+/** Sets the alignments for the table, returning 1 on success and 0 on error.
+ */
+CMARK_GFM_EXPORT
+int cmark_gfm_extensions_set_table_alignments(cmark_node *node, uint16_t ncols, uint8_t *alignments);
+
+CMARK_GFM_EXPORT
 int cmark_gfm_extensions_get_table_row_is_header(cmark_node *node);
 
-CMARK_GFM_EXTENSIONS_EXPORT
-char *cmark_gfm_extensions_get_tasklist_state(cmark_node *node);
+/** Sets whether the node is a table header row, returning 1 on success and 0 on error.
+ */
+CMARK_GFM_EXPORT
+int cmark_gfm_extensions_set_table_row_is_header(cmark_node *node, int is_header);
+
+CMARK_GFM_EXPORT
+bool cmark_gfm_extensions_get_tasklist_item_checked(cmark_node *node);
+/* For backwards compatibility */
+#define cmark_gfm_extensions_tasklist_is_checked cmark_gfm_extensions_get_tasklist_item_checked
+
+/** Sets whether a tasklist item is "checked" (completed), returning 1 on success and 0 on error.
+ */
+CMARK_GFM_EXPORT
+int cmark_gfm_extensions_set_tasklist_item_checked(cmark_node *node, bool is_checked);
 
 #ifdef __cplusplus
 }
diff --git a/cbits/cmark-gfm-extension_api.h b/cbits/cmark-gfm-extension_api.h
--- a/cbits/cmark-gfm-extension_api.h
+++ b/cbits/cmark-gfm-extension_api.h
@@ -114,6 +114,7 @@
   struct delimiter *previous;
   struct delimiter *next;
   cmark_node *inl_text;
+  bufsize_t position;
   bufsize_t length;
   unsigned char delim_char;
   int can_open;
diff --git a/cbits/cmark-gfm-extensions_export.h b/cbits/cmark-gfm-extensions_export.h
deleted file mode 100644
--- a/cbits/cmark-gfm-extensions_export.h
+++ /dev/null
@@ -1,42 +0,0 @@
-
-#ifndef CMARK_GFM_EXTENSIONS_EXPORT_H
-#define CMARK_GFM_EXTENSIONS_EXPORT_H
-
-#ifdef CMARK_GFM_EXTENSIONS_STATIC_DEFINE
-#  define CMARK_GFM_EXTENSIONS_EXPORT
-#  define CMARK_GFM_EXTENSIONS_NO_EXPORT
-#else
-#  ifndef CMARK_GFM_EXTENSIONS_EXPORT
-#    ifdef libcmark_gfm_extensions_EXPORTS
-        /* We are building this library */
-#      define CMARK_GFM_EXTENSIONS_EXPORT __attribute__((visibility("default")))
-#    else
-        /* We are using this library */
-#      define CMARK_GFM_EXTENSIONS_EXPORT __attribute__((visibility("default")))
-#    endif
-#  endif
-
-#  ifndef CMARK_GFM_EXTENSIONS_NO_EXPORT
-#    define CMARK_GFM_EXTENSIONS_NO_EXPORT __attribute__((visibility("hidden")))
-#  endif
-#endif
-
-#ifndef CMARK_GFM_EXTENSIONS_DEPRECATED
-#  define CMARK_GFM_EXTENSIONS_DEPRECATED __attribute__ ((__deprecated__))
-#endif
-
-#ifndef CMARK_GFM_EXTENSIONS_DEPRECATED_EXPORT
-#  define CMARK_GFM_EXTENSIONS_DEPRECATED_EXPORT CMARK_GFM_EXTENSIONS_EXPORT CMARK_GFM_EXTENSIONS_DEPRECATED
-#endif
-
-#ifndef CMARK_GFM_EXTENSIONS_DEPRECATED_NO_EXPORT
-#  define CMARK_GFM_EXTENSIONS_DEPRECATED_NO_EXPORT CMARK_GFM_EXTENSIONS_NO_EXPORT CMARK_GFM_EXTENSIONS_DEPRECATED
-#endif
-
-#if 0 /* DEFINE_NO_DEPRECATED */
-#  ifndef CMARK_GFM_EXTENSIONS_NO_DEPRECATED
-#    define CMARK_GFM_EXTENSIONS_NO_DEPRECATED
-#  endif
-#endif
-
-#endif /* CMARK_GFM_EXTENSIONS_EXPORT_H */
diff --git a/cbits/cmark-gfm.h b/cbits/cmark-gfm.h
--- a/cbits/cmark-gfm.h
+++ b/cbits/cmark-gfm.h
@@ -111,13 +111,13 @@
  * realloc and free.
  */
 CMARK_GFM_EXPORT
-cmark_mem *cmark_get_default_mem_allocator();
+cmark_mem *cmark_get_default_mem_allocator(void);
 
 /** An arena allocator; uses system calloc to allocate large
  * slabs of memory.  Memory in these slabs is not reused at all.
  */
 CMARK_GFM_EXPORT
-cmark_mem *cmark_get_arena_mem_allocator();
+cmark_mem *cmark_get_arena_mem_allocator(void);
 
 /** Resets the arena allocator, quickly returning all used memory
  * to the operating system.
@@ -225,6 +225,11 @@
  */
 CMARK_GFM_EXPORT cmark_node *cmark_node_last_child(cmark_node *node);
 
+/** Returns the footnote reference of 'node', or NULL if 'node' doesn't have a
+ * footnote reference.
+ */
+CMARK_GFM_EXPORT cmark_node *cmark_node_parent_footnote_def(cmark_node *node);
+
 /**
  * ## Iterator
  *
@@ -408,6 +413,17 @@
  */
 CMARK_GFM_EXPORT int cmark_node_set_list_tight(cmark_node *node, int tight);
 
+/**
+ * Returns item index of 'node'. This is only used when rendering output
+ * formats such as commonmark, which need to output the index. It is not
+ * required for formats such as html or latex.
+ */
+CMARK_GFM_EXPORT int cmark_node_get_item_index(cmark_node *node);
+
+/** Sets item index of 'node'. Returns 1 on success, 0 on failure.
+ */
+CMARK_GFM_EXPORT int cmark_node_set_item_index(cmark_node *node, int idx);
+
 /** Returns the info string from a fenced code block.
  */
 CMARK_GFM_EXPORT const char *cmark_node_get_fence_info(cmark_node *node);
@@ -690,6 +706,20 @@
  */
 #define CMARK_OPT_HARDBREAKS (1 << 2)
 
+/** `CMARK_OPT_SAFE` is defined here for API compatibility,
+    but it no longer has any effect. "Safe" mode is now the default:
+    set `CMARK_OPT_UNSAFE` to disable it.
+ */
+#define CMARK_OPT_SAFE (1 << 3)
+
+/** Render raw HTML and unsafe links (`javascript:`, `vbscript:`,
+ * `file:`, and `data:`, except for `image/png`, `image/gif`,
+ * `image/jpeg`, or `image/webp` mime types).  By default,
+ * raw HTML is replaced by a placeholder HTML comment. Unsafe
+ * links are replaced by empty strings.
+ */
+#define CMARK_OPT_UNSAFE (1 << 17)
+
 /** Render `softbreak` elements as spaces.
  */
 #define CMARK_OPT_NOBREAKS (1 << 4)
@@ -737,14 +767,6 @@
  * a separate attribute.
  */
 #define CMARK_OPT_FULL_INFO_STRING (1 << 16)
-
-/** Allow raw HTML and unsafe links, `javascript:`, `vbscript:`, `file:`, and
- * all `data:` URLs -- by default, only `image/png`, `image/gif`, `image/jpeg`,
- * or `image/webp` mime types are allowed. Without this option, raw HTML is
- * replaced by a placeholder HTML comment, and unsafe links are replaced by
- * empty strings.
- */
-#define CMARK_OPT_UNSAFE (1 << 17)
 
 /**
  * ## Version information
diff --git a/cbits/cmark-gfm_version.h b/cbits/cmark-gfm_version.h
--- a/cbits/cmark-gfm_version.h
+++ b/cbits/cmark-gfm_version.h
@@ -1,7 +1,7 @@
 #ifndef CMARK_GFM_VERSION_H
 #define CMARK_GFM_VERSION_H
 
-#define CMARK_GFM_VERSION ((0 << 24) | (28 << 16) | (3 << 8) | 20)
-#define CMARK_GFM_VERSION_STRING "0.28.3.gfm.20"
+#define CMARK_GFM_VERSION ((0 << 24) | (29 << 16) | (0 << 8) | 13)
+#define CMARK_GFM_VERSION_STRING "0.29.0.gfm.13"
 
 #endif
diff --git a/cbits/cmark.c b/cbits/cmark.c
--- a/cbits/cmark.c
+++ b/cbits/cmark.c
@@ -10,9 +10,9 @@
 cmark_node_type CMARK_NODE_LAST_BLOCK = CMARK_NODE_FOOTNOTE_DEFINITION;
 cmark_node_type CMARK_NODE_LAST_INLINE = CMARK_NODE_FOOTNOTE_REFERENCE;
 
-int cmark_version() { return CMARK_GFM_VERSION; }
+int cmark_version(void) { return CMARK_GFM_VERSION; }
 
-const char *cmark_version_string() { return CMARK_GFM_VERSION_STRING; }
+const char *cmark_version_string(void) { return CMARK_GFM_VERSION_STRING; }
 
 static void *xcalloc(size_t nmem, size_t size) {
   void *ptr = calloc(nmem, size);
@@ -38,7 +38,7 @@
 
 cmark_mem CMARK_DEFAULT_MEM_ALLOCATOR = {xcalloc, xrealloc, xfree};
 
-cmark_mem *cmark_get_default_mem_allocator() {
+cmark_mem *cmark_get_default_mem_allocator(void) {
   return &CMARK_DEFAULT_MEM_ALLOCATOR;
 }
 
diff --git a/cbits/commonmark.c b/cbits/commonmark.c
--- a/cbits/commonmark.c
+++ b/cbits/commonmark.c
@@ -34,7 +34,8 @@
   needs_escaping =
       c < 0x80 && escape != LITERAL &&
       ((escape == NORMAL &&
-        (c == '*' || c == '_' || c == '[' || c == ']' || c == '#' || c == '<' ||
+        (c < 0x20 ||
+	 c == '*' || c == '_' || c == '[' || c == ']' || c == '#' || c == '<' ||
          c == '>' || c == '\\' || c == '`' || c == '~' || c == '!' ||
          (c == '&' && cmark_isalpha(nextc)) || (c == '!' && nextc == '[') ||
          (renderer->begin_content && (c == '-' || c == '+' || c == '=') &&
@@ -50,14 +51,18 @@
         (c == '`' || c == '<' || c == '>' || c == '"' || c == '\\')));
 
   if (needs_escaping) {
-    if (cmark_isspace((char)c)) {
+    if (escape == URL && cmark_isspace((char)c)) {
       // use percent encoding for spaces
-      snprintf(encoded, ENCODED_SIZE, "%%%2x", c);
+      snprintf(encoded, ENCODED_SIZE, "%%%2X", c);
       cmark_strbuf_puts(renderer->buffer, encoded);
       renderer->column += 3;
-    } else {
+    } else if (cmark_ispunct((char)c)) {
       cmark_render_ascii(renderer, "\\");
       cmark_render_code_point(renderer, c);
+    } else { // render as entity
+      snprintf(encoded, ENCODED_SIZE, "&#%d;", c);
+      cmark_strbuf_puts(renderer->buffer, encoded);
+      renderer->column += (int)strlen(encoded);
     }
   } else {
     cmark_render_code_point(renderer, c);
@@ -148,23 +153,8 @@
                   link_text->as.literal.len) == 0);
 }
 
-// if node is a block node, returns node.
-// otherwise returns first block-level node that is an ancestor of node.
-// if there is no block-level ancestor, returns NULL.
-static cmark_node *get_containing_block(cmark_node *node) {
-  while (node) {
-    if (CMARK_NODE_BLOCK_P(node)) {
-      return node;
-    } else {
-      node = node->parent;
-    }
-  }
-  return NULL;
-}
-
 static int S_render_node(cmark_renderer *renderer, cmark_node *node,
                          cmark_event_type ev_type, int options) {
-  cmark_node *tmp;
   int list_number;
   cmark_delim_type list_delim;
   int numticks;
@@ -175,7 +165,7 @@
   char fencechar[2] = {'\0', '\0'};
   size_t info_len, code_len;
   char listmarker[LISTMARKER_SIZE];
-  char *emph_delim;
+  const char *emph_delim;
   bool first_in_list_item;
   bufsize_t marker_width;
   bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options) &&
@@ -184,14 +174,17 @@
   // Don't adjust tight list status til we've started the list.
   // Otherwise we loose the blank line between a paragraph and
   // a following list.
-  if (!(node->type == CMARK_NODE_ITEM && node->prev == NULL && entering)) {
-    tmp = get_containing_block(node);
-    renderer->in_tight_list_item =
-        tmp && // tmp might be NULL if there is no containing block
-        ((tmp->type == CMARK_NODE_ITEM &&
-          cmark_node_get_list_tight(tmp->parent)) ||
-         (tmp && tmp->parent && tmp->parent->type == CMARK_NODE_ITEM &&
-          cmark_node_get_list_tight(tmp->parent->parent)));
+  if (entering) {
+    if (node->parent && node->parent->type == CMARK_NODE_ITEM) {
+      renderer->in_tight_list_item = node->parent->parent->as.list.tight;
+    }
+  } else {
+    if (node->type == CMARK_NODE_LIST) {
+      renderer->in_tight_list_item =
+        node->parent &&
+        node->parent->type == CMARK_NODE_ITEM &&
+        node->parent->parent->as.list.tight;
+    }
   }
 
   if (node->extension && node->extension->commonmark_render_func) {
@@ -229,13 +222,8 @@
     if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
       marker_width = 4;
     } else {
-      list_number = cmark_node_get_list_start(node->parent);
+      list_number = cmark_node_get_item_index(node);
       list_delim = cmark_node_get_list_delim(node->parent);
-      tmp = node;
-      while (tmp->prev) {
-        tmp = tmp->prev;
-        list_number += 1;
-      }
       // we ensure a width of at least 4 so
       // we get nice transition from single digits
       // to double
@@ -400,10 +388,12 @@
     break;
 
   case CMARK_NODE_STRONG:
-    if (entering) {
-      LIT("**");
-    } else {
-      LIT("**");
+    if (node->parent == NULL || node->parent->type != CMARK_NODE_STRONG) {
+      if (entering) {
+        LIT("**");
+      } else {
+        LIT("**");
+      }
     }
     break;
 
@@ -472,7 +462,13 @@
   case CMARK_NODE_FOOTNOTE_REFERENCE:
     if (entering) {
       LIT("[^");
-      OUT(cmark_chunk_to_cstr(renderer->mem, &node->as.literal), false, LITERAL);
+
+      char *footnote_label = renderer->mem->calloc(node->parent_footnote_def->as.literal.len + 1, sizeof(char));
+      memmove(footnote_label, node->parent_footnote_def->as.literal.data, node->parent_footnote_def->as.literal.len);
+
+      OUT(footnote_label, false, LITERAL);
+      renderer->mem->free(footnote_label);
+
       LIT("]");
     }
     break;
@@ -481,9 +477,13 @@
     if (entering) {
       renderer->footnote_ix += 1;
       LIT("[^");
-      char n[32];
-      snprintf(n, sizeof(n), "%d", renderer->footnote_ix);
-      OUT(n, false, LITERAL);
+
+      char *footnote_label = renderer->mem->calloc(node->as.literal.len + 1, sizeof(char));
+      memmove(footnote_label, node->as.literal.data, node->as.literal.len);
+
+      OUT(footnote_label, false, LITERAL);
+      renderer->mem->free(footnote_label);
+
       LIT("]:\n");
 
       cmark_strbuf_puts(renderer->prefix, "    ");
diff --git a/cbits/ext_scanners.c b/cbits/ext_scanners.c
--- a/cbits/ext_scanners.c
+++ b/cbits/ext_scanners.c
@@ -1,4 +1,5 @@
-/* Generated by re2c 1.1.1 */
+/* Generated by re2c 1.3 */
+
 #include "ext_scanners.h"
 #include <stdlib.h>
 
@@ -39,265 +40,180 @@
         0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,
     };
-    yych = *(marker = p);
-    if (yych <= '{') {
-      if (yych <= 0x1F) {
-        if (yych <= '\t') {
-          if (yych <= 0x08)
-            goto yy3;
+    yych = *p;
+    if (yych <= ' ') {
+      if (yych <= '\n') {
+        if (yych == '\t')
           goto yy4;
-        } else {
-          if (yych <= '\n')
-            goto yy2;
-          if (yych <= '\f')
-            goto yy4;
-          goto yy3;
-        }
       } else {
-        if (yych <= '-') {
-          if (yych <= ' ')
-            goto yy4;
-          if (yych <= ',')
-            goto yy3;
-          goto yy5;
-        } else {
-          if (yych == ':')
-            goto yy6;
-          goto yy3;
-        }
+        if (yych <= '\f')
+          goto yy4;
+        if (yych >= ' ')
+          goto yy4;
       }
     } else {
-      if (yych <= 0xEC) {
-        if (yych <= 0xC1) {
-          if (yych <= '|')
-            goto yy4;
-          if (yych <= 0x7F)
-            goto yy3;
-        } else {
-          if (yych <= 0xDF)
-            goto yy7;
-          if (yych <= 0xE0)
-            goto yy9;
-          goto yy10;
-        }
+      if (yych <= '9') {
+        if (yych == '-')
+          goto yy5;
       } else {
-        if (yych <= 0xF0) {
-          if (yych <= 0xED)
-            goto yy11;
-          if (yych <= 0xEF)
-            goto yy10;
-          goto yy12;
-        } else {
-          if (yych <= 0xF3)
-            goto yy13;
-          if (yych <= 0xF4)
-            goto yy14;
-        }
+        if (yych <= ':')
+          goto yy6;
+        if (yych == '|')
+          goto yy4;
       }
     }
-  yy2 : { return 0; }
-  yy3:
     ++p;
-    goto yy2;
+  yy3 : { return 0; }
   yy4:
     yych = *(marker = ++p);
     if (yybm[0 + yych] & 64) {
-      goto yy15;
+      goto yy7;
     }
     if (yych == '-')
-      goto yy17;
+      goto yy10;
     if (yych == ':')
-      goto yy19;
-    goto yy2;
+      goto yy12;
+    goto yy3;
   yy5:
     yych = *(marker = ++p);
     if (yybm[0 + yych] & 128) {
-      goto yy17;
+      goto yy10;
     }
     if (yych <= ' ') {
       if (yych <= 0x08)
-        goto yy2;
+        goto yy3;
       if (yych <= '\r')
-        goto yy21;
+        goto yy14;
       if (yych <= 0x1F)
-        goto yy2;
-      goto yy21;
+        goto yy3;
+      goto yy14;
     } else {
       if (yych <= ':') {
         if (yych <= '9')
-          goto yy2;
-        goto yy20;
+          goto yy3;
+        goto yy13;
       } else {
         if (yych == '|')
-          goto yy21;
-        goto yy2;
+          goto yy14;
+        goto yy3;
       }
     }
   yy6:
     yych = *(marker = ++p);
     if (yybm[0 + yych] & 128) {
-      goto yy17;
+      goto yy10;
     }
-    goto yy2;
+    goto yy3;
   yy7:
     yych = *++p;
-    if (yych <= 0x7F)
-      goto yy8;
-    if (yych <= 0xBF)
-      goto yy3;
-  yy8:
-    p = marker;
-    goto yy2;
-  yy9:
-    yych = *++p;
-    if (yych <= 0x9F)
-      goto yy8;
-    if (yych <= 0xBF)
-      goto yy7;
-    goto yy8;
-  yy10:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy8;
-    if (yych <= 0xBF)
-      goto yy7;
-    goto yy8;
-  yy11:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy8;
-    if (yych <= 0x9F)
-      goto yy7;
-    goto yy8;
-  yy12:
-    yych = *++p;
-    if (yych <= 0x8F)
-      goto yy8;
-    if (yych <= 0xBF)
-      goto yy10;
-    goto yy8;
-  yy13:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy8;
-    if (yych <= 0xBF)
-      goto yy10;
-    goto yy8;
-  yy14:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy8;
-    if (yych <= 0x8F)
-      goto yy10;
-    goto yy8;
-  yy15:
-    yych = *++p;
     if (yybm[0 + yych] & 64) {
-      goto yy15;
+      goto yy7;
     }
     if (yych == '-')
-      goto yy17;
+      goto yy10;
     if (yych == ':')
-      goto yy19;
-    goto yy8;
-  yy17:
+      goto yy12;
+  yy9:
+    p = marker;
+    goto yy3;
+  yy10:
     yych = *++p;
     if (yybm[0 + yych] & 128) {
-      goto yy17;
+      goto yy10;
     }
     if (yych <= 0x1F) {
       if (yych <= '\n') {
         if (yych <= 0x08)
-          goto yy8;
+          goto yy9;
         if (yych <= '\t')
-          goto yy20;
-        goto yy22;
+          goto yy13;
+        goto yy15;
       } else {
         if (yych <= '\f')
-          goto yy20;
+          goto yy13;
         if (yych <= '\r')
-          goto yy24;
-        goto yy8;
+          goto yy17;
+        goto yy9;
       }
     } else {
       if (yych <= ':') {
         if (yych <= ' ')
-          goto yy20;
+          goto yy13;
         if (yych <= '9')
-          goto yy8;
-        goto yy20;
+          goto yy9;
+        goto yy13;
       } else {
         if (yych == '|')
-          goto yy25;
-        goto yy8;
+          goto yy18;
+        goto yy9;
       }
     }
-  yy19:
+  yy12:
     yych = *++p;
     if (yybm[0 + yych] & 128) {
-      goto yy17;
+      goto yy10;
     }
-    goto yy8;
-  yy20:
+    goto yy9;
+  yy13:
     yych = *++p;
-  yy21:
+  yy14:
     if (yych <= '\r') {
       if (yych <= '\t') {
         if (yych <= 0x08)
-          goto yy8;
-        goto yy20;
+          goto yy9;
+        goto yy13;
       } else {
         if (yych <= '\n')
-          goto yy22;
+          goto yy15;
         if (yych <= '\f')
-          goto yy20;
-        goto yy24;
+          goto yy13;
+        goto yy17;
       }
     } else {
       if (yych <= ' ') {
         if (yych <= 0x1F)
-          goto yy8;
-        goto yy20;
+          goto yy9;
+        goto yy13;
       } else {
         if (yych == '|')
-          goto yy25;
-        goto yy8;
+          goto yy18;
+        goto yy9;
       }
     }
-  yy22:
+  yy15:
     ++p;
     { return (bufsize_t)(p - start); }
-  yy24:
+  yy17:
     yych = *++p;
     if (yych == '\n')
-      goto yy22;
-    goto yy8;
-  yy25:
+      goto yy15;
+    goto yy9;
+  yy18:
     yych = *++p;
     if (yybm[0 + yych] & 128) {
-      goto yy17;
+      goto yy10;
     }
     if (yych <= '\r') {
       if (yych <= '\t') {
         if (yych <= 0x08)
-          goto yy8;
-        goto yy25;
+          goto yy9;
+        goto yy18;
       } else {
         if (yych <= '\n')
-          goto yy22;
+          goto yy15;
         if (yych <= '\f')
-          goto yy25;
-        goto yy24;
+          goto yy18;
+        goto yy17;
       }
     } else {
       if (yych <= ' ') {
         if (yych <= 0x1F)
-          goto yy8;
-        goto yy25;
+          goto yy9;
+        goto yy18;
       } else {
         if (yych == ':')
-          goto yy19;
-        goto yy8;
+          goto yy12;
+        goto yy9;
       }
     }
   }
@@ -309,6 +225,7 @@
 
   {
     unsigned char yych;
+    unsigned int yyaccept = 0;
     static const unsigned char yybm[] = {
         64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 0,  64, 64, 0,  64, 64, 64, 64,
         64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
@@ -326,53 +243,51 @@
         0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
         0,  0,  0,   0,
     };
-    yych = *(marker = p);
+    yych = *p;
     if (yybm[0 + yych] & 64) {
-      goto yy30;
+      goto yy22;
     }
-    if (yych <= 0xE0) {
-      if (yych <= '\\') {
-        if (yych <= '\n')
-          goto yy29;
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
         if (yych <= '\r')
-          goto yy32;
-        goto yy34;
+          goto yy25;
+        if (yych <= '\\')
+          goto yy27;
+        goto yy25;
       } else {
-        if (yych <= '|')
-          goto yy32;
-        if (yych <= 0xC1)
-          goto yy29;
         if (yych <= 0xDF)
-          goto yy36;
-        goto yy38;
+          goto yy29;
+        if (yych <= 0xE0)
+          goto yy30;
+        goto yy31;
       }
     } else {
-      if (yych <= 0xEF) {
-        if (yych == 0xED)
-          goto yy40;
-        goto yy39;
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy32;
+        if (yych <= 0xEF)
+          goto yy31;
+        goto yy33;
       } else {
-        if (yych <= 0xF0)
-          goto yy41;
         if (yych <= 0xF3)
-          goto yy42;
+          goto yy34;
         if (yych <= 0xF4)
-          goto yy43;
+          goto yy35;
+        goto yy25;
       }
     }
-  yy29 : { return (bufsize_t)(p - start); }
-  yy30:
+  yy22:
+    yyaccept = 0;
     yych = *(marker = ++p);
     if (yybm[0 + yych] & 64) {
-      goto yy30;
+      goto yy22;
     }
     if (yych <= 0xEC) {
       if (yych <= 0xC1) {
         if (yych <= '\r')
-          goto yy29;
+          goto yy24;
         if (yych <= '\\')
-          goto yy34;
-        goto yy29;
+          goto yy27;
       } else {
         if (yych <= 0xDF)
           goto yy36;
@@ -392,29 +307,31 @@
           goto yy42;
         if (yych <= 0xF4)
           goto yy43;
-        goto yy29;
       }
     }
-  yy32:
+  yy24 : { return (bufsize_t)(p - start); }
+  yy25:
     ++p;
-    { return 0; }
-  yy34:
+  yy26 : { return 0; }
+  yy27:
+    yyaccept = 0;
     yych = *(marker = ++p);
     if (yybm[0 + yych] & 128) {
-      goto yy34;
+      goto yy27;
     }
     if (yych <= 0xDF) {
       if (yych <= '\f') {
         if (yych == '\n')
-          goto yy29;
-        goto yy30;
+          goto yy24;
+        goto yy22;
       } else {
         if (yych <= '\r')
-          goto yy29;
+          goto yy24;
         if (yych <= 0x7F)
-          goto yy30;
+          goto yy22;
         if (yych <= 0xC1)
-          goto yy29;
+          goto yy24;
+        goto yy36;
       }
     } else {
       if (yych <= 0xEF) {
@@ -430,18 +347,77 @@
           goto yy42;
         if (yych <= 0xF4)
           goto yy43;
-        goto yy29;
+        goto yy24;
       }
     }
+  yy29:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy26;
+    if (yych <= 0xBF)
+      goto yy22;
+    goto yy26;
+  yy30:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych <= 0x9F)
+      goto yy26;
+    if (yych <= 0xBF)
+      goto yy36;
+    goto yy26;
+  yy31:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy26;
+    if (yych <= 0xBF)
+      goto yy36;
+    goto yy26;
+  yy32:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy26;
+    if (yych <= 0x9F)
+      goto yy36;
+    goto yy26;
+  yy33:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych <= 0x8F)
+      goto yy26;
+    if (yych <= 0xBF)
+      goto yy39;
+    goto yy26;
+  yy34:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy26;
+    if (yych <= 0xBF)
+      goto yy39;
+    goto yy26;
+  yy35:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy26;
+    if (yych <= 0x8F)
+      goto yy39;
+    goto yy26;
   yy36:
     yych = *++p;
     if (yych <= 0x7F)
       goto yy37;
     if (yych <= 0xBF)
-      goto yy30;
+      goto yy22;
   yy37:
     p = marker;
-    goto yy29;
+    if (yyaccept == 0) {
+      goto yy24;
+    } else {
+      goto yy26;
+    }
   yy38:
     yych = *++p;
     if (yych <= 0x9F)
@@ -488,12 +464,10 @@
 }
 
 bufsize_t _scan_table_cell_end(const unsigned char *p) {
-  const unsigned char *marker = NULL;
   const unsigned char *start = p;
 
   {
     unsigned char yych;
-    unsigned int yyaccept = 0;
     static const unsigned char yybm[] = {
         0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 128, 128, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   128, 0, 0, 0, 0, 0, 0, 0,
@@ -509,115 +483,17 @@
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0,
     };
-    yych = *(marker = p);
-    if (yych <= 0xDF) {
-      if (yych <= '{') {
-        if (yych != '\n')
-          goto yy47;
-      } else {
-        if (yych <= '|')
-          goto yy48;
-        if (yych <= 0x7F)
-          goto yy47;
-        if (yych >= 0xC2)
-          goto yy51;
-      }
-    } else {
-      if (yych <= 0xEF) {
-        if (yych <= 0xE0)
-          goto yy53;
-        if (yych == 0xED)
-          goto yy55;
-        goto yy54;
-      } else {
-        if (yych <= 0xF0)
-          goto yy56;
-        if (yych <= 0xF3)
-          goto yy57;
-        if (yych <= 0xF4)
-          goto yy58;
-      }
-    }
-  yy46 : { return 0; }
-  yy47:
+    yych = *p;
+    if (yych == '|')
+      goto yy48;
     ++p;
-    goto yy46;
+    { return 0; }
   yy48:
-    yyaccept = 1;
-    yych = *(marker = ++p);
+    yych = *++p;
     if (yybm[0 + yych] & 128) {
       goto yy48;
     }
-    if (yych <= 0x08)
-      goto yy50;
-    if (yych <= '\n')
-      goto yy59;
-    if (yych <= '\r')
-      goto yy60;
-  yy50 : { return (bufsize_t)(p - start); }
-  yy51:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy52;
-    if (yych <= 0xBF)
-      goto yy47;
-  yy52:
-    p = marker;
-    if (yyaccept == 0) {
-      goto yy46;
-    } else {
-      goto yy50;
-    }
-  yy53:
-    yych = *++p;
-    if (yych <= 0x9F)
-      goto yy52;
-    if (yych <= 0xBF)
-      goto yy51;
-    goto yy52;
-  yy54:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy52;
-    if (yych <= 0xBF)
-      goto yy51;
-    goto yy52;
-  yy55:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy52;
-    if (yych <= 0x9F)
-      goto yy51;
-    goto yy52;
-  yy56:
-    yych = *++p;
-    if (yych <= 0x8F)
-      goto yy52;
-    if (yych <= 0xBF)
-      goto yy54;
-    goto yy52;
-  yy57:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy52;
-    if (yych <= 0xBF)
-      goto yy54;
-    goto yy52;
-  yy58:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy52;
-    if (yych <= 0x8F)
-      goto yy54;
-    goto yy52;
-  yy59:
-    ++p;
-    goto yy50;
-  yy60:
-    yych = *++p;
-    if (yych == '\n')
-      goto yy59;
-    goto yy52;
+    { return (bufsize_t)(p - start); }
   }
 }
 
@@ -642,138 +518,62 @@
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0,
     };
-    yych = *(marker = p);
-    if (yych <= 0xC1) {
-      if (yych <= '\f') {
-        if (yych <= 0x08)
-          goto yy64;
-        if (yych == '\n')
-          goto yy66;
-        goto yy65;
-      } else {
-        if (yych <= 0x1F) {
-          if (yych <= '\r')
-            goto yy68;
-          goto yy64;
-        } else {
-          if (yych <= ' ')
-            goto yy65;
-          if (yych <= 0x7F)
-            goto yy64;
-        }
-      }
+    yych = *p;
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy53;
+      if (yych == '\n')
+        goto yy56;
+      goto yy55;
     } else {
-      if (yych <= 0xED) {
-        if (yych <= 0xDF)
-          goto yy69;
-        if (yych <= 0xE0)
-          goto yy71;
-        if (yych <= 0xEC)
-          goto yy72;
-        goto yy73;
-      } else {
-        if (yych <= 0xF0) {
-          if (yych <= 0xEF)
-            goto yy72;
-          goto yy74;
-        } else {
-          if (yych <= 0xF3)
-            goto yy75;
-          if (yych <= 0xF4)
-            goto yy76;
-        }
-      }
+      if (yych <= '\r')
+        goto yy58;
+      if (yych == ' ')
+        goto yy55;
     }
-  yy63 : { return 0; }
-  yy64:
+  yy53:
     ++p;
-    goto yy63;
-  yy65:
+  yy54 : { return 0; }
+  yy55:
     yych = *(marker = ++p);
     if (yych <= 0x08)
-      goto yy63;
+      goto yy54;
     if (yych <= '\r')
-      goto yy78;
+      goto yy60;
     if (yych == ' ')
-      goto yy78;
-    goto yy63;
-  yy66:
+      goto yy60;
+    goto yy54;
+  yy56:
     ++p;
     { return (bufsize_t)(p - start); }
-  yy68:
+  yy58:
     yych = *++p;
     if (yych == '\n')
-      goto yy66;
-    goto yy63;
-  yy69:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy70;
-    if (yych <= 0xBF)
-      goto yy64;
-  yy70:
-    p = marker;
-    goto yy63;
-  yy71:
-    yych = *++p;
-    if (yych <= 0x9F)
-      goto yy70;
-    if (yych <= 0xBF)
-      goto yy69;
-    goto yy70;
-  yy72:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy70;
-    if (yych <= 0xBF)
-      goto yy69;
-    goto yy70;
-  yy73:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy70;
-    if (yych <= 0x9F)
-      goto yy69;
-    goto yy70;
-  yy74:
-    yych = *++p;
-    if (yych <= 0x8F)
-      goto yy70;
-    if (yych <= 0xBF)
-      goto yy72;
-    goto yy70;
-  yy75:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy70;
-    if (yych <= 0xBF)
-      goto yy72;
-    goto yy70;
-  yy76:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy70;
-    if (yych <= 0x8F)
-      goto yy72;
-    goto yy70;
-  yy77:
+      goto yy56;
+    goto yy54;
+  yy59:
     yych = *++p;
-  yy78:
+  yy60:
     if (yybm[0 + yych] & 128) {
-      goto yy77;
+      goto yy59;
     }
     if (yych <= 0x08)
-      goto yy70;
+      goto yy61;
     if (yych <= '\n')
-      goto yy66;
-    if (yych >= 0x0E)
-      goto yy70;
+      goto yy56;
+    if (yych <= '\r')
+      goto yy62;
+  yy61:
+    p = marker;
+    goto yy54;
+  yy62:
     yych = *++p;
     if (yych == '\n')
-      goto yy66;
-    goto yy70;
+      goto yy56;
+    goto yy61;
   }
 }
+
 bufsize_t _scan_tasklist(const unsigned char *p) {
   const unsigned char *marker = NULL;
   const unsigned char *start = p;
@@ -798,361 +598,281 @@
         0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0,  0,  0, 0, 0,
         0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0,  0,  0, 0, 0,
     };
-    yych = *(marker = p);
-    if (yych <= '/') {
-      if (yych <= 0x1F) {
-        if (yych <= '\t') {
-          if (yych <= 0x08)
-            goto yy83;
-          goto yy84;
-        } else {
-          if (yych <= '\n')
-            goto yy82;
-          if (yych <= '\f')
-            goto yy84;
-          goto yy83;
-        }
+    yych = *p;
+    if (yych <= ' ') {
+      if (yych <= '\n') {
+        if (yych == '\t')
+          goto yy67;
       } else {
-        if (yych <= '+') {
-          if (yych <= ' ')
-            goto yy84;
-          if (yych <= ')')
-            goto yy83;
-          goto yy85;
-        } else {
-          if (yych == '-')
-            goto yy85;
-          goto yy83;
-        }
+        if (yych <= '\f')
+          goto yy67;
+        if (yych >= ' ')
+          goto yy67;
       }
     } else {
-      if (yych <= 0xEC) {
-        if (yych <= 0xC1) {
-          if (yych <= '9')
-            goto yy86;
-          if (yych <= 0x7F)
-            goto yy83;
-        } else {
-          if (yych <= 0xDF)
-            goto yy87;
-          if (yych <= 0xE0)
-            goto yy89;
-          goto yy90;
-        }
+      if (yych <= ',') {
+        if (yych <= ')')
+          goto yy65;
+        if (yych <= '+')
+          goto yy68;
       } else {
-        if (yych <= 0xF0) {
-          if (yych <= 0xED)
-            goto yy91;
-          if (yych <= 0xEF)
-            goto yy90;
-          goto yy92;
-        } else {
-          if (yych <= 0xF3)
-            goto yy93;
-          if (yych <= 0xF4)
-            goto yy94;
-        }
+        if (yych <= '-')
+          goto yy68;
+        if (yych <= '/')
+          goto yy65;
+        if (yych <= '9')
+          goto yy69;
       }
     }
-  yy82 : { return 0; }
-  yy83:
+  yy65:
     ++p;
-    goto yy82;
-  yy84:
+  yy66 : { return 0; }
+  yy67:
     yych = *(marker = ++p);
     if (yybm[0 + yych] & 64) {
-      goto yy95;
+      goto yy70;
     }
     if (yych <= ',') {
       if (yych <= ')')
-        goto yy82;
+        goto yy66;
       if (yych <= '+')
-        goto yy97;
-      goto yy82;
+        goto yy73;
+      goto yy66;
     } else {
       if (yych <= '-')
-        goto yy97;
+        goto yy73;
       if (yych <= '/')
-        goto yy82;
+        goto yy66;
       if (yych <= '9')
-        goto yy98;
-      goto yy82;
+        goto yy74;
+      goto yy66;
     }
-  yy85:
+  yy68:
     yych = *(marker = ++p);
     if (yych <= '\n') {
       if (yych == '\t')
-        goto yy99;
-      goto yy82;
+        goto yy75;
+      goto yy66;
     } else {
       if (yych <= '\f')
-        goto yy99;
+        goto yy75;
       if (yych == ' ')
-        goto yy99;
-      goto yy82;
+        goto yy75;
+      goto yy66;
     }
-  yy86:
+  yy69:
     yych = *(marker = ++p);
     if (yych <= 0x1F) {
       if (yych <= '\t') {
         if (yych <= 0x08)
-          goto yy102;
-        goto yy97;
+          goto yy78;
+        goto yy73;
       } else {
         if (yych <= '\n')
-          goto yy82;
+          goto yy66;
         if (yych <= '\f')
-          goto yy97;
-        goto yy102;
+          goto yy73;
+        goto yy78;
       }
     } else {
       if (yych <= 0x7F) {
         if (yych <= ' ')
-          goto yy97;
-        goto yy102;
+          goto yy73;
+        goto yy78;
       } else {
         if (yych <= 0xC1)
-          goto yy82;
+          goto yy66;
         if (yych <= 0xF4)
-          goto yy102;
-        goto yy82;
+          goto yy78;
+        goto yy66;
       }
     }
-  yy87:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy88;
-    if (yych <= 0xBF)
-      goto yy83;
-  yy88:
-    p = marker;
-    goto yy82;
-  yy89:
-    yych = *++p;
-    if (yych <= 0x9F)
-      goto yy88;
-    if (yych <= 0xBF)
-      goto yy87;
-    goto yy88;
-  yy90:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy88;
-    if (yych <= 0xBF)
-      goto yy87;
-    goto yy88;
-  yy91:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy88;
-    if (yych <= 0x9F)
-      goto yy87;
-    goto yy88;
-  yy92:
-    yych = *++p;
-    if (yych <= 0x8F)
-      goto yy88;
-    if (yych <= 0xBF)
-      goto yy90;
-    goto yy88;
-  yy93:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy88;
-    if (yych <= 0xBF)
-      goto yy90;
-    goto yy88;
-  yy94:
-    yych = *++p;
-    if (yych <= 0x7F)
-      goto yy88;
-    if (yych <= 0x8F)
-      goto yy90;
-    goto yy88;
-  yy95:
+  yy70:
     yych = *++p;
     if (yybm[0 + yych] & 64) {
-      goto yy95;
+      goto yy70;
     }
     if (yych <= ',') {
       if (yych <= ')')
-        goto yy88;
-      if (yych >= ',')
-        goto yy88;
+        goto yy72;
+      if (yych <= '+')
+        goto yy73;
     } else {
       if (yych <= '-')
-        goto yy97;
+        goto yy73;
       if (yych <= '/')
-        goto yy88;
+        goto yy72;
       if (yych <= '9')
-        goto yy98;
-      goto yy88;
+        goto yy74;
     }
-  yy97:
+  yy72:
+    p = marker;
+    goto yy66;
+  yy73:
     yych = *++p;
     if (yych == '[')
-      goto yy88;
-    goto yy100;
-  yy98:
+      goto yy72;
+    goto yy76;
+  yy74:
     yych = *++p;
     if (yych <= '\n') {
       if (yych == '\t')
-        goto yy97;
-      goto yy102;
+        goto yy73;
+      goto yy78;
     } else {
       if (yych <= '\f')
-        goto yy97;
+        goto yy73;
       if (yych == ' ')
-        goto yy97;
-      goto yy102;
+        goto yy73;
+      goto yy78;
     }
-  yy99:
+  yy75:
     yych = *++p;
-  yy100:
+  yy76:
     if (yych <= '\f') {
       if (yych == '\t')
-        goto yy99;
+        goto yy75;
       if (yych <= '\n')
-        goto yy88;
-      goto yy99;
+        goto yy72;
+      goto yy75;
     } else {
       if (yych <= ' ') {
         if (yych <= 0x1F)
-          goto yy88;
-        goto yy99;
+          goto yy72;
+        goto yy75;
       } else {
         if (yych == '[')
-          goto yy110;
-        goto yy88;
+          goto yy86;
+        goto yy72;
       }
     }
-  yy101:
+  yy77:
     yych = *++p;
-  yy102:
+  yy78:
     if (yybm[0 + yych] & 128) {
-      goto yy101;
+      goto yy77;
     }
     if (yych <= 0xC1) {
       if (yych <= '\f') {
         if (yych <= 0x08)
-          goto yy97;
+          goto yy73;
         if (yych == '\n')
-          goto yy88;
-        goto yy99;
+          goto yy72;
+        goto yy75;
       } else {
         if (yych == ' ')
-          goto yy99;
+          goto yy75;
         if (yych <= 0x7F)
-          goto yy97;
-        goto yy88;
+          goto yy73;
+        goto yy72;
       }
     } else {
       if (yych <= 0xED) {
         if (yych <= 0xDF)
-          goto yy103;
+          goto yy79;
         if (yych <= 0xE0)
-          goto yy104;
+          goto yy80;
         if (yych <= 0xEC)
-          goto yy105;
-        goto yy106;
+          goto yy81;
+        goto yy82;
       } else {
         if (yych <= 0xF0) {
           if (yych <= 0xEF)
-            goto yy105;
-          goto yy107;
+            goto yy81;
+          goto yy83;
         } else {
           if (yych <= 0xF3)
-            goto yy108;
+            goto yy84;
           if (yych <= 0xF4)
-            goto yy109;
-          goto yy88;
+            goto yy85;
+          goto yy72;
         }
       }
     }
-  yy103:
+  yy79:
     yych = *++p;
     if (yych <= 0x7F)
-      goto yy88;
+      goto yy72;
     if (yych <= 0xBF)
-      goto yy97;
-    goto yy88;
-  yy104:
+      goto yy73;
+    goto yy72;
+  yy80:
     yych = *++p;
     if (yych <= 0x9F)
-      goto yy88;
+      goto yy72;
     if (yych <= 0xBF)
-      goto yy103;
-    goto yy88;
-  yy105:
+      goto yy79;
+    goto yy72;
+  yy81:
     yych = *++p;
     if (yych <= 0x7F)
-      goto yy88;
+      goto yy72;
     if (yych <= 0xBF)
-      goto yy103;
-    goto yy88;
-  yy106:
+      goto yy79;
+    goto yy72;
+  yy82:
     yych = *++p;
     if (yych <= 0x7F)
-      goto yy88;
+      goto yy72;
     if (yych <= 0x9F)
-      goto yy103;
-    goto yy88;
-  yy107:
+      goto yy79;
+    goto yy72;
+  yy83:
     yych = *++p;
     if (yych <= 0x8F)
-      goto yy88;
+      goto yy72;
     if (yych <= 0xBF)
-      goto yy105;
-    goto yy88;
-  yy108:
+      goto yy81;
+    goto yy72;
+  yy84:
     yych = *++p;
     if (yych <= 0x7F)
-      goto yy88;
+      goto yy72;
     if (yych <= 0xBF)
-      goto yy105;
-    goto yy88;
-  yy109:
+      goto yy81;
+    goto yy72;
+  yy85:
     yych = *++p;
     if (yych <= 0x7F)
-      goto yy88;
+      goto yy72;
     if (yych <= 0x8F)
-      goto yy105;
-    goto yy88;
-  yy110:
+      goto yy81;
+    goto yy72;
+  yy86:
     yych = *++p;
     if (yych <= 'W') {
       if (yych != ' ')
-        goto yy88;
+        goto yy72;
     } else {
       if (yych <= 'X')
-        goto yy111;
+        goto yy87;
       if (yych != 'x')
-        goto yy88;
+        goto yy72;
     }
-  yy111:
+  yy87:
     yych = *++p;
     if (yych != ']')
-      goto yy88;
+      goto yy72;
     yych = *++p;
     if (yych <= '\n') {
       if (yych != '\t')
-        goto yy88;
+        goto yy72;
     } else {
       if (yych <= '\f')
-        goto yy113;
+        goto yy89;
       if (yych != ' ')
-        goto yy88;
+        goto yy72;
     }
-  yy113:
+  yy89:
     yych = *++p;
     if (yych <= '\n') {
       if (yych == '\t')
-        goto yy113;
+        goto yy89;
     } else {
       if (yych <= '\f')
-        goto yy113;
+        goto yy89;
       if (yych == ' ')
-        goto yy113;
+        goto yy89;
     }
     { return (bufsize_t)(p - start); }
   }
diff --git a/cbits/footnotes.c b/cbits/footnotes.c
--- a/cbits/footnotes.c
+++ b/cbits/footnotes.c
@@ -38,3 +38,26 @@
 cmark_map *cmark_footnote_map_new(cmark_mem *mem) {
   return cmark_map_new(mem, footnote_free);
 }
+
+// Before calling `cmark_map_free` on a map with `cmark_footnotes`, first
+// unlink all of the footnote nodes before freeing their memory.
+//
+// Sometimes, two (unused) footnote nodes can end up referencing each other,
+// which as they get freed up by calling `cmark_map_free` -> `footnote_free` ->
+// etc, can lead to a use-after-free error.
+//
+// Better to `unlink` every footnote node first, setting their next, prev, and
+// parent pointers to NULL, and only then walk thru & free them up.
+void cmark_unlink_footnotes_map(cmark_map *map) {
+  cmark_map_entry *ref;
+  cmark_map_entry *next;
+
+  ref = map->refs;
+  while(ref) {
+    next = ref->next;
+    if (((cmark_footnote *)ref)->node) {
+      cmark_node_unlink(((cmark_footnote *)ref)->node);
+    }
+    ref = next;
+  }
+}
diff --git a/cbits/footnotes.h b/cbits/footnotes.h
--- a/cbits/footnotes.h
+++ b/cbits/footnotes.h
@@ -18,6 +18,8 @@
 void cmark_footnote_create(cmark_map *map, cmark_node *node);
 cmark_map *cmark_footnote_map_new(cmark_mem *mem);
 
+void cmark_unlink_footnotes_map(cmark_map *map);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/cbits/html.c b/cbits/html.c
--- a/cbits/html.c
+++ b/cbits/html.c
@@ -59,17 +59,45 @@
     cmark_strbuf_put(html, data, (bufsize_t)len);
 }
 
-static bool S_put_footnote_backref(cmark_html_renderer *renderer, cmark_strbuf *html) {
+static bool S_put_footnote_backref(cmark_html_renderer *renderer, cmark_strbuf *html, cmark_node *node) {
   if (renderer->written_footnote_ix >= renderer->footnote_ix)
     return false;
   renderer->written_footnote_ix = renderer->footnote_ix;
+  char m[32];
+  snprintf(m, sizeof(m), "%d", renderer->written_footnote_ix);
 
-  cmark_strbuf_puts(html, "<a href=\"#fnref");
-  char n[32];
-  snprintf(n, sizeof(n), "%d", renderer->footnote_ix);
-  cmark_strbuf_puts(html, n);
-  cmark_strbuf_puts(html, "\" class=\"footnote-backref\">↩</a>");
+  cmark_strbuf_puts(html, "<a href=\"#fnref-");
+  houdini_escape_href(html, node->as.literal.data, node->as.literal.len);
+  cmark_strbuf_puts(html, "\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"");
+  cmark_strbuf_puts(html, m);
+  cmark_strbuf_puts(html, "\" aria-label=\"Back to reference ");
+  cmark_strbuf_puts(html, m);
+  cmark_strbuf_puts(html, "\">↩</a>");
 
+  if (node->footnote.def_count > 1)
+  {
+    for(int i = 2; i <= node->footnote.def_count; i++) {
+      char n[32];
+      snprintf(n, sizeof(n), "%d", i);
+
+      cmark_strbuf_puts(html, " <a href=\"#fnref-");
+      houdini_escape_href(html, node->as.literal.data, node->as.literal.len);
+      cmark_strbuf_puts(html, "-");
+      cmark_strbuf_puts(html, n);
+      cmark_strbuf_puts(html, "\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"");
+      cmark_strbuf_puts(html, m);
+      cmark_strbuf_puts(html, "-");
+      cmark_strbuf_puts(html, n);
+      cmark_strbuf_puts(html, "\" aria-label=\"Back to reference ");
+      cmark_strbuf_puts(html, m);
+      cmark_strbuf_puts(html, "-");
+      cmark_strbuf_puts(html, n);
+      cmark_strbuf_puts(html, "\">↩<sup class=\"footnote-ref\">");
+      cmark_strbuf_puts(html, n);
+      cmark_strbuf_puts(html, "</sup></a>");
+    }
+  }
+
   return true;
 }
 
@@ -273,7 +301,7 @@
       } else {
         if (parent->type == CMARK_NODE_FOOTNOTE_DEFINITION && node->next == NULL) {
           cmark_strbuf_putc(html, ' ');
-          S_put_footnote_backref(renderer, html);
+          S_put_footnote_backref(renderer, html, parent);
         }
         cmark_strbuf_puts(html, "</p>\n");
       }
@@ -336,10 +364,12 @@
     break;
 
   case CMARK_NODE_STRONG:
-    if (entering) {
-      cmark_strbuf_puts(html, "<strong>");
-    } else {
-      cmark_strbuf_puts(html, "</strong>");
+    if (node->parent == NULL || node->parent->type != CMARK_NODE_STRONG) {
+      if (entering) {
+        cmark_strbuf_puts(html, "<strong>");
+      } else {
+        cmark_strbuf_puts(html, "</strong>");
+      }
     }
     break;
 
@@ -354,8 +384,8 @@
   case CMARK_NODE_LINK:
     if (entering) {
       cmark_strbuf_puts(html, "<a href=\"");
-      if (!(!(options & CMARK_OPT_UNSAFE) &&
-            scan_dangerous_url(&node->as.link.url, 0))) {
+      if ((options & CMARK_OPT_UNSAFE) ||
+            !(scan_dangerous_url(&node->as.link.url, 0))) {
         houdini_escape_href(html, node->as.link.url.data,
                             node->as.link.url.len);
       }
@@ -372,8 +402,8 @@
   case CMARK_NODE_IMAGE:
     if (entering) {
       cmark_strbuf_puts(html, "<img src=\"");
-      if (!(!(options & CMARK_OPT_UNSAFE) &&
-            scan_dangerous_url(&node->as.link.url, 0))) {
+      if ((options & CMARK_OPT_UNSAFE) ||
+            !(scan_dangerous_url(&node->as.link.url, 0))) {
         houdini_escape_href(html, node->as.link.url.data,
                             node->as.link.url.len);
       }
@@ -392,16 +422,15 @@
   case CMARK_NODE_FOOTNOTE_DEFINITION:
     if (entering) {
       if (renderer->footnote_ix == 0) {
-        cmark_strbuf_puts(html, "<section class=\"footnotes\">\n<ol>\n");
+        cmark_strbuf_puts(html, "<section class=\"footnotes\" data-footnotes>\n<ol>\n");
       }
       ++renderer->footnote_ix;
-      cmark_strbuf_puts(html, "<li id=\"fn");
-      char n[32];
-      snprintf(n, sizeof(n), "%d", renderer->footnote_ix);
-      cmark_strbuf_puts(html, n);
+
+      cmark_strbuf_puts(html, "<li id=\"fn-");
+      houdini_escape_href(html, node->as.literal.data, node->as.literal.len);
       cmark_strbuf_puts(html, "\">\n");
     } else {
-      if (S_put_footnote_backref(renderer, html)) {
+      if (S_put_footnote_backref(renderer, html, node)) {
         cmark_strbuf_putc(html, '\n');
       }
       cmark_strbuf_puts(html, "</li>\n");
@@ -410,12 +439,20 @@
 
   case CMARK_NODE_FOOTNOTE_REFERENCE:
     if (entering) {
-      cmark_strbuf_puts(html, "<sup class=\"footnote-ref\"><a href=\"#fn");
-      cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
-      cmark_strbuf_puts(html, "\" id=\"fnref");
-      cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
-      cmark_strbuf_puts(html, "\">");
-      cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
+      cmark_strbuf_puts(html, "<sup class=\"footnote-ref\"><a href=\"#fn-");
+      houdini_escape_href(html, node->parent_footnote_def->as.literal.data, node->parent_footnote_def->as.literal.len);
+      cmark_strbuf_puts(html, "\" id=\"fnref-");
+      houdini_escape_href(html, node->parent_footnote_def->as.literal.data, node->parent_footnote_def->as.literal.len);
+
+      if (node->footnote.ref_ix > 1) {
+        char n[32];
+        snprintf(n, sizeof(n), "%d", node->footnote.ref_ix);
+        cmark_strbuf_puts(html, "-");
+        cmark_strbuf_puts(html, n);
+      }
+
+      cmark_strbuf_puts(html, "\" data-footnote-ref>");
+      houdini_escape_href(html, node->as.literal.data, node->as.literal.len);
       cmark_strbuf_puts(html, "</a></sup>");
     }
     break;
diff --git a/cbits/inlines.c b/cbits/inlines.c
--- a/cbits/inlines.c
+++ b/cbits/inlines.c
@@ -35,17 +35,24 @@
 
 typedef struct bracket {
   struct bracket *previous;
-  struct delimiter *previous_delimiter;
   cmark_node *inl_text;
   bufsize_t position;
   bool image;
   bool active;
   bool bracket_after;
+  bool in_bracket_image0;
+  bool in_bracket_image1;
 } bracket;
 
+#define FLAG_SKIP_HTML_CDATA        (1u << 0)
+#define FLAG_SKIP_HTML_DECLARATION  (1u << 1)
+#define FLAG_SKIP_HTML_PI           (1u << 2)
+#define FLAG_SKIP_HTML_COMMENT      (1u << 3)
+
 typedef struct subject{
   cmark_mem *mem;
   cmark_chunk input;
+  unsigned flags;
   int line;
   bufsize_t pos;
   int block_offset;
@@ -55,6 +62,7 @@
   bracket *last_bracket;
   bufsize_t backticks[MAXBACKTICKS + 1];
   bool scanned_for_backticks;
+  bool no_link_openers;
 } subject;
 
 // Extensions may populate this.
@@ -109,6 +117,24 @@
   }
 }
 
+// Like cmark_node_append_child but without costly sanity checks.
+// Assumes that child was newly created.
+static void append_child(cmark_node *node, cmark_node *child) {
+  cmark_node *old_last_child = node->last_child;
+
+  child->next = NULL;
+  child->prev = old_last_child;
+  child->parent = node;
+  node->last_child = child;
+
+  if (old_last_child) {
+    old_last_child->next = child;
+  } else {
+    // Also set first_child if node previously had no children.
+    node->first_child = child;
+  }
+}
+
 // Duplicate a chunk by creating a copy of the buffer not by reusing the
 // buffer like cmark_chunk_dup does.
 static cmark_chunk chunk_clone(cmark_mem *mem, cmark_chunk *src) {
@@ -152,7 +178,7 @@
   link->start_line = link->end_line = subj->line;
   link->start_column = start_column + 1;
   link->end_column = end_column + 1;
-  cmark_node_append_child(link, make_str_with_entities(subj, start_column + 1, end_column - 1, &url));
+  append_child(link, make_str_with_entities(subj, start_column + 1, end_column - 1, &url));
   return link;
 }
 
@@ -161,6 +187,7 @@
   int i;
   e->mem = mem;
   e->input = *chunk;
+  e->flags = 0;
   e->line = line_number;
   e->pos = 0;
   e->block_offset = block_offset;
@@ -172,6 +199,7 @@
     e->backticks[i] = 0;
   }
   e->scanned_for_backticks = false;
+  e->no_link_openers = true;
 }
 
 static CMARK_INLINE int isbacktick(int c) { return (c == '`'); }
@@ -322,9 +350,11 @@
 }
 
 // Destructively modify string, converting newlines to
-// spaces, then removing a single leading + trailing space.
+// spaces, then removing a single leading + trailing space,
+// unless the code span consists entirely of space characters.
 static void S_normalize_code(cmark_strbuf *s) {
   bufsize_t r, w;
+  bool contains_nonspace = false;
 
   for (r = 0, w = 0; r < s->size; ++r) {
     switch (s->ptr[r]) {
@@ -339,10 +369,14 @@
     default:
       s->ptr[w++] = s->ptr[r];
     }
+    if (s->ptr[r] != ' ') {
+      contains_nonspace = true;
+    }
   }
 
   // begins and ends with space?
-  if (s->ptr[0] == ' ' && s->ptr[w - 1] == ' ') {
+  if (contains_nonspace &&
+      s->ptr[0] == ' ' && s->ptr[w - 1] == ' ') {
     cmark_strbuf_drop(s, 1);
     cmark_strbuf_truncate(s, w - 2);
   } else {
@@ -497,6 +531,7 @@
   delim->can_open = can_open;
   delim->can_close = can_close;
   delim->inl_text = inl_text;
+  delim->position = subj->pos;
   delim->length = inl_text->as.literal.len;
   delim->previous = subj->last_delim;
   delim->next = NULL;
@@ -510,15 +545,24 @@
   bracket *b = (bracket *)subj->mem->calloc(1, sizeof(bracket));
   if (subj->last_bracket != NULL) {
     subj->last_bracket->bracket_after = true;
+    b->in_bracket_image0 = subj->last_bracket->in_bracket_image0;
+    b->in_bracket_image1 = subj->last_bracket->in_bracket_image1;
   }
   b->image = image;
   b->active = true;
   b->inl_text = inl_text;
   b->previous = subj->last_bracket;
-  b->previous_delimiter = subj->last_delim;
   b->position = subj->pos;
   b->bracket_after = false;
+  if (image) {
+    b->in_bracket_image1 = true;
+  } else {
+    b->in_bracket_image0 = true;
+  }
   subj->last_bracket = b;
+  if (!image) {
+    subj->no_link_openers = false;
+  }
 }
 
 // Assumes the subject has a c at the current position.
@@ -625,13 +669,13 @@
   return NULL;
 }
 
-static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *stack_bottom) {
-  delimiter *closer = subj->last_delim;
+static void process_emphasis(cmark_parser *parser, subject *subj, bufsize_t stack_bottom) {
+  delimiter *candidate;
+  delimiter *closer = NULL;
   delimiter *opener;
   delimiter *old_closer;
   bool opener_found;
-  bool odd_match;
-  delimiter *openers_bottom[3][128];
+  bufsize_t openers_bottom[3][128];
   int i;
 
   // initialize openers_bottom:
@@ -644,8 +688,10 @@
   }
 
   // move back to first relevant delim.
-  while (closer != NULL && closer->previous != stack_bottom) {
-    closer = closer->previous;
+  candidate = subj->last_delim;
+  while (candidate != NULL && candidate->position >= stack_bottom) {
+    closer = candidate;
+    candidate = candidate->previous;
   }
 
   // now move forward, looking for closers, and handling each
@@ -655,15 +701,14 @@
       // Now look backwards for first matching opener:
       opener = closer->previous;
       opener_found = false;
-      odd_match = false;
-      while (opener != NULL && opener != stack_bottom &&
-             opener != openers_bottom[closer->length % 3][closer->delim_char]) {
+      while (opener != NULL && opener->position >= stack_bottom &&
+             opener->position >= openers_bottom[closer->length % 3][closer->delim_char]) {
         if (opener->can_open && opener->delim_char == closer->delim_char) {
           // interior closer of size 2 can't match opener of size 1
           // or of size 1 can't match 2
-          odd_match = (closer->can_open || opener->can_close) &&
-                      ((opener->length + closer->length) % 3 == 0);
-          if (!odd_match) {
+          if (!(closer->can_open || opener->can_close) ||
+	      closer->length % 3 == 0 ||
+              (opener->length + closer->length) % 3 != 0) {
             opener_found = true;
             break;
           }
@@ -683,27 +728,29 @@
         } else {
           closer = closer->next;
         }
-      } else if (closer->delim_char == '\'') {
+      } else if (closer->delim_char == '\'' || closer->delim_char == '"') {
         cmark_chunk_free(subj->mem, &closer->inl_text->as.literal);
-        closer->inl_text->as.literal = cmark_chunk_literal(RIGHTSINGLEQUOTE);
-        if (opener_found) {
-          cmark_chunk_free(subj->mem, &opener->inl_text->as.literal);
-          opener->inl_text->as.literal = cmark_chunk_literal(LEFTSINGLEQUOTE);
+        if (closer->delim_char == '\'') {
+          closer->inl_text->as.literal = cmark_chunk_literal(RIGHTSINGLEQUOTE);
+        } else {
+          closer->inl_text->as.literal = cmark_chunk_literal(RIGHTDOUBLEQUOTE);
         }
         closer = closer->next;
-      } else if (closer->delim_char == '"') {
-        cmark_chunk_free(subj->mem, &closer->inl_text->as.literal);
-        closer->inl_text->as.literal = cmark_chunk_literal(RIGHTDOUBLEQUOTE);
         if (opener_found) {
           cmark_chunk_free(subj->mem, &opener->inl_text->as.literal);
-          opener->inl_text->as.literal = cmark_chunk_literal(LEFTDOUBLEQUOTE);
+          if (old_closer->delim_char == '\'') {
+            opener->inl_text->as.literal = cmark_chunk_literal(LEFTSINGLEQUOTE);
+          } else {
+            opener->inl_text->as.literal = cmark_chunk_literal(LEFTDOUBLEQUOTE);
+          }
+          remove_delimiter(subj, opener);
+          remove_delimiter(subj, old_closer);
         }
-        closer = closer->next;
       }
       if (!opener_found) {
         // set lower bound for future searches for openers
         openers_bottom[old_closer->length % 3][old_closer->delim_char] =
-		old_closer->previous;
+		old_closer->position;
         if (!old_closer->can_open) {
           // we can remove a closer that can't be an
           // opener, once we've seen there's no
@@ -716,7 +763,8 @@
     }
   }
   // free all delimiters in list until stack_bottom:
-  while (subj->last_delim != NULL && subj->last_delim != stack_bottom) {
+  while (subj->last_delim != NULL &&
+         subj->last_delim->position >= stack_bottom) {
     remove_delimiter(subj, subj->last_delim);
   }
 }
@@ -755,7 +803,8 @@
   tmp = opener_inl->next;
   while (tmp && tmp != closer_inl) {
     tmpnext = tmp->next;
-    cmark_node_append_child(emph, tmp);
+    cmark_node_unlink(tmp);
+    append_child(emph, tmp);
     tmp = tmpnext;
   }
   cmark_node_insert_after(opener_inl, emph);
@@ -886,7 +935,63 @@
   }
 
   // finally, try to match an html tag
-  matchlen = scan_html_tag(&subj->input, subj->pos);
+  if (subj->pos + 2 <= subj->input.len) {
+    int c = subj->input.data[subj->pos];
+    if (c == '!' && (subj->flags & FLAG_SKIP_HTML_COMMENT) == 0) {
+      c = subj->input.data[subj->pos+1];
+      if (c == '-' && subj->input.data[subj->pos+2] == '-') {
+        if (subj->input.data[subj->pos+3] == '>') {
+          matchlen = 4;
+        } else if (subj->input.data[subj->pos+3] == '-' &&
+                   subj->input.data[subj->pos+4] == '>') {
+          matchlen = 5;
+        } else {
+          matchlen = scan_html_comment(&subj->input, subj->pos + 1);
+          if (matchlen > 0) {
+            matchlen += 1; // prefix "<"
+          } else { // no match through end of input: set a flag so
+                   // we don't reparse looking for -->:
+            subj->flags |= FLAG_SKIP_HTML_COMMENT;
+          }
+        }
+      } else if (c == '[') {
+        if ((subj->flags & FLAG_SKIP_HTML_CDATA) == 0) {
+          matchlen = scan_html_cdata(&subj->input, subj->pos + 2);
+          if (matchlen > 0) {
+            // The regex doesn't require the final "]]>". But if we're not at
+            // the end of input, it must come after the match. Otherwise,
+            // disable subsequent scans to avoid quadratic behavior.
+            matchlen += 5; // prefix "![", suffix "]]>"
+            if (subj->pos + matchlen > subj->input.len) {
+              subj->flags |= FLAG_SKIP_HTML_CDATA;
+              matchlen = 0;
+            }
+          }
+        }
+      } else if ((subj->flags & FLAG_SKIP_HTML_DECLARATION) == 0) {
+        matchlen = scan_html_declaration(&subj->input, subj->pos + 1);
+        if (matchlen > 0) {
+          matchlen += 2; // prefix "!", suffix ">"
+          if (subj->pos + matchlen > subj->input.len) {
+            subj->flags |= FLAG_SKIP_HTML_DECLARATION;
+            matchlen = 0;
+          }
+        }
+      }
+    } else if (c == '?') {
+      if ((subj->flags & FLAG_SKIP_HTML_PI) == 0) {
+        // Note that we allow an empty match.
+        matchlen = scan_html_pi(&subj->input, subj->pos + 1);
+        matchlen += 3; // prefix "?", suffix "?>"
+        if (subj->pos + matchlen > subj->input.len) {
+          subj->flags |= FLAG_SKIP_HTML_PI;
+          matchlen = 0;
+        }
+      }
+    } else {
+      matchlen = scan_html_tag(&subj->input, subj->pos);
+    }
+  }
   if (matchlen > 0) {
     contents = cmark_chunk_dup(&subj->input, subj->pos - 1, matchlen + 1);
     subj->pos += matchlen;
@@ -969,17 +1074,21 @@
     else if (input->data[i] == '(') {
       ++nb_p;
       ++i;
-        if (nb_p > 32)
-          return -1;
+      if (nb_p > 32)
+        return -1;
     } else if (input->data[i] == ')') {
       if (nb_p == 0)
         break;
       --nb_p;
       ++i;
-    } else if (cmark_isspace(input->data[i]))
+    } else if (cmark_isspace(input->data[i])) {
+      if (i == offset) {
+        return -1;
+      }
       break;
-    else
+    } else {
       ++i;
+    }
   }
 
   if (i >= input->len)
@@ -1005,7 +1114,7 @@
       } else if (input->data[i] == '\\')
         i += 2;
       else if (input->data[i] == '\n' || input->data[i] == '<')
-        return manual_scan_link_url_2(input, offset, output);
+        return -1;
       else
         ++i;
     }
@@ -1048,16 +1157,16 @@
     return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("]"));
   }
 
-  if (!opener->active) {
+  // If we got here, we matched a potential link/image text.
+  // Now we check to see if it's a link/image.
+  is_image = opener->image;
+
+  if (!is_image && subj->no_link_openers) {
     // take delimiter off stack
     pop_bracket(subj);
     return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("]"));
   }
 
-  // If we got here, we matched a potential link/image text.
-  // Now we check to see if it's a link/image.
-  is_image = opener->image;
-
   after_link_text_pos = subj->pos;
 
   // First, look for an inline link.
@@ -1129,19 +1238,77 @@
   // What if we're a footnote link?
   if (parser->options & CMARK_OPT_FOOTNOTES &&
       opener->inl_text->next &&
-      opener->inl_text->next->type == CMARK_NODE_TEXT &&
-      !opener->inl_text->next->next) {
+      opener->inl_text->next->type == CMARK_NODE_TEXT) {
+
     cmark_chunk *literal = &opener->inl_text->next->as.literal;
-    if (literal->len > 1 && literal->data[0] == '^') {
-      inl = make_simple(subj->mem, CMARK_NODE_FOOTNOTE_REFERENCE);
-      inl->as.literal = cmark_chunk_dup(literal, 1, literal->len - 1);
-      inl->start_line = inl->end_line = subj->line;
-      inl->start_column = opener->inl_text->start_column;
-      inl->end_column = subj->pos + subj->column_offset + subj->block_offset;
-      cmark_node_insert_before(opener->inl_text, inl);
-      cmark_node_free(opener->inl_text->next);
+
+    // look back to the opening '[', and skip ahead to the next character
+    // if we're looking at a '[^' sequence, and there is other text or nodes
+    // after the ^, let's call it a footnote reference.
+    if ((literal->len > 0 && literal->data[0] == '^') && (literal->len > 1 || opener->inl_text->next->next)) {
+
+      // Before we got this far, the `handle_close_bracket` function may have
+      // advanced the current state beyond our footnote's actual closing
+      // bracket, ie if it went looking for a `link_label`.
+      // Let's just rewind the subject's position:
+      subj->pos = initial_pos;
+
+      cmark_node *fnref = make_simple(subj->mem, CMARK_NODE_FOOTNOTE_REFERENCE);
+
+      // the start and end of the footnote ref is the opening and closing brace
+      // i.e. the subject's current position, and the opener's start_column
+      int fnref_end_column = subj->pos + subj->column_offset + subj->block_offset;
+      int fnref_start_column = opener->inl_text->start_column;
+
+      // any given node delineates a substring of the line being processed,
+      // with the remainder of the line being pointed to thru its 'literal'
+      // struct member.
+      // here, we copy the literal's pointer, moving it past the '^' character
+      // for a length equal to the size of footnote reference text.
+      // i.e. end_col minus start_col, minus the [ and the ^ characters
+      //
+      // this copies the footnote reference string, even if between the
+      // `opener` and the subject's current position there are other nodes
+      //
+      // (first, check for underflows)
+      if ((fnref_start_column + 2) <= fnref_end_column) {
+        fnref->as.literal = cmark_chunk_dup(literal, 1, (fnref_end_column - fnref_start_column) - 2);
+      } else {
+        fnref->as.literal = cmark_chunk_dup(literal, 1, 0);
+      }
+
+      fnref->start_line = fnref->end_line = subj->line;
+      fnref->start_column = fnref_start_column;
+      fnref->end_column = fnref_end_column;
+
+      // we then replace the opener with this new fnref node, the net effect
+      // being replacing the opening '[' text node with a `^footnote-ref]` node.
+      cmark_node_insert_before(opener->inl_text, fnref);
+
+      process_emphasis(parser, subj, opener->position);
+      // sometimes, the footnote reference text gets parsed into multiple nodes
+      // i.e. '[^example]' parsed into '[', '^exam', 'ple]'.
+      // this happens for ex with the autolink extension. when the autolinker
+      // finds the 'w' character, it will split the text into multiple nodes
+      // in hopes of being able to match a 'www.' substring.
+      //
+      // because this function is called one character at a time via the
+      // `parse_inlines` function, and the current subj->pos is pointing at the
+      // closing ] brace, and because we copy all the text between the [ ]
+      // braces, we should be able to safely ignore and delete any nodes after
+      // the opener->inl_text->next.
+      //
+      // therefore, here we walk thru the list and free them all up
+      cmark_node *next_node;
+      cmark_node *current_node = opener->inl_text->next;
+      while(current_node) {
+        next_node = current_node->next;
+        cmark_node_free(current_node);
+        current_node = next_node;
+      }
+
       cmark_node_free(opener->inl_text);
-      process_emphasis(parser, subj, opener->previous_delimiter);
+
       pop_bracket(subj);
       return NULL;
     }
@@ -1163,31 +1330,22 @@
   tmp = opener->inl_text->next;
   while (tmp) {
     tmpnext = tmp->next;
-    cmark_node_append_child(inl, tmp);
+    cmark_node_unlink(tmp);
+    append_child(inl, tmp);
     tmp = tmpnext;
   }
 
   // Free the bracket [:
   cmark_node_free(opener->inl_text);
 
-  process_emphasis(parser, subj, opener->previous_delimiter);
+  process_emphasis(parser, subj, opener->position);
   pop_bracket(subj);
 
-  // Now, if we have a link, we also want to deactivate earlier link
-  // delimiters. (This code can be removed if we decide to allow links
+  // Now, if we have a link, we also want to deactivate links until
+  // we get a new opener. (This code can be removed if we decide to allow links
   // inside links.)
   if (!is_image) {
-    opener = subj->last_bracket;
-    while (opener != NULL) {
-      if (!opener->image) {
-        if (!opener->active) {
-          break;
-        } else {
-          opener->active = false;
-        }
-      }
-      opener = opener->previous;
-    }
+    subj->no_link_openers = true;
   }
 
   return NULL;
@@ -1365,7 +1523,7 @@
     new_inl = make_str(subj, startpos, endpos - 1, contents);
   }
   if (new_inl != NULL) {
-    cmark_node_append_child(parent, new_inl);
+    append_child(parent, new_inl);
   }
 
   return 1;
@@ -1384,7 +1542,7 @@
   while (!is_eof(&subj) && parse_inline(parser, &subj, parent, options))
     ;
 
-  process_emphasis(parser, &subj, NULL);
+  process_emphasis(parser, &subj, 0);
   // free bracket and delim stack
   while (subj.last_delim) {
     remove_delimiter(&subj, subj.last_delim);
@@ -1432,8 +1590,7 @@
 
   // parse link url:
   spnl(&subj);
-  if ((matchlen = manual_scan_link_url(&subj.input, subj.pos, &url)) > -1 &&
-      url.len > 0) {
+  if ((matchlen = manual_scan_link_url(&subj.input, subj.pos, &url)) > -1) {
     subj.pos += matchlen;
   } else {
     return 0;
@@ -1597,10 +1754,15 @@
 }
 
 int cmark_inline_parser_in_bracket(cmark_inline_parser *parser, int image) {
-  for (bracket *b = parser->last_bracket; b; b = b->previous)
-    if (b->active && b->image == (image != 0))
-      return 1;
-  return 0;
+  bracket *b = parser->last_bracket;
+  if (!b) {
+    return 0;
+  }
+  if (image != 0) {
+    return b->in_bracket_image1;
+  } else {
+    return b->in_bracket_image0;
+  }
 }
 
 void cmark_node_unput(cmark_node *node, int n) {
diff --git a/cbits/iterator.h b/cbits/iterator.h
--- a/cbits/iterator.h
+++ b/cbits/iterator.h
@@ -6,7 +6,6 @@
 #endif
 
 #include "cmark-gfm.h"
-#include "memory.h"
 
 typedef struct {
   cmark_event_type ev_type;
diff --git a/cbits/latex.c b/cbits/latex.c
--- a/cbits/latex.c
+++ b/cbits/latex.c
@@ -385,10 +385,12 @@
     break;
 
   case CMARK_NODE_STRONG:
-    if (entering) {
-      LIT("\\textbf{");
-    } else {
-      LIT("}");
+    if (node->parent == NULL || node->parent->type != CMARK_NODE_STRONG) {
+      if (entering) {
+        LIT("\\textbf{");
+      } else {
+        LIT("}");
+      }
     }
     break;
 
diff --git a/cbits/man.c b/cbits/man.c
--- a/cbits/man.c
+++ b/cbits/man.c
@@ -74,7 +74,6 @@
 
 static int S_render_node(cmark_renderer *renderer, cmark_node *node,
                          cmark_event_type ev_type, int options) {
-  cmark_node *tmp;
   int list_number;
   bool entering = (ev_type == CMARK_EVENT_ENTER);
   bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options);
@@ -123,12 +122,7 @@
       if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
         LIT("\\[bu] 2");
       } else {
-        list_number = cmark_node_get_list_start(node->parent);
-        tmp = node;
-        while (tmp->prev) {
-          tmp = tmp->prev;
-          list_number += 1;
-        }
+        list_number = cmark_node_get_item_index(node);
         char list_number_s[LIST_NUMBER_SIZE];
         snprintf(list_number_s, LIST_NUMBER_SIZE, "\"%d.\" 4", list_number);
         LIT(list_number_s);
@@ -225,10 +219,12 @@
     break;
 
   case CMARK_NODE_STRONG:
-    if (entering) {
-      LIT("\\f[B]");
-    } else {
-      LIT("\\f[]");
+    if (node->parent == NULL || node->parent->type != CMARK_NODE_STRONG) {
+      if (entering) {
+        LIT("\\f[B]");
+      } else {
+        LIT("\\f[]");
+      }
     }
     break;
 
diff --git a/cbits/map.c b/cbits/map.c
--- a/cbits/map.c
+++ b/cbits/map.c
@@ -51,7 +51,7 @@
 }
 
 static void sort_map(cmark_map *map) {
-  unsigned int i = 0, last = 0, size = map->size;
+  size_t i = 0, last = 0, size = map->size;
   cmark_map_entry *r = map->refs, **sorted = NULL;
 
   sorted = (cmark_map_entry **)map->mem->calloc(size, sizeof(cmark_map_entry *));
@@ -73,6 +73,7 @@
 
 cmark_map_entry *cmark_map_lookup(cmark_map *map, cmark_chunk *label) {
   cmark_map_entry **ref = NULL;
+  cmark_map_entry *r = NULL;
   unsigned char *norm;
 
   if (label->len < 1 || label->len > MAX_LINK_LABEL_LENGTH)
@@ -91,10 +92,15 @@
   ref = (cmark_map_entry **)bsearch(norm, map->sorted, map->size, sizeof(cmark_map_entry *), refsearch);
   map->mem->free(norm);
 
-  if (!ref)
-    return NULL;
+  if (ref != NULL) {
+    r = ref[0];
+    /* Check for expansion limit */
+    if (r->size > map->max_ref_size - map->ref_size)
+      return NULL;
+    map->ref_size += r->size;
+  }
 
-  return ref[0];
+  return r;
 }
 
 void cmark_map_free(cmark_map *map) {
@@ -118,5 +124,6 @@
   cmark_map *map = (cmark_map *)mem->calloc(1, sizeof(cmark_map));
   map->mem = mem;
   map->free = free;
+  map->max_ref_size = UINT_MAX;
   return map;
 }
diff --git a/cbits/map.h b/cbits/map.h
--- a/cbits/map.h
+++ b/cbits/map.h
@@ -1,7 +1,6 @@
 #ifndef CMARK_MAP_H
 #define CMARK_MAP_H
 
-#include "memory.h"
 #include "chunk.h"
 
 #ifdef __cplusplus
@@ -11,7 +10,8 @@
 struct cmark_map_entry {
   struct cmark_map_entry *next;
   unsigned char *label;
-  unsigned int age;
+  size_t age;
+  size_t size;
 };
 
 typedef struct cmark_map_entry cmark_map_entry;
@@ -24,7 +24,9 @@
   cmark_mem *mem;
   cmark_map_entry *refs;
   cmark_map_entry **sorted;
-  unsigned int size;
+  size_t size;
+  size_t ref_size;
+  size_t max_ref_size;
   cmark_map_free_f free;
 };
 
diff --git a/cbits/node.c b/cbits/node.c
--- a/cbits/node.c
+++ b/cbits/node.c
@@ -5,10 +5,42 @@
 #include "node.h"
 #include "syntax_extension.h"
 
+/**
+ * Expensive safety checks are off by default, but can be enabled
+ * by calling cmark_enable_safety_checks().
+ */
+static bool enable_safety_checks = false;
+
+void cmark_enable_safety_checks(bool enable) {
+  enable_safety_checks = enable;
+}
+
 static void S_node_unlink(cmark_node *node);
 
 #define NODE_MEM(node) cmark_node_mem(node)
 
+void cmark_register_node_flag(cmark_node_internal_flags *flags) {
+  static cmark_node_internal_flags nextflag = CMARK_NODE__REGISTER_FIRST;
+
+  // flags should be a pointer to a global variable and this function
+  // should only be called once to initialize its value.
+  if (*flags) {
+    fprintf(stderr, "flag initialization error in cmark_register_node_flag\n");
+    abort();
+  }
+
+  // Check that we haven't run out of bits.
+  if (nextflag == 0) {
+    fprintf(stderr, "too many flags in cmark_register_node_flag\n");
+    abort();
+  }
+
+  *flags = nextflag;
+  nextflag <<= 1;
+}
+
+void cmark_init_standard_node_flags(void) {}
+
 bool cmark_node_can_contain_type(cmark_node *node, cmark_node_type child_type) {
   if (child_type == CMARK_NODE_DOCUMENT) {
       return false;
@@ -48,8 +80,6 @@
 }
 
 static bool S_can_contain(cmark_node *node, cmark_node *child) {
-  cmark_node *cur;
-
   if (node == NULL || child == NULL) {
     return false;
   }
@@ -57,14 +87,16 @@
     return 0;
   }
 
-  // Verify that child is not an ancestor of node or equal to node.
-  cur = node;
-  do {
-    if (cur == child) {
-      return false;
-    }
-    cur = cur->parent;
-  } while (cur != NULL);
+  if (enable_safety_checks) {
+    // Verify that child is not an ancestor of node or equal to node.
+    cmark_node *cur = node;
+    do {
+      if (cur == child) {
+        return false;
+      }
+      cur = cur->parent;
+    } while (cur != NULL);
+  }
 
   return cmark_node_can_contain_type(node, (cmark_node_type) child->type);
 }
@@ -301,6 +333,14 @@
   }
 }
 
+cmark_node *cmark_node_parent_footnote_def(cmark_node *node) {
+  if (node == NULL) {
+    return NULL;
+  } else {
+    return node->parent_footnote_def;
+  }
+}
+
 void *cmark_node_get_user_data(cmark_node *node) {
   if (node == NULL) {
     return NULL;
@@ -337,6 +377,7 @@
   case CMARK_NODE_HTML_INLINE:
   case CMARK_NODE_CODE:
   case CMARK_NODE_FOOTNOTE_REFERENCE:
+  case CMARK_NODE_FOOTNOTE_DEFINITION:
     return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.literal);
 
   case CMARK_NODE_CODE_BLOCK:
@@ -518,6 +559,31 @@
 
   if (node->type == CMARK_NODE_LIST) {
     node->as.list.tight = tight == 1;
+    return 1;
+  } else {
+    return 0;
+  }
+}
+
+int cmark_node_get_item_index(cmark_node *node) {
+  if (node == NULL) {
+    return 0;
+  }
+
+  if (node->type == CMARK_NODE_ITEM) {
+    return node->as.list.start;
+  } else {
+    return 0;
+  }
+}
+
+int cmark_node_set_item_index(cmark_node *node, int idx) {
+  if (node == NULL || idx < 0) {
+    return 0;
+  }
+
+  if (node->type == CMARK_NODE_ITEM) {
+    node->as.list.start = idx;
     return 1;
   } else {
     return 0;
diff --git a/cbits/node.h b/cbits/node.h
--- a/cbits/node.h
+++ b/cbits/node.h
@@ -21,6 +21,7 @@
   cmark_delim_type delimiter;
   unsigned char bullet_char;
   bool tight;
+  bool checked; // For task list extension
 } cmark_list;
 
 typedef struct {
@@ -50,8 +51,15 @@
 enum cmark_node__internal_flags {
   CMARK_NODE__OPEN = (1 << 0),
   CMARK_NODE__LAST_LINE_BLANK = (1 << 1),
+  CMARK_NODE__LAST_LINE_CHECKED = (1 << 2),
+
+  // Extensions can register custom flags by calling `cmark_register_node_flag`.
+  // This is the starting value for the custom flags.
+  CMARK_NODE__REGISTER_FIRST = (1 << 3),
 };
 
+typedef uint16_t cmark_node_internal_flags;
+
 struct cmark_node {
   cmark_strbuf content;
 
@@ -70,11 +78,26 @@
   int end_column;
   int internal_offset;
   uint16_t type;
-  uint16_t flags;
+  cmark_node_internal_flags flags;
 
   cmark_syntax_extension *extension;
 
+  /**
+   * Used during cmark_render() to cache the most recent non-NULL
+   * extension, if you go up the parent chain like this:
+   *
+   * node->parent->...parent->extension
+   */
+  cmark_syntax_extension *ancestor_extension;
+
   union {
+    int ref_ix;
+    int def_count;
+  } footnote;
+
+  cmark_node *parent_footnote_def;
+
+  union {
     cmark_chunk literal;
     cmark_list list;
     cmark_code code;
@@ -82,10 +105,31 @@
     cmark_link link;
     cmark_custom custom;
     int html_block_type;
+    int cell_index; // For keeping track of TABLE_CELL table alignments
     void *opaque;
   } as;
 };
 
+/**
+ * Syntax extensions can use this function to register a custom node
+ * flag. The flags are stored in the `flags` field of the `cmark_node`
+ * struct. The `flags` parameter should be the address of a global variable
+ * which will store the flag value.
+ */
+CMARK_GFM_EXPORT
+void cmark_register_node_flag(cmark_node_internal_flags *flags);
+
+/**
+ * DEPRECATED.
+ *
+ * This function was added in cmark-gfm version 0.29.0.gfm.7, and was
+ * required to be called at program start time, which caused
+ * backwards-compatibility issues in applications that use cmark-gfm as a
+ * library. It is now a no-op.
+ */
+CMARK_GFM_EXPORT
+void cmark_init_standard_node_flags(void);
+
 static CMARK_INLINE cmark_mem *cmark_node_mem(cmark_node *node) {
   return node->content.mem;
 }
@@ -108,6 +152,13 @@
 }
 
 CMARK_GFM_EXPORT bool cmark_node_can_contain_type(cmark_node *node, cmark_node_type child_type);
+
+/**
+ * Enable (or disable) extra safety checks. These extra checks cause
+ * extra performance overhead (in some cases quadratic), so they are only
+ * intended to be used during testing.
+ */
+CMARK_GFM_EXPORT void cmark_enable_safety_checks(bool enable);
 
 #ifdef __cplusplus
 }
diff --git a/cbits/parser.h b/cbits/parser.h
--- a/cbits/parser.h
+++ b/cbits/parser.h
@@ -2,9 +2,9 @@
 #define CMARK_PARSER_H
 
 #include <stdio.h>
+#include "references.h"
 #include "node.h"
 #include "buffer.h"
-#include "memory.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -30,6 +30,7 @@
   bufsize_t first_nonspace;
   /* See the documentation for cmark_parser_get_first_nonspace_column() in cmark.h */
   bufsize_t first_nonspace_column;
+  bufsize_t thematic_break_kill_pos;
   /* See the documentation for cmark_parser_get_indent() in cmark.h */
   int indent;
   /* See the documentation for cmark_parser_is_blank() in cmark.h */
@@ -45,6 +46,7 @@
   /* Options set by the user, see the Options section in cmark.h */
   int options;
   bool last_buffer_ended_with_cr;
+  size_t total_size;
   cmark_llist *syntax_extensions;
   cmark_llist *inline_syntax_extensions;
   cmark_ispunct_func backslash_ispunct;
diff --git a/cbits/plaintext.c b/cbits/plaintext.c
--- a/cbits/plaintext.c
+++ b/cbits/plaintext.c
@@ -16,23 +16,8 @@
   cmark_render_code_point(renderer, c);
 }
 
-// if node is a block node, returns node.
-// otherwise returns first block-level node that is an ancestor of node.
-// if there is no block-level ancestor, returns NULL.
-static cmark_node *get_containing_block(cmark_node *node) {
-  while (node) {
-    if (CMARK_NODE_BLOCK_P(node)) {
-      return node;
-    } else {
-      node = node->parent;
-    }
-  }
-  return NULL;
-}
-
 static int S_render_node(cmark_renderer *renderer, cmark_node *node,
                          cmark_event_type ev_type, int options) {
-  cmark_node *tmp;
   int list_number;
   cmark_delim_type list_delim;
   int i;
@@ -46,14 +31,17 @@
   // Don't adjust tight list status til we've started the list.
   // Otherwise we loose the blank line between a paragraph and
   // a following list.
-  if (!(node->type == CMARK_NODE_ITEM && node->prev == NULL && entering)) {
-    tmp = get_containing_block(node);
-    renderer->in_tight_list_item =
-        tmp && // tmp might be NULL if there is no containing block
-        ((tmp->type == CMARK_NODE_ITEM &&
-          cmark_node_get_list_tight(tmp->parent)) ||
-         (tmp && tmp->parent && tmp->parent->type == CMARK_NODE_ITEM &&
-          cmark_node_get_list_tight(tmp->parent->parent)));
+  if (entering) {
+    if (node->parent && node->parent->type == CMARK_NODE_ITEM) {
+      renderer->in_tight_list_item = node->parent->parent->as.list.tight;
+    }
+  } else {
+    if (node->type == CMARK_NODE_LIST) {
+      renderer->in_tight_list_item =
+        node->parent &&
+        node->parent->type == CMARK_NODE_ITEM &&
+        node->parent->parent->as.list.tight;
+    }
   }
 
   if (node->extension && node->extension->plaintext_render_func) {
@@ -79,13 +67,8 @@
     if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
       marker_width = 4;
     } else {
-      list_number = cmark_node_get_list_start(node->parent);
+      list_number = cmark_node_get_item_index(node);
       list_delim = cmark_node_get_list_delim(node->parent);
-      tmp = node;
-      while (tmp->prev) {
-        tmp = tmp->prev;
-        list_number += 1;
-      }
       // we ensure a width of at least 4 so
       // we get nice transition from single digits
       // to double
diff --git a/cbits/references.c b/cbits/references.c
--- a/cbits/references.c
+++ b/cbits/references.c
@@ -32,6 +32,7 @@
   ref->title = cmark_clean_title(map->mem, title);
   ref->entry.age = map->size;
   ref->entry.next = map->refs;
+  ref->entry.size = ref->url.len + ref->title.len;
 
   map->refs = (cmark_map_entry *)ref;
   map->size++;
diff --git a/cbits/render.c b/cbits/render.c
--- a/cbits/render.c
+++ b/cbits/render.c
@@ -31,13 +31,7 @@
   cmark_chunk remainder = cmark_chunk_literal("");
   int k = renderer->buffer->size - 1;
 
-  cmark_syntax_extension *ext = NULL;
-  cmark_node *n = node;
-  while (n && !ext) {
-    ext = n->extension;
-    if (!ext)
-      n = n->parent;
-  }
+  cmark_syntax_extension *ext = node->ancestor_extension;
   if (ext && !ext->commonmark_escape_func)
     ext = NULL;
 
@@ -98,21 +92,23 @@
         }
       }
 
-    } else if (c == 10) {
-      cmark_strbuf_putc(renderer->buffer, '\n');
-      renderer->column = 0;
-      renderer->begin_line = true;
-      renderer->begin_content = true;
-      renderer->last_breakable = 0;
     } else if (escape == LITERAL) {
-      cmark_render_code_point(renderer, c);
-      renderer->begin_line = false;
-      // we don't set 'begin_content' to false til we've
-      // finished parsing a digit.  Reason:  in commonmark
-      // we need to escape a potential list marker after
-      // a digit:
-      renderer->begin_content =
-          renderer->begin_content && cmark_isdigit((char)c) == 1;
+      if (c == 10) {
+        cmark_strbuf_putc(renderer->buffer, '\n');
+        renderer->column = 0;
+        renderer->begin_line = true;
+        renderer->begin_content = true;
+        renderer->last_breakable = 0;
+      } else {
+        cmark_render_code_point(renderer, c);
+        renderer->begin_line = false;
+        // we don't set 'begin_content' to false til we've
+        // finished parsing a digit.  Reason:  in commonmark
+        // we need to escape a potential list marker after
+        // a digit:
+        renderer->begin_content =
+            renderer->begin_content && cmark_isdigit((char)c) == 1;
+      }
     } else {
       (renderer->outc)(renderer, node, escape, c, nextc);
       renderer->begin_line = false;
@@ -180,6 +176,20 @@
 
   while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
     cur = cmark_iter_get_node(iter);
+    if (cur->extension) {
+      cur->ancestor_extension = cur->extension;
+    } else if (cur->parent) {
+      cur->ancestor_extension = cur->parent->ancestor_extension;
+    }
+    if (cur->type == CMARK_NODE_ITEM) {
+      // Calculate the list item's index, for the benefit of output formats
+      // like commonmark and plaintext.
+      if (cur->prev) {
+        cmark_node_set_item_index(cur, 1 + cmark_node_get_item_index(cur->prev));
+      } else {
+        cmark_node_set_item_index(cur, cmark_node_get_list_start(cur->parent));
+      }
+    }
     if (!render_node(&renderer, cur, ev_type, options)) {
       // a false value causes us to skip processing
       // the node's contents.  this is used for
diff --git a/cbits/render.h b/cbits/render.h
--- a/cbits/render.h
+++ b/cbits/render.h
@@ -8,7 +8,6 @@
 #include <stdlib.h>
 #include "buffer.h"
 #include "chunk.h"
-#include "memory.h"
 
 typedef enum { LITERAL, NORMAL, TITLE, URL } cmark_escaping;
 
diff --git a/cbits/scanners.c b/cbits/scanners.c
--- a/cbits/scanners.c
+++ b/cbits/scanners.c
@@ -1,10694 +1,14056 @@
-/* Generated by re2c 1.1.1 */
-#include <stdlib.h>
-#include "chunk.h"
-#include "scanners.h"
-
-bufsize_t _scan_at(bufsize_t (*scanner)(const unsigned char *), cmark_chunk *c, bufsize_t offset)
-{
-	bufsize_t res;
-	unsigned char *ptr = (unsigned char *)c->data;
-
-        if (ptr == NULL || offset > c->len) {
-          return 0;
-        } else {
-	  unsigned char lim = ptr[c->len];
-
-	  ptr[c->len] = '\0';
-	  res = scanner(ptr + offset);
-	  ptr[c->len] = lim;
-        }
-
-	return res;
-}
-
-
-
-// Try to match a scheme including colon.
-bufsize_t _scan_scheme(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	yych = *p;
-	if (yych <= '@') goto yy2;
-	if (yych <= 'Z') goto yy4;
-	if (yych <= '`') goto yy2;
-	if (yych <= 'z') goto yy4;
-yy2:
-	++p;
-yy3:
-	{ return 0; }
-yy4:
-	yych = *(marker = ++p);
-	if (yych <= '/') {
-		if (yych <= '+') {
-			if (yych <= '*') goto yy3;
-		} else {
-			if (yych <= ',') goto yy3;
-			if (yych >= '/') goto yy3;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '9') goto yy5;
-			if (yych <= '@') goto yy3;
-		} else {
-			if (yych <= '`') goto yy3;
-			if (yych >= '{') goto yy3;
-		}
-	}
-yy5:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych == '+') goto yy7;
-		} else {
-			if (yych != '/') goto yy7;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych >= 'A') goto yy7;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych <= 'z') goto yy7;
-		}
-	}
-yy6:
-	p = marker;
-	goto yy3;
-yy7:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych == '+') goto yy10;
-			goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-			goto yy10;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-			goto yy10;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych <= 'z') goto yy10;
-			goto yy6;
-		}
-	}
-yy8:
-	++p;
-	{ return (bufsize_t)(p - start); }
-yy10:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy6;
-		} else {
-			if (yych == '/') goto yy6;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy8;
-			if (yych <= '@') goto yy6;
-		} else {
-			if (yych <= '`') goto yy6;
-			if (yych >= '{') goto yy6;
-		}
-	}
-	yych = *++p;
-	if (yych == ':') goto yy8;
-	goto yy6;
-}
-
-}
-
-// Try to match URI autolink after first <, returning number of chars matched.
-bufsize_t _scan_autolink_uri(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128,   0, 128,   0, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych <= '@') goto yy41;
-	if (yych <= 'Z') goto yy43;
-	if (yych <= '`') goto yy41;
-	if (yych <= 'z') goto yy43;
-yy41:
-	++p;
-yy42:
-	{ return 0; }
-yy43:
-	yych = *(marker = ++p);
-	if (yych <= '/') {
-		if (yych <= '+') {
-			if (yych <= '*') goto yy42;
-		} else {
-			if (yych <= ',') goto yy42;
-			if (yych >= '/') goto yy42;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '9') goto yy44;
-			if (yych <= '@') goto yy42;
-		} else {
-			if (yych <= '`') goto yy42;
-			if (yych >= '{') goto yy42;
-		}
-	}
-yy44:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych == '+') goto yy46;
-		} else {
-			if (yych != '/') goto yy46;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych >= 'A') goto yy46;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych <= 'z') goto yy46;
-		}
-	}
-yy45:
-	p = marker;
-	goto yy42;
-yy46:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych == '+') goto yy49;
-			goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-			goto yy49;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-			goto yy49;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych <= 'z') goto yy49;
-			goto yy45;
-		}
-	}
-yy47:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy47;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '<') goto yy45;
-			if (yych <= '>') goto yy50;
-			goto yy45;
-		} else {
-			if (yych <= 0xDF) goto yy52;
-			if (yych <= 0xE0) goto yy53;
-			goto yy54;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy55;
-			if (yych <= 0xEF) goto yy54;
-			goto yy56;
-		} else {
-			if (yych <= 0xF3) goto yy57;
-			if (yych <= 0xF4) goto yy58;
-			goto yy45;
-		}
-	}
-yy49:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych == '+') goto yy59;
-			goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-			goto yy59;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-			goto yy59;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych <= 'z') goto yy59;
-			goto yy45;
-		}
-	}
-yy50:
-	++p;
-	{ return (bufsize_t)(p - start); }
-yy52:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy45;
-	if (yych <= 0xBF) goto yy47;
-	goto yy45;
-yy53:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy45;
-	if (yych <= 0xBF) goto yy52;
-	goto yy45;
-yy54:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy45;
-	if (yych <= 0xBF) goto yy52;
-	goto yy45;
-yy55:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy45;
-	if (yych <= 0x9F) goto yy52;
-	goto yy45;
-yy56:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy45;
-	if (yych <= 0xBF) goto yy54;
-	goto yy45;
-yy57:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy45;
-	if (yych <= 0xBF) goto yy54;
-	goto yy45;
-yy58:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy45;
-	if (yych <= 0x8F) goto yy54;
-	goto yy45;
-yy59:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych <= ',') {
-			if (yych != '+') goto yy45;
-		} else {
-			if (yych == '/') goto yy45;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= ':') goto yy47;
-			if (yych <= '@') goto yy45;
-		} else {
-			if (yych <= '`') goto yy45;
-			if (yych >= '{') goto yy45;
-		}
-	}
-	yych = *++p;
-	if (yych == ':') goto yy47;
-	goto yy45;
-}
-
-}
-
-// Try to match email autolink after first <, returning num of chars matched.
-bufsize_t _scan_autolink_email(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0, 128,   0, 128, 128, 128, 128, 128, 
-		  0,   0, 128, 128,   0, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128,   0,   0,   0, 128,   0, 128, 
-		  0, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128,   0,   0,   0, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych <= '9') {
-		if (yych <= '\'') {
-			if (yych == '!') goto yy91;
-			if (yych >= '#') goto yy91;
-		} else {
-			if (yych <= ')') goto yy89;
-			if (yych != ',') goto yy91;
-		}
-	} else {
-		if (yych <= '?') {
-			if (yych == '=') goto yy91;
-			if (yych >= '?') goto yy91;
-		} else {
-			if (yych <= 'Z') {
-				if (yych >= 'A') goto yy91;
-			} else {
-				if (yych <= ']') goto yy89;
-				if (yych <= '~') goto yy91;
-			}
-		}
-	}
-yy89:
-	++p;
-yy90:
-	{ return 0; }
-yy91:
-	yych = *(marker = ++p);
-	if (yych <= ',') {
-		if (yych <= '"') {
-			if (yych == '!') goto yy93;
-			goto yy90;
-		} else {
-			if (yych <= '\'') goto yy93;
-			if (yych <= ')') goto yy90;
-			if (yych <= '+') goto yy93;
-			goto yy90;
-		}
-	} else {
-		if (yych <= '>') {
-			if (yych <= '9') goto yy93;
-			if (yych == '=') goto yy93;
-			goto yy90;
-		} else {
-			if (yych <= 'Z') goto yy93;
-			if (yych <= ']') goto yy90;
-			if (yych <= '~') goto yy93;
-			goto yy90;
-		}
-	}
-yy92:
-	yych = *++p;
-yy93:
-	if (yybm[0+yych] & 128) {
-		goto yy92;
-	}
-	if (yych <= '>') goto yy94;
-	if (yych <= '@') goto yy95;
-yy94:
-	p = marker;
-	goto yy90;
-yy95:
-	yych = *++p;
-	if (yych <= '@') {
-		if (yych <= '/') goto yy94;
-		if (yych >= ':') goto yy94;
-	} else {
-		if (yych <= 'Z') goto yy96;
-		if (yych <= '`') goto yy94;
-		if (yych >= '{') goto yy94;
-	}
-yy96:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy98;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy98;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy98;
-			goto yy94;
-		}
-	}
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy101;
-		if (yych <= '/') goto yy94;
-		goto yy102;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy102;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy102;
-			goto yy94;
-		}
-	}
-yy98:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych <= '-') goto yy101;
-			goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy102;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy102;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy102;
-			goto yy94;
-		}
-	}
-yy99:
-	++p;
-	{ return (bufsize_t)(p - start); }
-yy101:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy103;
-		if (yych <= '/') goto yy94;
-		goto yy104;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy104;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy104;
-			goto yy94;
-		}
-	}
-yy102:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy104;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy104;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy104;
-			goto yy94;
-		}
-	}
-yy103:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy105;
-		if (yych <= '/') goto yy94;
-		goto yy106;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy106;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy106;
-			goto yy94;
-		}
-	}
-yy104:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy106;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy106;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy106;
-			goto yy94;
-		}
-	}
-yy105:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy107;
-		if (yych <= '/') goto yy94;
-		goto yy108;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy108;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy108;
-			goto yy94;
-		}
-	}
-yy106:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy108;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy108;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy108;
-			goto yy94;
-		}
-	}
-yy107:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy109;
-		if (yych <= '/') goto yy94;
-		goto yy110;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy110;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy110;
-			goto yy94;
-		}
-	}
-yy108:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy110;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy110;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy110;
-			goto yy94;
-		}
-	}
-yy109:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy111;
-		if (yych <= '/') goto yy94;
-		goto yy112;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy112;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy112;
-			goto yy94;
-		}
-	}
-yy110:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy112;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy112;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy112;
-			goto yy94;
-		}
-	}
-yy111:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy113;
-		if (yych <= '/') goto yy94;
-		goto yy114;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy114;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy114;
-			goto yy94;
-		}
-	}
-yy112:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy114;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy114;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy114;
-			goto yy94;
-		}
-	}
-yy113:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy115;
-		if (yych <= '/') goto yy94;
-		goto yy116;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy116;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy116;
-			goto yy94;
-		}
-	}
-yy114:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy116;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy116;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy116;
-			goto yy94;
-		}
-	}
-yy115:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy117;
-		if (yych <= '/') goto yy94;
-		goto yy118;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy118;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy118;
-			goto yy94;
-		}
-	}
-yy116:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy118;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy118;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy118;
-			goto yy94;
-		}
-	}
-yy117:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy119;
-		if (yych <= '/') goto yy94;
-		goto yy120;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy120;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy120;
-			goto yy94;
-		}
-	}
-yy118:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy120;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy120;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy120;
-			goto yy94;
-		}
-	}
-yy119:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy121;
-		if (yych <= '/') goto yy94;
-		goto yy122;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy122;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy122;
-			goto yy94;
-		}
-	}
-yy120:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy122;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy122;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy122;
-			goto yy94;
-		}
-	}
-yy121:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy123;
-		if (yych <= '/') goto yy94;
-		goto yy124;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy124;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy124;
-			goto yy94;
-		}
-	}
-yy122:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy124;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy124;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy124;
-			goto yy94;
-		}
-	}
-yy123:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy125;
-		if (yych <= '/') goto yy94;
-		goto yy126;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy126;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy126;
-			goto yy94;
-		}
-	}
-yy124:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy126;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy126;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy126;
-			goto yy94;
-		}
-	}
-yy125:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy127;
-		if (yych <= '/') goto yy94;
-		goto yy128;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy128;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy128;
-			goto yy94;
-		}
-	}
-yy126:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy128;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy128;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy128;
-			goto yy94;
-		}
-	}
-yy127:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy129;
-		if (yych <= '/') goto yy94;
-		goto yy130;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy130;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy130;
-			goto yy94;
-		}
-	}
-yy128:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy130;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy130;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy130;
-			goto yy94;
-		}
-	}
-yy129:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy131;
-		if (yych <= '/') goto yy94;
-		goto yy132;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy132;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy132;
-			goto yy94;
-		}
-	}
-yy130:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy132;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy132;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy132;
-			goto yy94;
-		}
-	}
-yy131:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy133;
-		if (yych <= '/') goto yy94;
-		goto yy134;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy134;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy134;
-			goto yy94;
-		}
-	}
-yy132:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy134;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy134;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy134;
-			goto yy94;
-		}
-	}
-yy133:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy135;
-		if (yych <= '/') goto yy94;
-		goto yy136;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy136;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy136;
-			goto yy94;
-		}
-	}
-yy134:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy136;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy136;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy136;
-			goto yy94;
-		}
-	}
-yy135:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy137;
-		if (yych <= '/') goto yy94;
-		goto yy138;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy138;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy138;
-			goto yy94;
-		}
-	}
-yy136:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy138;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy138;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy138;
-			goto yy94;
-		}
-	}
-yy137:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy139;
-		if (yych <= '/') goto yy94;
-		goto yy140;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy140;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy140;
-			goto yy94;
-		}
-	}
-yy138:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy140;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy140;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy140;
-			goto yy94;
-		}
-	}
-yy139:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy141;
-		if (yych <= '/') goto yy94;
-		goto yy142;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy142;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy142;
-			goto yy94;
-		}
-	}
-yy140:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy142;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy142;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy142;
-			goto yy94;
-		}
-	}
-yy141:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy143;
-		if (yych <= '/') goto yy94;
-		goto yy144;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy144;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy144;
-			goto yy94;
-		}
-	}
-yy142:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy144;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy144;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy144;
-			goto yy94;
-		}
-	}
-yy143:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy145;
-		if (yych <= '/') goto yy94;
-		goto yy146;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy146;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy146;
-			goto yy94;
-		}
-	}
-yy144:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy146;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy146;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy146;
-			goto yy94;
-		}
-	}
-yy145:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy147;
-		if (yych <= '/') goto yy94;
-		goto yy148;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy148;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy148;
-			goto yy94;
-		}
-	}
-yy146:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy148;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy148;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy148;
-			goto yy94;
-		}
-	}
-yy147:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy149;
-		if (yych <= '/') goto yy94;
-		goto yy150;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy150;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy150;
-			goto yy94;
-		}
-	}
-yy148:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy150;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy150;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy150;
-			goto yy94;
-		}
-	}
-yy149:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy151;
-		if (yych <= '/') goto yy94;
-		goto yy152;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy152;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy152;
-			goto yy94;
-		}
-	}
-yy150:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy152;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy152;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy152;
-			goto yy94;
-		}
-	}
-yy151:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy153;
-		if (yych <= '/') goto yy94;
-		goto yy154;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy154;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy154;
-			goto yy94;
-		}
-	}
-yy152:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy154;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy154;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy154;
-			goto yy94;
-		}
-	}
-yy153:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy155;
-		if (yych <= '/') goto yy94;
-		goto yy156;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy156;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy156;
-			goto yy94;
-		}
-	}
-yy154:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy156;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy156;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy156;
-			goto yy94;
-		}
-	}
-yy155:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy157;
-		if (yych <= '/') goto yy94;
-		goto yy158;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy158;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy158;
-			goto yy94;
-		}
-	}
-yy156:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy158;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy158;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy158;
-			goto yy94;
-		}
-	}
-yy157:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy159;
-		if (yych <= '/') goto yy94;
-		goto yy160;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy160;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy160;
-			goto yy94;
-		}
-	}
-yy158:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy160;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy160;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy160;
-			goto yy94;
-		}
-	}
-yy159:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy161;
-		if (yych <= '/') goto yy94;
-		goto yy162;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy162;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy162;
-			goto yy94;
-		}
-	}
-yy160:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy162;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy162;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy162;
-			goto yy94;
-		}
-	}
-yy161:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy163;
-		if (yych <= '/') goto yy94;
-		goto yy164;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy164;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy164;
-			goto yy94;
-		}
-	}
-yy162:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy164;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy164;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy164;
-			goto yy94;
-		}
-	}
-yy163:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy165;
-		if (yych <= '/') goto yy94;
-		goto yy166;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy166;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy166;
-			goto yy94;
-		}
-	}
-yy164:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy166;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy166;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy166;
-			goto yy94;
-		}
-	}
-yy165:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy167;
-		if (yych <= '/') goto yy94;
-		goto yy168;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy168;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy168;
-			goto yy94;
-		}
-	}
-yy166:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy168;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy168;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy168;
-			goto yy94;
-		}
-	}
-yy167:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy169;
-		if (yych <= '/') goto yy94;
-		goto yy170;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy170;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy170;
-			goto yy94;
-		}
-	}
-yy168:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy170;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy170;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy170;
-			goto yy94;
-		}
-	}
-yy169:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy171;
-		if (yych <= '/') goto yy94;
-		goto yy172;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy172;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy172;
-			goto yy94;
-		}
-	}
-yy170:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy172;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy172;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy172;
-			goto yy94;
-		}
-	}
-yy171:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy173;
-		if (yych <= '/') goto yy94;
-		goto yy174;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy174;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy174;
-			goto yy94;
-		}
-	}
-yy172:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy174;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy174;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy174;
-			goto yy94;
-		}
-	}
-yy173:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy175;
-		if (yych <= '/') goto yy94;
-		goto yy176;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy176;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy176;
-			goto yy94;
-		}
-	}
-yy174:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy176;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy176;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy176;
-			goto yy94;
-		}
-	}
-yy175:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy177;
-		if (yych <= '/') goto yy94;
-		goto yy178;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy178;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy178;
-			goto yy94;
-		}
-	}
-yy176:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy178;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy178;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy178;
-			goto yy94;
-		}
-	}
-yy177:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy179;
-		if (yych <= '/') goto yy94;
-		goto yy180;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy180;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy180;
-			goto yy94;
-		}
-	}
-yy178:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy180;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy180;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy180;
-			goto yy94;
-		}
-	}
-yy179:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy181;
-		if (yych <= '/') goto yy94;
-		goto yy182;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy182;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy182;
-			goto yy94;
-		}
-	}
-yy180:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy182;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy182;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy182;
-			goto yy94;
-		}
-	}
-yy181:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy183;
-		if (yych <= '/') goto yy94;
-		goto yy184;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy184;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy184;
-			goto yy94;
-		}
-	}
-yy182:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy184;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy184;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy184;
-			goto yy94;
-		}
-	}
-yy183:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy185;
-		if (yych <= '/') goto yy94;
-		goto yy186;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy186;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy186;
-			goto yy94;
-		}
-	}
-yy184:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy186;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy186;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy186;
-			goto yy94;
-		}
-	}
-yy185:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy187;
-		if (yych <= '/') goto yy94;
-		goto yy188;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy188;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy188;
-			goto yy94;
-		}
-	}
-yy186:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy188;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy188;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy188;
-			goto yy94;
-		}
-	}
-yy187:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy189;
-		if (yych <= '/') goto yy94;
-		goto yy190;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy190;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy190;
-			goto yy94;
-		}
-	}
-yy188:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy190;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy190;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy190;
-			goto yy94;
-		}
-	}
-yy189:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy191;
-		if (yych <= '/') goto yy94;
-		goto yy192;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy192;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy192;
-			goto yy94;
-		}
-	}
-yy190:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy192;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy192;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy192;
-			goto yy94;
-		}
-	}
-yy191:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy193;
-		if (yych <= '/') goto yy94;
-		goto yy194;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy194;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy194;
-			goto yy94;
-		}
-	}
-yy192:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy194;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy194;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy194;
-			goto yy94;
-		}
-	}
-yy193:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy195;
-		if (yych <= '/') goto yy94;
-		goto yy196;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy196;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy196;
-			goto yy94;
-		}
-	}
-yy194:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy196;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy196;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy196;
-			goto yy94;
-		}
-	}
-yy195:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy197;
-		if (yych <= '/') goto yy94;
-		goto yy198;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy198;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy198;
-			goto yy94;
-		}
-	}
-yy196:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy198;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy198;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy198;
-			goto yy94;
-		}
-	}
-yy197:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy199;
-		if (yych <= '/') goto yy94;
-		goto yy200;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy200;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy200;
-			goto yy94;
-		}
-	}
-yy198:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy200;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy200;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy200;
-			goto yy94;
-		}
-	}
-yy199:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy201;
-		if (yych <= '/') goto yy94;
-		goto yy202;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy202;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy202;
-			goto yy94;
-		}
-	}
-yy200:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy202;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy202;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy202;
-			goto yy94;
-		}
-	}
-yy201:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy203;
-		if (yych <= '/') goto yy94;
-		goto yy204;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy204;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy204;
-			goto yy94;
-		}
-	}
-yy202:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy204;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy204;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy204;
-			goto yy94;
-		}
-	}
-yy203:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy205;
-		if (yych <= '/') goto yy94;
-		goto yy206;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy206;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy206;
-			goto yy94;
-		}
-	}
-yy204:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy206;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy206;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy206;
-			goto yy94;
-		}
-	}
-yy205:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy207;
-		if (yych <= '/') goto yy94;
-		goto yy208;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy208;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy208;
-			goto yy94;
-		}
-	}
-yy206:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy208;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy208;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy208;
-			goto yy94;
-		}
-	}
-yy207:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy209;
-		if (yych <= '/') goto yy94;
-		goto yy210;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy210;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy210;
-			goto yy94;
-		}
-	}
-yy208:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy210;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy210;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy210;
-			goto yy94;
-		}
-	}
-yy209:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy211;
-		if (yych <= '/') goto yy94;
-		goto yy212;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy212;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy212;
-			goto yy94;
-		}
-	}
-yy210:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy212;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy212;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy212;
-			goto yy94;
-		}
-	}
-yy211:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy213;
-		if (yych <= '/') goto yy94;
-		goto yy214;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy214;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy214;
-			goto yy94;
-		}
-	}
-yy212:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy214;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy214;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy214;
-			goto yy94;
-		}
-	}
-yy213:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy215;
-		if (yych <= '/') goto yy94;
-		goto yy216;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy216;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy216;
-			goto yy94;
-		}
-	}
-yy214:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy216;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy216;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy216;
-			goto yy94;
-		}
-	}
-yy215:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy217;
-		if (yych <= '/') goto yy94;
-		goto yy218;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy218;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy218;
-			goto yy94;
-		}
-	}
-yy216:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy218;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy218;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy218;
-			goto yy94;
-		}
-	}
-yy217:
-	yych = *++p;
-	if (yych <= '9') {
-		if (yych == '-') goto yy219;
-		if (yych <= '/') goto yy94;
-		goto yy220;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy94;
-			goto yy220;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy220;
-			goto yy94;
-		}
-	}
-yy218:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= ',') goto yy94;
-			if (yych >= '.') goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych <= '9') goto yy220;
-			goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-			goto yy220;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych <= 'z') goto yy220;
-			goto yy94;
-		}
-	}
-yy219:
-	yych = *++p;
-	if (yych <= '@') {
-		if (yych <= '/') goto yy94;
-		if (yych <= '9') goto yy221;
-		goto yy94;
-	} else {
-		if (yych <= 'Z') goto yy221;
-		if (yych <= '`') goto yy94;
-		if (yych <= 'z') goto yy221;
-		goto yy94;
-	}
-yy220:
-	yych = *++p;
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych <= '-') goto yy94;
-			goto yy95;
-		} else {
-			if (yych <= '/') goto yy94;
-			if (yych >= ':') goto yy94;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy99;
-			if (yych <= '@') goto yy94;
-		} else {
-			if (yych <= '`') goto yy94;
-			if (yych >= '{') goto yy94;
-		}
-	}
-yy221:
-	yych = *++p;
-	if (yych == '.') goto yy95;
-	if (yych == '>') goto yy99;
-	goto yy94;
-}
-
-}
-
-// Try to match an HTML tag after first <, returning num of chars matched.
-bufsize_t _scan_html_tag(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		/* table 1 .. 8: 0 */
-		  0, 250, 250, 250, 250, 250, 250, 250, 
-		250, 235, 235, 235, 235, 235, 250, 250, 
-		250, 250, 250, 250, 250, 250, 250, 250, 
-		250, 250, 250, 250, 250, 250, 250, 250, 
-		235, 250, 202, 250, 250, 250, 250, 170, 
-		250, 250, 250, 250, 250, 246, 254, 250, 
-		254, 254, 254, 254, 254, 254, 254, 254, 
-		254, 254, 254, 250, 234, 234, 232, 250, 
-		250, 254, 254, 254, 254, 254, 254, 254, 
-		254, 254, 254, 254, 254, 254, 254, 254, 
-		254, 254, 254, 254, 254, 254, 254, 254, 
-		254, 254, 254, 250, 250, 122, 250, 254, 
-		234, 254, 254, 254, 254, 254, 254, 254, 
-		254, 254, 254, 254, 254, 254, 254, 254, 
-		254, 254, 254, 254, 254, 254, 254, 254, 
-		254, 254, 254, 250, 250, 250, 250, 250, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		/* table 9 .. 11: 256 */
-		  0, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 192, 128, 128, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 128, 128, 128, 128, 128,   0, 
-		128, 224, 224, 224, 224, 224, 224, 224, 
-		224, 224, 224, 224, 224, 224, 224, 224, 
-		224, 224, 224, 224, 224, 224, 224, 224, 
-		224, 224, 224, 128, 128, 128, 128, 128, 
-		128, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 128, 128, 128, 128, 128, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych <= '>') {
-		if (yych <= '!') {
-			if (yych >= '!') goto yy226;
-		} else {
-			if (yych == '/') goto yy227;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '?') goto yy228;
-			if (yych >= 'A') goto yy229;
-		} else {
-			if (yych <= '`') goto yy224;
-			if (yych <= 'z') goto yy229;
-		}
-	}
-yy224:
-	++p;
-yy225:
-	{ return 0; }
-yy226:
-	yych = *(marker = ++p);
-	if (yybm[256+yych] & 32) {
-		goto yy232;
-	}
-	if (yych == '-') goto yy230;
-	if (yych <= '@') goto yy225;
-	if (yych <= '[') goto yy234;
-	goto yy225;
-yy227:
-	yych = *(marker = ++p);
-	if (yych <= '@') goto yy225;
-	if (yych <= 'Z') goto yy235;
-	if (yych <= '`') goto yy225;
-	if (yych <= 'z') goto yy235;
-	goto yy225;
-yy228:
-	yych = *(marker = ++p);
-	if (yych <= 0x00) goto yy225;
-	if (yych <= 0x7F) goto yy238;
-	if (yych <= 0xC1) goto yy225;
-	if (yych <= 0xF4) goto yy238;
-	goto yy225;
-yy229:
-	yych = *(marker = ++p);
-	if (yych <= '.') {
-		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy225;
-			if (yych <= '\r') goto yy250;
-			goto yy225;
-		} else {
-			if (yych <= ' ') goto yy250;
-			if (yych == '-') goto yy250;
-			goto yy225;
-		}
-	} else {
-		if (yych <= '@') {
-			if (yych <= '9') goto yy250;
-			if (yych == '>') goto yy250;
-			goto yy225;
-		} else {
-			if (yych <= 'Z') goto yy250;
-			if (yych <= '`') goto yy225;
-			if (yych <= 'z') goto yy250;
-			goto yy225;
-		}
-	}
-yy230:
-	yych = *++p;
-	if (yych == '-') goto yy254;
-yy231:
-	p = marker;
-	goto yy225;
-yy232:
-	yych = *++p;
-	if (yybm[256+yych] & 32) {
-		goto yy232;
-	}
-	if (yych <= 0x08) goto yy231;
-	if (yych <= '\r') goto yy255;
-	if (yych == ' ') goto yy255;
-	goto yy231;
-yy234:
-	yych = *++p;
-	if (yych == 'C') goto yy257;
-	if (yych == 'c') goto yy257;
-	goto yy231;
-yy235:
-	yych = *++p;
-	if (yybm[256+yych] & 64) {
-		goto yy235;
-	}
-	if (yych <= 0x1F) {
-		if (yych <= 0x08) goto yy231;
-		if (yych <= '\r') goto yy258;
-		goto yy231;
-	} else {
-		if (yych <= ' ') goto yy258;
-		if (yych == '>') goto yy252;
-		goto yy231;
-	}
-yy237:
-	yych = *++p;
-yy238:
-	if (yybm[256+yych] & 128) {
-		goto yy237;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy231;
-			if (yych >= '@') goto yy231;
-		} else {
-			if (yych <= 0xDF) goto yy240;
-			if (yych <= 0xE0) goto yy241;
-			goto yy242;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy243;
-			if (yych <= 0xEF) goto yy242;
-			goto yy244;
-		} else {
-			if (yych <= 0xF3) goto yy245;
-			if (yych <= 0xF4) goto yy246;
-			goto yy231;
-		}
-	}
-	yych = *++p;
-	if (yych <= 0xE0) {
-		if (yych <= '>') {
-			if (yych <= 0x00) goto yy231;
-			if (yych <= '=') goto yy237;
-			goto yy252;
-		} else {
-			if (yych <= 0x7F) goto yy237;
-			if (yych <= 0xC1) goto yy231;
-			if (yych >= 0xE0) goto yy241;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy243;
-			goto yy242;
-		} else {
-			if (yych <= 0xF0) goto yy244;
-			if (yych <= 0xF3) goto yy245;
-			if (yych <= 0xF4) goto yy246;
-			goto yy231;
-		}
-	}
-yy240:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy237;
-	goto yy231;
-yy241:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy231;
-	if (yych <= 0xBF) goto yy240;
-	goto yy231;
-yy242:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy240;
-	goto yy231;
-yy243:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x9F) goto yy240;
-	goto yy231;
-yy244:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy231;
-	if (yych <= 0xBF) goto yy242;
-	goto yy231;
-yy245:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy242;
-	goto yy231;
-yy246:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x8F) goto yy242;
-	goto yy231;
-yy247:
-	yych = *++p;
-	if (yybm[0+yych] & 1) {
-		goto yy247;
-	}
-	if (yych <= '>') {
-		if (yych <= '9') {
-			if (yych == '/') goto yy251;
-			goto yy231;
-		} else {
-			if (yych <= ':') goto yy260;
-			if (yych <= '=') goto yy231;
-			goto yy252;
-		}
-	} else {
-		if (yych <= '^') {
-			if (yych <= '@') goto yy231;
-			if (yych <= 'Z') goto yy260;
-			goto yy231;
-		} else {
-			if (yych == '`') goto yy231;
-			if (yych <= 'z') goto yy260;
-			goto yy231;
-		}
-	}
-yy249:
-	yych = *++p;
-yy250:
-	if (yybm[0+yych] & 1) {
-		goto yy247;
-	}
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych == '-') goto yy249;
-			goto yy231;
-		} else {
-			if (yych <= '/') goto yy251;
-			if (yych <= '9') goto yy249;
-			goto yy231;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy252;
-			if (yych <= '@') goto yy231;
-			goto yy249;
-		} else {
-			if (yych <= '`') goto yy231;
-			if (yych <= 'z') goto yy249;
-			goto yy231;
-		}
-	}
-yy251:
-	yych = *++p;
-	if (yych != '>') goto yy231;
-yy252:
-	++p;
-	{ return (bufsize_t)(p - start); }
-yy254:
-	yych = *++p;
-	if (yych == '-') goto yy264;
-	if (yych == '>') goto yy231;
-	goto yy263;
-yy255:
-	yych = *++p;
-	if (yybm[0+yych] & 2) {
-		goto yy255;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy231;
-			if (yych <= '>') goto yy252;
-			goto yy231;
-		} else {
-			if (yych <= 0xDF) goto yy272;
-			if (yych <= 0xE0) goto yy273;
-			goto yy274;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy275;
-			if (yych <= 0xEF) goto yy274;
-			goto yy276;
-		} else {
-			if (yych <= 0xF3) goto yy277;
-			if (yych <= 0xF4) goto yy278;
-			goto yy231;
-		}
-	}
-yy257:
-	yych = *++p;
-	if (yych == 'D') goto yy279;
-	if (yych == 'd') goto yy279;
-	goto yy231;
-yy258:
-	yych = *++p;
-	if (yych <= 0x1F) {
-		if (yych <= 0x08) goto yy231;
-		if (yych <= '\r') goto yy258;
-		goto yy231;
-	} else {
-		if (yych <= ' ') goto yy258;
-		if (yych == '>') goto yy252;
-		goto yy231;
-	}
-yy260:
-	yych = *++p;
-	if (yybm[0+yych] & 4) {
-		goto yy260;
-	}
-	if (yych <= ',') {
-		if (yych <= '\r') {
-			if (yych <= 0x08) goto yy231;
-			goto yy280;
-		} else {
-			if (yych == ' ') goto yy280;
-			goto yy231;
-		}
-	} else {
-		if (yych <= '<') {
-			if (yych <= '/') goto yy251;
-			goto yy231;
-		} else {
-			if (yych <= '=') goto yy282;
-			if (yych <= '>') goto yy252;
-			goto yy231;
-		}
-	}
-yy262:
-	yych = *++p;
-yy263:
-	if (yybm[0+yych] & 8) {
-		goto yy262;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy231;
-			if (yych <= '-') goto yy284;
-			goto yy231;
-		} else {
-			if (yych <= 0xDF) goto yy265;
-			if (yych <= 0xE0) goto yy266;
-			goto yy267;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy268;
-			if (yych <= 0xEF) goto yy267;
-			goto yy269;
-		} else {
-			if (yych <= 0xF3) goto yy270;
-			if (yych <= 0xF4) goto yy271;
-			goto yy231;
-		}
-	}
-yy264:
-	yych = *++p;
-	if (yych == '-') goto yy251;
-	if (yych == '>') goto yy231;
-	goto yy263;
-yy265:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy262;
-	goto yy231;
-yy266:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy231;
-	if (yych <= 0xBF) goto yy265;
-	goto yy231;
-yy267:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy265;
-	goto yy231;
-yy268:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x9F) goto yy265;
-	goto yy231;
-yy269:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy231;
-	if (yych <= 0xBF) goto yy267;
-	goto yy231;
-yy270:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy267;
-	goto yy231;
-yy271:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x8F) goto yy267;
-	goto yy231;
-yy272:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy255;
-	goto yy231;
-yy273:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy231;
-	if (yych <= 0xBF) goto yy272;
-	goto yy231;
-yy274:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy272;
-	goto yy231;
-yy275:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x9F) goto yy272;
-	goto yy231;
-yy276:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy231;
-	if (yych <= 0xBF) goto yy274;
-	goto yy231;
-yy277:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy274;
-	goto yy231;
-yy278:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x8F) goto yy274;
-	goto yy231;
-yy279:
-	yych = *++p;
-	if (yych == 'A') goto yy285;
-	if (yych == 'a') goto yy285;
-	goto yy231;
-yy280:
-	yych = *++p;
-	if (yych <= '<') {
-		if (yych <= ' ') {
-			if (yych <= 0x08) goto yy231;
-			if (yych <= '\r') goto yy280;
-			if (yych <= 0x1F) goto yy231;
-			goto yy280;
-		} else {
-			if (yych <= '/') {
-				if (yych <= '.') goto yy231;
-				goto yy251;
-			} else {
-				if (yych == ':') goto yy260;
-				goto yy231;
-			}
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '=') goto yy282;
-			if (yych <= '>') goto yy252;
-			if (yych <= '@') goto yy231;
-			goto yy260;
-		} else {
-			if (yych <= '_') {
-				if (yych <= '^') goto yy231;
-				goto yy260;
-			} else {
-				if (yych <= '`') goto yy231;
-				if (yych <= 'z') goto yy260;
-				goto yy231;
-			}
-		}
-	}
-yy282:
-	yych = *++p;
-	if (yybm[0+yych] & 16) {
-		goto yy286;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '"') {
-			if (yych <= 0x00) goto yy231;
-			if (yych <= ' ') goto yy282;
-			goto yy288;
-		} else {
-			if (yych <= '\'') goto yy290;
-			if (yych <= 0xC1) goto yy231;
-			if (yych <= 0xDF) goto yy292;
-			goto yy293;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy295;
-			goto yy294;
-		} else {
-			if (yych <= 0xF0) goto yy296;
-			if (yych <= 0xF3) goto yy297;
-			if (yych <= 0xF4) goto yy298;
-			goto yy231;
-		}
-	}
-yy284:
-	yych = *++p;
-	if (yybm[0+yych] & 8) {
-		goto yy262;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy231;
-			if (yych <= '-') goto yy251;
-			goto yy231;
-		} else {
-			if (yych <= 0xDF) goto yy265;
-			if (yych <= 0xE0) goto yy266;
-			goto yy267;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy268;
-			if (yych <= 0xEF) goto yy267;
-			goto yy269;
-		} else {
-			if (yych <= 0xF3) goto yy270;
-			if (yych <= 0xF4) goto yy271;
-			goto yy231;
-		}
-	}
-yy285:
-	yych = *++p;
-	if (yych == 'T') goto yy299;
-	if (yych == 't') goto yy299;
-	goto yy231;
-yy286:
-	yych = *++p;
-	if (yybm[0+yych] & 16) {
-		goto yy286;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '=') {
-			if (yych <= 0x00) goto yy231;
-			if (yych <= ' ') goto yy247;
-			goto yy231;
-		} else {
-			if (yych <= '>') goto yy252;
-			if (yych <= 0xC1) goto yy231;
-			if (yych <= 0xDF) goto yy292;
-			goto yy293;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy295;
-			goto yy294;
-		} else {
-			if (yych <= 0xF0) goto yy296;
-			if (yych <= 0xF3) goto yy297;
-			if (yych <= 0xF4) goto yy298;
-			goto yy231;
-		}
-	}
-yy288:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy288;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy231;
-			if (yych <= '"') goto yy300;
-			goto yy231;
-		} else {
-			if (yych <= 0xDF) goto yy301;
-			if (yych <= 0xE0) goto yy302;
-			goto yy303;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy304;
-			if (yych <= 0xEF) goto yy303;
-			goto yy305;
-		} else {
-			if (yych <= 0xF3) goto yy306;
-			if (yych <= 0xF4) goto yy307;
-			goto yy231;
-		}
-	}
-yy290:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy290;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy231;
-			if (yych <= '\'') goto yy300;
-			goto yy231;
-		} else {
-			if (yych <= 0xDF) goto yy308;
-			if (yych <= 0xE0) goto yy309;
-			goto yy310;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy311;
-			if (yych <= 0xEF) goto yy310;
-			goto yy312;
-		} else {
-			if (yych <= 0xF3) goto yy313;
-			if (yych <= 0xF4) goto yy314;
-			goto yy231;
-		}
-	}
-yy292:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy286;
-	goto yy231;
-yy293:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy231;
-	if (yych <= 0xBF) goto yy292;
-	goto yy231;
-yy294:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy292;
-	goto yy231;
-yy295:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x9F) goto yy292;
-	goto yy231;
-yy296:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy231;
-	if (yych <= 0xBF) goto yy294;
-	goto yy231;
-yy297:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy294;
-	goto yy231;
-yy298:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x8F) goto yy294;
-	goto yy231;
-yy299:
-	yych = *++p;
-	if (yych == 'A') goto yy315;
-	if (yych == 'a') goto yy315;
-	goto yy231;
-yy300:
-	yych = *++p;
-	if (yybm[0+yych] & 1) {
-		goto yy247;
-	}
-	if (yych == '/') goto yy251;
-	if (yych == '>') goto yy252;
-	goto yy231;
-yy301:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy288;
-	goto yy231;
-yy302:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy231;
-	if (yych <= 0xBF) goto yy301;
-	goto yy231;
-yy303:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy301;
-	goto yy231;
-yy304:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x9F) goto yy301;
-	goto yy231;
-yy305:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy231;
-	if (yych <= 0xBF) goto yy303;
-	goto yy231;
-yy306:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy303;
-	goto yy231;
-yy307:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x8F) goto yy303;
-	goto yy231;
-yy308:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy290;
-	goto yy231;
-yy309:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy231;
-	if (yych <= 0xBF) goto yy308;
-	goto yy231;
-yy310:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy308;
-	goto yy231;
-yy311:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x9F) goto yy308;
-	goto yy231;
-yy312:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy231;
-	if (yych <= 0xBF) goto yy310;
-	goto yy231;
-yy313:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy310;
-	goto yy231;
-yy314:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x8F) goto yy310;
-	goto yy231;
-yy315:
-	yych = *++p;
-	if (yych != '[') goto yy231;
-yy316:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy316;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy231;
-			if (yych >= '^') goto yy231;
-		} else {
-			if (yych <= 0xDF) goto yy319;
-			if (yych <= 0xE0) goto yy320;
-			goto yy321;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy322;
-			if (yych <= 0xEF) goto yy321;
-			goto yy323;
-		} else {
-			if (yych <= 0xF3) goto yy324;
-			if (yych <= 0xF4) goto yy325;
-			goto yy231;
-		}
-	}
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy316;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy231;
-			if (yych <= ']') goto yy326;
-			goto yy231;
-		} else {
-			if (yych <= 0xDF) goto yy319;
-			if (yych <= 0xE0) goto yy320;
-			goto yy321;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy322;
-			if (yych <= 0xEF) goto yy321;
-			goto yy323;
-		} else {
-			if (yych <= 0xF3) goto yy324;
-			if (yych <= 0xF4) goto yy325;
-			goto yy231;
-		}
-	}
-yy319:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy316;
-	goto yy231;
-yy320:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy231;
-	if (yych <= 0xBF) goto yy319;
-	goto yy231;
-yy321:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy319;
-	goto yy231;
-yy322:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x9F) goto yy319;
-	goto yy231;
-yy323:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy231;
-	if (yych <= 0xBF) goto yy321;
-	goto yy231;
-yy324:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0xBF) goto yy321;
-	goto yy231;
-yy325:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy231;
-	if (yych <= 0x8F) goto yy321;
-	goto yy231;
-yy326:
-	yych = *++p;
-	if (yych <= 0xE0) {
-		if (yych <= '>') {
-			if (yych <= 0x00) goto yy231;
-			if (yych <= '=') goto yy316;
-			goto yy252;
-		} else {
-			if (yych <= 0x7F) goto yy316;
-			if (yych <= 0xC1) goto yy231;
-			if (yych <= 0xDF) goto yy319;
-			goto yy320;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy322;
-			goto yy321;
-		} else {
-			if (yych <= 0xF0) goto yy323;
-			if (yych <= 0xF3) goto yy324;
-			if (yych <= 0xF4) goto yy325;
-			goto yy231;
-		}
-	}
-}
-
-}
-
-// Try to (liberally) match an HTML tag after first <, returning num of chars matched.
-bufsize_t _scan_liberal_html_tag(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	unsigned int yyaccept = 0;
-	static const unsigned char yybm[] = {
-		  0,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,   0,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64, 128,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych <= 0xE0) {
-		if (yych <= '\n') {
-			if (yych <= 0x00) goto yy329;
-			if (yych <= '\t') goto yy331;
-		} else {
-			if (yych <= 0x7F) goto yy331;
-			if (yych <= 0xC1) goto yy329;
-			if (yych <= 0xDF) goto yy332;
-			goto yy333;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy335;
-			goto yy334;
-		} else {
-			if (yych <= 0xF0) goto yy336;
-			if (yych <= 0xF3) goto yy337;
-			if (yych <= 0xF4) goto yy338;
-		}
-	}
-yy329:
-	++p;
-yy330:
-	{ return 0; }
-yy331:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= '\n') {
-		if (yych <= 0x00) goto yy330;
-		if (yych <= '\t') goto yy340;
-		goto yy330;
-	} else {
-		if (yych <= 0x7F) goto yy340;
-		if (yych <= 0xC1) goto yy330;
-		if (yych <= 0xF4) goto yy340;
-		goto yy330;
-	}
-yy332:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy330;
-	if (yych <= 0xBF) goto yy339;
-	goto yy330;
-yy333:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x9F) goto yy330;
-	if (yych <= 0xBF) goto yy345;
-	goto yy330;
-yy334:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy330;
-	if (yych <= 0xBF) goto yy345;
-	goto yy330;
-yy335:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy330;
-	if (yych <= 0x9F) goto yy345;
-	goto yy330;
-yy336:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x8F) goto yy330;
-	if (yych <= 0xBF) goto yy347;
-	goto yy330;
-yy337:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy330;
-	if (yych <= 0xBF) goto yy347;
-	goto yy330;
-yy338:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy330;
-	if (yych <= 0x8F) goto yy347;
-	goto yy330;
-yy339:
-	yych = *++p;
-yy340:
-	if (yybm[0+yych] & 64) {
-		goto yy339;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy341;
-			if (yych <= '>') goto yy342;
-		} else {
-			if (yych <= 0xDF) goto yy345;
-			if (yych <= 0xE0) goto yy346;
-			goto yy347;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy348;
-			if (yych <= 0xEF) goto yy347;
-			goto yy349;
-		} else {
-			if (yych <= 0xF3) goto yy350;
-			if (yych <= 0xF4) goto yy351;
-		}
-	}
-yy341:
-	p = marker;
-	if (yyaccept == 0) {
-		goto yy330;
-	} else {
-		goto yy344;
-	}
-yy342:
-	yyaccept = 1;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 64) {
-		goto yy339;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy344;
-			if (yych <= '>') goto yy342;
-		} else {
-			if (yych <= 0xDF) goto yy345;
-			if (yych <= 0xE0) goto yy346;
-			goto yy347;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy348;
-			if (yych <= 0xEF) goto yy347;
-			goto yy349;
-		} else {
-			if (yych <= 0xF3) goto yy350;
-			if (yych <= 0xF4) goto yy351;
-		}
-	}
-yy344:
-	{ return (bufsize_t)(p - start); }
-yy345:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy341;
-	if (yych <= 0xBF) goto yy339;
-	goto yy341;
-yy346:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy341;
-	if (yych <= 0xBF) goto yy345;
-	goto yy341;
-yy347:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy341;
-	if (yych <= 0xBF) goto yy345;
-	goto yy341;
-yy348:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy341;
-	if (yych <= 0x9F) goto yy345;
-	goto yy341;
-yy349:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy341;
-	if (yych <= 0xBF) goto yy347;
-	goto yy341;
-yy350:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy341;
-	if (yych <= 0xBF) goto yy347;
-	goto yy341;
-yy351:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy341;
-	if (yych <= 0x8F) goto yy347;
-	goto yy341;
-}
-
-}
-
-// Try to match an HTML block tag start line, returning
-// an integer code for the type of block (1-6, matching the spec).
-// #7 is handled by a separate function, below.
-bufsize_t _scan_html_block_start(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-
-{
-	unsigned char yych;
-	yych = *p;
-	if (yych == '<') goto yy356;
-	++p;
-yy355:
-	{ return 0; }
-yy356:
-	yych = *(marker = ++p);
-	switch (yych) {
-	case '!':	goto yy357;
-	case '/':	goto yy359;
-	case '?':	goto yy360;
-	case 'A':
-	case 'a':	goto yy362;
-	case 'B':
-	case 'b':	goto yy363;
-	case 'C':
-	case 'c':	goto yy364;
-	case 'D':
-	case 'd':	goto yy365;
-	case 'F':
-	case 'f':	goto yy366;
-	case 'H':
-	case 'h':	goto yy367;
-	case 'I':
-	case 'i':	goto yy368;
-	case 'L':
-	case 'l':	goto yy369;
-	case 'M':
-	case 'm':	goto yy370;
-	case 'N':
-	case 'n':	goto yy371;
-	case 'O':
-	case 'o':	goto yy372;
-	case 'P':
-	case 'p':	goto yy373;
-	case 'S':
-	case 's':	goto yy374;
-	case 'T':
-	case 't':	goto yy375;
-	case 'U':
-	case 'u':	goto yy376;
-	default:	goto yy355;
-	}
-yy357:
-	yych = *++p;
-	if (yych <= '@') {
-		if (yych == '-') goto yy377;
-	} else {
-		if (yych <= 'Z') goto yy378;
-		if (yych <= '[') goto yy380;
-	}
-yy358:
-	p = marker;
-	goto yy355;
-yy359:
-	yych = *++p;
-	switch (yych) {
-	case 'A':
-	case 'a':	goto yy362;
-	case 'B':
-	case 'b':	goto yy363;
-	case 'C':
-	case 'c':	goto yy364;
-	case 'D':
-	case 'd':	goto yy365;
-	case 'F':
-	case 'f':	goto yy366;
-	case 'H':
-	case 'h':	goto yy367;
-	case 'I':
-	case 'i':	goto yy368;
-	case 'L':
-	case 'l':	goto yy369;
-	case 'M':
-	case 'm':	goto yy370;
-	case 'N':
-	case 'n':	goto yy371;
-	case 'O':
-	case 'o':	goto yy372;
-	case 'P':
-	case 'p':	goto yy381;
-	case 'S':
-	case 's':	goto yy382;
-	case 'T':
-	case 't':	goto yy375;
-	case 'U':
-	case 'u':	goto yy376;
-	default:	goto yy358;
-	}
-yy360:
-	++p;
-	{ return 3; }
-yy362:
-	yych = *++p;
-	if (yych <= 'S') {
-		if (yych <= 'D') {
-			if (yych <= 'C') goto yy358;
-			goto yy383;
-		} else {
-			if (yych <= 'Q') goto yy358;
-			if (yych <= 'R') goto yy384;
-			goto yy385;
-		}
-	} else {
-		if (yych <= 'q') {
-			if (yych == 'd') goto yy383;
-			goto yy358;
-		} else {
-			if (yych <= 'r') goto yy384;
-			if (yych <= 's') goto yy385;
-			goto yy358;
-		}
-	}
-yy363:
-	yych = *++p;
-	if (yych <= 'O') {
-		if (yych <= 'K') {
-			if (yych == 'A') goto yy386;
-			goto yy358;
-		} else {
-			if (yych <= 'L') goto yy387;
-			if (yych <= 'N') goto yy358;
-			goto yy388;
-		}
-	} else {
-		if (yych <= 'k') {
-			if (yych == 'a') goto yy386;
-			goto yy358;
-		} else {
-			if (yych <= 'l') goto yy387;
-			if (yych == 'o') goto yy388;
-			goto yy358;
-		}
-	}
-yy364:
-	yych = *++p;
-	if (yych <= 'O') {
-		if (yych <= 'D') {
-			if (yych == 'A') goto yy389;
-			goto yy358;
-		} else {
-			if (yych <= 'E') goto yy390;
-			if (yych <= 'N') goto yy358;
-			goto yy391;
-		}
-	} else {
-		if (yych <= 'd') {
-			if (yych == 'a') goto yy389;
-			goto yy358;
-		} else {
-			if (yych <= 'e') goto yy390;
-			if (yych == 'o') goto yy391;
-			goto yy358;
-		}
-	}
-yy365:
-	yych = *++p;
-	switch (yych) {
-	case 'D':
-	case 'L':
-	case 'T':
-	case 'd':
-	case 'l':
-	case 't':	goto yy392;
-	case 'E':
-	case 'e':	goto yy393;
-	case 'I':
-	case 'i':	goto yy394;
-	default:	goto yy358;
-	}
-yy366:
-	yych = *++p;
-	if (yych <= 'R') {
-		if (yych <= 'N') {
-			if (yych == 'I') goto yy395;
-			goto yy358;
-		} else {
-			if (yych <= 'O') goto yy396;
-			if (yych <= 'Q') goto yy358;
-			goto yy397;
-		}
-	} else {
-		if (yych <= 'n') {
-			if (yych == 'i') goto yy395;
-			goto yy358;
-		} else {
-			if (yych <= 'o') goto yy396;
-			if (yych == 'r') goto yy397;
-			goto yy358;
-		}
-	}
-yy367:
-	yych = *++p;
-	if (yych <= 'S') {
-		if (yych <= 'D') {
-			if (yych <= '0') goto yy358;
-			if (yych <= '6') goto yy392;
-			goto yy358;
-		} else {
-			if (yych <= 'E') goto yy398;
-			if (yych == 'R') goto yy392;
-			goto yy358;
-		}
-	} else {
-		if (yych <= 'q') {
-			if (yych <= 'T') goto yy399;
-			if (yych == 'e') goto yy398;
-			goto yy358;
-		} else {
-			if (yych <= 'r') goto yy392;
-			if (yych == 't') goto yy399;
-			goto yy358;
-		}
-	}
-yy368:
-	yych = *++p;
-	if (yych == 'F') goto yy400;
-	if (yych == 'f') goto yy400;
-	goto yy358;
-yy369:
-	yych = *++p;
-	if (yych <= 'I') {
-		if (yych == 'E') goto yy401;
-		if (yych <= 'H') goto yy358;
-		goto yy402;
-	} else {
-		if (yych <= 'e') {
-			if (yych <= 'd') goto yy358;
-			goto yy401;
-		} else {
-			if (yych == 'i') goto yy402;
-			goto yy358;
-		}
-	}
-yy370:
-	yych = *++p;
-	if (yych <= 'E') {
-		if (yych == 'A') goto yy403;
-		if (yych <= 'D') goto yy358;
-		goto yy404;
-	} else {
-		if (yych <= 'a') {
-			if (yych <= '`') goto yy358;
-			goto yy403;
-		} else {
-			if (yych == 'e') goto yy404;
-			goto yy358;
-		}
-	}
-yy371:
-	yych = *++p;
-	if (yych <= 'O') {
-		if (yych == 'A') goto yy405;
-		if (yych <= 'N') goto yy358;
-		goto yy406;
-	} else {
-		if (yych <= 'a') {
-			if (yych <= '`') goto yy358;
-			goto yy405;
-		} else {
-			if (yych == 'o') goto yy406;
-			goto yy358;
-		}
-	}
-yy372:
-	yych = *++p;
-	if (yych <= 'P') {
-		if (yych == 'L') goto yy392;
-		if (yych <= 'O') goto yy358;
-		goto yy407;
-	} else {
-		if (yych <= 'l') {
-			if (yych <= 'k') goto yy358;
-			goto yy392;
-		} else {
-			if (yych == 'p') goto yy407;
-			goto yy358;
-		}
-	}
-yy373:
-	yych = *++p;
-	if (yych <= '>') {
-		if (yych <= ' ') {
-			if (yych <= 0x08) goto yy358;
-			if (yych <= '\r') goto yy408;
-			if (yych <= 0x1F) goto yy358;
-			goto yy408;
-		} else {
-			if (yych == '/') goto yy410;
-			if (yych <= '=') goto yy358;
-			goto yy408;
-		}
-	} else {
-		if (yych <= 'R') {
-			if (yych == 'A') goto yy411;
-			if (yych <= 'Q') goto yy358;
-			goto yy412;
-		} else {
-			if (yych <= 'a') {
-				if (yych <= '`') goto yy358;
-				goto yy411;
-			} else {
-				if (yych == 'r') goto yy412;
-				goto yy358;
-			}
-		}
-	}
-yy374:
-	yych = *++p;
-	switch (yych) {
-	case 'C':
-	case 'c':	goto yy413;
-	case 'E':
-	case 'e':	goto yy414;
-	case 'O':
-	case 'o':	goto yy415;
-	case 'T':
-	case 't':	goto yy416;
-	case 'U':
-	case 'u':	goto yy417;
-	default:	goto yy358;
-	}
-yy375:
-	yych = *++p;
-	switch (yych) {
-	case 'A':
-	case 'a':	goto yy418;
-	case 'B':
-	case 'b':	goto yy419;
-	case 'D':
-	case 'd':	goto yy392;
-	case 'F':
-	case 'f':	goto yy420;
-	case 'H':
-	case 'h':	goto yy421;
-	case 'I':
-	case 'i':	goto yy422;
-	case 'R':
-	case 'r':	goto yy423;
-	default:	goto yy358;
-	}
-yy376:
-	yych = *++p;
-	if (yych == 'L') goto yy392;
-	if (yych == 'l') goto yy392;
-	goto yy358;
-yy377:
-	yych = *++p;
-	if (yych == '-') goto yy424;
-	goto yy358;
-yy378:
-	++p;
-	{ return 4; }
-yy380:
-	yych = *++p;
-	if (yych == 'C') goto yy426;
-	if (yych == 'c') goto yy426;
-	goto yy358;
-yy381:
-	yych = *++p;
-	if (yych <= '/') {
-		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy358;
-			if (yych <= '\r') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= ' ') goto yy408;
-			if (yych <= '.') goto yy358;
-			goto yy410;
-		}
-	} else {
-		if (yych <= '@') {
-			if (yych == '>') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= 'A') goto yy411;
-			if (yych == 'a') goto yy411;
-			goto yy358;
-		}
-	}
-yy382:
-	yych = *++p;
-	if (yych <= 'U') {
-		if (yych <= 'N') {
-			if (yych == 'E') goto yy414;
-			goto yy358;
-		} else {
-			if (yych <= 'O') goto yy415;
-			if (yych <= 'T') goto yy358;
-			goto yy417;
-		}
-	} else {
-		if (yych <= 'n') {
-			if (yych == 'e') goto yy414;
-			goto yy358;
-		} else {
-			if (yych <= 'o') goto yy415;
-			if (yych == 'u') goto yy417;
-			goto yy358;
-		}
-	}
-yy383:
-	yych = *++p;
-	if (yych == 'D') goto yy427;
-	if (yych == 'd') goto yy427;
-	goto yy358;
-yy384:
-	yych = *++p;
-	if (yych == 'T') goto yy428;
-	if (yych == 't') goto yy428;
-	goto yy358;
-yy385:
-	yych = *++p;
-	if (yych == 'I') goto yy429;
-	if (yych == 'i') goto yy429;
-	goto yy358;
-yy386:
-	yych = *++p;
-	if (yych == 'S') goto yy430;
-	if (yych == 's') goto yy430;
-	goto yy358;
-yy387:
-	yych = *++p;
-	if (yych == 'O') goto yy431;
-	if (yych == 'o') goto yy431;
-	goto yy358;
-yy388:
-	yych = *++p;
-	if (yych == 'D') goto yy432;
-	if (yych == 'd') goto yy432;
-	goto yy358;
-yy389:
-	yych = *++p;
-	if (yych == 'P') goto yy433;
-	if (yych == 'p') goto yy433;
-	goto yy358;
-yy390:
-	yych = *++p;
-	if (yych == 'N') goto yy434;
-	if (yych == 'n') goto yy434;
-	goto yy358;
-yy391:
-	yych = *++p;
-	if (yych == 'L') goto yy435;
-	if (yych == 'l') goto yy435;
-	goto yy358;
-yy392:
-	yych = *++p;
-	if (yych <= ' ') {
-		if (yych <= 0x08) goto yy358;
-		if (yych <= '\r') goto yy408;
-		if (yych <= 0x1F) goto yy358;
-		goto yy408;
-	} else {
-		if (yych <= '/') {
-			if (yych <= '.') goto yy358;
-			goto yy410;
-		} else {
-			if (yych == '>') goto yy408;
-			goto yy358;
-		}
-	}
-yy393:
-	yych = *++p;
-	if (yych == 'T') goto yy436;
-	if (yych == 't') goto yy436;
-	goto yy358;
-yy394:
-	yych = *++p;
-	if (yych <= 'V') {
-		if (yych <= 'Q') {
-			if (yych == 'A') goto yy437;
-			goto yy358;
-		} else {
-			if (yych <= 'R') goto yy392;
-			if (yych <= 'U') goto yy358;
-			goto yy392;
-		}
-	} else {
-		if (yych <= 'q') {
-			if (yych == 'a') goto yy437;
-			goto yy358;
-		} else {
-			if (yych <= 'r') goto yy392;
-			if (yych == 'v') goto yy392;
-			goto yy358;
-		}
-	}
-yy395:
-	yych = *++p;
-	if (yych <= 'G') {
-		if (yych == 'E') goto yy438;
-		if (yych <= 'F') goto yy358;
-		goto yy439;
-	} else {
-		if (yych <= 'e') {
-			if (yych <= 'd') goto yy358;
-			goto yy438;
-		} else {
-			if (yych == 'g') goto yy439;
-			goto yy358;
-		}
-	}
-yy396:
-	yych = *++p;
-	if (yych <= 'R') {
-		if (yych == 'O') goto yy434;
-		if (yych <= 'Q') goto yy358;
-		goto yy440;
-	} else {
-		if (yych <= 'o') {
-			if (yych <= 'n') goto yy358;
-			goto yy434;
-		} else {
-			if (yych == 'r') goto yy440;
-			goto yy358;
-		}
-	}
-yy397:
-	yych = *++p;
-	if (yych == 'A') goto yy441;
-	if (yych == 'a') goto yy441;
-	goto yy358;
-yy398:
-	yych = *++p;
-	if (yych == 'A') goto yy442;
-	if (yych == 'a') goto yy442;
-	goto yy358;
-yy399:
-	yych = *++p;
-	if (yych == 'M') goto yy376;
-	if (yych == 'm') goto yy376;
-	goto yy358;
-yy400:
-	yych = *++p;
-	if (yych == 'R') goto yy443;
-	if (yych == 'r') goto yy443;
-	goto yy358;
-yy401:
-	yych = *++p;
-	if (yych == 'G') goto yy444;
-	if (yych == 'g') goto yy444;
-	goto yy358;
-yy402:
-	yych = *++p;
-	if (yych <= '/') {
-		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy358;
-			if (yych <= '\r') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= ' ') goto yy408;
-			if (yych <= '.') goto yy358;
-			goto yy410;
-		}
-	} else {
-		if (yych <= 'M') {
-			if (yych == '>') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= 'N') goto yy445;
-			if (yych == 'n') goto yy445;
-			goto yy358;
-		}
-	}
-yy403:
-	yych = *++p;
-	if (yych == 'I') goto yy446;
-	if (yych == 'i') goto yy446;
-	goto yy358;
-yy404:
-	yych = *++p;
-	if (yych == 'N') goto yy447;
-	if (yych == 'n') goto yy447;
-	goto yy358;
-yy405:
-	yych = *++p;
-	if (yych == 'V') goto yy392;
-	if (yych == 'v') goto yy392;
-	goto yy358;
-yy406:
-	yych = *++p;
-	if (yych == 'F') goto yy448;
-	if (yych == 'f') goto yy448;
-	goto yy358;
-yy407:
-	yych = *++p;
-	if (yych == 'T') goto yy449;
-	if (yych == 't') goto yy449;
-	goto yy358;
-yy408:
-	++p;
-	{ return 6; }
-yy410:
-	yych = *++p;
-	if (yych == '>') goto yy408;
-	goto yy358;
-yy411:
-	yych = *++p;
-	if (yych == 'R') goto yy450;
-	if (yych == 'r') goto yy450;
-	goto yy358;
-yy412:
-	yych = *++p;
-	if (yych == 'E') goto yy451;
-	if (yych == 'e') goto yy451;
-	goto yy358;
-yy413:
-	yych = *++p;
-	if (yych == 'R') goto yy452;
-	if (yych == 'r') goto yy452;
-	goto yy358;
-yy414:
-	yych = *++p;
-	if (yych == 'C') goto yy433;
-	if (yych == 'c') goto yy433;
-	goto yy358;
-yy415:
-	yych = *++p;
-	if (yych == 'U') goto yy453;
-	if (yych == 'u') goto yy453;
-	goto yy358;
-yy416:
-	yych = *++p;
-	if (yych == 'Y') goto yy454;
-	if (yych == 'y') goto yy454;
-	goto yy358;
-yy417:
-	yych = *++p;
-	if (yych == 'M') goto yy455;
-	if (yych == 'm') goto yy455;
-	goto yy358;
-yy418:
-	yych = *++p;
-	if (yych == 'B') goto yy456;
-	if (yych == 'b') goto yy456;
-	goto yy358;
-yy419:
-	yych = *++p;
-	if (yych == 'O') goto yy388;
-	if (yych == 'o') goto yy388;
-	goto yy358;
-yy420:
-	yych = *++p;
-	if (yych == 'O') goto yy457;
-	if (yych == 'o') goto yy457;
-	goto yy358;
-yy421:
-	yych = *++p;
-	if (yych <= '/') {
-		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy358;
-			if (yych <= '\r') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= ' ') goto yy408;
-			if (yych <= '.') goto yy358;
-			goto yy410;
-		}
-	} else {
-		if (yych <= 'D') {
-			if (yych == '>') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= 'E') goto yy458;
-			if (yych == 'e') goto yy458;
-			goto yy358;
-		}
-	}
-yy422:
-	yych = *++p;
-	if (yych == 'T') goto yy456;
-	if (yych == 't') goto yy456;
-	goto yy358;
-yy423:
-	yych = *++p;
-	if (yych <= '/') {
-		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy358;
-			if (yych <= '\r') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= ' ') goto yy408;
-			if (yych <= '.') goto yy358;
-			goto yy410;
-		}
-	} else {
-		if (yych <= '@') {
-			if (yych == '>') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= 'A') goto yy459;
-			if (yych == 'a') goto yy459;
-			goto yy358;
-		}
-	}
-yy424:
-	++p;
-	{ return 2; }
-yy426:
-	yych = *++p;
-	if (yych == 'D') goto yy460;
-	if (yych == 'd') goto yy460;
-	goto yy358;
-yy427:
-	yych = *++p;
-	if (yych == 'R') goto yy461;
-	if (yych == 'r') goto yy461;
-	goto yy358;
-yy428:
-	yych = *++p;
-	if (yych == 'I') goto yy462;
-	if (yych == 'i') goto yy462;
-	goto yy358;
-yy429:
-	yych = *++p;
-	if (yych == 'D') goto yy463;
-	if (yych == 'd') goto yy463;
-	goto yy358;
-yy430:
-	yych = *++p;
-	if (yych == 'E') goto yy464;
-	if (yych == 'e') goto yy464;
-	goto yy358;
-yy431:
-	yych = *++p;
-	if (yych == 'C') goto yy465;
-	if (yych == 'c') goto yy465;
-	goto yy358;
-yy432:
-	yych = *++p;
-	if (yych == 'Y') goto yy392;
-	if (yych == 'y') goto yy392;
-	goto yy358;
-yy433:
-	yych = *++p;
-	if (yych == 'T') goto yy466;
-	if (yych == 't') goto yy466;
-	goto yy358;
-yy434:
-	yych = *++p;
-	if (yych == 'T') goto yy467;
-	if (yych == 't') goto yy467;
-	goto yy358;
-yy435:
-	yych = *++p;
-	if (yych <= '/') {
-		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy358;
-			if (yych <= '\r') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= ' ') goto yy408;
-			if (yych <= '.') goto yy358;
-			goto yy410;
-		}
-	} else {
-		if (yych <= 'F') {
-			if (yych == '>') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= 'G') goto yy468;
-			if (yych == 'g') goto yy468;
-			goto yy358;
-		}
-	}
-yy436:
-	yych = *++p;
-	if (yych == 'A') goto yy469;
-	if (yych == 'a') goto yy469;
-	goto yy358;
-yy437:
-	yych = *++p;
-	if (yych == 'L') goto yy470;
-	if (yych == 'l') goto yy470;
-	goto yy358;
-yy438:
-	yych = *++p;
-	if (yych == 'L') goto yy471;
-	if (yych == 'l') goto yy471;
-	goto yy358;
-yy439:
-	yych = *++p;
-	if (yych <= 'U') {
-		if (yych == 'C') goto yy472;
-		if (yych <= 'T') goto yy358;
-		goto yy473;
-	} else {
-		if (yych <= 'c') {
-			if (yych <= 'b') goto yy358;
-			goto yy472;
-		} else {
-			if (yych == 'u') goto yy473;
-			goto yy358;
-		}
-	}
-yy440:
-	yych = *++p;
-	if (yych == 'M') goto yy392;
-	if (yych == 'm') goto yy392;
-	goto yy358;
-yy441:
-	yych = *++p;
-	if (yych == 'M') goto yy474;
-	if (yych == 'm') goto yy474;
-	goto yy358;
-yy442:
-	yych = *++p;
-	if (yych == 'D') goto yy475;
-	if (yych == 'd') goto yy475;
-	goto yy358;
-yy443:
-	yych = *++p;
-	if (yych == 'A') goto yy476;
-	if (yych == 'a') goto yy476;
-	goto yy358;
-yy444:
-	yych = *++p;
-	if (yych == 'E') goto yy477;
-	if (yych == 'e') goto yy477;
-	goto yy358;
-yy445:
-	yych = *++p;
-	if (yych == 'K') goto yy392;
-	if (yych == 'k') goto yy392;
-	goto yy358;
-yy446:
-	yych = *++p;
-	if (yych == 'N') goto yy392;
-	if (yych == 'n') goto yy392;
-	goto yy358;
-yy447:
-	yych = *++p;
-	if (yych == 'U') goto yy478;
-	if (yych == 'u') goto yy478;
-	goto yy358;
-yy448:
-	yych = *++p;
-	if (yych == 'R') goto yy479;
-	if (yych == 'r') goto yy479;
-	goto yy358;
-yy449:
-	yych = *++p;
-	if (yych <= 'I') {
-		if (yych == 'G') goto yy468;
-		if (yych <= 'H') goto yy358;
-		goto yy480;
-	} else {
-		if (yych <= 'g') {
-			if (yych <= 'f') goto yy358;
-			goto yy468;
-		} else {
-			if (yych == 'i') goto yy480;
-			goto yy358;
-		}
-	}
-yy450:
-	yych = *++p;
-	if (yych == 'A') goto yy440;
-	if (yych == 'a') goto yy440;
-	goto yy358;
-yy451:
-	yych = *++p;
-	if (yych <= 0x1F) {
-		if (yych <= 0x08) goto yy358;
-		if (yych <= '\r') goto yy481;
-		goto yy358;
-	} else {
-		if (yych <= ' ') goto yy481;
-		if (yych == '>') goto yy481;
-		goto yy358;
-	}
-yy452:
-	yych = *++p;
-	if (yych == 'I') goto yy483;
-	if (yych == 'i') goto yy483;
-	goto yy358;
-yy453:
-	yych = *++p;
-	if (yych == 'R') goto yy484;
-	if (yych == 'r') goto yy484;
-	goto yy358;
-yy454:
-	yych = *++p;
-	if (yych == 'L') goto yy412;
-	if (yych == 'l') goto yy412;
-	goto yy358;
-yy455:
-	yych = *++p;
-	if (yych == 'M') goto yy485;
-	if (yych == 'm') goto yy485;
-	goto yy358;
-yy456:
-	yych = *++p;
-	if (yych == 'L') goto yy463;
-	if (yych == 'l') goto yy463;
-	goto yy358;
-yy457:
-	yych = *++p;
-	if (yych == 'O') goto yy486;
-	if (yych == 'o') goto yy486;
-	goto yy358;
-yy458:
-	yych = *++p;
-	if (yych == 'A') goto yy487;
-	if (yych == 'a') goto yy487;
-	goto yy358;
-yy459:
-	yych = *++p;
-	if (yych == 'C') goto yy445;
-	if (yych == 'c') goto yy445;
-	goto yy358;
-yy460:
-	yych = *++p;
-	if (yych == 'A') goto yy488;
-	if (yych == 'a') goto yy488;
-	goto yy358;
-yy461:
-	yych = *++p;
-	if (yych == 'E') goto yy489;
-	if (yych == 'e') goto yy489;
-	goto yy358;
-yy462:
-	yych = *++p;
-	if (yych == 'C') goto yy456;
-	if (yych == 'c') goto yy456;
-	goto yy358;
-yy463:
-	yych = *++p;
-	if (yych == 'E') goto yy392;
-	if (yych == 'e') goto yy392;
-	goto yy358;
-yy464:
-	yych = *++p;
-	if (yych <= '/') {
-		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy358;
-			if (yych <= '\r') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= ' ') goto yy408;
-			if (yych <= '.') goto yy358;
-			goto yy410;
-		}
-	} else {
-		if (yych <= 'E') {
-			if (yych == '>') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= 'F') goto yy490;
-			if (yych == 'f') goto yy490;
-			goto yy358;
-		}
-	}
-yy465:
-	yych = *++p;
-	if (yych == 'K') goto yy491;
-	if (yych == 'k') goto yy491;
-	goto yy358;
-yy466:
-	yych = *++p;
-	if (yych == 'I') goto yy480;
-	if (yych == 'i') goto yy480;
-	goto yy358;
-yy467:
-	yych = *++p;
-	if (yych == 'E') goto yy492;
-	if (yych == 'e') goto yy492;
-	goto yy358;
-yy468:
-	yych = *++p;
-	if (yych == 'R') goto yy493;
-	if (yych == 'r') goto yy493;
-	goto yy358;
-yy469:
-	yych = *++p;
-	if (yych == 'I') goto yy494;
-	if (yych == 'i') goto yy494;
-	goto yy358;
-yy470:
-	yych = *++p;
-	if (yych == 'O') goto yy495;
-	if (yych == 'o') goto yy495;
-	goto yy358;
-yy471:
-	yych = *++p;
-	if (yych == 'D') goto yy496;
-	if (yych == 'd') goto yy496;
-	goto yy358;
-yy472:
-	yych = *++p;
-	if (yych == 'A') goto yy389;
-	if (yych == 'a') goto yy389;
-	goto yy358;
-yy473:
-	yych = *++p;
-	if (yych == 'R') goto yy463;
-	if (yych == 'r') goto yy463;
-	goto yy358;
-yy474:
-	yych = *++p;
-	if (yych == 'E') goto yy497;
-	if (yych == 'e') goto yy497;
-	goto yy358;
-yy475:
-	yych = *++p;
-	if (yych <= '/') {
-		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy358;
-			if (yych <= '\r') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= ' ') goto yy408;
-			if (yych <= '.') goto yy358;
-			goto yy410;
-		}
-	} else {
-		if (yych <= 'D') {
-			if (yych == '>') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= 'E') goto yy492;
-			if (yych == 'e') goto yy492;
-			goto yy358;
-		}
-	}
-yy476:
-	yych = *++p;
-	if (yych == 'M') goto yy463;
-	if (yych == 'm') goto yy463;
-	goto yy358;
-yy477:
-	yych = *++p;
-	if (yych == 'N') goto yy487;
-	if (yych == 'n') goto yy487;
-	goto yy358;
-yy478:
-	yych = *++p;
-	if (yych <= '/') {
-		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy358;
-			if (yych <= '\r') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= ' ') goto yy408;
-			if (yych <= '.') goto yy358;
-			goto yy410;
-		}
-	} else {
-		if (yych <= 'H') {
-			if (yych == '>') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= 'I') goto yy498;
-			if (yych == 'i') goto yy498;
-			goto yy358;
-		}
-	}
-yy479:
-	yych = *++p;
-	if (yych == 'A') goto yy499;
-	if (yych == 'a') goto yy499;
-	goto yy358;
-yy480:
-	yych = *++p;
-	if (yych == 'O') goto yy446;
-	if (yych == 'o') goto yy446;
-	goto yy358;
-yy481:
-	++p;
-	{ return 1; }
-yy483:
-	yych = *++p;
-	if (yych == 'P') goto yy500;
-	if (yych == 'p') goto yy500;
-	goto yy358;
-yy484:
-	yych = *++p;
-	if (yych == 'C') goto yy463;
-	if (yych == 'c') goto yy463;
-	goto yy358;
-yy485:
-	yych = *++p;
-	if (yych == 'A') goto yy501;
-	if (yych == 'a') goto yy501;
-	goto yy358;
-yy486:
-	yych = *++p;
-	if (yych == 'T') goto yy392;
-	if (yych == 't') goto yy392;
-	goto yy358;
-yy487:
-	yych = *++p;
-	if (yych == 'D') goto yy392;
-	if (yych == 'd') goto yy392;
-	goto yy358;
-yy488:
-	yych = *++p;
-	if (yych == 'T') goto yy502;
-	if (yych == 't') goto yy502;
-	goto yy358;
-yy489:
-	yych = *++p;
-	if (yych == 'S') goto yy503;
-	if (yych == 's') goto yy503;
-	goto yy358;
-yy490:
-	yych = *++p;
-	if (yych == 'O') goto yy504;
-	if (yych == 'o') goto yy504;
-	goto yy358;
-yy491:
-	yych = *++p;
-	if (yych == 'Q') goto yy505;
-	if (yych == 'q') goto yy505;
-	goto yy358;
-yy492:
-	yych = *++p;
-	if (yych == 'R') goto yy392;
-	if (yych == 'r') goto yy392;
-	goto yy358;
-yy493:
-	yych = *++p;
-	if (yych == 'O') goto yy506;
-	if (yych == 'o') goto yy506;
-	goto yy358;
-yy494:
-	yych = *++p;
-	if (yych == 'L') goto yy503;
-	if (yych == 'l') goto yy503;
-	goto yy358;
-yy495:
-	yych = *++p;
-	if (yych == 'G') goto yy392;
-	if (yych == 'g') goto yy392;
-	goto yy358;
-yy496:
-	yych = *++p;
-	if (yych == 'S') goto yy507;
-	if (yych == 's') goto yy507;
-	goto yy358;
-yy497:
-	yych = *++p;
-	if (yych <= '/') {
-		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy358;
-			if (yych <= '\r') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= ' ') goto yy408;
-			if (yych <= '.') goto yy358;
-			goto yy410;
-		}
-	} else {
-		if (yych <= 'R') {
-			if (yych == '>') goto yy408;
-			goto yy358;
-		} else {
-			if (yych <= 'S') goto yy507;
-			if (yych == 's') goto yy507;
-			goto yy358;
-		}
-	}
-yy498:
-	yych = *++p;
-	if (yych == 'T') goto yy508;
-	if (yych == 't') goto yy508;
-	goto yy358;
-yy499:
-	yych = *++p;
-	if (yych == 'M') goto yy509;
-	if (yych == 'm') goto yy509;
-	goto yy358;
-yy500:
-	yych = *++p;
-	if (yych == 'T') goto yy451;
-	if (yych == 't') goto yy451;
-	goto yy358;
-yy501:
-	yych = *++p;
-	if (yych == 'R') goto yy432;
-	if (yych == 'r') goto yy432;
-	goto yy358;
-yy502:
-	yych = *++p;
-	if (yych == 'A') goto yy510;
-	if (yych == 'a') goto yy510;
-	goto yy358;
-yy503:
-	yych = *++p;
-	if (yych == 'S') goto yy392;
-	if (yych == 's') goto yy392;
-	goto yy358;
-yy504:
-	yych = *++p;
-	if (yych == 'N') goto yy486;
-	if (yych == 'n') goto yy486;
-	goto yy358;
-yy505:
-	yych = *++p;
-	if (yych == 'U') goto yy511;
-	if (yych == 'u') goto yy511;
-	goto yy358;
-yy506:
-	yych = *++p;
-	if (yych == 'U') goto yy512;
-	if (yych == 'u') goto yy512;
-	goto yy358;
-yy507:
-	yych = *++p;
-	if (yych == 'E') goto yy486;
-	if (yych == 'e') goto yy486;
-	goto yy358;
-yy508:
-	yych = *++p;
-	if (yych == 'E') goto yy440;
-	if (yych == 'e') goto yy440;
-	goto yy358;
-yy509:
-	yych = *++p;
-	if (yych == 'E') goto yy503;
-	if (yych == 'e') goto yy503;
-	goto yy358;
-yy510:
-	yych = *++p;
-	if (yych == '[') goto yy513;
-	goto yy358;
-yy511:
-	yych = *++p;
-	if (yych == 'O') goto yy515;
-	if (yych == 'o') goto yy515;
-	goto yy358;
-yy512:
-	yych = *++p;
-	if (yych == 'P') goto yy392;
-	if (yych == 'p') goto yy392;
-	goto yy358;
-yy513:
-	++p;
-	{ return 5; }
-yy515:
-	yych = *++p;
-	if (yych == 'T') goto yy463;
-	if (yych == 't') goto yy463;
-	goto yy358;
-}
-
-}
-
-// Try to match an HTML block tag start line of type 7, returning
-// 7 if successful, 0 if not.
-bufsize_t _scan_html_block_start_7(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-
-{
-	unsigned char yych;
-	unsigned int yyaccept = 0;
-	static const unsigned char yybm[] = {
-		  0, 224, 224, 224, 224, 224, 224, 224, 
-		224, 198, 210, 194, 198, 194, 224, 224, 
-		224, 224, 224, 224, 224, 224, 224, 224, 
-		224, 224, 224, 224, 224, 224, 224, 224, 
-		198, 224, 128, 224, 224, 224, 224,  64, 
-		224, 224, 224, 224, 224, 233, 232, 224, 
-		233, 233, 233, 233, 233, 233, 233, 233, 
-		233, 233, 232, 224, 192, 192, 192, 224, 
-		224, 233, 233, 233, 233, 233, 233, 233, 
-		233, 233, 233, 233, 233, 233, 233, 233, 
-		233, 233, 233, 233, 233, 233, 233, 233, 
-		233, 233, 233, 224, 224, 224, 224, 232, 
-		192, 233, 233, 233, 233, 233, 233, 233, 
-		233, 233, 233, 233, 233, 233, 233, 233, 
-		233, 233, 233, 233, 233, 233, 233, 233, 
-		233, 233, 233, 224, 224, 224, 224, 224, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych == '<') goto yy520;
-	++p;
-yy519:
-	{ return 0; }
-yy520:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= '@') {
-		if (yych != '/') goto yy519;
-	} else {
-		if (yych <= 'Z') goto yy523;
-		if (yych <= '`') goto yy519;
-		if (yych <= 'z') goto yy523;
-		goto yy519;
-	}
-	yych = *++p;
-	if (yych <= '@') goto yy522;
-	if (yych <= 'Z') goto yy525;
-	if (yych <= '`') goto yy522;
-	if (yych <= 'z') goto yy525;
-yy522:
-	p = marker;
-	if (yyaccept == 0) {
-		goto yy519;
-	} else {
-		goto yy538;
-	}
-yy523:
-	yych = *++p;
-	if (yybm[0+yych] & 2) {
-		goto yy527;
-	}
-	if (yych <= '=') {
-		if (yych <= '.') {
-			if (yych == '-') goto yy523;
-			goto yy522;
-		} else {
-			if (yych <= '/') goto yy529;
-			if (yych <= '9') goto yy523;
-			goto yy522;
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '>') goto yy530;
-			if (yych <= '@') goto yy522;
-			goto yy523;
-		} else {
-			if (yych <= '`') goto yy522;
-			if (yych <= 'z') goto yy523;
-			goto yy522;
-		}
-	}
-yy525:
-	yych = *++p;
-	if (yych <= '/') {
-		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy522;
-			if (yych <= '\r') goto yy532;
-			goto yy522;
-		} else {
-			if (yych <= ' ') goto yy532;
-			if (yych == '-') goto yy525;
-			goto yy522;
-		}
-	} else {
-		if (yych <= '@') {
-			if (yych <= '9') goto yy525;
-			if (yych == '>') goto yy530;
-			goto yy522;
-		} else {
-			if (yych <= 'Z') goto yy525;
-			if (yych <= '`') goto yy522;
-			if (yych <= 'z') goto yy525;
-			goto yy522;
-		}
-	}
-yy527:
-	yych = *++p;
-	if (yybm[0+yych] & 2) {
-		goto yy527;
-	}
-	if (yych <= '>') {
-		if (yych <= '9') {
-			if (yych != '/') goto yy522;
-		} else {
-			if (yych <= ':') goto yy534;
-			if (yych <= '=') goto yy522;
-			goto yy530;
-		}
-	} else {
-		if (yych <= '^') {
-			if (yych <= '@') goto yy522;
-			if (yych <= 'Z') goto yy534;
-			goto yy522;
-		} else {
-			if (yych == '`') goto yy522;
-			if (yych <= 'z') goto yy534;
-			goto yy522;
-		}
-	}
-yy529:
-	yych = *++p;
-	if (yych != '>') goto yy522;
-yy530:
-	yych = *++p;
-	if (yybm[0+yych] & 4) {
-		goto yy530;
-	}
-	if (yych <= 0x08) goto yy522;
-	if (yych <= '\n') goto yy536;
-	if (yych <= '\v') goto yy522;
-	if (yych <= '\r') goto yy539;
-	goto yy522;
-yy532:
-	yych = *++p;
-	if (yych <= 0x1F) {
-		if (yych <= 0x08) goto yy522;
-		if (yych <= '\r') goto yy532;
-		goto yy522;
-	} else {
-		if (yych <= ' ') goto yy532;
-		if (yych == '>') goto yy530;
-		goto yy522;
-	}
-yy534:
-	yych = *++p;
-	if (yybm[0+yych] & 8) {
-		goto yy534;
-	}
-	if (yych <= ',') {
-		if (yych <= '\r') {
-			if (yych <= 0x08) goto yy522;
-			goto yy540;
-		} else {
-			if (yych == ' ') goto yy540;
-			goto yy522;
-		}
-	} else {
-		if (yych <= '<') {
-			if (yych <= '/') goto yy529;
-			goto yy522;
-		} else {
-			if (yych <= '=') goto yy542;
-			if (yych <= '>') goto yy530;
-			goto yy522;
-		}
-	}
-yy536:
-	yyaccept = 1;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 4) {
-		goto yy530;
-	}
-	if (yych <= 0x08) goto yy538;
-	if (yych <= '\n') goto yy536;
-	if (yych <= '\v') goto yy538;
-	if (yych <= '\r') goto yy539;
-yy538:
-	{ return 7; }
-yy539:
-	++p;
-	goto yy538;
-yy540:
-	yych = *++p;
-	if (yych <= '<') {
-		if (yych <= ' ') {
-			if (yych <= 0x08) goto yy522;
-			if (yych <= '\r') goto yy540;
-			if (yych <= 0x1F) goto yy522;
-			goto yy540;
-		} else {
-			if (yych <= '/') {
-				if (yych <= '.') goto yy522;
-				goto yy529;
-			} else {
-				if (yych == ':') goto yy534;
-				goto yy522;
-			}
-		}
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '=') goto yy542;
-			if (yych <= '>') goto yy530;
-			if (yych <= '@') goto yy522;
-			goto yy534;
-		} else {
-			if (yych <= '_') {
-				if (yych <= '^') goto yy522;
-				goto yy534;
-			} else {
-				if (yych <= '`') goto yy522;
-				if (yych <= 'z') goto yy534;
-				goto yy522;
-			}
-		}
-	}
-yy542:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy544;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '"') {
-			if (yych <= 0x00) goto yy522;
-			if (yych <= ' ') goto yy542;
-			goto yy546;
-		} else {
-			if (yych <= '\'') goto yy548;
-			if (yych <= 0xC1) goto yy522;
-			if (yych <= 0xDF) goto yy550;
-			goto yy551;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy553;
-			goto yy552;
-		} else {
-			if (yych <= 0xF0) goto yy554;
-			if (yych <= 0xF3) goto yy555;
-			if (yych <= 0xF4) goto yy556;
-			goto yy522;
-		}
-	}
-yy544:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy544;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '=') {
-			if (yych <= 0x00) goto yy522;
-			if (yych <= ' ') goto yy527;
-			goto yy522;
-		} else {
-			if (yych <= '>') goto yy530;
-			if (yych <= 0xC1) goto yy522;
-			if (yych <= 0xDF) goto yy550;
-			goto yy551;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy553;
-			goto yy552;
-		} else {
-			if (yych <= 0xF0) goto yy554;
-			if (yych <= 0xF3) goto yy555;
-			if (yych <= 0xF4) goto yy556;
-			goto yy522;
-		}
-	}
-yy546:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy546;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy522;
-			if (yych <= '"') goto yy557;
-			goto yy522;
-		} else {
-			if (yych <= 0xDF) goto yy558;
-			if (yych <= 0xE0) goto yy559;
-			goto yy560;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy561;
-			if (yych <= 0xEF) goto yy560;
-			goto yy562;
-		} else {
-			if (yych <= 0xF3) goto yy563;
-			if (yych <= 0xF4) goto yy564;
-			goto yy522;
-		}
-	}
-yy548:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy548;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy522;
-			if (yych <= '\'') goto yy557;
-			goto yy522;
-		} else {
-			if (yych <= 0xDF) goto yy565;
-			if (yych <= 0xE0) goto yy566;
-			goto yy567;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy568;
-			if (yych <= 0xEF) goto yy567;
-			goto yy569;
-		} else {
-			if (yych <= 0xF3) goto yy570;
-			if (yych <= 0xF4) goto yy571;
-			goto yy522;
-		}
-	}
-yy550:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0xBF) goto yy544;
-	goto yy522;
-yy551:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy522;
-	if (yych <= 0xBF) goto yy550;
-	goto yy522;
-yy552:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0xBF) goto yy550;
-	goto yy522;
-yy553:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0x9F) goto yy550;
-	goto yy522;
-yy554:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy522;
-	if (yych <= 0xBF) goto yy552;
-	goto yy522;
-yy555:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0xBF) goto yy552;
-	goto yy522;
-yy556:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0x8F) goto yy552;
-	goto yy522;
-yy557:
-	yych = *++p;
-	if (yybm[0+yych] & 2) {
-		goto yy527;
-	}
-	if (yych == '/') goto yy529;
-	if (yych == '>') goto yy530;
-	goto yy522;
-yy558:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0xBF) goto yy546;
-	goto yy522;
-yy559:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy522;
-	if (yych <= 0xBF) goto yy558;
-	goto yy522;
-yy560:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0xBF) goto yy558;
-	goto yy522;
-yy561:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0x9F) goto yy558;
-	goto yy522;
-yy562:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy522;
-	if (yych <= 0xBF) goto yy560;
-	goto yy522;
-yy563:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0xBF) goto yy560;
-	goto yy522;
-yy564:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0x8F) goto yy560;
-	goto yy522;
-yy565:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0xBF) goto yy548;
-	goto yy522;
-yy566:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy522;
-	if (yych <= 0xBF) goto yy565;
-	goto yy522;
-yy567:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0xBF) goto yy565;
-	goto yy522;
-yy568:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0x9F) goto yy565;
-	goto yy522;
-yy569:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy522;
-	if (yych <= 0xBF) goto yy567;
-	goto yy522;
-yy570:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0xBF) goto yy567;
-	goto yy522;
-yy571:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy522;
-	if (yych <= 0x8F) goto yy567;
-	goto yy522;
-}
-
-}
-
-// Try to match an HTML block end line of type 1
-bufsize_t _scan_html_block_end_1(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	unsigned int yyaccept = 0;
-	static const unsigned char yybm[] = {
-		  0,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,   0,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64, 128,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych <= 0xDF) {
-		if (yych <= ';') {
-			if (yych <= 0x00) goto yy574;
-			if (yych != '\n') goto yy576;
-		} else {
-			if (yych <= '<') goto yy577;
-			if (yych <= 0x7F) goto yy576;
-			if (yych >= 0xC2) goto yy578;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych <= 0xE0) goto yy579;
-			if (yych == 0xED) goto yy581;
-			goto yy580;
-		} else {
-			if (yych <= 0xF0) goto yy582;
-			if (yych <= 0xF3) goto yy583;
-			if (yych <= 0xF4) goto yy584;
-		}
-	}
-yy574:
-	++p;
-yy575:
-	{ return 0; }
-yy576:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= '\n') {
-		if (yych <= 0x00) goto yy575;
-		if (yych <= '\t') goto yy586;
-		goto yy575;
-	} else {
-		if (yych <= 0x7F) goto yy586;
-		if (yych <= 0xC1) goto yy575;
-		if (yych <= 0xF4) goto yy586;
-		goto yy575;
-	}
-yy577:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= '.') {
-		if (yych <= 0x00) goto yy575;
-		if (yych == '\n') goto yy575;
-		goto yy586;
-	} else {
-		if (yych <= 0x7F) {
-			if (yych <= '/') goto yy597;
-			goto yy586;
-		} else {
-			if (yych <= 0xC1) goto yy575;
-			if (yych <= 0xF4) goto yy586;
-			goto yy575;
-		}
-	}
-yy578:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy575;
-	if (yych <= 0xBF) goto yy585;
-	goto yy575;
-yy579:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x9F) goto yy575;
-	if (yych <= 0xBF) goto yy590;
-	goto yy575;
-yy580:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy575;
-	if (yych <= 0xBF) goto yy590;
-	goto yy575;
-yy581:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy575;
-	if (yych <= 0x9F) goto yy590;
-	goto yy575;
-yy582:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x8F) goto yy575;
-	if (yych <= 0xBF) goto yy592;
-	goto yy575;
-yy583:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy575;
-	if (yych <= 0xBF) goto yy592;
-	goto yy575;
-yy584:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy575;
-	if (yych <= 0x8F) goto yy592;
-	goto yy575;
-yy585:
-	yych = *++p;
-yy586:
-	if (yybm[0+yych] & 64) {
-		goto yy585;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy587;
-			if (yych <= '<') goto yy588;
-		} else {
-			if (yych <= 0xDF) goto yy590;
-			if (yych <= 0xE0) goto yy591;
-			goto yy592;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy593;
-			if (yych <= 0xEF) goto yy592;
-			goto yy594;
-		} else {
-			if (yych <= 0xF3) goto yy595;
-			if (yych <= 0xF4) goto yy596;
-		}
-	}
-yy587:
-	p = marker;
-	if (yyaccept == 0) {
-		goto yy575;
-	} else {
-		goto yy607;
-	}
-yy588:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy588;
-	}
-	if (yych <= 0xDF) {
-		if (yych <= '.') {
-			if (yych <= 0x00) goto yy587;
-			if (yych == '\n') goto yy587;
-			goto yy585;
-		} else {
-			if (yych <= '/') goto yy597;
-			if (yych <= 0x7F) goto yy585;
-			if (yych <= 0xC1) goto yy587;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych <= 0xE0) goto yy591;
-			if (yych == 0xED) goto yy593;
-			goto yy592;
-		} else {
-			if (yych <= 0xF0) goto yy594;
-			if (yych <= 0xF3) goto yy595;
-			if (yych <= 0xF4) goto yy596;
-			goto yy587;
-		}
-	}
-yy590:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy587;
-	if (yych <= 0xBF) goto yy585;
-	goto yy587;
-yy591:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy587;
-	if (yych <= 0xBF) goto yy590;
-	goto yy587;
-yy592:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy587;
-	if (yych <= 0xBF) goto yy590;
-	goto yy587;
-yy593:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy587;
-	if (yych <= 0x9F) goto yy590;
-	goto yy587;
-yy594:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy587;
-	if (yych <= 0xBF) goto yy592;
-	goto yy587;
-yy595:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy587;
-	if (yych <= 0xBF) goto yy592;
-	goto yy587;
-yy596:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy587;
-	if (yych <= 0x8F) goto yy592;
-	goto yy587;
-yy597:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy588;
-	}
-	if (yych <= 's') {
-		if (yych <= 'P') {
-			if (yych <= '\t') {
-				if (yych <= 0x00) goto yy587;
-				goto yy585;
-			} else {
-				if (yych <= '\n') goto yy587;
-				if (yych <= 'O') goto yy585;
-			}
-		} else {
-			if (yych <= 'o') {
-				if (yych == 'S') goto yy599;
-				goto yy585;
-			} else {
-				if (yych <= 'p') goto yy598;
-				if (yych <= 'r') goto yy585;
-				goto yy599;
-			}
-		}
-	} else {
-		if (yych <= 0xEC) {
-			if (yych <= 0xC1) {
-				if (yych <= 0x7F) goto yy585;
-				goto yy587;
-			} else {
-				if (yych <= 0xDF) goto yy590;
-				if (yych <= 0xE0) goto yy591;
-				goto yy592;
-			}
-		} else {
-			if (yych <= 0xF0) {
-				if (yych <= 0xED) goto yy593;
-				if (yych <= 0xEF) goto yy592;
-				goto yy594;
-			} else {
-				if (yych <= 0xF3) goto yy595;
-				if (yych <= 0xF4) goto yy596;
-				goto yy587;
-			}
-		}
-	}
-yy598:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy588;
-	}
-	if (yych <= 0xC1) {
-		if (yych <= 'Q') {
-			if (yych <= 0x00) goto yy587;
-			if (yych == '\n') goto yy587;
-			goto yy585;
-		} else {
-			if (yych <= 'q') {
-				if (yych <= 'R') goto yy600;
-				goto yy585;
-			} else {
-				if (yych <= 'r') goto yy600;
-				if (yych <= 0x7F) goto yy585;
-				goto yy587;
-			}
-		}
-	} else {
-		if (yych <= 0xED) {
-			if (yych <= 0xDF) goto yy590;
-			if (yych <= 0xE0) goto yy591;
-			if (yych <= 0xEC) goto yy592;
-			goto yy593;
-		} else {
-			if (yych <= 0xF0) {
-				if (yych <= 0xEF) goto yy592;
-				goto yy594;
-			} else {
-				if (yych <= 0xF3) goto yy595;
-				if (yych <= 0xF4) goto yy596;
-				goto yy587;
-			}
-		}
-	}
-yy599:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy588;
-	}
-	if (yych <= 't') {
-		if (yych <= 'C') {
-			if (yych <= '\t') {
-				if (yych <= 0x00) goto yy587;
-				goto yy585;
-			} else {
-				if (yych <= '\n') goto yy587;
-				if (yych <= 'B') goto yy585;
-				goto yy601;
-			}
-		} else {
-			if (yych <= 'b') {
-				if (yych == 'T') goto yy602;
-				goto yy585;
-			} else {
-				if (yych <= 'c') goto yy601;
-				if (yych <= 's') goto yy585;
-				goto yy602;
-			}
-		}
-	} else {
-		if (yych <= 0xEC) {
-			if (yych <= 0xC1) {
-				if (yych <= 0x7F) goto yy585;
-				goto yy587;
-			} else {
-				if (yych <= 0xDF) goto yy590;
-				if (yych <= 0xE0) goto yy591;
-				goto yy592;
-			}
-		} else {
-			if (yych <= 0xF0) {
-				if (yych <= 0xED) goto yy593;
-				if (yych <= 0xEF) goto yy592;
-				goto yy594;
-			} else {
-				if (yych <= 0xF3) goto yy595;
-				if (yych <= 0xF4) goto yy596;
-				goto yy587;
-			}
-		}
-	}
-yy600:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy588;
-	}
-	if (yych <= 0xC1) {
-		if (yych <= 'D') {
-			if (yych <= 0x00) goto yy587;
-			if (yych == '\n') goto yy587;
-			goto yy585;
-		} else {
-			if (yych <= 'd') {
-				if (yych <= 'E') goto yy603;
-				goto yy585;
-			} else {
-				if (yych <= 'e') goto yy603;
-				if (yych <= 0x7F) goto yy585;
-				goto yy587;
-			}
-		}
-	} else {
-		if (yych <= 0xED) {
-			if (yych <= 0xDF) goto yy590;
-			if (yych <= 0xE0) goto yy591;
-			if (yych <= 0xEC) goto yy592;
-			goto yy593;
-		} else {
-			if (yych <= 0xF0) {
-				if (yych <= 0xEF) goto yy592;
-				goto yy594;
-			} else {
-				if (yych <= 0xF3) goto yy595;
-				if (yych <= 0xF4) goto yy596;
-				goto yy587;
-			}
-		}
-	}
-yy601:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy588;
-	}
-	if (yych <= 0xC1) {
-		if (yych <= 'Q') {
-			if (yych <= 0x00) goto yy587;
-			if (yych == '\n') goto yy587;
-			goto yy585;
-		} else {
-			if (yych <= 'q') {
-				if (yych <= 'R') goto yy604;
-				goto yy585;
-			} else {
-				if (yych <= 'r') goto yy604;
-				if (yych <= 0x7F) goto yy585;
-				goto yy587;
-			}
-		}
-	} else {
-		if (yych <= 0xED) {
-			if (yych <= 0xDF) goto yy590;
-			if (yych <= 0xE0) goto yy591;
-			if (yych <= 0xEC) goto yy592;
-			goto yy593;
-		} else {
-			if (yych <= 0xF0) {
-				if (yych <= 0xEF) goto yy592;
-				goto yy594;
-			} else {
-				if (yych <= 0xF3) goto yy595;
-				if (yych <= 0xF4) goto yy596;
-				goto yy587;
-			}
-		}
-	}
-yy602:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy588;
-	}
-	if (yych <= 0xC1) {
-		if (yych <= 'X') {
-			if (yych <= 0x00) goto yy587;
-			if (yych == '\n') goto yy587;
-			goto yy585;
-		} else {
-			if (yych <= 'x') {
-				if (yych <= 'Y') goto yy605;
-				goto yy585;
-			} else {
-				if (yych <= 'y') goto yy605;
-				if (yych <= 0x7F) goto yy585;
-				goto yy587;
-			}
-		}
-	} else {
-		if (yych <= 0xED) {
-			if (yych <= 0xDF) goto yy590;
-			if (yych <= 0xE0) goto yy591;
-			if (yych <= 0xEC) goto yy592;
-			goto yy593;
-		} else {
-			if (yych <= 0xF0) {
-				if (yych <= 0xEF) goto yy592;
-				goto yy594;
-			} else {
-				if (yych <= 0xF3) goto yy595;
-				if (yych <= 0xF4) goto yy596;
-				goto yy587;
-			}
-		}
-	}
-yy603:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy588;
-	}
-	if (yych <= 0xDF) {
-		if (yych <= '=') {
-			if (yych <= 0x00) goto yy587;
-			if (yych == '\n') goto yy587;
-			goto yy585;
-		} else {
-			if (yych <= '>') goto yy606;
-			if (yych <= 0x7F) goto yy585;
-			if (yych <= 0xC1) goto yy587;
-			goto yy590;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych <= 0xE0) goto yy591;
-			if (yych == 0xED) goto yy593;
-			goto yy592;
-		} else {
-			if (yych <= 0xF0) goto yy594;
-			if (yych <= 0xF3) goto yy595;
-			if (yych <= 0xF4) goto yy596;
-			goto yy587;
-		}
-	}
-yy604:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy588;
-	}
-	if (yych <= 0xC1) {
-		if (yych <= 'H') {
-			if (yych <= 0x00) goto yy587;
-			if (yych == '\n') goto yy587;
-			goto yy585;
-		} else {
-			if (yych <= 'h') {
-				if (yych <= 'I') goto yy608;
-				goto yy585;
-			} else {
-				if (yych <= 'i') goto yy608;
-				if (yych <= 0x7F) goto yy585;
-				goto yy587;
-			}
-		}
-	} else {
-		if (yych <= 0xED) {
-			if (yych <= 0xDF) goto yy590;
-			if (yych <= 0xE0) goto yy591;
-			if (yych <= 0xEC) goto yy592;
-			goto yy593;
-		} else {
-			if (yych <= 0xF0) {
-				if (yych <= 0xEF) goto yy592;
-				goto yy594;
-			} else {
-				if (yych <= 0xF3) goto yy595;
-				if (yych <= 0xF4) goto yy596;
-				goto yy587;
-			}
-		}
-	}
-yy605:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy588;
-	}
-	if (yych <= 0xC1) {
-		if (yych <= 'K') {
-			if (yych <= 0x00) goto yy587;
-			if (yych == '\n') goto yy587;
-			goto yy585;
-		} else {
-			if (yych <= 'k') {
-				if (yych <= 'L') goto yy600;
-				goto yy585;
-			} else {
-				if (yych <= 'l') goto yy600;
-				if (yych <= 0x7F) goto yy585;
-				goto yy587;
-			}
-		}
-	} else {
-		if (yych <= 0xED) {
-			if (yych <= 0xDF) goto yy590;
-			if (yych <= 0xE0) goto yy591;
-			if (yych <= 0xEC) goto yy592;
-			goto yy593;
-		} else {
-			if (yych <= 0xF0) {
-				if (yych <= 0xEF) goto yy592;
-				goto yy594;
-			} else {
-				if (yych <= 0xF3) goto yy595;
-				if (yych <= 0xF4) goto yy596;
-				goto yy587;
-			}
-		}
-	}
-yy606:
-	yyaccept = 1;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 64) {
-		goto yy585;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy607;
-			if (yych <= '<') goto yy588;
-		} else {
-			if (yych <= 0xDF) goto yy590;
-			if (yych <= 0xE0) goto yy591;
-			goto yy592;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy593;
-			if (yych <= 0xEF) goto yy592;
-			goto yy594;
-		} else {
-			if (yych <= 0xF3) goto yy595;
-			if (yych <= 0xF4) goto yy596;
-		}
-	}
-yy607:
-	{ return (bufsize_t)(p - start); }
-yy608:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy588;
-	}
-	if (yych <= 0xC1) {
-		if (yych <= 'O') {
-			if (yych <= 0x00) goto yy587;
-			if (yych == '\n') goto yy587;
-			goto yy585;
-		} else {
-			if (yych <= 'o') {
-				if (yych >= 'Q') goto yy585;
-			} else {
-				if (yych <= 'p') goto yy609;
-				if (yych <= 0x7F) goto yy585;
-				goto yy587;
-			}
-		}
-	} else {
-		if (yych <= 0xED) {
-			if (yych <= 0xDF) goto yy590;
-			if (yych <= 0xE0) goto yy591;
-			if (yych <= 0xEC) goto yy592;
-			goto yy593;
-		} else {
-			if (yych <= 0xF0) {
-				if (yych <= 0xEF) goto yy592;
-				goto yy594;
-			} else {
-				if (yych <= 0xF3) goto yy595;
-				if (yych <= 0xF4) goto yy596;
-				goto yy587;
-			}
-		}
-	}
-yy609:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy588;
-	}
-	if (yych <= 0xC1) {
-		if (yych <= 'S') {
-			if (yych <= 0x00) goto yy587;
-			if (yych == '\n') goto yy587;
-			goto yy585;
-		} else {
-			if (yych <= 's') {
-				if (yych <= 'T') goto yy603;
-				goto yy585;
-			} else {
-				if (yych <= 't') goto yy603;
-				if (yych <= 0x7F) goto yy585;
-				goto yy587;
-			}
-		}
-	} else {
-		if (yych <= 0xED) {
-			if (yych <= 0xDF) goto yy590;
-			if (yych <= 0xE0) goto yy591;
-			if (yych <= 0xEC) goto yy592;
-			goto yy593;
-		} else {
-			if (yych <= 0xF0) {
-				if (yych <= 0xEF) goto yy592;
-				goto yy594;
-			} else {
-				if (yych <= 0xF3) goto yy595;
-				if (yych <= 0xF4) goto yy596;
-				goto yy587;
-			}
-		}
-	}
-}
-
-}
-
-// Try to match an HTML block end line of type 2
-bufsize_t _scan_html_block_end_2(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	unsigned int yyaccept = 0;
-	static const unsigned char yybm[] = {
-		  0,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,   0,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64, 128,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych <= 0xDF) {
-		if (yych <= ',') {
-			if (yych <= 0x00) goto yy612;
-			if (yych != '\n') goto yy614;
-		} else {
-			if (yych <= '-') goto yy615;
-			if (yych <= 0x7F) goto yy614;
-			if (yych >= 0xC2) goto yy616;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych <= 0xE0) goto yy617;
-			if (yych == 0xED) goto yy619;
-			goto yy618;
-		} else {
-			if (yych <= 0xF0) goto yy620;
-			if (yych <= 0xF3) goto yy621;
-			if (yych <= 0xF4) goto yy622;
-		}
-	}
-yy612:
-	++p;
-yy613:
-	{ return 0; }
-yy614:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= '\n') {
-		if (yych <= 0x00) goto yy613;
-		if (yych <= '\t') goto yy624;
-		goto yy613;
-	} else {
-		if (yych <= 0x7F) goto yy624;
-		if (yych <= 0xC1) goto yy613;
-		if (yych <= 0xF4) goto yy624;
-		goto yy613;
-	}
-yy615:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 128) {
-		goto yy634;
-	}
-	if (yych <= '\n') {
-		if (yych <= 0x00) goto yy613;
-		if (yych <= '\t') goto yy624;
-		goto yy613;
-	} else {
-		if (yych <= 0x7F) goto yy624;
-		if (yych <= 0xC1) goto yy613;
-		if (yych <= 0xF4) goto yy624;
-		goto yy613;
-	}
-yy616:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy613;
-	if (yych <= 0xBF) goto yy623;
-	goto yy613;
-yy617:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x9F) goto yy613;
-	if (yych <= 0xBF) goto yy627;
-	goto yy613;
-yy618:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy613;
-	if (yych <= 0xBF) goto yy627;
-	goto yy613;
-yy619:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy613;
-	if (yych <= 0x9F) goto yy627;
-	goto yy613;
-yy620:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x8F) goto yy613;
-	if (yych <= 0xBF) goto yy629;
-	goto yy613;
-yy621:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy613;
-	if (yych <= 0xBF) goto yy629;
-	goto yy613;
-yy622:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy613;
-	if (yych <= 0x8F) goto yy629;
-	goto yy613;
-yy623:
-	yych = *++p;
-yy624:
-	if (yybm[0+yych] & 64) {
-		goto yy623;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy625;
-			if (yych <= '-') goto yy626;
-		} else {
-			if (yych <= 0xDF) goto yy627;
-			if (yych <= 0xE0) goto yy628;
-			goto yy629;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy630;
-			if (yych <= 0xEF) goto yy629;
-			goto yy631;
-		} else {
-			if (yych <= 0xF3) goto yy632;
-			if (yych <= 0xF4) goto yy633;
-		}
-	}
-yy625:
-	p = marker;
-	if (yyaccept == 0) {
-		goto yy613;
-	} else {
-		goto yy637;
-	}
-yy626:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy623;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy625;
-			if (yych <= '-') goto yy634;
-			goto yy625;
-		} else {
-			if (yych <= 0xDF) goto yy627;
-			if (yych <= 0xE0) goto yy628;
-			goto yy629;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy630;
-			if (yych <= 0xEF) goto yy629;
-			goto yy631;
-		} else {
-			if (yych <= 0xF3) goto yy632;
-			if (yych <= 0xF4) goto yy633;
-			goto yy625;
-		}
-	}
-yy627:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy625;
-	if (yych <= 0xBF) goto yy623;
-	goto yy625;
-yy628:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy625;
-	if (yych <= 0xBF) goto yy627;
-	goto yy625;
-yy629:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy625;
-	if (yych <= 0xBF) goto yy627;
-	goto yy625;
-yy630:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy625;
-	if (yych <= 0x9F) goto yy627;
-	goto yy625;
-yy631:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy625;
-	if (yych <= 0xBF) goto yy629;
-	goto yy625;
-yy632:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy625;
-	if (yych <= 0xBF) goto yy629;
-	goto yy625;
-yy633:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy625;
-	if (yych <= 0x8F) goto yy629;
-	goto yy625;
-yy634:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy634;
-	}
-	if (yych <= 0xDF) {
-		if (yych <= '=') {
-			if (yych <= 0x00) goto yy625;
-			if (yych == '\n') goto yy625;
-			goto yy623;
-		} else {
-			if (yych <= '>') goto yy636;
-			if (yych <= 0x7F) goto yy623;
-			if (yych <= 0xC1) goto yy625;
-			goto yy627;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych <= 0xE0) goto yy628;
-			if (yych == 0xED) goto yy630;
-			goto yy629;
-		} else {
-			if (yych <= 0xF0) goto yy631;
-			if (yych <= 0xF3) goto yy632;
-			if (yych <= 0xF4) goto yy633;
-			goto yy625;
-		}
-	}
-yy636:
-	yyaccept = 1;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 64) {
-		goto yy623;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy637;
-			if (yych <= '-') goto yy626;
-		} else {
-			if (yych <= 0xDF) goto yy627;
-			if (yych <= 0xE0) goto yy628;
-			goto yy629;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy630;
-			if (yych <= 0xEF) goto yy629;
-			goto yy631;
-		} else {
-			if (yych <= 0xF3) goto yy632;
-			if (yych <= 0xF4) goto yy633;
-		}
-	}
-yy637:
-	{ return (bufsize_t)(p - start); }
-}
-
-}
-
-// Try to match an HTML block end line of type 3
-bufsize_t _scan_html_block_end_3(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	unsigned int yyaccept = 0;
-	static const unsigned char yybm[] = {
-		  0,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,   0,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64, 128, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych <= 0xDF) {
-		if (yych <= '>') {
-			if (yych <= 0x00) goto yy640;
-			if (yych != '\n') goto yy642;
-		} else {
-			if (yych <= '?') goto yy643;
-			if (yych <= 0x7F) goto yy642;
-			if (yych >= 0xC2) goto yy644;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych <= 0xE0) goto yy645;
-			if (yych == 0xED) goto yy647;
-			goto yy646;
-		} else {
-			if (yych <= 0xF0) goto yy648;
-			if (yych <= 0xF3) goto yy649;
-			if (yych <= 0xF4) goto yy650;
-		}
-	}
-yy640:
-	++p;
-yy641:
-	{ return 0; }
-yy642:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= '\n') {
-		if (yych <= 0x00) goto yy641;
-		if (yych <= '\t') goto yy652;
-		goto yy641;
-	} else {
-		if (yych <= 0x7F) goto yy652;
-		if (yych <= 0xC1) goto yy641;
-		if (yych <= 0xF4) goto yy652;
-		goto yy641;
-	}
-yy643:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= '=') {
-		if (yych <= 0x00) goto yy641;
-		if (yych == '\n') goto yy641;
-		goto yy652;
-	} else {
-		if (yych <= 0x7F) {
-			if (yych <= '>') goto yy663;
-			goto yy652;
-		} else {
-			if (yych <= 0xC1) goto yy641;
-			if (yych <= 0xF4) goto yy652;
-			goto yy641;
-		}
-	}
-yy644:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy641;
-	if (yych <= 0xBF) goto yy651;
-	goto yy641;
-yy645:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x9F) goto yy641;
-	if (yych <= 0xBF) goto yy656;
-	goto yy641;
-yy646:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy641;
-	if (yych <= 0xBF) goto yy656;
-	goto yy641;
-yy647:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy641;
-	if (yych <= 0x9F) goto yy656;
-	goto yy641;
-yy648:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x8F) goto yy641;
-	if (yych <= 0xBF) goto yy658;
-	goto yy641;
-yy649:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy641;
-	if (yych <= 0xBF) goto yy658;
-	goto yy641;
-yy650:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy641;
-	if (yych <= 0x8F) goto yy658;
-	goto yy641;
-yy651:
-	yych = *++p;
-yy652:
-	if (yybm[0+yych] & 64) {
-		goto yy651;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy653;
-			if (yych <= '?') goto yy654;
-		} else {
-			if (yych <= 0xDF) goto yy656;
-			if (yych <= 0xE0) goto yy657;
-			goto yy658;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy659;
-			if (yych <= 0xEF) goto yy658;
-			goto yy660;
-		} else {
-			if (yych <= 0xF3) goto yy661;
-			if (yych <= 0xF4) goto yy662;
-		}
-	}
-yy653:
-	p = marker;
-	if (yyaccept == 0) {
-		goto yy641;
-	} else {
-		goto yy664;
-	}
-yy654:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy654;
-	}
-	if (yych <= 0xDF) {
-		if (yych <= '=') {
-			if (yych <= 0x00) goto yy653;
-			if (yych == '\n') goto yy653;
-			goto yy651;
-		} else {
-			if (yych <= '>') goto yy663;
-			if (yych <= 0x7F) goto yy651;
-			if (yych <= 0xC1) goto yy653;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych <= 0xE0) goto yy657;
-			if (yych == 0xED) goto yy659;
-			goto yy658;
-		} else {
-			if (yych <= 0xF0) goto yy660;
-			if (yych <= 0xF3) goto yy661;
-			if (yych <= 0xF4) goto yy662;
-			goto yy653;
-		}
-	}
-yy656:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy653;
-	if (yych <= 0xBF) goto yy651;
-	goto yy653;
-yy657:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy653;
-	if (yych <= 0xBF) goto yy656;
-	goto yy653;
-yy658:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy653;
-	if (yych <= 0xBF) goto yy656;
-	goto yy653;
-yy659:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy653;
-	if (yych <= 0x9F) goto yy656;
-	goto yy653;
-yy660:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy653;
-	if (yych <= 0xBF) goto yy658;
-	goto yy653;
-yy661:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy653;
-	if (yych <= 0xBF) goto yy658;
-	goto yy653;
-yy662:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy653;
-	if (yych <= 0x8F) goto yy658;
-	goto yy653;
-yy663:
-	yyaccept = 1;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 64) {
-		goto yy651;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy664;
-			if (yych <= '?') goto yy654;
-		} else {
-			if (yych <= 0xDF) goto yy656;
-			if (yych <= 0xE0) goto yy657;
-			goto yy658;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy659;
-			if (yych <= 0xEF) goto yy658;
-			goto yy660;
-		} else {
-			if (yych <= 0xF3) goto yy661;
-			if (yych <= 0xF4) goto yy662;
-		}
-	}
-yy664:
-	{ return (bufsize_t)(p - start); }
-}
-
-}
-
-// Try to match an HTML block end line of type 4
-bufsize_t _scan_html_block_end_4(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	unsigned int yyaccept = 0;
-	static const unsigned char yybm[] = {
-		  0, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128,   0, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128,  64, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		128, 128, 128, 128, 128, 128, 128, 128, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yybm[0+yych] & 64) {
-		goto yy670;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\n') {
-			if (yych <= 0x00) goto yy667;
-			if (yych <= '\t') goto yy669;
-		} else {
-			if (yych <= 0x7F) goto yy669;
-			if (yych <= 0xC1) goto yy667;
-			if (yych <= 0xDF) goto yy673;
-			goto yy674;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy676;
-			goto yy675;
-		} else {
-			if (yych <= 0xF0) goto yy677;
-			if (yych <= 0xF3) goto yy678;
-			if (yych <= 0xF4) goto yy679;
-		}
-	}
-yy667:
-	++p;
-yy668:
-	{ return 0; }
-yy669:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= '\n') {
-		if (yych <= 0x00) goto yy668;
-		if (yych <= '\t') goto yy681;
-		goto yy668;
-	} else {
-		if (yych <= 0x7F) goto yy681;
-		if (yych <= 0xC1) goto yy668;
-		if (yych <= 0xF4) goto yy681;
-		goto yy668;
-	}
-yy670:
-	yyaccept = 1;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 128) {
-		goto yy680;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy672;
-			if (yych <= '>') goto yy670;
-		} else {
-			if (yych <= 0xDF) goto yy683;
-			if (yych <= 0xE0) goto yy684;
-			goto yy685;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy686;
-			if (yych <= 0xEF) goto yy685;
-			goto yy687;
-		} else {
-			if (yych <= 0xF3) goto yy688;
-			if (yych <= 0xF4) goto yy689;
-		}
-	}
-yy672:
-	{ return (bufsize_t)(p - start); }
-yy673:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy668;
-	if (yych <= 0xBF) goto yy680;
-	goto yy668;
-yy674:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x9F) goto yy668;
-	if (yych <= 0xBF) goto yy683;
-	goto yy668;
-yy675:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy668;
-	if (yych <= 0xBF) goto yy683;
-	goto yy668;
-yy676:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy668;
-	if (yych <= 0x9F) goto yy683;
-	goto yy668;
-yy677:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x8F) goto yy668;
-	if (yych <= 0xBF) goto yy685;
-	goto yy668;
-yy678:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy668;
-	if (yych <= 0xBF) goto yy685;
-	goto yy668;
-yy679:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy668;
-	if (yych <= 0x8F) goto yy685;
-	goto yy668;
-yy680:
-	yych = *++p;
-yy681:
-	if (yybm[0+yych] & 128) {
-		goto yy680;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy682;
-			if (yych <= '>') goto yy670;
-		} else {
-			if (yych <= 0xDF) goto yy683;
-			if (yych <= 0xE0) goto yy684;
-			goto yy685;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy686;
-			if (yych <= 0xEF) goto yy685;
-			goto yy687;
-		} else {
-			if (yych <= 0xF3) goto yy688;
-			if (yych <= 0xF4) goto yy689;
-		}
-	}
-yy682:
-	p = marker;
-	if (yyaccept == 0) {
-		goto yy668;
-	} else {
-		goto yy672;
-	}
-yy683:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy682;
-	if (yych <= 0xBF) goto yy680;
-	goto yy682;
-yy684:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy682;
-	if (yych <= 0xBF) goto yy683;
-	goto yy682;
-yy685:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy682;
-	if (yych <= 0xBF) goto yy683;
-	goto yy682;
-yy686:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy682;
-	if (yych <= 0x9F) goto yy683;
-	goto yy682;
-yy687:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy682;
-	if (yych <= 0xBF) goto yy685;
-	goto yy682;
-yy688:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy682;
-	if (yych <= 0xBF) goto yy685;
-	goto yy682;
-yy689:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy682;
-	if (yych <= 0x8F) goto yy685;
-	goto yy682;
-}
-
-}
-
-// Try to match an HTML block end line of type 5
-bufsize_t _scan_html_block_end_5(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	unsigned int yyaccept = 0;
-	static const unsigned char yybm[] = {
-		  0,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,   0,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64, 128,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych <= 0xDF) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy692;
-			if (yych != '\n') goto yy694;
-		} else {
-			if (yych <= ']') goto yy695;
-			if (yych <= 0x7F) goto yy694;
-			if (yych >= 0xC2) goto yy696;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych <= 0xE0) goto yy697;
-			if (yych == 0xED) goto yy699;
-			goto yy698;
-		} else {
-			if (yych <= 0xF0) goto yy700;
-			if (yych <= 0xF3) goto yy701;
-			if (yych <= 0xF4) goto yy702;
-		}
-	}
-yy692:
-	++p;
-yy693:
-	{ return 0; }
-yy694:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= '\n') {
-		if (yych <= 0x00) goto yy693;
-		if (yych <= '\t') goto yy704;
-		goto yy693;
-	} else {
-		if (yych <= 0x7F) goto yy704;
-		if (yych <= 0xC1) goto yy693;
-		if (yych <= 0xF4) goto yy704;
-		goto yy693;
-	}
-yy695:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 128) {
-		goto yy714;
-	}
-	if (yych <= '\n') {
-		if (yych <= 0x00) goto yy693;
-		if (yych <= '\t') goto yy704;
-		goto yy693;
-	} else {
-		if (yych <= 0x7F) goto yy704;
-		if (yych <= 0xC1) goto yy693;
-		if (yych <= 0xF4) goto yy704;
-		goto yy693;
-	}
-yy696:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy693;
-	if (yych <= 0xBF) goto yy703;
-	goto yy693;
-yy697:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x9F) goto yy693;
-	if (yych <= 0xBF) goto yy707;
-	goto yy693;
-yy698:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy693;
-	if (yych <= 0xBF) goto yy707;
-	goto yy693;
-yy699:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy693;
-	if (yych <= 0x9F) goto yy707;
-	goto yy693;
-yy700:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x8F) goto yy693;
-	if (yych <= 0xBF) goto yy709;
-	goto yy693;
-yy701:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy693;
-	if (yych <= 0xBF) goto yy709;
-	goto yy693;
-yy702:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x7F) goto yy693;
-	if (yych <= 0x8F) goto yy709;
-	goto yy693;
-yy703:
-	yych = *++p;
-yy704:
-	if (yybm[0+yych] & 64) {
-		goto yy703;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy705;
-			if (yych <= ']') goto yy706;
-		} else {
-			if (yych <= 0xDF) goto yy707;
-			if (yych <= 0xE0) goto yy708;
-			goto yy709;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy710;
-			if (yych <= 0xEF) goto yy709;
-			goto yy711;
-		} else {
-			if (yych <= 0xF3) goto yy712;
-			if (yych <= 0xF4) goto yy713;
-		}
-	}
-yy705:
-	p = marker;
-	if (yyaccept == 0) {
-		goto yy693;
-	} else {
-		goto yy717;
-	}
-yy706:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy703;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy705;
-			if (yych <= ']') goto yy714;
-			goto yy705;
-		} else {
-			if (yych <= 0xDF) goto yy707;
-			if (yych <= 0xE0) goto yy708;
-			goto yy709;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy710;
-			if (yych <= 0xEF) goto yy709;
-			goto yy711;
-		} else {
-			if (yych <= 0xF3) goto yy712;
-			if (yych <= 0xF4) goto yy713;
-			goto yy705;
-		}
-	}
-yy707:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy705;
-	if (yych <= 0xBF) goto yy703;
-	goto yy705;
-yy708:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy705;
-	if (yych <= 0xBF) goto yy707;
-	goto yy705;
-yy709:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy705;
-	if (yych <= 0xBF) goto yy707;
-	goto yy705;
-yy710:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy705;
-	if (yych <= 0x9F) goto yy707;
-	goto yy705;
-yy711:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy705;
-	if (yych <= 0xBF) goto yy709;
-	goto yy705;
-yy712:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy705;
-	if (yych <= 0xBF) goto yy709;
-	goto yy705;
-yy713:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy705;
-	if (yych <= 0x8F) goto yy709;
-	goto yy705;
-yy714:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy714;
-	}
-	if (yych <= 0xDF) {
-		if (yych <= '=') {
-			if (yych <= 0x00) goto yy705;
-			if (yych == '\n') goto yy705;
-			goto yy703;
-		} else {
-			if (yych <= '>') goto yy716;
-			if (yych <= 0x7F) goto yy703;
-			if (yych <= 0xC1) goto yy705;
-			goto yy707;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych <= 0xE0) goto yy708;
-			if (yych == 0xED) goto yy710;
-			goto yy709;
-		} else {
-			if (yych <= 0xF0) goto yy711;
-			if (yych <= 0xF3) goto yy712;
-			if (yych <= 0xF4) goto yy713;
-			goto yy705;
-		}
-	}
-yy716:
-	yyaccept = 1;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 64) {
-		goto yy703;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= '\n') goto yy717;
-			if (yych <= ']') goto yy706;
-		} else {
-			if (yych <= 0xDF) goto yy707;
-			if (yych <= 0xE0) goto yy708;
-			goto yy709;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy710;
-			if (yych <= 0xEF) goto yy709;
-			goto yy711;
-		} else {
-			if (yych <= 0xF3) goto yy712;
-			if (yych <= 0xF4) goto yy713;
-		}
-	}
-yy717:
-	{ return (bufsize_t)(p - start); }
-}
-
-}
-
-// Try to match a link title (in single quotes, in double quotes, or
-// in parentheses), returning number of chars matched.  Allow one
-// level of internal nesting (quotes within quotes).
-bufsize_t _scan_link_title(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	unsigned int yyaccept = 0;
-	static const unsigned char yybm[] = {
-		  0, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 192, 208, 208, 208, 208, 144, 
-		208,  80, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208,  32, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych <= '&') {
-		if (yych == '"') goto yy722;
-	} else {
-		if (yych <= '\'') goto yy723;
-		if (yych <= '(') goto yy724;
-	}
-	++p;
-yy721:
-	{ return 0; }
-yy722:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x00) goto yy721;
-	if (yych <= 0x7F) goto yy726;
-	if (yych <= 0xC1) goto yy721;
-	if (yych <= 0xF4) goto yy726;
-	goto yy721;
-yy723:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x00) goto yy721;
-	if (yych <= 0x7F) goto yy740;
-	if (yych <= 0xC1) goto yy721;
-	if (yych <= 0xF4) goto yy740;
-	goto yy721;
-yy724:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x00) goto yy721;
-	if (yych <= 0x7F) goto yy753;
-	if (yych <= 0xC1) goto yy721;
-	if (yych <= 0xF4) goto yy753;
-	goto yy721;
-yy725:
-	yych = *++p;
-yy726:
-	if (yybm[0+yych] & 16) {
-		goto yy725;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy727;
-			if (yych <= '"') goto yy728;
-			goto yy730;
-		} else {
-			if (yych <= 0xC1) goto yy727;
-			if (yych <= 0xDF) goto yy732;
-			goto yy733;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy735;
-			goto yy734;
-		} else {
-			if (yych <= 0xF0) goto yy736;
-			if (yych <= 0xF3) goto yy737;
-			if (yych <= 0xF4) goto yy738;
-		}
-	}
-yy727:
-	p = marker;
-	if (yyaccept <= 1) {
-		if (yyaccept == 0) {
-			goto yy721;
-		} else {
-			goto yy729;
-		}
-	} else {
-		if (yyaccept == 2) {
-			goto yy742;
-		} else {
-			goto yy755;
-		}
-	}
-yy728:
-	++p;
-yy729:
-	{ return (bufsize_t)(p - start); }
-yy730:
-	yych = *++p;
-	if (yybm[0+yych] & 16) {
-		goto yy725;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy727;
-			if (yych <= '"') goto yy765;
-			goto yy730;
-		} else {
-			if (yych <= 0xC1) goto yy727;
-			if (yych >= 0xE0) goto yy733;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy735;
-			goto yy734;
-		} else {
-			if (yych <= 0xF0) goto yy736;
-			if (yych <= 0xF3) goto yy737;
-			if (yych <= 0xF4) goto yy738;
-			goto yy727;
-		}
-	}
-yy732:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy725;
-	goto yy727;
-yy733:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy727;
-	if (yych <= 0xBF) goto yy732;
-	goto yy727;
-yy734:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy732;
-	goto yy727;
-yy735:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0x9F) goto yy732;
-	goto yy727;
-yy736:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy727;
-	if (yych <= 0xBF) goto yy734;
-	goto yy727;
-yy737:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy734;
-	goto yy727;
-yy738:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0x8F) goto yy734;
-	goto yy727;
-yy739:
-	yych = *++p;
-yy740:
-	if (yybm[0+yych] & 64) {
-		goto yy739;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy727;
-			if (yych >= '(') goto yy743;
-		} else {
-			if (yych <= 0xC1) goto yy727;
-			if (yych <= 0xDF) goto yy745;
-			goto yy746;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy748;
-			goto yy747;
-		} else {
-			if (yych <= 0xF0) goto yy749;
-			if (yych <= 0xF3) goto yy750;
-			if (yych <= 0xF4) goto yy751;
-			goto yy727;
-		}
-	}
-yy741:
-	++p;
-yy742:
-	{ return (bufsize_t)(p - start); }
-yy743:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy739;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy727;
-			if (yych <= '\'') goto yy766;
-			goto yy743;
-		} else {
-			if (yych <= 0xC1) goto yy727;
-			if (yych >= 0xE0) goto yy746;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy748;
-			goto yy747;
-		} else {
-			if (yych <= 0xF0) goto yy749;
-			if (yych <= 0xF3) goto yy750;
-			if (yych <= 0xF4) goto yy751;
-			goto yy727;
-		}
-	}
-yy745:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy739;
-	goto yy727;
-yy746:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy727;
-	if (yych <= 0xBF) goto yy745;
-	goto yy727;
-yy747:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy745;
-	goto yy727;
-yy748:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0x9F) goto yy745;
-	goto yy727;
-yy749:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy727;
-	if (yych <= 0xBF) goto yy747;
-	goto yy727;
-yy750:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy747;
-	goto yy727;
-yy751:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0x8F) goto yy747;
-	goto yy727;
-yy752:
-	yych = *++p;
-yy753:
-	if (yybm[0+yych] & 128) {
-		goto yy752;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy727;
-			if (yych >= '*') goto yy756;
-		} else {
-			if (yych <= 0xC1) goto yy727;
-			if (yych <= 0xDF) goto yy758;
-			goto yy759;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy761;
-			goto yy760;
-		} else {
-			if (yych <= 0xF0) goto yy762;
-			if (yych <= 0xF3) goto yy763;
-			if (yych <= 0xF4) goto yy764;
-			goto yy727;
-		}
-	}
-yy754:
-	++p;
-yy755:
-	{ return (bufsize_t)(p - start); }
-yy756:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy752;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy727;
-			if (yych <= ')') goto yy767;
-			goto yy756;
-		} else {
-			if (yych <= 0xC1) goto yy727;
-			if (yych >= 0xE0) goto yy759;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy761;
-			goto yy760;
-		} else {
-			if (yych <= 0xF0) goto yy762;
-			if (yych <= 0xF3) goto yy763;
-			if (yych <= 0xF4) goto yy764;
-			goto yy727;
-		}
-	}
-yy758:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy752;
-	goto yy727;
-yy759:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy727;
-	if (yych <= 0xBF) goto yy758;
-	goto yy727;
-yy760:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy758;
-	goto yy727;
-yy761:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0x9F) goto yy758;
-	goto yy727;
-yy762:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy727;
-	if (yych <= 0xBF) goto yy760;
-	goto yy727;
-yy763:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy760;
-	goto yy727;
-yy764:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0x8F) goto yy760;
-	goto yy727;
-yy765:
-	yyaccept = 1;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 16) {
-		goto yy725;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy729;
-			if (yych <= '"') goto yy728;
-			goto yy730;
-		} else {
-			if (yych <= 0xC1) goto yy729;
-			if (yych <= 0xDF) goto yy732;
-			goto yy733;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy735;
-			goto yy734;
-		} else {
-			if (yych <= 0xF0) goto yy736;
-			if (yych <= 0xF3) goto yy737;
-			if (yych <= 0xF4) goto yy738;
-			goto yy729;
-		}
-	}
-yy766:
-	yyaccept = 2;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 64) {
-		goto yy739;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy742;
-			if (yych <= '\'') goto yy741;
-			goto yy743;
-		} else {
-			if (yych <= 0xC1) goto yy742;
-			if (yych <= 0xDF) goto yy745;
-			goto yy746;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy748;
-			goto yy747;
-		} else {
-			if (yych <= 0xF0) goto yy749;
-			if (yych <= 0xF3) goto yy750;
-			if (yych <= 0xF4) goto yy751;
-			goto yy742;
-		}
-	}
-yy767:
-	yyaccept = 3;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 128) {
-		goto yy752;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy755;
-			if (yych <= ')') goto yy754;
-			goto yy756;
-		} else {
-			if (yych <= 0xC1) goto yy755;
-			if (yych <= 0xDF) goto yy758;
-			goto yy759;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy761;
-			goto yy760;
-		} else {
-			if (yych <= 0xF0) goto yy762;
-			if (yych <= 0xF3) goto yy763;
-			if (yych <= 0xF4) goto yy764;
-			goto yy755;
-		}
-	}
-}
-
-}
-
-// Match space characters, including newlines.
-bufsize_t _scan_spacechars(const unsigned char *p)
-{
-  const unsigned char *start = p; \
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0, 128, 128, 128, 128, 128,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		128,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yybm[0+yych] & 128) {
-		goto yy772;
-	}
-	++p;
-	{ return 0; }
-yy772:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy772;
-	}
-	{ return (bufsize_t)(p - start); }
-}
-
-}
-
-// Match ATX heading start.
-bufsize_t _scan_atx_heading_start(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0, 128,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		128,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych == '#') goto yy779;
-	++p;
-yy778:
-	{ return 0; }
-yy779:
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy778;
-		if (yych <= '\n') goto yy783;
-		goto yy778;
-	} else {
-		if (yych <= '\r') goto yy783;
-		if (yych == '#') goto yy784;
-		goto yy778;
-	}
-yy780:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-yy782:
-	{ return (bufsize_t)(p - start); }
-yy783:
-	++p;
-	goto yy782;
-yy784:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy785;
-		if (yych <= '\n') goto yy783;
-	} else {
-		if (yych <= '\r') goto yy783;
-		if (yych == '#') goto yy786;
-	}
-yy785:
-	p = marker;
-	goto yy778;
-yy786:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy785;
-		if (yych <= '\n') goto yy783;
-		goto yy785;
-	} else {
-		if (yych <= '\r') goto yy783;
-		if (yych != '#') goto yy785;
-	}
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy785;
-		if (yych <= '\n') goto yy783;
-		goto yy785;
-	} else {
-		if (yych <= '\r') goto yy783;
-		if (yych != '#') goto yy785;
-	}
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy785;
-		if (yych <= '\n') goto yy783;
-		goto yy785;
-	} else {
-		if (yych <= '\r') goto yy783;
-		if (yych != '#') goto yy785;
-	}
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-	if (yych <= 0x08) goto yy785;
-	if (yych <= '\n') goto yy783;
-	if (yych == '\r') goto yy783;
-	goto yy785;
-}
-
-}
-
-// Match setext heading line.  Return 1 for level-1 heading,
-// 2 for level-2, 0 for no match.
-bufsize_t _scan_setext_heading_line(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,  32,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		 32,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,  64,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0, 128,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych == '-') goto yy794;
-	if (yych == '=') goto yy795;
-	++p;
-yy793:
-	{ return 0; }
-yy794:
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 64) {
-		goto yy801;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy793;
-		if (yych <= '\n') goto yy797;
-		goto yy793;
-	} else {
-		if (yych <= '\r') goto yy797;
-		if (yych == ' ') goto yy797;
-		goto yy793;
-	}
-yy795:
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 128) {
-		goto yy807;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy793;
-		if (yych <= '\n') goto yy804;
-		goto yy793;
-	} else {
-		if (yych <= '\r') goto yy804;
-		if (yych == ' ') goto yy804;
-		goto yy793;
-	}
-yy796:
-	yych = *++p;
-yy797:
-	if (yybm[0+yych] & 32) {
-		goto yy796;
-	}
-	if (yych <= 0x08) goto yy798;
-	if (yych <= '\n') goto yy799;
-	if (yych == '\r') goto yy799;
-yy798:
-	p = marker;
-	goto yy793;
-yy799:
-	++p;
-	{ return 2; }
-yy801:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy796;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy798;
-		if (yych <= '\n') goto yy799;
-		goto yy798;
-	} else {
-		if (yych <= '\r') goto yy799;
-		if (yych == '-') goto yy801;
-		goto yy798;
-	}
-yy803:
-	yych = *++p;
-yy804:
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy798;
-		if (yych <= '\t') goto yy803;
-		if (yych >= '\v') goto yy798;
-	} else {
-		if (yych <= '\r') goto yy805;
-		if (yych == ' ') goto yy803;
-		goto yy798;
-	}
-yy805:
-	++p;
-	{ return 1; }
-yy807:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy807;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy798;
-		if (yych <= '\t') goto yy803;
-		if (yych <= '\n') goto yy805;
-		goto yy798;
-	} else {
-		if (yych <= '\r') goto yy805;
-		if (yych == ' ') goto yy803;
-		goto yy798;
-	}
-}
-
-}
-
-// Scan a thematic break line: "...three or more hyphens, asterisks,
-// or underscores on a line by themselves. If you wish, you may use
-// spaces between the hyphens or asterisks."
-bufsize_t _scan_thematic_break(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0, 240,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		240,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,  32,   0,   0,  64,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0, 128, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych <= ',') {
-		if (yych == '*') goto yy813;
-	} else {
-		if (yych <= '-') goto yy814;
-		if (yych == '_') goto yy815;
-	}
-	++p;
-yy812:
-	{ return 0; }
-yy813:
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 16) {
-		goto yy816;
-	}
-	if (yych == '*') goto yy819;
-	goto yy812;
-yy814:
-	yych = *(marker = ++p);
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy821;
-		goto yy812;
-	} else {
-		if (yych <= ' ') goto yy821;
-		if (yych == '-') goto yy823;
-		goto yy812;
-	}
-yy815:
-	yych = *(marker = ++p);
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy825;
-		goto yy812;
-	} else {
-		if (yych <= ' ') goto yy825;
-		if (yych == '_') goto yy827;
-		goto yy812;
-	}
-yy816:
-	yych = *++p;
-	if (yybm[0+yych] & 16) {
-		goto yy816;
-	}
-	if (yych == '*') goto yy819;
-yy818:
-	p = marker;
-	goto yy812;
-yy819:
-	yych = *++p;
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy819;
-		goto yy818;
-	} else {
-		if (yych <= ' ') goto yy819;
-		if (yych == '*') goto yy829;
-		goto yy818;
-	}
-yy821:
-	yych = *++p;
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy821;
-		goto yy818;
-	} else {
-		if (yych <= ' ') goto yy821;
-		if (yych != '-') goto yy818;
-	}
-yy823:
-	yych = *++p;
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy823;
-		goto yy818;
-	} else {
-		if (yych <= ' ') goto yy823;
-		if (yych == '-') goto yy831;
-		goto yy818;
-	}
-yy825:
-	yych = *++p;
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy825;
-		goto yy818;
-	} else {
-		if (yych <= ' ') goto yy825;
-		if (yych != '_') goto yy818;
-	}
-yy827:
-	yych = *++p;
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy827;
-		goto yy818;
-	} else {
-		if (yych <= ' ') goto yy827;
-		if (yych == '_') goto yy833;
-		goto yy818;
-	}
-yy829:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy829;
-	}
-	if (yych <= 0x08) goto yy818;
-	if (yych <= '\n') goto yy835;
-	if (yych == '\r') goto yy835;
-	goto yy818;
-yy831:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy831;
-	}
-	if (yych <= 0x08) goto yy818;
-	if (yych <= '\n') goto yy837;
-	if (yych == '\r') goto yy837;
-	goto yy818;
-yy833:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy833;
-	}
-	if (yych <= 0x08) goto yy818;
-	if (yych <= '\n') goto yy839;
-	if (yych == '\r') goto yy839;
-	goto yy818;
-yy835:
-	++p;
-	{ return (bufsize_t)(p - start); }
-yy837:
-	++p;
-	{ return (bufsize_t)(p - start); }
-yy839:
-	++p;
-	{ return (bufsize_t)(p - start); }
-}
-
-}
-
-// Scan an opening code fence.
-bufsize_t _scan_open_code_fence(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192,   0, 192, 192,   0, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		144, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 224, 192, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych == '`') goto yy845;
-	if (yych == '~') goto yy846;
-	++p;
-yy844:
-	{ return 0; }
-yy845:
-	yych = *(marker = ++p);
-	if (yych == '`') goto yy847;
-	goto yy844;
-yy846:
-	yych = *(marker = ++p);
-	if (yych == '~') goto yy849;
-	goto yy844;
-yy847:
-	yych = *++p;
-	if (yybm[0+yych] & 16) {
-		goto yy850;
-	}
-yy848:
-	p = marker;
-	goto yy844;
-yy849:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy852;
-	}
-	goto yy848;
-yy850:
-	yych = *++p;
-	if (yybm[0+yych] & 16) {
-		goto yy850;
-	}
-	if (yych <= 0xDF) {
-		if (yych <= '\f') {
-			if (yych <= 0x00) goto yy848;
-			if (yych == '\n') {
-				marker = p;
-				goto yy856;
-			}
-			marker = p;
-			goto yy854;
-		} else {
-			if (yych <= '\r') {
-				marker = p;
-				goto yy856;
-			}
-			if (yych <= 0x7F) {
-				marker = p;
-				goto yy854;
-			}
-			if (yych <= 0xC1) goto yy848;
-			marker = p;
-			goto yy858;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych <= 0xE0) {
-				marker = p;
-				goto yy859;
-			}
-			if (yych == 0xED) {
-				marker = p;
-				goto yy861;
-			}
-			marker = p;
-			goto yy860;
-		} else {
-			if (yych <= 0xF0) {
-				marker = p;
-				goto yy862;
-			}
-			if (yych <= 0xF3) {
-				marker = p;
-				goto yy863;
-			}
-			if (yych <= 0xF4) {
-				marker = p;
-				goto yy864;
-			}
-			goto yy848;
-		}
-	}
-yy852:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy852;
-	}
-	if (yych <= 0xDF) {
-		if (yych <= '\f') {
-			if (yych <= 0x00) goto yy848;
-			if (yych == '\n') {
-				marker = p;
-				goto yy867;
-			}
-			marker = p;
-			goto yy865;
-		} else {
-			if (yych <= '\r') {
-				marker = p;
-				goto yy867;
-			}
-			if (yych <= 0x7F) {
-				marker = p;
-				goto yy865;
-			}
-			if (yych <= 0xC1) goto yy848;
-			marker = p;
-			goto yy869;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych <= 0xE0) {
-				marker = p;
-				goto yy870;
-			}
-			if (yych == 0xED) {
-				marker = p;
-				goto yy872;
-			}
-			marker = p;
-			goto yy871;
-		} else {
-			if (yych <= 0xF0) {
-				marker = p;
-				goto yy873;
-			}
-			if (yych <= 0xF3) {
-				marker = p;
-				goto yy874;
-			}
-			if (yych <= 0xF4) {
-				marker = p;
-				goto yy875;
-			}
-			goto yy848;
-		}
-	}
-yy854:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy854;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy848;
-			if (yych >= 0x0E) goto yy848;
-		} else {
-			if (yych <= 0xDF) goto yy858;
-			if (yych <= 0xE0) goto yy859;
-			goto yy860;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy861;
-			if (yych <= 0xEF) goto yy860;
-			goto yy862;
-		} else {
-			if (yych <= 0xF3) goto yy863;
-			if (yych <= 0xF4) goto yy864;
-			goto yy848;
-		}
-	}
-yy856:
-	++p;
-	p = marker;
-	{ return (bufsize_t)(p - start); }
-yy858:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0xBF) goto yy854;
-	goto yy848;
-yy859:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy848;
-	if (yych <= 0xBF) goto yy858;
-	goto yy848;
-yy860:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0xBF) goto yy858;
-	goto yy848;
-yy861:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0x9F) goto yy858;
-	goto yy848;
-yy862:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy848;
-	if (yych <= 0xBF) goto yy860;
-	goto yy848;
-yy863:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0xBF) goto yy860;
-	goto yy848;
-yy864:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0x8F) goto yy860;
-	goto yy848;
-yy865:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy865;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy848;
-			if (yych >= 0x0E) goto yy848;
-		} else {
-			if (yych <= 0xDF) goto yy869;
-			if (yych <= 0xE0) goto yy870;
-			goto yy871;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy872;
-			if (yych <= 0xEF) goto yy871;
-			goto yy873;
-		} else {
-			if (yych <= 0xF3) goto yy874;
-			if (yych <= 0xF4) goto yy875;
-			goto yy848;
-		}
-	}
-yy867:
-	++p;
-	p = marker;
-	{ return (bufsize_t)(p - start); }
-yy869:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0xBF) goto yy865;
-	goto yy848;
-yy870:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy848;
-	if (yych <= 0xBF) goto yy869;
-	goto yy848;
-yy871:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0xBF) goto yy869;
-	goto yy848;
-yy872:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0x9F) goto yy869;
-	goto yy848;
-yy873:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy848;
-	if (yych <= 0xBF) goto yy871;
-	goto yy848;
-yy874:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0xBF) goto yy871;
-	goto yy848;
-yy875:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0x8F) goto yy871;
-	goto yy848;
-}
-
-}
-
-// Scan a closing code fence with length at least len.
-bufsize_t _scan_close_code_fence(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0, 128,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		128,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		 32,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,  64,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych == '`') goto yy880;
-	if (yych == '~') goto yy881;
-	++p;
-yy879:
-	{ return 0; }
-yy880:
-	yych = *(marker = ++p);
-	if (yych == '`') goto yy882;
-	goto yy879;
-yy881:
-	yych = *(marker = ++p);
-	if (yych == '~') goto yy884;
-	goto yy879;
-yy882:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy885;
-	}
-yy883:
-	p = marker;
-	goto yy879;
-yy884:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy887;
-	}
-	goto yy883;
-yy885:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy885;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy883;
-		if (yych <= '\t') {
-			marker = p;
-			goto yy889;
-		}
-		if (yych <= '\n') {
-			marker = p;
-			goto yy891;
-		}
-		goto yy883;
-	} else {
-		if (yych <= '\r') {
-			marker = p;
-			goto yy891;
-		}
-		if (yych == ' ') {
-			marker = p;
-			goto yy889;
-		}
-		goto yy883;
-	}
-yy887:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy887;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy883;
-		if (yych <= '\t') {
-			marker = p;
-			goto yy893;
-		}
-		if (yych <= '\n') {
-			marker = p;
-			goto yy895;
-		}
-		goto yy883;
-	} else {
-		if (yych <= '\r') {
-			marker = p;
-			goto yy895;
-		}
-		if (yych == ' ') {
-			marker = p;
-			goto yy893;
-		}
-		goto yy883;
-	}
-yy889:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy889;
-	}
-	if (yych <= 0x08) goto yy883;
-	if (yych <= '\n') goto yy891;
-	if (yych != '\r') goto yy883;
-yy891:
-	++p;
-	p = marker;
-	{ return (bufsize_t)(p - start); }
-yy893:
-	yych = *++p;
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy883;
-		if (yych <= '\t') goto yy893;
-		if (yych >= '\v') goto yy883;
-	} else {
-		if (yych <= '\r') goto yy895;
-		if (yych == ' ') goto yy893;
-		goto yy883;
-	}
-yy895:
-	++p;
-	p = marker;
-	{ return (bufsize_t)(p - start); }
-}
-
-}
-
-// Scans an entity.
-// Returns number of chars matched.
-bufsize_t _scan_entity(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	yych = *p;
-	if (yych == '&') goto yy901;
-	++p;
-yy900:
-	{ return 0; }
-yy901:
-	yych = *(marker = ++p);
-	if (yych <= '@') {
-		if (yych != '#') goto yy900;
-	} else {
-		if (yych <= 'Z') goto yy904;
-		if (yych <= '`') goto yy900;
-		if (yych <= 'z') goto yy904;
-		goto yy900;
-	}
-	yych = *++p;
-	if (yych <= 'W') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy905;
-	} else {
-		if (yych <= 'X') goto yy906;
-		if (yych == 'x') goto yy906;
-	}
-yy903:
-	p = marker;
-	goto yy900;
-yy904:
-	yych = *++p;
-	if (yych <= '@') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy907;
-		goto yy903;
-	} else {
-		if (yych <= 'Z') goto yy907;
-		if (yych <= '`') goto yy903;
-		if (yych <= 'z') goto yy907;
-		goto yy903;
-	}
-yy905:
-	yych = *++p;
-	if (yych <= '/') goto yy903;
-	if (yych <= '9') goto yy908;
-	if (yych == ';') goto yy909;
-	goto yy903;
-yy906:
-	yych = *++p;
-	if (yych <= '@') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy911;
-		goto yy903;
-	} else {
-		if (yych <= 'F') goto yy911;
-		if (yych <= '`') goto yy903;
-		if (yych <= 'f') goto yy911;
-		goto yy903;
-	}
-yy907:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy912;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy912;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy912;
-			goto yy903;
-		}
-	}
-yy908:
-	yych = *++p;
-	if (yych <= '/') goto yy903;
-	if (yych <= '9') goto yy913;
-	if (yych != ';') goto yy903;
-yy909:
-	++p;
-	{ return (bufsize_t)(p - start); }
-yy911:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy914;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'F') {
-			if (yych <= '@') goto yy903;
-			goto yy914;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'f') goto yy914;
-			goto yy903;
-		}
-	}
-yy912:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy915;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy915;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy915;
-			goto yy903;
-		}
-	}
-yy913:
-	yych = *++p;
-	if (yych <= '/') goto yy903;
-	if (yych <= '9') goto yy916;
-	if (yych == ';') goto yy909;
-	goto yy903;
-yy914:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy917;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'F') {
-			if (yych <= '@') goto yy903;
-			goto yy917;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'f') goto yy917;
-			goto yy903;
-		}
-	}
-yy915:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy918;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy918;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy918;
-			goto yy903;
-		}
-	}
-yy916:
-	yych = *++p;
-	if (yych <= '/') goto yy903;
-	if (yych <= '9') goto yy919;
-	if (yych == ';') goto yy909;
-	goto yy903;
-yy917:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy920;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'F') {
-			if (yych <= '@') goto yy903;
-			goto yy920;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'f') goto yy920;
-			goto yy903;
-		}
-	}
-yy918:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy921;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy921;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy921;
-			goto yy903;
-		}
-	}
-yy919:
-	yych = *++p;
-	if (yych <= '/') goto yy903;
-	if (yych <= '9') goto yy922;
-	if (yych == ';') goto yy909;
-	goto yy903;
-yy920:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy923;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'F') {
-			if (yych <= '@') goto yy903;
-			goto yy923;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'f') goto yy923;
-			goto yy903;
-		}
-	}
-yy921:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy924;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy924;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy924;
-			goto yy903;
-		}
-	}
-yy922:
-	yych = *++p;
-	if (yych <= '/') goto yy903;
-	if (yych <= '9') goto yy925;
-	if (yych == ';') goto yy909;
-	goto yy903;
-yy923:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy925;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'F') {
-			if (yych <= '@') goto yy903;
-			goto yy925;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'f') goto yy925;
-			goto yy903;
-		}
-	}
-yy924:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy926;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy926;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy926;
-			goto yy903;
-		}
-	}
-yy925:
-	yych = *++p;
-	if (yych == ';') goto yy909;
-	goto yy903;
-yy926:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy927;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy927:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy928;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy928:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy929;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy929:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy930;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy930:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy931;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy931:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy932;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy932:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy933;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy933:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy934;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy934:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy935;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy935:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy936;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy936:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy937;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy937:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy938;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy938:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy939;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy939:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy940;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy940:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy941;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy941:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy942;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy942:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy943;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy943:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy944;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy944:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy945;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy945:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy946;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy946:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy947;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy947:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy948;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy948:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy949;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy949:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy925;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy925;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy925;
-			goto yy903;
-		}
-	}
-}
-
-}
-
-// Returns positive value if a URL begins in a way that is potentially
-// dangerous, with javascript:, vbscript:, file:, or data:, otherwise 0.
-bufsize_t _scan_dangerous_url(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	unsigned int yyaccept = 0;
-	yych = *p;
-	if (yych <= 'V') {
-		if (yych <= 'F') {
-			if (yych == 'D') goto yy954;
-			if (yych >= 'F') goto yy955;
-		} else {
-			if (yych == 'J') goto yy956;
-			if (yych >= 'V') goto yy957;
-		}
-	} else {
-		if (yych <= 'f') {
-			if (yych == 'd') goto yy954;
-			if (yych >= 'f') goto yy955;
-		} else {
-			if (yych <= 'j') {
-				if (yych >= 'j') goto yy956;
-			} else {
-				if (yych == 'v') goto yy957;
-			}
-		}
-	}
-	++p;
-yy953:
-	{ return 0; }
-yy954:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych == 'A') goto yy958;
-	if (yych == 'a') goto yy958;
-	goto yy953;
-yy955:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych == 'I') goto yy960;
-	if (yych == 'i') goto yy960;
-	goto yy953;
-yy956:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych == 'A') goto yy961;
-	if (yych == 'a') goto yy961;
-	goto yy953;
-yy957:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych == 'B') goto yy962;
-	if (yych == 'b') goto yy962;
-	goto yy953;
-yy958:
-	yych = *++p;
-	if (yych == 'T') goto yy963;
-	if (yych == 't') goto yy963;
-yy959:
-	p = marker;
-	if (yyaccept == 0) {
-		goto yy953;
-	} else {
-		goto yy971;
-	}
-yy960:
-	yych = *++p;
-	if (yych == 'L') goto yy964;
-	if (yych == 'l') goto yy964;
-	goto yy959;
-yy961:
-	yych = *++p;
-	if (yych == 'V') goto yy965;
-	if (yych == 'v') goto yy965;
-	goto yy959;
-yy962:
-	yych = *++p;
-	if (yych == 'S') goto yy966;
-	if (yych == 's') goto yy966;
-	goto yy959;
-yy963:
-	yych = *++p;
-	if (yych == 'A') goto yy967;
-	if (yych == 'a') goto yy967;
-	goto yy959;
-yy964:
-	yych = *++p;
-	if (yych == 'E') goto yy968;
-	if (yych == 'e') goto yy968;
-	goto yy959;
-yy965:
-	yych = *++p;
-	if (yych == 'A') goto yy962;
-	if (yych == 'a') goto yy962;
-	goto yy959;
-yy966:
-	yych = *++p;
-	if (yych == 'C') goto yy969;
-	if (yych == 'c') goto yy969;
-	goto yy959;
-yy967:
-	yych = *++p;
-	if (yych == ':') goto yy970;
-	goto yy959;
-yy968:
-	yych = *++p;
-	if (yych == ':') goto yy972;
-	goto yy959;
-yy969:
-	yych = *++p;
-	if (yych == 'R') goto yy973;
-	if (yych == 'r') goto yy973;
-	goto yy959;
-yy970:
-	yyaccept = 1;
-	yych = *(marker = ++p);
-	if (yych == 'I') goto yy974;
-	if (yych == 'i') goto yy974;
-yy971:
-	{ return (bufsize_t)(p - start); }
-yy972:
-	++p;
-	goto yy971;
-yy973:
-	yych = *++p;
-	if (yych == 'I') goto yy975;
-	if (yych == 'i') goto yy975;
-	goto yy959;
-yy974:
-	yych = *++p;
-	if (yych == 'M') goto yy976;
-	if (yych == 'm') goto yy976;
-	goto yy959;
-yy975:
-	yych = *++p;
-	if (yych == 'P') goto yy977;
-	if (yych == 'p') goto yy977;
-	goto yy959;
-yy976:
-	yych = *++p;
-	if (yych == 'A') goto yy978;
-	if (yych == 'a') goto yy978;
-	goto yy959;
-yy977:
-	yych = *++p;
-	if (yych == 'T') goto yy968;
-	if (yych == 't') goto yy968;
-	goto yy959;
-yy978:
-	yych = *++p;
-	if (yych == 'G') goto yy979;
-	if (yych != 'g') goto yy959;
-yy979:
-	yych = *++p;
-	if (yych == 'E') goto yy980;
-	if (yych != 'e') goto yy959;
-yy980:
-	yych = *++p;
-	if (yych != '/') goto yy959;
-	yych = *++p;
-	if (yych <= 'W') {
-		if (yych <= 'J') {
-			if (yych == 'G') goto yy982;
-			if (yych <= 'I') goto yy959;
-			goto yy983;
-		} else {
-			if (yych == 'P') goto yy984;
-			if (yych <= 'V') goto yy959;
-			goto yy985;
-		}
-	} else {
-		if (yych <= 'j') {
-			if (yych == 'g') goto yy982;
-			if (yych <= 'i') goto yy959;
-			goto yy983;
-		} else {
-			if (yych <= 'p') {
-				if (yych <= 'o') goto yy959;
-				goto yy984;
-			} else {
-				if (yych == 'w') goto yy985;
-				goto yy959;
-			}
-		}
-	}
-yy982:
-	yych = *++p;
-	if (yych == 'I') goto yy986;
-	if (yych == 'i') goto yy986;
-	goto yy959;
-yy983:
-	yych = *++p;
-	if (yych == 'P') goto yy987;
-	if (yych == 'p') goto yy987;
-	goto yy959;
-yy984:
-	yych = *++p;
-	if (yych == 'N') goto yy988;
-	if (yych == 'n') goto yy988;
-	goto yy959;
-yy985:
-	yych = *++p;
-	if (yych == 'E') goto yy989;
-	if (yych == 'e') goto yy989;
-	goto yy959;
-yy986:
-	yych = *++p;
-	if (yych == 'F') goto yy990;
-	if (yych == 'f') goto yy990;
-	goto yy959;
-yy987:
-	yych = *++p;
-	if (yych == 'E') goto yy988;
-	if (yych != 'e') goto yy959;
-yy988:
-	yych = *++p;
-	if (yych == 'G') goto yy990;
-	if (yych == 'g') goto yy990;
-	goto yy959;
-yy989:
-	yych = *++p;
-	if (yych == 'B') goto yy992;
-	if (yych == 'b') goto yy992;
-	goto yy959;
-yy990:
-	++p;
-	{ return 0; }
-yy992:
-	yych = *++p;
-	if (yych == 'P') goto yy990;
-	if (yych == 'p') goto yy990;
-	goto yy959;
-}
-
-}
-
-// Scans a footnote definition opening.
-bufsize_t _scan_footnote_definition(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,  64,  64,  64,  64,  64,  64,  64, 
-		 64, 128,   0,  64,  64,   0,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		128,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,   0,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych == '[') goto yy997;
-	++p;
-yy996:
-	{ return 0; }
-yy997:
-	yych = *(marker = ++p);
-	if (yych != '^') goto yy996;
-	yych = *++p;
-	if (yych != ']') goto yy1001;
-yy999:
-	p = marker;
-	goto yy996;
-yy1000:
-	yych = *++p;
-yy1001:
-	if (yybm[0+yych] & 64) {
-		goto yy1000;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= ' ') goto yy999;
-			if (yych <= ']') goto yy1009;
-			goto yy999;
-		} else {
-			if (yych <= 0xDF) goto yy1002;
-			if (yych <= 0xE0) goto yy1003;
-			goto yy1004;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy1005;
-			if (yych <= 0xEF) goto yy1004;
-			goto yy1006;
-		} else {
-			if (yych <= 0xF3) goto yy1007;
-			if (yych <= 0xF4) goto yy1008;
-			goto yy999;
-		}
-	}
-yy1002:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy999;
-	if (yych <= 0xBF) goto yy1000;
-	goto yy999;
-yy1003:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy999;
-	if (yych <= 0xBF) goto yy1002;
-	goto yy999;
-yy1004:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy999;
-	if (yych <= 0xBF) goto yy1002;
-	goto yy999;
-yy1005:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy999;
-	if (yych <= 0x9F) goto yy1002;
-	goto yy999;
-yy1006:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy999;
-	if (yych <= 0xBF) goto yy1004;
-	goto yy999;
-yy1007:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy999;
-	if (yych <= 0xBF) goto yy1004;
-	goto yy999;
-yy1008:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy999;
-	if (yych <= 0x8F) goto yy1004;
-	goto yy999;
-yy1009:
-	yych = *++p;
-	if (yych != ':') goto yy999;
-yy1010:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy1010;
-	}
-	{ return (bufsize_t)(p - start); }
-}
-
+/* Generated by re2c 3.0 */
+#include "scanners.h"
+#include "chunk.h"
+#include <stdlib.h>
+
+bufsize_t _scan_at(bufsize_t (*scanner)(const unsigned char *), cmark_chunk *c,
+                   bufsize_t offset) {
+  bufsize_t res;
+  unsigned char *ptr = (unsigned char *)c->data;
+
+  if (ptr == NULL || offset > c->len) {
+    return 0;
+  } else {
+    unsigned char lim = ptr[c->len];
+
+    ptr[c->len] = '\0';
+    res = scanner(ptr + offset);
+    ptr[c->len] = lim;
+  }
+
+  return res;
+}
+
+// Try to match a scheme including colon.
+bufsize_t _scan_scheme(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    yych = *p;
+    if (yych <= '@')
+      goto yy1;
+    if (yych <= 'Z')
+      goto yy3;
+    if (yych <= '`')
+      goto yy1;
+    if (yych <= 'z')
+      goto yy3;
+  yy1:
+    ++p;
+  yy2 : { return 0; }
+  yy3:
+    yych = *(marker = ++p);
+    if (yych <= '/') {
+      if (yych <= '+') {
+        if (yych <= '*')
+          goto yy2;
+      } else {
+        if (yych <= ',')
+          goto yy2;
+        if (yych >= '/')
+          goto yy2;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '9')
+          goto yy4;
+        if (yych <= '@')
+          goto yy2;
+      } else {
+        if (yych <= '`')
+          goto yy2;
+        if (yych >= '{')
+          goto yy2;
+      }
+    }
+  yy4:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych == '+')
+          goto yy6;
+      } else {
+        if (yych != '/')
+          goto yy6;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych >= 'A')
+          goto yy6;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych <= 'z')
+          goto yy6;
+      }
+    }
+  yy5:
+    p = marker;
+    goto yy2;
+  yy6:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych == '+')
+          goto yy8;
+        goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+        goto yy8;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+        goto yy8;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych <= 'z')
+          goto yy8;
+        goto yy5;
+      }
+    }
+  yy7:
+    ++p;
+    { return (bufsize_t)(p - start); }
+  yy8:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy5;
+      } else {
+        if (yych == '/')
+          goto yy5;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy7;
+        if (yych <= '@')
+          goto yy5;
+      } else {
+        if (yych <= '`')
+          goto yy5;
+        if (yych >= '{')
+          goto yy5;
+      }
+    }
+    yych = *++p;
+    if (yych == ':')
+      goto yy7;
+    goto yy5;
+  }
+}
+
+// Try to match URI autolink after first <, returning number of chars matched.
+bufsize_t _scan_autolink_uri(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    static const unsigned char yybm[] = {
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 0,   128, 0,   128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,
+    };
+    yych = *p;
+    if (yych <= '@')
+      goto yy10;
+    if (yych <= 'Z')
+      goto yy12;
+    if (yych <= '`')
+      goto yy10;
+    if (yych <= 'z')
+      goto yy12;
+  yy10:
+    ++p;
+  yy11 : { return 0; }
+  yy12:
+    yych = *(marker = ++p);
+    if (yych <= '/') {
+      if (yych <= '+') {
+        if (yych <= '*')
+          goto yy11;
+      } else {
+        if (yych <= ',')
+          goto yy11;
+        if (yych >= '/')
+          goto yy11;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '9')
+          goto yy13;
+        if (yych <= '@')
+          goto yy11;
+      } else {
+        if (yych <= '`')
+          goto yy11;
+        if (yych >= '{')
+          goto yy11;
+      }
+    }
+  yy13:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych == '+')
+          goto yy15;
+      } else {
+        if (yych != '/')
+          goto yy15;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych >= 'A')
+          goto yy15;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych <= 'z')
+          goto yy15;
+      }
+    }
+  yy14:
+    p = marker;
+    goto yy11;
+  yy15:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych == '+')
+          goto yy17;
+        goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+        goto yy17;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+        goto yy17;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych <= 'z')
+          goto yy17;
+        goto yy14;
+      }
+    }
+  yy16:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy16;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '<')
+          goto yy14;
+        if (yych <= '>')
+          goto yy18;
+        goto yy14;
+      } else {
+        if (yych <= 0xDF)
+          goto yy19;
+        if (yych <= 0xE0)
+          goto yy20;
+        goto yy21;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy22;
+        if (yych <= 0xEF)
+          goto yy21;
+        goto yy23;
+      } else {
+        if (yych <= 0xF3)
+          goto yy24;
+        if (yych <= 0xF4)
+          goto yy25;
+        goto yy14;
+      }
+    }
+  yy17:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych == '+')
+          goto yy26;
+        goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+        goto yy26;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+        goto yy26;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych <= 'z')
+          goto yy26;
+        goto yy14;
+      }
+    }
+  yy18:
+    ++p;
+    { return (bufsize_t)(p - start); }
+  yy19:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy14;
+    if (yych <= 0xBF)
+      goto yy16;
+    goto yy14;
+  yy20:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy14;
+    if (yych <= 0xBF)
+      goto yy19;
+    goto yy14;
+  yy21:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy14;
+    if (yych <= 0xBF)
+      goto yy19;
+    goto yy14;
+  yy22:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy14;
+    if (yych <= 0x9F)
+      goto yy19;
+    goto yy14;
+  yy23:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy14;
+    if (yych <= 0xBF)
+      goto yy21;
+    goto yy14;
+  yy24:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy14;
+    if (yych <= 0xBF)
+      goto yy21;
+    goto yy14;
+  yy25:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy14;
+    if (yych <= 0x8F)
+      goto yy21;
+    goto yy14;
+  yy26:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych <= ',') {
+        if (yych != '+')
+          goto yy14;
+      } else {
+        if (yych == '/')
+          goto yy14;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= ':')
+          goto yy16;
+        if (yych <= '@')
+          goto yy14;
+      } else {
+        if (yych <= '`')
+          goto yy14;
+        if (yych >= '{')
+          goto yy14;
+      }
+    }
+    yych = *++p;
+    if (yych == ':')
+      goto yy16;
+    goto yy14;
+  }
+}
+
+// Try to match email autolink after first <, returning num of chars matched.
+bufsize_t _scan_autolink_email(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    static const unsigned char yybm[] = {
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   128, 0,   128, 128, 128, 128, 128, 0,   0,
+        128, 128, 0,   128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 0,   0,   0,   128, 0,   128, 0,   128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 0,   0,   0,   128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,
+    };
+    yych = *p;
+    if (yych <= '9') {
+      if (yych <= '\'') {
+        if (yych == '!')
+          goto yy30;
+        if (yych >= '#')
+          goto yy30;
+      } else {
+        if (yych <= ')')
+          goto yy28;
+        if (yych != ',')
+          goto yy30;
+      }
+    } else {
+      if (yych <= '?') {
+        if (yych == '=')
+          goto yy30;
+        if (yych >= '?')
+          goto yy30;
+      } else {
+        if (yych <= 'Z') {
+          if (yych >= 'A')
+            goto yy30;
+        } else {
+          if (yych <= ']')
+            goto yy28;
+          if (yych <= '~')
+            goto yy30;
+        }
+      }
+    }
+  yy28:
+    ++p;
+  yy29 : { return 0; }
+  yy30:
+    yych = *(marker = ++p);
+    if (yych <= ',') {
+      if (yych <= '"') {
+        if (yych == '!')
+          goto yy32;
+        goto yy29;
+      } else {
+        if (yych <= '\'')
+          goto yy32;
+        if (yych <= ')')
+          goto yy29;
+        if (yych <= '+')
+          goto yy32;
+        goto yy29;
+      }
+    } else {
+      if (yych <= '>') {
+        if (yych <= '9')
+          goto yy32;
+        if (yych == '=')
+          goto yy32;
+        goto yy29;
+      } else {
+        if (yych <= 'Z')
+          goto yy32;
+        if (yych <= ']')
+          goto yy29;
+        if (yych <= '~')
+          goto yy32;
+        goto yy29;
+      }
+    }
+  yy31:
+    yych = *++p;
+  yy32:
+    if (yybm[0 + yych] & 128) {
+      goto yy31;
+    }
+    if (yych <= '>')
+      goto yy33;
+    if (yych <= '@')
+      goto yy34;
+  yy33:
+    p = marker;
+    goto yy29;
+  yy34:
+    yych = *++p;
+    if (yych <= '@') {
+      if (yych <= '/')
+        goto yy33;
+      if (yych >= ':')
+        goto yy33;
+    } else {
+      if (yych <= 'Z')
+        goto yy35;
+      if (yych <= '`')
+        goto yy33;
+      if (yych >= '{')
+        goto yy33;
+    }
+  yy35:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy36;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy36;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy36;
+        goto yy33;
+      }
+    }
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy38;
+      if (yych <= '/')
+        goto yy33;
+      goto yy39;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy39;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy39;
+        goto yy33;
+      }
+    }
+  yy36:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych <= '-')
+          goto yy38;
+        goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy39;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy39;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy39;
+        goto yy33;
+      }
+    }
+  yy37:
+    ++p;
+    { return (bufsize_t)(p - start); }
+  yy38:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy40;
+      if (yych <= '/')
+        goto yy33;
+      goto yy41;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy41;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy41;
+        goto yy33;
+      }
+    }
+  yy39:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy41;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy41;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy41;
+        goto yy33;
+      }
+    }
+  yy40:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy42;
+      if (yych <= '/')
+        goto yy33;
+      goto yy43;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy43;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy43;
+        goto yy33;
+      }
+    }
+  yy41:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy43;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy43;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy43;
+        goto yy33;
+      }
+    }
+  yy42:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy44;
+      if (yych <= '/')
+        goto yy33;
+      goto yy45;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy45;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy45;
+        goto yy33;
+      }
+    }
+  yy43:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy45;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy45;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy45;
+        goto yy33;
+      }
+    }
+  yy44:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy46;
+      if (yych <= '/')
+        goto yy33;
+      goto yy47;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy47;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy47;
+        goto yy33;
+      }
+    }
+  yy45:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy47;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy47;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy47;
+        goto yy33;
+      }
+    }
+  yy46:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy48;
+      if (yych <= '/')
+        goto yy33;
+      goto yy49;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy49;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy49;
+        goto yy33;
+      }
+    }
+  yy47:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy49;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy49;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy49;
+        goto yy33;
+      }
+    }
+  yy48:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy50;
+      if (yych <= '/')
+        goto yy33;
+      goto yy51;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy51;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy51;
+        goto yy33;
+      }
+    }
+  yy49:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy51;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy51;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy51;
+        goto yy33;
+      }
+    }
+  yy50:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy52;
+      if (yych <= '/')
+        goto yy33;
+      goto yy53;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy53;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy53;
+        goto yy33;
+      }
+    }
+  yy51:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy53;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy53;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy53;
+        goto yy33;
+      }
+    }
+  yy52:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy54;
+      if (yych <= '/')
+        goto yy33;
+      goto yy55;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy55;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy55;
+        goto yy33;
+      }
+    }
+  yy53:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy55;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy55;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy55;
+        goto yy33;
+      }
+    }
+  yy54:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy56;
+      if (yych <= '/')
+        goto yy33;
+      goto yy57;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy57;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy57;
+        goto yy33;
+      }
+    }
+  yy55:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy57;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy57;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy57;
+        goto yy33;
+      }
+    }
+  yy56:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy58;
+      if (yych <= '/')
+        goto yy33;
+      goto yy59;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy59;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy59;
+        goto yy33;
+      }
+    }
+  yy57:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy59;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy59;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy59;
+        goto yy33;
+      }
+    }
+  yy58:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy60;
+      if (yych <= '/')
+        goto yy33;
+      goto yy61;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy61;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy61;
+        goto yy33;
+      }
+    }
+  yy59:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy61;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy61;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy61;
+        goto yy33;
+      }
+    }
+  yy60:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy62;
+      if (yych <= '/')
+        goto yy33;
+      goto yy63;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy63;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy63;
+        goto yy33;
+      }
+    }
+  yy61:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy63;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy63;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy63;
+        goto yy33;
+      }
+    }
+  yy62:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy64;
+      if (yych <= '/')
+        goto yy33;
+      goto yy65;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy65;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy65;
+        goto yy33;
+      }
+    }
+  yy63:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy65;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy65;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy65;
+        goto yy33;
+      }
+    }
+  yy64:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy66;
+      if (yych <= '/')
+        goto yy33;
+      goto yy67;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy67;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy67;
+        goto yy33;
+      }
+    }
+  yy65:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy67;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy67;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy67;
+        goto yy33;
+      }
+    }
+  yy66:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy68;
+      if (yych <= '/')
+        goto yy33;
+      goto yy69;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy69;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy69;
+        goto yy33;
+      }
+    }
+  yy67:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy69;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy69;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy69;
+        goto yy33;
+      }
+    }
+  yy68:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy70;
+      if (yych <= '/')
+        goto yy33;
+      goto yy71;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy71;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy71;
+        goto yy33;
+      }
+    }
+  yy69:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy71;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy71;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy71;
+        goto yy33;
+      }
+    }
+  yy70:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy72;
+      if (yych <= '/')
+        goto yy33;
+      goto yy73;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy73;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy73;
+        goto yy33;
+      }
+    }
+  yy71:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy73;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy73;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy73;
+        goto yy33;
+      }
+    }
+  yy72:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy74;
+      if (yych <= '/')
+        goto yy33;
+      goto yy75;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy75;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy75;
+        goto yy33;
+      }
+    }
+  yy73:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy75;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy75;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy75;
+        goto yy33;
+      }
+    }
+  yy74:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy76;
+      if (yych <= '/')
+        goto yy33;
+      goto yy77;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy77;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy77;
+        goto yy33;
+      }
+    }
+  yy75:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy77;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy77;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy77;
+        goto yy33;
+      }
+    }
+  yy76:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy78;
+      if (yych <= '/')
+        goto yy33;
+      goto yy79;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy79;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy79;
+        goto yy33;
+      }
+    }
+  yy77:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy79;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy79;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy79;
+        goto yy33;
+      }
+    }
+  yy78:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy80;
+      if (yych <= '/')
+        goto yy33;
+      goto yy81;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy81;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy81;
+        goto yy33;
+      }
+    }
+  yy79:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy81;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy81;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy81;
+        goto yy33;
+      }
+    }
+  yy80:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy82;
+      if (yych <= '/')
+        goto yy33;
+      goto yy83;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy83;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy83;
+        goto yy33;
+      }
+    }
+  yy81:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy83;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy83;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy83;
+        goto yy33;
+      }
+    }
+  yy82:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy84;
+      if (yych <= '/')
+        goto yy33;
+      goto yy85;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy85;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy85;
+        goto yy33;
+      }
+    }
+  yy83:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy85;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy85;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy85;
+        goto yy33;
+      }
+    }
+  yy84:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy86;
+      if (yych <= '/')
+        goto yy33;
+      goto yy87;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy87;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy87;
+        goto yy33;
+      }
+    }
+  yy85:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy87;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy87;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy87;
+        goto yy33;
+      }
+    }
+  yy86:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy88;
+      if (yych <= '/')
+        goto yy33;
+      goto yy89;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy89;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy89;
+        goto yy33;
+      }
+    }
+  yy87:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy89;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy89;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy89;
+        goto yy33;
+      }
+    }
+  yy88:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy90;
+      if (yych <= '/')
+        goto yy33;
+      goto yy91;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy91;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy91;
+        goto yy33;
+      }
+    }
+  yy89:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy91;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy91;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy91;
+        goto yy33;
+      }
+    }
+  yy90:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy92;
+      if (yych <= '/')
+        goto yy33;
+      goto yy93;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy93;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy93;
+        goto yy33;
+      }
+    }
+  yy91:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy93;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy93;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy93;
+        goto yy33;
+      }
+    }
+  yy92:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy94;
+      if (yych <= '/')
+        goto yy33;
+      goto yy95;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy95;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy95;
+        goto yy33;
+      }
+    }
+  yy93:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy95;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy95;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy95;
+        goto yy33;
+      }
+    }
+  yy94:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy96;
+      if (yych <= '/')
+        goto yy33;
+      goto yy97;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy97;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy97;
+        goto yy33;
+      }
+    }
+  yy95:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy97;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy97;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy97;
+        goto yy33;
+      }
+    }
+  yy96:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy98;
+      if (yych <= '/')
+        goto yy33;
+      goto yy99;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy99;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy99;
+        goto yy33;
+      }
+    }
+  yy97:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy99;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy99;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy99;
+        goto yy33;
+      }
+    }
+  yy98:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy100;
+      if (yych <= '/')
+        goto yy33;
+      goto yy101;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy101;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy101;
+        goto yy33;
+      }
+    }
+  yy99:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy101;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy101;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy101;
+        goto yy33;
+      }
+    }
+  yy100:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy102;
+      if (yych <= '/')
+        goto yy33;
+      goto yy103;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy103;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy103;
+        goto yy33;
+      }
+    }
+  yy101:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy103;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy103;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy103;
+        goto yy33;
+      }
+    }
+  yy102:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy104;
+      if (yych <= '/')
+        goto yy33;
+      goto yy105;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy105;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy105;
+        goto yy33;
+      }
+    }
+  yy103:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy105;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy105;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy105;
+        goto yy33;
+      }
+    }
+  yy104:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy106;
+      if (yych <= '/')
+        goto yy33;
+      goto yy107;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy107;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy107;
+        goto yy33;
+      }
+    }
+  yy105:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy107;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy107;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy107;
+        goto yy33;
+      }
+    }
+  yy106:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy108;
+      if (yych <= '/')
+        goto yy33;
+      goto yy109;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy109;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy109;
+        goto yy33;
+      }
+    }
+  yy107:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy109;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy109;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy109;
+        goto yy33;
+      }
+    }
+  yy108:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy110;
+      if (yych <= '/')
+        goto yy33;
+      goto yy111;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy111;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy111;
+        goto yy33;
+      }
+    }
+  yy109:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy111;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy111;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy111;
+        goto yy33;
+      }
+    }
+  yy110:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy112;
+      if (yych <= '/')
+        goto yy33;
+      goto yy113;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy113;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy113;
+        goto yy33;
+      }
+    }
+  yy111:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy113;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy113;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy113;
+        goto yy33;
+      }
+    }
+  yy112:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy114;
+      if (yych <= '/')
+        goto yy33;
+      goto yy115;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy115;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy115;
+        goto yy33;
+      }
+    }
+  yy113:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy115;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy115;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy115;
+        goto yy33;
+      }
+    }
+  yy114:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy116;
+      if (yych <= '/')
+        goto yy33;
+      goto yy117;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy117;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy117;
+        goto yy33;
+      }
+    }
+  yy115:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy117;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy117;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy117;
+        goto yy33;
+      }
+    }
+  yy116:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy118;
+      if (yych <= '/')
+        goto yy33;
+      goto yy119;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy119;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy119;
+        goto yy33;
+      }
+    }
+  yy117:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy119;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy119;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy119;
+        goto yy33;
+      }
+    }
+  yy118:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy120;
+      if (yych <= '/')
+        goto yy33;
+      goto yy121;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy121;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy121;
+        goto yy33;
+      }
+    }
+  yy119:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy121;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy121;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy121;
+        goto yy33;
+      }
+    }
+  yy120:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy122;
+      if (yych <= '/')
+        goto yy33;
+      goto yy123;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy123;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy123;
+        goto yy33;
+      }
+    }
+  yy121:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy123;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy123;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy123;
+        goto yy33;
+      }
+    }
+  yy122:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy124;
+      if (yych <= '/')
+        goto yy33;
+      goto yy125;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy125;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy125;
+        goto yy33;
+      }
+    }
+  yy123:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy125;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy125;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy125;
+        goto yy33;
+      }
+    }
+  yy124:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy126;
+      if (yych <= '/')
+        goto yy33;
+      goto yy127;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy127;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy127;
+        goto yy33;
+      }
+    }
+  yy125:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy127;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy127;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy127;
+        goto yy33;
+      }
+    }
+  yy126:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy128;
+      if (yych <= '/')
+        goto yy33;
+      goto yy129;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy129;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy129;
+        goto yy33;
+      }
+    }
+  yy127:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy129;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy129;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy129;
+        goto yy33;
+      }
+    }
+  yy128:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy130;
+      if (yych <= '/')
+        goto yy33;
+      goto yy131;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy131;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy131;
+        goto yy33;
+      }
+    }
+  yy129:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy131;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy131;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy131;
+        goto yy33;
+      }
+    }
+  yy130:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy132;
+      if (yych <= '/')
+        goto yy33;
+      goto yy133;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy133;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy133;
+        goto yy33;
+      }
+    }
+  yy131:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy133;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy133;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy133;
+        goto yy33;
+      }
+    }
+  yy132:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy134;
+      if (yych <= '/')
+        goto yy33;
+      goto yy135;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy135;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy135;
+        goto yy33;
+      }
+    }
+  yy133:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy135;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy135;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy135;
+        goto yy33;
+      }
+    }
+  yy134:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy136;
+      if (yych <= '/')
+        goto yy33;
+      goto yy137;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy137;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy137;
+        goto yy33;
+      }
+    }
+  yy135:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy137;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy137;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy137;
+        goto yy33;
+      }
+    }
+  yy136:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy138;
+      if (yych <= '/')
+        goto yy33;
+      goto yy139;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy139;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy139;
+        goto yy33;
+      }
+    }
+  yy137:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy139;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy139;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy139;
+        goto yy33;
+      }
+    }
+  yy138:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy140;
+      if (yych <= '/')
+        goto yy33;
+      goto yy141;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy141;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy141;
+        goto yy33;
+      }
+    }
+  yy139:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy141;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy141;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy141;
+        goto yy33;
+      }
+    }
+  yy140:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy142;
+      if (yych <= '/')
+        goto yy33;
+      goto yy143;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy143;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy143;
+        goto yy33;
+      }
+    }
+  yy141:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy143;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy143;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy143;
+        goto yy33;
+      }
+    }
+  yy142:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy144;
+      if (yych <= '/')
+        goto yy33;
+      goto yy145;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy145;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy145;
+        goto yy33;
+      }
+    }
+  yy143:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy145;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy145;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy145;
+        goto yy33;
+      }
+    }
+  yy144:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy146;
+      if (yych <= '/')
+        goto yy33;
+      goto yy147;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy147;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy147;
+        goto yy33;
+      }
+    }
+  yy145:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy147;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy147;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy147;
+        goto yy33;
+      }
+    }
+  yy146:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy148;
+      if (yych <= '/')
+        goto yy33;
+      goto yy149;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy149;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy149;
+        goto yy33;
+      }
+    }
+  yy147:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy149;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy149;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy149;
+        goto yy33;
+      }
+    }
+  yy148:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy150;
+      if (yych <= '/')
+        goto yy33;
+      goto yy151;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy151;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy151;
+        goto yy33;
+      }
+    }
+  yy149:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy151;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy151;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy151;
+        goto yy33;
+      }
+    }
+  yy150:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy152;
+      if (yych <= '/')
+        goto yy33;
+      goto yy153;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy153;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy153;
+        goto yy33;
+      }
+    }
+  yy151:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy153;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy153;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy153;
+        goto yy33;
+      }
+    }
+  yy152:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy154;
+      if (yych <= '/')
+        goto yy33;
+      goto yy155;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy155;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy155;
+        goto yy33;
+      }
+    }
+  yy153:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy155;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy155;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy155;
+        goto yy33;
+      }
+    }
+  yy154:
+    yych = *++p;
+    if (yych <= '9') {
+      if (yych == '-')
+        goto yy156;
+      if (yych <= '/')
+        goto yy33;
+      goto yy157;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy33;
+        goto yy157;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy157;
+        goto yy33;
+      }
+    }
+  yy155:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= ',')
+          goto yy33;
+        if (yych >= '.')
+          goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych <= '9')
+          goto yy157;
+        goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+        goto yy157;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych <= 'z')
+          goto yy157;
+        goto yy33;
+      }
+    }
+  yy156:
+    yych = *++p;
+    if (yych <= '@') {
+      if (yych <= '/')
+        goto yy33;
+      if (yych <= '9')
+        goto yy158;
+      goto yy33;
+    } else {
+      if (yych <= 'Z')
+        goto yy158;
+      if (yych <= '`')
+        goto yy33;
+      if (yych <= 'z')
+        goto yy158;
+      goto yy33;
+    }
+  yy157:
+    yych = *++p;
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych <= '-')
+          goto yy33;
+        goto yy34;
+      } else {
+        if (yych <= '/')
+          goto yy33;
+        if (yych >= ':')
+          goto yy33;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy37;
+        if (yych <= '@')
+          goto yy33;
+      } else {
+        if (yych <= '`')
+          goto yy33;
+        if (yych >= '{')
+          goto yy33;
+      }
+    }
+  yy158:
+    yych = *++p;
+    if (yych == '.')
+      goto yy34;
+    if (yych == '>')
+      goto yy37;
+    goto yy33;
+  }
+}
+
+// Try to match an HTML tag after first <, returning num of chars matched.
+bufsize_t _scan_html_tag(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    static const unsigned char yybm[] = {
+        0,   224, 224, 224, 224, 224, 224, 224, 224, 200, 200, 200, 200, 200,
+        224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+        224, 224, 224, 224, 200, 224, 128, 224, 224, 224, 224, 64,  224, 224,
+        224, 224, 224, 244, 240, 224, 244, 244, 244, 244, 244, 244, 244, 244,
+        244, 244, 240, 224, 192, 192, 192, 224, 224, 244, 244, 244, 244, 244,
+        244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244,
+        244, 244, 244, 244, 244, 244, 244, 224, 224, 224, 224, 240, 192, 244,
+        244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244,
+        244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 224, 224, 224,
+        224, 224, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,
+    };
+    yych = *p;
+    if (yych <= '@') {
+      if (yych == '/')
+        goto yy162;
+    } else {
+      if (yych <= 'Z')
+        goto yy163;
+      if (yych <= '`')
+        goto yy160;
+      if (yych <= 'z')
+        goto yy163;
+    }
+  yy160:
+    ++p;
+  yy161 : { return 0; }
+  yy162:
+    yych = *(marker = ++p);
+    if (yych <= '@')
+      goto yy161;
+    if (yych <= 'Z')
+      goto yy164;
+    if (yych <= '`')
+      goto yy161;
+    if (yych <= 'z')
+      goto yy164;
+    goto yy161;
+  yy163:
+    yych = *(marker = ++p);
+    if (yych <= '.') {
+      if (yych <= 0x1F) {
+        if (yych <= 0x08)
+          goto yy161;
+        if (yych <= '\r')
+          goto yy168;
+        goto yy161;
+      } else {
+        if (yych <= ' ')
+          goto yy168;
+        if (yych == '-')
+          goto yy168;
+        goto yy161;
+      }
+    } else {
+      if (yych <= '@') {
+        if (yych <= '9')
+          goto yy168;
+        if (yych == '>')
+          goto yy168;
+        goto yy161;
+      } else {
+        if (yych <= 'Z')
+          goto yy168;
+        if (yych <= '`')
+          goto yy161;
+        if (yych <= 'z')
+          goto yy168;
+        goto yy161;
+      }
+    }
+  yy164:
+    yych = *++p;
+    if (yybm[0 + yych] & 4) {
+      goto yy164;
+    }
+    if (yych <= 0x1F) {
+      if (yych <= 0x08)
+        goto yy165;
+      if (yych <= '\r')
+        goto yy171;
+    } else {
+      if (yych <= ' ')
+        goto yy171;
+      if (yych == '>')
+        goto yy170;
+    }
+  yy165:
+    p = marker;
+    goto yy161;
+  yy166:
+    yych = *++p;
+    if (yybm[0 + yych] & 8) {
+      goto yy166;
+    }
+    if (yych <= '>') {
+      if (yych <= '9') {
+        if (yych == '/')
+          goto yy169;
+        goto yy165;
+      } else {
+        if (yych <= ':')
+          goto yy172;
+        if (yych <= '=')
+          goto yy165;
+        goto yy170;
+      }
+    } else {
+      if (yych <= '^') {
+        if (yych <= '@')
+          goto yy165;
+        if (yych <= 'Z')
+          goto yy172;
+        goto yy165;
+      } else {
+        if (yych == '`')
+          goto yy165;
+        if (yych <= 'z')
+          goto yy172;
+        goto yy165;
+      }
+    }
+  yy167:
+    yych = *++p;
+  yy168:
+    if (yybm[0 + yych] & 8) {
+      goto yy166;
+    }
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych == '-')
+          goto yy167;
+        goto yy165;
+      } else {
+        if (yych <= '/')
+          goto yy169;
+        if (yych <= '9')
+          goto yy167;
+        goto yy165;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy170;
+        if (yych <= '@')
+          goto yy165;
+        goto yy167;
+      } else {
+        if (yych <= '`')
+          goto yy165;
+        if (yych <= 'z')
+          goto yy167;
+        goto yy165;
+      }
+    }
+  yy169:
+    yych = *++p;
+    if (yych != '>')
+      goto yy165;
+  yy170:
+    ++p;
+    { return (bufsize_t)(p - start); }
+  yy171:
+    yych = *++p;
+    if (yych <= 0x1F) {
+      if (yych <= 0x08)
+        goto yy165;
+      if (yych <= '\r')
+        goto yy171;
+      goto yy165;
+    } else {
+      if (yych <= ' ')
+        goto yy171;
+      if (yych == '>')
+        goto yy170;
+      goto yy165;
+    }
+  yy172:
+    yych = *++p;
+    if (yybm[0 + yych] & 16) {
+      goto yy172;
+    }
+    if (yych <= ',') {
+      if (yych <= '\r') {
+        if (yych <= 0x08)
+          goto yy165;
+      } else {
+        if (yych != ' ')
+          goto yy165;
+      }
+    } else {
+      if (yych <= '<') {
+        if (yych <= '/')
+          goto yy169;
+        goto yy165;
+      } else {
+        if (yych <= '=')
+          goto yy174;
+        if (yych <= '>')
+          goto yy170;
+        goto yy165;
+      }
+    }
+  yy173:
+    yych = *++p;
+    if (yych <= '<') {
+      if (yych <= ' ') {
+        if (yych <= 0x08)
+          goto yy165;
+        if (yych <= '\r')
+          goto yy173;
+        if (yych <= 0x1F)
+          goto yy165;
+        goto yy173;
+      } else {
+        if (yych <= '/') {
+          if (yych <= '.')
+            goto yy165;
+          goto yy169;
+        } else {
+          if (yych == ':')
+            goto yy172;
+          goto yy165;
+        }
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '=')
+          goto yy174;
+        if (yych <= '>')
+          goto yy170;
+        if (yych <= '@')
+          goto yy165;
+        goto yy172;
+      } else {
+        if (yych <= '_') {
+          if (yych <= '^')
+            goto yy165;
+          goto yy172;
+        } else {
+          if (yych <= '`')
+            goto yy165;
+          if (yych <= 'z')
+            goto yy172;
+          goto yy165;
+        }
+      }
+    }
+  yy174:
+    yych = *++p;
+    if (yybm[0 + yych] & 32) {
+      goto yy175;
+    }
+    if (yych <= 0xE0) {
+      if (yych <= '"') {
+        if (yych <= 0x00)
+          goto yy165;
+        if (yych <= ' ')
+          goto yy174;
+        goto yy176;
+      } else {
+        if (yych <= '\'')
+          goto yy177;
+        if (yych <= 0xC1)
+          goto yy165;
+        if (yych <= 0xDF)
+          goto yy178;
+        goto yy179;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy181;
+        goto yy180;
+      } else {
+        if (yych <= 0xF0)
+          goto yy182;
+        if (yych <= 0xF3)
+          goto yy183;
+        if (yych <= 0xF4)
+          goto yy184;
+        goto yy165;
+      }
+    }
+  yy175:
+    yych = *++p;
+    if (yybm[0 + yych] & 32) {
+      goto yy175;
+    }
+    if (yych <= 0xE0) {
+      if (yych <= '=') {
+        if (yych <= 0x00)
+          goto yy165;
+        if (yych <= ' ')
+          goto yy166;
+        goto yy165;
+      } else {
+        if (yych <= '>')
+          goto yy170;
+        if (yych <= 0xC1)
+          goto yy165;
+        if (yych <= 0xDF)
+          goto yy178;
+        goto yy179;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy181;
+        goto yy180;
+      } else {
+        if (yych <= 0xF0)
+          goto yy182;
+        if (yych <= 0xF3)
+          goto yy183;
+        if (yych <= 0xF4)
+          goto yy184;
+        goto yy165;
+      }
+    }
+  yy176:
+    yych = *++p;
+    if (yybm[0 + yych] & 64) {
+      goto yy176;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= 0x00)
+          goto yy165;
+        if (yych <= '"')
+          goto yy185;
+        goto yy165;
+      } else {
+        if (yych <= 0xDF)
+          goto yy186;
+        if (yych <= 0xE0)
+          goto yy187;
+        goto yy188;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy189;
+        if (yych <= 0xEF)
+          goto yy188;
+        goto yy190;
+      } else {
+        if (yych <= 0xF3)
+          goto yy191;
+        if (yych <= 0xF4)
+          goto yy192;
+        goto yy165;
+      }
+    }
+  yy177:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy177;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= 0x00)
+          goto yy165;
+        if (yych <= '\'')
+          goto yy185;
+        goto yy165;
+      } else {
+        if (yych <= 0xDF)
+          goto yy193;
+        if (yych <= 0xE0)
+          goto yy194;
+        goto yy195;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy196;
+        if (yych <= 0xEF)
+          goto yy195;
+        goto yy197;
+      } else {
+        if (yych <= 0xF3)
+          goto yy198;
+        if (yych <= 0xF4)
+          goto yy199;
+        goto yy165;
+      }
+    }
+  yy178:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy175;
+    goto yy165;
+  yy179:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy178;
+    goto yy165;
+  yy180:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy178;
+    goto yy165;
+  yy181:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0x9F)
+      goto yy178;
+    goto yy165;
+  yy182:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy180;
+    goto yy165;
+  yy183:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy180;
+    goto yy165;
+  yy184:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0x8F)
+      goto yy180;
+    goto yy165;
+  yy185:
+    yych = *++p;
+    if (yybm[0 + yych] & 8) {
+      goto yy166;
+    }
+    if (yych == '/')
+      goto yy169;
+    if (yych == '>')
+      goto yy170;
+    goto yy165;
+  yy186:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy176;
+    goto yy165;
+  yy187:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy186;
+    goto yy165;
+  yy188:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy186;
+    goto yy165;
+  yy189:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0x9F)
+      goto yy186;
+    goto yy165;
+  yy190:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy188;
+    goto yy165;
+  yy191:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy188;
+    goto yy165;
+  yy192:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0x8F)
+      goto yy188;
+    goto yy165;
+  yy193:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy177;
+    goto yy165;
+  yy194:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy193;
+    goto yy165;
+  yy195:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy193;
+    goto yy165;
+  yy196:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0x9F)
+      goto yy193;
+    goto yy165;
+  yy197:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy195;
+    goto yy165;
+  yy198:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0xBF)
+      goto yy195;
+    goto yy165;
+  yy199:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy165;
+    if (yych <= 0x8F)
+      goto yy195;
+    goto yy165;
+  }
+}
+
+// Try to (liberally) match an HTML tag after first <, returning num of chars
+// matched.
+bufsize_t _scan_liberal_html_tag(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    unsigned int yyaccept = 0;
+    static const unsigned char yybm[] = {
+        0,  64, 64, 64, 64, 64, 64, 64, 64,  64, 0,  64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,
+    };
+    yych = *p;
+    if (yych <= 0xE0) {
+      if (yych <= '\n') {
+        if (yych <= 0x00)
+          goto yy201;
+        if (yych <= '\t')
+          goto yy203;
+      } else {
+        if (yych <= 0x7F)
+          goto yy203;
+        if (yych <= 0xC1)
+          goto yy201;
+        if (yych <= 0xDF)
+          goto yy204;
+        goto yy205;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy207;
+        goto yy206;
+      } else {
+        if (yych <= 0xF0)
+          goto yy208;
+        if (yych <= 0xF3)
+          goto yy209;
+        if (yych <= 0xF4)
+          goto yy210;
+      }
+    }
+  yy201:
+    ++p;
+  yy202 : { return 0; }
+  yy203:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= '\n') {
+      if (yych <= 0x00)
+        goto yy202;
+      if (yych <= '\t')
+        goto yy212;
+      goto yy202;
+    } else {
+      if (yych <= 0x7F)
+        goto yy212;
+      if (yych <= 0xC1)
+        goto yy202;
+      if (yych <= 0xF4)
+        goto yy212;
+      goto yy202;
+    }
+  yy204:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy202;
+    if (yych <= 0xBF)
+      goto yy211;
+    goto yy202;
+  yy205:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x9F)
+      goto yy202;
+    if (yych <= 0xBF)
+      goto yy216;
+    goto yy202;
+  yy206:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy202;
+    if (yych <= 0xBF)
+      goto yy216;
+    goto yy202;
+  yy207:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy202;
+    if (yych <= 0x9F)
+      goto yy216;
+    goto yy202;
+  yy208:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x8F)
+      goto yy202;
+    if (yych <= 0xBF)
+      goto yy218;
+    goto yy202;
+  yy209:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy202;
+    if (yych <= 0xBF)
+      goto yy218;
+    goto yy202;
+  yy210:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy202;
+    if (yych <= 0x8F)
+      goto yy218;
+    goto yy202;
+  yy211:
+    yych = *++p;
+  yy212:
+    if (yybm[0 + yych] & 64) {
+      goto yy211;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy213;
+        if (yych <= '>')
+          goto yy214;
+      } else {
+        if (yych <= 0xDF)
+          goto yy216;
+        if (yych <= 0xE0)
+          goto yy217;
+        goto yy218;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy219;
+        if (yych <= 0xEF)
+          goto yy218;
+        goto yy220;
+      } else {
+        if (yych <= 0xF3)
+          goto yy221;
+        if (yych <= 0xF4)
+          goto yy222;
+      }
+    }
+  yy213:
+    p = marker;
+    if (yyaccept == 0) {
+      goto yy202;
+    } else {
+      goto yy215;
+    }
+  yy214:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 64) {
+      goto yy211;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy215;
+        if (yych <= '>')
+          goto yy214;
+      } else {
+        if (yych <= 0xDF)
+          goto yy216;
+        if (yych <= 0xE0)
+          goto yy217;
+        goto yy218;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy219;
+        if (yych <= 0xEF)
+          goto yy218;
+        goto yy220;
+      } else {
+        if (yych <= 0xF3)
+          goto yy221;
+        if (yych <= 0xF4)
+          goto yy222;
+      }
+    }
+  yy215 : { return (bufsize_t)(p - start); }
+  yy216:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy213;
+    if (yych <= 0xBF)
+      goto yy211;
+    goto yy213;
+  yy217:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy213;
+    if (yych <= 0xBF)
+      goto yy216;
+    goto yy213;
+  yy218:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy213;
+    if (yych <= 0xBF)
+      goto yy216;
+    goto yy213;
+  yy219:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy213;
+    if (yych <= 0x9F)
+      goto yy216;
+    goto yy213;
+  yy220:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy213;
+    if (yych <= 0xBF)
+      goto yy218;
+    goto yy213;
+  yy221:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy213;
+    if (yych <= 0xBF)
+      goto yy218;
+    goto yy213;
+  yy222:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy213;
+    if (yych <= 0x8F)
+      goto yy218;
+    goto yy213;
+  }
+}
+
+bufsize_t _scan_html_comment(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    static const unsigned char yybm[] = {
+        0,   128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 0,   128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,
+    };
+    yych = *p;
+    if (yych == '-')
+      goto yy225;
+    ++p;
+  yy224 : { return 0; }
+  yy225:
+    yych = *(marker = ++p);
+    if (yych != '-')
+      goto yy224;
+  yy226:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy226;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= 0x00)
+          goto yy227;
+        if (yych <= '-')
+          goto yy228;
+      } else {
+        if (yych <= 0xDF)
+          goto yy229;
+        if (yych <= 0xE0)
+          goto yy230;
+        goto yy231;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy232;
+        if (yych <= 0xEF)
+          goto yy231;
+        goto yy233;
+      } else {
+        if (yych <= 0xF3)
+          goto yy234;
+        if (yych <= 0xF4)
+          goto yy235;
+      }
+    }
+  yy227:
+    p = marker;
+    goto yy224;
+  yy228:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy226;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= 0x00)
+          goto yy227;
+        if (yych <= '-')
+          goto yy236;
+        goto yy227;
+      } else {
+        if (yych <= 0xDF)
+          goto yy229;
+        if (yych <= 0xE0)
+          goto yy230;
+        goto yy231;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy232;
+        if (yych <= 0xEF)
+          goto yy231;
+        goto yy233;
+      } else {
+        if (yych <= 0xF3)
+          goto yy234;
+        if (yych <= 0xF4)
+          goto yy235;
+        goto yy227;
+      }
+    }
+  yy229:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy227;
+    if (yych <= 0xBF)
+      goto yy226;
+    goto yy227;
+  yy230:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy227;
+    if (yych <= 0xBF)
+      goto yy229;
+    goto yy227;
+  yy231:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy227;
+    if (yych <= 0xBF)
+      goto yy229;
+    goto yy227;
+  yy232:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy227;
+    if (yych <= 0x9F)
+      goto yy229;
+    goto yy227;
+  yy233:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy227;
+    if (yych <= 0xBF)
+      goto yy231;
+    goto yy227;
+  yy234:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy227;
+    if (yych <= 0xBF)
+      goto yy231;
+    goto yy227;
+  yy235:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy227;
+    if (yych <= 0x8F)
+      goto yy231;
+    goto yy227;
+  yy236:
+    yych = *++p;
+    if (yych <= 0xE0) {
+      if (yych <= '>') {
+        if (yych <= 0x00)
+          goto yy227;
+        if (yych <= '=')
+          goto yy226;
+      } else {
+        if (yych <= 0x7F)
+          goto yy226;
+        if (yych <= 0xC1)
+          goto yy227;
+        if (yych <= 0xDF)
+          goto yy229;
+        goto yy230;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy232;
+        goto yy231;
+      } else {
+        if (yych <= 0xF0)
+          goto yy233;
+        if (yych <= 0xF3)
+          goto yy234;
+        if (yych <= 0xF4)
+          goto yy235;
+        goto yy227;
+      }
+    }
+    ++p;
+    { return (bufsize_t)(p - start); }
+  }
+}
+
+bufsize_t _scan_html_pi(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    unsigned int yyaccept = 0;
+    static const unsigned char yybm[] = {
+        0,   128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 0,   128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,
+    };
+    yych = *p;
+    if (yybm[0 + yych] & 128) {
+      goto yy240;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= 0x00)
+          goto yy238;
+        if (yych <= '?')
+          goto yy243;
+      } else {
+        if (yych <= 0xDF)
+          goto yy244;
+        if (yych <= 0xE0)
+          goto yy245;
+        goto yy246;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy247;
+        if (yych <= 0xEF)
+          goto yy246;
+        goto yy248;
+      } else {
+        if (yych <= 0xF3)
+          goto yy249;
+        if (yych <= 0xF4)
+          goto yy250;
+      }
+    }
+  yy238:
+    ++p;
+  yy239 : { return 0; }
+  yy240:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+  yy241:
+    if (yybm[0 + yych] & 128) {
+      goto yy240;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= 0x00)
+          goto yy242;
+        if (yych <= '?')
+          goto yy251;
+      } else {
+        if (yych <= 0xDF)
+          goto yy253;
+        if (yych <= 0xE0)
+          goto yy254;
+        goto yy255;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy256;
+        if (yych <= 0xEF)
+          goto yy255;
+        goto yy257;
+      } else {
+        if (yych <= 0xF3)
+          goto yy258;
+        if (yych <= 0xF4)
+          goto yy259;
+      }
+    }
+  yy242 : { return (bufsize_t)(p - start); }
+  yy243:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych <= '?') {
+      if (yych <= 0x00)
+        goto yy239;
+      if (yych <= '=')
+        goto yy241;
+      if (yych <= '>')
+        goto yy239;
+      goto yy240;
+    } else {
+      if (yych <= 0x7F)
+        goto yy241;
+      if (yych <= 0xC1)
+        goto yy239;
+      if (yych <= 0xF4)
+        goto yy241;
+      goto yy239;
+    }
+  yy244:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy239;
+    if (yych <= 0xBF)
+      goto yy240;
+    goto yy239;
+  yy245:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych <= 0x9F)
+      goto yy239;
+    if (yych <= 0xBF)
+      goto yy253;
+    goto yy239;
+  yy246:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy239;
+    if (yych <= 0xBF)
+      goto yy253;
+    goto yy239;
+  yy247:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy239;
+    if (yych <= 0x9F)
+      goto yy253;
+    goto yy239;
+  yy248:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych <= 0x8F)
+      goto yy239;
+    if (yych <= 0xBF)
+      goto yy255;
+    goto yy239;
+  yy249:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy239;
+    if (yych <= 0xBF)
+      goto yy255;
+    goto yy239;
+  yy250:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy239;
+    if (yych <= 0x8F)
+      goto yy255;
+    goto yy239;
+  yy251:
+    yych = *++p;
+    if (yych <= 0xE0) {
+      if (yych <= '>') {
+        if (yych <= 0x00)
+          goto yy252;
+        if (yych <= '=')
+          goto yy240;
+      } else {
+        if (yych <= 0x7F)
+          goto yy240;
+        if (yych <= 0xC1)
+          goto yy252;
+        if (yych <= 0xDF)
+          goto yy253;
+        goto yy254;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy256;
+        goto yy255;
+      } else {
+        if (yych <= 0xF0)
+          goto yy257;
+        if (yych <= 0xF3)
+          goto yy258;
+        if (yych <= 0xF4)
+          goto yy259;
+      }
+    }
+  yy252:
+    p = marker;
+    if (yyaccept == 0) {
+      goto yy242;
+    } else {
+      goto yy239;
+    }
+  yy253:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy252;
+    if (yych <= 0xBF)
+      goto yy240;
+    goto yy252;
+  yy254:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy252;
+    if (yych <= 0xBF)
+      goto yy253;
+    goto yy252;
+  yy255:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy252;
+    if (yych <= 0xBF)
+      goto yy253;
+    goto yy252;
+  yy256:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy252;
+    if (yych <= 0x9F)
+      goto yy253;
+    goto yy252;
+  yy257:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy252;
+    if (yych <= 0xBF)
+      goto yy255;
+    goto yy252;
+  yy258:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy252;
+    if (yych <= 0xBF)
+      goto yy255;
+    goto yy252;
+  yy259:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy252;
+    if (yych <= 0x8F)
+      goto yy255;
+    goto yy252;
+  }
+}
+
+bufsize_t _scan_html_declaration(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    unsigned int yyaccept = 0;
+    static const unsigned char yybm[] = {
+        0,   64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+        64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+        64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+        64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+        64,  64,  64,  64,  64,  64,  0,   64,  64,  192, 192, 192, 192, 192,
+        192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+        192, 192, 192, 192, 192, 192, 192, 64,  64,  64,  64,  64,  64,  64,
+        64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+        64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+        64,  64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,
+    };
+    yych = *p;
+    if (yych <= '@')
+      goto yy261;
+    if (yych <= 'Z')
+      goto yy263;
+  yy261:
+    ++p;
+  yy262 : { return 0; }
+  yy263:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 128) {
+      goto yy266;
+    }
+    if (yych <= 0x08)
+      goto yy262;
+    if (yych <= '\r')
+      goto yy264;
+    if (yych != ' ')
+      goto yy262;
+  yy264:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 64) {
+      goto yy264;
+    }
+    if (yych <= 0xED) {
+      if (yych <= 0xDF) {
+        if (yych >= 0xC2)
+          goto yy268;
+      } else {
+        if (yych <= 0xE0)
+          goto yy269;
+        if (yych <= 0xEC)
+          goto yy270;
+        goto yy271;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xEF)
+          goto yy270;
+        goto yy272;
+      } else {
+        if (yych <= 0xF3)
+          goto yy273;
+        if (yych <= 0xF4)
+          goto yy274;
+      }
+    }
+  yy265 : { return (bufsize_t)(p - start); }
+  yy266:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy266;
+    }
+    if (yych <= 0x08)
+      goto yy267;
+    if (yych <= '\r')
+      goto yy264;
+    if (yych == ' ')
+      goto yy264;
+  yy267:
+    p = marker;
+    if (yyaccept == 0) {
+      goto yy262;
+    } else {
+      goto yy265;
+    }
+  yy268:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy267;
+    if (yych <= 0xBF)
+      goto yy264;
+    goto yy267;
+  yy269:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy267;
+    if (yych <= 0xBF)
+      goto yy268;
+    goto yy267;
+  yy270:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy267;
+    if (yych <= 0xBF)
+      goto yy268;
+    goto yy267;
+  yy271:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy267;
+    if (yych <= 0x9F)
+      goto yy268;
+    goto yy267;
+  yy272:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy267;
+    if (yych <= 0xBF)
+      goto yy270;
+    goto yy267;
+  yy273:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy267;
+    if (yych <= 0xBF)
+      goto yy270;
+    goto yy267;
+  yy274:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy267;
+    if (yych <= 0x8F)
+      goto yy270;
+    goto yy267;
+  }
+}
+
+bufsize_t _scan_html_cdata(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    unsigned int yyaccept = 0;
+    static const unsigned char yybm[] = {
+        0,   128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 0,   128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,
+    };
+    yych = *p;
+    if (yych == 'C')
+      goto yy277;
+    if (yych == 'c')
+      goto yy277;
+    ++p;
+  yy276 : { return 0; }
+  yy277:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych == 'D')
+      goto yy278;
+    if (yych != 'd')
+      goto yy276;
+  yy278:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy280;
+    if (yych == 'a')
+      goto yy280;
+  yy279:
+    p = marker;
+    if (yyaccept == 0) {
+      goto yy276;
+    } else {
+      goto yy284;
+    }
+  yy280:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy281;
+    if (yych != 't')
+      goto yy279;
+  yy281:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy282;
+    if (yych != 'a')
+      goto yy279;
+  yy282:
+    yych = *++p;
+    if (yych != '[')
+      goto yy279;
+  yy283:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 128) {
+      goto yy283;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= 0x00)
+          goto yy284;
+        if (yych <= ']')
+          goto yy285;
+      } else {
+        if (yych <= 0xDF)
+          goto yy286;
+        if (yych <= 0xE0)
+          goto yy287;
+        goto yy288;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy289;
+        if (yych <= 0xEF)
+          goto yy288;
+        goto yy290;
+      } else {
+        if (yych <= 0xF3)
+          goto yy291;
+        if (yych <= 0xF4)
+          goto yy292;
+      }
+    }
+  yy284 : { return (bufsize_t)(p - start); }
+  yy285:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy283;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= 0x00)
+          goto yy279;
+        if (yych <= ']')
+          goto yy293;
+        goto yy279;
+      } else {
+        if (yych <= 0xDF)
+          goto yy286;
+        if (yych <= 0xE0)
+          goto yy287;
+        goto yy288;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy289;
+        if (yych <= 0xEF)
+          goto yy288;
+        goto yy290;
+      } else {
+        if (yych <= 0xF3)
+          goto yy291;
+        if (yych <= 0xF4)
+          goto yy292;
+        goto yy279;
+      }
+    }
+  yy286:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy279;
+    if (yych <= 0xBF)
+      goto yy283;
+    goto yy279;
+  yy287:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy279;
+    if (yych <= 0xBF)
+      goto yy286;
+    goto yy279;
+  yy288:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy279;
+    if (yych <= 0xBF)
+      goto yy286;
+    goto yy279;
+  yy289:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy279;
+    if (yych <= 0x9F)
+      goto yy286;
+    goto yy279;
+  yy290:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy279;
+    if (yych <= 0xBF)
+      goto yy288;
+    goto yy279;
+  yy291:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy279;
+    if (yych <= 0xBF)
+      goto yy288;
+    goto yy279;
+  yy292:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy279;
+    if (yych <= 0x8F)
+      goto yy288;
+    goto yy279;
+  yy293:
+    yych = *++p;
+    if (yych <= 0xE0) {
+      if (yych <= '>') {
+        if (yych <= 0x00)
+          goto yy279;
+        if (yych <= '=')
+          goto yy283;
+        goto yy279;
+      } else {
+        if (yych <= 0x7F)
+          goto yy283;
+        if (yych <= 0xC1)
+          goto yy279;
+        if (yych <= 0xDF)
+          goto yy286;
+        goto yy287;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy289;
+        goto yy288;
+      } else {
+        if (yych <= 0xF0)
+          goto yy290;
+        if (yych <= 0xF3)
+          goto yy291;
+        if (yych <= 0xF4)
+          goto yy292;
+        goto yy279;
+      }
+    }
+  }
+}
+
+// Try to match an HTML block tag start line, returning
+// an integer code for the type of block (1-6, matching the spec).
+// #7 is handled by a separate function, below.
+bufsize_t _scan_html_block_start(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+
+  {
+    unsigned char yych;
+    yych = *p;
+    if (yych == '<')
+      goto yy296;
+    ++p;
+  yy295 : { return 0; }
+  yy296:
+    yych = *(marker = ++p);
+    switch (yych) {
+    case '!':
+      goto yy297;
+    case '/':
+      goto yy299;
+    case '?':
+      goto yy300;
+    case 'A':
+    case 'a':
+      goto yy301;
+    case 'B':
+    case 'b':
+      goto yy302;
+    case 'C':
+    case 'c':
+      goto yy303;
+    case 'D':
+    case 'd':
+      goto yy304;
+    case 'F':
+    case 'f':
+      goto yy305;
+    case 'H':
+    case 'h':
+      goto yy306;
+    case 'I':
+    case 'i':
+      goto yy307;
+    case 'L':
+    case 'l':
+      goto yy308;
+    case 'M':
+    case 'm':
+      goto yy309;
+    case 'N':
+    case 'n':
+      goto yy310;
+    case 'O':
+    case 'o':
+      goto yy311;
+    case 'P':
+    case 'p':
+      goto yy312;
+    case 'S':
+    case 's':
+      goto yy313;
+    case 'T':
+    case 't':
+      goto yy314;
+    case 'U':
+    case 'u':
+      goto yy315;
+    default:
+      goto yy295;
+    }
+  yy297:
+    yych = *++p;
+    if (yych <= '@') {
+      if (yych == '-')
+        goto yy316;
+    } else {
+      if (yych <= 'Z')
+        goto yy317;
+      if (yych <= '[')
+        goto yy318;
+    }
+  yy298:
+    p = marker;
+    goto yy295;
+  yy299:
+    yych = *++p;
+    switch (yych) {
+    case 'A':
+    case 'a':
+      goto yy301;
+    case 'B':
+    case 'b':
+      goto yy302;
+    case 'C':
+    case 'c':
+      goto yy303;
+    case 'D':
+    case 'd':
+      goto yy304;
+    case 'F':
+    case 'f':
+      goto yy305;
+    case 'H':
+    case 'h':
+      goto yy306;
+    case 'I':
+    case 'i':
+      goto yy307;
+    case 'L':
+    case 'l':
+      goto yy308;
+    case 'M':
+    case 'm':
+      goto yy309;
+    case 'N':
+    case 'n':
+      goto yy310;
+    case 'O':
+    case 'o':
+      goto yy311;
+    case 'P':
+    case 'p':
+      goto yy319;
+    case 'S':
+    case 's':
+      goto yy320;
+    case 'T':
+    case 't':
+      goto yy321;
+    case 'U':
+    case 'u':
+      goto yy315;
+    default:
+      goto yy298;
+    }
+  yy300:
+    ++p;
+    { return 3; }
+  yy301:
+    yych = *++p;
+    if (yych <= 'S') {
+      if (yych <= 'D') {
+        if (yych <= 'C')
+          goto yy298;
+        goto yy322;
+      } else {
+        if (yych <= 'Q')
+          goto yy298;
+        if (yych <= 'R')
+          goto yy323;
+        goto yy324;
+      }
+    } else {
+      if (yych <= 'q') {
+        if (yych == 'd')
+          goto yy322;
+        goto yy298;
+      } else {
+        if (yych <= 'r')
+          goto yy323;
+        if (yych <= 's')
+          goto yy324;
+        goto yy298;
+      }
+    }
+  yy302:
+    yych = *++p;
+    if (yych <= 'O') {
+      if (yych <= 'K') {
+        if (yych == 'A')
+          goto yy325;
+        goto yy298;
+      } else {
+        if (yych <= 'L')
+          goto yy326;
+        if (yych <= 'N')
+          goto yy298;
+        goto yy327;
+      }
+    } else {
+      if (yych <= 'k') {
+        if (yych == 'a')
+          goto yy325;
+        goto yy298;
+      } else {
+        if (yych <= 'l')
+          goto yy326;
+        if (yych == 'o')
+          goto yy327;
+        goto yy298;
+      }
+    }
+  yy303:
+    yych = *++p;
+    if (yych <= 'O') {
+      if (yych <= 'D') {
+        if (yych == 'A')
+          goto yy328;
+        goto yy298;
+      } else {
+        if (yych <= 'E')
+          goto yy329;
+        if (yych <= 'N')
+          goto yy298;
+        goto yy330;
+      }
+    } else {
+      if (yych <= 'd') {
+        if (yych == 'a')
+          goto yy328;
+        goto yy298;
+      } else {
+        if (yych <= 'e')
+          goto yy329;
+        if (yych == 'o')
+          goto yy330;
+        goto yy298;
+      }
+    }
+  yy304:
+    yych = *++p;
+    switch (yych) {
+    case 'D':
+    case 'L':
+    case 'T':
+    case 'd':
+    case 'l':
+    case 't':
+      goto yy331;
+    case 'E':
+    case 'e':
+      goto yy332;
+    case 'I':
+    case 'i':
+      goto yy333;
+    default:
+      goto yy298;
+    }
+  yy305:
+    yych = *++p;
+    if (yych <= 'R') {
+      if (yych <= 'N') {
+        if (yych == 'I')
+          goto yy334;
+        goto yy298;
+      } else {
+        if (yych <= 'O')
+          goto yy335;
+        if (yych <= 'Q')
+          goto yy298;
+        goto yy336;
+      }
+    } else {
+      if (yych <= 'n') {
+        if (yych == 'i')
+          goto yy334;
+        goto yy298;
+      } else {
+        if (yych <= 'o')
+          goto yy335;
+        if (yych == 'r')
+          goto yy336;
+        goto yy298;
+      }
+    }
+  yy306:
+    yych = *++p;
+    if (yych <= 'S') {
+      if (yych <= 'D') {
+        if (yych <= '0')
+          goto yy298;
+        if (yych <= '6')
+          goto yy331;
+        goto yy298;
+      } else {
+        if (yych <= 'E')
+          goto yy337;
+        if (yych == 'R')
+          goto yy331;
+        goto yy298;
+      }
+    } else {
+      if (yych <= 'q') {
+        if (yych <= 'T')
+          goto yy338;
+        if (yych == 'e')
+          goto yy337;
+        goto yy298;
+      } else {
+        if (yych <= 'r')
+          goto yy331;
+        if (yych == 't')
+          goto yy338;
+        goto yy298;
+      }
+    }
+  yy307:
+    yych = *++p;
+    if (yych == 'F')
+      goto yy339;
+    if (yych == 'f')
+      goto yy339;
+    goto yy298;
+  yy308:
+    yych = *++p;
+    if (yych <= 'I') {
+      if (yych == 'E')
+        goto yy340;
+      if (yych <= 'H')
+        goto yy298;
+      goto yy341;
+    } else {
+      if (yych <= 'e') {
+        if (yych <= 'd')
+          goto yy298;
+        goto yy340;
+      } else {
+        if (yych == 'i')
+          goto yy341;
+        goto yy298;
+      }
+    }
+  yy309:
+    yych = *++p;
+    if (yych <= 'E') {
+      if (yych == 'A')
+        goto yy342;
+      if (yych <= 'D')
+        goto yy298;
+      goto yy343;
+    } else {
+      if (yych <= 'a') {
+        if (yych <= '`')
+          goto yy298;
+        goto yy342;
+      } else {
+        if (yych == 'e')
+          goto yy343;
+        goto yy298;
+      }
+    }
+  yy310:
+    yych = *++p;
+    if (yych <= 'O') {
+      if (yych == 'A')
+        goto yy344;
+      if (yych <= 'N')
+        goto yy298;
+      goto yy345;
+    } else {
+      if (yych <= 'a') {
+        if (yych <= '`')
+          goto yy298;
+        goto yy344;
+      } else {
+        if (yych == 'o')
+          goto yy345;
+        goto yy298;
+      }
+    }
+  yy311:
+    yych = *++p;
+    if (yych <= 'P') {
+      if (yych == 'L')
+        goto yy331;
+      if (yych <= 'O')
+        goto yy298;
+      goto yy346;
+    } else {
+      if (yych <= 'l') {
+        if (yych <= 'k')
+          goto yy298;
+        goto yy331;
+      } else {
+        if (yych == 'p')
+          goto yy346;
+        goto yy298;
+      }
+    }
+  yy312:
+    yych = *++p;
+    if (yych <= '>') {
+      if (yych <= ' ') {
+        if (yych <= 0x08)
+          goto yy298;
+        if (yych <= '\r')
+          goto yy347;
+        if (yych <= 0x1F)
+          goto yy298;
+        goto yy347;
+      } else {
+        if (yych == '/')
+          goto yy348;
+        if (yych <= '=')
+          goto yy298;
+        goto yy347;
+      }
+    } else {
+      if (yych <= 'R') {
+        if (yych == 'A')
+          goto yy349;
+        if (yych <= 'Q')
+          goto yy298;
+        goto yy350;
+      } else {
+        if (yych <= 'a') {
+          if (yych <= '`')
+            goto yy298;
+          goto yy349;
+        } else {
+          if (yych == 'r')
+            goto yy350;
+          goto yy298;
+        }
+      }
+    }
+  yy313:
+    yych = *++p;
+    switch (yych) {
+    case 'C':
+    case 'c':
+      goto yy351;
+    case 'E':
+    case 'e':
+      goto yy352;
+    case 'O':
+    case 'o':
+      goto yy353;
+    case 'T':
+    case 't':
+      goto yy354;
+    case 'U':
+    case 'u':
+      goto yy355;
+    default:
+      goto yy298;
+    }
+  yy314:
+    yych = *++p;
+    switch (yych) {
+    case 'A':
+    case 'a':
+      goto yy356;
+    case 'B':
+    case 'b':
+      goto yy357;
+    case 'D':
+    case 'd':
+      goto yy331;
+    case 'E':
+    case 'e':
+      goto yy358;
+    case 'F':
+    case 'f':
+      goto yy359;
+    case 'H':
+    case 'h':
+      goto yy360;
+    case 'I':
+    case 'i':
+      goto yy361;
+    case 'R':
+    case 'r':
+      goto yy362;
+    default:
+      goto yy298;
+    }
+  yy315:
+    yych = *++p;
+    if (yych == 'L')
+      goto yy331;
+    if (yych == 'l')
+      goto yy331;
+    goto yy298;
+  yy316:
+    yych = *++p;
+    if (yych == '-')
+      goto yy363;
+    goto yy298;
+  yy317:
+    ++p;
+    { return 4; }
+  yy318:
+    yych = *++p;
+    if (yych == 'C')
+      goto yy364;
+    if (yych == 'c')
+      goto yy364;
+    goto yy298;
+  yy319:
+    yych = *++p;
+    if (yych <= '/') {
+      if (yych <= 0x1F) {
+        if (yych <= 0x08)
+          goto yy298;
+        if (yych <= '\r')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= ' ')
+          goto yy347;
+        if (yych <= '.')
+          goto yy298;
+        goto yy348;
+      }
+    } else {
+      if (yych <= '@') {
+        if (yych == '>')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= 'A')
+          goto yy349;
+        if (yych == 'a')
+          goto yy349;
+        goto yy298;
+      }
+    }
+  yy320:
+    yych = *++p;
+    if (yych <= 'U') {
+      if (yych <= 'N') {
+        if (yych == 'E')
+          goto yy352;
+        goto yy298;
+      } else {
+        if (yych <= 'O')
+          goto yy353;
+        if (yych <= 'T')
+          goto yy298;
+        goto yy355;
+      }
+    } else {
+      if (yych <= 'n') {
+        if (yych == 'e')
+          goto yy352;
+        goto yy298;
+      } else {
+        if (yych <= 'o')
+          goto yy353;
+        if (yych == 'u')
+          goto yy355;
+        goto yy298;
+      }
+    }
+  yy321:
+    yych = *++p;
+    switch (yych) {
+    case 'A':
+    case 'a':
+      goto yy356;
+    case 'B':
+    case 'b':
+      goto yy357;
+    case 'D':
+    case 'd':
+      goto yy331;
+    case 'F':
+    case 'f':
+      goto yy359;
+    case 'H':
+    case 'h':
+      goto yy360;
+    case 'I':
+    case 'i':
+      goto yy361;
+    case 'R':
+    case 'r':
+      goto yy362;
+    default:
+      goto yy298;
+    }
+  yy322:
+    yych = *++p;
+    if (yych == 'D')
+      goto yy365;
+    if (yych == 'd')
+      goto yy365;
+    goto yy298;
+  yy323:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy366;
+    if (yych == 't')
+      goto yy366;
+    goto yy298;
+  yy324:
+    yych = *++p;
+    if (yych == 'I')
+      goto yy367;
+    if (yych == 'i')
+      goto yy367;
+    goto yy298;
+  yy325:
+    yych = *++p;
+    if (yych == 'S')
+      goto yy368;
+    if (yych == 's')
+      goto yy368;
+    goto yy298;
+  yy326:
+    yych = *++p;
+    if (yych == 'O')
+      goto yy369;
+    if (yych == 'o')
+      goto yy369;
+    goto yy298;
+  yy327:
+    yych = *++p;
+    if (yych == 'D')
+      goto yy370;
+    if (yych == 'd')
+      goto yy370;
+    goto yy298;
+  yy328:
+    yych = *++p;
+    if (yych == 'P')
+      goto yy371;
+    if (yych == 'p')
+      goto yy371;
+    goto yy298;
+  yy329:
+    yych = *++p;
+    if (yych == 'N')
+      goto yy372;
+    if (yych == 'n')
+      goto yy372;
+    goto yy298;
+  yy330:
+    yych = *++p;
+    if (yych == 'L')
+      goto yy373;
+    if (yych == 'l')
+      goto yy373;
+    goto yy298;
+  yy331:
+    yych = *++p;
+    if (yych <= ' ') {
+      if (yych <= 0x08)
+        goto yy298;
+      if (yych <= '\r')
+        goto yy347;
+      if (yych <= 0x1F)
+        goto yy298;
+      goto yy347;
+    } else {
+      if (yych <= '/') {
+        if (yych <= '.')
+          goto yy298;
+        goto yy348;
+      } else {
+        if (yych == '>')
+          goto yy347;
+        goto yy298;
+      }
+    }
+  yy332:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy374;
+    if (yych == 't')
+      goto yy374;
+    goto yy298;
+  yy333:
+    yych = *++p;
+    if (yych <= 'V') {
+      if (yych <= 'Q') {
+        if (yych == 'A')
+          goto yy375;
+        goto yy298;
+      } else {
+        if (yych <= 'R')
+          goto yy331;
+        if (yych <= 'U')
+          goto yy298;
+        goto yy331;
+      }
+    } else {
+      if (yych <= 'q') {
+        if (yych == 'a')
+          goto yy375;
+        goto yy298;
+      } else {
+        if (yych <= 'r')
+          goto yy331;
+        if (yych == 'v')
+          goto yy331;
+        goto yy298;
+      }
+    }
+  yy334:
+    yych = *++p;
+    if (yych <= 'G') {
+      if (yych == 'E')
+        goto yy376;
+      if (yych <= 'F')
+        goto yy298;
+      goto yy377;
+    } else {
+      if (yych <= 'e') {
+        if (yych <= 'd')
+          goto yy298;
+        goto yy376;
+      } else {
+        if (yych == 'g')
+          goto yy377;
+        goto yy298;
+      }
+    }
+  yy335:
+    yych = *++p;
+    if (yych <= 'R') {
+      if (yych == 'O')
+        goto yy372;
+      if (yych <= 'Q')
+        goto yy298;
+      goto yy378;
+    } else {
+      if (yych <= 'o') {
+        if (yych <= 'n')
+          goto yy298;
+        goto yy372;
+      } else {
+        if (yych == 'r')
+          goto yy378;
+        goto yy298;
+      }
+    }
+  yy336:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy379;
+    if (yych == 'a')
+      goto yy379;
+    goto yy298;
+  yy337:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy380;
+    if (yych == 'a')
+      goto yy380;
+    goto yy298;
+  yy338:
+    yych = *++p;
+    if (yych == 'M')
+      goto yy315;
+    if (yych == 'm')
+      goto yy315;
+    goto yy298;
+  yy339:
+    yych = *++p;
+    if (yych == 'R')
+      goto yy381;
+    if (yych == 'r')
+      goto yy381;
+    goto yy298;
+  yy340:
+    yych = *++p;
+    if (yych == 'G')
+      goto yy382;
+    if (yych == 'g')
+      goto yy382;
+    goto yy298;
+  yy341:
+    yych = *++p;
+    if (yych <= '/') {
+      if (yych <= 0x1F) {
+        if (yych <= 0x08)
+          goto yy298;
+        if (yych <= '\r')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= ' ')
+          goto yy347;
+        if (yych <= '.')
+          goto yy298;
+        goto yy348;
+      }
+    } else {
+      if (yych <= 'M') {
+        if (yych == '>')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= 'N')
+          goto yy383;
+        if (yych == 'n')
+          goto yy383;
+        goto yy298;
+      }
+    }
+  yy342:
+    yych = *++p;
+    if (yych == 'I')
+      goto yy384;
+    if (yych == 'i')
+      goto yy384;
+    goto yy298;
+  yy343:
+    yych = *++p;
+    if (yych == 'N')
+      goto yy385;
+    if (yych == 'n')
+      goto yy385;
+    goto yy298;
+  yy344:
+    yych = *++p;
+    if (yych == 'V')
+      goto yy331;
+    if (yych == 'v')
+      goto yy331;
+    goto yy298;
+  yy345:
+    yych = *++p;
+    if (yych == 'F')
+      goto yy386;
+    if (yych == 'f')
+      goto yy386;
+    goto yy298;
+  yy346:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy387;
+    if (yych == 't')
+      goto yy387;
+    goto yy298;
+  yy347:
+    ++p;
+    { return 6; }
+  yy348:
+    yych = *++p;
+    if (yych == '>')
+      goto yy347;
+    goto yy298;
+  yy349:
+    yych = *++p;
+    if (yych == 'R')
+      goto yy388;
+    if (yych == 'r')
+      goto yy388;
+    goto yy298;
+  yy350:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy389;
+    if (yych == 'e')
+      goto yy389;
+    goto yy298;
+  yy351:
+    yych = *++p;
+    if (yych == 'R')
+      goto yy390;
+    if (yych == 'r')
+      goto yy390;
+    goto yy298;
+  yy352:
+    yych = *++p;
+    if (yych == 'C')
+      goto yy371;
+    if (yych == 'c')
+      goto yy371;
+    goto yy298;
+  yy353:
+    yych = *++p;
+    if (yych == 'U')
+      goto yy391;
+    if (yych == 'u')
+      goto yy391;
+    goto yy298;
+  yy354:
+    yych = *++p;
+    if (yych == 'Y')
+      goto yy392;
+    if (yych == 'y')
+      goto yy392;
+    goto yy298;
+  yy355:
+    yych = *++p;
+    if (yych == 'M')
+      goto yy393;
+    if (yych == 'm')
+      goto yy393;
+    goto yy298;
+  yy356:
+    yych = *++p;
+    if (yych == 'B')
+      goto yy394;
+    if (yych == 'b')
+      goto yy394;
+    goto yy298;
+  yy357:
+    yych = *++p;
+    if (yych == 'O')
+      goto yy327;
+    if (yych == 'o')
+      goto yy327;
+    goto yy298;
+  yy358:
+    yych = *++p;
+    if (yych == 'X')
+      goto yy395;
+    if (yych == 'x')
+      goto yy395;
+    goto yy298;
+  yy359:
+    yych = *++p;
+    if (yych == 'O')
+      goto yy396;
+    if (yych == 'o')
+      goto yy396;
+    goto yy298;
+  yy360:
+    yych = *++p;
+    if (yych <= '/') {
+      if (yych <= 0x1F) {
+        if (yych <= 0x08)
+          goto yy298;
+        if (yych <= '\r')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= ' ')
+          goto yy347;
+        if (yych <= '.')
+          goto yy298;
+        goto yy348;
+      }
+    } else {
+      if (yych <= 'D') {
+        if (yych == '>')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= 'E')
+          goto yy397;
+        if (yych == 'e')
+          goto yy397;
+        goto yy298;
+      }
+    }
+  yy361:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy394;
+    if (yych == 't')
+      goto yy394;
+    goto yy298;
+  yy362:
+    yych = *++p;
+    if (yych <= '/') {
+      if (yych <= 0x1F) {
+        if (yych <= 0x08)
+          goto yy298;
+        if (yych <= '\r')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= ' ')
+          goto yy347;
+        if (yych <= '.')
+          goto yy298;
+        goto yy348;
+      }
+    } else {
+      if (yych <= '@') {
+        if (yych == '>')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= 'A')
+          goto yy398;
+        if (yych == 'a')
+          goto yy398;
+        goto yy298;
+      }
+    }
+  yy363:
+    ++p;
+    { return 2; }
+  yy364:
+    yych = *++p;
+    if (yych == 'D')
+      goto yy399;
+    if (yych == 'd')
+      goto yy399;
+    goto yy298;
+  yy365:
+    yych = *++p;
+    if (yych == 'R')
+      goto yy400;
+    if (yych == 'r')
+      goto yy400;
+    goto yy298;
+  yy366:
+    yych = *++p;
+    if (yych == 'I')
+      goto yy401;
+    if (yych == 'i')
+      goto yy401;
+    goto yy298;
+  yy367:
+    yych = *++p;
+    if (yych == 'D')
+      goto yy402;
+    if (yych == 'd')
+      goto yy402;
+    goto yy298;
+  yy368:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy403;
+    if (yych == 'e')
+      goto yy403;
+    goto yy298;
+  yy369:
+    yych = *++p;
+    if (yych == 'C')
+      goto yy404;
+    if (yych == 'c')
+      goto yy404;
+    goto yy298;
+  yy370:
+    yych = *++p;
+    if (yych == 'Y')
+      goto yy331;
+    if (yych == 'y')
+      goto yy331;
+    goto yy298;
+  yy371:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy405;
+    if (yych == 't')
+      goto yy405;
+    goto yy298;
+  yy372:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy406;
+    if (yych == 't')
+      goto yy406;
+    goto yy298;
+  yy373:
+    yych = *++p;
+    if (yych <= '/') {
+      if (yych <= 0x1F) {
+        if (yych <= 0x08)
+          goto yy298;
+        if (yych <= '\r')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= ' ')
+          goto yy347;
+        if (yych <= '.')
+          goto yy298;
+        goto yy348;
+      }
+    } else {
+      if (yych <= 'F') {
+        if (yych == '>')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= 'G')
+          goto yy407;
+        if (yych == 'g')
+          goto yy407;
+        goto yy298;
+      }
+    }
+  yy374:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy408;
+    if (yych == 'a')
+      goto yy408;
+    goto yy298;
+  yy375:
+    yych = *++p;
+    if (yych == 'L')
+      goto yy409;
+    if (yych == 'l')
+      goto yy409;
+    goto yy298;
+  yy376:
+    yych = *++p;
+    if (yych == 'L')
+      goto yy410;
+    if (yych == 'l')
+      goto yy410;
+    goto yy298;
+  yy377:
+    yych = *++p;
+    if (yych <= 'U') {
+      if (yych == 'C')
+        goto yy411;
+      if (yych <= 'T')
+        goto yy298;
+      goto yy412;
+    } else {
+      if (yych <= 'c') {
+        if (yych <= 'b')
+          goto yy298;
+        goto yy411;
+      } else {
+        if (yych == 'u')
+          goto yy412;
+        goto yy298;
+      }
+    }
+  yy378:
+    yych = *++p;
+    if (yych == 'M')
+      goto yy331;
+    if (yych == 'm')
+      goto yy331;
+    goto yy298;
+  yy379:
+    yych = *++p;
+    if (yych == 'M')
+      goto yy413;
+    if (yych == 'm')
+      goto yy413;
+    goto yy298;
+  yy380:
+    yych = *++p;
+    if (yych == 'D')
+      goto yy414;
+    if (yych == 'd')
+      goto yy414;
+    goto yy298;
+  yy381:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy415;
+    if (yych == 'a')
+      goto yy415;
+    goto yy298;
+  yy382:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy416;
+    if (yych == 'e')
+      goto yy416;
+    goto yy298;
+  yy383:
+    yych = *++p;
+    if (yych == 'K')
+      goto yy331;
+    if (yych == 'k')
+      goto yy331;
+    goto yy298;
+  yy384:
+    yych = *++p;
+    if (yych == 'N')
+      goto yy331;
+    if (yych == 'n')
+      goto yy331;
+    goto yy298;
+  yy385:
+    yych = *++p;
+    if (yych == 'U')
+      goto yy417;
+    if (yych == 'u')
+      goto yy417;
+    goto yy298;
+  yy386:
+    yych = *++p;
+    if (yych == 'R')
+      goto yy418;
+    if (yych == 'r')
+      goto yy418;
+    goto yy298;
+  yy387:
+    yych = *++p;
+    if (yych <= 'I') {
+      if (yych == 'G')
+        goto yy407;
+      if (yych <= 'H')
+        goto yy298;
+      goto yy419;
+    } else {
+      if (yych <= 'g') {
+        if (yych <= 'f')
+          goto yy298;
+        goto yy407;
+      } else {
+        if (yych == 'i')
+          goto yy419;
+        goto yy298;
+      }
+    }
+  yy388:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy378;
+    if (yych == 'a')
+      goto yy378;
+    goto yy298;
+  yy389:
+    yych = *++p;
+    if (yych <= 0x1F) {
+      if (yych <= 0x08)
+        goto yy298;
+      if (yych <= '\r')
+        goto yy420;
+      goto yy298;
+    } else {
+      if (yych <= ' ')
+        goto yy420;
+      if (yych == '>')
+        goto yy420;
+      goto yy298;
+    }
+  yy390:
+    yych = *++p;
+    if (yych == 'I')
+      goto yy421;
+    if (yych == 'i')
+      goto yy421;
+    goto yy298;
+  yy391:
+    yych = *++p;
+    if (yych == 'R')
+      goto yy422;
+    if (yych == 'r')
+      goto yy422;
+    goto yy298;
+  yy392:
+    yych = *++p;
+    if (yych == 'L')
+      goto yy350;
+    if (yych == 'l')
+      goto yy350;
+    goto yy298;
+  yy393:
+    yych = *++p;
+    if (yych == 'M')
+      goto yy423;
+    if (yych == 'm')
+      goto yy423;
+    goto yy298;
+  yy394:
+    yych = *++p;
+    if (yych == 'L')
+      goto yy402;
+    if (yych == 'l')
+      goto yy402;
+    goto yy298;
+  yy395:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy424;
+    if (yych == 't')
+      goto yy424;
+    goto yy298;
+  yy396:
+    yych = *++p;
+    if (yych == 'O')
+      goto yy425;
+    if (yych == 'o')
+      goto yy425;
+    goto yy298;
+  yy397:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy426;
+    if (yych == 'a')
+      goto yy426;
+    goto yy298;
+  yy398:
+    yych = *++p;
+    if (yych == 'C')
+      goto yy383;
+    if (yych == 'c')
+      goto yy383;
+    goto yy298;
+  yy399:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy427;
+    if (yych == 'a')
+      goto yy427;
+    goto yy298;
+  yy400:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy428;
+    if (yych == 'e')
+      goto yy428;
+    goto yy298;
+  yy401:
+    yych = *++p;
+    if (yych == 'C')
+      goto yy394;
+    if (yych == 'c')
+      goto yy394;
+    goto yy298;
+  yy402:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy331;
+    if (yych == 'e')
+      goto yy331;
+    goto yy298;
+  yy403:
+    yych = *++p;
+    if (yych <= '/') {
+      if (yych <= 0x1F) {
+        if (yych <= 0x08)
+          goto yy298;
+        if (yych <= '\r')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= ' ')
+          goto yy347;
+        if (yych <= '.')
+          goto yy298;
+        goto yy348;
+      }
+    } else {
+      if (yych <= 'E') {
+        if (yych == '>')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= 'F')
+          goto yy429;
+        if (yych == 'f')
+          goto yy429;
+        goto yy298;
+      }
+    }
+  yy404:
+    yych = *++p;
+    if (yych == 'K')
+      goto yy430;
+    if (yych == 'k')
+      goto yy430;
+    goto yy298;
+  yy405:
+    yych = *++p;
+    if (yych == 'I')
+      goto yy419;
+    if (yych == 'i')
+      goto yy419;
+    goto yy298;
+  yy406:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy431;
+    if (yych == 'e')
+      goto yy431;
+    goto yy298;
+  yy407:
+    yych = *++p;
+    if (yych == 'R')
+      goto yy432;
+    if (yych == 'r')
+      goto yy432;
+    goto yy298;
+  yy408:
+    yych = *++p;
+    if (yych == 'I')
+      goto yy433;
+    if (yych == 'i')
+      goto yy433;
+    goto yy298;
+  yy409:
+    yych = *++p;
+    if (yych == 'O')
+      goto yy434;
+    if (yych == 'o')
+      goto yy434;
+    goto yy298;
+  yy410:
+    yych = *++p;
+    if (yych == 'D')
+      goto yy435;
+    if (yych == 'd')
+      goto yy435;
+    goto yy298;
+  yy411:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy328;
+    if (yych == 'a')
+      goto yy328;
+    goto yy298;
+  yy412:
+    yych = *++p;
+    if (yych == 'R')
+      goto yy402;
+    if (yych == 'r')
+      goto yy402;
+    goto yy298;
+  yy413:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy436;
+    if (yych == 'e')
+      goto yy436;
+    goto yy298;
+  yy414:
+    yych = *++p;
+    if (yych <= '/') {
+      if (yych <= 0x1F) {
+        if (yych <= 0x08)
+          goto yy298;
+        if (yych <= '\r')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= ' ')
+          goto yy347;
+        if (yych <= '.')
+          goto yy298;
+        goto yy348;
+      }
+    } else {
+      if (yych <= 'D') {
+        if (yych == '>')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= 'E')
+          goto yy431;
+        if (yych == 'e')
+          goto yy431;
+        goto yy298;
+      }
+    }
+  yy415:
+    yych = *++p;
+    if (yych == 'M')
+      goto yy402;
+    if (yych == 'm')
+      goto yy402;
+    goto yy298;
+  yy416:
+    yych = *++p;
+    if (yych == 'N')
+      goto yy426;
+    if (yych == 'n')
+      goto yy426;
+    goto yy298;
+  yy417:
+    yych = *++p;
+    if (yych <= '/') {
+      if (yych <= 0x1F) {
+        if (yych <= 0x08)
+          goto yy298;
+        if (yych <= '\r')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= ' ')
+          goto yy347;
+        if (yych <= '.')
+          goto yy298;
+        goto yy348;
+      }
+    } else {
+      if (yych <= 'H') {
+        if (yych == '>')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= 'I')
+          goto yy437;
+        if (yych == 'i')
+          goto yy437;
+        goto yy298;
+      }
+    }
+  yy418:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy438;
+    if (yych == 'a')
+      goto yy438;
+    goto yy298;
+  yy419:
+    yych = *++p;
+    if (yych == 'O')
+      goto yy384;
+    if (yych == 'o')
+      goto yy384;
+    goto yy298;
+  yy420:
+    ++p;
+    { return 1; }
+  yy421:
+    yych = *++p;
+    if (yych == 'P')
+      goto yy439;
+    if (yych == 'p')
+      goto yy439;
+    goto yy298;
+  yy422:
+    yych = *++p;
+    if (yych == 'C')
+      goto yy402;
+    if (yych == 'c')
+      goto yy402;
+    goto yy298;
+  yy423:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy440;
+    if (yych == 'a')
+      goto yy440;
+    goto yy298;
+  yy424:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy441;
+    if (yych == 'a')
+      goto yy441;
+    goto yy298;
+  yy425:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy331;
+    if (yych == 't')
+      goto yy331;
+    goto yy298;
+  yy426:
+    yych = *++p;
+    if (yych == 'D')
+      goto yy331;
+    if (yych == 'd')
+      goto yy331;
+    goto yy298;
+  yy427:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy442;
+    if (yych == 't')
+      goto yy442;
+    goto yy298;
+  yy428:
+    yych = *++p;
+    if (yych == 'S')
+      goto yy443;
+    if (yych == 's')
+      goto yy443;
+    goto yy298;
+  yy429:
+    yych = *++p;
+    if (yych == 'O')
+      goto yy444;
+    if (yych == 'o')
+      goto yy444;
+    goto yy298;
+  yy430:
+    yych = *++p;
+    if (yych == 'Q')
+      goto yy445;
+    if (yych == 'q')
+      goto yy445;
+    goto yy298;
+  yy431:
+    yych = *++p;
+    if (yych == 'R')
+      goto yy331;
+    if (yych == 'r')
+      goto yy331;
+    goto yy298;
+  yy432:
+    yych = *++p;
+    if (yych == 'O')
+      goto yy446;
+    if (yych == 'o')
+      goto yy446;
+    goto yy298;
+  yy433:
+    yych = *++p;
+    if (yych == 'L')
+      goto yy443;
+    if (yych == 'l')
+      goto yy443;
+    goto yy298;
+  yy434:
+    yych = *++p;
+    if (yych == 'G')
+      goto yy331;
+    if (yych == 'g')
+      goto yy331;
+    goto yy298;
+  yy435:
+    yych = *++p;
+    if (yych == 'S')
+      goto yy447;
+    if (yych == 's')
+      goto yy447;
+    goto yy298;
+  yy436:
+    yych = *++p;
+    if (yych <= '/') {
+      if (yych <= 0x1F) {
+        if (yych <= 0x08)
+          goto yy298;
+        if (yych <= '\r')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= ' ')
+          goto yy347;
+        if (yych <= '.')
+          goto yy298;
+        goto yy348;
+      }
+    } else {
+      if (yych <= 'R') {
+        if (yych == '>')
+          goto yy347;
+        goto yy298;
+      } else {
+        if (yych <= 'S')
+          goto yy447;
+        if (yych == 's')
+          goto yy447;
+        goto yy298;
+      }
+    }
+  yy437:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy448;
+    if (yych == 't')
+      goto yy448;
+    goto yy298;
+  yy438:
+    yych = *++p;
+    if (yych == 'M')
+      goto yy449;
+    if (yych == 'm')
+      goto yy449;
+    goto yy298;
+  yy439:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy389;
+    if (yych == 't')
+      goto yy389;
+    goto yy298;
+  yy440:
+    yych = *++p;
+    if (yych == 'R')
+      goto yy370;
+    if (yych == 'r')
+      goto yy370;
+    goto yy298;
+  yy441:
+    yych = *++p;
+    if (yych == 'R')
+      goto yy450;
+    if (yych == 'r')
+      goto yy450;
+    goto yy298;
+  yy442:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy451;
+    if (yych == 'a')
+      goto yy451;
+    goto yy298;
+  yy443:
+    yych = *++p;
+    if (yych == 'S')
+      goto yy331;
+    if (yych == 's')
+      goto yy331;
+    goto yy298;
+  yy444:
+    yych = *++p;
+    if (yych == 'N')
+      goto yy425;
+    if (yych == 'n')
+      goto yy425;
+    goto yy298;
+  yy445:
+    yych = *++p;
+    if (yych == 'U')
+      goto yy452;
+    if (yych == 'u')
+      goto yy452;
+    goto yy298;
+  yy446:
+    yych = *++p;
+    if (yych == 'U')
+      goto yy453;
+    if (yych == 'u')
+      goto yy453;
+    goto yy298;
+  yy447:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy425;
+    if (yych == 'e')
+      goto yy425;
+    goto yy298;
+  yy448:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy378;
+    if (yych == 'e')
+      goto yy378;
+    goto yy298;
+  yy449:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy443;
+    if (yych == 'e')
+      goto yy443;
+    goto yy298;
+  yy450:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy454;
+    if (yych == 'e')
+      goto yy454;
+    goto yy298;
+  yy451:
+    yych = *++p;
+    if (yych == '[')
+      goto yy455;
+    goto yy298;
+  yy452:
+    yych = *++p;
+    if (yych == 'O')
+      goto yy456;
+    if (yych == 'o')
+      goto yy456;
+    goto yy298;
+  yy453:
+    yych = *++p;
+    if (yych == 'P')
+      goto yy331;
+    if (yych == 'p')
+      goto yy331;
+    goto yy298;
+  yy454:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy389;
+    if (yych == 'a')
+      goto yy389;
+    goto yy298;
+  yy455:
+    ++p;
+    { return 5; }
+  yy456:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy402;
+    if (yych == 't')
+      goto yy402;
+    goto yy298;
+  }
+}
+
+// Try to match an HTML block tag start line of type 7, returning
+// 7 if successful, 0 if not.
+bufsize_t _scan_html_block_start_7(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+
+  {
+    unsigned char yych;
+    unsigned int yyaccept = 0;
+    static const unsigned char yybm[] = {
+        0,   224, 224, 224, 224, 224, 224, 224, 224, 198, 210, 194, 198, 194,
+        224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+        224, 224, 224, 224, 198, 224, 128, 224, 224, 224, 224, 64,  224, 224,
+        224, 224, 224, 233, 232, 224, 233, 233, 233, 233, 233, 233, 233, 233,
+        233, 233, 232, 224, 192, 192, 192, 224, 224, 233, 233, 233, 233, 233,
+        233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+        233, 233, 233, 233, 233, 233, 233, 224, 224, 224, 224, 232, 192, 233,
+        233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+        233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 224, 224, 224,
+        224, 224, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,
+    };
+    yych = *p;
+    if (yych == '<')
+      goto yy459;
+    ++p;
+  yy458 : { return 0; }
+  yy459:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= '@') {
+      if (yych != '/')
+        goto yy458;
+    } else {
+      if (yych <= 'Z')
+        goto yy461;
+      if (yych <= '`')
+        goto yy458;
+      if (yych <= 'z')
+        goto yy461;
+      goto yy458;
+    }
+    yych = *++p;
+    if (yych <= '@')
+      goto yy460;
+    if (yych <= 'Z')
+      goto yy462;
+    if (yych <= '`')
+      goto yy460;
+    if (yych <= 'z')
+      goto yy462;
+  yy460:
+    p = marker;
+    if (yyaccept == 0) {
+      goto yy458;
+    } else {
+      goto yy469;
+    }
+  yy461:
+    yych = *++p;
+    if (yybm[0 + yych] & 2) {
+      goto yy463;
+    }
+    if (yych <= '=') {
+      if (yych <= '.') {
+        if (yych == '-')
+          goto yy461;
+        goto yy460;
+      } else {
+        if (yych <= '/')
+          goto yy464;
+        if (yych <= '9')
+          goto yy461;
+        goto yy460;
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '>')
+          goto yy465;
+        if (yych <= '@')
+          goto yy460;
+        goto yy461;
+      } else {
+        if (yych <= '`')
+          goto yy460;
+        if (yych <= 'z')
+          goto yy461;
+        goto yy460;
+      }
+    }
+  yy462:
+    yych = *++p;
+    if (yych <= '/') {
+      if (yych <= 0x1F) {
+        if (yych <= 0x08)
+          goto yy460;
+        if (yych <= '\r')
+          goto yy466;
+        goto yy460;
+      } else {
+        if (yych <= ' ')
+          goto yy466;
+        if (yych == '-')
+          goto yy462;
+        goto yy460;
+      }
+    } else {
+      if (yych <= '@') {
+        if (yych <= '9')
+          goto yy462;
+        if (yych == '>')
+          goto yy465;
+        goto yy460;
+      } else {
+        if (yych <= 'Z')
+          goto yy462;
+        if (yych <= '`')
+          goto yy460;
+        if (yych <= 'z')
+          goto yy462;
+        goto yy460;
+      }
+    }
+  yy463:
+    yych = *++p;
+    if (yybm[0 + yych] & 2) {
+      goto yy463;
+    }
+    if (yych <= '>') {
+      if (yych <= '9') {
+        if (yych != '/')
+          goto yy460;
+      } else {
+        if (yych <= ':')
+          goto yy467;
+        if (yych <= '=')
+          goto yy460;
+        goto yy465;
+      }
+    } else {
+      if (yych <= '^') {
+        if (yych <= '@')
+          goto yy460;
+        if (yych <= 'Z')
+          goto yy467;
+        goto yy460;
+      } else {
+        if (yych == '`')
+          goto yy460;
+        if (yych <= 'z')
+          goto yy467;
+        goto yy460;
+      }
+    }
+  yy464:
+    yych = *++p;
+    if (yych != '>')
+      goto yy460;
+  yy465:
+    yych = *++p;
+    if (yybm[0 + yych] & 4) {
+      goto yy465;
+    }
+    if (yych <= 0x08)
+      goto yy460;
+    if (yych <= '\n')
+      goto yy468;
+    if (yych <= '\v')
+      goto yy460;
+    if (yych <= '\r')
+      goto yy470;
+    goto yy460;
+  yy466:
+    yych = *++p;
+    if (yych <= 0x1F) {
+      if (yych <= 0x08)
+        goto yy460;
+      if (yych <= '\r')
+        goto yy466;
+      goto yy460;
+    } else {
+      if (yych <= ' ')
+        goto yy466;
+      if (yych == '>')
+        goto yy465;
+      goto yy460;
+    }
+  yy467:
+    yych = *++p;
+    if (yybm[0 + yych] & 8) {
+      goto yy467;
+    }
+    if (yych <= ',') {
+      if (yych <= '\r') {
+        if (yych <= 0x08)
+          goto yy460;
+        goto yy471;
+      } else {
+        if (yych == ' ')
+          goto yy471;
+        goto yy460;
+      }
+    } else {
+      if (yych <= '<') {
+        if (yych <= '/')
+          goto yy464;
+        goto yy460;
+      } else {
+        if (yych <= '=')
+          goto yy472;
+        if (yych <= '>')
+          goto yy465;
+        goto yy460;
+      }
+    }
+  yy468:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 4) {
+      goto yy465;
+    }
+    if (yych <= 0x08)
+      goto yy469;
+    if (yych <= '\n')
+      goto yy468;
+    if (yych <= '\v')
+      goto yy469;
+    if (yych <= '\r')
+      goto yy470;
+  yy469 : { return 7; }
+  yy470:
+    ++p;
+    goto yy469;
+  yy471:
+    yych = *++p;
+    if (yych <= '<') {
+      if (yych <= ' ') {
+        if (yych <= 0x08)
+          goto yy460;
+        if (yych <= '\r')
+          goto yy471;
+        if (yych <= 0x1F)
+          goto yy460;
+        goto yy471;
+      } else {
+        if (yych <= '/') {
+          if (yych <= '.')
+            goto yy460;
+          goto yy464;
+        } else {
+          if (yych == ':')
+            goto yy467;
+          goto yy460;
+        }
+      }
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '=')
+          goto yy472;
+        if (yych <= '>')
+          goto yy465;
+        if (yych <= '@')
+          goto yy460;
+        goto yy467;
+      } else {
+        if (yych <= '_') {
+          if (yych <= '^')
+            goto yy460;
+          goto yy467;
+        } else {
+          if (yych <= '`')
+            goto yy460;
+          if (yych <= 'z')
+            goto yy467;
+          goto yy460;
+        }
+      }
+    }
+  yy472:
+    yych = *++p;
+    if (yybm[0 + yych] & 32) {
+      goto yy473;
+    }
+    if (yych <= 0xE0) {
+      if (yych <= '"') {
+        if (yych <= 0x00)
+          goto yy460;
+        if (yych <= ' ')
+          goto yy472;
+        goto yy474;
+      } else {
+        if (yych <= '\'')
+          goto yy475;
+        if (yych <= 0xC1)
+          goto yy460;
+        if (yych <= 0xDF)
+          goto yy476;
+        goto yy477;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy479;
+        goto yy478;
+      } else {
+        if (yych <= 0xF0)
+          goto yy480;
+        if (yych <= 0xF3)
+          goto yy481;
+        if (yych <= 0xF4)
+          goto yy482;
+        goto yy460;
+      }
+    }
+  yy473:
+    yych = *++p;
+    if (yybm[0 + yych] & 32) {
+      goto yy473;
+    }
+    if (yych <= 0xE0) {
+      if (yych <= '=') {
+        if (yych <= 0x00)
+          goto yy460;
+        if (yych <= ' ')
+          goto yy463;
+        goto yy460;
+      } else {
+        if (yych <= '>')
+          goto yy465;
+        if (yych <= 0xC1)
+          goto yy460;
+        if (yych <= 0xDF)
+          goto yy476;
+        goto yy477;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy479;
+        goto yy478;
+      } else {
+        if (yych <= 0xF0)
+          goto yy480;
+        if (yych <= 0xF3)
+          goto yy481;
+        if (yych <= 0xF4)
+          goto yy482;
+        goto yy460;
+      }
+    }
+  yy474:
+    yych = *++p;
+    if (yybm[0 + yych] & 64) {
+      goto yy474;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= 0x00)
+          goto yy460;
+        if (yych <= '"')
+          goto yy483;
+        goto yy460;
+      } else {
+        if (yych <= 0xDF)
+          goto yy484;
+        if (yych <= 0xE0)
+          goto yy485;
+        goto yy486;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy487;
+        if (yych <= 0xEF)
+          goto yy486;
+        goto yy488;
+      } else {
+        if (yych <= 0xF3)
+          goto yy489;
+        if (yych <= 0xF4)
+          goto yy490;
+        goto yy460;
+      }
+    }
+  yy475:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy475;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= 0x00)
+          goto yy460;
+        if (yych <= '\'')
+          goto yy483;
+        goto yy460;
+      } else {
+        if (yych <= 0xDF)
+          goto yy491;
+        if (yych <= 0xE0)
+          goto yy492;
+        goto yy493;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy494;
+        if (yych <= 0xEF)
+          goto yy493;
+        goto yy495;
+      } else {
+        if (yych <= 0xF3)
+          goto yy496;
+        if (yych <= 0xF4)
+          goto yy497;
+        goto yy460;
+      }
+    }
+  yy476:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy473;
+    goto yy460;
+  yy477:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy476;
+    goto yy460;
+  yy478:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy476;
+    goto yy460;
+  yy479:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0x9F)
+      goto yy476;
+    goto yy460;
+  yy480:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy478;
+    goto yy460;
+  yy481:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy478;
+    goto yy460;
+  yy482:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0x8F)
+      goto yy478;
+    goto yy460;
+  yy483:
+    yych = *++p;
+    if (yybm[0 + yych] & 2) {
+      goto yy463;
+    }
+    if (yych == '/')
+      goto yy464;
+    if (yych == '>')
+      goto yy465;
+    goto yy460;
+  yy484:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy474;
+    goto yy460;
+  yy485:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy484;
+    goto yy460;
+  yy486:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy484;
+    goto yy460;
+  yy487:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0x9F)
+      goto yy484;
+    goto yy460;
+  yy488:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy486;
+    goto yy460;
+  yy489:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy486;
+    goto yy460;
+  yy490:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0x8F)
+      goto yy486;
+    goto yy460;
+  yy491:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy475;
+    goto yy460;
+  yy492:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy491;
+    goto yy460;
+  yy493:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy491;
+    goto yy460;
+  yy494:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0x9F)
+      goto yy491;
+    goto yy460;
+  yy495:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy493;
+    goto yy460;
+  yy496:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0xBF)
+      goto yy493;
+    goto yy460;
+  yy497:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy460;
+    if (yych <= 0x8F)
+      goto yy493;
+    goto yy460;
+  }
+}
+
+// Try to match an HTML block end line of type 1
+bufsize_t _scan_html_block_end_1(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    unsigned int yyaccept = 0;
+    static const unsigned char yybm[] = {
+        0,  64, 64, 64, 64, 64, 64,  64, 64, 64, 0,  64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,
+    };
+    yych = *p;
+    if (yych <= 0xDF) {
+      if (yych <= ';') {
+        if (yych <= 0x00)
+          goto yy499;
+        if (yych != '\n')
+          goto yy501;
+      } else {
+        if (yych <= '<')
+          goto yy502;
+        if (yych <= 0x7F)
+          goto yy501;
+        if (yych >= 0xC2)
+          goto yy503;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0)
+          goto yy504;
+        if (yych == 0xED)
+          goto yy506;
+        goto yy505;
+      } else {
+        if (yych <= 0xF0)
+          goto yy507;
+        if (yych <= 0xF3)
+          goto yy508;
+        if (yych <= 0xF4)
+          goto yy509;
+      }
+    }
+  yy499:
+    ++p;
+  yy500 : { return 0; }
+  yy501:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= '\n') {
+      if (yych <= 0x00)
+        goto yy500;
+      if (yych <= '\t')
+        goto yy511;
+      goto yy500;
+    } else {
+      if (yych <= 0x7F)
+        goto yy511;
+      if (yych <= 0xC1)
+        goto yy500;
+      if (yych <= 0xF4)
+        goto yy511;
+      goto yy500;
+    }
+  yy502:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= '.') {
+      if (yych <= 0x00)
+        goto yy500;
+      if (yych == '\n')
+        goto yy500;
+      goto yy511;
+    } else {
+      if (yych <= 0x7F) {
+        if (yych <= '/')
+          goto yy521;
+        goto yy511;
+      } else {
+        if (yych <= 0xC1)
+          goto yy500;
+        if (yych <= 0xF4)
+          goto yy511;
+        goto yy500;
+      }
+    }
+  yy503:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy500;
+    if (yych <= 0xBF)
+      goto yy510;
+    goto yy500;
+  yy504:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x9F)
+      goto yy500;
+    if (yych <= 0xBF)
+      goto yy514;
+    goto yy500;
+  yy505:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy500;
+    if (yych <= 0xBF)
+      goto yy514;
+    goto yy500;
+  yy506:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy500;
+    if (yych <= 0x9F)
+      goto yy514;
+    goto yy500;
+  yy507:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x8F)
+      goto yy500;
+    if (yych <= 0xBF)
+      goto yy516;
+    goto yy500;
+  yy508:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy500;
+    if (yych <= 0xBF)
+      goto yy516;
+    goto yy500;
+  yy509:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy500;
+    if (yych <= 0x8F)
+      goto yy516;
+    goto yy500;
+  yy510:
+    yych = *++p;
+  yy511:
+    if (yybm[0 + yych] & 64) {
+      goto yy510;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy512;
+        if (yych <= '<')
+          goto yy513;
+      } else {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        goto yy516;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy517;
+        if (yych <= 0xEF)
+          goto yy516;
+        goto yy518;
+      } else {
+        if (yych <= 0xF3)
+          goto yy519;
+        if (yych <= 0xF4)
+          goto yy520;
+      }
+    }
+  yy512:
+    p = marker;
+    if (yyaccept == 0) {
+      goto yy500;
+    } else {
+      goto yy534;
+    }
+  yy513:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xDF) {
+      if (yych <= '.') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= '/')
+          goto yy521;
+        if (yych <= 0x7F)
+          goto yy510;
+        if (yych <= 0xC1)
+          goto yy512;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych == 0xED)
+          goto yy517;
+        goto yy516;
+      } else {
+        if (yych <= 0xF0)
+          goto yy518;
+        if (yych <= 0xF3)
+          goto yy519;
+        if (yych <= 0xF4)
+          goto yy520;
+        goto yy512;
+      }
+    }
+  yy514:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy512;
+    if (yych <= 0xBF)
+      goto yy510;
+    goto yy512;
+  yy515:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy512;
+    if (yych <= 0xBF)
+      goto yy514;
+    goto yy512;
+  yy516:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy512;
+    if (yych <= 0xBF)
+      goto yy514;
+    goto yy512;
+  yy517:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy512;
+    if (yych <= 0x9F)
+      goto yy514;
+    goto yy512;
+  yy518:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy512;
+    if (yych <= 0xBF)
+      goto yy516;
+    goto yy512;
+  yy519:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy512;
+    if (yych <= 0xBF)
+      goto yy516;
+    goto yy512;
+  yy520:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy512;
+    if (yych <= 0x8F)
+      goto yy516;
+    goto yy512;
+  yy521:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 's') {
+      if (yych <= 'R') {
+        if (yych <= '\n') {
+          if (yych <= 0x00)
+            goto yy512;
+          if (yych <= '\t')
+            goto yy510;
+          goto yy512;
+        } else {
+          if (yych != 'P')
+            goto yy510;
+        }
+      } else {
+        if (yych <= 'o') {
+          if (yych <= 'S')
+            goto yy523;
+          if (yych <= 'T')
+            goto yy524;
+          goto yy510;
+        } else {
+          if (yych <= 'p')
+            goto yy522;
+          if (yych <= 'r')
+            goto yy510;
+          goto yy523;
+        }
+      }
+    } else {
+      if (yych <= 0xEC) {
+        if (yych <= 0xC1) {
+          if (yych <= 't')
+            goto yy524;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        } else {
+          if (yych <= 0xDF)
+            goto yy514;
+          if (yych <= 0xE0)
+            goto yy515;
+          goto yy516;
+        }
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xED)
+            goto yy517;
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy522:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= 'Q') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= 'q') {
+          if (yych <= 'R')
+            goto yy525;
+          goto yy510;
+        } else {
+          if (yych <= 'r')
+            goto yy525;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy523:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 't') {
+      if (yych <= 'C') {
+        if (yych <= '\t') {
+          if (yych <= 0x00)
+            goto yy512;
+          goto yy510;
+        } else {
+          if (yych <= '\n')
+            goto yy512;
+          if (yych <= 'B')
+            goto yy510;
+          goto yy526;
+        }
+      } else {
+        if (yych <= 'b') {
+          if (yych == 'T')
+            goto yy527;
+          goto yy510;
+        } else {
+          if (yych <= 'c')
+            goto yy526;
+          if (yych <= 's')
+            goto yy510;
+          goto yy527;
+        }
+      }
+    } else {
+      if (yych <= 0xEC) {
+        if (yych <= 0xC1) {
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        } else {
+          if (yych <= 0xDF)
+            goto yy514;
+          if (yych <= 0xE0)
+            goto yy515;
+          goto yy516;
+        }
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xED)
+            goto yy517;
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy524:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= 'D') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= 'd') {
+          if (yych <= 'E')
+            goto yy528;
+          goto yy510;
+        } else {
+          if (yych <= 'e')
+            goto yy528;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy525:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= 'D') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= 'd') {
+          if (yych <= 'E')
+            goto yy529;
+          goto yy510;
+        } else {
+          if (yych <= 'e')
+            goto yy529;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy526:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= 'Q') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= 'q') {
+          if (yych <= 'R')
+            goto yy530;
+          goto yy510;
+        } else {
+          if (yych <= 'r')
+            goto yy530;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy527:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= 'X') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= 'x') {
+          if (yych <= 'Y')
+            goto yy531;
+          goto yy510;
+        } else {
+          if (yych <= 'y')
+            goto yy531;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy528:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= 'W') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= 'w') {
+          if (yych <= 'X')
+            goto yy532;
+          goto yy510;
+        } else {
+          if (yych <= 'x')
+            goto yy532;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy529:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xDF) {
+      if (yych <= '=') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= '>')
+          goto yy533;
+        if (yych <= 0x7F)
+          goto yy510;
+        if (yych <= 0xC1)
+          goto yy512;
+        goto yy514;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych == 0xED)
+          goto yy517;
+        goto yy516;
+      } else {
+        if (yych <= 0xF0)
+          goto yy518;
+        if (yych <= 0xF3)
+          goto yy519;
+        if (yych <= 0xF4)
+          goto yy520;
+        goto yy512;
+      }
+    }
+  yy530:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= 'H') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= 'h') {
+          if (yych <= 'I')
+            goto yy535;
+          goto yy510;
+        } else {
+          if (yych <= 'i')
+            goto yy535;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy531:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= 'K') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= 'k') {
+          if (yych <= 'L')
+            goto yy525;
+          goto yy510;
+        } else {
+          if (yych <= 'l')
+            goto yy525;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy532:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= 'S') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= 's') {
+          if (yych <= 'T')
+            goto yy536;
+          goto yy510;
+        } else {
+          if (yych <= 't')
+            goto yy536;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy533:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 64) {
+      goto yy510;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy534;
+        if (yych <= '<')
+          goto yy513;
+      } else {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        goto yy516;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy517;
+        if (yych <= 0xEF)
+          goto yy516;
+        goto yy518;
+      } else {
+        if (yych <= 0xF3)
+          goto yy519;
+        if (yych <= 0xF4)
+          goto yy520;
+      }
+    }
+  yy534 : { return (bufsize_t)(p - start); }
+  yy535:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= 'O') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= 'o') {
+          if (yych <= 'P')
+            goto yy537;
+          goto yy510;
+        } else {
+          if (yych <= 'p')
+            goto yy537;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy536:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= '@') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= '`') {
+          if (yych <= 'A')
+            goto yy538;
+          goto yy510;
+        } else {
+          if (yych <= 'a')
+            goto yy538;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy537:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= 'S') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= 's') {
+          if (yych <= 'T')
+            goto yy529;
+          goto yy510;
+        } else {
+          if (yych <= 't')
+            goto yy529;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy538:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= 'Q') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= 'q') {
+          if (yych >= 'S')
+            goto yy510;
+        } else {
+          if (yych <= 'r')
+            goto yy539;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy539:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= 'D') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= 'd') {
+          if (yych >= 'F')
+            goto yy510;
+        } else {
+          if (yych <= 'e')
+            goto yy540;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  yy540:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy513;
+    }
+    if (yych <= 0xC1) {
+      if (yych <= '@') {
+        if (yych <= 0x00)
+          goto yy512;
+        if (yych == '\n')
+          goto yy512;
+        goto yy510;
+      } else {
+        if (yych <= '`') {
+          if (yych <= 'A')
+            goto yy529;
+          goto yy510;
+        } else {
+          if (yych <= 'a')
+            goto yy529;
+          if (yych <= 0x7F)
+            goto yy510;
+          goto yy512;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy514;
+        if (yych <= 0xE0)
+          goto yy515;
+        if (yych <= 0xEC)
+          goto yy516;
+        goto yy517;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy516;
+          goto yy518;
+        } else {
+          if (yych <= 0xF3)
+            goto yy519;
+          if (yych <= 0xF4)
+            goto yy520;
+          goto yy512;
+        }
+      }
+    }
+  }
+}
+
+// Try to match an HTML block end line of type 2
+bufsize_t _scan_html_block_end_2(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    unsigned int yyaccept = 0;
+    static const unsigned char yybm[] = {
+        0,  64, 64, 64, 64, 64, 64, 64, 64, 64,  0,  64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,
+    };
+    yych = *p;
+    if (yych <= 0xDF) {
+      if (yych <= ',') {
+        if (yych <= 0x00)
+          goto yy542;
+        if (yych != '\n')
+          goto yy544;
+      } else {
+        if (yych <= '-')
+          goto yy545;
+        if (yych <= 0x7F)
+          goto yy544;
+        if (yych >= 0xC2)
+          goto yy546;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0)
+          goto yy547;
+        if (yych == 0xED)
+          goto yy549;
+        goto yy548;
+      } else {
+        if (yych <= 0xF0)
+          goto yy550;
+        if (yych <= 0xF3)
+          goto yy551;
+        if (yych <= 0xF4)
+          goto yy552;
+      }
+    }
+  yy542:
+    ++p;
+  yy543 : { return 0; }
+  yy544:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= '\n') {
+      if (yych <= 0x00)
+        goto yy543;
+      if (yych <= '\t')
+        goto yy554;
+      goto yy543;
+    } else {
+      if (yych <= 0x7F)
+        goto yy554;
+      if (yych <= 0xC1)
+        goto yy543;
+      if (yych <= 0xF4)
+        goto yy554;
+      goto yy543;
+    }
+  yy545:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 128) {
+      goto yy564;
+    }
+    if (yych <= '\n') {
+      if (yych <= 0x00)
+        goto yy543;
+      if (yych <= '\t')
+        goto yy554;
+      goto yy543;
+    } else {
+      if (yych <= 0x7F)
+        goto yy554;
+      if (yych <= 0xC1)
+        goto yy543;
+      if (yych <= 0xF4)
+        goto yy554;
+      goto yy543;
+    }
+  yy546:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy543;
+    if (yych <= 0xBF)
+      goto yy553;
+    goto yy543;
+  yy547:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x9F)
+      goto yy543;
+    if (yych <= 0xBF)
+      goto yy557;
+    goto yy543;
+  yy548:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy543;
+    if (yych <= 0xBF)
+      goto yy557;
+    goto yy543;
+  yy549:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy543;
+    if (yych <= 0x9F)
+      goto yy557;
+    goto yy543;
+  yy550:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x8F)
+      goto yy543;
+    if (yych <= 0xBF)
+      goto yy559;
+    goto yy543;
+  yy551:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy543;
+    if (yych <= 0xBF)
+      goto yy559;
+    goto yy543;
+  yy552:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy543;
+    if (yych <= 0x8F)
+      goto yy559;
+    goto yy543;
+  yy553:
+    yych = *++p;
+  yy554:
+    if (yybm[0 + yych] & 64) {
+      goto yy553;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy555;
+        if (yych <= '-')
+          goto yy556;
+      } else {
+        if (yych <= 0xDF)
+          goto yy557;
+        if (yych <= 0xE0)
+          goto yy558;
+        goto yy559;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy560;
+        if (yych <= 0xEF)
+          goto yy559;
+        goto yy561;
+      } else {
+        if (yych <= 0xF3)
+          goto yy562;
+        if (yych <= 0xF4)
+          goto yy563;
+      }
+    }
+  yy555:
+    p = marker;
+    if (yyaccept == 0) {
+      goto yy543;
+    } else {
+      goto yy566;
+    }
+  yy556:
+    yych = *++p;
+    if (yybm[0 + yych] & 64) {
+      goto yy553;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy555;
+        if (yych <= '-')
+          goto yy564;
+        goto yy555;
+      } else {
+        if (yych <= 0xDF)
+          goto yy557;
+        if (yych <= 0xE0)
+          goto yy558;
+        goto yy559;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy560;
+        if (yych <= 0xEF)
+          goto yy559;
+        goto yy561;
+      } else {
+        if (yych <= 0xF3)
+          goto yy562;
+        if (yych <= 0xF4)
+          goto yy563;
+        goto yy555;
+      }
+    }
+  yy557:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy555;
+    if (yych <= 0xBF)
+      goto yy553;
+    goto yy555;
+  yy558:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy555;
+    if (yych <= 0xBF)
+      goto yy557;
+    goto yy555;
+  yy559:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy555;
+    if (yych <= 0xBF)
+      goto yy557;
+    goto yy555;
+  yy560:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy555;
+    if (yych <= 0x9F)
+      goto yy557;
+    goto yy555;
+  yy561:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy555;
+    if (yych <= 0xBF)
+      goto yy559;
+    goto yy555;
+  yy562:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy555;
+    if (yych <= 0xBF)
+      goto yy559;
+    goto yy555;
+  yy563:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy555;
+    if (yych <= 0x8F)
+      goto yy559;
+    goto yy555;
+  yy564:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy564;
+    }
+    if (yych <= 0xDF) {
+      if (yych <= '=') {
+        if (yych <= 0x00)
+          goto yy555;
+        if (yych == '\n')
+          goto yy555;
+        goto yy553;
+      } else {
+        if (yych <= '>')
+          goto yy565;
+        if (yych <= 0x7F)
+          goto yy553;
+        if (yych <= 0xC1)
+          goto yy555;
+        goto yy557;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0)
+          goto yy558;
+        if (yych == 0xED)
+          goto yy560;
+        goto yy559;
+      } else {
+        if (yych <= 0xF0)
+          goto yy561;
+        if (yych <= 0xF3)
+          goto yy562;
+        if (yych <= 0xF4)
+          goto yy563;
+        goto yy555;
+      }
+    }
+  yy565:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 64) {
+      goto yy553;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy566;
+        if (yych <= '-')
+          goto yy556;
+      } else {
+        if (yych <= 0xDF)
+          goto yy557;
+        if (yych <= 0xE0)
+          goto yy558;
+        goto yy559;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy560;
+        if (yych <= 0xEF)
+          goto yy559;
+        goto yy561;
+      } else {
+        if (yych <= 0xF3)
+          goto yy562;
+        if (yych <= 0xF4)
+          goto yy563;
+      }
+    }
+  yy566 : { return (bufsize_t)(p - start); }
+  }
+}
+
+// Try to match an HTML block end line of type 3
+bufsize_t _scan_html_block_end_3(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    unsigned int yyaccept = 0;
+    static const unsigned char yybm[] = {
+        0,  64, 64, 64, 64, 64, 64, 64, 64, 64,  0,  64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,
+    };
+    yych = *p;
+    if (yych <= 0xDF) {
+      if (yych <= '>') {
+        if (yych <= 0x00)
+          goto yy568;
+        if (yych != '\n')
+          goto yy570;
+      } else {
+        if (yych <= '?')
+          goto yy571;
+        if (yych <= 0x7F)
+          goto yy570;
+        if (yych >= 0xC2)
+          goto yy572;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0)
+          goto yy573;
+        if (yych == 0xED)
+          goto yy575;
+        goto yy574;
+      } else {
+        if (yych <= 0xF0)
+          goto yy576;
+        if (yych <= 0xF3)
+          goto yy577;
+        if (yych <= 0xF4)
+          goto yy578;
+      }
+    }
+  yy568:
+    ++p;
+  yy569 : { return 0; }
+  yy570:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= '\n') {
+      if (yych <= 0x00)
+        goto yy569;
+      if (yych <= '\t')
+        goto yy580;
+      goto yy569;
+    } else {
+      if (yych <= 0x7F)
+        goto yy580;
+      if (yych <= 0xC1)
+        goto yy569;
+      if (yych <= 0xF4)
+        goto yy580;
+      goto yy569;
+    }
+  yy571:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= '=') {
+      if (yych <= 0x00)
+        goto yy569;
+      if (yych == '\n')
+        goto yy569;
+      goto yy580;
+    } else {
+      if (yych <= 0x7F) {
+        if (yych <= '>')
+          goto yy590;
+        goto yy580;
+      } else {
+        if (yych <= 0xC1)
+          goto yy569;
+        if (yych <= 0xF4)
+          goto yy580;
+        goto yy569;
+      }
+    }
+  yy572:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy569;
+    if (yych <= 0xBF)
+      goto yy579;
+    goto yy569;
+  yy573:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x9F)
+      goto yy569;
+    if (yych <= 0xBF)
+      goto yy583;
+    goto yy569;
+  yy574:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy569;
+    if (yych <= 0xBF)
+      goto yy583;
+    goto yy569;
+  yy575:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy569;
+    if (yych <= 0x9F)
+      goto yy583;
+    goto yy569;
+  yy576:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x8F)
+      goto yy569;
+    if (yych <= 0xBF)
+      goto yy585;
+    goto yy569;
+  yy577:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy569;
+    if (yych <= 0xBF)
+      goto yy585;
+    goto yy569;
+  yy578:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy569;
+    if (yych <= 0x8F)
+      goto yy585;
+    goto yy569;
+  yy579:
+    yych = *++p;
+  yy580:
+    if (yybm[0 + yych] & 64) {
+      goto yy579;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy581;
+        if (yych <= '?')
+          goto yy582;
+      } else {
+        if (yych <= 0xDF)
+          goto yy583;
+        if (yych <= 0xE0)
+          goto yy584;
+        goto yy585;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy586;
+        if (yych <= 0xEF)
+          goto yy585;
+        goto yy587;
+      } else {
+        if (yych <= 0xF3)
+          goto yy588;
+        if (yych <= 0xF4)
+          goto yy589;
+      }
+    }
+  yy581:
+    p = marker;
+    if (yyaccept == 0) {
+      goto yy569;
+    } else {
+      goto yy591;
+    }
+  yy582:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy582;
+    }
+    if (yych <= 0xDF) {
+      if (yych <= '=') {
+        if (yych <= 0x00)
+          goto yy581;
+        if (yych == '\n')
+          goto yy581;
+        goto yy579;
+      } else {
+        if (yych <= '>')
+          goto yy590;
+        if (yych <= 0x7F)
+          goto yy579;
+        if (yych <= 0xC1)
+          goto yy581;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0)
+          goto yy584;
+        if (yych == 0xED)
+          goto yy586;
+        goto yy585;
+      } else {
+        if (yych <= 0xF0)
+          goto yy587;
+        if (yych <= 0xF3)
+          goto yy588;
+        if (yych <= 0xF4)
+          goto yy589;
+        goto yy581;
+      }
+    }
+  yy583:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy581;
+    if (yych <= 0xBF)
+      goto yy579;
+    goto yy581;
+  yy584:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy581;
+    if (yych <= 0xBF)
+      goto yy583;
+    goto yy581;
+  yy585:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy581;
+    if (yych <= 0xBF)
+      goto yy583;
+    goto yy581;
+  yy586:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy581;
+    if (yych <= 0x9F)
+      goto yy583;
+    goto yy581;
+  yy587:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy581;
+    if (yych <= 0xBF)
+      goto yy585;
+    goto yy581;
+  yy588:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy581;
+    if (yych <= 0xBF)
+      goto yy585;
+    goto yy581;
+  yy589:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy581;
+    if (yych <= 0x8F)
+      goto yy585;
+    goto yy581;
+  yy590:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 64) {
+      goto yy579;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy591;
+        if (yych <= '?')
+          goto yy582;
+      } else {
+        if (yych <= 0xDF)
+          goto yy583;
+        if (yych <= 0xE0)
+          goto yy584;
+        goto yy585;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy586;
+        if (yych <= 0xEF)
+          goto yy585;
+        goto yy587;
+      } else {
+        if (yych <= 0xF3)
+          goto yy588;
+        if (yych <= 0xF4)
+          goto yy589;
+      }
+    }
+  yy591 : { return (bufsize_t)(p - start); }
+  }
+}
+
+// Try to match an HTML block end line of type 4
+bufsize_t _scan_html_block_end_4(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    unsigned int yyaccept = 0;
+    static const unsigned char yybm[] = {
+        0,   128, 128, 128, 128, 128, 128, 128, 128, 128, 0,   128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 64,  128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,
+    };
+    yych = *p;
+    if (yybm[0 + yych] & 64) {
+      goto yy596;
+    }
+    if (yych <= 0xE0) {
+      if (yych <= '\n') {
+        if (yych <= 0x00)
+          goto yy593;
+        if (yych <= '\t')
+          goto yy595;
+      } else {
+        if (yych <= 0x7F)
+          goto yy595;
+        if (yych <= 0xC1)
+          goto yy593;
+        if (yych <= 0xDF)
+          goto yy598;
+        goto yy599;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy601;
+        goto yy600;
+      } else {
+        if (yych <= 0xF0)
+          goto yy602;
+        if (yych <= 0xF3)
+          goto yy603;
+        if (yych <= 0xF4)
+          goto yy604;
+      }
+    }
+  yy593:
+    ++p;
+  yy594 : { return 0; }
+  yy595:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= '\n') {
+      if (yych <= 0x00)
+        goto yy594;
+      if (yych <= '\t')
+        goto yy606;
+      goto yy594;
+    } else {
+      if (yych <= 0x7F)
+        goto yy606;
+      if (yych <= 0xC1)
+        goto yy594;
+      if (yych <= 0xF4)
+        goto yy606;
+      goto yy594;
+    }
+  yy596:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 128) {
+      goto yy605;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy597;
+        if (yych <= '>')
+          goto yy596;
+      } else {
+        if (yych <= 0xDF)
+          goto yy608;
+        if (yych <= 0xE0)
+          goto yy609;
+        goto yy610;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy611;
+        if (yych <= 0xEF)
+          goto yy610;
+        goto yy612;
+      } else {
+        if (yych <= 0xF3)
+          goto yy613;
+        if (yych <= 0xF4)
+          goto yy614;
+      }
+    }
+  yy597 : { return (bufsize_t)(p - start); }
+  yy598:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy594;
+    if (yych <= 0xBF)
+      goto yy605;
+    goto yy594;
+  yy599:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x9F)
+      goto yy594;
+    if (yych <= 0xBF)
+      goto yy608;
+    goto yy594;
+  yy600:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy594;
+    if (yych <= 0xBF)
+      goto yy608;
+    goto yy594;
+  yy601:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy594;
+    if (yych <= 0x9F)
+      goto yy608;
+    goto yy594;
+  yy602:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x8F)
+      goto yy594;
+    if (yych <= 0xBF)
+      goto yy610;
+    goto yy594;
+  yy603:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy594;
+    if (yych <= 0xBF)
+      goto yy610;
+    goto yy594;
+  yy604:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy594;
+    if (yych <= 0x8F)
+      goto yy610;
+    goto yy594;
+  yy605:
+    yych = *++p;
+  yy606:
+    if (yybm[0 + yych] & 128) {
+      goto yy605;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy607;
+        if (yych <= '>')
+          goto yy596;
+      } else {
+        if (yych <= 0xDF)
+          goto yy608;
+        if (yych <= 0xE0)
+          goto yy609;
+        goto yy610;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy611;
+        if (yych <= 0xEF)
+          goto yy610;
+        goto yy612;
+      } else {
+        if (yych <= 0xF3)
+          goto yy613;
+        if (yych <= 0xF4)
+          goto yy614;
+      }
+    }
+  yy607:
+    p = marker;
+    if (yyaccept == 0) {
+      goto yy594;
+    } else {
+      goto yy597;
+    }
+  yy608:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy607;
+    if (yych <= 0xBF)
+      goto yy605;
+    goto yy607;
+  yy609:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy607;
+    if (yych <= 0xBF)
+      goto yy608;
+    goto yy607;
+  yy610:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy607;
+    if (yych <= 0xBF)
+      goto yy608;
+    goto yy607;
+  yy611:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy607;
+    if (yych <= 0x9F)
+      goto yy608;
+    goto yy607;
+  yy612:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy607;
+    if (yych <= 0xBF)
+      goto yy610;
+    goto yy607;
+  yy613:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy607;
+    if (yych <= 0xBF)
+      goto yy610;
+    goto yy607;
+  yy614:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy607;
+    if (yych <= 0x8F)
+      goto yy610;
+    goto yy607;
+  }
+}
+
+// Try to match an HTML block end line of type 5
+bufsize_t _scan_html_block_end_5(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    unsigned int yyaccept = 0;
+    static const unsigned char yybm[] = {
+        0,  64, 64, 64,  64, 64, 64, 64, 64, 64, 0,  64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 64, 64,  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+        64, 64, 0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,
+    };
+    yych = *p;
+    if (yych <= 0xDF) {
+      if (yych <= '\\') {
+        if (yych <= 0x00)
+          goto yy616;
+        if (yych != '\n')
+          goto yy618;
+      } else {
+        if (yych <= ']')
+          goto yy619;
+        if (yych <= 0x7F)
+          goto yy618;
+        if (yych >= 0xC2)
+          goto yy620;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0)
+          goto yy621;
+        if (yych == 0xED)
+          goto yy623;
+        goto yy622;
+      } else {
+        if (yych <= 0xF0)
+          goto yy624;
+        if (yych <= 0xF3)
+          goto yy625;
+        if (yych <= 0xF4)
+          goto yy626;
+      }
+    }
+  yy616:
+    ++p;
+  yy617 : { return 0; }
+  yy618:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= '\n') {
+      if (yych <= 0x00)
+        goto yy617;
+      if (yych <= '\t')
+        goto yy628;
+      goto yy617;
+    } else {
+      if (yych <= 0x7F)
+        goto yy628;
+      if (yych <= 0xC1)
+        goto yy617;
+      if (yych <= 0xF4)
+        goto yy628;
+      goto yy617;
+    }
+  yy619:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 128) {
+      goto yy638;
+    }
+    if (yych <= '\n') {
+      if (yych <= 0x00)
+        goto yy617;
+      if (yych <= '\t')
+        goto yy628;
+      goto yy617;
+    } else {
+      if (yych <= 0x7F)
+        goto yy628;
+      if (yych <= 0xC1)
+        goto yy617;
+      if (yych <= 0xF4)
+        goto yy628;
+      goto yy617;
+    }
+  yy620:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy617;
+    if (yych <= 0xBF)
+      goto yy627;
+    goto yy617;
+  yy621:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x9F)
+      goto yy617;
+    if (yych <= 0xBF)
+      goto yy631;
+    goto yy617;
+  yy622:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy617;
+    if (yych <= 0xBF)
+      goto yy631;
+    goto yy617;
+  yy623:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy617;
+    if (yych <= 0x9F)
+      goto yy631;
+    goto yy617;
+  yy624:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x8F)
+      goto yy617;
+    if (yych <= 0xBF)
+      goto yy633;
+    goto yy617;
+  yy625:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy617;
+    if (yych <= 0xBF)
+      goto yy633;
+    goto yy617;
+  yy626:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x7F)
+      goto yy617;
+    if (yych <= 0x8F)
+      goto yy633;
+    goto yy617;
+  yy627:
+    yych = *++p;
+  yy628:
+    if (yybm[0 + yych] & 64) {
+      goto yy627;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy629;
+        if (yych <= ']')
+          goto yy630;
+      } else {
+        if (yych <= 0xDF)
+          goto yy631;
+        if (yych <= 0xE0)
+          goto yy632;
+        goto yy633;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy634;
+        if (yych <= 0xEF)
+          goto yy633;
+        goto yy635;
+      } else {
+        if (yych <= 0xF3)
+          goto yy636;
+        if (yych <= 0xF4)
+          goto yy637;
+      }
+    }
+  yy629:
+    p = marker;
+    if (yyaccept == 0) {
+      goto yy617;
+    } else {
+      goto yy640;
+    }
+  yy630:
+    yych = *++p;
+    if (yybm[0 + yych] & 64) {
+      goto yy627;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy629;
+        if (yych <= ']')
+          goto yy638;
+        goto yy629;
+      } else {
+        if (yych <= 0xDF)
+          goto yy631;
+        if (yych <= 0xE0)
+          goto yy632;
+        goto yy633;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy634;
+        if (yych <= 0xEF)
+          goto yy633;
+        goto yy635;
+      } else {
+        if (yych <= 0xF3)
+          goto yy636;
+        if (yych <= 0xF4)
+          goto yy637;
+        goto yy629;
+      }
+    }
+  yy631:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy629;
+    if (yych <= 0xBF)
+      goto yy627;
+    goto yy629;
+  yy632:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy629;
+    if (yych <= 0xBF)
+      goto yy631;
+    goto yy629;
+  yy633:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy629;
+    if (yych <= 0xBF)
+      goto yy631;
+    goto yy629;
+  yy634:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy629;
+    if (yych <= 0x9F)
+      goto yy631;
+    goto yy629;
+  yy635:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy629;
+    if (yych <= 0xBF)
+      goto yy633;
+    goto yy629;
+  yy636:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy629;
+    if (yych <= 0xBF)
+      goto yy633;
+    goto yy629;
+  yy637:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy629;
+    if (yych <= 0x8F)
+      goto yy633;
+    goto yy629;
+  yy638:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy638;
+    }
+    if (yych <= 0xDF) {
+      if (yych <= '=') {
+        if (yych <= 0x00)
+          goto yy629;
+        if (yych == '\n')
+          goto yy629;
+        goto yy627;
+      } else {
+        if (yych <= '>')
+          goto yy639;
+        if (yych <= 0x7F)
+          goto yy627;
+        if (yych <= 0xC1)
+          goto yy629;
+        goto yy631;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0)
+          goto yy632;
+        if (yych == 0xED)
+          goto yy634;
+        goto yy633;
+      } else {
+        if (yych <= 0xF0)
+          goto yy635;
+        if (yych <= 0xF3)
+          goto yy636;
+        if (yych <= 0xF4)
+          goto yy637;
+        goto yy629;
+      }
+    }
+  yy639:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 64) {
+      goto yy627;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\n')
+          goto yy640;
+        if (yych <= ']')
+          goto yy630;
+      } else {
+        if (yych <= 0xDF)
+          goto yy631;
+        if (yych <= 0xE0)
+          goto yy632;
+        goto yy633;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy634;
+        if (yych <= 0xEF)
+          goto yy633;
+        goto yy635;
+      } else {
+        if (yych <= 0xF3)
+          goto yy636;
+        if (yych <= 0xF4)
+          goto yy637;
+      }
+    }
+  yy640 : { return (bufsize_t)(p - start); }
+  }
+}
+
+// Try to match a link title (in single quotes, in double quotes, or
+// in parentheses), returning number of chars matched.  Allow one
+// level of internal nesting (quotes within quotes).
+bufsize_t _scan_link_title(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    unsigned int yyaccept = 0;
+    static const unsigned char yybm[] = {
+        0,   208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+        208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+        208, 208, 208, 208, 208, 208, 192, 208, 208, 208, 208, 144, 80,  80,
+        208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+        208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+        208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+        208, 208, 208, 208, 208, 208, 208, 208, 32,  208, 208, 208, 208, 208,
+        208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+        208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+        208, 208, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,
+    };
+    yych = *p;
+    if (yych <= '&') {
+      if (yych == '"')
+        goto yy643;
+    } else {
+      if (yych <= '\'')
+        goto yy644;
+      if (yych <= '(')
+        goto yy645;
+    }
+    ++p;
+  yy642 : { return 0; }
+  yy643:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x00)
+      goto yy642;
+    if (yych <= 0x7F)
+      goto yy647;
+    if (yych <= 0xC1)
+      goto yy642;
+    if (yych <= 0xF4)
+      goto yy647;
+    goto yy642;
+  yy644:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= 0x00)
+      goto yy642;
+    if (yych <= 0x7F)
+      goto yy660;
+    if (yych <= 0xC1)
+      goto yy642;
+    if (yych <= 0xF4)
+      goto yy660;
+    goto yy642;
+  yy645:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych <= '(') {
+      if (yych <= 0x00)
+        goto yy642;
+      if (yych <= '\'')
+        goto yy672;
+      goto yy642;
+    } else {
+      if (yych <= 0x7F)
+        goto yy672;
+      if (yych <= 0xC1)
+        goto yy642;
+      if (yych <= 0xF4)
+        goto yy672;
+      goto yy642;
+    }
+  yy646:
+    yych = *++p;
+  yy647:
+    if (yybm[0 + yych] & 16) {
+      goto yy646;
+    }
+    if (yych <= 0xE0) {
+      if (yych <= '\\') {
+        if (yych <= 0x00)
+          goto yy648;
+        if (yych <= '"')
+          goto yy649;
+        goto yy651;
+      } else {
+        if (yych <= 0xC1)
+          goto yy648;
+        if (yych <= 0xDF)
+          goto yy652;
+        goto yy653;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy655;
+        goto yy654;
+      } else {
+        if (yych <= 0xF0)
+          goto yy656;
+        if (yych <= 0xF3)
+          goto yy657;
+        if (yych <= 0xF4)
+          goto yy658;
+      }
+    }
+  yy648:
+    p = marker;
+    if (yyaccept <= 1) {
+      if (yyaccept == 0) {
+        goto yy642;
+      } else {
+        goto yy650;
+      }
+    } else {
+      if (yyaccept == 2) {
+        goto yy662;
+      } else {
+        goto yy674;
+      }
+    }
+  yy649:
+    ++p;
+  yy650 : { return (bufsize_t)(p - start); }
+  yy651:
+    yych = *++p;
+    if (yybm[0 + yych] & 16) {
+      goto yy646;
+    }
+    if (yych <= 0xE0) {
+      if (yych <= '\\') {
+        if (yych <= 0x00)
+          goto yy648;
+        if (yych <= '"')
+          goto yy683;
+        goto yy651;
+      } else {
+        if (yych <= 0xC1)
+          goto yy648;
+        if (yych >= 0xE0)
+          goto yy653;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy655;
+        goto yy654;
+      } else {
+        if (yych <= 0xF0)
+          goto yy656;
+        if (yych <= 0xF3)
+          goto yy657;
+        if (yych <= 0xF4)
+          goto yy658;
+        goto yy648;
+      }
+    }
+  yy652:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy646;
+    goto yy648;
+  yy653:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy652;
+    goto yy648;
+  yy654:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy652;
+    goto yy648;
+  yy655:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0x9F)
+      goto yy652;
+    goto yy648;
+  yy656:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy654;
+    goto yy648;
+  yy657:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy654;
+    goto yy648;
+  yy658:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0x8F)
+      goto yy654;
+    goto yy648;
+  yy659:
+    yych = *++p;
+  yy660:
+    if (yybm[0 + yych] & 64) {
+      goto yy659;
+    }
+    if (yych <= 0xE0) {
+      if (yych <= '\\') {
+        if (yych <= 0x00)
+          goto yy648;
+        if (yych >= '(')
+          goto yy663;
+      } else {
+        if (yych <= 0xC1)
+          goto yy648;
+        if (yych <= 0xDF)
+          goto yy664;
+        goto yy665;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy667;
+        goto yy666;
+      } else {
+        if (yych <= 0xF0)
+          goto yy668;
+        if (yych <= 0xF3)
+          goto yy669;
+        if (yych <= 0xF4)
+          goto yy670;
+        goto yy648;
+      }
+    }
+  yy661:
+    ++p;
+  yy662 : { return (bufsize_t)(p - start); }
+  yy663:
+    yych = *++p;
+    if (yybm[0 + yych] & 64) {
+      goto yy659;
+    }
+    if (yych <= 0xE0) {
+      if (yych <= '\\') {
+        if (yych <= 0x00)
+          goto yy648;
+        if (yych <= '\'')
+          goto yy684;
+        goto yy663;
+      } else {
+        if (yych <= 0xC1)
+          goto yy648;
+        if (yych >= 0xE0)
+          goto yy665;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy667;
+        goto yy666;
+      } else {
+        if (yych <= 0xF0)
+          goto yy668;
+        if (yych <= 0xF3)
+          goto yy669;
+        if (yych <= 0xF4)
+          goto yy670;
+        goto yy648;
+      }
+    }
+  yy664:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy659;
+    goto yy648;
+  yy665:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy664;
+    goto yy648;
+  yy666:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy664;
+    goto yy648;
+  yy667:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0x9F)
+      goto yy664;
+    goto yy648;
+  yy668:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy666;
+    goto yy648;
+  yy669:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy666;
+    goto yy648;
+  yy670:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0x8F)
+      goto yy666;
+    goto yy648;
+  yy671:
+    yych = *++p;
+  yy672:
+    if (yybm[0 + yych] & 128) {
+      goto yy671;
+    }
+    if (yych <= 0xE0) {
+      if (yych <= '\\') {
+        if (yych <= '(')
+          goto yy648;
+        if (yych >= '*')
+          goto yy675;
+      } else {
+        if (yych <= 0xC1)
+          goto yy648;
+        if (yych <= 0xDF)
+          goto yy676;
+        goto yy677;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy679;
+        goto yy678;
+      } else {
+        if (yych <= 0xF0)
+          goto yy680;
+        if (yych <= 0xF3)
+          goto yy681;
+        if (yych <= 0xF4)
+          goto yy682;
+        goto yy648;
+      }
+    }
+  yy673:
+    ++p;
+  yy674 : { return (bufsize_t)(p - start); }
+  yy675:
+    yych = *++p;
+    if (yych <= 0xDF) {
+      if (yych <= '[') {
+        if (yych <= 0x00)
+          goto yy648;
+        if (yych == ')')
+          goto yy685;
+        goto yy671;
+      } else {
+        if (yych <= '\\')
+          goto yy675;
+        if (yych <= 0x7F)
+          goto yy671;
+        if (yych <= 0xC1)
+          goto yy648;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0)
+          goto yy677;
+        if (yych == 0xED)
+          goto yy679;
+        goto yy678;
+      } else {
+        if (yych <= 0xF0)
+          goto yy680;
+        if (yych <= 0xF3)
+          goto yy681;
+        if (yych <= 0xF4)
+          goto yy682;
+        goto yy648;
+      }
+    }
+  yy676:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy671;
+    goto yy648;
+  yy677:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy676;
+    goto yy648;
+  yy678:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy676;
+    goto yy648;
+  yy679:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0x9F)
+      goto yy676;
+    goto yy648;
+  yy680:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy678;
+    goto yy648;
+  yy681:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0xBF)
+      goto yy678;
+    goto yy648;
+  yy682:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy648;
+    if (yych <= 0x8F)
+      goto yy678;
+    goto yy648;
+  yy683:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 16) {
+      goto yy646;
+    }
+    if (yych <= 0xE0) {
+      if (yych <= '\\') {
+        if (yych <= 0x00)
+          goto yy650;
+        if (yych <= '"')
+          goto yy649;
+        goto yy651;
+      } else {
+        if (yych <= 0xC1)
+          goto yy650;
+        if (yych <= 0xDF)
+          goto yy652;
+        goto yy653;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy655;
+        goto yy654;
+      } else {
+        if (yych <= 0xF0)
+          goto yy656;
+        if (yych <= 0xF3)
+          goto yy657;
+        if (yych <= 0xF4)
+          goto yy658;
+        goto yy650;
+      }
+    }
+  yy684:
+    yyaccept = 2;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 64) {
+      goto yy659;
+    }
+    if (yych <= 0xE0) {
+      if (yych <= '\\') {
+        if (yych <= 0x00)
+          goto yy662;
+        if (yych <= '\'')
+          goto yy661;
+        goto yy663;
+      } else {
+        if (yych <= 0xC1)
+          goto yy662;
+        if (yych <= 0xDF)
+          goto yy664;
+        goto yy665;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy667;
+        goto yy666;
+      } else {
+        if (yych <= 0xF0)
+          goto yy668;
+        if (yych <= 0xF3)
+          goto yy669;
+        if (yych <= 0xF4)
+          goto yy670;
+        goto yy662;
+      }
+    }
+  yy685:
+    yyaccept = 3;
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 128) {
+      goto yy671;
+    }
+    if (yych <= 0xE0) {
+      if (yych <= '\\') {
+        if (yych <= '(')
+          goto yy674;
+        if (yych <= ')')
+          goto yy673;
+        goto yy675;
+      } else {
+        if (yych <= 0xC1)
+          goto yy674;
+        if (yych <= 0xDF)
+          goto yy676;
+        goto yy677;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych == 0xED)
+          goto yy679;
+        goto yy678;
+      } else {
+        if (yych <= 0xF0)
+          goto yy680;
+        if (yych <= 0xF3)
+          goto yy681;
+        if (yych <= 0xF4)
+          goto yy682;
+        goto yy674;
+      }
+    }
+  }
+}
+
+// Match space characters, including newlines.
+bufsize_t _scan_spacechars(const unsigned char *p) {
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    static const unsigned char yybm[] = {
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   128, 0,   0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0,   0,   0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0,   0,   0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0,   0,   0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0,   0,   0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0,   0,   0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0,   0,   0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0,   0,   0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0,   0,   0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0,   0,   0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0,   0,   0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0,   0,   0, 0,
+    };
+    yych = *p;
+    if (yybm[0 + yych] & 128) {
+      goto yy687;
+    }
+    ++p;
+    { return 0; }
+  yy687:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy687;
+    }
+    { return (bufsize_t)(p - start); }
+  }
+}
+
+// Match ATX heading start.
+bufsize_t _scan_atx_heading_start(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    static const unsigned char yybm[] = {
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0, 0, 0,
+    };
+    yych = *p;
+    if (yych == '#')
+      goto yy690;
+    ++p;
+  yy689 : { return 0; }
+  yy690:
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 128) {
+      goto yy691;
+    }
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy689;
+      if (yych <= '\n')
+        goto yy693;
+      goto yy689;
+    } else {
+      if (yych <= '\r')
+        goto yy693;
+      if (yych == '#')
+        goto yy694;
+      goto yy689;
+    }
+  yy691:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy691;
+    }
+  yy692 : { return (bufsize_t)(p - start); }
+  yy693:
+    ++p;
+    goto yy692;
+  yy694:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy691;
+    }
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy695;
+      if (yych <= '\n')
+        goto yy693;
+    } else {
+      if (yych <= '\r')
+        goto yy693;
+      if (yych == '#')
+        goto yy696;
+    }
+  yy695:
+    p = marker;
+    goto yy689;
+  yy696:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy691;
+    }
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy695;
+      if (yych <= '\n')
+        goto yy693;
+      goto yy695;
+    } else {
+      if (yych <= '\r')
+        goto yy693;
+      if (yych != '#')
+        goto yy695;
+    }
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy691;
+    }
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy695;
+      if (yych <= '\n')
+        goto yy693;
+      goto yy695;
+    } else {
+      if (yych <= '\r')
+        goto yy693;
+      if (yych != '#')
+        goto yy695;
+    }
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy691;
+    }
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy695;
+      if (yych <= '\n')
+        goto yy693;
+      goto yy695;
+    } else {
+      if (yych <= '\r')
+        goto yy693;
+      if (yych != '#')
+        goto yy695;
+    }
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy691;
+    }
+    if (yych <= 0x08)
+      goto yy695;
+    if (yych <= '\n')
+      goto yy693;
+    if (yych == '\r')
+      goto yy693;
+    goto yy695;
+  }
+}
+
+// Match setext heading line.  Return 1 for level-1 heading,
+// 2 for level-2, 0 for no match.
+bufsize_t _scan_setext_heading_line(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+
+  {
+    unsigned char yych;
+    static const unsigned char yybm[] = {
+        0, 0,  0, 0, 0, 0, 0, 0, 0, 32, 0,  0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+        0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  32, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+        0, 64, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0,
+        0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+        0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+        0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+        0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+        0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+        0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+        0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+        0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+        0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,
+    };
+    yych = *p;
+    if (yych == '-')
+      goto yy699;
+    if (yych == '=')
+      goto yy700;
+    ++p;
+  yy698 : { return 0; }
+  yy699:
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 64) {
+      goto yy705;
+    }
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy698;
+      if (yych <= '\n')
+        goto yy702;
+      goto yy698;
+    } else {
+      if (yych <= '\r')
+        goto yy702;
+      if (yych == ' ')
+        goto yy702;
+      goto yy698;
+    }
+  yy700:
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 128) {
+      goto yy709;
+    }
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy698;
+      if (yych <= '\n')
+        goto yy707;
+      goto yy698;
+    } else {
+      if (yych <= '\r')
+        goto yy707;
+      if (yych == ' ')
+        goto yy707;
+      goto yy698;
+    }
+  yy701:
+    yych = *++p;
+  yy702:
+    if (yybm[0 + yych] & 32) {
+      goto yy701;
+    }
+    if (yych <= 0x08)
+      goto yy703;
+    if (yych <= '\n')
+      goto yy704;
+    if (yych == '\r')
+      goto yy704;
+  yy703:
+    p = marker;
+    goto yy698;
+  yy704:
+    ++p;
+    { return 2; }
+  yy705:
+    yych = *++p;
+    if (yybm[0 + yych] & 32) {
+      goto yy701;
+    }
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy703;
+      if (yych <= '\n')
+        goto yy704;
+      goto yy703;
+    } else {
+      if (yych <= '\r')
+        goto yy704;
+      if (yych == '-')
+        goto yy705;
+      goto yy703;
+    }
+  yy706:
+    yych = *++p;
+  yy707:
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy703;
+      if (yych <= '\t')
+        goto yy706;
+      if (yych >= '\v')
+        goto yy703;
+    } else {
+      if (yych <= '\r')
+        goto yy708;
+      if (yych == ' ')
+        goto yy706;
+      goto yy703;
+    }
+  yy708:
+    ++p;
+    { return 1; }
+  yy709:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy709;
+    }
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy703;
+      if (yych <= '\t')
+        goto yy706;
+      if (yych <= '\n')
+        goto yy708;
+      goto yy703;
+    } else {
+      if (yych <= '\r')
+        goto yy708;
+      if (yych == ' ')
+        goto yy706;
+      goto yy703;
+    }
+  }
+}
+
+// Scan an opening code fence.
+bufsize_t _scan_open_code_fence(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    static const unsigned char yybm[] = {
+        0,   192, 192, 192, 192, 192, 192, 192, 192, 192, 0,   192, 192, 0,
+        192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+        192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+        192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+        192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+        192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+        192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 144, 192,
+        192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+        192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+        224, 192, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,
+    };
+    yych = *p;
+    if (yych == '`')
+      goto yy712;
+    if (yych == '~')
+      goto yy713;
+    ++p;
+  yy711 : { return 0; }
+  yy712:
+    yych = *(marker = ++p);
+    if (yych == '`')
+      goto yy714;
+    goto yy711;
+  yy713:
+    yych = *(marker = ++p);
+    if (yych == '~')
+      goto yy716;
+    goto yy711;
+  yy714:
+    yych = *++p;
+    if (yybm[0 + yych] & 16) {
+      goto yy717;
+    }
+  yy715:
+    p = marker;
+    goto yy711;
+  yy716:
+    yych = *++p;
+    if (yybm[0 + yych] & 32) {
+      goto yy718;
+    }
+    goto yy715;
+  yy717:
+    yych = *++p;
+    if (yybm[0 + yych] & 16) {
+      goto yy717;
+    }
+    if (yych <= 0xDF) {
+      if (yych <= '\f') {
+        if (yych <= 0x00)
+          goto yy715;
+        if (yych == '\n') {
+          marker = p;
+          goto yy720;
+        }
+        marker = p;
+        goto yy719;
+      } else {
+        if (yych <= '\r') {
+          marker = p;
+          goto yy720;
+        }
+        if (yych <= 0x7F) {
+          marker = p;
+          goto yy719;
+        }
+        if (yych <= 0xC1)
+          goto yy715;
+        marker = p;
+        goto yy721;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0) {
+          marker = p;
+          goto yy722;
+        }
+        if (yych == 0xED) {
+          marker = p;
+          goto yy724;
+        }
+        marker = p;
+        goto yy723;
+      } else {
+        if (yych <= 0xF0) {
+          marker = p;
+          goto yy725;
+        }
+        if (yych <= 0xF3) {
+          marker = p;
+          goto yy726;
+        }
+        if (yych <= 0xF4) {
+          marker = p;
+          goto yy727;
+        }
+        goto yy715;
+      }
+    }
+  yy718:
+    yych = *++p;
+    if (yybm[0 + yych] & 32) {
+      goto yy718;
+    }
+    if (yych <= 0xDF) {
+      if (yych <= '\f') {
+        if (yych <= 0x00)
+          goto yy715;
+        if (yych == '\n') {
+          marker = p;
+          goto yy729;
+        }
+        marker = p;
+        goto yy728;
+      } else {
+        if (yych <= '\r') {
+          marker = p;
+          goto yy729;
+        }
+        if (yych <= 0x7F) {
+          marker = p;
+          goto yy728;
+        }
+        if (yych <= 0xC1)
+          goto yy715;
+        marker = p;
+        goto yy730;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0) {
+          marker = p;
+          goto yy731;
+        }
+        if (yych == 0xED) {
+          marker = p;
+          goto yy733;
+        }
+        marker = p;
+        goto yy732;
+      } else {
+        if (yych <= 0xF0) {
+          marker = p;
+          goto yy734;
+        }
+        if (yych <= 0xF3) {
+          marker = p;
+          goto yy735;
+        }
+        if (yych <= 0xF4) {
+          marker = p;
+          goto yy736;
+        }
+        goto yy715;
+      }
+    }
+  yy719:
+    yych = *++p;
+    if (yybm[0 + yych] & 64) {
+      goto yy719;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= 0x00)
+          goto yy715;
+        if (yych >= 0x0E)
+          goto yy715;
+      } else {
+        if (yych <= 0xDF)
+          goto yy721;
+        if (yych <= 0xE0)
+          goto yy722;
+        goto yy723;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy724;
+        if (yych <= 0xEF)
+          goto yy723;
+        goto yy725;
+      } else {
+        if (yych <= 0xF3)
+          goto yy726;
+        if (yych <= 0xF4)
+          goto yy727;
+        goto yy715;
+      }
+    }
+  yy720:
+    ++p;
+    p = marker;
+    { return (bufsize_t)(p - start); }
+  yy721:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy715;
+    if (yych <= 0xBF)
+      goto yy719;
+    goto yy715;
+  yy722:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy715;
+    if (yych <= 0xBF)
+      goto yy721;
+    goto yy715;
+  yy723:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy715;
+    if (yych <= 0xBF)
+      goto yy721;
+    goto yy715;
+  yy724:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy715;
+    if (yych <= 0x9F)
+      goto yy721;
+    goto yy715;
+  yy725:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy715;
+    if (yych <= 0xBF)
+      goto yy723;
+    goto yy715;
+  yy726:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy715;
+    if (yych <= 0xBF)
+      goto yy723;
+    goto yy715;
+  yy727:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy715;
+    if (yych <= 0x8F)
+      goto yy723;
+    goto yy715;
+  yy728:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy728;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= 0x00)
+          goto yy715;
+        if (yych >= 0x0E)
+          goto yy715;
+      } else {
+        if (yych <= 0xDF)
+          goto yy730;
+        if (yych <= 0xE0)
+          goto yy731;
+        goto yy732;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy733;
+        if (yych <= 0xEF)
+          goto yy732;
+        goto yy734;
+      } else {
+        if (yych <= 0xF3)
+          goto yy735;
+        if (yych <= 0xF4)
+          goto yy736;
+        goto yy715;
+      }
+    }
+  yy729:
+    ++p;
+    p = marker;
+    { return (bufsize_t)(p - start); }
+  yy730:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy715;
+    if (yych <= 0xBF)
+      goto yy728;
+    goto yy715;
+  yy731:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy715;
+    if (yych <= 0xBF)
+      goto yy730;
+    goto yy715;
+  yy732:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy715;
+    if (yych <= 0xBF)
+      goto yy730;
+    goto yy715;
+  yy733:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy715;
+    if (yych <= 0x9F)
+      goto yy730;
+    goto yy715;
+  yy734:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy715;
+    if (yych <= 0xBF)
+      goto yy732;
+    goto yy715;
+  yy735:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy715;
+    if (yych <= 0xBF)
+      goto yy732;
+    goto yy715;
+  yy736:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy715;
+    if (yych <= 0x8F)
+      goto yy732;
+    goto yy715;
+  }
+}
+
+// Scan a closing code fence with length at least len.
+bufsize_t _scan_close_code_fence(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    static const unsigned char yybm[] = {
+        0, 0, 0, 0, 0, 0, 0, 0, 0,  128, 0,   0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   128, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 32, 0,   0,   0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0, 0,
+    };
+    yych = *p;
+    if (yych == '`')
+      goto yy739;
+    if (yych == '~')
+      goto yy740;
+    ++p;
+  yy738 : { return 0; }
+  yy739:
+    yych = *(marker = ++p);
+    if (yych == '`')
+      goto yy741;
+    goto yy738;
+  yy740:
+    yych = *(marker = ++p);
+    if (yych == '~')
+      goto yy743;
+    goto yy738;
+  yy741:
+    yych = *++p;
+    if (yybm[0 + yych] & 32) {
+      goto yy744;
+    }
+  yy742:
+    p = marker;
+    goto yy738;
+  yy743:
+    yych = *++p;
+    if (yybm[0 + yych] & 64) {
+      goto yy745;
+    }
+    goto yy742;
+  yy744:
+    yych = *++p;
+    if (yybm[0 + yych] & 32) {
+      goto yy744;
+    }
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy742;
+      if (yych <= '\t') {
+        marker = p;
+        goto yy746;
+      }
+      if (yych <= '\n') {
+        marker = p;
+        goto yy747;
+      }
+      goto yy742;
+    } else {
+      if (yych <= '\r') {
+        marker = p;
+        goto yy747;
+      }
+      if (yych == ' ') {
+        marker = p;
+        goto yy746;
+      }
+      goto yy742;
+    }
+  yy745:
+    yych = *++p;
+    if (yybm[0 + yych] & 64) {
+      goto yy745;
+    }
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy742;
+      if (yych <= '\t') {
+        marker = p;
+        goto yy748;
+      }
+      if (yych <= '\n') {
+        marker = p;
+        goto yy749;
+      }
+      goto yy742;
+    } else {
+      if (yych <= '\r') {
+        marker = p;
+        goto yy749;
+      }
+      if (yych == ' ') {
+        marker = p;
+        goto yy748;
+      }
+      goto yy742;
+    }
+  yy746:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy746;
+    }
+    if (yych <= 0x08)
+      goto yy742;
+    if (yych <= '\n')
+      goto yy747;
+    if (yych != '\r')
+      goto yy742;
+  yy747:
+    ++p;
+    p = marker;
+    { return (bufsize_t)(p - start); }
+  yy748:
+    yych = *++p;
+    if (yych <= '\f') {
+      if (yych <= 0x08)
+        goto yy742;
+      if (yych <= '\t')
+        goto yy748;
+      if (yych >= '\v')
+        goto yy742;
+    } else {
+      if (yych <= '\r')
+        goto yy749;
+      if (yych == ' ')
+        goto yy748;
+      goto yy742;
+    }
+  yy749:
+    ++p;
+    p = marker;
+    { return (bufsize_t)(p - start); }
+  }
+}
+
+// Scans an entity.
+// Returns number of chars matched.
+bufsize_t _scan_entity(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    yych = *p;
+    if (yych == '&')
+      goto yy752;
+    ++p;
+  yy751 : { return 0; }
+  yy752:
+    yych = *(marker = ++p);
+    if (yych <= '@') {
+      if (yych != '#')
+        goto yy751;
+    } else {
+      if (yych <= 'Z')
+        goto yy754;
+      if (yych <= '`')
+        goto yy751;
+      if (yych <= 'z')
+        goto yy754;
+      goto yy751;
+    }
+    yych = *++p;
+    if (yych <= 'W') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy755;
+    } else {
+      if (yych <= 'X')
+        goto yy756;
+      if (yych == 'x')
+        goto yy756;
+    }
+  yy753:
+    p = marker;
+    goto yy751;
+  yy754:
+    yych = *++p;
+    if (yych <= '@') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy757;
+      goto yy753;
+    } else {
+      if (yych <= 'Z')
+        goto yy757;
+      if (yych <= '`')
+        goto yy753;
+      if (yych <= 'z')
+        goto yy757;
+      goto yy753;
+    }
+  yy755:
+    yych = *++p;
+    if (yych <= '/')
+      goto yy753;
+    if (yych <= '9')
+      goto yy758;
+    if (yych == ';')
+      goto yy759;
+    goto yy753;
+  yy756:
+    yych = *++p;
+    if (yych <= '@') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy760;
+      goto yy753;
+    } else {
+      if (yych <= 'F')
+        goto yy760;
+      if (yych <= '`')
+        goto yy753;
+      if (yych <= 'f')
+        goto yy760;
+      goto yy753;
+    }
+  yy757:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy761;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+        goto yy761;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych <= 'z')
+          goto yy761;
+        goto yy753;
+      }
+    }
+  yy758:
+    yych = *++p;
+    if (yych <= '/')
+      goto yy753;
+    if (yych <= '9')
+      goto yy762;
+    if (yych != ';')
+      goto yy753;
+  yy759:
+    ++p;
+    { return (bufsize_t)(p - start); }
+  yy760:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy763;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'F') {
+        if (yych <= '@')
+          goto yy753;
+        goto yy763;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych <= 'f')
+          goto yy763;
+        goto yy753;
+      }
+    }
+  yy761:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy764;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+        goto yy764;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych <= 'z')
+          goto yy764;
+        goto yy753;
+      }
+    }
+  yy762:
+    yych = *++p;
+    if (yych <= '/')
+      goto yy753;
+    if (yych <= '9')
+      goto yy765;
+    if (yych == ';')
+      goto yy759;
+    goto yy753;
+  yy763:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy766;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'F') {
+        if (yych <= '@')
+          goto yy753;
+        goto yy766;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych <= 'f')
+          goto yy766;
+        goto yy753;
+      }
+    }
+  yy764:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy767;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+        goto yy767;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych <= 'z')
+          goto yy767;
+        goto yy753;
+      }
+    }
+  yy765:
+    yych = *++p;
+    if (yych <= '/')
+      goto yy753;
+    if (yych <= '9')
+      goto yy768;
+    if (yych == ';')
+      goto yy759;
+    goto yy753;
+  yy766:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy769;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'F') {
+        if (yych <= '@')
+          goto yy753;
+        goto yy769;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych <= 'f')
+          goto yy769;
+        goto yy753;
+      }
+    }
+  yy767:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy770;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+        goto yy770;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych <= 'z')
+          goto yy770;
+        goto yy753;
+      }
+    }
+  yy768:
+    yych = *++p;
+    if (yych <= '/')
+      goto yy753;
+    if (yych <= '9')
+      goto yy771;
+    if (yych == ';')
+      goto yy759;
+    goto yy753;
+  yy769:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy772;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'F') {
+        if (yych <= '@')
+          goto yy753;
+        goto yy772;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych <= 'f')
+          goto yy772;
+        goto yy753;
+      }
+    }
+  yy770:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy773;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+        goto yy773;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych <= 'z')
+          goto yy773;
+        goto yy753;
+      }
+    }
+  yy771:
+    yych = *++p;
+    if (yych <= '/')
+      goto yy753;
+    if (yych <= '9')
+      goto yy774;
+    if (yych == ';')
+      goto yy759;
+    goto yy753;
+  yy772:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy774;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'F') {
+        if (yych <= '@')
+          goto yy753;
+        goto yy774;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych <= 'f')
+          goto yy774;
+        goto yy753;
+      }
+    }
+  yy773:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy775;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+        goto yy775;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych <= 'z')
+          goto yy775;
+        goto yy753;
+      }
+    }
+  yy774:
+    yych = *++p;
+    if (yych == ';')
+      goto yy759;
+    goto yy753;
+  yy775:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy776;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy776:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy777;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy777:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy778;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy778:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy779;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy779:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy780;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy780:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy781;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy781:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy782;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy782:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy783;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy783:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy784;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy784:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy785;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy785:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy786;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy786:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy787;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy787:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy788;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy788:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy789;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy789:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy790;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy790:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy791;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy791:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy792;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy792:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy793;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy793:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy794;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy794:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy795;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy795:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy796;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy796:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy797;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy797:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy798;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych >= '{')
+          goto yy753;
+      }
+    }
+  yy798:
+    yych = *++p;
+    if (yych <= ';') {
+      if (yych <= '/')
+        goto yy753;
+      if (yych <= '9')
+        goto yy774;
+      if (yych <= ':')
+        goto yy753;
+      goto yy759;
+    } else {
+      if (yych <= 'Z') {
+        if (yych <= '@')
+          goto yy753;
+        goto yy774;
+      } else {
+        if (yych <= '`')
+          goto yy753;
+        if (yych <= 'z')
+          goto yy774;
+        goto yy753;
+      }
+    }
+  }
+}
+
+// Returns positive value if a URL begins in a way that is potentially
+// dangerous, with javascript:, vbscript:, file:, or data:, otherwise 0.
+bufsize_t _scan_dangerous_url(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    unsigned int yyaccept = 0;
+    yych = *p;
+    if (yych <= 'V') {
+      if (yych <= 'F') {
+        if (yych == 'D')
+          goto yy801;
+        if (yych >= 'F')
+          goto yy802;
+      } else {
+        if (yych == 'J')
+          goto yy803;
+        if (yych >= 'V')
+          goto yy804;
+      }
+    } else {
+      if (yych <= 'f') {
+        if (yych == 'd')
+          goto yy801;
+        if (yych >= 'f')
+          goto yy802;
+      } else {
+        if (yych <= 'j') {
+          if (yych >= 'j')
+            goto yy803;
+        } else {
+          if (yych == 'v')
+            goto yy804;
+        }
+      }
+    }
+    ++p;
+  yy800 : { return 0; }
+  yy801:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych == 'A')
+      goto yy805;
+    if (yych == 'a')
+      goto yy805;
+    goto yy800;
+  yy802:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych == 'I')
+      goto yy807;
+    if (yych == 'i')
+      goto yy807;
+    goto yy800;
+  yy803:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych == 'A')
+      goto yy808;
+    if (yych == 'a')
+      goto yy808;
+    goto yy800;
+  yy804:
+    yyaccept = 0;
+    yych = *(marker = ++p);
+    if (yych == 'B')
+      goto yy809;
+    if (yych == 'b')
+      goto yy809;
+    goto yy800;
+  yy805:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy810;
+    if (yych == 't')
+      goto yy810;
+  yy806:
+    p = marker;
+    if (yyaccept == 0) {
+      goto yy800;
+    } else {
+      goto yy818;
+    }
+  yy807:
+    yych = *++p;
+    if (yych == 'L')
+      goto yy811;
+    if (yych == 'l')
+      goto yy811;
+    goto yy806;
+  yy808:
+    yych = *++p;
+    if (yych == 'V')
+      goto yy812;
+    if (yych == 'v')
+      goto yy812;
+    goto yy806;
+  yy809:
+    yych = *++p;
+    if (yych == 'S')
+      goto yy813;
+    if (yych == 's')
+      goto yy813;
+    goto yy806;
+  yy810:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy814;
+    if (yych == 'a')
+      goto yy814;
+    goto yy806;
+  yy811:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy815;
+    if (yych == 'e')
+      goto yy815;
+    goto yy806;
+  yy812:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy809;
+    if (yych == 'a')
+      goto yy809;
+    goto yy806;
+  yy813:
+    yych = *++p;
+    if (yych == 'C')
+      goto yy816;
+    if (yych == 'c')
+      goto yy816;
+    goto yy806;
+  yy814:
+    yych = *++p;
+    if (yych == ':')
+      goto yy817;
+    goto yy806;
+  yy815:
+    yych = *++p;
+    if (yych == ':')
+      goto yy819;
+    goto yy806;
+  yy816:
+    yych = *++p;
+    if (yych == 'R')
+      goto yy820;
+    if (yych == 'r')
+      goto yy820;
+    goto yy806;
+  yy817:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    if (yych == 'I')
+      goto yy821;
+    if (yych == 'i')
+      goto yy821;
+  yy818 : { return (bufsize_t)(p - start); }
+  yy819:
+    ++p;
+    goto yy818;
+  yy820:
+    yych = *++p;
+    if (yych == 'I')
+      goto yy822;
+    if (yych == 'i')
+      goto yy822;
+    goto yy806;
+  yy821:
+    yych = *++p;
+    if (yych == 'M')
+      goto yy823;
+    if (yych == 'm')
+      goto yy823;
+    goto yy806;
+  yy822:
+    yych = *++p;
+    if (yych == 'P')
+      goto yy824;
+    if (yych == 'p')
+      goto yy824;
+    goto yy806;
+  yy823:
+    yych = *++p;
+    if (yych == 'A')
+      goto yy825;
+    if (yych == 'a')
+      goto yy825;
+    goto yy806;
+  yy824:
+    yych = *++p;
+    if (yych == 'T')
+      goto yy815;
+    if (yych == 't')
+      goto yy815;
+    goto yy806;
+  yy825:
+    yych = *++p;
+    if (yych == 'G')
+      goto yy826;
+    if (yych != 'g')
+      goto yy806;
+  yy826:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy827;
+    if (yych != 'e')
+      goto yy806;
+  yy827:
+    yych = *++p;
+    if (yych != '/')
+      goto yy806;
+    yych = *++p;
+    if (yych <= 'W') {
+      if (yych <= 'J') {
+        if (yych == 'G')
+          goto yy828;
+        if (yych <= 'I')
+          goto yy806;
+        goto yy829;
+      } else {
+        if (yych == 'P')
+          goto yy830;
+        if (yych <= 'V')
+          goto yy806;
+        goto yy831;
+      }
+    } else {
+      if (yych <= 'j') {
+        if (yych == 'g')
+          goto yy828;
+        if (yych <= 'i')
+          goto yy806;
+        goto yy829;
+      } else {
+        if (yych <= 'p') {
+          if (yych <= 'o')
+            goto yy806;
+          goto yy830;
+        } else {
+          if (yych == 'w')
+            goto yy831;
+          goto yy806;
+        }
+      }
+    }
+  yy828:
+    yych = *++p;
+    if (yych == 'I')
+      goto yy832;
+    if (yych == 'i')
+      goto yy832;
+    goto yy806;
+  yy829:
+    yych = *++p;
+    if (yych == 'P')
+      goto yy833;
+    if (yych == 'p')
+      goto yy833;
+    goto yy806;
+  yy830:
+    yych = *++p;
+    if (yych == 'N')
+      goto yy834;
+    if (yych == 'n')
+      goto yy834;
+    goto yy806;
+  yy831:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy835;
+    if (yych == 'e')
+      goto yy835;
+    goto yy806;
+  yy832:
+    yych = *++p;
+    if (yych == 'F')
+      goto yy836;
+    if (yych == 'f')
+      goto yy836;
+    goto yy806;
+  yy833:
+    yych = *++p;
+    if (yych == 'E')
+      goto yy834;
+    if (yych != 'e')
+      goto yy806;
+  yy834:
+    yych = *++p;
+    if (yych == 'G')
+      goto yy836;
+    if (yych == 'g')
+      goto yy836;
+    goto yy806;
+  yy835:
+    yych = *++p;
+    if (yych == 'B')
+      goto yy837;
+    if (yych == 'b')
+      goto yy837;
+    goto yy806;
+  yy836:
+    ++p;
+    { return 0; }
+  yy837:
+    yych = *++p;
+    if (yych == 'P')
+      goto yy836;
+    if (yych == 'p')
+      goto yy836;
+    goto yy806;
+  }
+}
+
+// Scans a footnote definition opening.
+bufsize_t _scan_footnote_definition(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    static const unsigned char yybm[] = {
+        0,   64, 64, 64, 64, 64, 64, 64, 64, 128, 0,  64, 64, 0,  64, 64,
+        64,  64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64,
+        128, 64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64,
+        64,  64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64,
+        64,  64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64,
+        64,  64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 0,  64, 64,
+        64,  64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64,
+        64,  64, 64, 64, 64, 64, 64, 64, 64, 64,  64, 64, 64, 64, 64, 64,
+        0,   0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,
+        0,   0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,
+        0,   0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,
+        0,   0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,
+        0,   0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,
+        0,   0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,
+        0,   0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,
+        0,   0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,
+    };
+    yych = *p;
+    if (yych == '[')
+      goto yy840;
+    ++p;
+  yy839 : { return 0; }
+  yy840:
+    yych = *(marker = ++p);
+    if (yych != '^')
+      goto yy839;
+    yych = *++p;
+    if (yych != ']')
+      goto yy843;
+  yy841:
+    p = marker;
+    goto yy839;
+  yy842:
+    yych = *++p;
+  yy843:
+    if (yybm[0 + yych] & 64) {
+      goto yy842;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= ' ')
+          goto yy841;
+        if (yych <= ']')
+          goto yy851;
+        goto yy841;
+      } else {
+        if (yych <= 0xDF)
+          goto yy844;
+        if (yych <= 0xE0)
+          goto yy845;
+        goto yy846;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy847;
+        if (yych <= 0xEF)
+          goto yy846;
+        goto yy848;
+      } else {
+        if (yych <= 0xF3)
+          goto yy849;
+        if (yych <= 0xF4)
+          goto yy850;
+        goto yy841;
+      }
+    }
+  yy844:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy841;
+    if (yych <= 0xBF)
+      goto yy842;
+    goto yy841;
+  yy845:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy841;
+    if (yych <= 0xBF)
+      goto yy844;
+    goto yy841;
+  yy846:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy841;
+    if (yych <= 0xBF)
+      goto yy844;
+    goto yy841;
+  yy847:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy841;
+    if (yych <= 0x9F)
+      goto yy844;
+    goto yy841;
+  yy848:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy841;
+    if (yych <= 0xBF)
+      goto yy846;
+    goto yy841;
+  yy849:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy841;
+    if (yych <= 0xBF)
+      goto yy846;
+    goto yy841;
+  yy850:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy841;
+    if (yych <= 0x8F)
+      goto yy846;
+    goto yy841;
+  yy851:
+    yych = *++p;
+    if (yych != ':')
+      goto yy841;
+  yy852:
+    yych = *++p;
+    if (yybm[0 + yych] & 128) {
+      goto yy852;
+    }
+    { return (bufsize_t)(p - start); }
+  }
 }
diff --git a/cbits/scanners.h b/cbits/scanners.h
--- a/cbits/scanners.h
+++ b/cbits/scanners.h
@@ -15,6 +15,10 @@
 bufsize_t _scan_autolink_email(const unsigned char *p);
 bufsize_t _scan_html_tag(const unsigned char *p);
 bufsize_t _scan_liberal_html_tag(const unsigned char *p);
+bufsize_t _scan_html_comment(const unsigned char *p);
+bufsize_t _scan_html_pi(const unsigned char *p);
+bufsize_t _scan_html_declaration(const unsigned char *p);
+bufsize_t _scan_html_cdata(const unsigned char *p);
 bufsize_t _scan_html_block_start(const unsigned char *p);
 bufsize_t _scan_html_block_start_7(const unsigned char *p);
 bufsize_t _scan_html_block_end_1(const unsigned char *p);
@@ -26,7 +30,6 @@
 bufsize_t _scan_spacechars(const unsigned char *p);
 bufsize_t _scan_atx_heading_start(const unsigned char *p);
 bufsize_t _scan_setext_heading_line(const unsigned char *p);
-bufsize_t _scan_thematic_break(const unsigned char *p);
 bufsize_t _scan_open_code_fence(const unsigned char *p);
 bufsize_t _scan_close_code_fence(const unsigned char *p);
 bufsize_t _scan_entity(const unsigned char *p);
@@ -38,6 +41,10 @@
 #define scan_autolink_email(c, n) _scan_at(&_scan_autolink_email, c, n)
 #define scan_html_tag(c, n) _scan_at(&_scan_html_tag, c, n)
 #define scan_liberal_html_tag(c, n) _scan_at(&_scan_liberal_html_tag, c, n)
+#define scan_html_comment(c, n) _scan_at(&_scan_html_comment, c, n)
+#define scan_html_pi(c, n) _scan_at(&_scan_html_pi, c, n)
+#define scan_html_declaration(c, n) _scan_at(&_scan_html_declaration, c, n)
+#define scan_html_cdata(c, n) _scan_at(&_scan_html_cdata, c, n)
 #define scan_html_block_start(c, n) _scan_at(&_scan_html_block_start, c, n)
 #define scan_html_block_start_7(c, n) _scan_at(&_scan_html_block_start_7, c, n)
 #define scan_html_block_end_1(c, n) _scan_at(&_scan_html_block_end_1, c, n)
@@ -50,7 +57,6 @@
 #define scan_atx_heading_start(c, n) _scan_at(&_scan_atx_heading_start, c, n)
 #define scan_setext_heading_line(c, n)                                         \
   _scan_at(&_scan_setext_heading_line, c, n)
-#define scan_thematic_break(c, n) _scan_at(&_scan_thematic_break, c, n)
 #define scan_open_code_fence(c, n) _scan_at(&_scan_open_code_fence, c, n)
 #define scan_close_code_fence(c, n) _scan_at(&_scan_close_code_fence, c, n)
 #define scan_entity(c, n) _scan_at(&_scan_entity, c, n)
diff --git a/cbits/strikethrough.c b/cbits/strikethrough.c
--- a/cbits/strikethrough.c
+++ b/cbits/strikethrough.c
@@ -67,6 +67,7 @@
   strikethrough->end_column = closer->inl_text->start_column + closer->inl_text->as.literal.len - 1;
   cmark_node_free(closer->inl_text);
 
+done:
   delim = closer;
   while (delim != NULL && delim != opener) {
     tmp_delim = delim->previous;
@@ -76,7 +77,6 @@
 
   cmark_inline_parser_remove_delimiter(inline_parser, opener);
 
-done:
   return res;
 }
 
diff --git a/cbits/table.c b/cbits/table.c
--- a/cbits/table.c
+++ b/cbits/table.c
@@ -11,41 +11,55 @@
 #include "table.h"
 #include "cmark-gfm-core-extensions.h"
 
+// Limit to prevent a malicious input from causing a denial of service.
+#define MAX_AUTOCOMPLETED_CELLS 0x80000
+
+// Custom node flag, initialized in `create_table_extension`.
+static cmark_node_internal_flags CMARK_NODE__TABLE_VISITED;
+
 cmark_node_type CMARK_NODE_TABLE, CMARK_NODE_TABLE_ROW,
     CMARK_NODE_TABLE_CELL;
 
 typedef struct {
+  cmark_strbuf *buf;
+  int start_offset, end_offset, internal_offset;
+} node_cell;
+
+typedef struct {
   uint16_t n_columns;
-  cmark_llist *cells;
+  int paragraph_offset;
+  node_cell *cells;
 } table_row;
 
 typedef struct {
   uint16_t n_columns;
   uint8_t *alignments;
+  int n_rows;
+  int n_nonempty_cells;
 } node_table;
 
 typedef struct {
   bool is_header;
 } node_table_row;
 
-typedef struct {
-  cmark_strbuf *buf;
-  int start_offset, end_offset, internal_offset;
-} node_cell;
-
-static void free_table_cell(cmark_mem *mem, void *data) {
-  node_cell *cell = (node_cell *)data;
+static void free_table_cell(cmark_mem *mem, node_cell *cell) {
   cmark_strbuf_free((cmark_strbuf *)cell->buf);
   mem->free(cell->buf);
-  mem->free(cell);
 }
 
+static void free_row_cells(cmark_mem *mem, table_row *row) {
+  while (row->n_columns > 0) {
+    free_table_cell(mem, &row->cells[--row->n_columns]);
+  }
+  mem->free(row->cells);
+  row->cells = NULL;
+}
+
 static void free_table_row(cmark_mem *mem, table_row *row) {
   if (!row)
     return;
 
-  cmark_llist_free_full(mem, row->cells, (cmark_free_func)free_table_cell);
-
+  free_row_cells(mem, row);
   mem->free(row);
 }
 
@@ -74,6 +88,33 @@
   return 1;
 }
 
+// Increment the number of rows in the table. Also update n_nonempty_cells,
+// which keeps track of the number of cells which were parsed from the
+// input file. (If one of the rows is too short, then the trailing cells
+// are autocompleted. Autocompleted cells are not counted in n_nonempty_cells.)
+// The purpose of this is to prevent a malicious input from generating a very
+// large number of autocompleted cells, which could cause a denial of service
+// vulnerability.
+static int incr_table_row_count(cmark_node *node, int i) {
+  if (!node || node->type != CMARK_NODE_TABLE) {
+    return 0;
+  }
+
+  ((node_table *)node->as.opaque)->n_rows++;
+  ((node_table *)node->as.opaque)->n_nonempty_cells += i;
+  return 1;
+}
+
+// Calculate the number of autocompleted cells.
+static int get_n_autocompleted_cells(cmark_node *node) {
+  if (!node || node->type != CMARK_NODE_TABLE) {
+    return 0;
+  }
+
+  const node_table *nt = (node_table *)node->as.opaque;
+  return (nt->n_columns * nt->n_rows) - nt->n_nonempty_cells;
+}
+
 static uint8_t *get_table_alignments(cmark_node *node) {
   if (!node || node->type != CMARK_NODE_TABLE)
     return 0;
@@ -89,6 +130,23 @@
   return 1;
 }
 
+static uint8_t get_cell_alignment(cmark_node *node) {
+  if (!node || node->type != CMARK_NODE_TABLE_CELL)
+    return 0;
+
+  const uint8_t *alignments = get_table_alignments(node->parent->parent);
+  int i = node->as.cell_index;
+  return alignments[i];
+}
+
+static int set_cell_index(cmark_node *node, int i) {
+  if (!node || node->type != CMARK_NODE_TABLE_CELL)
+    return 0;
+
+  node->as.cell_index = i;
+  return 1;
+}
+
 static cmark_strbuf *unescape_pipes(cmark_mem *mem, unsigned char *string, bufsize_t len)
 {
   cmark_strbuf *res = (cmark_strbuf *)mem->calloc(1, sizeof(cmark_strbuf));
@@ -110,50 +168,111 @@
   return res;
 }
 
+// Adds a new cell to the end of the row. A pointer to the new cell is returned
+// for the caller to initialize.
+static node_cell* append_row_cell(cmark_mem *mem, table_row *row) {
+  const uint32_t n_columns = row->n_columns + 1;
+  // realloc when n_columns is a power of 2
+  if ((n_columns & (n_columns-1)) == 0) {
+    // make sure we never wrap row->n_columns
+    // offset will != len and our exit will clean up as intended
+    if (n_columns > UINT16_MAX) {
+      return NULL;
+    }
+    // Use realloc to double the size of the buffer.
+    row->cells = (node_cell *)mem->realloc(row->cells, (2 * n_columns - 1) * sizeof(node_cell));
+  }
+  row->n_columns = (uint16_t)n_columns;
+  return &row->cells[n_columns-1];
+}
+
 static table_row *row_from_string(cmark_syntax_extension *self,
                                   cmark_parser *parser, unsigned char *string,
                                   int len) {
+  // Parses a single table row. It has the following form:
+  // `delim? table_cell (delim table_cell)* delim? newline`
+  // Note that cells are allowed to be empty.
+  //
+  // From the GitHub-flavored Markdown specification:
+  //
+  // > Each row consists of cells containing arbitrary text, in which inlines
+  // > are parsed, separated by pipes (|). A leading and trailing pipe is also
+  // > recommended for clarity of reading, and if there’s otherwise parsing
+  // > ambiguity.
+
   table_row *row = NULL;
   bufsize_t cell_matched = 1, pipe_matched = 1, offset;
+  int expect_more_cells = 1;
+  int row_end_offset = 0;
+  int int_overflow_abort = 0;
 
   row = (table_row *)parser->mem->calloc(1, sizeof(table_row));
   row->n_columns = 0;
   row->cells = NULL;
 
+  // Scan past the (optional) leading pipe.
   offset = scan_table_cell_end(string, len, 0);
 
   // Parse the cells of the row. Stop if we reach the end of the input, or if we
   // cannot detect any more cells.
-  while (offset < len && (cell_matched || pipe_matched)) {
+  while (offset < len && expect_more_cells) {
     cell_matched = scan_table_cell(string, len, offset);
     pipe_matched = scan_table_cell_end(string, len, offset + cell_matched);
 
     if (cell_matched || pipe_matched) {
+      // We are guaranteed to have a cell, since (1) either we found some
+      // content and cell_matched, or (2) we found an empty cell followed by a
+      // pipe.
       cmark_strbuf *cell_buf = unescape_pipes(parser->mem, string + offset,
           cell_matched);
       cmark_strbuf_trim(cell_buf);
 
-      node_cell *cell = (node_cell *)parser->mem->calloc(1, sizeof(*cell));
+      node_cell *cell = append_row_cell(parser->mem, row);
+      if (!cell) {
+        int_overflow_abort = 1;
+        cmark_strbuf_free(cell_buf);
+        parser->mem->free(cell_buf);
+        break;
+      }
       cell->buf = cell_buf;
       cell->start_offset = offset;
       cell->end_offset = offset + cell_matched - 1;
-      while (cell->start_offset > 0 && string[cell->start_offset - 1] != '|') {
+      cell->internal_offset = 0;
+
+      while (cell->start_offset > row->paragraph_offset && string[cell->start_offset - 1] != '|') {
         --cell->start_offset;
         ++cell->internal_offset;
       }
-      row->n_columns += 1;
-      row->cells = cmark_llist_append(parser->mem, row->cells, cell);
     }
 
     offset += cell_matched + pipe_matched;
 
-    if (!pipe_matched) {
-      pipe_matched = scan_table_row_end(string, len, offset);
-      offset += pipe_matched;
+    if (pipe_matched) {
+      expect_more_cells = 1;
+    } else {
+      // We've scanned the last cell. Check if we have reached the end of the row
+      row_end_offset = scan_table_row_end(string, len, offset);
+      offset += row_end_offset;
+
+      // If the end of the row is not the end of the input,
+      // the row is not a real row but potentially part of the paragraph
+      // preceding the table.
+      if (row_end_offset && offset != len) {
+        row->paragraph_offset = offset;
+
+        free_row_cells(parser->mem, row);
+
+        // Scan past the (optional) leading pipe.
+        offset += scan_table_cell_end(string, len, offset);
+
+        expect_more_cells = 1;
+      } else {
+        expect_more_cells = 0;
+      }
     }
   }
 
-  if (offset != len || !row->n_columns) {
+  if (offset != len || row->n_columns == 0 || int_overflow_abort) {
     free_table_row(parser->mem, row);
     row = NULL;
   }
@@ -161,73 +280,107 @@
   return row;
 }
 
+static void try_inserting_table_header_paragraph(cmark_parser *parser,
+                                                 cmark_node *parent_container,
+                                                 unsigned char *parent_string,
+                                                 int paragraph_offset) {
+  cmark_node *paragraph;
+  cmark_strbuf *paragraph_content;
+
+  paragraph = cmark_node_new_with_mem(CMARK_NODE_PARAGRAPH, parser->mem);
+
+  paragraph_content = unescape_pipes(parser->mem, parent_string, paragraph_offset);
+  cmark_strbuf_trim(paragraph_content);
+  cmark_node_set_string_content(paragraph, (char *) paragraph_content->ptr);
+  cmark_strbuf_free(paragraph_content);
+  parser->mem->free(paragraph_content);
+
+  if (!cmark_node_insert_before(parent_container, paragraph)) {
+    parser->mem->free(paragraph);
+  }
+}
+
 static cmark_node *try_opening_table_header(cmark_syntax_extension *self,
                                             cmark_parser *parser,
                                             cmark_node *parent_container,
                                             unsigned char *input, int len) {
-  bufsize_t matched =
-      scan_table_start(input, len, cmark_parser_get_first_nonspace(parser));
   cmark_node *table_header;
   table_row *header_row = NULL;
-  table_row *marker_row = NULL;
+  table_row *delimiter_row = NULL;
   node_table_row *ntr;
   const char *parent_string;
   uint16_t i;
 
-  if (!matched)
+  if (parent_container->flags & CMARK_NODE__TABLE_VISITED) {
     return parent_container;
+  }
 
-  parent_string = cmark_node_get_string_content(parent_container);
+  if (!scan_table_start(input, len, cmark_parser_get_first_nonspace(parser))) {
+    return parent_container;
+  }
 
+  // Since scan_table_start was successful, we must have a delimiter row.
+  delimiter_row = row_from_string(
+    self, parser, input + cmark_parser_get_first_nonspace(parser),
+    len - cmark_parser_get_first_nonspace(parser));
+  // assert may be optimized out, don't rely on it for security boundaries
+  if (!delimiter_row) {
+      return parent_container;
+  }
+
+  assert(delimiter_row);
+
   cmark_arena_push();
 
+  // Check for a matching header row. We call `row_from_string` with the entire
+  // (potentially long) parent container as input, but this should be safe since
+  // `row_from_string` bails out early if it does not find a row.
+  parent_string = cmark_node_get_string_content(parent_container);
   header_row = row_from_string(self, parser, (unsigned char *)parent_string,
                                (int)strlen(parent_string));
-
-  if (!header_row) {
+  if (!header_row || header_row->n_columns != delimiter_row->n_columns) {
+    free_table_row(parser->mem, delimiter_row);
     free_table_row(parser->mem, header_row);
     cmark_arena_pop();
-    return parent_container;
-  }
-
-  marker_row = row_from_string(self, parser,
-                               input + cmark_parser_get_first_nonspace(parser),
-                               len - cmark_parser_get_first_nonspace(parser));
-
-  assert(marker_row);
-
-  if (header_row->n_columns != marker_row->n_columns) {
-    free_table_row(parser->mem, header_row);
-    free_table_row(parser->mem, marker_row);
-    cmark_arena_pop();
+    parent_container->flags |= CMARK_NODE__TABLE_VISITED;
     return parent_container;
   }
 
   if (cmark_arena_pop()) {
+    delimiter_row = row_from_string(
+        self, parser, input + cmark_parser_get_first_nonspace(parser),
+        len - cmark_parser_get_first_nonspace(parser));
     header_row = row_from_string(self, parser, (unsigned char *)parent_string,
                                  (int)strlen(parent_string));
-    marker_row = row_from_string(self, parser,
-                                 input + cmark_parser_get_first_nonspace(parser),
-                                 len - cmark_parser_get_first_nonspace(parser));
+    // row_from_string can return NULL, add additional check to ensure n_columns match
+    if (!delimiter_row || !header_row || header_row->n_columns != delimiter_row->n_columns) {
+        free_table_row(parser->mem, delimiter_row);
+        free_table_row(parser->mem, header_row);
+        return parent_container;
+    }
   }
 
   if (!cmark_node_set_type(parent_container, CMARK_NODE_TABLE)) {
     free_table_row(parser->mem, header_row);
-    free_table_row(parser->mem, marker_row);
+    free_table_row(parser->mem, delimiter_row);
     return parent_container;
   }
 
-  cmark_node_set_syntax_extension(parent_container, self);
+  if (header_row->paragraph_offset) {
+    try_inserting_table_header_paragraph(parser, parent_container, (unsigned char *)parent_string,
+                                         header_row->paragraph_offset);
+  }
 
+  cmark_node_set_syntax_extension(parent_container, self);
   parent_container->as.opaque = parser->mem->calloc(1, sizeof(node_table));
-
   set_n_table_columns(parent_container, header_row->n_columns);
 
+  // allocate alignments based on delimiter_row->n_columns
+  // since we populate the alignments array based on delimiter_row->cells
   uint8_t *alignments =
-      (uint8_t *)parser->mem->calloc(header_row->n_columns, sizeof(uint8_t));
-  cmark_llist *it = marker_row->cells;
-  for (i = 0; it; it = it->next, ++i) {
-    node_cell *node = (node_cell *)it->data;
+      (uint8_t *)parser->mem->calloc(delimiter_row->n_columns, sizeof(uint8_t));
+  for (i = 0; i < delimiter_row->n_columns; ++i) {
+    node_cell *node = &delimiter_row->cells[i];
     bool left = node->buf->ptr[0] == ':', right = node->buf->ptr[node->buf->size - 1] == ':';
 
     if (left && right)
@@ -249,27 +402,26 @@
   table_header->as.opaque = ntr = (node_table_row *)parser->mem->calloc(1, sizeof(node_table_row));
   ntr->is_header = true;
 
-  {
-    cmark_llist *tmp;
-
-    for (tmp = header_row->cells; tmp; tmp = tmp->next) {
-      node_cell *cell = (node_cell *) tmp->data;
-      cmark_node *header_cell = cmark_parser_add_child(parser, table_header,
-          CMARK_NODE_TABLE_CELL, parent_container->start_column + cell->start_offset);
-      header_cell->start_line = header_cell->end_line = parent_container->start_line;
-      header_cell->internal_offset = cell->internal_offset;
-      header_cell->end_column = parent_container->start_column + cell->end_offset;
-      cmark_node_set_string_content(header_cell, (char *) cell->buf->ptr);
-      cmark_node_set_syntax_extension(header_cell, self);
-    }
+  for (i = 0; i < header_row->n_columns; ++i) {
+    node_cell *cell = &header_row->cells[i];
+    cmark_node *header_cell = cmark_parser_add_child(parser, table_header,
+                                                     CMARK_NODE_TABLE_CELL, parent_container->start_column + cell->start_offset);
+    header_cell->start_line = header_cell->end_line = parent_container->start_line;
+    header_cell->internal_offset = cell->internal_offset;
+    header_cell->end_column = parent_container->start_column + cell->end_offset;
+    cmark_node_set_string_content(header_cell, (char *) cell->buf->ptr);
+    cmark_node_set_syntax_extension(header_cell, self);
+    set_cell_index(header_cell, i);
   }
 
+  incr_table_row_count(parent_container, i);
+
   cmark_parser_advance_offset(
       parser, (char *)input,
       (int)strlen((char *)input) - 1 - cmark_parser_get_offset(parser), false);
 
   free_table_row(parser->mem, header_row);
-  free_table_row(parser->mem, marker_row);
+  free_table_row(parser->mem, delimiter_row);
   return parent_container;
 }
 
@@ -283,6 +435,10 @@
   if (cmark_parser_is_blank(parser))
     return NULL;
 
+  if (get_n_autocompleted_cells(parent_container) > MAX_AUTOCOMPLETED_CELLS) {
+    return NULL;
+  }
+
   table_row_block =
       cmark_parser_add_child(parser, parent_container, CMARK_NODE_TABLE_ROW,
                              parent_container->start_column);
@@ -293,24 +449,33 @@
   row = row_from_string(self, parser, input + cmark_parser_get_first_nonspace(parser),
       len - cmark_parser_get_first_nonspace(parser));
 
+  if (!row) {
+      // clean up the dangling node
+      cmark_node_free(table_row_block);
+      return NULL;
+  }
+
   {
-    cmark_llist *tmp;
     int i, table_columns = get_n_table_columns(parent_container);
 
-    for (tmp = row->cells, i = 0; tmp && i < table_columns; tmp = tmp->next, ++i) {
-      node_cell *cell = (node_cell *) tmp->data;
+    for (i = 0; i < row->n_columns && i < table_columns; ++i) {
+      node_cell *cell = &row->cells[i];
       cmark_node *node = cmark_parser_add_child(parser, table_row_block,
           CMARK_NODE_TABLE_CELL, parent_container->start_column + cell->start_offset);
       node->internal_offset = cell->internal_offset;
       node->end_column = parent_container->start_column + cell->end_offset;
       cmark_node_set_string_content(node, (char *) cell->buf->ptr);
       cmark_node_set_syntax_extension(node, self);
+      set_cell_index(node, i);
     }
 
+    incr_table_row_count(parent_container, i);
+
     for (; i < table_columns; ++i) {
       cmark_node *node = cmark_parser_add_child(
           parser, table_row_block, CMARK_NODE_TABLE_CELL, 0);
       cmark_node_set_syntax_extension(node, self);
+      set_cell_index(node, i);
     }
   }
 
@@ -495,13 +660,7 @@
                             cmark_node *node) {
   if (node->type == CMARK_NODE_TABLE_CELL) {
     if (cmark_gfm_extensions_get_table_row_is_header(node->parent)) {
-      uint8_t *alignments = get_table_alignments(node->parent->parent);
-      int i = 0;
-      cmark_node *n;
-      for (n = node->parent->first_child; n; n = n->next, ++i)
-        if (n == node)
-          break;
-      switch (alignments[i]) {
+      switch (get_cell_alignment(node)) {
       case 'l': return " align=\"left\"";
       case 'c': return " align=\"center\"";
       case 'r': return " align=\"right\"";
@@ -589,7 +748,6 @@
                         cmark_event_type ev_type, int options) {
   bool entering = (ev_type == CMARK_EVENT_ENTER);
   cmark_strbuf *html = renderer->html;
-  cmark_node *n;
 
   // XXX: we just monopolise renderer->opaque.
   struct html_table_state *table_state =
@@ -638,7 +796,6 @@
       }
     }
   } else if (node->type == CMARK_NODE_TABLE_CELL) {
-    uint8_t *alignments = get_table_alignments(node->parent->parent);
     if (entering) {
       cmark_html_render_cr(html);
       if (table_state->in_table_header) {
@@ -647,12 +804,7 @@
         cmark_strbuf_puts(html, "<td");
       }
 
-      int i = 0;
-      for (n = node->parent->first_child; n; n = n->next, ++i)
-        if (n == node)
-          break;
-
-      switch (alignments[i]) {
+      switch (get_cell_alignment(node)) {
       case 'l': html_table_add_align(html, "left", options); break;
       case 'c': html_table_add_align(html, "center", options); break;
       case 'r': html_table_add_align(html, "right", options); break;
@@ -701,6 +853,7 @@
 cmark_syntax_extension *create_table_extension(void) {
   cmark_syntax_extension *self = cmark_syntax_extension_new("table");
 
+  cmark_register_node_flag(&CMARK_NODE__TABLE_VISITED);
   cmark_syntax_extension_set_match_block_func(self, matches);
   cmark_syntax_extension_set_open_block_func(self, try_opening_table_block);
   cmark_syntax_extension_set_get_type_string_func(self, get_type_string);
diff --git a/cbits/tasklist.c b/cbits/tasklist.c
--- a/cbits/tasklist.c
+++ b/cbits/tasklist.c
@@ -9,19 +9,33 @@
   CMARK_TASKLIST_CHECKED,
 } cmark_tasklist_type;
 
+// Local constants
+static const char *TYPE_STRING = "tasklist";
+
 static const char *get_type_string(cmark_syntax_extension *extension, cmark_node *node) {
-  return "tasklist";
+  return TYPE_STRING;
 }
 
-char *cmark_gfm_extensions_get_tasklist_state(cmark_node *node) {
-  if (!node || ((int)node->as.opaque != CMARK_TASKLIST_CHECKED && (int)node->as.opaque != CMARK_TASKLIST_NOCHECKED))
+
+// Return 1 if state was set, 0 otherwise
+int cmark_gfm_extensions_set_tasklist_item_checked(cmark_node *node, bool is_checked) {
+  // The node has to exist, and be an extension, and actually be the right type in order to get the value.
+  if (!node || !node->extension || strcmp(cmark_node_get_type_string(node), TYPE_STRING))
     return 0;
 
-  if ((int)node->as.opaque != CMARK_TASKLIST_CHECKED) {
-    return "checked";
+  node->as.list.checked = is_checked;
+  return 1;
+}
+
+bool cmark_gfm_extensions_get_tasklist_item_checked(cmark_node *node) {
+  if (!node || !node->extension || strcmp(cmark_node_get_type_string(node), TYPE_STRING))
+    return false;
+
+  if (node->as.list.checked) {
+    return true;
   }
   else {
-    return "unchecked";
+    return false;
   }
 }
 
@@ -74,11 +88,8 @@
   cmark_node_set_syntax_extension(parent_container, self);
   cmark_parser_advance_offset(parser, (char *)input, 3, false);
 
-  if (strstr((char*)input, "[x]")) {
-    parent_container->as.opaque = (void *)CMARK_TASKLIST_CHECKED;
-  } else {
-    parent_container->as.opaque = (void *)CMARK_TASKLIST_NOCHECKED;
-  }
+  // Either an upper or lower case X means the task is completed.
+  parent_container->as.list.checked = (strstr((char*)input, "[x]") || strstr((char*)input, "[X]"));
 
   return NULL;
 }
@@ -89,7 +100,7 @@
   bool entering = (ev_type == CMARK_EVENT_ENTER);
   if (entering) {
     renderer->cr(renderer);
-    if ((int)node->as.opaque == CMARK_TASKLIST_CHECKED) {
+    if (node->as.list.checked) {
       renderer->out(renderer, node, "- [x] ", false, LITERAL);
     } else {
       renderer->out(renderer, node, "- [ ] ", false, LITERAL);
@@ -110,7 +121,7 @@
     cmark_strbuf_puts(renderer->html, "<li");
     cmark_html_render_sourcepos(node, renderer->html, options);
     cmark_strbuf_putc(renderer->html, '>');
-    if ((int)node->as.opaque == CMARK_TASKLIST_CHECKED) {
+    if (node->as.list.checked) {
       cmark_strbuf_puts(renderer->html, "<input type=\"checkbox\" checked=\"\" disabled=\"\" /> ");
     } else {
       cmark_strbuf_puts(renderer->html, "<input type=\"checkbox\" disabled=\"\" /> ");
@@ -120,6 +131,15 @@
   }
 }
 
+static const char *xml_attr(cmark_syntax_extension *extension,
+                            cmark_node *node) {
+  if (node->as.list.checked) {
+    return " completed=\"true\"";
+  } else {
+    return " completed=\"false\"";
+  }
+}
+
 cmark_syntax_extension *create_tasklist_extension(void) {
   cmark_syntax_extension *ext = cmark_syntax_extension_new("tasklist");
 
@@ -130,6 +150,7 @@
   cmark_syntax_extension_set_commonmark_render_func(ext, commonmark_render);
   cmark_syntax_extension_set_plaintext_render_func(ext, commonmark_render);
   cmark_syntax_extension_set_html_render_func(ext, html_render);
+  cmark_syntax_extension_set_xml_attr_func(ext, xml_attr);
 
   return ext;
 }
diff --git a/cbits/xml.c b/cbits/xml.c
--- a/cbits/xml.c
+++ b/cbits/xml.c
@@ -11,6 +11,7 @@
 #include "syntax_extension.h"
 
 #define BUFFER_SIZE 100
+#define MAX_INDENT 40
 
 // Functions to convert cmark_nodes to XML strings.
 
@@ -26,7 +27,7 @@
 
 static CMARK_INLINE void indent(struct render_state *state) {
   int i;
-  for (i = 0; i < state->indent; i++) {
+  for (i = 0; i < state->indent && i < MAX_INDENT; i++) {
     cmark_strbuf_putc(state->xml, ' ');
   }
 }
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,37 @@
+cmark-gfm 0.2.6 (28 Aug 2023)
+
+  * Pull in upstream changes (includes security fixes).
+
+cmark-gfm 0.2.5 (27 Sep 2022)
+
+  * Add support for enabling footnotes (#26, Anton Sorokin).
+
+cmark-gfm 0.2.4 (22 Sep 2022)
+
+  * Pull in upstream changes (includes security fix).
+
+cmark-gfm 0.2.3 (9 Mar 2022)
+
+  * Pull in upstream changes.
+
+cmark-gfm 0.2.2 (16 Sep 2020)
+
+  * Pull in upstream changes.
+
+cmark-gfm 0.2.1 (15 Nov 2019)
+
+  * Add tasklist support (#16, Christian Gill).
+
+cmark-gfm 0.2.0 (8 Apr 2019)
+
+  * Pull in upstream changes.
+
+cmark 0.6 (08 Apr 2019)
+
+  * Update to cmark 0.29.0.
+  * Export optUnsafe.  Note that the default is now to suppress
+    potentially unsafe HTML; set optUnsafe to return to the old behavior.
+
 cmark-gfm 0.1.8 (14 Mar 2019)
 
   * Pull in upstream changes.
diff --git a/cmark-gfm.cabal b/cmark-gfm.cabal
--- a/cmark-gfm.cabal
+++ b/cmark-gfm.cabal
@@ -1,22 +1,21 @@
 name:                cmark-gfm
-version:             0.1.8
+version:             0.2.6
 synopsis:            Fast, accurate GitHub Flavored Markdown parser and renderer
 description:
   This package provides Haskell bindings for
   <https://github.com/github/cmark-gfm libcmark-gfm>, the reference
   parser for <https://github.github.com/gfm/ GitHub Flavored Markdown>, a fully
   specified variant of Markdown. It includes sources for
-  libcmark-gfm (0.28.3.gfm.20) and does not require prior installation of the
+  libcmark-gfm (0.29.0.gfm.13) and does not require prior installation of the
   C library.
 
 homepage:            https://github.com/kivikakk/cmark-gfm-hs
 license:             BSD3
 license-file:        LICENSE
-author:              Ashe Connor
-maintainer:          kivikakk@github.com
+author:              Asherah Connor
+maintainer:          ashe@kivikakk.ee
 copyright:           (C) 2015--17 John MacFarlane, (C) 2017--19 Ashe Connor
 category:            Text
-tested-with:         GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.2, GHC == 7.10.3
 build-type:          Simple
 extra-source-files:  README.md
                      changelog
@@ -52,7 +51,6 @@
                      cbits/table.h
                      cbits/tagfilter.h
                      cbits/tasklist.h
-                     cbits/cmark-gfm-extensions_export.h
                      cbits/map.h
                      cbits/footnotes.h
                      bench/sample.md
@@ -70,8 +68,8 @@
 library
   exposed-modules:     CMarkGFM
   build-depends:       base >=4.5 && < 5.0,
-                       text >= 1.0 && < 1.3,
-                       bytestring
+                       text >= 1.0 && < 2.1,
+                       bytestring >= 0.11.5 && < 0.12
   if impl(ghc < 7.6)
     build-depends:     ghc-prim >= 0.2
   default-language:    Haskell2010
@@ -136,4 +134,4 @@
   hs-source-dirs: test
   build-depends:  base, cmark-gfm, text, HUnit >= 1.2 && < 1.7
   ghc-options:    -Wall -fno-warn-unused-do-bind -threaded
-  default-language: Haskell98
+  default-language: Haskell2010
diff --git a/test/test-cmark.hs b/test/test-cmark.hs
--- a/test/test-cmark.hs
+++ b/test/test-cmark.hs
@@ -16,11 +16,11 @@
 -- Here we just make sure it's basically working.
 tests :: Test
 tests = TestList [
-    "<h1>Hi</h1>\n" ~=? commonmarkToHtml [] [] "# Hi"
+    "<h1>Hi</h1>\n<p><em>there</em></p>\n" ~=? commonmarkToHtml [] [] "# Hi\n\n*there*"
   , "<p>dog’s</p>\n" ~=? commonmarkToHtml [optSmart] [] "dog's"
-  , "<p><a href=\"\">trick</a></p>\n" ~=? commonmarkToHtml [] [] "[trick](javascript:alert('hi'))"
+  , "<p><a href=\"\">trick</a></p>\n" ~=? commonmarkToHtml [optSafe] [] "[trick](javascript:alert('hi'))"
   , ".RS\n.PP\nquote\n.RE\n" ~=? commonmarkToMan [] [] Nothing "> quote"
-  , (Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 13})) DOCUMENT [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 13})) PARAGRAPH [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 6})) (TEXT "Hello ") [],Node (Just (PosInfo {startLine = 1, startColumn = 7, endLine = 1, endColumn = 13})) EMPH [Node (Just (PosInfo {startLine = 1, startColumn = 8, endLine = 1, endColumn = 12})) (TEXT "world") []]]]) ~=? commonmarkToNode [] [] "Hello *world*"
+  , Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 13})) DOCUMENT [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 13})) PARAGRAPH [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 6})) (TEXT "Hello ") [],Node (Just (PosInfo {startLine = 1, startColumn = 7, endLine = 1, endColumn = 13})) EMPH [Node (Just (PosInfo {startLine = 1, startColumn = 8, endLine = 1, endColumn = 12})) (TEXT "world") []]]] ~=? commonmarkToNode [] [] "Hello *world*"
   , "> Hello\n> *world*\n" ~=? nodeToCommonmark [] (Just 12) (Node Nothing DOCUMENT [Node Nothing BLOCK_QUOTE [Node Nothing PARAGRAPH [Node Nothing (TEXT "Hello ") [],Node Nothing EMPH [Node Nothing (TEXT "world") []]]]])
   , "<p>~hi~</p>\n" ~=? commonmarkToHtml [] [] "~hi~"
   , "<p><del>hi</del></p>\n" ~=? commonmarkToHtml [] [extStrikethrough] "~hi~"
@@ -32,4 +32,7 @@
   , Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 3, endColumn = 17})) DOCUMENT [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 3, endColumn = 17})) (TABLE [LeftAligned,CenterAligned,NoAlignment,RightAligned]) [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 17})) TABLE_ROW [Node (Just (PosInfo {startLine = 1, startColumn = 2, endLine = 1, endColumn = 4})) TABLE_CELL [Node (Just (PosInfo {startLine = 1, startColumn = 3, endLine = 1, endColumn = 3})) (TEXT "a") []],Node (Just (PosInfo {startLine = 1, startColumn = 6, endLine = 1, endColumn = 8})) TABLE_CELL [Node (Just (PosInfo {startLine = 1, startColumn = 7, endLine = 1, endColumn = 7})) (TEXT "b") []],Node (Just (PosInfo {startLine = 1, startColumn = 10, endLine = 1, endColumn = 12})) TABLE_CELL [Node (Just (PosInfo {startLine = 1, startColumn = 11, endLine = 1, endColumn = 11})) (TEXT "c") []],Node (Just (PosInfo {startLine = 1, startColumn = 14, endLine = 1, endColumn = 16})) TABLE_CELL [Node (Just (PosInfo {startLine = 1, startColumn = 15, endLine = 1, endColumn = 15})) (TEXT "d") []]],Node (Just (PosInfo {startLine = 3, startColumn = 1, endLine = 3, endColumn = 17})) TABLE_ROW [Node (Just (PosInfo {startLine = 3, startColumn = 2, endLine = 3, endColumn = 4})) TABLE_CELL [Node (Just (PosInfo {startLine = 3, startColumn = 3, endLine = 3, endColumn = 3})) (TEXT "y") []],Node (Just (PosInfo {startLine = 3, startColumn = 6, endLine = 3, endColumn = 8})) TABLE_CELL [Node (Just (PosInfo {startLine = 3, startColumn = 7, endLine = 3, endColumn = 7})) (TEXT "o") []],Node (Just (PosInfo {startLine = 3, startColumn = 10, endLine = 3, endColumn = 12})) TABLE_CELL [Node (Just (PosInfo {startLine = 3, startColumn = 11, endLine = 3, endColumn = 11})) (TEXT "s") []],Node (Just (PosInfo {startLine = 3, startColumn = 14, endLine = 3, endColumn = 16})) TABLE_CELL [Node (Just (PosInfo {startLine = 3, startColumn = 15, endLine = 3, endColumn = 15})) (TEXT "h") []]]]] ~=? commonmarkToNode [] [extTable] "| a | b | c | d |\n| :-- | :-: | --- | --: |\n| y | o | s | h |"
   , "<xmp>\n" ~=? commonmarkToHtml [optUnsafe] [] "<xmp>"
   , "&lt;xmp>\n" ~=? commonmarkToHtml [optUnsafe] [extTagfilter] "<xmp>"
+  , "<ul>\n<li><input type=\"checkbox\" disabled=\"\" /> foo</li>\n<li><input type=\"checkbox\" checked=\"\" disabled=\"\" /> bar</li>\n</ul>\n" ~=? commonmarkToHtml [] [extTaskList] "- [ ] foo\n- [x] bar"
+  , "<p>Here is footnote<sup class=\"footnote-ref\"><a href=\"#fn-1\" id=\"fnref-1\" data-footnote-ref>1</a></sup></p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>abc <a href=\"#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n</ol>\n</section>\n" ~=? commonmarkToHtml [optFootnotes] [] "Here is footnote[^1]\n\n[^1]: abc"
   ]
+
