var __create = Object.create;
var __getProtoOf = Object.getPrototypeOf;
var __defProp = Object.defineProperty;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __toESM = (mod, isNodeMode, target) => {
  target = mod != null ? __create(__getProtoOf(mod)) : {};
  const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
  for (let key of __getOwnPropNames(mod))
    if (!__hasOwnProp.call(to, key))
      __defProp(to, key, {
        get: () => mod[key],
        enumerable: true
      });
  return to;
};
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);

// node_modules/mithril/render/vnode.js
var require_vnode = __commonJS((exports, module) => {
  function Vnode(tag, key, attrs, children, text, dom) {
    return { tag, key, attrs, children, text, dom, domSize: undefined, state: undefined, events: undefined, instance: undefined };
  }
  Vnode.normalize = function(node) {
    if (Array.isArray(node))
      return Vnode("[", undefined, undefined, Vnode.normalizeChildren(node), undefined, undefined);
    if (node == null || typeof node === "boolean")
      return null;
    if (typeof node === "object")
      return node;
    return Vnode("#", undefined, undefined, String(node), undefined, undefined);
  };
  Vnode.normalizeChildren = function(input) {
    var children = [];
    if (input.length) {
      var isKeyed = input[0] != null && input[0].key != null;
      for (var i = 1;i < input.length; i++) {
        if ((input[i] != null && input[i].key != null) !== isKeyed) {
          throw new TypeError(isKeyed && (input[i] != null || typeof input[i] === "boolean") ? "In fragments, vnodes must either all have keys or none have keys. You may wish to consider using an explicit keyed empty fragment, m.fragment({key: ...}), instead of a hole." : "In fragments, vnodes must either all have keys or none have keys.");
        }
      }
      for (var i = 0;i < input.length; i++) {
        children[i] = Vnode.normalize(input[i]);
      }
    }
    return children;
  };
  module.exports = Vnode;
});

// node_modules/mithril/render/hyperscriptVnode.js
var require_hyperscriptVnode = __commonJS((exports, module) => {
  var Vnode = require_vnode();
  module.exports = function() {
    var attrs = arguments[this], start = this + 1, children;
    if (attrs == null) {
      attrs = {};
    } else if (typeof attrs !== "object" || attrs.tag != null || Array.isArray(attrs)) {
      attrs = {};
      start = this;
    }
    if (arguments.length === start + 1) {
      children = arguments[start];
      if (!Array.isArray(children))
        children = [children];
    } else {
      children = [];
      while (start < arguments.length)
        children.push(arguments[start++]);
    }
    return Vnode("", attrs.key, attrs, children);
  };
});

// node_modules/mithril/util/hasOwn.js
var require_hasOwn = __commonJS((exports, module) => {
  module.exports = {}.hasOwnProperty;
});

