cmark

My personal build of CMark ✏️

Commit
d6c615f2680e79bbb76cc85a056aadfe3524513f
Parent
31530d93448bdf93c0797540a73c6b67586ad5e1
Author
John MacFarlane <jgm@berkeley.edu>
Date

Removed JS implementation, which is moving to its own repo:

<https://github.com/jgm/commonmark.js>

Diffstat

25 files changed, 5 insertions, 5402 deletions

Status File Name N° Changes Insertions Deletions
Modified README.md 19 5 14
Modified benchmarks.md 45 0 45
Deleted dingus.html 175 0 175
Deleted js/.npmignore 3 0 3
Deleted js/LICENSE 30 0 30
Deleted js/README.md 132 0 132
Deleted js/bench.js 43 0 43
Deleted js/bin/commonmark 61 0 61
Deleted js/changelog.js.txt 38 0 38
Deleted js/eslint.json 20 0 20
Deleted js/index.html 12 0 12
Deleted js/lib/blocks.js 748 0 748
Deleted js/lib/common.js 75 0 75
Deleted js/lib/from-code-point.js 59 0 59
Deleted js/lib/html.js 246 0 246
Deleted js/lib/html5-entities.js 2154 0 2154
Deleted js/lib/index.js 17 0 17
Deleted js/lib/inlines.js 833 0 833
Deleted js/lib/node.js 255 0 255
Deleted js/lib/normalize-reference.js 42 0 42
Deleted js/lib/xml.js 171 0 171
Deleted js/package.json 25 0 25
Deleted js/test.js 167 0 167
Deleted tools/detailed_benchmarks.sh 2 0 2
Deleted tools/format_benchmarks.awk 35 0 35
diff --git a/README.md b/README.md
@@ -20,8 +20,8 @@ languages: see the `wrappers/` subdirectory for some simple examples.
 
 The JavaScript implementation provides both an NPM package and a
 single JavaScript file, with no dependencies, that can be linked into
-an HTML page. For further information, see the
-[README in the js directory](js/README.md).
+an HTML page. For further information, see its repository:
+<https://github.com/jgm/commonmark.js>.
 
 **A note on security:**
 Neither implementation attempts to sanitize link attributes or
@@ -101,18 +101,9 @@ The binaries will be in `build-mingw/windows/bin`.
 Installing (JavaScript)
 -----------------------
 
-The JavaScript library can be installed through `npm`:
-
-    npm install commonmark
-
-This includes a command-line converter called `commonmark`.
-
-If you want to use it in a client application, you can fetch
-a pre-built copy of `commonmark.js` from
-<http://spec.commonmark.org/js/commonmark.js>.
-
-For further information, see the
-[README in the js directory](js/README.md).
+The JavaScript implementation has been split into its own
+repository: <https://github.com/jgm/commonmark.js>.
+Please look there for instructions for installation and use.
 
 The spec
 --------
diff --git a/benchmarks.md b/benchmarks.md
@@ -31,48 +31,3 @@ with the benchmark input and the time to run it with no input.
 not penalized by startup time.) Amedian of ten runs is taken.  The
 process is reniced to a high priority so that the system doesn't
 interrupt runs.