// node_modules/mithril/render/hyperscript.js
var require_hyperscript = __commonJS((exports, module) => {
  function isEmpty(object) {
    for (var key in object)
      if (hasOwn.call(object, key))
        return false;
    return true;
  }
  function compileSelector(selector) {
    var match, tag = "div", classes = [], attrs = {};
    while (match = selectorParser.exec(selector)) {
      var type = match[1], value = match[2];
      if (type === "" && value !== "")
        tag = value;
      else if (type === "#")
        attrs.id = value;
      else if (type === ".")
        classes.push(value);
      else if (match[3][0] === "[") {
        var attrValue = match[6];
        if (attrValue)
          attrValue = attrValue.replace(/\\(["'])/g, "$1").replace(/\\\\/g, "\\");
        if (match[4] === "class")
          classes.push(attrValue);
        else
          attrs[match[4]] = attrValue === "" ? attrValue : attrValue || true;
      }
    }
    if (classes.length > 0)
      attrs.className = classes.join(" ");
    return selectorCache[selector] = { tag, attrs };
  }
  function execSelector(state, vnode) {
    var attrs = vnode.attrs;
    var hasClass = hasOwn.call(attrs, "class");
    var className = hasClass ? attrs.class : attrs.className;
    vnode.tag = state.tag;
    if (!isEmpty(state.attrs)) {
      var newAttrs = {};
      for (var key in attrs) {
        if (hasOwn.call(attrs, key))
          newAttrs[key] = attrs[key];
      }
      attrs = newAttrs;
    }
    for (var key in state.attrs) {
      if (hasOwn.call(state.attrs, key) && key !== "className" && !hasOwn.call(attrs, key)) {
        attrs[key] = state.attrs[key];
      }
    }
    if (className != null || state.attrs.className != null)
      attrs.className = className != null ? state.attrs.className != null ? String(state.attrs.className) + " " + String(className) : className : state.attrs.className != null ? state.attrs.className : null;
    if (hasClass)
      attrs.class = null;
    vnode.attrs = attrs;
    return vnode;
  }
  function hyperscript(selector) {
    if (selector == null || typeof selector !== "string" && typeof selector !== "function" && typeof selector.view !== "function") {
      throw Error("The selector must be either a string or a component.");
    }
    var vnode = hyperscriptVnode.apply(1, arguments);
    if (typeof selector === "string") {
      vnode.children = Vnode.normalizeChildren(vnode.children);
      if (selector !== "[")
        return execSelector(selectorCache[selector] || compileSelector(selector), vnode);
    }
    vnode.tag = selector;
    return vnode;
  }
  var Vnode = require_vnode();
  var hyperscriptVnode = require_hyperscriptVnode();
  var hasOwn = require_hasOwn();
  var selectorParser = /(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g;
  var selectorCache = {};
  module.exports = hyperscript;
});

// node_modules/mithril/render/trust.js
var require_trust = __commonJS((exports, module) => {
  var Vnode = require_vnode();
  module.exports = function(html) {
    if (html == null)
      html = "";
    return Vnode("<", undefined, undefined, html, undefined, undefined);
  };
});

// node_modules/mithril/render/fragment.js
var require_fragment = __commonJS((exports, module) => {
  var Vnode = require_vnode();
  var hyperscriptVnode = require_hyperscriptVnode();
  module.exports = function() {
    var vnode = hyperscriptVnode.apply(0, arguments);
    vnode.tag = "[";
    vnode.children = Vnode.normalizeChildren(vnode.children);
    return vnode;
  };
});

// node_modules/mithril/hyperscript.js
var require_hyperscript2 = __commonJS((exports, module) => {
  var hyperscript = require_hyperscript();
  hyperscript.trust = require_trust();
  hyperscript.fragment = require_fragment();
  module.exports = hyperscript;
});

// node_modules/mithril/render/domFor.js
var require_domFor = __commonJS((exports, module) => {
  function* domFor({ dom, domSize }, { generation } = {}) {
    if (dom != null)
      do {
        const { nextSibling } = dom;
        if (delayedRemoval.get(dom) === generation) {
          yield dom;
          domSize--;
        }
        dom = nextSibling;
      } while (domSize);
  }
  var delayedRemoval = new WeakMap;
  module.exports = {
    delayedRemoval,
    domFor
  };
});

// node_modules/mithril/render/render.js
var require_render = __commonJS((exports, module) => {
  var Vnode = require_vnode();
  var df = require_domFor();
  var delayedRemoval = df.delayedRemoval;
  var domFor = df.domFor;
  module.exports = function() {
    var nameSpace = {
      svg: "http://www.w3.org/2000/svg",
      math: "http://www.w3.org/1998/Math/MathML"
    };
    var currentRedraw;
    var currentRender;
    function getDocument(dom) {
      return dom.ownerDocument;
    }
    function getNameSpace(vnode) {
      return vnode.attrs && vnode.attrs.xmlns || nameSpace[vnode.tag];
    }
    function checkState(vnode, original) {
      if (vnode.state !== original)
        throw new Error("'vnode.state' must not be modified.");
    }
    function callHook(vnode) {
      var original = vnode.state;
      try {
        return this.apply(original, arguments);
      } finally {
        checkState(vnode, original);
      }
    }
    function activeElement(dom) {
      try {
        return getDocument(dom).activeElement;
      } catch (e) {
        return null;
      }
    }
    function createNodes(parent, vnodes, start, end, hooks, nextSibling, ns) {
      for (var i = start;i < end; i++) {
        var vnode = vnodes[i];
        if (vnode != null) {
          createNode(parent, vnode, hooks, ns, nextSibling);
        }
      }
    }
    function createNode(parent, vnode, hooks, ns, nextSibling) {
      var tag = vnode.tag;
      if (typeof tag === "string") {
        vnode.state = {};
        if (vnode.attrs != null)
          initLifecycle(vnode.attrs, vnode, hooks);
        switch (tag) {
          case "#":
            createText(parent, vnode, nextSibling);
            break;
          case "<":
            createHTML(parent, vnode, ns, nextSibling);
            break;
          case "[":
            createFragment(parent, vnode, hooks, ns, nextSibling);
            break;
          default:
            createElement(parent, vnode, hooks, ns, nextSibling);
        }
      } else
        createComponent(parent, vnode, hooks, ns, nextSibling);
    }
    function createText(parent, vnode, nextSibling) {
      vnode.dom = getDocument(parent).createTextNode(vnode.children);
      insertDOM(parent, vnode.dom, nextSibling);
    }
    var possibleParents = { caption: "table", thead: "table", tbody: "table", tfoot: "table", tr: "tbody", th: "tr", td: "tr", colgroup: "table", col: "colgroup" };
    function createHTML(parent, vnode, ns, nextSibling) {
      var match = vnode.children.match(/^\s*?<(\w+)/im) || [];
      var temp = getDocument(parent).createElement(possibleParents[match[1]] || "div");
      if (ns === "http://www.w3.org/2000/svg") {
        temp.innerHTML = "<svg xmlns=\"http://www.w3.org/2000/svg\">" + vnode.children + "</svg>";
        temp = temp.firstChild;
      } else {
        temp.innerHTML = vnode.children;
      }
      vnode.dom = temp.firstChild;
      vnode.domSize = temp.childNodes.length;
      var fragment = getDocument(parent).createDocumentFragment();
      var child;
      while (child = temp.firstChild) {
        fragment.appendChild(child);
      }
      insertDOM(parent, fragment, nextSibling);
    }
    function createFragment(parent, vnode, hooks, ns, nextSibling) {
      var fragment = getDocument(parent).createDocumentFragment();
      if (vnode.children != null) {
        var children = vnode.children;
        createNodes(fragment, children, 0, children.length, hooks, null, ns);
      }
      vnode.dom = fragment.firstChild;
      vnode.domSize = fragment.childNodes.length;
      insertDOM(parent, fragment, nextSibling);
    }
    function createElement(parent, vnode, hooks, ns, nextSibling) {
      var tag = vnode.tag;
      var attrs = vnode.attrs;
      var is = attrs && attrs.is;
      ns = getNameSpace(vnode) || ns;
      var element = ns ? is ? getDocument(parent).createElementNS(ns, tag, { is }) : getDocument(parent).createElementNS(ns, tag) : is ? getDocument(parent).createElement(tag, { is }) : getDocument(parent).createElement(tag);
      vnode.dom = element;
      if (attrs != null) {
        setAttrs(vnode, attrs, ns);
      }
      insertDOM(parent, element, nextSibling);
      if (!maybeSetContentEditable(vnode)) {
        if (vnode.children != null) {
          var children = vnode.children;
          createNodes(element, children, 0, children.length, hooks, null, ns);
          if (vnode.tag === "select" && attrs != null)
            setLateSelectAttrs(vnode, attrs);
        }
      }
    }
    function initComponent(vnode, hooks) {
      var sentinel;
      if (typeof vnode.tag.view === "function") {
        vnode.state = Object.create(vnode.tag);
        sentinel = vnode.state.view;
        if (sentinel.$$reentrantLock$$ != null)
          return;
        sentinel.$$reentrantLock$$ = true;
      } else {
        vnode.state = undefined;
        sentinel = vnode.tag;
        if (sentinel.$$reentrantLock$$ != null)
          return;
        sentinel.$$reentrantLock$$ = true;
        vnode.state = vnode.tag.prototype != null && typeof vnode.tag.prototype.view === "function" ? new vnode.tag(vnode) : vnode.tag(vnode);
      }
      initLifecycle(vnode.state, vnode, hooks);
      if (vnode.attrs != null)
        initLifecycle(vnode.attrs, vnode, hooks);
      vnode.instance = Vnode.normalize(callHook.call(vnode.state.view, vnode));
      if (vnode.instance === vnode)
        throw Error("A view cannot return the vnode it received as argument");
      sentinel.$$reentrantLock$$ = null;
    }
    function createComponent(parent, vnode, hooks, ns, nextSibling) {
      initComponent(vnode, hooks);
      if (vnode.instance != null) {
        createNode(parent, vnode.instance, hooks, ns, nextSibling);
        vnode.dom = vnode.instance.dom;
        vnode.domSize = vnode.dom != null ? vnode.instance.domSize : 0;
      } else {
        vnode.domSize = 0;
      }
    }
    function updateNodes(parent, old, vnodes, hooks, nextSibling, ns) {
      if (old === vnodes || old == null && vnodes == null)
        return;
      else if (old == null || old.length === 0)
        createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, ns);
      else if (vnodes == null || vnodes.length === 0)
        removeNodes(parent, old, 0, old.length);
      else {
        var isOldKeyed = old[0] != null && old[0].key != null;
        var isKeyed = vnodes[0] != null && vnodes[0].key != null;
        var start = 0, oldStart = 0;
        if (!isOldKeyed)
          while (oldStart < old.length && old[oldStart] == null)
            oldStart++;
        if (!isKeyed)
          while (start < vnodes.length && vnodes[start] == null)
            start++;
        if (isOldKeyed !== isKeyed) {
          removeNodes(parent, old, oldStart, old.length);
          createNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns);
        } else if (!isKeyed) {
          var commonLength = old.length < vnodes.length ? old.length : vnodes.length;
          start = start < oldStart ? start : oldStart;
          for (;start < commonLength; start++) {
            o = old[start];
            v = vnodes[start];
            if (o === v || o == null && v == null)
              continue;
            else if (o == null)
              createNode(parent, v, hooks, ns, getNextSibling(old, start + 1, nextSibling));
            else if (v == null)
              removeNode(parent, o);
            else
              updateNode(parent, o, v, hooks, getNextSibling(old, start + 1, nextSibling), ns);
          }
          if (old.length > commonLength)
            removeNodes(parent, old, start, old.length);
          if (vnodes.length > commonLength)
            createNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns);
        } else {
          var oldEnd = old.length - 1, end = vnodes.length - 1, map, o, v, oe, ve, topSibling;
          while (oldEnd >= oldStart && end >= start) {
            oe = old[oldEnd];
            ve = vnodes[end];
            if (oe.key !== ve.key)
              break;
            if (oe !== ve)
              updateNode(parent, oe, ve, hooks, nextSibling, ns);
            if (ve.dom != null)
              nextSibling = ve.dom;
            oldEnd--, end--;
          }
          while (oldEnd >= oldStart && end >= start) {
            o = old[oldStart];
            v = vnodes[start];
            if (o.key !== v.key)
              break;
            oldStart++, start++;
            if (o !== v)
              updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), ns);
          }
          while (oldEnd >= oldStart && end >= start) {
            if (start === end)
              break;
            if (o.key !== ve.key || oe.key !== v.key)
              break;
            topSibling = getNextSibling(old, oldStart, nextSibling);
            moveDOM(parent, oe, topSibling);
            if (oe !== v)
              updateNode(parent, oe, v, hooks, topSibling, ns);
            if (++start <= --end)
              moveDOM(parent, o, nextSibling);
            if (o !== ve)
              updateNode(parent, o, ve, hooks, nextSibling, ns);
            if (ve.dom != null)
              nextSibling = ve.dom;
            oldStart++;
            oldEnd--;
            oe = old[oldEnd];
            ve = vnodes[end];
            o = old[oldStart];
            v = vnodes[start];
          }
          while (oldEnd >= oldStart && end >= start) {
            if (oe.key !== ve.key)
              break;
            if (oe !== ve)
              updateNode(parent, oe, ve, hooks, nextSibling, ns);
            if (ve.dom != null)
              nextSibling = ve.dom;
            oldEnd--, end--;
            oe = old[oldEnd];
            ve = vnodes[end];
          }
          if (start > end)
            removeNodes(parent, old, oldStart, oldEnd + 1);
          else if (oldStart > oldEnd)
            createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns);
          else {
            var originalNextSibling = nextSibling, vnodesLength = end - start + 1, oldIndices = new Array(vnodesLength), li = 0, i = 0, pos = 2147483647, matched = 0, map, lisIndices;
            for (i = 0;i < vnodesLength; i++)
              oldIndices[i] = -1;
            for (i = end;i >= start; i--) {
              if (map == null)
                map = getKeyMap(old, oldStart, oldEnd + 1);
              ve = vnodes[i];
              var oldIndex = map[ve.key];
              if (oldIndex != null) {
                pos = oldIndex < pos ? oldIndex : -1;
                oldIndices[i - start] = oldIndex;
                oe = old[oldIndex];
                old[oldIndex] = null;
                if (oe !== ve)
                  updateNode(parent, oe, ve, hooks, nextSibling, ns);
                if (ve.dom != null)
                  nextSibling = ve.dom;
                matched++;
              }
            }
            nextSibling = originalNextSibling;
            if (matched !== oldEnd - oldStart + 1)
              removeNodes(parent, old, oldStart, oldEnd + 1);
            if (matched === 0)
              createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns);
            else {
              if (pos === -1) {
                lisIndices = makeLisIndices(oldIndices);
                li = lisIndices.length - 1;
                for (i = end;i >= start; i--) {
                  v = vnodes[i];
                  if (oldIndices[i - start] === -1)
                    createNode(parent, v, hooks, ns, nextSibling);
                  else {
                    if (lisIndices[li] === i - start)
                      li--;
                    else
                      moveDOM(parent, v, nextSibling);
                  }
                  if (v.dom != null)
                    nextSibling = vnodes[i].dom;
                }
              } else {
                for (i = end;i >= start; i--) {
                  v = vnodes[i];
                  if (oldIndices[i - start] === -1)
                    createNode(parent, v, hooks, ns, nextSibling);
                  if (v.dom != null)
                    nextSibling = vnodes[i].dom;
                }
              }
            }
          }
        }
      }
    }
    function updateNode(parent, old, vnode, hooks, nextSibling, ns) {
      var oldTag = old.tag, tag = vnode.tag;
      if (oldTag === tag) {
        vnode.state = old.state;
        vnode.events = old.events;
        if (shouldNotUpdate(vnode, old))
          return;
        if (typeof oldTag === "string") {
          if (vnode.attrs != null) {
            updateLifecycle(vnode.attrs, vnode, hooks);
          }
          switch (oldTag) {
            case "#":
              updateText(old, vnode);
              break;
            case "<":
              updateHTML(parent, old, vnode, ns, nextSibling);
              break;
            case "[":
              updateFragment(parent, old, vnode, hooks, nextSibling, ns);
              break;
            default:
              updateElement(old, vnode, hooks, ns);
          }
        } else
          updateComponent(parent, old, vnode, hooks, nextSibling, ns);
      } else {
        removeNode(parent, old);
        createNode(parent, vnode, hooks, ns, nextSibling);
      }
    }
    function updateText(old, vnode) {
      if (old.children.toString() !== vnode.children.toString()) {
        old.dom.nodeValue = vnode.children;
      }
      vnode.dom = old.dom;
    }
    function updateHTML(parent, old, vnode, ns, nextSibling) {
      if (old.children !== vnode.children) {
        removeDOM(parent, old, undefined);
        createHTML(parent, vnode, ns, nextSibling);
      } else {
        vnode.dom = old.dom;
        vnode.domSize = old.domSize;
      }
    }
    function updateFragment(parent, old, vnode, hooks, nextSibling, ns) {
      updateNodes(parent, old.children, vnode.children, hooks, nextSibling, ns);
      var domSize = 0, children = vnode.children;
      vnode.dom = null;
      if (children != null) {
        for (var i = 0;i < children.length; i++) {
          var child = children[i];
          if (child != null && child.dom != null) {
            if (vnode.dom == null)
              vnode.dom = child.dom;
            domSize += child.domSize || 1;
          }
        }
        if (domSize !== 1)
          vnode.domSize = domSize;
      }
    }
    function updateElement(old, vnode, hooks, ns) {
      var element = vnode.dom = old.dom;
      ns = getNameSpace(vnode) || ns;
      updateAttrs(vnode, old.attrs, vnode.attrs, ns);
      if (!maybeSetContentEditable(vnode)) {
        updateNodes(element, old.children, vnode.children, hooks, null, ns);
      }
    }
    function updateComponent(parent, old, vnode, hooks, nextSibling, ns) {
      vnode.instance = Vnode.normalize(callHook.call(vnode.state.view, vnode));
      if (vnode.instance === vnode)
        throw Error("A view cannot return the vnode it received as argument");
      updateLifecycle(vnode.state, vnode, hooks);
      if (vnode.attrs != null)
        updateLifecycle(vnode.attrs, vnode, hooks);
      if (vnode.instance != null) {
        if (old.instance == null)
          createNode(parent, vnode.instance, hooks, ns, nextSibling);
        else
          updateNode(parent, old.instance, vnode.instance, hooks, nextSibling, ns);
        vnode.dom = vnode.instance.dom;
        vnode.domSize = vnode.instance.domSize;
      } else if (old.instance != null) {
        removeNode(parent, old.instance);
        vnode.dom = undefined;
        vnode.domSize = 0;
      } else {
        vnode.dom = old.dom;
        vnode.domSize = old.domSize;
      }
    }
    function getKeyMap(vnodes, start, end) {
      var map = Object.create(null);
      for (;start < end; start++) {
        var vnode = vnodes[start];
        if (vnode != null) {
          var key = vnode.key;
          if (key != null)
            map[key] = start;
        }
      }
      return map;
    }
    var lisTemp = [];
    function makeLisIndices(a) {
      var result = [0];
      var u = 0, v = 0, i = 0;
      var il = lisTemp.length = a.length;
      for (var i = 0;i < il; i++)
        lisTemp[i] = a[i];
      for (var i = 0;i < il; ++i) {
        if (a[i] === -1)
          continue;
        var j = result[result.length - 1];
        if (a[j] < a[i]) {
          lisTemp[i] = j;
          result.push(i);
          continue;
        }
        u = 0;
        v = result.length - 1;
        while (u < v) {
          var c = (u >>> 1) + (v >>> 1) + (u & v & 1);
          if (a[result[c]] < a[i]) {
            u = c + 1;
          } else {
            v = c;
          }
        }
        if (a[i] < a[result[u]]) {
          if (u > 0)
            lisTemp[i] = result[u - 1];
          result[u] = i;
        }
      }
      u = result.length;
      v = result[u - 1];
      while (u-- > 0) {
        result[u] = v;
        v = lisTemp[v];
      }
      lisTemp.length = 0;
      return result;
    }
    function getNextSibling(vnodes, i, nextSibling) {
      for (;i < vnodes.length; i++) {
        if (vnodes[i] != null && vnodes[i].dom != null)
          return vnodes[i].dom;
      }
      return nextSibling;
    }
    function moveDOM(parent, vnode, nextSibling) {
      if (vnode.dom != null) {
        var target;
        if (vnode.domSize == null) {
          target = vnode.dom;
        } else {
          target = getDocument(parent).createDocumentFragment();
          for (var dom of domFor(vnode))
            target.appendChild(dom);
        }
        insertDOM(parent, target, nextSibling);
      }
    }
    function insertDOM(parent, dom, nextSibling) {
      if (nextSibling != null)
        parent.insertBefore(dom, nextSibling);
      else
        parent.appendChild(dom);
    }
    function maybeSetContentEditable(vnode) {
      if (vnode.attrs == null || vnode.attrs.contenteditable == null && vnode.attrs.contentEditable == null)
        return false;
      var children = vnode.children;
      if (children != null && children.length === 1 && children[0].tag === "<") {
        var content = children[0].children;
        if (vnode.dom.innerHTML !== content)
          vnode.dom.innerHTML = content;
      } else if (children != null && children.length !== 0)
        throw new Error("Child node of a contenteditable must be trusted.");
      return true;
    }
    function removeNodes(parent, vnodes, start, end) {
      for (var i = start;i < end; i++) {
        var vnode = vnodes[i];
        if (vnode != null)
          removeNode(parent, vnode);
      }
    }
    function removeNode(parent, vnode) {
      var mask = 0;
      var original = vnode.state;
      var stateResult, attrsResult;
      if (typeof vnode.tag !== "string" && typeof vnode.state.onbeforeremove === "function") {
        var result = callHook.call(vnode.state.onbeforeremove, vnode);
        if (result != null && typeof result.then === "function") {
          mask = 1;
          stateResult = result;
        }
      }
      if (vnode.attrs && typeof vnode.attrs.onbeforeremove === "function") {
        var result = callHook.call(vnode.attrs.onbeforeremove, vnode);
        if (result != null && typeof result.then === "function") {
          mask |= 2;
          attrsResult = result;
        }
      }
      checkState(vnode, original);
      var generation;
      if (!mask) {
        onremove(vnode);
        removeDOM(parent, vnode, generation);
      } else {
        generation = currentRender;
        for (var dom of domFor(vnode))
          delayedRemoval.set(dom, generation);
        if (stateResult != null) {
          stateResult.finally(function() {
            if (mask & 1) {
              mask &= 2;
              if (!mask) {
                checkState(vnode, original);
                onremove(vnode);
                removeDOM(parent, vnode, generation);
              }
            }
          });
        }
        if (attrsResult != null) {
          attrsResult.finally(function() {
            if (mask & 2) {
              mask &= 1;
              if (!mask) {
                checkState(vnode, original);
                onremove(vnode);
                removeDOM(parent, vnode, generation);
              }
            }
          });
        }
      }
    }
    function removeDOM(parent, vnode, generation) {
      if (vnode.dom == null)
        return;
      if (vnode.domSize == null) {
        if (delayedRemoval.get(vnode.dom) === generation)
          parent.removeChild(vnode.dom);
      } else {
        for (var dom of domFor(vnode, { generation }))
          parent.removeChild(dom);
      }
    }
    function onremove(vnode) {
      if (typeof vnode.tag !== "string" && typeof vnode.state.onremove === "function")
        callHook.call(vnode.state.onremove, vnode);
      if (vnode.attrs && typeof vnode.attrs.onremove === "function")
        callHook.call(vnode.attrs.onremove, vnode);
      if (typeof vnode.tag !== "string") {
        if (vnode.instance != null)
          onremove(vnode.instance);
      } else {
        var children = vnode.children;
        if (Array.isArray(children)) {
          for (var i = 0;i < children.length; i++) {
            var child = children[i];
            if (child != null)
              onremove(child);
          }
        }
      }
    }
    function setAttrs(vnode, attrs, ns) {
      if (vnode.tag === "input" && attrs.type != null)
        vnode.dom.setAttribute("type", attrs.type);
      var isFileInput = attrs != null && vnode.tag === "input" && attrs.type === "file";
      for (var key in attrs) {
        setAttr(vnode, key, null, attrs[key], ns, isFileInput);
      }
    }
    function setAttr(vnode, key, old, value, ns, isFileInput) {
      if (key === "key" || key === "is" || value == null || isLifecycleMethod(key) || old === value && !isFormAttribute(vnode, key) && typeof value !== "object" || key === "type" && vnode.tag === "input")
        return;
      if (key[0] === "o" && key[1] === "n")
        return updateEvent(vnode, key, value);
      if (key.slice(0, 6) === "xlink:")
        vnode.dom.setAttributeNS("http://www.w3.org/1999/xlink", key.slice(6), value);
      else if (key === "style")
        updateStyle(vnode.dom, old, value);
      else if (hasPropertyKey(vnode, key, ns)) {
        if (key === "value") {
          if ((vnode.tag === "input" || vnode.tag === "textarea") && vnode.dom.value === "" + value && (isFileInput || vnode.dom === activeElement(vnode.dom)))
            return;
          if (vnode.tag === "select" && old !== null && vnode.dom.value === "" + value)
            return;
          if (vnode.tag === "option" && old !== null && vnode.dom.value === "" + value)
            return;
          if (isFileInput && "" + value !== "") {
            console.error("`value` is read-only on file inputs!");
            return;
          }
        }
        vnode.dom[key] = value;
      } else {
        if (typeof value === "boolean") {
          if (value)
            vnode.dom.setAttribute(key, "");
          else
            vnode.dom.removeAttribute(key);
        } else
          vnode.dom.setAttribute(key === "className" ? "class" : key, value);
      }
    }
    function removeAttr(vnode, key, old, ns) {
      if (key === "key" || key === "is" || old == null || isLifecycleMethod(key))
        return;
      if (key[0] === "o" && key[1] === "n")
        updateEvent(vnode, key, undefined);
      else if (key === "style")
        updateStyle(vnode.dom, old, null);
      else if (hasPropertyKey(vnode, key, ns) && key !== "className" && key !== "title" && !(key === "value" && (vnode.tag === "option" || vnode.tag === "select" && vnode.dom.selectedIndex === -1 && vnode.dom === activeElement(vnode.dom))) && !(vnode.tag === "input" && key === "type")) {
        vnode.dom[key] = null;
      } else {
        var nsLastIndex = key.indexOf(":");
        if (nsLastIndex !== -1)
          key = key.slice(nsLastIndex + 1);
        if (old !== false)
          vnode.dom.removeAttribute(key === "className" ? "class" : key);
      }
    }
    function setLateSelectAttrs(vnode, attrs) {
      if ("value" in attrs) {
        if (attrs.value === null) {
          if (vnode.dom.selectedIndex !== -1)
            vnode.dom.value = null;
        } else {
          var normalized = "" + attrs.value;
          if (vnode.dom.value !== normalized || vnode.dom.selectedIndex === -1) {
            vnode.dom.value = normalized;
          }
        }
      }
      if ("selectedIndex" in attrs)
        setAttr(vnode, "selectedIndex", null, attrs.selectedIndex, undefined);
    }
    function updateAttrs(vnode, old, attrs, ns) {
      if (old && old === attrs) {
        console.warn("Don't reuse attrs object, use new object for every redraw, this will throw in next major");
      }
      if (attrs != null) {
        if (vnode.tag === "input" && attrs.type != null)
          vnode.dom.setAttribute("type", attrs.type);
        var isFileInput = vnode.tag === "input" && attrs.type === "file";
        for (var key in attrs) {
          setAttr(vnode, key, old && old[key], attrs[key], ns, isFileInput);
        }
      }
      var val;
      if (old != null) {
        for (var key in old) {
          if ((val = old[key]) != null && (attrs == null || attrs[key] == null)) {
            removeAttr(vnode, key, val, ns);
          }
        }
      }
    }
    function isFormAttribute(vnode, attr) {
      return attr === "value" || attr === "checked" || attr === "selectedIndex" || attr === "selected" && vnode.dom === activeElement(vnode.dom) || vnode.tag === "option" && vnode.dom.parentNode === activeElement(vnode.dom);
    }
    function isLifecycleMethod(attr) {
      return attr === "oninit" || attr === "oncreate" || attr === "onupdate" || attr === "onremove" || attr === "onbeforeremove" || attr === "onbeforeupdate";
    }
    function hasPropertyKey(vnode, key, ns) {
      return ns === undefined && (vnode.tag.indexOf("-") > -1 || vnode.attrs != null && vnode.attrs.is || key !== "href" && key !== "list" && key !== "form" && key !== "width" && key !== "height") && key in vnode.dom;
    }
    var uppercaseRegex = /[A-Z]/g;
    function toLowerCase(capital) {
      return "-" + capital.toLowerCase();
    }
    function normalizeKey(key) {
      return key[0] === "-" && key[1] === "-" ? key : key === "cssFloat" ? "float" : key.replace(uppercaseRegex, toLowerCase);
    }
    function updateStyle(element, old, style) {
      if (old === style) {
      } else if (style == null) {
        element.style = "";
      } else if (typeof style !== "object") {
        element.style = style;
      } else if (old == null || typeof old !== "object") {
        element.style.cssText = "";
        for (var key in style) {
          var value = style[key];
          if (value != null)
            element.style.setProperty(normalizeKey(key), String(value));
        }
      } else {
        for (var key in style) {
          var value = style[key];
          if (value != null && (value = String(value)) !== String(old[key])) {
            element.style.setProperty(normalizeKey(key), value);
          }
        }
        for (var key in old) {
          if (old[key] != null && style[key] == null) {
            element.style.removeProperty(normalizeKey(key));
          }
        }
      }
    }
    function EventDict() {
      this._ = currentRedraw;
    }
    EventDict.prototype = Object.create(null);
    EventDict.prototype.handleEvent = function(ev) {
      var handler = this["on" + ev.type];
      var result;
      if (typeof handler === "function")
        result = handler.call(ev.currentTarget, ev);
      else if (typeof handler.handleEvent === "function")
        handler.handleEvent(ev);
      if (this._ && ev.redraw !== false)
        (0, this._)();
      if (result === false) {
        ev.preventDefault();
        ev.stopPropagation();
      }
    };
    function updateEvent(vnode, key, value) {
      if (vnode.events != null) {
        vnode.events._ = currentRedraw;
        if (vnode.events[key] === value)
          return;
        if (value != null && (typeof value === "function" || typeof value === "object")) {
          if (vnode.events[key] == null)
            vnode.dom.addEventListener(key.slice(2), vnode.events, false);
          vnode.events[key] = value;
        } else {
          if (vnode.events[key] != null)
            vnode.dom.removeEventListener(key.slice(2), vnode.events, false);
          vnode.events[key] = undefined;
        }
      } else if (value != null && (typeof value === "function" || typeof value === "object")) {
        vnode.events = new EventDict;
        vnode.dom.addEventListener(key.slice(2), vnode.events, false);
        vnode.events[key] = value;
      }
    }
    function initLifecycle(source, vnode, hooks) {
      if (typeof source.oninit === "function")
        callHook.call(source.oninit, vnode);
      if (typeof source.oncreate === "function")
        hooks.push(callHook.bind(source.oncreate, vnode));
    }
    function updateLifecycle(source, vnode, hooks) {
      if (typeof source.onupdate === "function")
        hooks.push(callHook.bind(source.onupdate, vnode));
    }
    function shouldNotUpdate(vnode, old) {
      do {
        if (vnode.attrs != null && typeof vnode.attrs.onbeforeupdate === "function") {
          var force = callHook.call(vnode.attrs.onbeforeupdate, vnode, old);
          if (force !== undefined && !force)
            break;
        }
        if (typeof vnode.tag !== "string" && typeof vnode.state.onbeforeupdate === "function") {
          var force = callHook.call(vnode.state.onbeforeupdate, vnode, old);
          if (force !== undefined && !force)
            break;
        }
        return false;
      } while (false);
      vnode.dom = old.dom;
      vnode.domSize = old.domSize;
      vnode.instance = old.instance;
      vnode.attrs = old.attrs;
      vnode.children = old.children;
      vnode.text = old.text;
      return true;
    }
    var currentDOM;
    return function(dom, vnodes, redraw) {
      if (!dom)
        throw new TypeError("DOM element being rendered to does not exist.");
      if (currentDOM != null && dom.contains(currentDOM)) {
        throw new TypeError("Node is currently being rendered to and thus is locked.");
      }
      var prevRedraw = currentRedraw;
      var prevDOM = currentDOM;
      var hooks = [];
      var active = activeElement(dom);
      var namespace = dom.namespaceURI;
      currentDOM = dom;
      currentRedraw = typeof redraw === "function" ? redraw : undefined;
      currentRender = {};
      try {
        if (dom.vnodes == null)
          dom.textContent = "";
        vnodes = Vnode.normalizeChildren(Array.isArray(vnodes) ? vnodes : [vnodes]);
        updateNodes(dom, dom.vnodes, vnodes, hooks, null, namespace === "http://www.w3.org/1999/xhtml" ? undefined : namespace);
        dom.vnodes = vnodes;
        if (active != null && activeElement(dom) !== active && typeof active.focus === "function")
          active.focus();
        for (var i = 0;i < hooks.length; i++)
          hooks[i]();
      } finally {
        currentRedraw = prevRedraw;
        currentDOM = prevDOM;
      }
    };
  };
});

// node_modules/mithril/render.js
var require_render2 = __commonJS((exports, module) => {
  module.exports = require_render()(typeof window !== "undefined" ? window : null);
});

// node_modules/mithril/api/mount-redraw.js
var require_mount_redraw = __commonJS((exports, module) => {
  var Vnode = require_vnode();
  module.exports = function(render, schedule, console2) {
    var subscriptions = [];
    var pending = false;
    var offset = -1;
    function sync() {
      for (offset = 0;offset < subscriptions.length; offset += 2) {
        try {
          render(subscriptions[offset], Vnode(subscriptions[offset + 1]), redraw);
        } catch (e) {
          console2.error(e);
        }
      }
      offset = -1;
    }
    function redraw() {
      if (!pending) {
        pending = true;
        schedule(function() {
          pending = false;
          sync();
        });
      }
    }
    redraw.sync = sync;
    function mount(root, component) {
      if (component != null && component.view == null && typeof component !== "function") {
        throw new TypeError("m.mount expects a component, not a vnode.");
      }
      var index = subscriptions.indexOf(root);
      if (index >= 0) {
        subscriptions.splice(index, 2);
        if (index <= offset)
          offset -= 2;
        render(root, []);
      }
      if (component != null) {
        subscriptions.push(root, component);
        render(root, Vnode(component), redraw);
      }
    }
    return { mount, redraw };
  };
});