-
-## JavaScript libraries
-
-Here are some focused benchmarks of four JavaScript libraries
-(using versions available on 17 Jan 2015). They test performance
-on different kinds of Markdown texts.  With the exception of
-the first (the `README.md` from this project), the samples are taken
-from the [markdown-it](https://github.com/markdown-it/markdown-it)
-repository.  Results show a ratio of ops/second (higher is better)
-against the slowest implementation (always showdown).
-
-| Sample                 |showdown  |commonmark|marked    |markdown-it|
-|------------------------|---------:|---------:|---------:|----------:|
-|README.md               |         1|       3.2|       3.1|        4.4|
-|block-bq-flat.md        |         1|       8.0|      12.8|       11.3|
-|block-bq-nested.md      |         1|      10.8|       9.9|       12.6|
-|block-code.md           |         1|      24.9|      58.4|       83.2|
-|block-fences.md         |         1|      16.4|      66.5|       65.5|
-|block-heading.md        |         1|      10.7|      11.0|       17.5|
-|block-hr.md             |         1|      14.4|      14.6|       37.7|
-|block-html.md           |         1|       7.9|       2.8|       14.8|
-|block-lheading.md       |         1|      14.4|      17.7|       26.1|
-|block-list-flat.md      |         1|       4.3|       4.3|       10.4|
-|block-list-nested.md    |         1|       7.4|       5.7|       19.1|
-|block-ref-flat.md       |         1|       1.8|       1.1|        1.5|
-|block-ref-nested.md     |         1|       1.5|       1.4|        2.4|
-|inline-autolink.md      |         1|       4.1|       7.0|        4.5|
-|inline-backticks.md     |         1|      15.8|      13.7|       30.7|
-|inline-em-flat.md       |         1|       4.1|       3.8|        8.7|
-|inline-em-nested.md     |         1|       5.2|       4.6|        8.3|
-|inline-em-worst.md      |         1|       5.3|       4.9|        3.4|
-|inline-entity.md        |         1|       4.8|       9.7|        7.7|
-|inline-escape.md        |         1|       4.6|       2.9|       12.4|
-|inline-html.md          |         1|       3.6|       5.2|        5.0|
-|inline-links-flat.md    |         1|       3.7|       4.0|        4.1|
-|inline-links-nested.md  |         1|       3.8|       1.0|        1.5|
-|inline-newlines.md      |         1|       6.9|       6.5|       13.1|
-|rawtabs.md              |         1|       8.9|       9.7|       13.4|
-
-To run these:
-
-1. `npm install marked showdown markdown-it`
-2. Create a `samples` subdirectory and copy the samples you
-   want to test into it.
-3. `sh tools/detailed_benchmarks.sh`
diff --git a/dingus.html b/dingus.html
@@ -1,175 +0,0 @@
-<!doctype html>
-<html lang="en">
-<head>
-  <meta charset="utf-8">
-  <title>commonmark.js demo</title>
-  <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
-  <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
-  <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
-  <script src="js/commonmark.js"></script>
-  <script type="text/javascript">
-
-var writer = new commonmark.HtmlRenderer();
-var xmlwriter = new commonmark.XmlRenderer({ sourcepos: true });
-var reader = new commonmark.Parser();
-
-function getQueryVariable(variable) {
-  var query = window.location.search.substring(1);
-  var vars = query.split("&");
-  for (var i=0; i<vars.length; i++) {
-    var pair = vars[i].split("=");
-    if (pair[0] == variable){
-      return decodeURIComponent(pair[1]);
-    }
-  }
-  return null;
-}
-
-// via http://stackoverflow.com/questions/499126/jquery-set-cursor-position-in-text-area
-function setSelectionRange(input, selectionStart, selectionEnd) {
-  if (input.setSelectionRange) {
-    input.focus();
-    input.setSelectionRange(selectionStart, selectionEnd);
-  }
-  else if (input.createTextRange) {
-    var range = input.createTextRange();
-    range.collapse(true);
-    range.moveEnd('character', selectionEnd);
-    range.moveStart('character', selectionStart);
-    range.select();
-  }
-}
-// via http://stackoverflow.com/questions/499126/jquery-set-cursor-position-in-text-area
-function setCaretToPos(input, pos) {
-  setSelectionRange(input, pos, pos);
-}
-
-$(document).ready(function() {
-  var timer;
-  var x;
-  var parsed;
-  var render = function() {
-    if (parsed === undefined) {
-      return;
-    }
-    var startTime = new Date().getTime();
-    var result = writer.render(parsed);
-    var endTime = new Date().getTime();
-    var renderTime = endTime - startTime;
-    $("#preview").html(result);
-    $("#html").text(result);
-    $("#ast").text(xmlwriter.render(parsed));
-    $("#rendertime").text(renderTime);
-  };
-  var parseAndRender = function() {
-    if (x) { x.abort() } // If there is an existing XHR, abort it.
-    clearTimeout(timer); // Clear the timer so we don't end up with dupes.
-    timer = setTimeout(function() { // assign timer a new timeout
-      var startTime = new Date().getTime();
-      parsed = reader.parse($("#text").val());
-      var endTime = new Date().getTime();
-      var parseTime = endTime - startTime;
-      $("#parsetime").text(parseTime);
-      $(".timing").css('visibility','visible');
-      /*
-      var warnings = parsed.warnings;
-      $("#warnings").html('');
-      for (i=0; i < warnings.length; i++) {
-        var w = warnings[i];
-        var warning = $("#warnings").append('<li></li>');
-        $("#warnings li").last().text('Line ' + w.line + ' column ' + w.column + ': ' + w.message);
-      }
-      */
-      render();
-    }, 0); // ms delay
-  };
-  var initial_text = getQueryVariable("text");
-  if (initial_text) {
-    $("#text").val(initial_text);
-    // show HTML tab if text is from query
-    $('#result-tabs a[href="#result"]').tab('show');
-  }
-  // make tab insert a tab in the text box:
-  $("#text").keydown(function(e) {
-    if (e.which == 9) {
-      e.preventDefault();
-      if (this.selectionStart !== undefined) {
-        var pos = this.selectionStart;
-        this.value = this.value.substring(0, pos) + "\t" + this.value.substring(pos);
-        setCaretToPos(this, pos + 1);
-      } else {
-        this.value += "\t";
-      }
-    }
-  });
-  parseAndRender();
-  $("#clear-text-box").click(function(e) {
-    $("#text").val('');
-    window.location.search = "";
-    parseAndRender();
-  });
-  $("#permalink").click(function(e) {
-    window.location.pathname = "/index.html";
-    window.location.search = "text=" + encodeURIComponent($("#text").val());
-  });
-  $("#text").bind('keyup paste cut mouseup', parseAndRender);
-  $(".option").change(render);
-});
-  </script>
-  <style type="text/css">
-    h1.title { font-family: monospace; font-size: 120%; font-weight: bold;
-          margin-top: 0.5em; margin-bottom: 0; }
-    textarea#text { height: 400px; width: 95%; font-family: monospace; font-size: 92%; }
-    pre code#html { font-size: 92%; font-family: monospace; }
-    pre#htmlpre { height: 400px; overflow: scroll; resize: vertical; width: 95%; }
-    div#astpre  { height: 400px; overflow: scroll; resize: vertical; width: 95%; }
-    div#preview { height: 400px; overflow: scroll; resize: vertical; width: 95%; }
-    div.row { margin-top: 1em; }
-    blockquote { font-size: 100%; }
-    footer { color: #555; text-align: center; margin: 1em; }
-    pre { display: block; padding: 0.5em; color: #333; background: #f8f8ff }
-    #warnings li { color: red; font-weight: bold; }
-    label { padding-left: 1em; padding-top: 0; padding-bottom: 0; }
-    div.timing { color: gray; visibility: hidden; height: 2em; }
-    p#text-controls { height: 1em; margin-top: 1em; }
-    a#permalink { margin-left: 1em; }
-    span.timing { font-weight: bold; }
-    span.timing { font-weight: bold; }
-  </style>
-</head>
-<body>
-<div class="container">
-  <div class="row">
-    <div class="col-md-6">
-      <h1 class="title">commonmark.js dingus</h1>
-    </div>
-  </div>
-  <div class="row">
-    <div class="col-md-6">
-      <p id="text-controls"><a id="clear-text-box">clear</a>&nbsp;<a
-      id="permalink">permalink</a></p>
-      <textarea id="text"></textarea>
-      <ul id="warnings"></ul>
-      <div class="timing">Parsed in <span class="timing" id="parsetime"></span>
-      ms.  Rendered in <span class="timing" id="rendertime"></span> ms.</div>
-    </div>
-    <div class="col-md-6">
-      <ul id="result-tabs" class="nav nav-tabs" role="tablist">
-        <li class="active"><a href="#preview" role="tab" data-toggle="tab">Preview</a></li>
-        <li><a href="#result" role="tab" data-toggle="tab">HTML</a></li>
-        <li><a href="#result-ast" role="tab" data-toggle="tab">AST</a></li>
-      </ul>
-      <div class="tab-content">
-        <div id="preview" class="tab-pane active">
-        </div>
-        <div id="result" class="tab-pane">
-          <pre id="htmlpre"><code id="html"></code></pre>
-        </div>
-        <div id="result-ast" class="tab-pane">
-          <pre id="astpre"><code id="ast"></code></pre>
-        </div>
-    </div>
-  </div>
-</div>
-</body>
-</html>
diff --git a/js/.npmignore b/js/.npmignore
@@ -1,3 +0,0 @@
-commonmark.js
-*.tgz
-index.html
diff --git a/js/LICENSE b/js/LICENSE
@@ -1,30 +0,0 @@
-Copyright (c) 2014, John MacFarlane
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-
-    * Neither the name of John MacFarlane nor the names of other
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/js/README.md b/js/README.md
@@ -1,132 +0,0 @@
-CommonMark
-==========
-
-CommonMark is a rationalized version of Markdown syntax,
-with a [spec][the spec] and BSD3-licensed reference
-implementations in C and JavaScript.
-
-  [the spec]: http://spec.commonmark.org
-
-For more information, see <http://commonmark.org>.
-
-To play with this library without installing it, see
-the live dingus at <http://spec.commonmark.org/dingus.html>.
-
-Installing
-----------
-
-You can install the library using `npm`:
-
-    npm install commonmark
-
-This package includes the commonmark library and a
-command-line executable, `commonmark`.
-
-For client-side use, you can do `make browserify` to produce
-a standalone JavaScript file `js/dist/commonmark.js`,
-suitable for linking into a web page, or just fetch
-<http://spec.commonmark.org/js/commonmark.js>.
-
-To run tests for the JavaScript library:
-
-    make testjs
-
-To run benchmarks against some other JavaScript converters:
-
-    npm install showdown marked markdown-it
-    make benchjs
-
-To start an interactive dingus that you can use to try out
-the library:
-
-    make dingus
-
-Usage
------
-
-Instead of converting Markdown directly to HTML, as most converters
-do, `commonmark.js` parses Markdown to an AST (abstract syntax tree),
-and then renders this AST as HTML.  This opens up the possibility of
-manipulating the AST between parsing and rendering.  For example, one
-could transform emphasis into ALL CAPS.
-
-Here's a basic usage example:
-
-    var reader = new commonmark.Parser();
-    var writer = new commonmark.HtmlRenderer();
-    var parsed = reader.parse("Hello *world*"); // parsed is a 'Node' tree
-    // transform parsed if you like...
-    var result = writer.render(parsed);  // result is a string
-
-<!-- TODO
-
-Public API
-----------
-
-### Parser
-
-constructor takes options param
-explain what can go into options
-
-public
-properties: options
-methods:  parse
-
-?? should we add a filters [] option?
-a filter could be a function that transforms a node,
-and the parser could automatically run a walker with
-each filter
-
-### Node
-
-getters:  type, firstChild, lastChild,,
-  next, prev, parent, sourcepos, isContainer
-getters+setters: literal, destination, title,
-  info, level, listType, listTight, listStart,
-  listDelimiter
-methods: appendChild(child),
-  prependChild(child),
-  unlink(),
-  insertAfter(sibling),
-  insertBefore(sibling),
-  walker()
-
-walker returns NodeWalker object with methods:
-  resumeAt(node, entering)
-  next() - returns an objcet with properties 'entering' and 'node'
-
-examples:
-  capitalize every string
-  changing emphasis to ALL CAPS
-  de-linkifying
-  running all the code samples through a highlighter or other
-  transform (svg?)
-
-?? would it be better to include NodeWalker in the API
-and have people do walker = new NodeWalker(node)?
-probably.
-
-### HtmlRenderer
-
-constructor takes options param
-document relevant options
-
-methods:
-  escapeXml(string, isAttribute)
-  render(node)
-properties:
-  options
-
-
-### XmlRenderer
-
-constructor takes options param
-document relevant options
-
-methods:
-  escapeXml(string, isAttribute)
-  render(node)
-properties:
-  options
-
--->
diff --git a/js/bench.js b/js/bench.js
@@ -1,43 +0,0 @@
-var Benchmark = require('benchmark').Benchmark;
-var suite = new Benchmark.Suite();
-var fs = require('fs');
-var commonmark = require('./lib/index.js');
-// npm install showdown
-var Showdown = require('showdown').converter;
-// npm install marked
-var marked = require('marked');
-// npm install markdown-it
-var markdownit = require('markdown-it')('commonmark');
-
-var benchfile = process.argv[2];
-
-var contents = fs.readFileSync(benchfile, 'utf8');
-
-suite.add('commonmark.js markdown->html', function() {
-  "use strict";
-  var doc = new commonmark.Parser().parse(contents);
-  var renderer = new commonmark.HtmlRenderer();
-  renderer.render(doc);
-})
-
-.add('showdown.js markdown->html', function() {
-  "use strict";
-  var converter = new Showdown();
-  converter.makeHtml(contents);
-})
-
-.add('marked.js markdown->html', function() {
-  "use strict";
-  marked(contents);
-})
-
-.add('markdown-it markdown->html', function() {
-  "use strict";
-  markdownit.render(contents);
-})
-
-.on('cycle', function(event) {
-  "use strict";
-  console.log(String(event.target));
-})
-.run();
diff --git a/js/bin/commonmark b/js/bin/commonmark
@@ -1,61 +0,0 @@
-#!/usr/bin/env node
-"use strict";
-
-var util = require('util');
-var fs = require('fs');
-var commonmark = require('../lib/index.js');
-
-var inps = [];
-var file;
-var files = [];
-var options = { sourcepos: false, time: false };
-var format = 'html';
-var i;
-
-for (i = 2; i < process.argv.length; i++) {
-    var arg = process.argv[i];
-    if (arg === '--ast') {
-        format = 'ast';
-    } else if (arg === '--xml') {
-        format = 'xml';
-    } else if (arg === '--time') {
-        options.time = true;
-    } else if (arg === '--sourcepos') {
-        options.sourcepos = true;
-    } else if (/^--/.test(arg)) {
-        process.stderr.write('Unknown option ' + arg + '\n');
-        process.exit(1);
-    } else {
-      files.push(arg);
-    }
-}
-
-var parser = new commonmark.Parser(options);
-var renderer;
-
-if (format === 'html') {
-    renderer = new commonmark.HtmlRenderer(options);
-} else if (format === 'xml') {
-    renderer = new commonmark.XmlRenderer(options);
-} else if (format === 'ast') {
-    renderer = { render: function(node) {
-                   return util.inspect(node, null, 20, true) + '\n';
-                 },
-                 options: {} };
-}
-
-if (files.length === 0) {
-  files = ['/dev/stdin'];
-}
-
-for (i = 0; i < files.length; i++) {
-  file = files[i];
-  inps.push(fs.readFileSync(file, 'utf8'));
-}
-
-var inp = inps.join('\n');
-var doc = parser.parse(inp);
-
-var rendered = renderer.render(doc);
-
-if (!options.time) { process.stdout.write(rendered); }
diff --git a/js/changelog.js.txt b/js/changelog.js.txt
@@ -1,38 +0,0 @@
-[0.16]
-
-  * Improved regex for HTML comments (#263).
-  * Fixed CDATA regex (#267).
-  * Use linked list instead of arrays in AST: the same doubly linked
-    node structure as cmark uses.  This simplifies some code and
-    eliminates the need for recursive algorithms, so we can render
-    deeply-nested structures without stack overflows.
-  * Use `children` instead of `label` (in Image and Link),
-    `inline_content` (in Paragraph), and `c` (in Emph and Strong).
-  * Renamed the `c` property to `literal` to match `libcmark`.
-  * Use `literal` rather than `string_content` property for code
-    blocks, HTML.  `string_content` is reserved for raw string
-    content that has yet to be parsed as inlines.
-  * Improved end lines (#276).
-  * Added a node walker, for easy AST traversal (see `node.js`).
-  * Regularized position information into a `sourcepos` property.
-    Added end column information.
-  * Renamed `html-renderer.js` to `html.js`.
-  * Replace NUL characters with U+FFFD, as per spec.
-  * Optimized code, resulting in significant performance gains.
-    (We've gone from being twice as fast as showdown.js to being
-    three times as fast, on par with marked.)
-  * Made `tight` a property of `list_data` rather than `Node`.
-  * Added options to renderer, parser objections.
-  * Added a `--sourcepos` command line option to `js/bin/commonmark`.
-  * HTML renderer now throws an error on unknown tag type (which
-    indicates a programming error).
-  * Removed `ansi.js` code from the source tree. The test suite now
-    uses its own mini ansi colors implementation.
-  * Added `--time` option to `js/bin/commonmark`.
-  * Added an XML renderer (XML representation of the AST, matching
-    `Commonmark.dtd`).
-  * Changed `url` property to `destination` to match `cmark` and spec.
-  * Added `js/common.js` to hold some common code, like string
-    unescaping and URI normalization.
-  * Use `decodeURI` instead of `unescape`.
-  * Added some "pathological" test cases to test suite.
diff --git a/js/eslint.json b/js/eslint.json
@@ -1,20 +0,0 @@
-{
-    "env": {
-        "browser": false,
-        "node": true,
-    },
-    "rules": {
-        "no-constant-condition": false,
-        "no-underscore-dangle": false,
-        "camelcase": false,
-        "quotes": false,
-        "no-process-exit": false,
-        "no-empty": false,
-        "new-caps": {
-            "newIsCap": true,
-            "capIsNew": true,
-            "newIsCapExceptions": [],
-            "capIsNewExceptions": []
-        }
-    }
-}
diff --git a/js/index.html b/js/index.html
@@ -1,12 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>CommonMark dingus</title>
-    <meta http-equiv="refresh" content="0;URL='/dingus.html" >
-  </head>
-  <body>
-    <p>The most recent version of the CommonMark dingus can be found
-at <a 
-  href="http://try.commonmark.org/dingus.html/">/dingus.html/</a>.</p>
-  </body>
-</html>
diff --git a/js/lib/blocks.js b/js/lib/blocks.js
@@ -1,748 +0,0 @@
-"use strict";
-
-var Node = require('./node');
-var unescapeString = require('./common').unescapeString;
-
-var C_GREATERTHAN = 62;
-var C_NEWLINE = 10;
-var C_SPACE = 32;
-var C_OPEN_BRACKET = 91;
-
-var CODE_INDENT = 4;
-
-var InlineParser = require('./inlines');
-
-var BLOCKTAGNAME = '(?:article|header|aside|hgroup|iframe|blockquote|hr|body|li|map|button|object|canvas|ol|caption|output|col|p|colgroup|pre|dd|progress|div|section|dl|table|td|dt|tbody|embed|textarea|fieldset|tfoot|figcaption|th|figure|thead|footer|footer|tr|form|ul|h1|h2|h3|h4|h5|h6|video|script|style)';
-
-var HTMLBLOCKOPEN = "<(?:" + BLOCKTAGNAME + "[\\s/>]" + "|" +
-        "/" + BLOCKTAGNAME + "[\\s>]" + "|" + "[?!])";
-
-var reHtmlBlockOpen = new RegExp('^' + HTMLBLOCKOPEN, 'i');
-
-var reHrule = /^(?:(?:\* *){3,}|(?:_ *){3,}|(?:- *){3,}) *$/;
-
-var reMaybeSpecial = /^[#`~*+_=<>0-9-]/;
-
-var reNonSpace = /[^ \t\n]/;
-
-var reBulletListMarker = /^[*+-]( +|$)/;
-
-var reOrderedListMarker = /^(\d+)([.)])( +|$)/;
-
-var reATXHeaderMarker = /^#{1,6}(?: +|$)/;
-
-var reCodeFence = /^`{3,}(?!.*`)|^~{3,}(?!.*~)/;
-
-var reClosingCodeFence = /^(?:`{3,}|~{3,})(?= *$)/;
-
-var reSetextHeaderLine = /^(?:=+|-+) *$/;
-
-var reLineEnding = /\r\n|\n|\r/;
-
-// Returns true if string contains only space characters.
-var isBlank = function(s) {
-    return !(reNonSpace.test(s));
-};
-
-var tabSpaces = ['    ', '   ', '  ', ' '];
-
-// Convert tabs to spaces on each line using a 4-space tab stop.
-var detabLine = function(text) {
-    var start = 0;
-    var offset;
-    var lastStop = 0;
-
-    while ((offset = text.indexOf('\t', start)) !== -1) {
-        var numspaces = (offset - lastStop) % 4;
-        var spaces = tabSpaces[numspaces];
-        text = text.slice(0, offset) + spaces + text.slice(offset + 1);
-        lastStop = offset + numspaces;
-        start = lastStop;
-    }
-
-    return text;
-};
-
-// Attempt to match a regex in string s at offset offset.
-// Return index of match or -1.
-var matchAt = function(re, s, offset) {
-    var res = s.slice(offset).match(re);
-    if (res === null) {
-        return -1;
-    } else {
-        return offset + res.index;
-    }
-};
-
-// destructively trip final blank lines in an array of strings
-var stripFinalBlankLines = function(lns) {
-    var i = lns.length - 1;
-    while (!reNonSpace.test(lns[i])) {
-        lns.pop();
-        i--;
-    }
-};
-
-// DOC PARSER
-
-// These are methods of a Parser object, defined below.
-
-// Returns true if parent block can contain child block.
-var canContain = function(parent_type, child_type) {
-    return ( parent_type === 'Document' ||
-             parent_type === 'BlockQuote' ||
-             parent_type === 'Item' ||
-             (parent_type === 'List' && child_type === 'Item') );
-};
-
-// Returns true if block type can accept lines of text.
-var acceptsLines = function(block_type) {
-    return ( block_type === 'Paragraph' ||
-             block_type === 'CodeBlock' );
-};
-
-// Returns true if block ends with a blank line, descending if needed
-// into lists and sublists.
-var endsWithBlankLine = function(block) {
-    while (block) {
-        if (block._lastLineBlank) {
-            return true;
-        }
-        var t = block.type;
-        if (t === 'List' || t === 'Item') {
-            block = block._lastChild;
-        } else {
-            break;
-        }
-    }
-    return false;
-};
-
-// Break out of all containing lists, resetting the tip of the
-// document to the parent of the highest list, and finalizing
-// all the lists.  (This is used to implement the "two blank lines
-// break of of all lists" feature.)
-var breakOutOfLists = function(block) {
-    var b = block;
-    var last_list = null;
-    do {
-        if (b.type === 'List') {
-            last_list = b;
-        }
-        b = b._parent;
-    } while (b);
-
-    if (last_list) {
-        while (block !== last_list) {
-            this.finalize(block, this.lineNumber);
-            block = block._parent;
-        }
-        this.finalize(last_list, this.lineNumber);
-        this.tip = last_list._parent;
-    }
-};
-
-// Add a line to the block at the tip.  We assume the tip
-// can accept lines -- that check should be done before calling this.
-var addLine = function(ln) {
-    this.tip._strings.push(ln.slice(this.offset));
-};
-
-// Add block of type tag as a child of the tip.  If the tip can't
-// accept children, close and finalize it and try its parent,
-// and so on til we find a block that can accept children.
-var addChild = function(tag, offset) {
-    while (!canContain(this.tip.type, tag)) {
-        this.finalize(this.tip, this.lineNumber - 1);
-    }
-
-    var column_number = offset + 1; // offset 0 = column 1
-    var newBlock = new Node(tag, [[this.lineNumber, column_number], [0, 0]]);
-    newBlock._strings = [];
-    newBlock._string_content = null;
-    this.tip.appendChild(newBlock);
-    this.tip = newBlock;
-    return newBlock;
-};
-
-// Parse a list marker and return data on the marker (type,
-// start, delimiter, bullet character, padding) or null.
-var parseListMarker = function(ln, offset, indent) {
-    var rest = ln.slice(offset);
-    var match;
-    var spaces_after_marker;
-    var data = { type: null,
-                 tight: true,  // lists are tight by default
-                 bulletChar: null,
-                 start: null,
-                 delimiter: null,
-                 padding: null,
-                 markerOffset: indent };
-    if (rest.match(reHrule)) {
-        return null;
-    }
-    if ((match = rest.match(reBulletListMarker))) {
-        spaces_after_marker = match[1].length;
-        data.type = 'Bullet';
-        data.bulletChar = match[0][0];
-
-    } else if ((match = rest.match(reOrderedListMarker))) {
-        spaces_after_marker = match[3].length;
-        data.type = 'Ordered';
-        data.start = parseInt(match[1]);
-        data.delimiter = match[2];
-    } else {
-        return null;
-    }
-    var blank_item = match[0].length === rest.length;
-    if (spaces_after_marker >= 5 ||
-        spaces_after_marker < 1 ||
-        blank_item) {
-        data.padding = match[0].length - spaces_after_marker + 1;
-    } else {
-        data.padding = match[0].length;
-    }
-    return data;
-};
-
-// Returns true if the two list items are of the same type,
-// with the same delimiter and bullet character.  This is used
-// in agglomerating list items into lists.
-var listsMatch = function(list_data, item_data) {
-    return (list_data.type === item_data.type &&
-            list_data.delimiter === item_data.delimiter &&
-            list_data.bulletChar === item_data.bulletChar);
-};
-
-// Finalize and close any unmatched blocks. Returns true.
-var closeUnmatchedBlocks = function() {
-    // finalize any blocks not matched
-    while (this.oldtip !== this.lastMatchedContainer) {
-        var parent = this.oldtip._parent;
-        this.finalize(this.oldtip, this.lineNumber - 1);
-        this.oldtip = parent;
-    }
-    return true;
-};
-
-// 'finalize' is run when the block is closed.
-// 'continue' is run to check whether the block is continuing
-// at a certain line and offset (e.g. whether a block quote
-// contains a `>`.  It returns 0 for matched, 1 for not matched,
-// and 2 for "we've dealt with this line completely, go to next."
-var blocks = {
-    Document: {
-        continue: function(parser, container, next_nonspace) {
-            return 0;
-        },
-        finalize: function(parser, block) {
-            return;
-        }
-    },
-    List: {
-        continue: function(parser, container, next_nonspace) {
-            return 0;
-        },
-        finalize: function(parser, block) {
-            var item = block._firstChild;
-            while (item) {
-                // check for non-final list item ending with blank line:
-                if (endsWithBlankLine(item) && item._next) {
-                    block._listData.tight = false;
-                    break;
-                }
-                // recurse into children of list item, to see if there are
-                // spaces between any of them:
-                var subitem = item._firstChild;
-                while (subitem) {
-                    if (endsWithBlankLine(subitem) &&
-                        (item._next || subitem._next)) {
-                        block._listData.tight = false;
-                        break;
-                    }
-                    subitem = subitem._next;
-                }
-                item = item._next;
-            }
-        }
-    },
-    BlockQuote: {
-        continue: function(parser, container, next_nonspace) {
-            var ln = parser.currentLine;
-            if (next_nonspace - parser.offset <= 3 &&
-                ln.charCodeAt(next_nonspace) === C_GREATERTHAN) {
-                parser.offset = next_nonspace + 1;
-                if (ln.charCodeAt(parser.offset) === C_SPACE) {
-                    parser.offset++;
-                }
-            } else {
-                return 1;
-            }
-            return 0;
-        },
-        finalize: function(parser, block) {
-            return;
-        }
-    },
-    Item: {
-        continue: function(parser, container, next_nonspace) {
-            if (next_nonspace === parser.currentLine.length) { // blank
-                parser.offset = next_nonspace;
-            } else if (next_nonspace - parser.offset >=
-                       container._listData.markerOffset +
-                       container._listData.padding) {
-                parser.offset += container._listData.markerOffset +
-                    container._listData.padding;
-            } else {
-                return 1;
-            }
-            return 0;
-        },
-        finalize: function(parser, block) {
-            return;
-        }
-    },
-    Header: {
-        continue: function(parser, container, next_nonspace) {
-            // a header can never container > 1 line, so fail to match:
-            return 1;
-        },
-        finalize: function(parser, block) {
-            block._string_content = block._strings.join('\n');
-        }
-    },
-    HorizontalRule: {
-        continue: function(parser, container, next_nonspace) {
-            // an hrule can never container > 1 line, so fail to match:
-            return 1;
-        },
-        finalize: function(parser, block) {
-            return;
-        }
-    },
-    CodeBlock: {
-        continue: function(parser, container, next_nonspace) {
-            var ln = parser.currentLine;
-            var indent = next_nonspace - parser.offset;
-            if (container._isFenced) { // fenced
-                var match = (indent <= 3 &&
-                    ln.charAt(next_nonspace) === container._fenceChar &&
-                    ln.slice(next_nonspace).match(reClosingCodeFence));
-                if (match && match[0].length >= container._fenceLength) {
-                    // closing fence - we're at end of line, so we can return
-                    parser.finalize(container, parser.lineNumber);
-                    return 2;
-                } else {
-                    // skip optional spaces of fence offset
-                    var i = container._fenceOffset;
-                    while (i > 0 && ln.charCodeAt(parser.offset) === C_SPACE) {
-                        parser.offset++;
-                        i--;
-                    }
-                }
-            } else { // indented
-                if (indent >= CODE_INDENT) {
-                    parser.offset += CODE_INDENT;
-                } else if (next_nonspace === ln.length) { // blank
-                    parser.offset = next_nonspace;
-                } else {
-                    return 1;
-                }
-            }
-            return 0;
-        },
-        finalize: function(parser, block) {
-            if (block._isFenced) { // fenced
-                // first line becomes info string
-                block.info = unescapeString(block._strings[0].trim());
-                if (block._strings.length === 1) {
-                    block._literal = '';
-                } else {
-                    block._literal = block._strings.slice(1).join('\n') + '\n';
-                }
-            } else { // indented
-                stripFinalBlankLines(block._strings);
-                block._literal = block._strings.join('\n') + '\n';
-            }
-        }
-    },
-    HtmlBlock: {
-        continue: function(parser, container, next_nonspace) {
-            return (next_nonspace === parser.currentLine.length ? 1 : 0);
-        },
-        finalize: function(parser, block) {
-            block._literal = block._strings.join('\n');
-        }
-    },
-    Paragraph: {
-        continue: function(parser, container, next_nonspace) {
-            return (next_nonspace === parser.currentLine.length ? 1 : 0);
-        },
-        finalize: function(parser, block) {
-            var pos;
-            block._string_content = block._strings.join('\n');
-
-            // try parsing the beginning as link reference definitions:
-            while (block._string_content.charCodeAt(0) === C_OPEN_BRACKET &&
-                   (pos =
-                    parser.inlineParser.parseReference(block._string_content,
-                                                       parser.refmap))) {
-                block._string_content = block._string_content.slice(pos);
-                if (isBlank(block._string_content)) {
-                    block.unlink();
-                    break;
-                }
-            }
-        }
-    }
-};
-
-// Analyze a line of text and update the document appropriately.
-// We parse markdown text by calling this on each line of input,
-// then finalizing the document.
-var incorporateLine = function(ln) {
-    var all_matched = true;
-    var next_nonspace;
-    var match;
-    var data;
-    var blank;
-    var indent;
-    var allClosed;
-
-    var container = this.doc;
-    this.oldtip = this.tip;
-    this.offset = 0;
-    this.lineNumber += 1;
-
-    // replace NUL characters for security
-    if (ln.indexOf('\u0000') !== -1) {
-        ln = ln.replace(/\0/g, '\uFFFD');
-    }
-
-    // Convert tabs to spaces:
-    ln = detabLine(ln);
-    this.currentLine = ln;
-
-    // For each containing block, try to parse the associated line start.
-    // Bail out on failure: container will point to the last matching block.
-    // Set all_matched to false if not all containers match.
-    var lastChild;
-    while ((lastChild = container._lastChild) && lastChild._open) {
-        container = lastChild;
-
-        match = matchAt(reNonSpace, ln, this.offset);
-        if (match === -1) {
-            next_nonspace = ln.length;
-        } else {
-            next_nonspace = match;
-        }
-
-        switch (this.blocks[container.type].continue(this, container, next_nonspace)) {
-        case 0: // we've matched, keep going
-            break;
-        case 1: // we've failed to match a block
-            all_matched = false;
-            break;
-        case 2: // we've hit end of line for fenced code close and can return
-            this.lastLineLength = ln.length - 1; // -1 for newline
-            return;
-        default:
-            throw 'continue returned illegal value, must be 0, 1, or 2';
-        }
-        if (!all_matched) {
-            container = container._parent; // back up to last matching block
-            break;
-        }
-    }
-
-    blank = next_nonspace === ln.length;
-
-    allClosed = (container === this.oldtip);
-    this.lastMatchedContainer = container;
-
-    // Check to see if we've hit 2nd blank line; if so break out of list:
-    if (blank && container._lastLineBlank) {
-        this.breakOutOfLists(container);
-    }
-
-    // Unless last matched container is a code block, try new container starts,
-    // adding children to the last matched container:
-    while (true) {
-        var t = container.type;
-
-        match = matchAt(reNonSpace, ln, this.offset);
-        if (match === -1) {
-            next_nonspace = ln.length;
-            blank = true;
-            break;
-        } else {
-            next_nonspace = match;
-            blank = false;
-        }
-        indent = next_nonspace - this.offset;
-
-        if (t === 'CodeBlock' || t === 'HtmlBlock') {
-            break;
-        }
-
-        if (indent >= CODE_INDENT) {
-            // indented code
-            if (this.tip.type !== 'Paragraph' && !blank) {
-                this.offset += CODE_INDENT;
-                allClosed = allClosed ||
-                    this.closeUnmatchedBlocks();
-                container = this.addChild('CodeBlock', this.offset);
-            }
-            break;
-        }
-
-        // this is a little performance optimization:
-        if (matchAt(reMaybeSpecial, ln, next_nonspace) === -1) {
-            break;
-        }
-
-        this.offset = next_nonspace;
-
-        var cc = ln.charCodeAt(this.offset);
-
-        if (cc === C_GREATERTHAN) {
-            // blockquote
-            this.offset += 1;
-            // optional following space
-            if (ln.charCodeAt(this.offset) === C_SPACE) {
-                this.offset++;
-            }
-            allClosed = allClosed || this.closeUnmatchedBlocks();
-            container = this.addChild('BlockQuote', next_nonspace);
-
-        } else if ((match = ln.slice(this.offset).match(reATXHeaderMarker))) {
-            // ATX header
-            this.offset += match[0].length;
-            allClosed = allClosed || this.closeUnmatchedBlocks();
-            container = this.addChild('Header', next_nonspace);
-            container.level = match[0].trim().length; // number of #s
-            // remove trailing ###s:
-            container._strings =
-                [ln.slice(this.offset).replace(/^ *#+ *$/, '').replace(/ +#+ *$/, '')];
-            break;
-
-        } else if ((match = ln.slice(this.offset).match(reCodeFence))) {
-            // fenced code block
-            var fenceLength = match[0].length;
-            allClosed = allClosed || this.closeUnmatchedBlocks();
-            container = this.addChild('CodeBlock', next_nonspace);
-            container._isFenced = true;
-            container._fenceLength = fenceLength;
-            container._fenceChar = match[0][0];
-            container._fenceOffset = indent;
-            this.offset += fenceLength;
-
-        } else if (matchAt(reHtmlBlockOpen, ln, this.offset) !== -1) {
-            // html block
-            allClosed = allClosed || this.closeUnmatchedBlocks();
-            container = this.addChild('HtmlBlock', this.offset);
-            this.offset -= indent; // back up so spaces are part of block
-            break;
-
-        } else if (t === 'Paragraph' &&
-                   container._strings.length === 1 &&
-                   ((match = ln.slice(this.offset).match(reSetextHeaderLine)))) {
-            // setext header line
-            allClosed = allClosed || this.closeUnmatchedBlocks();
-            var header = new Node('Header', container.sourcepos);
-            header.level = match[0][0] === '=' ? 1 : 2;
-            header._strings = container._strings;
-            container.insertAfter(header);
-            container.unlink();
-            container = header;
-            this.tip = header;
-            this.offset = ln.length;
-            break;
-
-        } else if (matchAt(reHrule, ln, this.offset) !== -1) {
-            // hrule
-            allClosed = allClosed || this.closeUnmatchedBlocks();
-            container = this.addChild('HorizontalRule', next_nonspace);
-            this.offset = ln.length - 1;
-            break;
-
-        } else if ((data = parseListMarker(ln, this.offset, indent))) {
-            // list item
-            allClosed = allClosed || this.closeUnmatchedBlocks();
-            this.offset += data.padding;
-
-            // add the list if needed
-            if (t !== 'List' ||
-                !(listsMatch(container._listData, data))) {
-                container = this.addChild('List', next_nonspace);
-                container._listData = data;
-            }
-
-            // add the list item
-            container = this.addChild('Item', next_nonspace);
-            container._listData = data;
-
-        } else {
-            break;
-
-        }
-
-    }
-
-    // What remains at the offset is a text line.  Add the text to the
-    // appropriate container.
-
-   // First check for a lazy paragraph continuation:
-    if (!allClosed && !blank &&
-        this.tip.type === 'Paragraph' &&
-        this.tip._strings.length > 0) {
-        // lazy paragraph continuation
-
-        this.addLine(ln);
-
-    } else { // not a lazy continuation
-
-        // finalize any blocks not matched
-        allClosed = allClosed || this.closeUnmatchedBlocks();
-        if (blank && container.lastChild) {
-            container.lastChild._lastLineBlank = true;
-        }
-
-        t = container.type;
-
-        // Block quote lines are never blank as they start with >
-        // and we don't count blanks in fenced code for purposes of tight/loose
-        // lists or breaking out of lists.  We also don't set _lastLineBlank
-        // on an empty list item, or if we just closed a fenced block.
-        var lastLineBlank = blank &&
-            !(t === 'BlockQuote' ||
-              (t === 'CodeBlock' && container._isFenced) ||
-              (t === 'Item' &&
-               !container._firstChild &&
-               container.sourcepos[0][0] === this.lineNumber));
-
-        // propagate lastLineBlank up through parents:
-        var cont = container;
-        while (cont) {
-            cont._lastLineBlank = lastLineBlank;
-            cont = cont._parent;
-        }
-
-        switch (t) {
-        case 'HtmlBlock':
-        case 'CodeBlock':
-            this.addLine(ln);
-            break;
-
-        case 'Header':
-        case 'HorizontalRule':
-            // nothing to do; we already added the contents.
-            break;
-
-        default:
-            this.offset = next_nonspace;
-            if (acceptsLines(t)) {
-                this.addLine(ln);
-            } else if (blank) {
-                break;
-            } else {
-                // create paragraph container for line
-                container = this.addChild('Paragraph', this.offset);
-                this.addLine(ln);
-            }
-        }
-    }
-    this.lastLineLength = ln.length - 1; // -1 for newline
-};
-
-// Finalize a block.  Close it and do any necessary postprocessing,
-// e.g. creating string_content from strings, setting the 'tight'
-// or 'loose' status of a list, and parsing the beginnings
-// of paragraphs for reference definitions.  Reset the tip to the
-// parent of the closed block.
-var finalize = function(block, lineNumber) {
-    var above = block._parent || this.top;
-    block._open = false;
-    block.sourcepos[1] = [lineNumber, this.lastLineLength + 1];
-
-    this.blocks[block.type].finalize(this, block);
-
-    this.tip = above;
-};
-
-// Walk through a block & children recursively, parsing string content
-// into inline content where appropriate.  Returns new object.
-var processInlines = function(block) {
-    var node, event, t;
-    var walker = block.walker();
-    while ((event = walker.next())) {
-        node = event.node;
-        t = node.type;
-        if (!event.entering && (t === 'Paragraph' || t === 'Header')) {
-            this.inlineParser.parse(node, this.refmap);
-        }
-    }
-};
-
-var Document = function() {
-    var doc = new Node('Document', [[1, 1], [0, 0]]);
-    doc._string_content = null;
-    doc._strings = [];
-    return doc;
-};
-
-// The main parsing function.  Returns a parsed document AST.
-var parse = function(input) {
-    this.doc = new Document();
-    this.tip = this.doc;
-    this.refmap = {};
-    if (this.options.time) { console.time("preparing input"); }
-    var lines = input.split(reLineEnding);
-    var len = lines.length;
-    if (input.charCodeAt(input.length - 1) === C_NEWLINE) {
-        // ignore last blank line created by final newline
-        len -= 1;
-    }
-    if (this.options.time) { console.timeEnd("preparing input"); }
-    if (this.options.time) { console.time("block parsing"); }
-    for (var i = 0; i < len; i++) {
-        this.incorporateLine(lines[i]);
-    }
-    while (this.tip) {
-        this.finalize(this.tip, len);
-    }
-    if (this.options.time) { console.timeEnd("block parsing"); }
-    if (this.options.time) { console.time("inline parsing"); }
-    this.processInlines(this.doc);
-    if (this.options.time) { console.timeEnd("inline parsing"); }
-    return this.doc;
-};
-
-
-// The Parser object.
-function Parser(options){
-    return {
-        doc: new Document(),
-        blocks: blocks,
-        tip: this.doc,
-        oldtip: this.doc,
-        currentLine: "",
-        lineNumber: 0,
-        offset: 0,
-        lastMatchedContainer: this.doc,
-        refmap: {},
-        lastLineLength: 0,
-        inlineParser: new InlineParser(),
-        breakOutOfLists: breakOutOfLists,
-        addLine: addLine,
-        addChild: addChild,
-        incorporateLine: incorporateLine,
-        finalize: finalize,
-        processInlines: processInlines,
-        closeUnmatchedBlocks: closeUnmatchedBlocks,
-        parse: parse,
-        options: options || {}
-    };
-}
-
-module.exports = Parser;
diff --git a/js/lib/common.js b/js/lib/common.js
@@ -1,75 +0,0 @@
-"use strict";
-
-var entityToChar = require('./html5-entities.js').entityToChar;
-
-var ENTITY = "&(?:#x[a-f0-9]{1,8}|#[0-9]{1,8}|[a-z][a-z0-9]{1,31});";
-
-var reBackslashOrAmp = /[\\&]/;
-
-var ESCAPABLE = '[!"#$%&\'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]';
-
-var reEntityOrEscapedChar = new RegExp('\\\\' + ESCAPABLE + '|' + ENTITY, 'gi');
-
-var XMLSPECIAL = '[&<>"]';
-
-var reXmlSpecial = new RegExp(XMLSPECIAL, 'g');
-
-var reXmlSpecialOrEntity = new RegExp(ENTITY + '|' + XMLSPECIAL, 'gi');
-
-var unescapeChar = function(s) {
-    if (s[0] === '\\') {
-        return s[1];
-    } else {
-        return entityToChar(s);
-    }
-};
-
-// Replace entities and backslash escapes with literal characters.
-var unescapeString = function(s) {
-    if (reBackslashOrAmp.test(s)) {
-        return s.replace(reEntityOrEscapedChar, unescapeChar);
-    } else {
-        return s;
-    }
-};
-
-var normalizeURI = function(uri) {
-    try {
-        return encodeURI(decodeURI(uri));
-    }
-    catch(err) {
-        return uri;
-    }
-};
-
-var replaceUnsafeChar = function(s) {
-    switch (s) {
-    case '&':
-        return '&amp;';
-    case '<':
-        return '&lt;';
-    case '>':
-        return '&gt;';
-    case '"':
-        return '&quot;';
-    default:
-        return s;
-    }
-};
-
-var escapeXml = function(s, preserve_entities) {
-    if (reXmlSpecial.test(s)) {
-        if (preserve_entities) {
-            return s.replace(reXmlSpecialOrEntity, replaceUnsafeChar);
-        } else {
-            return s.replace(reXmlSpecial, replaceUnsafeChar);
-        }
-    } else {
-        return s;
-    }
-};
-
-module.exports = { unescapeString: unescapeString,
-                   normalizeURI: normalizeURI,
-                   escapeXml: escapeXml
-                 };
diff --git a/js/lib/from-code-point.js b/js/lib/from-code-point.js
@@ -1,59 +0,0 @@
-"use strict";
-
-// derived from https://github.com/mathiasbynens/String.fromCodePoint
-/*! http://mths.be/fromcodepoint v0.2.1 by @mathias */
-if (String.fromCodePoint) {
-    module.exports = function (_) {
-        try {
-            return String.fromCodePoint(_);
-        } catch (e) {
-            if (e instanceof RangeError) {
-                return String.fromCharCode(0xFFFD);
-            }
-            throw e;
-        }
-    };
-
-} else {
-
-  var stringFromCharCode = String.fromCharCode;
-  var floor = Math.floor;
-  var fromCodePoint = function() {
-      var MAX_SIZE = 0x4000;
-      var codeUnits = [];
-      var highSurrogate;
-      var lowSurrogate;
-      var index = -1;
-      var length = arguments.length;
-      if (!length) {
-          return '';
-      }
-      var result = '';
-      while (++index < length) {
-          var codePoint = Number(arguments[index]);
-          if (
-              !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`
-                  codePoint < 0 || // not a valid Unicode code point
-                  codePoint > 0x10FFFF || // not a valid Unicode code point
-                  floor(codePoint) !== codePoint // not an integer
-          ) {
-              return String.fromCharCode(0xFFFD);
-          }
-          if (codePoint <= 0xFFFF) { // BMP code point
-              codeUnits.push(codePoint);
-          } else { // Astral code point; split in surrogate halves
-              // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
-              codePoint -= 0x10000;
-              highSurrogate = (codePoint >> 10) + 0xD800;
-              lowSurrogate = (codePoint % 0x400) + 0xDC00;
-              codeUnits.push(highSurrogate, lowSurrogate);
-          }
-          if (index + 1 === length || codeUnits.length > MAX_SIZE) {
-              result += stringFromCharCode.apply(null, codeUnits);
-              codeUnits.length = 0;
-          }
-      }
-      return result;
-  };
-  module.exports = fromCodePoint;
-}
diff --git a/js/lib/html.js b/js/lib/html.js
@@ -1,246 +0,0 @@
-"use strict";
-
-var escapeXml = require('./common').escapeXml;
-
-// Helper function to produce an HTML tag.
-var tag = function(name, attrs, selfclosing) {
-    var result = '<' + name;
-    if (attrs && attrs.length > 0) {
-        var i = 0;
-        var attrib;
-        while ((attrib = attrs[i]) !== undefined) {
-            result += ' ' + attrib[0] + '="' + attrib[1] + '"';
-            i++;
-        }
-    }
-    if (selfclosing) {
-        result += ' /';
-    }
-
-    result += '>';
-    return result;
-};
-
-var reHtmlTag = /\<[^>]*\>/;
-
-var renderNodes = function(block) {
-
-    var attrs;
-    var info_words;
-    var tagname;
-    var walker = block.walker();
-    var event, node, entering;
-    var buffer = "";
-    var lastOut = "\n";
-    var disableTags = 0;
-    var grandparent;
-    var out = function(s) {
-        if (disableTags > 0) {
-            buffer += s.replace(reHtmlTag, '');
-        } else {
-            buffer += s;
-        }
-        lastOut = s;
-    };
-    var esc = this.escape;
-    var cr = function() {
-        if (lastOut !== '\n') {
-            buffer += '\n';
-            lastOut = '\n';
-        }
-    };
-
-    var options = this.options;
-
-    if (options.time) { console.time("rendering"); }
-
-    while ((event = walker.next())) {
-        entering = event.entering;
-        node = event.node;
-
-        attrs = [];
-        if (options.sourcepos) {
-            var pos = node.sourcepos;
-            if (pos) {
-                attrs.push(['data-sourcepos', String(pos[0][0]) + ':' +
-                            String(pos[0][1]) + '-' + String(pos[1][0]) + ':' +
-                            String(pos[1][1])]);
-            }
-        }
-
-        switch (node.type) {
-        case 'Text':
-            out(esc(node.literal, false));
-            break;
-
-        case 'Softbreak':
-            out(this.softbreak);
-            break;
-
-        case 'Hardbreak':
-            out(tag('br', [], true));
-            cr();
-            break;
-
-        case 'Emph':
-            out(tag(entering ? 'em' : '/em'));
-            break;
-
-        case 'Strong':
-            out(tag(entering ? 'strong' : '/strong'));
-            break;
-
-        case 'Html':
-            out(node.literal);
-            break;
-
-        case 'Link':
-            if (entering) {
-                attrs.push(['href', esc(node.destination, true)]);
-                if (node.title) {
-                    attrs.push(['title', esc(node.title, true)]);
-                }
-                out(tag('a', attrs));
-            } else {
-                out(tag('/a'));
-            }
-            break;
-
-        case 'Image':
-            if (entering) {
-                if (disableTags === 0) {
-                    out('<img src="' + esc(node.destination, true) +
-                        '" alt="');
-                }
-                disableTags += 1;
-            } else {
-                disableTags -= 1;
-                if (disableTags === 0) {
-                    if (node.title) {
-                        out('" title="' + esc(node.title, true));
-                    }
-                    out('" />');
-                }
-            }
-            break;
-
-        case 'Code':
-            out(tag('code') + esc(node.literal, false) + tag('/code'));
-            break;
-
-        case 'Document':
-            break;
-
-        case 'Paragraph':
-            grandparent = node.parent.parent;
-            if (grandparent !== null &&
-                grandparent.type === 'List') {
-                if (grandparent.listTight) {
-                    break;
-                }
-            }
-            if (entering) {
-                cr();
-                out(tag('p', attrs));
-            } else {
-                out(tag('/p'));
-                cr();
-            }
-            break;
-
-        case 'BlockQuote':
-            if (entering) {
-                cr();
-                out(tag('blockquote', attrs));
-                cr();
-            } else {
-                cr();
-                out(tag('/blockquote'));
-                cr();
-            }
-            break;
-
-        case 'Item':
-            if (entering) {
-                out(tag('li', attrs));
-            } else {
-                out(tag('/li'));
-                cr();
-            }
-            break;
-
-        case 'List':
-            tagname = node.listType === 'Bullet' ? 'ul' : 'ol';
-            if (entering) {
-                var start = node.listStart;
-                if (start && start > 1) {
-                    attrs.push(['start', start.toString()]);
-                }
-                cr();
-                out(tag(tagname, attrs));
-                cr();
-            } else {
-                cr();
-                out(tag('/' + tagname));
-                cr();
-            }
-            break;
-
-        case 'Header':
-            tagname = 'h' + node.level;
-            if (entering) {
-                cr();
-                out(tag(tagname, attrs));
-            } else {
-                out(tag('/' + tagname));
-                cr();
-            }
-            break;
-
-        case 'CodeBlock':
-            info_words = node.info ? node.info.split(/ +/) : [];
-            if (info_words.length > 0 && info_words[0].length > 0) {
-                attrs.push(['class', 'language-' + esc(info_words[0], true)]);
-            }
-            cr();
-            out(tag('pre') + tag('code', attrs));
-            out(esc(node.literal, false));
-            out(tag('/code') + tag('/pre'));
-            cr();
-            break;
-
-        case 'HtmlBlock':
-            cr();
-            out(node.literal);
-            cr();
-            break;
-
-        case 'HorizontalRule':
-            cr();
-            out(tag('hr', attrs, true));
-            cr();
-            break;
-
-        default:
-            throw "Unknown node type " + node.type;
-        }
-
-    }
-    if (options.time) { console.timeEnd("rendering"); }
-    return buffer;
-};
-
-// The HtmlRenderer object.
-function HtmlRenderer(options){
-    return {
-        // default options:
-        softbreak: '\n', // by default, soft breaks are rendered as newlines in HTML
-        // set to "<br />" to make them hard breaks
-        // set to " " if you want to ignore line wrapping in source
-        escape: escapeXml,
-        options: options || {},
-        render: renderNodes
-    };
-}
-
-module.exports = HtmlRenderer;
diff --git a/js/lib/html5-entities.js b/js/lib/html5-entities.js
@@ -1,2154 +0,0 @@
-"use strict";
-
-var fromCodePoint = require('./from-code-point');
-
-var entities = {
-  AAacute: 193,
-  aacute: 225,
-  Abreve: 258,
-  abreve: 259,
-  ac: 8766,
-  acd: 8767,
-  acE: 8766,
-  Acirc: 194,
-  acirc: 226,
-  acute: 180,
-  Acy: 1040,
-  acy: 1072,
-  AElig: 198,
-  aelig: 230,
-  af: 8289,
-  Afr: 55349,
-  afr: 55349,
-  Agrave: 192,
-  agrave: 224,
-  alefsym: 8501,
-  aleph: 8501,
-  Alpha: 913,
-  alpha: 945,
-  Amacr: 256,
-  amacr: 257,
-  amalg: 10815,
-  amp: 38,
-  AMP: 38,
-  andand: 10837,
-  And: 10835,
-  and: 8743,
-  andd: 10844,
-  andslope: 10840,
-  andv: 10842,
-  ang: 8736,
-  ange: 10660,
-  angle: 8736,
-  angmsdaa: 10664,
-  angmsdab: 10665,
-  angmsdac: 10666,
-  angmsdad: 10667,
-  angmsdae: 10668,
-  angmsdaf: 10669,
-  angmsdag: 10670,
-  angmsdah: 10671,
-  angmsd: 8737,
-  angrt: 8735,
-  angrtvb: 8894,
-  angrtvbd: 10653,
-  angsph: 8738,
-  angst: 197,
-  angzarr: 9084,
-  Aogon: 260,
-  aogon: 261,
-  Aopf: 55349,
-  aopf: 55349,
-  apacir: 10863,
-  ap: 8776,
-  apE: 10864,
-  ape: 8778,
-  apid: 8779,
-  apos: 39,
-  ApplyFunction: 8289,
-  approx: 8776,
-  approxeq: 8778,
-  Aring: 197,
-  aring: 229,
-  Ascr: 55349,
-  ascr: 55349,
-  Assign: 8788,
-  ast: 42,
-  asymp: 8776,
-  asympeq: 8781,
-  Atilde: 195,
-  atilde: 227,
-  Auml: 196,
-  auml: 228,
-  awconint: 8755,
-  awint: 10769,
-  backcong: 8780,
-  backepsilon: 1014,
-  backprime: 8245,
-  backsim: 8765,
-  backsimeq: 8909,
-  Backslash: 8726,
-  Barv: 10983,
-  barvee: 8893,
-  barwed: 8965,
-  Barwed: 8966,
-  barwedge: 8965,
-  bbrk: 9141,
-  bbrktbrk: 9142,
-  bcong: 8780,
-  Bcy: 1041,
-  bcy: 1073,
-  bdquo: 8222,
-  becaus: 8757,
-  because: 8757,
-  Because: 8757,
-  bemptyv: 10672,
-  bepsi: 1014,
-  bernou: 8492,
-  Bernoullis: 8492,
-  Beta: 914,
-  beta: 946,
-  beth: 8502,
-  between: 8812,
-  Bfr: 55349,
-  bfr: 55349,
-  bigcap: 8898,
-  bigcirc: 9711,
-  bigcup: 8899,
-  bigodot: 10752,
-  bigoplus: 10753,
-  bigotimes: 10754,
-  bigsqcup: 10758,
-  bigstar: 9733,
-  bigtriangledown: 9661,
-  bigtriangleup: 9651,
-  biguplus: 10756,
-  bigvee: 8897,
-  bigwedge: 8896,
-  bkarow: 10509,
-  blacklozenge: 10731,
-  blacksquare: 9642,
-  blacktriangle: 9652,
-  blacktriangledown: 9662,
-  blacktriangleleft: 9666,
-  blacktriangleright: 9656,
-  blank: 9251,
-  blk12: 9618,
-  blk14: 9617,
-  blk34: 9619,
-  block: 9608,
-  bne: 61,
-  bnequiv: 8801,
-  bNot: 10989,
-  bnot: 8976,
-  Bopf: 55349,
-  bopf: 55349,
-  bot: 8869,
-  bottom: 8869,
-  bowtie: 8904,
-  boxbox: 10697,
-  boxdl: 9488,
-  boxdL: 9557,
-  boxDl: 9558,
-  boxDL: 9559,
-  boxdr: 9484,
-  boxdR: 9554,
-  boxDr: 9555,
-  boxDR: 9556,
-  boxh: 9472,
-  boxH: 9552,
-  boxhd: 9516,
-  boxHd: 9572,
-  boxhD: 9573,
-  boxHD: 9574,
-  boxhu: 9524,
-  boxHu: 9575,
-  boxhU: 9576,
-  boxHU: 9577,
-  boxminus: 8863,
-  boxplus: 8862,
-  boxtimes: 8864,
-  boxul: 9496,
-  boxuL: 9563,
-  boxUl: 9564,
-  boxUL: 9565,
-  boxur: 9492,
-  boxuR: 9560,
-  boxUr: 9561,
-  boxUR: 9562,
-  boxv: 9474,
-  boxV: 9553,
-  boxvh: 9532,
-  boxvH: 9578,
-  boxVh: 9579,
-  boxVH: 9580,
-  boxvl: 9508,
-  boxvL: 9569,
-  boxVl: 9570,
-  boxVL: 9571,
-  boxvr: 9500,
-  boxvR: 9566,
-  boxVr: 9567,
-  boxVR: 9568,
-  bprime: 8245,
-  breve: 728,
-  Breve: 728,
-  brvbar: 166,
-  bscr: 55349,
-  Bscr: 8492,
-  bsemi: 8271,
-  bsim: 8765,
-  bsime: 8909,
-  bsolb: 10693,
-  bsol: 92,
-  bsolhsub: 10184,
-  bull: 8226,
-  bullet: 8226,
-  bump: 8782,
-  bumpE: 10926,
-  bumpe: 8783,
-  Bumpeq: 8782,
-  bumpeq: 8783,
-  Cacute: 262,
-  cacute: 263,
-  capand: 10820,
-  capbrcup: 10825,
-  capcap: 10827,
-  cap: 8745,
-  Cap: 8914,
-  capcup: 10823,
-  capdot: 10816,
-  CapitalDifferentialD: 8517,
-  caps: 8745,
-  caret: 8257,
-  caron: 711,
-  Cayleys: 8493,
-  ccaps: 10829,
-  Ccaron: 268,
-  ccaron: 269,
-  Ccedil: 199,
-  ccedil: 231,
-  Ccirc: 264,
-  ccirc: 265,
-  Cconint: 8752,
-  ccups: 10828,
-  ccupssm: 10832,
-  Cdot: 266,
-  cdot: 267,
-  cedil: 184,
-  Cedilla: 184,
-  cemptyv: 10674,
-  cent: 162,
-  centerdot: 183,
-  CenterDot: 183,
-  cfr: 55349,
-  Cfr: 8493,
-  CHcy: 1063,
-  chcy: 1095,
-  check: 10003,
-  checkmark: 10003,
-  Chi: 935,
-  chi: 967,
-  circ: 710,
-  circeq: 8791,
-  circlearrowleft: 8634,
-  circlearrowright: 8635,
-  circledast: 8859,
-  circledcirc: 8858,
-  circleddash: 8861,
-  CircleDot: 8857,
-  circledR: 174,
-  circledS: 9416,
-  CircleMinus: 8854,
-  CirclePlus: 8853,
-  CircleTimes: 8855,
-  cir: 9675,
-  cirE: 10691,
-  cire: 8791,
-  cirfnint: 10768,
-  cirmid: 10991,
-  cirscir: 10690,
-  ClockwiseContourIntegral: 8754,
-  CloseCurlyDoubleQuote: 8221,
-  CloseCurlyQuote: 8217,
-  clubs: 9827,
-  clubsuit: 9827,
-  colon: 58,
-  Colon: 8759,
-  Colone: 10868,
-  colone: 8788,
-  coloneq: 8788,
-  comma: 44,
-  commat: 64,
-  comp: 8705,
-  compfn: 8728,
-  complement: 8705,
-  complexes: 8450,
-  cong: 8773,
-  congdot: 10861,
-  Congruent: 8801,
-  conint: 8750,
-  Conint: 8751,
-  ContourIntegral: 8750,
-  copf: 55349,
-  Copf: 8450,
-  coprod: 8720,
-  Coproduct: 8720,
-  copy: 169,
-  COPY: 169,
-  copysr: 8471,
-  CounterClockwiseContourIntegral: 8755,
-  crarr: 8629,
-  cross: 10007,
-  Cross: 10799,
-  Cscr: 55349,
-  cscr: 55349,
-  csub: 10959,
-  csube: 10961,
-  csup: 10960,
-  csupe: 10962,
-  ctdot: 8943,
-  cudarrl: 10552,
-  cudarrr: 10549,
-  cuepr: 8926,
-  cuesc: 8927,
-  cularr: 8630,
-  cularrp: 10557,
-  cupbrcap: 10824,
-  cupcap: 10822,
-  CupCap: 8781,
-  cup: 8746,
-  Cup: 8915,
-  cupcup: 10826,
-  cupdot: 8845,
-  cupor: 10821,
-  cups: 8746,
-  curarr: 8631,
-  curarrm: 10556,
-  curlyeqprec: 8926,
-  curlyeqsucc: 8927,
-  curlyvee: 8910,
-  curlywedge: 8911,
-  curren: 164,
-  curvearrowleft: 8630,
-  curvearrowright: 8631,
-  cuvee: 8910,
-  cuwed: 8911,
-  cwconint: 8754,
-  cwint: 8753,
-  cylcty: 9005,
-  dagger: 8224,
-  Dagger: 8225,
-  daleth: 8504,
-  darr: 8595,
-  Darr: 8609,
-  dArr: 8659,
-  dash: 8208,
-  Dashv: 10980,
-  dashv: 8867,
-  dbkarow: 10511,
-  dblac: 733,
-  Dcaron: 270,
-  dcaron: 271,
-  Dcy: 1044,
-  dcy: 1076,
-  ddagger: 8225,
-  ddarr: 8650,
-  DD: 8517,
-  dd: 8518,
-  DDotrahd: 10513,
-  ddotseq: 10871,
-  deg: 176,
-  Del: 8711,
-  Delta: 916,
-  delta: 948,
-  demptyv: 10673,
-  dfisht: 10623,
-  Dfr: 55349,
-  dfr: 55349,
-  dHar: 10597,
-  dharl: 8643,
-  dharr: 8642,
-  DiacriticalAcute: 180,
-  DiacriticalDot: 729,
-  DiacriticalDoubleAcute: 733,
-  DiacriticalGrave: 96,
-  DiacriticalTilde: 732,
-  diam: 8900,
-  diamond: 8900,
-  Diamond: 8900,
-  diamondsuit: 9830,
-  diams: 9830,
-  die: 168,
-  DifferentialD: 8518,
-  digamma: 989,
-  disin: 8946,
-  div: 247,
-  divide: 247,
-  divideontimes: 8903,
-  divonx: 8903,
-  DJcy: 1026,
-  djcy: 1106,
-  dlcorn: 8990,
-  dlcrop: 8973,
-  dollar: 36,
-  Dopf: 55349,
-  dopf: 55349,
-  Dot: 168,
-  dot: 729,
-  DotDot: 8412,
-  doteq: 8784,
-  doteqdot: 8785,
-  DotEqual: 8784,
-  dotminus: 8760,
-  dotplus: 8724,
-  dotsquare: 8865,
-  doublebarwedge: 8966,
-  DoubleContourIntegral: 8751,
-  DoubleDot: 168,
-  DoubleDownArrow: 8659,
-  DoubleLeftArrow: 8656,
-  DoubleLeftRightArrow: 8660,
-  DoubleLeftTee: 10980,
-  DoubleLongLeftArrow: 10232,
-  DoubleLongLeftRightArrow: 10234,
-  DoubleLongRightArrow: 10233,
-  DoubleRightArrow: 8658,
-  DoubleRightTee: 8872,
-  DoubleUpArrow: 8657,
-  DoubleUpDownArrow: 8661,
-  DoubleVerticalBar: 8741,
-  DownArrowBar: 10515,
-  downarrow: 8595,
-  DownArrow: 8595,
-  Downarrow: 8659,
-  DownArrowUpArrow: 8693,
-  DownBreve: 785,
-  downdownarrows: 8650,
-  downharpoonleft: 8643,
-  downharpoonright: 8642,
-  DownLeftRightVector: 10576,
-  DownLeftTeeVector: 10590,
-  DownLeftVectorBar: 10582,
-  DownLeftVector: 8637,
-  DownRightTeeVector: 10591,
-  DownRightVectorBar: 10583,
-  DownRightVector: 8641,
-  DownTeeArrow: 8615,
-  DownTee: 8868,
-  drbkarow: 10512,
-  drcorn: 8991,
-  drcrop: 8972,
-  Dscr: 55349,
-  dscr: 55349,
-  DScy: 1029,
-  dscy: 1109,
-  dsol: 10742,
-  Dstrok: 272,
-  dstrok: 273,
-  dtdot: 8945,
-  dtri: 9663,
-  dtrif: 9662,
-  duarr: 8693,
-  duhar: 10607,
-  dwangle: 10662,
-  DZcy: 1039,
-  dzcy: 1119,
-  dzigrarr: 10239,
-  Eacute: 201,
-  eacute: 233,
-  easter: 10862,
-  Ecaron: 282,
-  ecaron: 283,
-  Ecirc: 202,
-  ecirc: 234,
-  ecir: 8790,
-  ecolon: 8789,
-  Ecy: 1069,
-  ecy: 1101,
-  eDDot: 10871,
-  Edot: 278,
-  edot: 279,
-  eDot: 8785,
-  ee: 8519,
-  efDot: 8786,
-  Efr: 55349,
-  efr: 55349,
-  eg: 10906,
-  Egrave: 200,
-  egrave: 232,
-  egs: 10902,
-  egsdot: 10904,
-  el: 10905,
-  Element: 8712,
-  elinters: 9191,
-  ell: 8467,
-  els: 10901,
-  elsdot: 10903,
-  Emacr: 274,
-  emacr: 275,
-  empty: 8709,
-  emptyset: 8709,
-  EmptySmallSquare: 9723,
-  emptyv: 8709,
-  EmptyVerySmallSquare: 9643,
-  emsp13: 8196,
-  emsp14: 8197,
-  emsp: 8195,
-  ENG: 330,
-  eng: 331,
-  ensp: 8194,
-  Eogon: 280,
-  eogon: 281,
-  Eopf: 55349,
-  eopf: 55349,
-  epar: 8917,
-  eparsl: 10723,
-  eplus: 10865,
-  epsi: 949,
-  Epsilon: 917,
-  epsilon: 949,
-  epsiv: 1013,
-  eqcirc: 8790,
-  eqcolon: 8789,
-  eqsim: 8770,
-  eqslantgtr: 10902,
-  eqslantless: 10901,
-  Equal: 10869,
-  equals: 61,
-  EqualTilde: 8770,
-  equest: 8799,
-  Equilibrium: 8652,
-  equiv: 8801,
-  equivDD: 10872,
-  eqvparsl: 10725,
-  erarr: 10609,
-  erDot: 8787,
-  escr: 8495,
-  Escr: 8496,
-  esdot: 8784,
-  Esim: 10867,
-  esim: 8770,
-  Eta: 919,
-  eta: 951,
-  ETH: 208,
-  eth: 240,
-  Euml: 203,
-  euml: 235,
-  euro: 8364,
-  excl: 33,
-  exist: 8707,
-  Exists: 8707,
-  expectation: 8496,
-  exponentiale: 8519,
-  ExponentialE: 8519,
-  fallingdotseq: 8786,
-  Fcy: 1060,
-  fcy: 1092,
-  female: 9792,
-  ffilig: 64259,
-  fflig: 64256,
-  ffllig: 64260,
-  Ffr: 55349,
-  ffr: 55349,
-  filig: 64257,
-  FilledSmallSquare: 9724,
-  FilledVerySmallSquare: 9642,
-  fjlig: 102,
-  flat: 9837,
-  fllig: 64258,
-  fltns: 9649,
-  fnof: 402,
-  Fopf: 55349,
-  fopf: 55349,
-  forall: 8704,
-  ForAll: 8704,
-  fork: 8916,
-  forkv: 10969,
-  Fouriertrf: 8497,
-  fpartint: 10765,
-  frac12: 189,
-  frac13: 8531,
-  frac14: 188,
-  frac15: 8533,
-  frac16: 8537,
-  frac18: 8539,
-  frac23: 8532,
-  frac25: 8534,
-  frac34: 190,
-  frac35: 8535,
-  frac38: 8540,
-  frac45: 8536,
-  frac56: 8538,
-  frac58: 8541,
-  frac78: 8542,
-  frasl: 8260,
-  frown: 8994,
-  fscr: 55349,
-  Fscr: 8497,
-  gacute: 501,
-  Gamma: 915,
-  gamma: 947,
-  Gammad: 988,
-  gammad: 989,
-  gap: 10886,
-  Gbreve: 286,
-  gbreve: 287,
-  Gcedil: 290,
-  Gcirc: 284,
-  gcirc: 285,
-  Gcy: 1043,
-  gcy: 1075,
-  Gdot: 288,
-  gdot: 289,
-  ge: 8805,
-  gE: 8807,
-  gEl: 10892,
-  gel: 8923,
-  geq: 8805,
-  geqq: 8807,
-  geqslant: 10878,
-  gescc: 10921,
-  ges: 10878,
-  gesdot: 10880,
-  gesdoto: 10882,
-  gesdotol: 10884,
-  gesl: 8923,
-  gesles: 10900,
-  Gfr: 55349,
-  gfr: 55349,
-  gg: 8811,
-  Gg: 8921,
-  ggg: 8921,
-  gimel: 8503,
-  GJcy: 1027,
-  gjcy: 1107,
-  gla: 10917,
-  gl: 8823,
-  glE: 10898,
-  glj: 10916,
-  gnap: 10890,
-  gnapprox: 10890,
-  gne: 10888,
-  gnE: 8809,
-  gneq: 10888,
-  gneqq: 8809,
-  gnsim: 8935,
-  Gopf: 55349,
-  gopf: 55349,
-  grave: 96,
-  GreaterEqual: 8805,
-  GreaterEqualLess: 8923,
-  GreaterFullEqual: 8807,
-  GreaterGreater: 10914,
-  GreaterLess: 8823,
-  GreaterSlantEqual: 10878,
-  GreaterTilde: 8819,
-  Gscr: 55349,
-  gscr: 8458,
-  gsim: 8819,
-  gsime: 10894,
-  gsiml: 10896,
-  gtcc: 10919,
-  gtcir: 10874,
-  gt: 62,
-  GT: 62,
-  Gt: 8811,
-  gtdot: 8919,
-  gtlPar: 10645,
-  gtquest: 10876,
-  gtrapprox: 10886,
-  gtrarr: 10616,
-  gtrdot: 8919,
-  gtreqless: 8923,
-  gtreqqless: 10892,
-  gtrless: 8823,
-  gtrsim: 8819,
-  gvertneqq: 8809,
-  gvnE: 8809,
-  Hacek: 711,
-  hairsp: 8202,
-  half: 189,
-  hamilt: 8459,
-  HARDcy: 1066,
-  hardcy: 1098,
-  harrcir: 10568,
-  harr: 8596,
-  hArr: 8660,
-  harrw: 8621,
-  Hat: 94,
-  hbar: 8463,
-  Hcirc: 292,
-  hcirc: 293,
-  hearts: 9829,
-  heartsuit: 9829,
-  hellip: 8230,
-  hercon: 8889,
-  hfr: 55349,
-  Hfr: 8460,
-  HilbertSpace: 8459,
-  hksearow: 10533,
-  hkswarow: 10534,
-  hoarr: 8703,
-  homtht: 8763,
-  hookleftarrow: 8617,
-  hookrightarrow: 8618,
-  hopf: 55349,
-  Hopf: 8461,
-  horbar: 8213,
-  HorizontalLine: 9472,
-  hscr: 55349,
-  Hscr: 8459,
-  hslash: 8463,
-  Hstrok: 294,
-  hstrok: 295,
-  HumpDownHump: 8782,
-  HumpEqual: 8783,
-  hybull: 8259,
-  hyphen: 8208,
-  Iacute: 205,
-  iacute: 237,
-  ic: 8291,
-  Icirc: 206,
-  icirc: 238,
-  Icy: 1048,
-  icy: 1080,
-  Idot: 304,
-  IEcy: 1045,
-  iecy: 1077,
-  iexcl: 161,
-  iff: 8660,
-  ifr: 55349,
-  Ifr: 8465,
-  Igrave: 204,
-  igrave: 236,
-  ii: 8520,
-  iiiint: 10764,
-  iiint: 8749,
-  iinfin: 10716,
-  iiota: 8489,
-  IJlig: 306,
-  ijlig: 307,
-  Imacr: 298,
-  imacr: 299,
-  image: 8465,
-  ImaginaryI: 8520,
-  imagline: 8464,
-  imagpart: 8465,
-  imath: 305,
-  Im: 8465,
-  imof: 8887,
-  imped: 437,
-  Implies: 8658,
-  incare: 8453,
-  'in': 8712,
-  infin: 8734,
-  infintie: 10717,
-  inodot: 305,
-  intcal: 8890,
-  int: 8747,
-  Int: 8748,
-  integers: 8484,
-  Integral: 8747,
-  intercal: 8890,
-  Intersection: 8898,
-  intlarhk: 10775,
-  intprod: 10812,
-  InvisibleComma: 8291,
-  InvisibleTimes: 8290,
-  IOcy: 1025,
-  iocy: 1105,
-  Iogon: 302,
-  iogon: 303,
-  Iopf: 55349,
-  iopf: 55349,
-  Iota: 921,
-  iota: 953,
-  iprod: 10812,
-  iquest: 191,
-  iscr: 55349,
-  Iscr: 8464,
-  isin: 8712,
-  isindot: 8949,
-  isinE: 8953,
-  isins: 8948,
-  isinsv: 8947,
-  isinv: 8712,
-  it: 8290,
-  Itilde: 296,
-  itilde: 297,
-  Iukcy: 1030,
-  iukcy: 1110,
-  Iuml: 207,
-  iuml: 239,
-  Jcirc: 308,
-  jcirc: 309,
-  Jcy: 1049,
-  jcy: 1081,
-  Jfr: 55349,
-  jfr: 55349,
-  jmath: 567,
-  Jopf: 55349,
-  jopf: 55349,
-  Jscr: 55349,
-  jscr: 55349,
-  Jsercy: 1032,
-  jsercy: 1112,
-  Jukcy: 1028,
-  jukcy: 1108,
-  Kappa: 922,
-  kappa: 954,
-  kappav: 1008,
-  Kcedil: 310,
-  kcedil: 311,
-  Kcy: 1050,
-  kcy: 1082,
-  Kfr: 55349,
-  kfr: 55349,
-  kgreen: 312,
-  KHcy: 1061,
-  khcy: 1093,
-  KJcy: 1036,
-  kjcy: 1116,
-  Kopf: 55349,
-  kopf: 55349,
-  Kscr: 55349,
-  kscr: 55349,
-  lAarr: 8666,
-  Lacute: 313,
-  lacute: 314,
-  laemptyv: 10676,
-  lagran: 8466,
-  Lambda: 923,
-  lambda: 955,
-  lang: 10216,
-  Lang: 10218,
-  langd: 10641,
-  langle: 10216,
-  lap: 10885,
-  Laplacetrf: 8466,
-  laquo: 171,
-  larrb: 8676,
-  larrbfs: 10527,
-  larr: 8592,
-  Larr: 8606,
-  lArr: 8656,
-  larrfs: 10525,
-  larrhk: 8617,
-  larrlp: 8619,
-  larrpl: 10553,
-  larrsim: 10611,
-  larrtl: 8610,
-  latail: 10521,
-  lAtail: 10523,
-  lat: 10923,
-  late: 10925,
-  lates: 10925,
-  lbarr: 10508,
-  lBarr: 10510,
-  lbbrk: 10098,
-  lbrace: 123,
-  lbrack: 91,
-  lbrke: 10635,
-  lbrksld: 10639,
-  lbrkslu: 10637,
-  Lcaron: 317,
-  lcaron: 318,
-  Lcedil: 315,
-  lcedil: 316,
-  lceil: 8968,
-  lcub: 123,
-  Lcy: 1051,
-  lcy: 1083,
-  ldca: 10550,
-  ldquo: 8220,
-  ldquor: 8222,
-  ldrdhar: 10599,
-  ldrushar: 10571,
-  ldsh: 8626,
-  le: 8804,
-  lE: 8806,
-  LeftAngleBracket: 10216,
-  LeftArrowBar: 8676,
-  leftarrow: 8592,
-  LeftArrow: 8592,
-  Leftarrow: 8656,
-  LeftArrowRightArrow: 8646,
-  leftarrowtail: 8610,
-  LeftCeiling: 8968,
-  LeftDoubleBracket: 10214,
-  LeftDownTeeVector: 10593,
-  LeftDownVectorBar: 10585,
-  LeftDownVector: 8643,
-  LeftFloor: 8970,
-  leftharpoondown: 8637,
-  leftharpoonup: 8636,
-  leftleftarrows: 8647,
-  leftrightarrow: 8596,
-  LeftRightArrow: 8596,
-  Leftrightarrow: 8660,
-  leftrightarrows: 8646,
-  leftrightharpoons: 8651,
-  leftrightsquigarrow: 8621,
-  LeftRightVector: 10574,
-  LeftTeeArrow: 8612,
-  LeftTee: 8867,
-  LeftTeeVector: 10586,
-  leftthreetimes: 8907,
-  LeftTriangleBar: 10703,
-  LeftTriangle: 8882,
-  LeftTriangleEqual: 8884,
-  LeftUpDownVector: 10577,
-  LeftUpTeeVector: 10592,
-  LeftUpVectorBar: 10584,
-  LeftUpVector: 8639,
-  LeftVectorBar: 10578,
-  LeftVector: 8636,
-  lEg: 10891,
-  leg: 8922,
-  leq: 8804,
-  leqq: 8806,
-  leqslant: 10877,
-  lescc: 10920,
-  les: 10877,
-  lesdot: 10879,
-  lesdoto: 10881,
-  lesdotor: 10883,
-  lesg: 8922,
-  lesges: 10899,
-  lessapprox: 10885,
-  lessdot: 8918,
-  lesseqgtr: 8922,
-  lesseqqgtr: 10891,
-  LessEqualGreater: 8922,
-  LessFullEqual: 8806,
-  LessGreater: 8822,
-  lessgtr: 8822,
-  LessLess: 10913,
-  lesssim: 8818,
-  LessSlantEqual: 10877,
-  LessTilde: 8818,
-  lfisht: 10620,
-  lfloor: 8970,
-  Lfr: 55349,
-  lfr: 55349,
-  lg: 8822,
-  lgE: 10897,
-  lHar: 10594,
-  lhard: 8637,
-  lharu: 8636,
-  lharul: 10602,
-  lhblk: 9604,
-  LJcy: 1033,
-  ljcy: 1113,
-  llarr: 8647,
-  ll: 8810,
-  Ll: 8920,
-  llcorner: 8990,
-  Lleftarrow: 8666,
-  llhard: 10603,
-  lltri: 9722,
-  Lmidot: 319,
-  lmidot: 320,
-  lmoustache: 9136,
-  lmoust: 9136,
-  lnap: 10889,
-  lnapprox: 10889,
-  lne: 10887,
-  lnE: 8808,
-  lneq: 10887,
-  lneqq: 8808,
-  lnsim: 8934,
-  loang: 10220,
-  loarr: 8701,
-  lobrk: 10214,
-  longleftarrow: 10229,
-  LongLeftArrow: 10229,
-  Longleftarrow: 10232,
-  longleftrightarrow: 10231,
-  LongLeftRightArrow: 10231,
-  Longleftrightarrow: 10234,
-  longmapsto: 10236,
-  longrightarrow: 10230,
-  LongRightArrow: 10230,
-  Longrightarrow: 10233,
-  looparrowleft: 8619,
-  looparrowright: 8620,
-  lopar: 10629,
-  Lopf: 55349,
-  lopf: 55349,
-  loplus: 10797,
-  lotimes: 10804,
-  lowast: 8727,
-  lowbar: 95,
-  LowerLeftArrow: 8601,
-  LowerRightArrow: 8600,
-  loz: 9674,
-  lozenge: 9674,
-  lozf: 10731,
-  lpar: 40,
-  lparlt: 10643,
-  lrarr: 8646,
-  lrcorner: 8991,
-  lrhar: 8651,
-  lrhard: 10605,
-  lrm: 8206,
-  lrtri: 8895,
-  lsaquo: 8249,
-  lscr: 55349,
-  Lscr: 8466,
-  lsh: 8624,
-  Lsh: 8624,
-  lsim: 8818,
-  lsime: 10893,
-  lsimg: 10895,
-  lsqb: 91,
-  lsquo: 8216,
-  lsquor: 8218,
-  Lstrok: 321,
-  lstrok: 322,
-  ltcc: 10918,
-  ltcir: 10873,
-  lt: 60,
-  LT: 60,
-  Lt: 8810,
-  ltdot: 8918,
-  lthree: 8907,
-  ltimes: 8905,
-  ltlarr: 10614,
-  ltquest: 10875,
-  ltri: 9667,
-  ltrie: 8884,
-  ltrif: 9666,
-  ltrPar: 10646,
-  lurdshar: 10570,
-  luruhar: 10598,
-  lvertneqq: 8808,
-  lvnE: 8808,
-  macr: 175,
-  male: 9794,
-  malt: 10016,
-  maltese: 10016,
-  Map: 10501,
-  map: 8614,
-  mapsto: 8614,
-  mapstodown: 8615,
-  mapstoleft: 8612,
-  mapstoup: 8613,
-  marker: 9646,
-  mcomma: 10793,
-  Mcy: 1052,
-  mcy: 1084,
-  mdash: 8212,
-  mDDot: 8762,
-  measuredangle: 8737,
-  MediumSpace: 8287,
-  Mellintrf: 8499,
-  Mfr: 55349,
-  mfr: 55349,
-  mho: 8487,
-  micro: 181,
-  midast: 42,
-  midcir: 10992,
-  mid: 8739,
-  middot: 183,
-  minusb: 8863,
-  minus: 8722,
-  minusd: 8760,
-  minusdu: 10794,
-  MinusPlus: 8723,
-  mlcp: 10971,
-  mldr: 8230,
-  mnplus: 8723,
-  models: 8871,
-  Mopf: 55349,
-  mopf: 55349,
-  mp: 8723,
-  mscr: 55349,
-  Mscr: 8499,
-  mstpos: 8766,
-  Mu: 924,
-  mu: 956,
-  multimap: 8888,
-  mumap: 8888,
-  nabla: 8711,
-  Nacute: 323,
-  nacute: 324,
-  nang: 8736,
-  nap: 8777,
-  napE: 10864,
-  napid: 8779,
-  napos: 329,
-  napprox: 8777,
-  natural: 9838,
-  naturals: 8469,
-  natur: 9838,
-  nbsp: 160,
-  nbump: 8782,
-  nbumpe: 8783,
-  ncap: 10819,
-  Ncaron: 327,
-  ncaron: 328,
-  Ncedil: 325,
-  ncedil: 326,
-  ncong: 8775,
-  ncongdot: 10861,
-  ncup: 10818,
-  Ncy: 1053,
-  ncy: 1085,
-  ndash: 8211,
-  nearhk: 10532,
-  nearr: 8599,
-  neArr: 8663,
-  nearrow: 8599,
-  ne: 8800,
-  nedot: 8784,
-  NegativeMediumSpace: 8203,
-  NegativeThickSpace: 8203,
-  NegativeThinSpace: 8203,
-  NegativeVeryThinSpace: 8203,
-  nequiv: 8802,
-  nesear: 10536,
-  nesim: 8770,
-  NestedGreaterGreater: 8811,
-  NestedLessLess: 8810,
-  NewLine: 10,
-  nexist: 8708,
-  nexists: 8708,
-  Nfr: 55349,
-  nfr: 55349,
-  ngE: 8807,
-  nge: 8817,
-  ngeq: 8817,
-  ngeqq: 8807,
-  ngeqslant: 10878,
-  nges: 10878,
-  nGg: 8921,
-  ngsim: 8821,
-  nGt: 8811,
-  ngt: 8815,
-  ngtr: 8815,
-  nGtv: 8811,
-  nharr: 8622,
-  nhArr: 8654,
-  nhpar: 10994,
-  ni: 8715,
-  nis: 8956,
-  nisd: 8954,
-  niv: 8715,
-  NJcy: 1034,
-  njcy: 1114,
-  nlarr: 8602,
-  nlArr: 8653,
-  nldr: 8229,
-  nlE: 8806,
-  nle: 8816,
-  nleftarrow: 8602,
-  nLeftarrow: 8653,
-  nleftrightarrow: 8622,
-  nLeftrightarrow: 8654,
-  nleq: 8816,
-  nleqq: 8806,
-  nleqslant: 10877,
-  nles: 10877,
-  nless: 8814,
-  nLl: 8920,
-  nlsim: 8820,
-  nLt: 8810,
-  nlt: 8814,
-  nltri: 8938,
-  nltrie: 8940,
-  nLtv: 8810,
-  nmid: 8740,
-  NoBreak: 8288,
-  NonBreakingSpace: 160,
-  nopf: 55349,
-  Nopf: 8469,
-  Not: 10988,
-  not: 172,
-  NotCongruent: 8802,
-  NotCupCap: 8813,
-  NotDoubleVerticalBar: 8742,
-  NotElement: 8713,
-  NotEqual: 8800,
-  NotEqualTilde: 8770,
-  NotExists: 8708,
-  NotGreater: 8815,
-  NotGreaterEqual: 8817,
-  NotGreaterFullEqual: 8807,
-  NotGreaterGreater: 8811,
-  NotGreaterLess: 8825,
-  NotGreaterSlantEqual: 10878,
-  NotGreaterTilde: 8821,
-  NotHumpDownHump: 8782,
-  NotHumpEqual: 8783,
-  notin: 8713,
-  notindot: 8949,
-  notinE: 8953,
-  notinva: 8713,
-  notinvb: 8951,
-  notinvc: 8950,
-  NotLeftTriangleBar: 10703,
-  NotLeftTriangle: 8938,
-  NotLeftTriangleEqual: 8940,
-  NotLess: 8814,
-  NotLessEqual: 8816,
-  NotLessGreater: 8824,
-  NotLessLess: 8810,
-  NotLessSlantEqual: 10877,
-  NotLessTilde: 8820,
-  NotNestedGreaterGreater: 10914,
-  NotNestedLessLess: 10913,
-  notni: 8716,
-  notniva: 8716,
-  notnivb: 8958,
-  notnivc: 8957,
-  NotPrecedes: 8832,
-  NotPrecedesEqual: 10927,
-  NotPrecedesSlantEqual: 8928,
-  NotReverseElement: 8716,
-  NotRightTriangleBar: 10704,
-  NotRightTriangle: 8939,
-  NotRightTriangleEqual: 8941,
-  NotSquareSubset: 8847,
-  NotSquareSubsetEqual: 8930,
-  NotSquareSuperset: 8848,
-  NotSquareSupersetEqual: 8931,
-  NotSubset: 8834,
-  NotSubsetEqual: 8840,
-  NotSucceeds: 8833,
-  NotSucceedsEqual: 10928,
-  NotSucceedsSlantEqual: 8929,
-  NotSucceedsTilde: 8831,
-  NotSuperset: 8835,
-  NotSupersetEqual: 8841,
-  NotTilde: 8769,
-  NotTildeEqual: 8772,
-  NotTildeFullEqual: 8775,
-  NotTildeTilde: 8777,
-  NotVerticalBar: 8740,
-  nparallel: 8742,
-  npar: 8742,
-  nparsl: 11005,
-  npart: 8706,
-  npolint: 10772,
-  npr: 8832,
-  nprcue: 8928,
-  nprec: 8832,
-  npreceq: 10927,
-  npre: 10927,
-  nrarrc: 10547,
-  nrarr: 8603,
-  nrArr: 8655,
-  nrarrw: 8605,
-  nrightarrow: 8603,
-  nRightarrow: 8655,
-  nrtri: 8939,
-  nrtrie: 8941,
-  nsc: 8833,
-  nsccue: 8929,
-  nsce: 10928,
-  Nscr: 55349,
-  nscr: 55349,
-  nshortmid: 8740,
-  nshortparallel: 8742,
-  nsim: 8769,
-  nsime: 8772,
-  nsimeq: 8772,
-  nsmid: 8740,
-  nspar: 8742,
-  nsqsube: 8930,
-  nsqsupe: 8931,
-  nsub: 8836,
-  nsubE: 10949,
-  nsube: 8840,
-  nsubset: 8834,
-  nsubseteq: 8840,
-  nsubseteqq: 10949,
-  nsucc: 8833,
-  nsucceq: 10928,
-  nsup: 8837,
-  nsupE: 10950,
-  nsupe: 8841,
-  nsupset: 8835,
-  nsupseteq: 8841,
-  nsupseteqq: 10950,
-  ntgl: 8825,
-  Ntilde: 209,
-  ntilde: 241,
-  ntlg: 8824,
-  ntriangleleft: 8938,
-  ntrianglelefteq: 8940,
-  ntriangleright: 8939,
-  ntrianglerighteq: 8941,
-  Nu: 925,
-  nu: 957,
-  num: 35,
-  numero: 8470,
-  numsp: 8199,
-  nvap: 8781,
-  nvdash: 8876,
-  nvDash: 8877,
-  nVdash: 8878,
-  nVDash: 8879,
-  nvge: 8805,
-  nvgt: 62,
-  nvHarr: 10500,
-  nvinfin: 10718,
-  nvlArr: 10498,
-  nvle: 8804,
-  nvlt: 62,
-  nvltrie: 8884,
-  nvrArr: 10499,
-  nvrtrie: 8885,
-  nvsim: 8764,
-  nwarhk: 10531,
-  nwarr: 8598,
-  nwArr: 8662,
-  nwarrow: 8598,
-  nwnear: 10535,
-  Oacute: 211,
-  oacute: 243,
-  oast: 8859,
-  Ocirc: 212,
-  ocirc: 244,
-  ocir: 8858,
-  Ocy: 1054,
-  ocy: 1086,
-  odash: 8861,
-  Odblac: 336,
-  odblac: 337,
-  odiv: 10808,
-  odot: 8857,
-  odsold: 10684,
-  OElig: 338,
-  oelig: 339,
-  ofcir: 10687,
-  Ofr: 55349,
-  ofr: 55349,
-  ogon: 731,
-  Ograve: 210,
-  ograve: 242,
-  ogt: 10689,
-  ohbar: 10677,
-  ohm: 937,
-  oint: 8750,
-  olarr: 8634,
-  olcir: 10686,
-  olcross: 10683,
-  oline: 8254,
-  olt: 10688,
-  Omacr: 332,
-  omacr: 333,
-  Omega: 937,
-  omega: 969,
-  Omicron: 927,
-  omicron: 959,
-  omid: 10678,
-  ominus: 8854,
-  Oopf: 55349,
-  oopf: 55349,
-  opar: 10679,
-  OpenCurlyDoubleQuote: 8220,
-  OpenCurlyQuote: 8216,
-  operp: 10681,
-  oplus: 8853,
-  orarr: 8635,
-  Or: 10836,
-  or: 8744,
-  ord: 10845,
-  order: 8500,
-  orderof: 8500,
-  ordf: 170,
-  ordm: 186,
-  origof: 8886,
-  oror: 10838,
-  orslope: 10839,
-  orv: 10843,
-  oS: 9416,
-  Oscr: 55349,
-  oscr: 8500,
-  Oslash: 216,
-  oslash: 248,
-  osol: 8856,
-  Otilde: 213,
-  otilde: 245,
-  otimesas: 10806,
-  Otimes: 10807,
-  otimes: 8855,
-  Ouml: 214,
-  ouml: 246,
-  ovbar: 9021,
-  OverBar: 8254,
-  OverBrace: 9182,
-  OverBracket: 9140,
-  OverParenthesis: 9180,
-  para: 182,
-  parallel: 8741,
-  par: 8741,
-  parsim: 10995,
-  parsl: 11005,
-  part: 8706,
-  PartialD: 8706,
-  Pcy: 1055,
-  pcy: 1087,
-  percnt: 37,
-  period: 46,
-  permil: 8240,
-  perp: 8869,
-  pertenk: 8241,
-  Pfr: 55349,
-  pfr: 55349,
-  Phi: 934,
-  phi: 966,
-  phiv: 981,
-  phmmat: 8499,
-  phone: 9742,
-  Pi: 928,
-  pi: 960,
-  pitchfork: 8916,
-  piv: 982,
-  planck: 8463,
-  planckh: 8462,
-  plankv: 8463,
-  plusacir: 10787,
-  plusb: 8862,
-  pluscir: 10786,
-  plus: 43,
-  plusdo: 8724,
-  plusdu: 10789,
-  pluse: 10866,
-  PlusMinus: 177,
-  plusmn: 177,
-  plussim: 10790,
-  plustwo: 10791,
-  pm: 177,
-  Poincareplane: 8460,
-  pointint: 10773,
-  popf: 55349,
-  Popf: 8473,
-  pound: 163,
-  prap: 10935,
-  Pr: 10939,
-  pr: 8826,
-  prcue: 8828,
-  precapprox: 10935,
-  prec: 8826,
-  preccurlyeq: 8828,
-  Precedes: 8826,
-  PrecedesEqual: 10927,
-  PrecedesSlantEqual: 8828,
-  PrecedesTilde: 8830,
-  preceq: 10927,
-  precnapprox: 10937,
-  precneqq: 10933,
-  precnsim: 8936,
-  pre: 10927,
-  prE: 10931,
-  precsim: 8830,
-  prime: 8242,
-  Prime: 8243,
-  primes: 8473,
-  prnap: 10937,
-  prnE: 10933,
-  prnsim: 8936,
-  prod: 8719,
-  Product: 8719,
-  profalar: 9006,
-  profline: 8978,
-  profsurf: 8979,
-  prop: 8733,
-  Proportional: 8733,
-  Proportion: 8759,
-  propto: 8733,
-  prsim: 8830,
-  prurel: 8880,
-  Pscr: 55349,
-  pscr: 55349,
-  Psi: 936,
-  psi: 968,
-  puncsp: 8200,
-  Qfr: 55349,
-  qfr: 55349,
-  qint: 10764,
-  qopf: 55349,
-  Qopf: 8474,
-  qprime: 8279,
-  Qscr: 55349,
-  qscr: 55349,
-  quaternions: 8461,
-  quatint: 10774,
-  quest: 63,
-  questeq: 8799,
-  quot: 34,
-  QUOT: 34,
-  rAarr: 8667,
-  race: 8765,
-  Racute: 340,
-  racute: 341,
-  radic: 8730,
-  raemptyv: 10675,
-  rang: 10217,
-  Rang: 10219,
-  rangd: 10642,
-  range: 10661,
-  rangle: 10217,
-  raquo: 187,
-  rarrap: 10613,
-  rarrb: 8677,
-  rarrbfs: 10528,
-  rarrc: 10547,
-  rarr: 8594,
-  Rarr: 8608,
-  rArr: 8658,
-  rarrfs: 10526,
-  rarrhk: 8618,
-  rarrlp: 8620,
-  rarrpl: 10565,
-  rarrsim: 10612,
-  Rarrtl: 10518,
-  rarrtl: 8611,
-  rarrw: 8605,
-  ratail: 10522,
-  rAtail: 10524,
-  ratio: 8758,
-  rationals: 8474,
-  rbarr: 10509,
-  rBarr: 10511,
-  RBarr: 10512,
-  rbbrk: 10099,
-  rbrace: 125,
-  rbrack: 93,
-  rbrke: 10636,
-  rbrksld: 10638,
-  rbrkslu: 10640,
-  Rcaron: 344,
-  rcaron: 345,
-  Rcedil: 342,
-  rcedil: 343,
-  rceil: 8969,
-  rcub: 125,
-  Rcy: 1056,
-  rcy: 1088,
-  rdca: 10551,
-  rdldhar: 10601,
-  rdquo: 8221,
-  rdquor: 8221,
-  rdsh: 8627,
-  real: 8476,
-  realine: 8475,
-  realpart: 8476,
-  reals: 8477,
-  Re: 8476,
-  rect: 9645,
-  reg: 174,
-  REG: 174,
-  ReverseElement: 8715,
-  ReverseEquilibrium: 8651,
-  ReverseUpEquilibrium: 10607,
-  rfisht: 10621,
-  rfloor: 8971,
-  rfr: 55349,
-  Rfr: 8476,
-  rHar: 10596,
-  rhard: 8641,
-  rharu: 8640,
-  rharul: 10604,
-  Rho: 929,
-  rho: 961,
-  rhov: 1009,
-  RightAngleBracket: 10217,
-  RightArrowBar: 8677,
-  rightarrow: 8594,
-  RightArrow: 8594,
-  Rightarrow: 8658,
-  RightArrowLeftArrow: 8644,
-  rightarrowtail: 8611,
-  RightCeiling: 8969,
-  RightDoubleBracket: 10215,
-  RightDownTeeVector: 10589,
-  RightDownVectorBar: 10581,
-  RightDownVector: 8642,
-  RightFloor: 8971,
-  rightharpoondown: 8641,
-  rightharpoonup: 8640,
-  rightleftarrows: 8644,
-  rightleftharpoons: 8652,
-  rightrightarrows: 8649,
-  rightsquigarrow: 8605,
-  RightTeeArrow: 8614,
-  RightTee: 8866,
-  RightTeeVector: 10587,
-  rightthreetimes: 8908,
-  RightTriangleBar: 10704,
-  RightTriangle: 8883,
-  RightTriangleEqual: 8885,
-  RightUpDownVector: 10575,
-  RightUpTeeVector: 10588,
-  RightUpVectorBar: 10580,
-  RightUpVector: 8638,
-  RightVectorBar: 10579,
-  RightVector: 8640,
-  ring: 730,
-  risingdotseq: 8787,
-  rlarr: 8644,
-  rlhar: 8652,
-  rlm: 8207,
-  rmoustache: 9137,
-  rmoust: 9137,
-  rnmid: 10990,
-  roang: 10221,
-  roarr: 8702,
-  robrk: 10215,
-  ropar: 10630,
-  ropf: 55349,
-  Ropf: 8477,
-  roplus: 10798,
-  rotimes: 10805,
-  RoundImplies: 10608,
-  rpar: 41,
-  rpargt: 10644,
-  rppolint: 10770,
-  rrarr: 8649,
-  Rrightarrow: 8667,
-  rsaquo: 8250,
-  rscr: 55349,
-  Rscr: 8475,
-  rsh: 8625,
-  Rsh: 8625,
-  rsqb: 93,
-  rsquo: 8217,
-  rsquor: 8217,
-  rthree: 8908,
-  rtimes: 8906,
-  rtri: 9657,
-  rtrie: 8885,
-  rtrif: 9656,
-  rtriltri: 10702,
-  RuleDelayed: 10740,
-  ruluhar: 10600,
-  rx: 8478,
-  Sacute: 346,
-  sacute: 347,
-  sbquo: 8218,
-  scap: 10936,
-  Scaron: 352,
-  scaron: 353,
-  Sc: 10940,
-  sc: 8827,
-  sccue: 8829,
-  sce: 10928,
-  scE: 10932,
-  Scedil: 350,
-  scedil: 351,
-  Scirc: 348,
-  scirc: 349,
-  scnap: 10938,
-  scnE: 10934,
-  scnsim: 8937,
-  scpolint: 10771,
-  scsim: 8831,
-  Scy: 1057,
-  scy: 1089,
-  sdotb: 8865,
-  sdot: 8901,
-  sdote: 10854,
-  searhk: 10533,
-  searr: 8600,
-  seArr: 8664,
-  searrow: 8600,
-  sect: 167,
-  semi: 59,
-  seswar: 10537,
-  setminus: 8726,
-  setmn: 8726,
-  sext: 10038,
-  Sfr: 55349,
-  sfr: 55349,
-  sfrown: 8994,
-  sharp: 9839,
-  SHCHcy: 1065,
-  shchcy: 1097,
-  SHcy: 1064,
-  shcy: 1096,
-  ShortDownArrow: 8595,
-  ShortLeftArrow: 8592,
-  shortmid: 8739,
-  shortparallel: 8741,
-  ShortRightArrow: 8594,
-  ShortUpArrow: 8593,
-  shy: 173,
-  Sigma: 931,
-  sigma: 963,
-  sigmaf: 962,
-  sigmav: 962,
-  sim: 8764,
-  simdot: 10858,
-  sime: 8771,
-  simeq: 8771,
-  simg: 10910,
-  simgE: 10912,
-  siml: 10909,
-  simlE: 10911,
-  simne: 8774,
-  simplus: 10788,
-  simrarr: 10610,
-  slarr: 8592,
-  SmallCircle: 8728,
-  smallsetminus: 8726,
-  smashp: 10803,
-  smeparsl: 10724,
-  smid: 8739,
-  smile: 8995,
-  smt: 10922,
-  smte: 10924,
-  smtes: 10924,
-  SOFTcy: 1068,
-  softcy: 1100,
-  solbar: 9023,
-  solb: 10692,
-  sol: 47,
-  Sopf: 55349,
-  sopf: 55349,
-  spades: 9824,
-  spadesuit: 9824,
-  spar: 8741,
-  sqcap: 8851,
-  sqcaps: 8851,
-  sqcup: 8852,
-  sqcups: 8852,
-  Sqrt: 8730,
-  sqsub: 8847,
-  sqsube: 8849,
-  sqsubset: 8847,
-  sqsubseteq: 8849,
-  sqsup: 8848,
-  sqsupe: 8850,
-  sqsupset: 8848,
-  sqsupseteq: 8850,
-  square: 9633,
-  Square: 9633,
-  SquareIntersection: 8851,
-  SquareSubset: 8847,
-  SquareSubsetEqual: 8849,
-  SquareSuperset: 8848,
-  SquareSupersetEqual: 8850,
-  SquareUnion: 8852,
-  squarf: 9642,
-  squ: 9633,
-  squf: 9642,
-  srarr: 8594,
-  Sscr: 55349,
-  sscr: 55349,
-  ssetmn: 8726,
-  ssmile: 8995,
-  sstarf: 8902,
-  Star: 8902,
-  star: 9734,
-  starf: 9733,
-  straightepsilon: 1013,
-  straightphi: 981,
-  strns: 175,
-  sub: 8834,
-  Sub: 8912,
-  subdot: 10941,
-  subE: 10949,
-  sube: 8838,
-  subedot: 10947,
-  submult: 10945,
-  subnE: 10955,
-  subne: 8842,
-  subplus: 10943,
-  subrarr: 10617,
-  subset: 8834,
-  Subset: 8912,
-  subseteq: 8838,
-  subseteqq: 10949,
-  SubsetEqual: 8838,
-  subsetneq: 8842,
-  subsetneqq: 10955,
-  subsim: 10951,
-  subsub: 10965,
-  subsup: 10963,
-  succapprox: 10936,
-  succ: 8827,
-  succcurlyeq: 8829,
-  Succeeds: 8827,
-  SucceedsEqual: 10928,
-  SucceedsSlantEqual: 8829,
-  SucceedsTilde: 8831,
-  succeq: 10928,
-  succnapprox: 10938,
-  succneqq: 10934,
-  succnsim: 8937,
-  succsim: 8831,
-  SuchThat: 8715,
-  sum: 8721,
-  Sum: 8721,
-  sung: 9834,
-  sup1: 185,
-  sup2: 178,
-  sup3: 179,
-  sup: 8835,
-  Sup: 8913,
-  supdot: 10942,
-  supdsub: 10968,
-  supE: 10950,
-  supe: 8839,
-  supedot: 10948,
-  Superset: 8835,
-  SupersetEqual: 8839,
-  suphsol: 10185,
-  suphsub: 10967,
-  suplarr: 10619,
-  supmult: 10946,
-  supnE: 10956,
-  supne: 8843,
-  supplus: 10944,
-  supset: 8835,
-  Supset: 8913,
-  supseteq: 8839,
-  supseteqq: 10950,
-  supsetneq: 8843,
-  supsetneqq: 10956,
-  supsim: 10952,
-  supsub: 10964,
-  supsup: 10966,
-  swarhk: 10534,
-  swarr: 8601,
-  swArr: 8665,
-  swarrow: 8601,
-  swnwar: 10538,
-  szlig: 223,
-  Tab: NaN,
-  target: 8982,
-  Tau: 932,
-  tau: 964,
-  tbrk: 9140,
-  Tcaron: 356,
-  tcaron: 357,
-  Tcedil: 354,
-  tcedil: 355,
-  Tcy: 1058,
-  tcy: 1090,
-  tdot: 8411,
-  telrec: 8981,
-  Tfr: 55349,
-  tfr: 55349,
-  there4: 8756,
-  therefore: 8756,
-  Therefore: 8756,
-  Theta: 920,
-  theta: 952,
-  thetasym: 977,
-  thetav: 977,
-  thickapprox: 8776,
-  thicksim: 8764,
-  ThickSpace: 8287,
-  ThinSpace: 8201,
-  thinsp: 8201,
-  thkap: 8776,
-  thksim: 8764,
-  THORN: 222,
-  thorn: 254,
-  tilde: 732,
-  Tilde: 8764,
-  TildeEqual: 8771,
-  TildeFullEqual: 8773,
-  TildeTilde: 8776,
-  timesbar: 10801,
-  timesb: 8864,
-  times: 215,
-  timesd: 10800,
-  tint: 8749,
-  toea: 10536,
-  topbot: 9014,
-  topcir: 10993,
-  top: 8868,
-  Topf: 55349,
-  topf: 55349,
-  topfork: 10970,
-  tosa: 10537,
-  tprime: 8244,
-  trade: 8482,
-  TRADE: 8482,
-  triangle: 9653,
-  triangledown: 9663,
-  triangleleft: 9667,
-  trianglelefteq: 8884,
-  triangleq: 8796,
-  triangleright: 9657,
-  trianglerighteq: 8885,
-  tridot: 9708,
-  trie: 8796,
-  triminus: 10810,
-  TripleDot: 8411,
-  triplus: 10809,
-  trisb: 10701,
-  tritime: 10811,
-  trpezium: 9186,
-  Tscr: 55349,
-  tscr: 55349,
-  TScy: 1062,
-  tscy: 1094,
-  TSHcy: 1035,
-  tshcy: 1115,
-  Tstrok: 358,
-  tstrok: 359,
-  twixt: 8812,
-  twoheadleftarrow: 8606,
-  twoheadrightarrow: 8608,
-  Uacute: 218,
-  uacute: 250,
-  uarr: 8593,
-  Uarr: 8607,
-  uArr: 8657,
-  Uarrocir: 10569,
-  Ubrcy: 1038,
-  ubrcy: 1118,
-  Ubreve: 364,
-  ubreve: 365,
-  Ucirc: 219,
-  ucirc: 251,
-  Ucy: 1059,
-  ucy: 1091,
-  udarr: 8645,
-  Udblac: 368,
-  udblac: 369,
-  udhar: 10606,
-  ufisht: 10622,
-  Ufr: 55349,
-  ufr: 55349,
-  Ugrave: 217,
-  ugrave: 249,
-  uHar: 10595,
-  uharl: 8639,
-  uharr: 8638,
-  uhblk: 9600,
-  ulcorn: 8988,
-  ulcorner: 8988,
-  ulcrop: 8975,
-  ultri: 9720,
-  Umacr: 362,
-  umacr: 363,
-  uml: 168,
-  UnderBar: 95,
-  UnderBrace: 9183,
-  UnderBracket: 9141,
-  UnderParenthesis: 9181,
-  Union: 8899,
-  UnionPlus: 8846,
-  Uogon: 370,
-  uogon: 371,
-  Uopf: 55349,
-  uopf: 55349,
-  UpArrowBar: 10514,
-  uparrow: 8593,
-  UpArrow: 8593,
-  Uparrow: 8657,
-  UpArrowDownArrow: 8645,
-  updownarrow: 8597,
-  UpDownArrow: 8597,
-  Updownarrow: 8661,
-  UpEquilibrium: 10606,
-  upharpoonleft: 8639,
-  upharpoonright: 8638,
-  uplus: 8846,
-  UpperLeftArrow: 8598,
-  UpperRightArrow: 8599,
-  upsi: 965,
-  Upsi: 978,
-  upsih: 978,
-  Upsilon: 933,
-  upsilon: 965,
-  UpTeeArrow: 8613,
-  UpTee: 8869,
-  upuparrows: 8648,
-  urcorn: 8989,
-  urcorner: 8989,
-  urcrop: 8974,
-  Uring: 366,
-  uring: 367,
-  urtri: 9721,
-  Uscr: 55349,
-  uscr: 55349,
-  utdot: 8944,
-  Utilde: 360,
-  utilde: 361,
-  utri: 9653,
-  utrif: 9652,
-  uuarr: 8648,
-  Uuml: 220,
-  uuml: 252,
-  uwangle: 10663,
-  vangrt: 10652,
-  varepsilon: 1013,
-  varkappa: 1008,
-  varnothing: 8709,
-  varphi: 981,
-  varpi: 982,
-  varpropto: 8733,
-  varr: 8597,
-  vArr: 8661,
-  varrho: 1009,
-  varsigma: 962,
-  varsubsetneq: 8842,
-  varsubsetneqq: 10955,
-  varsupsetneq: 8843,
-  varsupsetneqq: 10956,
-  vartheta: 977,
-  vartriangleleft: 8882,
-  vartriangleright: 8883,
-  vBar: 10984,
-  Vbar: 10987,
-  vBarv: 10985,
-  Vcy: 1042,
-  vcy: 1074,
-  vdash: 8866,
-  vDash: 8872,
-  Vdash: 8873,
-  VDash: 8875,
-  Vdashl: 10982,
-  veebar: 8891,
-  vee: 8744,
-  Vee: 8897,
-  veeeq: 8794,
-  vellip: 8942,
-  verbar: 124,
-  Verbar: 8214,
-  vert: 124,
-  Vert: 8214,
-  VerticalBar: 8739,
-  VerticalLine: 124,
-  VerticalSeparator: 10072,
-  VerticalTilde: 8768,
-  VeryThinSpace: 8202,
-  Vfr: 55349,
-  vfr: 55349,
-  vltri: 8882,
-  vnsub: 8834,
-  vnsup: 8835,
-  Vopf: 55349,
-  vopf: 55349,
-  vprop: 8733,
-  vrtri: 8883,
-  Vscr: 55349,
-  vscr: 55349,
-  vsubnE: 10955,
-  vsubne: 8842,
-  vsupnE: 10956,
-  vsupne: 8843,
-  Vvdash: 8874,
-  vzigzag: 10650,
-  Wcirc: 372,
-  wcirc: 373,
-  wedbar: 10847,
-  wedge: 8743,
-  Wedge: 8896,
-  wedgeq: 8793,
-  weierp: 8472,
-  Wfr: 55349,
-  wfr: 55349,
-  Wopf: 55349,
-  wopf: 55349,
-  wp: 8472,
-  wr: 8768,
-  wreath: 8768,
-  Wscr: 55349,
-  wscr: 55349,
-  xcap: 8898,
-  xcirc: 9711,
-  xcup: 8899,
-  xdtri: 9661,
-  Xfr: 55349,
-  xfr: 55349,
-  xharr: 10231,
-  xhArr: 10234,
-  Xi: 926,
-  xi: 958,
-  xlarr: 10229,
-  xlArr: 10232,
-  xmap: 10236,
-  xnis: 8955,
-  xodot: 10752,
-  Xopf: 55349,
-  xopf: 55349,
-  xoplus: 10753,
-  xotime: 10754,
-  xrarr: 10230,
-  xrArr: 10233,
-  Xscr: 55349,
-  xscr: 55349,
-  xsqcup: 10758,
-  xuplus: 10756,
-  xutri: 9651,
-  xvee: 8897,
-  xwedge: 8896,
-  Yacute: 221,
-  yacute: 253,
-  YAcy: 1071,
-  yacy: 1103,
-  Ycirc: 374,
-  ycirc: 375,
-  Ycy: 1067,
-  ycy: 1099,
-  yen: 165,
-  Yfr: 55349,
-  yfr: 55349,
-  YIcy: 1031,
-  yicy: 1111,
-  Yopf: 55349,
-  yopf: 55349,
-  Yscr: 55349,
-  yscr: 55349,
-  YUcy: 1070,
-  yucy: 1102,
-  yuml: 255,
-  Yuml: 376,
-  Zacute: 377,
-  zacute: 378,
-  Zcaron: 381,
-  zcaron: 382,
-  Zcy: 1047,
-  zcy: 1079,
-  Zdot: 379,
-  zdot: 380,
-  zeetrf: 8488,
-  ZeroWidthSpace: 8203,
-  Zeta: 918,
-  zeta: 950,
-  zfr: 55349,
-  Zfr: 8488,
-  ZHcy: 1046,
-  zhcy: 1078,
-  zigrarr: 8669,
-  zopf: 55349,
-  Zopf: 8484,
-  Zscr: 55349,
-  zscr: 55349,
-  zwj: 8205,
-  zwnj: 8204 };
-
-var entityToChar = function(m) {
-    var isNumeric = /^&#/.test(m);
-    var isHex = /^&#[Xx]/.test(m);
-    var uchar;
-    var ucode;
-    if (isNumeric) {
-        var num;
-        if (isHex) {
-            num = parseInt(m.slice(3, -1), 16);
-        } else {
-            num = parseInt(m.slice(2, -1), 10);
-        }
-        uchar = fromCodePoint(num);
-    } else {
-        ucode = entities[m.slice(1, -1)];
-        if (ucode) {
-            uchar = fromCodePoint(entities[m.slice(1, -1)]);
-        }
-    }
-    return (uchar || m);
-};
-
-module.exports.entityToChar = entityToChar;
diff --git a/js/lib/index.js b/js/lib/index.js
@@ -1,17 +0,0 @@
-"use strict";
-
-// commonmark.js - CommomMark in JavaScript
-// Copyright (C) 2014 John MacFarlane
-// License: BSD3.
-
-// Basic usage:
-//
-// var commonmark = require('commonmark');
-// var parser = new commonmark.Parser();
-// var renderer = new commonmark.HtmlRenderer();
-// console.log(renderer.render(parser.parse('Hello *world*')));
-
-module.exports.Node = require('./node');
-module.exports.Parser = require('./blocks');
-module.exports.HtmlRenderer = require('./html');
-module.exports.XmlRenderer = require('./xml');
diff --git a/js/lib/inlines.js b/js/lib/inlines.js
@@ -1,833 +0,0 @@
-"use strict";
-
-var Node = require('./node');
-var common = require('./common');
-var normalizeReference = require('./normalize-reference');
-
-var normalizeURI = common.normalizeURI;
-var unescapeString = common.unescapeString;
-var fromCodePoint = require('./from-code-point.js');
-var entityToChar = require('./html5-entities.js').entityToChar;
-
-// Constants for character codes:
-
-var C_NEWLINE = 10;
-var C_ASTERISK = 42;
-var C_UNDERSCORE = 95;
-var C_BACKTICK = 96;
-var C_OPEN_BRACKET = 91;
-var C_CLOSE_BRACKET = 93;
-var C_LESSTHAN = 60;
-var C_BANG = 33;
-var C_BACKSLASH = 92;
-var C_AMPERSAND = 38;
-var C_OPEN_PAREN = 40;
-var C_COLON = 58;
-
-// Some regexps used in inline parser:
-
-var ESCAPABLE = '[!"#$%&\'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]';
-var ESCAPED_CHAR = '\\\\' + ESCAPABLE;
-var REG_CHAR = '[^\\\\()\\x00-\\x20]';
-var IN_PARENS_NOSP = '\\((' + REG_CHAR + '|' + ESCAPED_CHAR + ')*\\)';
-var TAGNAME = '[A-Za-z][A-Za-z0-9]*';
-var ATTRIBUTENAME = '[a-zA-Z_:][a-zA-Z0-9:._-]*';
-var UNQUOTEDVALUE = "[^\"'=<>`\\x00-\\x20]+";
-var SINGLEQUOTEDVALUE = "'[^']*'";
-var DOUBLEQUOTEDVALUE = '"[^"]*"';
-var ATTRIBUTEVALUE = "(?:" + UNQUOTEDVALUE + "|" + SINGLEQUOTEDVALUE + "|" + DOUBLEQUOTEDVALUE + ")";
-var ATTRIBUTEVALUESPEC = "(?:" + "\\s*=" + "\\s*" + ATTRIBUTEVALUE + ")";
-var ATTRIBUTE = "(?:" + "\\s+" + ATTRIBUTENAME + ATTRIBUTEVALUESPEC + "?)";
-var OPENTAG = "<" + TAGNAME + ATTRIBUTE + "*" + "\\s*/?>";
-var CLOSETAG = "</" + TAGNAME + "\\s*[>]";
-var HTMLCOMMENT = "<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->";
-var PROCESSINGINSTRUCTION = "[<][?].*?[?][>]";
-var DECLARATION = "<![A-Z]+" + "\\s+[^>]*>";
-var CDATA = "<!\\[CDATA\\[[\\s\\S]*?\\]\\]>";
-var HTMLTAG = "(?:" + OPENTAG + "|" + CLOSETAG + "|" + HTMLCOMMENT + "|" +
-        PROCESSINGINSTRUCTION + "|" + DECLARATION + "|" + CDATA + ")";
-var ENTITY = "&(?:#x[a-f0-9]{1,8}|#[0-9]{1,8}|[a-z][a-z0-9]{1,31});";
-
-var rePunctuation = new RegExp(/^[\u2000-\u206F\u2E00-\u2E7F\\'!"#\$%&\(\)\*\+,\-\.\/:;<=>\?@\[\]\^_`\{\|\}~]/);
-
-var reHtmlTag = new RegExp('^' + HTMLTAG, 'i');
-
-var reLinkTitle = new RegExp(
-    '^(?:"(' + ESCAPED_CHAR + '|[^"\\x00])*"' +
-        '|' +
-        '\'(' + ESCAPED_CHAR + '|[^\'\\x00])*\'' +
-        '|' +
-        '\\((' + ESCAPED_CHAR + '|[^)\\x00])*\\))');
-
-var reLinkDestinationBraces = new RegExp(
-    '^(?:[<](?:[^<>\\n\\\\\\x00]' + '|' + ESCAPED_CHAR + '|' + '\\\\)*[>])');
-
-var reLinkDestination = new RegExp(
-    '^(?:' + REG_CHAR + '+|' + ESCAPED_CHAR + '|' + IN_PARENS_NOSP + ')*');
-
-var reEscapable = new RegExp(ESCAPABLE);
-
-var reEntityHere = new RegExp('^' + ENTITY, 'i');
-
-var reTicks = new RegExp('`+');
-
-var reTicksHere = new RegExp('^`+');
-
-var reEmailAutolink = /^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;
-
-var reAutolink = /^<(?:coap|doi|javascript|aaa|aaas|about|acap|cap|cid|crid|data|dav|dict|dns|file|ftp|geo|go|gopher|h323|http|https|iax|icap|im|imap|info|ipp|iris|iris.beep|iris.xpc|iris.xpcs|iris.lwz|ldap|mailto|mid|msrp|msrps|mtqp|mupdate|news|nfs|ni|nih|nntp|opaquelocktoken|pop|pres|rtsp|service|session|shttp|sieve|sip|sips|sms|snmp|soap.beep|soap.beeps|tag|tel|telnet|tftp|thismessage|tn3270|tip|tv|urn|vemmi|ws|wss|xcon|xcon-userid|xmlrpc.beep|xmlrpc.beeps|xmpp|z39.50r|z39.50s|adiumxtra|afp|afs|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|chrome|chrome-extension|com-eventbrite-attendee|content|cvs|dlna-playsingle|dlna-playcontainer|dtn|dvb|ed2k|facetime|feed|finger|fish|gg|git|gizmoproject|gtalk|hcp|icon|ipn|irc|irc6|ircs|itms|jar|jms|keyparc|lastfm|ldaps|magnet|maps|market|message|mms|ms-help|msnim|mumble|mvn|notes|oid|palm|paparazzi|platform|proxy|psyc|query|res|resource|rmi|rsync|rtmp|secondlife|sftp|sgn|skype|smb|soldat|spotify|ssh|steam|svn|teamspeak|things|udp|unreal|ut2004|ventrilo|view-source|webcal|wtai|wyciwyg|xfire|xri|ymsgr):[^<>\x00-\x20]*>/i;
-
-var reSpnl = /^ *(?:\n *)?/;
-
-var reWhitespaceChar = /^\s/;
-
-var reWhitespace = /\s+/g;
-
-var reFinalSpace = / *$/;
-
-var reInitialSpace = /^ */;
-
-var reLinkLabel = /^\[(?:[^\\\[\]]|\\[\[\]]){0,1000}\]/;
-
-// Matches a string of non-special characters.
-var reMain = /^[^\n`\[\]\\!<&*_]+/m;
-
-var text = function(s) {
-    var node = new Node('Text');
-    node._literal = s;
-    return node;
-};
-
-// INLINE PARSER
-
-// These are methods of an InlineParser object, defined below.
-// An InlineParser keeps track of a subject (a string to be
-// parsed) and a position in that subject.
-
-// If re matches at current position in the subject, advance
-// position in subject and return the match; otherwise return null.
-var match = function(re) {
-    var m = re.exec(this.subject.slice(this.pos));
-    if (m) {
-        this.pos += m.index + m[0].length;
-        return m[0];
-    } else {
-        return null;
-    }
-};
-
-// Returns the code for the character at the current subject position, or -1
-// there are no more characters.
-var peek = function() {
-    if (this.pos < this.subject.length) {
-        return this.subject.charCodeAt(this.pos);
-    } else {
-        return -1;
-    }
-};
-
-// Parse zero or more space characters, including at most one newline
-var spnl = function() {
-    this.match(reSpnl);
-    return 1;
-};
-
-// All of the parsers below try to match something at the current position
-// in the subject.  If they succeed in matching anything, they
-// return the inline matched, advancing the subject.
-
-// Attempt to parse backticks, adding either a backtick code span or a
-// literal sequence of backticks.
-var parseBackticks = function(block) {
-    var ticks = this.match(reTicksHere);
-    if (!ticks) {
-        return 0;
-    }
-    var afterOpenTicks = this.pos;
-    var foundCode = false;
-    var matched;
-    var node;
-    while (!foundCode && (matched = this.match(reTicks))) {
-        if (matched === ticks) {
-            node = new Node('Code');
-            node._literal = this.subject.slice(afterOpenTicks,
-                                        this.pos - ticks.length)
-                          .trim().replace(reWhitespace, ' ');
-            block.appendChild(node);
-            return true;
-        }
-    }
-    // If we got here, we didn't match a closing backtick sequence.
-    this.pos = afterOpenTicks;
-    block.appendChild(text(ticks));
-    return true;
-};
-
-// Parse a backslash-escaped special character, adding either the escaped
-// character, a hard line break (if the backslash is followed by a newline),
-// or a literal backslash to the block's children.
-var parseBackslash = function(block) {
-    var subj = this.subject,
-        pos = this.pos;
-    var node;
-    if (subj.charCodeAt(pos) === C_BACKSLASH) {
-        if (subj.charAt(pos + 1) === '\n') {
-            this.pos = this.pos + 2;
-            node = new Node('Hardbreak');
-            block.appendChild(node);
-        } else if (reEscapable.test(subj.charAt(pos + 1))) {
-            this.pos = this.pos + 2;
-            block.appendChild(text(subj.charAt(pos + 1)));
-        } else {
-            this.pos++;
-            block.appendChild(text('\\'));
-        }
-        return true;
-    } else {
-        return false;
-    }
-};
-
-// Attempt to parse an autolink (URL or email in pointy brackets).
-var parseAutolink = function(block) {
-    var m;
-    var dest;
-    var node;
-    if ((m = this.match(reEmailAutolink))) {
-        dest = m.slice(1, -1);
-        node = new Node('Link');
-        node._destination = normalizeURI('mailto:' + dest);
-        node._title = '';
-        node.appendChild(text(dest));
-        block.appendChild(node);
-        return true;
-    } else if ((m = this.match(reAutolink))) {
-        dest = m.slice(1, -1);
-        node = new Node('Link');
-        node._destination = normalizeURI(dest);
-        node._title = '';
-        node.appendChild(text(dest));
-        block.appendChild(node);
-        return true;
-    } else {
-        return false;
-    }
-};
-
-// Attempt to parse a raw HTML tag.
-var parseHtmlTag = function(block) {
-    var m = this.match(reHtmlTag);
-    var node;
-    if (m) {
-        node = new Node('Html');
-        node._literal = m;
-        block.appendChild(node);
-        return true;
-    } else {
-        return false;
-    }
-};
-
-// Scan a sequence of characters with code cc, and return information about
-// the number of delimiters and whether they are positioned such that
-// they can open and/or close emphasis or strong emphasis.  A utility
-// function for strong/emph parsing.
-var scanDelims = function(cc) {
-    var numdelims = 0;
-    var char_before, char_after, cc_after;
-    var startpos = this.pos;
-    var left_flanking, right_flanking, can_open, can_close;
-
-    char_before = this.pos === 0 ? '\n' :
-        this.subject.charAt(this.pos - 1);
-
-    while (this.peek() === cc) {
-        numdelims++;
-        this.pos++;
-    }
-
-    cc_after = this.peek();
-    if (cc_after === -1) {
-        char_after = '\n';
-    } else {
-        char_after = fromCodePoint(cc_after);
-    }
-
-    left_flanking = numdelims > 0 &&
-            !(reWhitespaceChar.test(char_after)) &&
-            !(rePunctuation.test(char_after) &&
-             !(/\s/.test(char_before)) &&
-             !(rePunctuation.test(char_before)));
-    right_flanking = numdelims > 0 &&
-            !(reWhitespaceChar.test(char_before)) &&
-            !(rePunctuation.test(char_before) &&
-              !(reWhitespaceChar.test(char_after)) &&
-              !(rePunctuation.test(char_after)));
-    if (cc === C_UNDERSCORE) {
-        can_open = left_flanking && !right_flanking;
-        can_close = right_flanking && !left_flanking;
-    } else {
-        can_open = left_flanking;
-        can_close = right_flanking;
-    }
-    this.pos = startpos;
-    return { numdelims: numdelims,
-             can_open: can_open,
-             can_close: can_close };
-};
-
-// Attempt to parse emphasis or strong emphasis.
-var parseEmphasis = function(cc, block) {
-    var res = this.scanDelims(cc);
-    var numdelims = res.numdelims;
-    var startpos = this.pos;
-
-    if (numdelims === 0) {
-        return false;
-    }
-
-    this.pos += numdelims;
-    var node = text(this.subject.slice(startpos, this.pos));
-    block.appendChild(node);
-
-    // Add entry to stack for this opener
-    this.delimiters = { cc: cc,
-                        numdelims: numdelims,
-                        node: node,
-                        previous: this.delimiters,
-                        next: null,
-                        can_open: res.can_open,
-                        can_close: res.can_close,
-                        active: true };
-    if (this.delimiters.previous !== null) {
-        this.delimiters.previous.next = this.delimiters;
-    }
-
-    return true;
-
-};
-
-var removeDelimiter = function(delim) {
-    if (delim.previous !== null) {
-        delim.previous.next = delim.next;
-    }
-    if (delim.next === null) {
-        // top of stack
-        this.delimiters = delim.previous;
-    } else {
-        delim.next.previous = delim.previous;
-    }
-};
-
-var processEmphasis = function(block, stack_bottom) {
-    var opener, closer;
-    var opener_inl, closer_inl;
-    var nextstack, tempstack;
-    var use_delims;
-    var tmp, next;
-
-    // find first closer above stack_bottom:
-    closer = this.delimiters;
-    while (closer !== null && closer.previous !== stack_bottom) {
-        closer = closer.previous;
-    }
-    // move forward, looking for closers, and handling each
-    while (closer !== null) {
-        if (closer.can_close && (closer.cc === C_UNDERSCORE || closer.cc === C_ASTERISK)) {
-            // found emphasis closer. now look back for first matching opener:
-            opener = closer.previous;
-            while (opener !== null && opener !== stack_bottom) {
-                if (opener.cc === closer.cc && opener.can_open) {
-                    break;
-                }
-                opener = opener.previous;
-            }
-            if (opener !== null && opener !== stack_bottom) {
-                // calculate actual number of delimiters used from this closer
-                if (closer.numdelims < 3 || opener.numdelims < 3) {
-                    use_delims = closer.numdelims <= opener.numdelims ?
-                        closer.numdelims : opener.numdelims;
-                } else {
-                    use_delims = closer.numdelims % 2 === 0 ? 2 : 1;
-                }
-
-                opener_inl = opener.node;
-                closer_inl = closer.node;
-
-                // remove used delimiters from stack elts and inlines
-                opener.numdelims -= use_delims;
-                closer.numdelims -= use_delims;
-                opener_inl._literal =
-                    opener_inl._literal.slice(0,
-                                     opener_inl._literal.length - use_delims);
-                closer_inl._literal =
-                    closer_inl._literal.slice(0,
-                                     closer_inl._literal.length - use_delims);
-
-                // build contents for new emph element
-                var emph = new Node(use_delims === 1 ? 'Emph' : 'Strong');
-
-                tmp = opener_inl._next;
-                while (tmp && tmp !== closer_inl) {
-                    next = tmp._next;
-                    tmp.unlink();
-                    emph.appendChild(tmp);
-                    tmp = next;
-                }
-
-                opener_inl.insertAfter(emph);
-
-                // remove elts btw opener and closer in delimiters stack
-                tempstack = closer.previous;
-                while (tempstack !== null && tempstack !== opener) {
-                    nextstack = tempstack.previous;
-                    this.removeDelimiter(tempstack);
-                    tempstack = nextstack;
-                }
-
-                // if opener has 0 delims, remove it and the inline
-                if (opener.numdelims === 0) {
-                    opener_inl.unlink();
-                    this.removeDelimiter(opener);
-                }
-
-                if (closer.numdelims === 0) {
-                    closer_inl.unlink();
-                    tempstack = closer.next;
-                    this.removeDelimiter(closer);
-                    closer = tempstack;
-                }
-
-            } else {
-                closer = closer.next;
-            }
-
-        } else {
-            closer = closer.next;
-        }
-
-    }
-
-    // remove all delimiters
-    while (this.delimiters !== stack_bottom) {
-        this.removeDelimiter(this.delimiters);
-    }
-};
-
-// Attempt to parse link title (sans quotes), returning the string
-// or null if no match.
-var parseLinkTitle = function() {
-    var title = this.match(reLinkTitle);
-    if (title) {
-        // chop off quotes from title and unescape:
-        return unescapeString(title.substr(1, title.length - 2));
-    } else {
-        return null;
-    }
-};
-
-// Attempt to parse link destination, returning the string or
-// null if no match.
-var parseLinkDestination = function() {
-    var res = this.match(reLinkDestinationBraces);
-    if (res) {  // chop off surrounding <..>:
-        return normalizeURI(unescapeString(res.substr(1, res.length - 2)));
-    } else {
-        res = this.match(reLinkDestination);
-        if (res !== null) {
-            return normalizeURI(unescapeString(res));
-        } else {
-            return null;
-        }
-    }
-};
-
-// Attempt to parse a link label, returning number of characters parsed.
-var parseLinkLabel = function() {
-    var m = this.match(reLinkLabel);
-    return m === null ? 0 : m.length;
-};
-
-// Add open bracket to delimiter stack and add a text node to block's children.
-var parseOpenBracket = function(block) {
-    var startpos = this.pos;
-    this.pos += 1;
-
-    var node = text('[');
-    block.appendChild(node);
-
-    // Add entry to stack for this opener
-    this.delimiters = { cc: C_OPEN_BRACKET,
-                        numdelims: 1,
-                        node: node,
-                        previous: this.delimiters,
-                        next: null,
-                        can_open: true,
-                        can_close: false,
-                        index: startpos,
-                        active: true };
-    if (this.delimiters.previous !== null) {
-        this.delimiters.previous.next = this.delimiters;
-    }
-
-    return true;
-
-};
-
-// IF next character is [, and ! delimiter to delimiter stack and
-// add a text node to block's children.  Otherwise just add a text node.
-var parseBang = function(block) {
-    var startpos = this.pos;
-    this.pos += 1;
-    if (this.peek() === C_OPEN_BRACKET) {
-        this.pos += 1;
-
-        var node = text('![');
-        block.appendChild(node);
-
-        // Add entry to stack for this opener
-        this.delimiters = { cc: C_BANG,
-                            numdelims: 1,
-                            node: node,
-                            previous: this.delimiters,
-                            next: null,
-                            can_open: true,
-                            can_close: false,
-                            index: startpos + 1,
-                            active: true };
-        if (this.delimiters.previous !== null) {
-            this.delimiters.previous.next = this.delimiters;
-        }
-    } else {
-        block.appendChild(text('!'));
-    }
-    return true;
-};
-
-// Try to match close bracket against an opening in the delimiter
-// stack.  Add either a link or image, or a plain [ character,
-// to block's children.  If there is a matching delimiter,
-// remove it from the delimiter stack.
-var parseCloseBracket = function(block) {
-    var startpos;
-    var is_image;
-    var dest;
-    var title;
-    var matched = false;
-    var reflabel;
-    var opener;
-
-    this.pos += 1;
-    startpos = this.pos;
-
-    // look through stack of delimiters for a [ or ![
-    opener = this.delimiters;
-
-    while (opener !== null) {
-        if (opener.cc === C_OPEN_BRACKET || opener.cc === C_BANG) {
-            break;
-        }
-        opener = opener.previous;
-    }
-
-    if (opener === null) {
-        // no matched opener, just return a literal
-        block.appendChild(text(']'));
-        return true;
-    }
-
-    if (!opener.active) {
-        // no matched opener, just return a literal
-        block.appendChild(text(']'));
-        // take opener off emphasis stack
-        this.removeDelimiter(opener);
-        return true;
-    }
-
-    // If we got here, open is a potential opener
-    is_image = opener.cc === C_BANG;
-
-    // Check to see if we have a link/image
-
-    // Inline link?
-    if (this.peek() === C_OPEN_PAREN) {
-        this.pos++;
-        if (this.spnl() &&
-            ((dest = this.parseLinkDestination()) !== null) &&
-            this.spnl() &&
-            // make sure there's a space before the title:
-            (reWhitespaceChar.test(this.subject.charAt(this.pos - 1)) &&
-             (title = this.parseLinkTitle()) || true) &&
-            this.spnl() &&
-            this.subject.charAt(this.pos) === ')') {
-            this.pos += 1;
-            matched = true;
-        }
-    } else {
-
-        // Next, see if there's a link label
-        var savepos = this.pos;
-        this.spnl();
-        var beforelabel = this.pos;
-        var n = this.parseLinkLabel();
-        if (n === 0 || n === 2) {
-            // empty or missing second label
-            reflabel = this.subject.slice(opener.index, startpos);
-        } else {
-            reflabel = this.subject.slice(beforelabel, beforelabel + n);
-        }
-        if (n === 0) {
-            // If shortcut reference link, rewind before spaces we skipped.
-            this.pos = savepos;
-        }
-
-        // lookup rawlabel in refmap
-        var link = this.refmap[normalizeReference(reflabel)];
-        if (link) {
-            dest = link.destination;
-            title = link.title;
-            matched = true;
-        }
-    }
-
-    if (matched) {
-        var node = new Node(is_image ? 'Image' : 'Link');
-        node._destination = dest;
-        node._title = title || '';
-
-        var tmp, next;
-        tmp = opener.node._next;
-        while (tmp) {
-            next = tmp._next;
-            tmp.unlink();
-            node.appendChild(tmp);
-            tmp = next;
-        }
-        block.appendChild(node);
-        this.processEmphasis(node, opener.previous);
-
-        opener.node.unlink();
-
-        // processEmphasis will remove this and later delimiters.
-        // Now, for a link, we also deactivate earlier link openers.
-        // (no links in links)
-        if (!is_image) {
-          opener = this.delimiters;
-          while (opener !== null) {
-            if (opener.cc === C_OPEN_BRACKET) {
-                opener.active = false; // deactivate this opener
-            }
-            opener = opener.previous;
-          }
-        }
-
-        return true;
-
-    } else { // no match
-
-        this.removeDelimiter(opener);  // remove this opener from stack
-        this.pos = startpos;
-        block.appendChild(text(']'));
-        return true;
-    }
-
-};
-
-// Attempt to parse an entity, return Entity object if successful.
-var parseEntity = function(block) {
-    var m;
-    if ((m = this.match(reEntityHere))) {
-        block.appendChild(text(entityToChar(m)));
-        return true;
-    } else {
-        return false;
-    }
-};
-
-// Parse a run of ordinary characters, or a single character with
-// a special meaning in markdown, as a plain string.
-var parseString = function(block) {
-    var m;
-    if ((m = this.match(reMain))) {
-        block.appendChild(text(m));
-        return true;
-    } else {
-        return false;
-    }
-};
-
-// Parse a newline.  If it was preceded by two spaces, return a hard
-// line break; otherwise a soft line break.
-var parseNewline = function(block) {
-    this.pos += 1; // assume we're at a \n
-    // check previous node for trailing spaces
-    var lastc = block._lastChild;
-    if (lastc && lastc.type === 'Text') {
-        var sps = reFinalSpace.exec(lastc._literal)[0].length;
-        if (sps > 0) {
-            lastc._literal = lastc._literal.replace(reFinalSpace, '');
-        }
-        block.appendChild(new Node(sps >= 2 ? 'Hardbreak' : 'Softbreak'));
-    } else {
-        block.appendChild(new Node('Softbreak'));
-    }
-    this.match(reInitialSpace); // gobble leading spaces in next line
-    return true;
-};
-
-// Attempt to parse a link reference, modifying refmap.
-var parseReference = function(s, refmap) {
-    this.subject = s;
-    this.pos = 0;
-    var rawlabel;
-    var dest;
-    var title;
-    var matchChars;
-    var startpos = this.pos;
-
-    // label:
-    matchChars = this.parseLinkLabel();
-    if (matchChars === 0) {
-        return 0;
-    } else {
-        rawlabel = this.subject.substr(0, matchChars);
-    }
-
-    // colon:
-    if (this.peek() === C_COLON) {
-        this.pos++;
-    } else {
-        this.pos = startpos;
-        return 0;
-    }
-
-    //  link url
-    this.spnl();
-
-    dest = this.parseLinkDestination();
-    if (dest === null || dest.length === 0) {
-        this.pos = startpos;
-        return 0;
-    }
-
-    var beforetitle = this.pos;
-    this.spnl();
-    title = this.parseLinkTitle();
-    if (title === null) {
-        title = '';
-        // rewind before spaces
-        this.pos = beforetitle;
-    }
-
-    // make sure we're at line end:
-    if (this.match(/^ *(?:\n|$)/) === null) {
-        this.pos = startpos;
-        return 0;
-    }
-
-    var normlabel = normalizeReference(rawlabel);
-
-    if (!refmap[normlabel]) {
-        refmap[normlabel] = { destination: dest, title: title };
-    }
-    return this.pos - startpos;
-};
-
-// Parse the next inline element in subject, advancing subject position.
-// On success, add the result to block's children and return true.
-// On failure, return false.
-var parseInline = function(block) {
-    var res = false;
-    var c = this.peek();
-    if (c === -1) {
-        return false;
-    }
-    switch(c) {
-    case C_NEWLINE:
-        res = this.parseNewline(block);
-        break;
-    case C_BACKSLASH:
-        res = this.parseBackslash(block);
-        break;
-    case C_BACKTICK:
-        res = this.parseBackticks(block);
-        break;
-    case C_ASTERISK:
-    case C_UNDERSCORE:
-        res = this.parseEmphasis(c, block);
-        break;
-    case C_OPEN_BRACKET:
-        res = this.parseOpenBracket(block);
-        break;
-    case C_BANG:
-        res = this.parseBang(block);
-        break;
-    case C_CLOSE_BRACKET:
-        res = this.parseCloseBracket(block);
-        break;
-    case C_LESSTHAN:
-        res = this.parseAutolink(block) || this.parseHtmlTag(block);
-        break;
-    case C_AMPERSAND:
-        res = this.parseEntity(block);
-        break;
-    default:
-        res = this.parseString(block);
-        break;
-    }
-    if (!res) {
-        this.pos += 1;
-        var textnode = new Node('Text');
-        textnode._literal = fromCodePoint(c);
-        block.appendChild(textnode);
-    }
-
-    return true;
-};
-
-// Parse string content in block into inline children,
-// using refmap to resolve references.
-var parseInlines = function(block, refmap) {
-    this.subject = block._string_content.trim();
-    this.pos = 0;
-    this.refmap = refmap || {};
-    this.delimiters = null;
-    while (this.parseInline(block)) {
-    }
-    this.processEmphasis(block, null);
-};
-
-// The InlineParser object.
-function InlineParser(){
-    return {
-        subject: '',
-        delimiters: null,  // used by parseEmphasis method
-        pos: 0,
-        refmap: {},
-        match: match,
-        peek: peek,
-        spnl: spnl,
-        parseBackticks: parseBackticks,
-        parseBackslash: parseBackslash,
-        parseAutolink: parseAutolink,
-        parseHtmlTag: parseHtmlTag,
-        scanDelims: scanDelims,
-        parseEmphasis: parseEmphasis,
-        parseLinkTitle: parseLinkTitle,
-        parseLinkDestination: parseLinkDestination,
-        parseLinkLabel: parseLinkLabel,
-        parseOpenBracket: parseOpenBracket,
-        parseCloseBracket: parseCloseBracket,
-        parseBang: parseBang,
-        parseEntity: parseEntity,
-        parseString: parseString,
-        parseNewline: parseNewline,
-        parseReference: parseReference,
-        parseInline: parseInline,
-        processEmphasis: processEmphasis,
-        removeDelimiter: removeDelimiter,
-        parse: parseInlines
-    };
-}
-
-module.exports = InlineParser;
diff --git a/js/lib/node.js b/js/lib/node.js
@@ -1,255 +0,0 @@
-"use strict";
-
-function isContainer(node) {
-    switch (node._type) {
-    case 'Document':
-    case 'BlockQuote':
-    case 'List':
-    case 'Item':
-    case 'Paragraph':
-    case 'Header':
-    case 'Emph':
-    case 'Strong':
-    case 'Link':
-    case 'Image':
-        return true;
-    default:
-        return false;
-    }
-}
-
-var resumeAt = function(node, entering) {
-    this.current = node;
-    this.entering = (entering === true);
-};
-
-var next = function(){
-    var cur = this.current;
-    var entering = this.entering;
-
-    if (cur === null) {
-        return null;
-    }
-
-    var container = isContainer(cur);
-
-    if (entering && container) {
-        if (cur._firstChild) {
-            this.current = cur._firstChild;
-            this.entering = true;
-        } else {
-            // stay on node but exit
-            this.entering = false;
-        }
-
-    } else if (cur._next === null) {
-        this.current = cur._parent;
-        this.entering = false;
-
-    } else {
-        this.current = cur._next;
-        this.entering = true;
-    }
-
-    return {entering: entering, node: cur};
-};
-
-var NodeWalker = function(root) {
-    return { current: root,
-             root: root,
-             entering: true,
-             next: next,
-             resumeAt: resumeAt };
-};
-
-var Node = function(nodeType, sourcepos) {
-    this._type = nodeType;
-    this._parent = null;
-    this._firstChild = null;
-    this._lastChild = null;
-    this._prev = null;
-    this._next = null;
-    this._sourcepos = sourcepos;
-    this._lastLineBlank = false;
-    this._open = true;
-    this._strings = null;
-    this._string_content = null;
-    this._literal = null;
-    this._listData = null;
-    this._info = null;
-    this._destination = null;
-    this._title = null;
-    this._isFenced = false;
-    this._fenceChar = null;
-    this._fenceLength = 0;
-    this._fenceOffset = null;
-    this._level = null;
-};
-
-var proto = Node.prototype;
-
-Node.prototype.isContainer = function() {
-    return isContainer(this);
-};
-
-Object.defineProperty(proto, 'type', {
-    get: function() { return this._type; }
-});
-
-Object.defineProperty(proto, 'firstChild', {
-    get: function() { return this._firstChild; }
-});
-
-Object.defineProperty(proto, 'lastChild', {
-    get: function() { return this._lastChild; }
-});
-
-Object.defineProperty(proto, 'next', {
-    get: function() { return this._next; }
-});
-
-Object.defineProperty(proto, 'prev', {
-    get: function() { return this._prev; }
-});
-
-Object.defineProperty(proto, 'parent', {
-    get: function() { return this._parent; }
-});
-
-Object.defineProperty(proto, 'sourcepos', {
-    get: function() { return this._sourcepos; }
-});
-
-Object.defineProperty(proto, 'literal', {
-    get: function() { return this._literal; },
-    set: function(s) { this._literal = s; }
-});
-
-Object.defineProperty(proto, 'destination', {
-    get: function() { return this._destination; },
-    set: function(s) { this._destination = s; }
-});
-
-Object.defineProperty(proto, 'title', {
-    get: function() { return this._title; },
-    set: function(s) { this._title = s; }
-});
-
-Object.defineProperty(proto, 'info', {
-    get: function() { return this._info; },
-    set: function(s) { this._info = s; }
-});
-
-Object.defineProperty(proto, 'level', {
-    get: function() { return this._level; },
-    set: function(s) { this._level = s; }
-});
-
-Object.defineProperty(proto, 'listType', {
-    get: function() { return this._listData.type; },
-    set: function(t) { this._listData.type = t; }
-});
-
-Object.defineProperty(proto, 'listTight', {
-    get: function() { return this._listData.tight; },
-    set: function(t) { this._listData.tight = t; }
-});
-
-Object.defineProperty(proto, 'listStart', {
-    get: function() { return this._listData.start; },
-    set: function(n) { this._listData.start = n; }
-});
-
-Object.defineProperty(proto, 'listDelimiter', {
-    get: function() { return this._listData.delimiter; },
-    set: function(delim) { this._listData.delimiter = delim; }
-});
-
-Node.prototype.appendChild = function(child) {
-    child.unlink();
-    child._parent = this;
-    if (this._lastChild) {
-        this._lastChild._next = child;
-        child._prev = this._lastChild;
-        this._lastChild = child;
-    } else {
-        this._firstChild = child;
-        this._lastChild = child;
-    }
-};
-
-Node.prototype.prependChild = function(child) {
-    child.unlink();
-    child._parent = this;
-    if (this._firstChild) {
-        this._firstChild._prev = child;
-        child._next = this._firstChild;
-        this._firstChild = child;
-    } else {
-        this._firstChild = child;
-        this._lastChild = child;
-    }
-};
-
-Node.prototype.unlink = function() {
-    if (this._prev) {
-        this._prev._next = this._next;
-    } else if (this._parent) {
-        this._parent._firstChild = this._next;
-    }
-    if (this._next) {
-        this._next._prev = this._prev;
-    } else if (this._parent) {
-        this._parent._lastChild = this._prev;
-    }
-    this._parent = null;
-    this._next = null;
-    this._prev = null;
-};
-
-Node.prototype.insertAfter = function(sibling) {
-    sibling.unlink();
-    sibling._next = this._next;
-    if (sibling._next) {
-        sibling._next._prev = sibling;
-    }
-    sibling._prev = this;
-    this._next = sibling;
-    sibling._parent = this._parent;
-    if (!sibling._next) {
-        sibling._parent._lastChild = sibling;
-    }
-};
-
-Node.prototype.insertBefore = function(sibling) {
-    sibling.unlink();
-    sibling._prev = this._prev;
-    if (sibling._prev) {
-        sibling._prev._next = sibling;
-    }
-    sibling._next = this;
-    this._prev = sibling;
-    sibling._parent = this._parent;
-    if (!sibling._prev) {
-        sibling._parent._firstChild = sibling;
-    }
-};
-
-Node.prototype.walker = function() {
-    var walker = new NodeWalker(this);
-    return walker;
-};
-
-module.exports = Node;
-
-
-/* Example of use of walker:
-
- var walker = w.walker();
- var event;
-
- while (event = walker.next()) {
- console.log(event.entering, event.node.type());
- }
-
- */
diff --git a/js/lib/normalize-reference.js b/js/lib/normalize-reference.js
@@ -1,42 +0,0 @@
-"use strict";
-
-/* The bulk of this code derives from https://github.com/dmoscrop/fold-case
-But in addition to case-folding, we also normalize whitespace.
-
-fold-case is Copyright Mathias Bynens <https://mathiasbynens.be/>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-/*eslint-disable  key-spacing, comma-spacing */
-
-var regex = /[ \t\r\n]+|[A-Z\xB5\xC0-\xD6\xD8-\xDF\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u0149\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u017F\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C5\u01C7\u01C8\u01CA\u01CB\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F0-\u01F2\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0345\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03AB\u03B0\u03C2\u03CF-\u03D1\u03D5\u03D6\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F0\u03F1\u03F4\u03F5\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u0587\u10A0-\u10C5\u10C7\u10CD\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E96-\u1E9B\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F50\u1F52\u1F54\u1F56\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1F80-\u1FAF\u1FB2-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD2\u1FD3\u1FD6-\u1FDB\u1FE2-\u1FE4\u1FE6-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2126\u212A\u212B\u2132\u2160-\u216F\u2183\u24B6-\u24CF\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AD\uA7B0\uA7B1\uFB00-\uFB06\uFB13-\uFB17\uFF21-\uFF3A]|\uD801[\uDC00-\uDC27]|\uD806[\uDCA0-\uDCBF]/g;
-
-var map = {'A':'a','B':'b','C':'c','D':'d','E':'e','F':'f','G':'g','H':'h','I':'i','J':'j','K':'k','L':'l','M':'m','N':'n','O':'o','P':'p','Q':'q','R':'r','S':'s','T':'t','U':'u','V':'v','W':'w','X':'x','Y':'y','Z':'z','\xB5':'\u03BC','\xC0':'\xE0','\xC1':'\xE1','\xC2':'\xE2','\xC3':'\xE3','\xC4':'\xE4','\xC5':'\xE5','\xC6':'\xE6','\xC7':'\xE7','\xC8':'\xE8','\xC9':'\xE9','\xCA':'\xEA','\xCB':'\xEB','\xCC':'\xEC','\xCD':'\xED','\xCE':'\xEE','\xCF':'\xEF','\xD0':'\xF0','\xD1':'\xF1','\xD2':'\xF2','\xD3':'\xF3','\xD4':'\xF4','\xD5':'\xF5','\xD6':'\xF6','\xD8':'\xF8','\xD9':'\xF9','\xDA':'\xFA','\xDB':'\xFB','\xDC':'\xFC','\xDD':'\xFD','\xDE':'\xFE','\u0100':'\u0101','\u0102':'\u0103','\u0104':'\u0105','\u0106':'\u0107','\u0108':'\u0109','\u010A':'\u010B','\u010C':'\u010D','\u010E':'\u010F','\u0110':'\u0111','\u0112':'\u0113','\u0114':'\u0115','\u0116':'\u0117','\u0118':'\u0119','\u011A':'\u011B','\u011C':'\u011D','\u011E':'\u011F','\u0120':'\u0121','\u0122':'\u0123','\u0124':'\u0125','\u0126':'\u0127','\u0128':'\u0129','\u012A':'\u012B','\u012C':'\u012D','\u012E':'\u012F','\u0132':'\u0133','\u0134':'\u0135','\u0136':'\u0137','\u0139':'\u013A','\u013B':'\u013C','\u013D':'\u013E','\u013F':'\u0140','\u0141':'\u0142','\u0143':'\u0144','\u0145':'\u0146','\u0147':'\u0148','\u014A':'\u014B','\u014C':'\u014D','\u014E':'\u014F','\u0150':'\u0151','\u0152':'\u0153','\u0154':'\u0155','\u0156':'\u0157','\u0158':'\u0159','\u015A':'\u015B','\u015C':'\u015D','\u015E':'\u015F','\u0160':'\u0161','\u0162':'\u0163','\u0164':'\u0165','\u0166':'\u0167','\u0168':'\u0169','\u016A':'\u016B','\u016C':'\u016D','\u016E':'\u016F','\u0170':'\u0171','\u0172':'\u0173','\u0174':'\u0175','\u0176':'\u0177','\u0178':'\xFF','\u0179':'\u017A','\u017B':'\u017C','\u017D':'\u017E','\u017F':'s','\u0181':'\u0253','\u0182':'\u0183','\u0184':'\u0185','\u0186':'\u0254','\u0187':'\u0188','\u0189':'\u0256','\u018A':'\u0257','\u018B':'\u018C','\u018E':'\u01DD','\u018F':'\u0259','\u0190':'\u025B','\u0191':'\u0192','\u0193':'\u0260','\u0194':'\u0263','\u0196':'\u0269','\u0197':'\u0268','\u0198':'\u0199','\u019C':'\u026F','\u019D':'\u0272','\u019F':'\u0275','\u01A0':'\u01A1','\u01A2':'\u01A3','\u01A4':'\u01A5','\u01A6':'\u0280','\u01A7':'\u01A8','\u01A9':'\u0283','\u01AC':'\u01AD','\u01AE':'\u0288','\u01AF':'\u01B0','\u01B1':'\u028A','\u01B2':'\u028B','\u01B3':'\u01B4','\u01B5':'\u01B6','\u01B7':'\u0292','\u01B8':'\u01B9','\u01BC':'\u01BD','\u01C4':'\u01C6','\u01C5':'\u01C6','\u01C7':'\u01C9','\u01C8':'\u01C9','\u01CA':'\u01CC','\u01CB':'\u01CC','\u01CD':'\u01CE','\u01CF':'\u01D0','\u01D1':'\u01D2','\u01D3':'\u01D4','\u01D5':'\u01D6','\u01D7':'\u01D8','\u01D9':'\u01DA','\u01DB':'\u01DC','\u01DE':'\u01DF','\u01E0':'\u01E1','\u01E2':'\u01E3','\u01E4':'\u01E5','\u01E6':'\u01E7','\u01E8':'\u01E9','\u01EA':'\u01EB','\u01EC':'\u01ED','\u01EE':'\u01EF','\u01F1':'\u01F3','\u01F2':'\u01F3','\u01F4':'\u01F5','\u01F6':'\u0195','\u01F7':'\u01BF','\u01F8':'\u01F9','\u01FA':'\u01FB','\u01FC':'\u01FD','\u01FE':'\u01FF','\u0200':'\u0201','\u0202':'\u0203','\u0204':'\u0205','\u0206':'\u0207','\u0208':'\u0209','\u020A':'\u020B','\u020C':'\u020D','\u020E':'\u020F','\u0210':'\u0211','\u0212':'\u0213','\u0214':'\u0215','\u0216':'\u0217','\u0218':'\u0219','\u021A':'\u021B','\u021C':'\u021D','\u021E':'\u021F','\u0220':'\u019E','\u0222':'\u0223','\u0224':'\u0225','\u0226':'\u0227','\u0228':'\u0229','\u022A':'\u022B','\u022C':'\u022D','\u022E':'\u022F','\u0230':'\u0231','\u0232':'\u0233','\u023A':'\u2C65','\u023B':'\u023C','\u023D':'\u019A','\u023E':'\u2C66','\u0241':'\u0242','\u0243':'\u0180','\u0244':'\u0289','\u0245':'\u028C','\u0246':'\u0247','\u0248':'\u0249','\u024A':'\u024B','\u024C':'\u024D','\u024E':'\u024F','\u0345':'\u03B9','\u0370':'\u0371','\u0372':'\u0373','\u0376':'\u0377','\u037F':'\u03F3','\u0386':'\u03AC','\u0388':'\u03AD','\u0389':'\u03AE','\u038A':'\u03AF','\u038C':'\u03CC','\u038E':'\u03CD','\u038F':'\u03CE','\u0391':'\u03B1','\u0392':'\u03B2','\u0393':'\u03B3','\u0394':'\u03B4','\u0395':'\u03B5','\u0396':'\u03B6','\u0397':'\u03B7','\u0398':'\u03B8','\u0399':'\u03B9','\u039A':'\u03BA','\u039B':'\u03BB','\u039C':'\u03BC','\u039D':'\u03BD','\u039E':'\u03BE','\u039F':'\u03BF','\u03A0':'\u03C0','\u03A1':'\u03C1','\u03A3':'\u03C3','\u03A4':'\u03C4','\u03A5':'\u03C5','\u03A6':'\u03C6','\u03A7':'\u03C7','\u03A8':'\u03C8','\u03A9':'\u03C9','\u03AA':'\u03CA','\u03AB':'\u03CB','\u03C2':'\u03C3','\u03CF':'\u03D7','\u03D0':'\u03B2','\u03D1':'\u03B8','\u03D5':'\u03C6','\u03D6':'\u03C0','\u03D8':'\u03D9','\u03DA':'\u03DB','\u03DC':'\u03DD','\u03DE':'\u03DF','\u03E0':'\u03E1','\u03E2':'\u03E3','\u03E4':'\u03E5','\u03E6':'\u03E7','\u03E8':'\u03E9','\u03EA':'\u03EB','\u03EC':'\u03ED','\u03EE':'\u03EF','\u03F0':'\u03BA','\u03F1':'\u03C1','\u03F4':'\u03B8','\u03F5':'\u03B5','\u03F7':'\u03F8','\u03F9':'\u03F2','\u03FA':'\u03FB','\u03FD':'\u037B','\u03FE':'\u037C','\u03FF':'\u037D','\u0400':'\u0450','\u0401':'\u0451','\u0402':'\u0452','\u0403':'\u0453','\u0404':'\u0454','\u0405':'\u0455','\u0406':'\u0456','\u0407':'\u0457','\u0408':'\u0458','\u0409':'\u0459','\u040A':'\u045A','\u040B':'\u045B','\u040C':'\u045C','\u040D':'\u045D','\u040E':'\u045E','\u040F':'\u045F','\u0410':'\u0430','\u0411':'\u0431','\u0412':'\u0432','\u0413':'\u0433','\u0414':'\u0434','\u0415':'\u0435','\u0416':'\u0436','\u0417':'\u0437','\u0418':'\u0438','\u0419':'\u0439','\u041A':'\u043A','\u041B':'\u043B','\u041C':'\u043C','\u041D':'\u043D','\u041E':'\u043E','\u041F':'\u043F','\u0420':'\u0440','\u0421':'\u0441','\u0422':'\u0442','\u0423':'\u0443','\u0424':'\u0444','\u0425':'\u0445','\u0426':'\u0446','\u0427':'\u0447','\u0428':'\u0448','\u0429':'\u0449','\u042A':'\u044A','\u042B':'\u044B','\u042C':'\u044C','\u042D':'\u044D','\u042E':'\u044E','\u042F':'\u044F','\u0460':'\u0461','\u0462':'\u0463','\u0464':'\u0465','\u0466':'\u0467','\u0468':'\u0469','\u046A':'\u046B','\u046C':'\u046D','\u046E':'\u046F','\u0470':'\u0471','\u0472':'\u0473','\u0474':'\u0475','\u0476':'\u0477','\u0478':'\u0479','\u047A':'\u047B','\u047C':'\u047D','\u047E':'\u047F','\u0480':'\u0481','\u048A':'\u048B','\u048C':'\u048D','\u048E':'\u048F','\u0490':'\u0491','\u0492':'\u0493','\u0494':'\u0495','\u0496':'\u0497','\u0498':'\u0499','\u049A':'\u049B','\u049C':'\u049D','\u049E':'\u049F','\u04A0':'\u04A1','\u04A2':'\u04A3','\u04A4':'\u04A5','\u04A6':'\u04A7','\u04A8':'\u04A9','\u04AA':'\u04AB','\u04AC':'\u04AD','\u04AE':'\u04AF','\u04B0':'\u04B1','\u04B2':'\u04B3','\u04B4':'\u04B5','\u04B6':'\u04B7','\u04B8':'\u04B9','\u04BA':'\u04BB','\u04BC':'\u04BD','\u04BE':'\u04BF','\u04C0':'\u04CF','\u04C1':'\u04C2','\u04C3':'\u04C4','\u04C5':'\u04C6','\u04C7':'\u04C8','\u04C9':'\u04CA','\u04CB':'\u04CC','\u04CD':'\u04CE','\u04D0':'\u04D1','\u04D2':'\u04D3','\u04D4':'\u04D5','\u04D6':'\u04D7','\u04D8':'\u04D9','\u04DA':'\u04DB','\u04DC':'\u04DD','\u04DE':'\u04DF','\u04E0':'\u04E1','\u04E2':'\u04E3','\u04E4':'\u04E5','\u04E6':'\u04E7','\u04E8':'\u04E9','\u04EA':'\u04EB','\u04EC':'\u04ED','\u04EE':'\u04EF','\u04F0':'\u04F1','\u04F2':'\u04F3','\u04F4':'\u04F5','\u04F6':'\u04F7','\u04F8':'\u04F9','\u04FA':'\u04FB','\u04FC':'\u04FD','\u04FE':'\u04FF','\u0500':'\u0501','\u0502':'\u0503','\u0504':'\u0505','\u0506':'\u0507','\u0508':'\u0509','\u050A':'\u050B','\u050C':'\u050D','\u050E':'\u050F','\u0510':'\u0511','\u0512':'\u0513','\u0514':'\u0515','\u0516':'\u0517','\u0518':'\u0519','\u051A':'\u051B','\u051C':'\u051D','\u051E':'\u051F','\u0520':'\u0521','\u0522':'\u0523','\u0524':'\u0525','\u0526':'\u0527','\u0528':'\u0529','\u052A':'\u052B','\u052C':'\u052D','\u052E':'\u052F','\u0531':'\u0561','\u0532':'\u0562','\u0533':'\u0563','\u0534':'\u0564','\u0535':'\u0565','\u0536':'\u0566','\u0537':'\u0567','\u0538':'\u0568','\u0539':'\u0569','\u053A':'\u056A','\u053B':'\u056B','\u053C':'\u056C','\u053D':'\u056D','\u053E':'\u056E','\u053F':'\u056F','\u0540':'\u0570','\u0541':'\u0571','\u0542':'\u0572','\u0543':'\u0573','\u0544':'\u0574','\u0545':'\u0575','\u0546':'\u0576','\u0547':'\u0577','\u0548':'\u0578','\u0549':'\u0579','\u054A':'\u057A','\u054B':'\u057B','\u054C':'\u057C','\u054D':'\u057D','\u054E':'\u057E','\u054F':'\u057F','\u0550':'\u0580','\u0551':'\u0581','\u0552':'\u0582','\u0553':'\u0583','\u0554':'\u0584','\u0555':'\u0585','\u0556':'\u0586','\u10A0':'\u2D00','\u10A1':'\u2D01','\u10A2':'\u2D02','\u10A3':'\u2D03','\u10A4':'\u2D04','\u10A5':'\u2D05','\u10A6':'\u2D06','\u10A7':'\u2D07','\u10A8':'\u2D08','\u10A9':'\u2D09','\u10AA':'\u2D0A','\u10AB':'\u2D0B','\u10AC':'\u2D0C','\u10AD':'\u2D0D','\u10AE':'\u2D0E','\u10AF':'\u2D0F','\u10B0':'\u2D10','\u10B1':'\u2D11','\u10B2':'\u2D12','\u10B3':'\u2D13','\u10B4':'\u2D14','\u10B5':'\u2D15','\u10B6':'\u2D16','\u10B7':'\u2D17','\u10B8':'\u2D18','\u10B9':'\u2D19','\u10BA':'\u2D1A','\u10BB':'\u2D1B','\u10BC':'\u2D1C','\u10BD':'\u2D1D','\u10BE':'\u2D1E','\u10BF':'\u2D1F','\u10C0':'\u2D20','\u10C1':'\u2D21','\u10C2':'\u2D22','\u10C3':'\u2D23','\u10C4':'\u2D24','\u10C5':'\u2D25','\u10C7':'\u2D27','\u10CD':'\u2D2D','\u1E00':'\u1E01','\u1E02':'\u1E03','\u1E04':'\u1E05','\u1E06':'\u1E07','\u1E08':'\u1E09','\u1E0A':'\u1E0B','\u1E0C':'\u1E0D','\u1E0E':'\u1E0F','\u1E10':'\u1E11','\u1E12':'\u1E13','\u1E14':'\u1E15','\u1E16':'\u1E17','\u1E18':'\u1E19','\u1E1A':'\u1E1B','\u1E1C':'\u1E1D','\u1E1E':'\u1E1F','\u1E20':'\u1E21','\u1E22':'\u1E23','\u1E24':'\u1E25','\u1E26':'\u1E27','\u1E28':'\u1E29','\u1E2A':'\u1E2B','\u1E2C':'\u1E2D','\u1E2E':'\u1E2F','\u1E30':'\u1E31','\u1E32':'\u1E33','\u1E34':'\u1E35','\u1E36':'\u1E37','\u1E38':'\u1E39','\u1E3A':'\u1E3B','\u1E3C':'\u1E3D','\u1E3E':'\u1E3F','\u1E40':'\u1E41','\u1E42':'\u1E43','\u1E44':'\u1E45','\u1E46':'\u1E47','\u1E48':'\u1E49','\u1E4A':'\u1E4B','\u1E4C':'\u1E4D','\u1E4E':'\u1E4F','\u1E50':'\u1E51','\u1E52':'\u1E53','\u1E54':'\u1E55','\u1E56':'\u1E57','\u1E58':'\u1E59','\u1E5A':'\u1E5B','\u1E5C':'\u1E5D','\u1E5E':'\u1E5F','\u1E60':'\u1E61','\u1E62':'\u1E63','\u1E64':'\u1E65','\u1E66':'\u1E67','\u1E68':'\u1E69','\u1E6A':'\u1E6B','\u1E6C':'\u1E6D','\u1E6E':'\u1E6F','\u1E70':'\u1E71','\u1E72':'\u1E73','\u1E74':'\u1E75','\u1E76':'\u1E77','\u1E78':'\u1E79','\u1E7A':'\u1E7B','\u1E7C':'\u1E7D','\u1E7E':'\u1E7F','\u1E80':'\u1E81','\u1E82':'\u1E83','\u1E84':'\u1E85','\u1E86':'\u1E87','\u1E88':'\u1E89','\u1E8A':'\u1E8B','\u1E8C':'\u1E8D','\u1E8E':'\u1E8F','\u1E90':'\u1E91','\u1E92':'\u1E93','\u1E94':'\u1E95','\u1E9B':'\u1E61','\u1EA0':'\u1EA1','\u1EA2':'\u1EA3','\u1EA4':'\u1EA5','\u1EA6':'\u1EA7','\u1EA8':'\u1EA9','\u1EAA':'\u1EAB','\u1EAC':'\u1EAD','\u1EAE':'\u1EAF','\u1EB0':'\u1EB1','\u1EB2':'\u1EB3','\u1EB4':'\u1EB5','\u1EB6':'\u1EB7','\u1EB8':'\u1EB9','\u1EBA':'\u1EBB','\u1EBC':'\u1EBD','\u1EBE':'\u1EBF','\u1EC0':'\u1EC1','\u1EC2':'\u1EC3','\u1EC4':'\u1EC5','\u1EC6':'\u1EC7','\u1EC8':'\u1EC9','\u1ECA':'\u1ECB','\u1ECC':'\u1ECD','\u1ECE':'\u1ECF','\u1ED0':'\u1ED1','\u1ED2':'\u1ED3','\u1ED4':'\u1ED5','\u1ED6':'\u1ED7','\u1ED8':'\u1ED9','\u1EDA':'\u1EDB','\u1EDC':'\u1EDD','\u1EDE':'\u1EDF','\u1EE0':'\u1EE1','\u1EE2':'\u1EE3','\u1EE4':'\u1EE5','\u1EE6':'\u1EE7','\u1EE8':'\u1EE9','\u1EEA':'\u1EEB','\u1EEC':'\u1EED','\u1EEE':'\u1EEF','\u1EF0':'\u1EF1','\u1EF2':'\u1EF3','\u1EF4':'\u1EF5','\u1EF6':'\u1EF7','\u1EF8':'\u1EF9','\u1EFA':'\u1EFB','\u1EFC':'\u1EFD','\u1EFE':'\u1EFF','\u1F08':'\u1F00','\u1F09':'\u1F01','\u1F0A':'\u1F02','\u1F0B':'\u1F03','\u1F0C':'\u1F04','\u1F0D':'\u1F05','\u1F0E':'\u1F06','\u1F0F':'\u1F07','\u1F18':'\u1F10','\u1F19':'\u1F11','\u1F1A':'\u1F12','\u1F1B':'\u1F13','\u1F1C':'\u1F14','\u1F1D':'\u1F15','\u1F28':'\u1F20','\u1F29':'\u1F21','\u1F2A':'\u1F22','\u1F2B':'\u1F23','\u1F2C':'\u1F24','\u1F2D':'\u1F25','\u1F2E':'\u1F26','\u1F2F':'\u1F27','\u1F38':'\u1F30','\u1F39':'\u1F31','\u1F3A':'\u1F32','\u1F3B':'\u1F33','\u1F3C':'\u1F34','\u1F3D':'\u1F35','\u1F3E':'\u1F36','\u1F3F':'\u1F37','\u1F48':'\u1F40','\u1F49':'\u1F41','\u1F4A':'\u1F42','\u1F4B':'\u1F43','\u1F4C':'\u1F44','\u1F4D':'\u1F45','\u1F59':'\u1F51','\u1F5B':'\u1F53','\u1F5D':'\u1F55','\u1F5F':'\u1F57','\u1F68':'\u1F60','\u1F69':'\u1F61','\u1F6A':'\u1F62','\u1F6B':'\u1F63','\u1F6C':'\u1F64','\u1F6D':'\u1F65','\u1F6E':'\u1F66','\u1F6F':'\u1F67','\u1FB8':'\u1FB0','\u1FB9':'\u1FB1','\u1FBA':'\u1F70','\u1FBB':'\u1F71','\u1FBE':'\u03B9','\u1FC8':'\u1F72','\u1FC9':'\u1F73','\u1FCA':'\u1F74','\u1FCB':'\u1F75','\u1FD8':'\u1FD0','\u1FD9':'\u1FD1','\u1FDA':'\u1F76','\u1FDB':'\u1F77','\u1FE8':'\u1FE0','\u1FE9':'\u1FE1','\u1FEA':'\u1F7A','\u1FEB':'\u1F7B','\u1FEC':'\u1FE5','\u1FF8':'\u1F78','\u1FF9':'\u1F79','\u1FFA':'\u1F7C','\u1FFB':'\u1F7D','\u2126':'\u03C9','\u212A':'k','\u212B':'\xE5','\u2132':'\u214E','\u2160':'\u2170','\u2161':'\u2171','\u2162':'\u2172','\u2163':'\u2173','\u2164':'\u2174','\u2165':'\u2175','\u2166':'\u2176','\u2167':'\u2177','\u2168':'\u2178','\u2169':'\u2179','\u216A':'\u217A','\u216B':'\u217B','\u216C':'\u217C','\u216D':'\u217D','\u216E':'\u217E','\u216F':'\u217F','\u2183':'\u2184','\u24B6':'\u24D0','\u24B7':'\u24D1','\u24B8':'\u24D2','\u24B9':'\u24D3','\u24BA':'\u24D4','\u24BB':'\u24D5','\u24BC':'\u24D6','\u24BD':'\u24D7','\u24BE':'\u24D8','\u24BF':'\u24D9','\u24C0':'\u24DA','\u24C1':'\u24DB','\u24C2':'\u24DC','\u24C3':'\u24DD','\u24C4':'\u24DE','\u24C5':'\u24DF','\u24C6':'\u24E0','\u24C7':'\u24E1','\u24C8':'\u24E2','\u24C9':'\u24E3','\u24CA':'\u24E4','\u24CB':'\u24E5','\u24CC':'\u24E6','\u24CD':'\u24E7','\u24CE':'\u24E8','\u24CF':'\u24E9','\u2C00':'\u2C30','\u2C01':'\u2C31','\u2C02':'\u2C32','\u2C03':'\u2C33','\u2C04':'\u2C34','\u2C05':'\u2C35','\u2C06':'\u2C36','\u2C07':'\u2C37','\u2C08':'\u2C38','\u2C09':'\u2C39','\u2C0A':'\u2C3A','\u2C0B':'\u2C3B','\u2C0C':'\u2C3C','\u2C0D':'\u2C3D','\u2C0E':'\u2C3E','\u2C0F':'\u2C3F','\u2C10':'\u2C40','\u2C11':'\u2C41','\u2C12':'\u2C42','\u2C13':'\u2C43','\u2C14':'\u2C44','\u2C15':'\u2C45','\u2C16':'\u2C46','\u2C17':'\u2C47','\u2C18':'\u2C48','\u2C19':'\u2C49','\u2C1A':'\u2C4A','\u2C1B':'\u2C4B','\u2C1C':'\u2C4C','\u2C1D':'\u2C4D','\u2C1E':'\u2C4E','\u2C1F':'\u2C4F','\u2C20':'\u2C50','\u2C21':'\u2C51','\u2C22':'\u2C52','\u2C23':'\u2C53','\u2C24':'\u2C54','\u2C25':'\u2C55','\u2C26':'\u2C56','\u2C27':'\u2C57','\u2C28':'\u2C58','\u2C29':'\u2C59','\u2C2A':'\u2C5A','\u2C2B':'\u2C5B','\u2C2C':'\u2C5C','\u2C2D':'\u2C5D','\u2C2E':'\u2C5E','\u2C60':'\u2C61','\u2C62':'\u026B','\u2C63':'\u1D7D','\u2C64':'\u027D','\u2C67':'\u2C68','\u2C69':'\u2C6A','\u2C6B':'\u2C6C','\u2C6D':'\u0251','\u2C6E':'\u0271','\u2C6F':'\u0250','\u2C70':'\u0252','\u2C72':'\u2C73','\u2C75':'\u2C76','\u2C7E':'\u023F','\u2C7F':'\u0240','\u2C80':'\u2C81','\u2C82':'\u2C83','\u2C84':'\u2C85','\u2C86':'\u2C87','\u2C88':'\u2C89','\u2C8A':'\u2C8B','\u2C8C':'\u2C8D','\u2C8E':'\u2C8F','\u2C90':'\u2C91','\u2C92':'\u2C93','\u2C94':'\u2C95','\u2C96':'\u2C97','\u2C98':'\u2C99','\u2C9A':'\u2C9B','\u2C9C':'\u2C9D','\u2C9E':'\u2C9F','\u2CA0':'\u2CA1','\u2CA2':'\u2CA3','\u2CA4':'\u2CA5','\u2CA6':'\u2CA7','\u2CA8':'\u2CA9','\u2CAA':'\u2CAB','\u2CAC':'\u2CAD','\u2CAE':'\u2CAF','\u2CB0':'\u2CB1','\u2CB2':'\u2CB3','\u2CB4':'\u2CB5','\u2CB6':'\u2CB7','\u2CB8':'\u2CB9','\u2CBA':'\u2CBB','\u2CBC':'\u2CBD','\u2CBE':'\u2CBF','\u2CC0':'\u2CC1','\u2CC2':'\u2CC3','\u2CC4':'\u2CC5','\u2CC6':'\u2CC7','\u2CC8':'\u2CC9','\u2CCA':'\u2CCB','\u2CCC':'\u2CCD','\u2CCE':'\u2CCF','\u2CD0':'\u2CD1','\u2CD2':'\u2CD3','\u2CD4':'\u2CD5','\u2CD6':'\u2CD7','\u2CD8':'\u2CD9','\u2CDA':'\u2CDB','\u2CDC':'\u2CDD','\u2CDE':'\u2CDF','\u2CE0':'\u2CE1','\u2CE2':'\u2CE3','\u2CEB':'\u2CEC','\u2CED':'\u2CEE','\u2CF2':'\u2CF3','\uA640':'\uA641','\uA642':'\uA643','\uA644':'\uA645','\uA646':'\uA647','\uA648':'\uA649','\uA64A':'\uA64B','\uA64C':'\uA64D','\uA64E':'\uA64F','\uA650':'\uA651','\uA652':'\uA653','\uA654':'\uA655','\uA656':'\uA657','\uA658':'\uA659','\uA65A':'\uA65B','\uA65C':'\uA65D','\uA65E':'\uA65F','\uA660':'\uA661','\uA662':'\uA663','\uA664':'\uA665','\uA666':'\uA667','\uA668':'\uA669','\uA66A':'\uA66B','\uA66C':'\uA66D','\uA680':'\uA681','\uA682':'\uA683','\uA684':'\uA685','\uA686':'\uA687','\uA688':'\uA689','\uA68A':'\uA68B','\uA68C':'\uA68D','\uA68E':'\uA68F','\uA690':'\uA691','\uA692':'\uA693','\uA694':'\uA695','\uA696':'\uA697','\uA698':'\uA699','\uA69A':'\uA69B','\uA722':'\uA723','\uA724':'\uA725','\uA726':'\uA727','\uA728':'\uA729','\uA72A':'\uA72B','\uA72C':'\uA72D','\uA72E':'\uA72F','\uA732':'\uA733','\uA734':'\uA735','\uA736':'\uA737','\uA738':'\uA739','\uA73A':'\uA73B','\uA73C':'\uA73D','\uA73E':'\uA73F','\uA740':'\uA741','\uA742':'\uA743','\uA744':'\uA745','\uA746':'\uA747','\uA748':'\uA749','\uA74A':'\uA74B','\uA74C':'\uA74D','\uA74E':'\uA74F','\uA750':'\uA751','\uA752':'\uA753','\uA754':'\uA755','\uA756':'\uA757','\uA758':'\uA759','\uA75A':'\uA75B','\uA75C':'\uA75D','\uA75E':'\uA75F','\uA760':'\uA761','\uA762':'\uA763','\uA764':'\uA765','\uA766':'\uA767','\uA768':'\uA769','\uA76A':'\uA76B','\uA76C':'\uA76D','\uA76E':'\uA76F','\uA779':'\uA77A','\uA77B':'\uA77C','\uA77D':'\u1D79','\uA77E':'\uA77F','\uA780':'\uA781','\uA782':'\uA783','\uA784':'\uA785','\uA786':'\uA787','\uA78B':'\uA78C','\uA78D':'\u0265','\uA790':'\uA791','\uA792':'\uA793','\uA796':'\uA797','\uA798':'\uA799','\uA79A':'\uA79B','\uA79C':'\uA79D','\uA79E':'\uA79F','\uA7A0':'\uA7A1','\uA7A2':'\uA7A3','\uA7A4':'\uA7A5','\uA7A6':'\uA7A7','\uA7A8':'\uA7A9','\uA7AA':'\u0266','\uA7AB':'\u025C','\uA7AC':'\u0261','\uA7AD':'\u026C','\uA7B0':'\u029E','\uA7B1':'\u0287','\uFF21':'\uFF41','\uFF22':'\uFF42','\uFF23':'\uFF43','\uFF24':'\uFF44','\uFF25':'\uFF45','\uFF26':'\uFF46','\uFF27':'\uFF47','\uFF28':'\uFF48','\uFF29':'\uFF49','\uFF2A':'\uFF4A','\uFF2B':'\uFF4B','\uFF2C':'\uFF4C','\uFF2D':'\uFF4D','\uFF2E':'\uFF4E','\uFF2F':'\uFF4F','\uFF30':'\uFF50','\uFF31':'\uFF51','\uFF32':'\uFF52','\uFF33':'\uFF53','\uFF34':'\uFF54','\uFF35':'\uFF55','\uFF36':'\uFF56','\uFF37':'\uFF57','\uFF38':'\uFF58','\uFF39':'\uFF59','\uFF3A':'\uFF5A','\uD801\uDC00':'\uD801\uDC28','\uD801\uDC01':'\uD801\uDC29','\uD801\uDC02':'\uD801\uDC2A','\uD801\uDC03':'\uD801\uDC2B','\uD801\uDC04':'\uD801\uDC2C','\uD801\uDC05':'\uD801\uDC2D','\uD801\uDC06':'\uD801\uDC2E','\uD801\uDC07':'\uD801\uDC2F','\uD801\uDC08':'\uD801\uDC30','\uD801\uDC09':'\uD801\uDC31','\uD801\uDC0A':'\uD801\uDC32','\uD801\uDC0B':'\uD801\uDC33','\uD801\uDC0C':'\uD801\uDC34','\uD801\uDC0D':'\uD801\uDC35','\uD801\uDC0E':'\uD801\uDC36','\uD801\uDC0F':'\uD801\uDC37','\uD801\uDC10':'\uD801\uDC38','\uD801\uDC11':'\uD801\uDC39','\uD801\uDC12':'\uD801\uDC3A','\uD801\uDC13':'\uD801\uDC3B','\uD801\uDC14':'\uD801\uDC3C','\uD801\uDC15':'\uD801\uDC3D','\uD801\uDC16':'\uD801\uDC3E','\uD801\uDC17':'\uD801\uDC3F','\uD801\uDC18':'\uD801\uDC40','\uD801\uDC19':'\uD801\uDC41','\uD801\uDC1A':'\uD801\uDC42','\uD801\uDC1B':'\uD801\uDC43','\uD801\uDC1C':'\uD801\uDC44','\uD801\uDC1D':'\uD801\uDC45','\uD801\uDC1E':'\uD801\uDC46','\uD801\uDC1F':'\uD801\uDC47','\uD801\uDC20':'\uD801\uDC48','\uD801\uDC21':'\uD801\uDC49','\uD801\uDC22':'\uD801\uDC4A','\uD801\uDC23':'\uD801\uDC4B','\uD801\uDC24':'\uD801\uDC4C','\uD801\uDC25':'\uD801\uDC4D','\uD801\uDC26':'\uD801\uDC4E','\uD801\uDC27':'\uD801\uDC4F','\uD806\uDCA0':'\uD806\uDCC0','\uD806\uDCA1':'\uD806\uDCC1','\uD806\uDCA2':'\uD806\uDCC2','\uD806\uDCA3':'\uD806\uDCC3','\uD806\uDCA4':'\uD806\uDCC4','\uD806\uDCA5':'\uD806\uDCC5','\uD806\uDCA6':'\uD806\uDCC6','\uD806\uDCA7':'\uD806\uDCC7','\uD806\uDCA8':'\uD806\uDCC8','\uD806\uDCA9':'\uD806\uDCC9','\uD806\uDCAA':'\uD806\uDCCA','\uD806\uDCAB':'\uD806\uDCCB','\uD806\uDCAC':'\uD806\uDCCC','\uD806\uDCAD':'\uD806\uDCCD','\uD806\uDCAE':'\uD806\uDCCE','\uD806\uDCAF':'\uD806\uDCCF','\uD806\uDCB0':'\uD806\uDCD0','\uD806\uDCB1':'\uD806\uDCD1','\uD806\uDCB2':'\uD806\uDCD2','\uD806\uDCB3':'\uD806\uDCD3','\uD806\uDCB4':'\uD806\uDCD4','\uD806\uDCB5':'\uD806\uDCD5','\uD806\uDCB6':'\uD806\uDCD6','\uD806\uDCB7':'\uD806\uDCD7','\uD806\uDCB8':'\uD806\uDCD8','\uD806\uDCB9':'\uD806\uDCD9','\uD806\uDCBA':'\uD806\uDCDA','\uD806\uDCBB':'\uD806\uDCDB','\uD806\uDCBC':'\uD806\uDCDC','\uD806\uDCBD':'\uD806\uDCDD','\uD806\uDCBE':'\uD806\uDCDE','\uD806\uDCBF':'\uD806\uDCDF','\xDF':'ss','\u0130':'i\u0307','\u0149':'\u02BCn','\u01F0':'j\u030C','\u0390':'\u03B9\u0308\u0301','\u03B0':'\u03C5\u0308\u0301','\u0587':'\u0565\u0582','\u1E96':'h\u0331','\u1E97':'t\u0308','\u1E98':'w\u030A','\u1E99':'y\u030A','\u1E9A':'a\u02BE','\u1E9E':'ss','\u1F50':'\u03C5\u0313','\u1F52':'\u03C5\u0313\u0300','\u1F54':'\u03C5\u0313\u0301','\u1F56':'\u03C5\u0313\u0342','\u1F80':'\u1F00\u03B9','\u1F81':'\u1F01\u03B9','\u1F82':'\u1F02\u03B9','\u1F83':'\u1F03\u03B9','\u1F84':'\u1F04\u03B9','\u1F85':'\u1F05\u03B9','\u1F86':'\u1F06\u03B9','\u1F87':'\u1F07\u03B9','\u1F88':'\u1F00\u03B9','\u1F89':'\u1F01\u03B9','\u1F8A':'\u1F02\u03B9','\u1F8B':'\u1F03\u03B9','\u1F8C':'\u1F04\u03B9','\u1F8D':'\u1F05\u03B9','\u1F8E':'\u1F06\u03B9','\u1F8F':'\u1F07\u03B9','\u1F90':'\u1F20\u03B9','\u1F91':'\u1F21\u03B9','\u1F92':'\u1F22\u03B9','\u1F93':'\u1F23\u03B9','\u1F94':'\u1F24\u03B9','\u1F95':'\u1F25\u03B9','\u1F96':'\u1F26\u03B9','\u1F97':'\u1F27\u03B9','\u1F98':'\u1F20\u03B9','\u1F99':'\u1F21\u03B9','\u1F9A':'\u1F22\u03B9','\u1F9B':'\u1F23\u03B9','\u1F9C':'\u1F24\u03B9','\u1F9D':'\u1F25\u03B9','\u1F9E':'\u1F26\u03B9','\u1F9F':'\u1F27\u03B9','\u1FA0':'\u1F60\u03B9','\u1FA1':'\u1F61\u03B9','\u1FA2':'\u1F62\u03B9','\u1FA3':'\u1F63\u03B9','\u1FA4':'\u1F64\u03B9','\u1FA5':'\u1F65\u03B9','\u1FA6':'\u1F66\u03B9','\u1FA7':'\u1F67\u03B9','\u1FA8':'\u1F60\u03B9','\u1FA9':'\u1F61\u03B9','\u1FAA':'\u1F62\u03B9','\u1FAB':'\u1F63\u03B9','\u1FAC':'\u1F64\u03B9','\u1FAD':'\u1F65\u03B9','\u1FAE':'\u1F66\u03B9','\u1FAF':'\u1F67\u03B9','\u1FB2':'\u1F70\u03B9','\u1FB3':'\u03B1\u03B9','\u1FB4':'\u03AC\u03B9','\u1FB6':'\u03B1\u0342','\u1FB7':'\u03B1\u0342\u03B9','\u1FBC':'\u03B1\u03B9','\u1FC2':'\u1F74\u03B9','\u1FC3':'\u03B7\u03B9','\u1FC4':'\u03AE\u03B9','\u1FC6':'\u03B7\u0342','\u1FC7':'\u03B7\u0342\u03B9','\u1FCC':'\u03B7\u03B9','\u1FD2':'\u03B9\u0308\u0300','\u1FD3':'\u03B9\u0308\u0301','\u1FD6':'\u03B9\u0342','\u1FD7':'\u03B9\u0308\u0342','\u1FE2':'\u03C5\u0308\u0300','\u1FE3':'\u03C5\u0308\u0301','\u1FE4':'\u03C1\u0313','\u1FE6':'\u03C5\u0342','\u1FE7':'\u03C5\u0308\u0342','\u1FF2':'\u1F7C\u03B9','\u1FF3':'\u03C9\u03B9','\u1FF4':'\u03CE\u03B9','\u1FF6':'\u03C9\u0342','\u1FF7':'\u03C9\u0342\u03B9','\u1FFC':'\u03C9\u03B9','\uFB00':'ff','\uFB01':'fi','\uFB02':'fl','\uFB03':'ffi','\uFB04':'ffl','\uFB05':'st','\uFB06':'st','\uFB13':'\u0574\u0576','\uFB14':'\u0574\u0565','\uFB15':'\u0574\u056B','\uFB16':'\u057E\u0576','\uFB17':'\u0574\u056D'};
-
-// Normalize reference label: collapse internal whitespace
-// to single space, remove leading/trailing whitespace, case fold.
-module.exports = function(string) {
-    return string.trim().replace(regex, function($0) {
-        // Note: there is no need to check `hasOwnProperty($0)` here.
-        // If character not found in lookup table, it must be whitespace.
-        return map[$0] || ' ';
-    });
-};
diff --git a/js/lib/xml.js b/js/lib/xml.js
@@ -1,171 +0,0 @@
-"use strict";
-
-var escapeXml = require('./common').escapeXml;
-
-// Helper function to produce an XML tag.
-var tag = function(name, attrs, selfclosing) {
-    var result = '<' + name;
-    if (attrs && attrs.length > 0) {
-        var i = 0;
-        var attrib;
-        while ((attrib = attrs[i]) !== undefined) {
-            result += ' ' + attrib[0] + '="' + attrib[1] + '"';
-            i++;
-        }
-    }
-    if (selfclosing) {
-        result += ' /';
-    }
-
-    result += '>';
-    return result;
-};
-
-var reXMLTag = /\<[^>]*\>/;
-
-var toTagName = function(s) {
-    return s.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
-};
-
-var renderNodes = function(block) {
-
-    var attrs;
-    var tagname;
-    var walker = block.walker();
-    var event, node, entering;
-    var buffer = "";
-    var lastOut = "\n";
-    var disableTags = 0;
-    var indentLevel = 0;
-    var indent = '  ';
-    var unescapedContents;
-    var container;
-    var selfClosing;
-    var nodetype;
-
-    var out = function(s) {
-        if (disableTags > 0) {
-            buffer += s.replace(reXMLTag, '');
-        } else {
-            buffer += s;
-        }
-        lastOut = s;
-    };
-    var esc = this.escape;
-    var cr = function() {
-        if (lastOut !== '\n') {
-            buffer += '\n';
-            lastOut = '\n';
-            for (var i = indentLevel; i--;) {
-                buffer += indent;
-            }
-        }
-    };
-
-    var options = this.options;
-
-    if (options.time) { console.time("rendering"); }
-
-    buffer += '<?xml version="1.0" encoding="UTF-8"?>\n';
-    buffer += '<!DOCTYPE CommonMark SYSTEM "CommonMark.dtd">\n';
-
-    while ((event = walker.next())) {
-        entering = event.entering;
-        node = event.node;
-        nodetype = node.type;
-
-        container = node.isContainer();
-        selfClosing = nodetype === 'HorizontalRule' || nodetype === 'Hardbreak' ||
-            nodetype === 'Softbreak' || nodetype === 'Image';
-        unescapedContents = nodetype === 'Html' || nodetype === 'HtmlInline';
-        tagname = toTagName(nodetype);
-
-        if (entering) {
-
-            attrs = [];
-
-            switch (nodetype) {
-            case 'List':
-                if (node.listType !== null) {
-                    attrs.push(['type', node.listType.toLowerCase()]);
-                }
-                if (node.listStart !== null) {
-                    attrs.push(['start', String(node.listStart)]);
-                }
-                if (node.listTight !== null) {
-                    attrs.push(['tight', (node.listTight ? 'true' : 'false')]);
-                }
-                var delim = node.listDelimiter;
-                if (delim !== null) {
-                    var delimword = '';
-                    if (delim === '.') {
-                        delimword = 'period';
-                    } else {
-                        delimword = 'paren';
-                    }
-                    attrs.push(['delimiter', delimword]);
-                }
-                break;
-            case 'CodeBlock':
-                if (node.info) {
-                    attrs.push(['info', node.info]);
-                }
-                break;
-            case 'Header':
-                attrs.push(['level', String(node.level)]);
-                break;
-            case 'Link':
-            case 'Image':
-                attrs.push(['destination', node.destination]);
-                attrs.push(['title', node.title]);
-                break;
-            default:
-                break;
-            }
-            if (options.sourcepos) {
-                var pos = node.sourcepos;
-                if (pos) {
-                    attrs.push(['data-sourcepos', String(pos[0][0]) + ':' +
-                                String(pos[0][1]) + '-' + String(pos[1][0]) + ':' +
-                                String(pos[1][1])]);
-                }
-            }
-
-            cr();
-            out(tag(tagname, attrs, selfClosing));
-            if (container) {
-                indentLevel += 1;
-            } else if (!container && !selfClosing) {
-                var lit = node.literal;
-                if (lit) {
-                    out(unescapedContents ? lit : esc(lit));
-                }
-                out(tag('/' + tagname));
-            }
-        } else {
-            indentLevel -= 1;
-            cr();
-            out(tag('/' + tagname));
-        }
-
-
-    }
-    if (options.time) { console.timeEnd("rendering"); }
-    buffer += '\n';
-    return buffer;
-};
-
-// The XmlRenderer object.
-function XmlRenderer(options){
-    return {
-        // default options:
-        softbreak: '\n', // by default, soft breaks are rendered as newlines in HTML
-        // set to "<br />" to make them hard breaks
-        // set to " " if you want to ignore line wrapping in source
-        escape: escapeXml,
-        options: options || {},
-        render: renderNodes
-    };
-}
-
-module.exports = XmlRenderer;
diff --git a/js/package.json b/js/package.json
@@ -1,25 +0,0 @@
-{ "name": "commonmark",
-  "description": "a strongly specified, highly compatible variant of Markdown",
-  "version": "0.16.0",
-  "homepage": "http://commonmark.org",
-  "keywords":
-   [ "markdown",
-     "commonmark",
-     "md",
-     "stmd" ],
-  "repository":
-   { "type": "git",
-     "url": "https://github.com/jgm/CommonMark.git" },
-  "author": "John MacFarlane",
-  "bugs": { "url": "https://github.com/jgm/CommonMark/issues" },
-  "license": "BSD-3-Clause",
-  "main": "./lib/index.js",
-  "bin": { "commonmark": "./bin/commonmark" },
-  "scripts": { "test": "node ./test.js" },
-  "directories": {
-      "lib": "./lib"
-  },
-  "engines": {
-      "node": "*"
-  }
-}
diff --git a/js/test.js b/js/test.js
@@ -1,167 +0,0 @@
-#!/usr/bin/env node
-"use strict";
-
-var fs = require('fs');
-var commonmark = require('./lib/index.js');
-
-// Home made mini-version of the npm ansi module:
-var escSeq = function(s) {
-    return function (){
-        process.stdout.write('\u001b' + s);
-        return this;
-    };
-};
-
-var repeat = function(pattern, count) {
-    if (count < 1) {
-        return '';
-    }
-    var result = '';
-    while (count > 1) {
-        if (count & 1) {
-            result += pattern;
-        }
-        count >>= 1;
-        pattern += pattern;
-    }
-    return result + pattern;
-};
-
-var cursor = {
-    write: function (s) {
-        process.stdout.write(s);
-        return this;
-    },
-    green: escSeq('[0;32m'),
-    red: escSeq('[0;31m'),
-    cyan: escSeq('[0;36m'),
-    reset: escSeq('[0m')
-};
-
-var writer = new commonmark.HtmlRenderer();
-var reader = new commonmark.Parser();
-
-var results = {
-    passed: 0,
-    failed: 0
-};
-
-var showSpaces = function(s) {
-    var t = s;
-    return t.replace(/\t/g, '→')
-        .replace(/ /g, '␣');
-};
-
-var pathologicalTest = function(testcase, res) {
-    cursor.write(testcase.name + ' ');
-    console.time('  elapsed time');
-    var actual = writer.render(reader.parse(testcase.input));
-    if (actual === testcase.expected) {
-        cursor.green().write('✓\n').reset();
-        res.passed += 1;
-    } else {
-        cursor.red().write('✘\n');
-        cursor.cyan();
-        cursor.write('=== markdown ===============\n');
-        cursor.write(showSpaces(testcase.input));
-        cursor.write('=== expected ===============\n');
-        cursor.write(showSpaces(testcase.expected));
-        cursor.write('=== got ====================\n');
-        cursor.write(showSpaces(actual));
-        cursor.write('\n');
-        cursor.reset();
-        res.failed += 1;
-    }
-    console.timeEnd('  elapsed time');
-};
-
-fs.readFile('spec.txt', 'utf8', function(err, data) {
-    if (err) {
-        return console.log(err);
-    }
-    var i;
-    var examples = [];
-    var current_section = "";
-    var example_number = 0;
-    var tests = data
-            .replace(/\r\n?/g, "\n") // Normalize newlines for platform independence
-            .replace(/^<!-- END TESTS -->(.|[\n])*/m, '');
-
-    tests.replace(/^\.\n([\s\S]*?)^\.\n([\s\S]*?)^\.$|^#{1,6} *(.*)$/gm,
-                  function(_, markdownSubmatch, htmlSubmatch, sectionSubmatch){
-                      if (sectionSubmatch) {
-                          current_section = sectionSubmatch;
-                      } else {
-                          example_number++;
-                          examples.push({markdown: markdownSubmatch,
-                                         html: htmlSubmatch,
-                                         section: current_section,
-                                         number: example_number});
-                      }
-                  });
-
-    current_section = "";
-
-    cursor.write('Spec tests:\n\n');
-    console.time("Elapsed time");
-
-    for (i = 0; i < examples.length; i++) {
-        var example = examples[i];
-        if (example.section !== current_section) {
-            if (current_section !== '') {
-                cursor.write('\n');
-            }
-            current_section = example.section;
-            cursor.reset().write(current_section).reset().write('  ');
-        }
-        var actual = writer.render(reader.parse(example.markdown.replace(/→/g, '\t')));
-        if (actual === example.html) {
-            results.passed++;
-            cursor.green().write('✓').reset();
-        } else {
-            results.failed++;
-            cursor.write('\n');
-
-            cursor.red().write('✘ Example ' + example.number + '\n');
-            cursor.cyan();
-            cursor.write('=== markdown ===============\n');
-            cursor.write(showSpaces(example.markdown));
-            cursor.write('=== expected ===============\n');
-            cursor.write(showSpaces(example.html));
-            cursor.write('=== got ====================\n');
-            cursor.write(showSpaces(actual));
-            cursor.reset();
-        }
-    }
-    cursor.write('\n');
-    console.timeEnd("Elapsed time");
-
-    // pathological cases
-    cursor.write('\nPathological cases:\n');
-
-    var cases = [
-        { name: 'U+0000 in input',
-          input: 'abc\u0000xyz\u0000\n',
-          expected: '<p>abc\ufffdxyz\ufffd</p>\n' },
-        { name: 'nested strong emph 10000 deep',
-          input: repeat('*a **a ', 10000) + 'b' + repeat(' a** a*', 10000),
-          expected: '<p>' + repeat('<em>a <strong>a ', 10000) + 'b' +
-          repeat(' a</strong> a</em>', 10000) + '</p>\n' },
-        { name: 'nested brackets 10000 deep',
-          input: repeat('[', 10000) + 'a' + repeat(']', 10000),
-          expected: '<p>' + repeat('[', 10000) + 'a' + repeat(']', 10000) +
-          '</p>\n' },
-        { name: 'nested block quote 10000 deep',
-          input: repeat('> ', 10000) + 'a\n',
-          expected: repeat('<blockquote>\n', 10000) + '<p>a</p>\n' +
-                    repeat('</blockquote>\n', 10000) }
-    ];
-
-    for (i = 0; i < cases.length; i++) {
-        pathologicalTest(cases[i], results);
-    }
-    cursor.write('\n');
-
-    cursor.write(results.passed.toString() + ' tests passed, ' +
-                 results.failed.toString() + ' failed.\n');
-});
diff --git a/tools/detailed_benchmarks.sh b/tools/detailed_benchmarks.sh
@@ -1,2 +0,0 @@
-sudo echo ""
-for x in samples/*.md; do make benchjs BENCHINP=$x; done | awk -f tools/format_benchmarks.awk
diff --git a/tools/format_benchmarks.awk b/tools/format_benchmarks.awk
@@ -1,35 +0,0 @@
-#!/bin/sh env awk
-BEGIN {
-    CONVFMT="%2.1f";
-    print "| Sample                 |showdown  |commonmark|marked    |markdown-it|"
-    print "|------------------------|---------:|---------:|---------:|----------:|"
-}
-{
-        if (/samples\//) {
-                sub(/samples\//, "");
-                printf "|%-24s|", $7;
-        } else if (/^showdown/) {
-                sub(/,/, "");
-                showdown = $4;
-        } else if (/^commonmark/) {
-                sub(/,/, "");
-                commonmark = $4;
-        } else if (/^marked/) {
-                sub(/,/, "");
-                marked = $4;
-        } else if (/^markdown-it/) {
-                sub(/,/, "");
-                markdownit = $4;
-                printf "%10s|%10s|%10s|%11s|\n",
-                       (showdown / showdown),
-                       (commonmark / showdown),
-                       (marked / showdown),
-                       (markdownit / showdown);
-                markdownit = "";
-                showdown = "";
-                marked = "";
-                commonmark = "";
-        } else {
-                next;
-        }
-}