// node_modules/mithril/mount-redraw.js
var require_mount_redraw2 = __commonJS((exports, module) => {
  var render = require_render2();
  module.exports = require_mount_redraw()(render, typeof requestAnimationFrame !== "undefined" ? requestAnimationFrame : null, typeof console !== "undefined" ? console : null);
});

// node_modules/mithril/querystring/build.js
var require_build = __commonJS((exports, module) => {
  module.exports = function(object) {
    if (Object.prototype.toString.call(object) !== "[object Object]")
      return "";
    var args = [];
    for (var key in object) {
      destructure(key, object[key]);
    }
    return args.join("&");
    function destructure(key2, value) {
      if (Array.isArray(value)) {
        for (var i = 0;i < value.length; i++) {
          destructure(key2 + "[" + i + "]", value[i]);
        }
      } else if (Object.prototype.toString.call(value) === "[object Object]") {
        for (var i in value) {
          destructure(key2 + "[" + i + "]", value[i]);
        }
      } else
        args.push(encodeURIComponent(key2) + (value != null && value !== "" ? "=" + encodeURIComponent(value) : ""));
    }
  };
});

// node_modules/mithril/util/assign.js
var require_assign = __commonJS((exports, module) => {
  var hasOwn = require_hasOwn();
  module.exports = Object.assign || function(target, source) {
    for (var key in source) {
      if (hasOwn.call(source, key))
        target[key] = source[key];
    }
  };
});

// node_modules/mithril/pathname/build.js
var require_build2 = __commonJS((exports, module) => {
  var buildQueryString = require_build();
  var assign = require_assign();
  module.exports = function(template, params) {
    if (/:([^\/\.-]+)(\.{3})?:/.test(template)) {
      throw new SyntaxError("Template parameter names must be separated by either a '/', '-', or '.'.");
    }
    if (params == null)
      return template;
    var queryIndex = template.indexOf("?");
    var hashIndex = template.indexOf("#");
    var queryEnd = hashIndex < 0 ? template.length : hashIndex;
    var pathEnd = queryIndex < 0 ? queryEnd : queryIndex;
    var path = template.slice(0, pathEnd);
    var query = {};
    assign(query, params);
    var resolved = path.replace(/:([^\/\.-]+)(\.{3})?/g, function(m, key, variadic) {
      delete query[key];
      if (params[key] == null)
        return m;
      return variadic ? params[key] : encodeURIComponent(String(params[key]));
    });
    var newQueryIndex = resolved.indexOf("?");
    var newHashIndex = resolved.indexOf("#");
    var newQueryEnd = newHashIndex < 0 ? resolved.length : newHashIndex;
    var newPathEnd = newQueryIndex < 0 ? newQueryEnd : newQueryIndex;
    var result = resolved.slice(0, newPathEnd);
    if (queryIndex >= 0)
      result += template.slice(queryIndex, queryEnd);
    if (newQueryIndex >= 0)
      result += (queryIndex < 0 ? "?" : "&") + resolved.slice(newQueryIndex, newQueryEnd);
    var querystring = buildQueryString(query);
    if (querystring)
      result += (queryIndex < 0 && newQueryIndex < 0 ? "?" : "&") + querystring;
    if (hashIndex >= 0)
      result += template.slice(hashIndex);
    if (newHashIndex >= 0)
      result += (hashIndex < 0 ? "" : "&") + resolved.slice(newHashIndex);
    return result;
  };
});

// node_modules/mithril/request/request.js
var require_request = __commonJS((exports, module) => {
  var buildPathname = require_build2();
  var hasOwn = require_hasOwn();
  module.exports = function($window, oncompletion) {
    function PromiseProxy(executor) {
      return new Promise(executor);
    }
    function makeRequest(url, args) {
      return new Promise(function(resolve, reject) {
        url = buildPathname(url, args.params);
        var method = args.method != null ? args.method.toUpperCase() : "GET";
        var body = args.body;
        var assumeJSON = (args.serialize == null || args.serialize === JSON.serialize) && !(body instanceof $window.FormData || body instanceof $window.URLSearchParams);
        var responseType = args.responseType || (typeof args.extract === "function" ? "" : "json");
        var xhr = new $window.XMLHttpRequest, aborted = false, isTimeout = false;
        var original = xhr, replacedAbort;
        var abort = xhr.abort;
        xhr.abort = function() {
          aborted = true;
          abort.call(this);
        };
        xhr.open(method, url, args.async !== false, typeof args.user === "string" ? args.user : undefined, typeof args.password === "string" ? args.password : undefined);
        if (assumeJSON && body != null && !hasHeader(args, "content-type")) {
          xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        }
        if (typeof args.deserialize !== "function" && !hasHeader(args, "accept")) {
          xhr.setRequestHeader("Accept", "application/json, text/*");
        }
        if (args.withCredentials)
          xhr.withCredentials = args.withCredentials;
        if (args.timeout)
          xhr.timeout = args.timeout;
        xhr.responseType = responseType;
        for (var key in args.headers) {
          if (hasOwn.call(args.headers, key)) {
            xhr.setRequestHeader(key, args.headers[key]);
          }
        }
        xhr.onreadystatechange = function(ev) {
          if (aborted)
            return;
          if (ev.target.readyState === 4) {
            try {
              var success = ev.target.status >= 200 && ev.target.status < 300 || ev.target.status === 304 || /^file:\/\//i.test(url);
              var response = ev.target.response, message;
              if (responseType === "json") {
                if (!ev.target.responseType && typeof args.extract !== "function") {
                  try {
                    response = JSON.parse(ev.target.responseText);
                  } catch (e) {
                    response = null;
                  }
                }
              } else if (!responseType || responseType === "text") {
                if (response == null)
                  response = ev.target.responseText;
              }
              if (typeof args.extract === "function") {
                response = args.extract(ev.target, args);
                success = true;
              } else if (typeof args.deserialize === "function") {
                response = args.deserialize(response);
              }
              if (success) {
                if (typeof args.type === "function") {
                  if (Array.isArray(response)) {
                    for (var i = 0;i < response.length; i++) {
                      response[i] = new args.type(response[i]);
                    }
                  } else
                    response = new args.type(response);
                }
                resolve(response);
              } else {
                var completeErrorResponse = function() {
                  try {
                    message = ev.target.responseText;
                  } catch (e) {
                    message = response;
                  }
                  var error = new Error(message);
                  error.code = ev.target.status;
                  error.response = response;
                  reject(error);
                };
                if (xhr.status === 0) {
                  setTimeout(function() {
                    if (isTimeout)
                      return;
                    completeErrorResponse();
                  });
                } else
                  completeErrorResponse();
              }
            } catch (e) {
              reject(e);
            }
          }
        };
        xhr.ontimeout = function(ev) {
          isTimeout = true;
          var error = new Error("Request timed out");
          error.code = ev.target.status;
          reject(error);
        };
        if (typeof args.config === "function") {
          xhr = args.config(xhr, args, url) || xhr;
          if (xhr !== original) {
            replacedAbort = xhr.abort;
            xhr.abort = function() {
              aborted = true;
              replacedAbort.call(this);
            };
          }
        }
        if (body == null)
          xhr.send();
        else if (typeof args.serialize === "function")
          xhr.send(args.serialize(body));
        else if (body instanceof $window.FormData || body instanceof $window.URLSearchParams)
          xhr.send(body);
        else
          xhr.send(JSON.stringify(body));
      });
    }
    PromiseProxy.prototype = Promise.prototype;
    PromiseProxy.__proto__ = Promise;
    function hasHeader(args, name) {
      for (var key in args.headers) {
        if (hasOwn.call(args.headers, key) && key.toLowerCase() === name)
          return true;
      }
      return false;
    }
    return {
      request: function(url, args) {
        if (typeof url !== "string") {
          args = url;
          url = url.url;
        } else if (args == null)
          args = {};
        var promise = makeRequest(url, args);
        if (args.background === true)
          return promise;
        var count = 0;
        function complete() {
          if (--count === 0 && typeof oncompletion === "function")
            oncompletion();
        }
        return wrap(promise);
        function wrap(promise2) {
          var then = promise2.then;
          promise2.constructor = PromiseProxy;
          promise2.then = function() {
            count++;
            var next = then.apply(promise2, arguments);
            next.then(complete, function(e) {
              complete();
              if (count === 0)
                throw e;
            });
            return wrap(next);
          };
          return promise2;
        }
      }
    };
  };
});

// node_modules/mithril/request.js
var require_request2 = __commonJS((exports, module) => {
  var mountRedraw = require_mount_redraw2();
  module.exports = require_request()(typeof window !== "undefined" ? window : null, mountRedraw.redraw);
});

// node_modules/mithril/querystring/parse.js
var require_parse = __commonJS((exports, module) => {
  function decodeURIComponentSave(str) {
    try {
      return decodeURIComponent(str);
    } catch (err) {
      return str;
    }
  }
  module.exports = function(string) {
    if (string === "" || string == null)
      return {};
    if (string.charAt(0) === "?")
      string = string.slice(1);
    var entries = string.split("&"), counters = {}, data = {};
    for (var i = 0;i < entries.length; i++) {
      var entry = entries[i].split("=");
      var key = decodeURIComponentSave(entry[0]);
      var value = entry.length === 2 ? decodeURIComponentSave(entry[1]) : "";
      if (value === "true")
        value = true;
      else if (value === "false")
        value = false;
      var levels = key.split(/\]\[?|\[/);
      var cursor = data;
      if (key.indexOf("[") > -1)
        levels.pop();
      for (var j = 0;j < levels.length; j++) {
        var level = levels[j], nextLevel = levels[j + 1];
        var isNumber = nextLevel == "" || !isNaN(parseInt(nextLevel, 10));
        if (level === "") {
          var key = levels.slice(0, j).join();
          if (counters[key] == null) {
            counters[key] = Array.isArray(cursor) ? cursor.length : 0;
          }
          level = counters[key]++;
        } else if (level === "__proto__")
          break;
        if (j === levels.length - 1)
          cursor[level] = value;
        else {
          var desc = Object.getOwnPropertyDescriptor(cursor, level);
          if (desc != null)
            desc = desc.value;
          if (desc == null)
            cursor[level] = desc = isNumber ? [] : {};
          cursor = desc;
        }
      }
    }
    return data;
  };
});

// node_modules/mithril/pathname/parse.js
var require_parse2 = __commonJS((exports, module) => {
  var parseQueryString = require_parse();
  module.exports = function(url) {
    var queryIndex = url.indexOf("?");
    var hashIndex = url.indexOf("#");
    var queryEnd = hashIndex < 0 ? url.length : hashIndex;
    var pathEnd = queryIndex < 0 ? queryEnd : queryIndex;
    var path = url.slice(0, pathEnd).replace(/\/{2,}/g, "/");
    if (!path)
      path = "/";
    else {
      if (path[0] !== "/")
        path = "/" + path;
    }
    return {
      path,
      params: queryIndex < 0 ? {} : parseQueryString(url.slice(queryIndex + 1, queryEnd))
    };
  };
});

// node_modules/mithril/pathname/compileTemplate.js
var require_compileTemplate = __commonJS((exports, module) => {
  var parsePathname = require_parse2();
  module.exports = function(template) {
    var templateData = parsePathname(template);
    var templateKeys = Object.keys(templateData.params);
    var keys = [];
    var regexp = new RegExp("^" + templateData.path.replace(/:([^\/.-]+)(\.{3}|\.(?!\.)|-)?|[\\^$*+.()|\[\]{}]/g, function(m, key, extra) {
      if (key == null)
        return "\\" + m;
      keys.push({ k: key, r: extra === "..." });
      if (extra === "...")
        return "(.*)";
      if (extra === ".")
        return "([^/]+)\\.";
      return "([^/]+)" + (extra || "");
    }) + "$");
    return function(data) {
      for (var i = 0;i < templateKeys.length; i++) {
        if (templateData.params[templateKeys[i]] !== data.params[templateKeys[i]])
          return false;
      }
      if (!keys.length)
        return regexp.test(data.path);
      var values = regexp.exec(data.path);
      if (values == null)
        return false;
      for (var i = 0;i < keys.length; i++) {
        data.params[keys[i].k] = keys[i].r ? values[i + 1] : decodeURIComponent(values[i + 1]);
      }
      return true;
    };
  };
});

// node_modules/mithril/util/censor.js
var require_censor = __commonJS((exports, module) => {
  var hasOwn = require_hasOwn();
  var magic = new RegExp("^(?:key|oninit|oncreate|onbeforeupdate|onupdate|onbeforeremove|onremove)$");
  module.exports = function(attrs, extras) {
    var result = {};
    if (extras != null) {
      for (var key in attrs) {
        if (hasOwn.call(attrs, key) && !magic.test(key) && extras.indexOf(key) < 0) {
          result[key] = attrs[key];
        }
      }
    } else {
      for (var key in attrs) {
        if (hasOwn.call(attrs, key) && !magic.test(key)) {
          result[key] = attrs[key];
        }
      }
    }
    return result;
  };
});

// node_modules/mithril/api/router.js
var require_router = __commonJS((exports, module) => {
  function decodeURIComponentSave(component) {
    try {
      return decodeURIComponent(component);
    } catch (e) {
      return component;
    }
  }
  var Vnode = require_vnode();
  var m = require_hyperscript();
  var buildPathname = require_build2();
  var parsePathname = require_parse2();
  var compileTemplate = require_compileTemplate();
  var assign = require_assign();
  var censor = require_censor();
  var sentinel = {};
  module.exports = function($window, mountRedraw) {
    var callAsync = $window == null ? null : typeof $window.setImmediate === "function" ? $window.setImmediate : $window.setTimeout;
    var p = Promise.resolve();
    var scheduled = false;
    var ready = false;
    var state = 0;
    var compiled, fallbackRoute;
    var currentResolver = sentinel, component, attrs, currentPath, lastUpdate;
    var RouterRoot = {
      onbeforeupdate: function() {
        state = state ? 2 : 1;
        return !(!state || sentinel === currentResolver);
      },
      onremove: function() {
        $window.removeEventListener("popstate", fireAsync, false);
        $window.removeEventListener("hashchange", resolveRoute, false);
      },
      view: function() {
        if (!state || sentinel === currentResolver)
          return;
        var vnode = [Vnode(component, attrs.key, attrs)];
        if (currentResolver)
          vnode = currentResolver.render(vnode[0]);
        return vnode;
      }
    };
    var SKIP = route.SKIP = {};
    function resolveRoute() {
      scheduled = false;
      var prefix = $window.location.hash;
      if (route.prefix[0] !== "#") {
        prefix = $window.location.search + prefix;
        if (route.prefix[0] !== "?") {
          prefix = $window.location.pathname + prefix;
          if (prefix[0] !== "/")
            prefix = "/" + prefix;
        }
      }
      var path = prefix.concat().replace(/(?:%[a-f89][a-f0-9])+/gim, decodeURIComponentSave).slice(route.prefix.length);
      var data = parsePathname(path);
      assign(data.params, $window.history.state);
      function reject(e) {
        console.error(e);
        setPath(fallbackRoute, null, { replace: true });
      }
      loop(0);
      function loop(i) {
        for (;i < compiled.length; i++) {
          if (compiled[i].check(data)) {
            var payload = compiled[i].component;
            var matchedRoute = compiled[i].route;
            var localComp = payload;
            var update = lastUpdate = function(comp) {
              if (update !== lastUpdate)
                return;
              if (comp === SKIP)
                return loop(i + 1);
              component = comp != null && (typeof comp.view === "function" || typeof comp === "function") ? comp : "div";
              attrs = data.params, currentPath = path, lastUpdate = null;
              currentResolver = payload.render ? payload : null;
              if (state === 2)
                mountRedraw.redraw();
              else {
                state = 2;
                mountRedraw.redraw.sync();
              }
            };
            if (payload.view || typeof payload === "function") {
              payload = {};
              update(localComp);
            } else if (payload.onmatch) {
              p.then(function() {
                return payload.onmatch(data.params, path, matchedRoute);
              }).then(update, path === fallbackRoute ? null : reject);
            } else
              update("div");
            return;
          }
        }
        if (path === fallbackRoute) {
          throw new Error("Could not resolve default route " + fallbackRoute + ".");
        }
        setPath(fallbackRoute, null, { replace: true });
      }
    }
    function fireAsync() {
      if (!scheduled) {
        scheduled = true;
        callAsync(resolveRoute);
      }
    }
    function setPath(path, data, options) {
      path = buildPathname(path, data);
      if (ready) {
        fireAsync();
        var state2 = options ? options.state : null;
        var title = options ? options.title : null;
        if (options && options.replace)
          $window.history.replaceState(state2, title, route.prefix + path);
        else
          $window.history.pushState(state2, title, route.prefix + path);
      } else {
        $window.location.href = route.prefix + path;
      }
    }
    function route(root, defaultRoute, routes) {
      if (!root)
        throw new TypeError("DOM element being rendered to does not exist.");
      compiled = Object.keys(routes).map(function(route2) {
        if (route2[0] !== "/")
          throw new SyntaxError("Routes must start with a '/'.");
        if (/:([^\/\.-]+)(\.{3})?:/.test(route2)) {
          throw new SyntaxError("Route parameter names must be separated with either '/', '.', or '-'.");
        }
        return {
          route: route2,
          component: routes[route2],
          check: compileTemplate(route2)
        };
      });
      fallbackRoute = defaultRoute;
      if (defaultRoute != null) {
        var defaultData = parsePathname(defaultRoute);
        if (!compiled.some(function(i) {
          return i.check(defaultData);
        })) {
          throw new ReferenceError("Default route doesn't match any known routes.");
        }
      }
      if (typeof $window.history.pushState === "function") {
        $window.addEventListener("popstate", fireAsync, false);
      } else if (route.prefix[0] === "#") {
        $window.addEventListener("hashchange", resolveRoute, false);
      }
      ready = true;
      mountRedraw.mount(root, RouterRoot);
      resolveRoute();
    }
    route.set = function(path, data, options) {
      if (lastUpdate != null) {
        options = options || {};
        options.replace = true;
      }
      lastUpdate = null;
      setPath(path, data, options);
    };
    route.get = function() {
      return currentPath;
    };
    route.prefix = "#!";
    route.Link = {
      view: function(vnode) {
        var child = m(vnode.attrs.selector || "a", censor(vnode.attrs, ["options", "params", "selector", "onclick"]), vnode.children);
        var options, onclick, href;
        if (child.attrs.disabled = Boolean(child.attrs.disabled)) {
          child.attrs.href = null;
          child.attrs["aria-disabled"] = "true";
        } else {
          options = vnode.attrs.options;
          onclick = vnode.attrs.onclick;
          href = buildPathname(child.attrs.href, vnode.attrs.params);
          child.attrs.href = route.prefix + href;
          child.attrs.onclick = function(e) {
            var result;
            if (typeof onclick === "function") {
              result = onclick.call(e.currentTarget, e);
            } else if (onclick == null || typeof onclick !== "object") {
            } else if (typeof onclick.handleEvent === "function") {
              onclick.handleEvent(e);
            }
            if (result !== false && !e.defaultPrevented && (e.button === 0 || e.which === 0 || e.which === 1) && (!e.currentTarget.target || e.currentTarget.target === "_self") && !e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey) {
              e.preventDefault();
              e.redraw = false;
              route.set(href, null, options);
            }
          };
        }
        return child;
      }
    };
    route.param = function(key) {
      return attrs && key != null ? attrs[key] : attrs;
    };
    return route;
  };
});

// node_modules/mithril/route.js
var require_route = __commonJS((exports, module) => {
  var mountRedraw = require_mount_redraw2();
  module.exports = require_router()(typeof window !== "undefined" ? window : null, mountRedraw);
});

// node_modules/mithril/index.js
var require_mithril = __commonJS((exports, module) => {
  var hyperscript = require_hyperscript2();
  var request = require_request2();
  var mountRedraw = require_mount_redraw2();
  var domFor = require_domFor();
  var m = function m() {
    return hyperscript.apply(this, arguments);
  };
  m.m = hyperscript;
  m.trust = hyperscript.trust;
  m.fragment = hyperscript.fragment;
  m.Fragment = "[";
  m.mount = mountRedraw.mount;
  m.route = require_route();
  m.render = require_render2();
  m.redraw = mountRedraw.redraw;
  m.request = request.request;
  m.parseQueryString = require_parse();
  m.buildQueryString = require_build();
  m.parsePathname = require_parse2();
  m.buildPathname = require_build2();
  m.vnode = require_vnode();
  m.censor = require_censor();
  m.domFor = domFor.domFor;
  module.exports = m;
});

// frontend/index.js
var import_mithril = __toESM(require_mithril(), 1);

// frontend/websocket.js
function createWebSocket() {
  let appUrl = "localhost:3000";
  appUrl = `//${appUrl}/chat-service`;
  return new WebSocket(appUrl);
}

// frontend/index.js
function newMessageText(name, message) {
  return [
    import_mithril.default("span.chatter", name + ": "),
    import_mithril.default("span.chatter-message", message)
  ];
}
function clearMessageInputBox() {
  const messageBox = document.getElementById("message");
  messageBox.value = "";
}
function sendMessage(e) {
  e.preventDefault();
  const form = new FormData(e.target);
  const message = {};
  for (const [key, value] of form.entries()) {
    message[key] = value;
  }
  socket.send(JSON.stringify(message));
  clearMessageInputBox();
}
var messages = [];
var socket = createWebSocket();
socket.onmessage = function(event) {
  if (event.type === "message") {
    const message = JSON.parse(event.data);
    messages.push(message);
    import_mithril.default.redraw();
  }
};
var MessageBox = {
  view: function() {
    return import_mithril.default(".messages", { id: "message-box" }, messages.reverse().map(function(message) {
      return import_mithril.default(".message", newMessageText(message.chatter, message.message));
    }), import_mithril.default("#anchor"));
  }
};
var MessageInput = {
  view: function() {
    return import_mithril.default("div.chat-input", [
      import_mithril.default("form", { method: "post", onsubmit: this.handleSubmit }, [
        import_mithril.default("input", { name: "chatter", placeholder: "Name" }),
        import_mithril.default("input", { name: "message", placeholder: "Message", id: "message", required: true }),
        import_mithril.default("input", { type: "submit", value: "Send" })
      ])
    ]);
  },
  nameHidden: false,
  handleSubmit: function(e) {
    sendMessage(e);
    if (!this.nameHidden) {
      const chatterInput = document.querySelector('input[name="chatter"]');
      chatterInput.setAttribute("style", "display: none");
      this.nameHidden = true;
    }
  }
};
var Chat = {
  view: function(vnode) {
    return import_mithril.default("div", { class: "container" }, [
      import_mithril.default(MessageBox),
      import_mithril.default(MessageInput)
    ]);
  }
};
import_mithril.default.mount(document.getElementById("app"), Chat);
