{"version":3,"file":"js/hugerte-64047e1a4a51c1271285.js","mappings":"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","sources":["webpack://ratsanet/./node_modules/hugerte/themes/silver/theme.js","webpack://ratsanet/./node_modules/hugerte/models/dom/index.js","webpack://ratsanet/./node_modules/hugerte/plugins/link/plugin.js","webpack://ratsanet/./node_modules/hugerte/themes/silver/index.js","webpack://ratsanet/./node_modules/hugerte/models/dom/model.js","webpack://ratsanet/./app/javascript/plugins/tinymce.js","webpack://ratsanet/./app/javascript/plugins/hotwired.js","webpack://ratsanet/./app/javascript/plugins/dayjs.js","webpack://ratsanet/./node_modules/hugerte/icons/default/icons.js","webpack://ratsanet/./node_modules/hugerte/icons/default/index.js","webpack://ratsanet/./app/javascript/plugins/datepicker.js","webpack://ratsanet/./node_modules/hugerte/plugins/link/index.js","webpack://ratsanet/./node_modules/hugerte/hugerte.js","webpack://ratsanet/./app/javascript/plugins/select2.js"],"sourcesContent":["/**\n * HugeRTE version 1.0.8 (2025-03-11)\n * Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc.\n * Copyright (c) 2024 HugeRTE contributors\n * Licensed under the MIT license (https://github.com/hugerte/hugerte/blob/main/LICENSE.TXT)\n */\n\n/**\n * This file bundles the code of DOMPurify, which is dual-licensed under the Mozilla Public License v2.0 and the Apache License, Version 2.0, meaning you can use it under either one of those licenses.\n * Copyright 2024 Dr.-Ing. Mario Heiderich, Cure53 and other contributors\n * https://github.com/cure53/DOMPurify/blob/main/LICENSE\n * The code of DOMPurify included in this file has been modified. The latest original code of DOMPurify can be found at https://github.com/cure53/DOMPurify.\n */\n\n(function () {\n    'use strict';\n\n    const getPrototypeOf$2 = Object.getPrototypeOf;\n    const hasProto = (v, constructor, predicate) => {\n      var _a;\n      if (predicate(v, constructor.prototype)) {\n        return true;\n      } else {\n        return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;\n      }\n    };\n    const typeOf = x => {\n      const t = typeof x;\n      if (x === null) {\n        return 'null';\n      } else if (t === 'object' && Array.isArray(x)) {\n        return 'array';\n      } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {\n        return 'string';\n      } else {\n        return t;\n      }\n    };\n    const isType$1 = type => value => typeOf(value) === type;\n    const isSimpleType = type => value => typeof value === type;\n    const eq$1 = t => a => t === a;\n    const is$2 = (value, constructor) => isObject(value) && hasProto(value, constructor, (o, proto) => getPrototypeOf$2(o) === proto);\n    const isString = isType$1('string');\n    const isObject = isType$1('object');\n    const isPlainObject = value => is$2(value, Object);\n    const isArray = isType$1('array');\n    const isNull = eq$1(null);\n    const isBoolean = isSimpleType('boolean');\n    const isUndefined = eq$1(undefined);\n    const isNullable = a => a === null || a === undefined;\n    const isNonNullable = a => !isNullable(a);\n    const isFunction = isSimpleType('function');\n    const isNumber = isSimpleType('number');\n    const isArrayOf = (value, pred) => {\n      if (isArray(value)) {\n        for (let i = 0, len = value.length; i < len; ++i) {\n          if (!pred(value[i])) {\n            return false;\n          }\n        }\n        return true;\n      }\n      return false;\n    };\n\n    const noop = () => {\n    };\n    const noarg = f => () => f();\n    const compose = (fa, fb) => {\n      return (...args) => {\n        return fa(fb.apply(null, args));\n      };\n    };\n    const compose1 = (fbc, fab) => a => fbc(fab(a));\n    const constant$1 = value => {\n      return () => {\n        return value;\n      };\n    };\n    const identity = x => {\n      return x;\n    };\n    const tripleEquals = (a, b) => {\n      return a === b;\n    };\n    function curry(fn, ...initialArgs) {\n      return (...restArgs) => {\n        const all = initialArgs.concat(restArgs);\n        return fn.apply(null, all);\n      };\n    }\n    const not = f => t => !f(t);\n    const die = msg => {\n      return () => {\n        throw new Error(msg);\n      };\n    };\n    const apply$1 = f => {\n      return f();\n    };\n    const never = constant$1(false);\n    const always = constant$1(true);\n\n    class Optional {\n      constructor(tag, value) {\n        this.tag = tag;\n        this.value = value;\n      }\n      static some(value) {\n        return new Optional(true, value);\n      }\n      static none() {\n        return Optional.singletonNone;\n      }\n      fold(onNone, onSome) {\n        if (this.tag) {\n          return onSome(this.value);\n        } else {\n          return onNone();\n        }\n      }\n      isSome() {\n        return this.tag;\n      }\n      isNone() {\n        return !this.tag;\n      }\n      map(mapper) {\n        if (this.tag) {\n          return Optional.some(mapper(this.value));\n        } else {\n          return Optional.none();\n        }\n      }\n      bind(binder) {\n        if (this.tag) {\n          return binder(this.value);\n        } else {\n          return Optional.none();\n        }\n      }\n      exists(predicate) {\n        return this.tag && predicate(this.value);\n      }\n      forall(predicate) {\n        return !this.tag || predicate(this.value);\n      }\n      filter(predicate) {\n        if (!this.tag || predicate(this.value)) {\n          return this;\n        } else {\n          return Optional.none();\n        }\n      }\n      getOr(replacement) {\n        return this.tag ? this.value : replacement;\n      }\n      or(replacement) {\n        return this.tag ? this : replacement;\n      }\n      getOrThunk(thunk) {\n        return this.tag ? this.value : thunk();\n      }\n      orThunk(thunk) {\n        return this.tag ? this : thunk();\n      }\n      getOrDie(message) {\n        if (!this.tag) {\n          throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');\n        } else {\n          return this.value;\n        }\n      }\n      static from(value) {\n        return isNonNullable(value) ? Optional.some(value) : Optional.none();\n      }\n      getOrNull() {\n        return this.tag ? this.value : null;\n      }\n      getOrUndefined() {\n        return this.value;\n      }\n      each(worker) {\n        if (this.tag) {\n          worker(this.value);\n        }\n      }\n      toArray() {\n        return this.tag ? [this.value] : [];\n      }\n      toString() {\n        return this.tag ? `some(${ this.value })` : 'none()';\n      }\n    }\n    Optional.singletonNone = new Optional(false);\n\n    const nativeSlice = Array.prototype.slice;\n    const nativeIndexOf = Array.prototype.indexOf;\n    const nativePush = Array.prototype.push;\n    const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t);\n    const indexOf = (xs, x) => {\n      const r = rawIndexOf(xs, x);\n      return r === -1 ? Optional.none() : Optional.some(r);\n    };\n    const contains$2 = (xs, x) => rawIndexOf(xs, x) > -1;\n    const exists = (xs, pred) => {\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        if (pred(x, i)) {\n          return true;\n        }\n      }\n      return false;\n    };\n    const range$2 = (num, f) => {\n      const r = [];\n      for (let i = 0; i < num; i++) {\n        r.push(f(i));\n      }\n      return r;\n    };\n    const chunk$1 = (array, size) => {\n      const r = [];\n      for (let i = 0; i < array.length; i += size) {\n        const s = nativeSlice.call(array, i, i + size);\n        r.push(s);\n      }\n      return r;\n    };\n    const map$2 = (xs, f) => {\n      const len = xs.length;\n      const r = new Array(len);\n      for (let i = 0; i < len; i++) {\n        const x = xs[i];\n        r[i] = f(x, i);\n      }\n      return r;\n    };\n    const each$1 = (xs, f) => {\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        f(x, i);\n      }\n    };\n    const eachr = (xs, f) => {\n      for (let i = xs.length - 1; i >= 0; i--) {\n        const x = xs[i];\n        f(x, i);\n      }\n    };\n    const partition$3 = (xs, pred) => {\n      const pass = [];\n      const fail = [];\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        const arr = pred(x, i) ? pass : fail;\n        arr.push(x);\n      }\n      return {\n        pass,\n        fail\n      };\n    };\n    const filter$2 = (xs, pred) => {\n      const r = [];\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        if (pred(x, i)) {\n          r.push(x);\n        }\n      }\n      return r;\n    };\n    const foldr = (xs, f, acc) => {\n      eachr(xs, (x, i) => {\n        acc = f(acc, x, i);\n      });\n      return acc;\n    };\n    const foldl = (xs, f, acc) => {\n      each$1(xs, (x, i) => {\n        acc = f(acc, x, i);\n      });\n      return acc;\n    };\n    const findUntil = (xs, pred, until) => {\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        if (pred(x, i)) {\n          return Optional.some(x);\n        } else if (until(x, i)) {\n          break;\n        }\n      }\n      return Optional.none();\n    };\n    const find$5 = (xs, pred) => {\n      return findUntil(xs, pred, never);\n    };\n    const findIndex$1 = (xs, pred) => {\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        if (pred(x, i)) {\n          return Optional.some(i);\n        }\n      }\n      return Optional.none();\n    };\n    const flatten = xs => {\n      const r = [];\n      for (let i = 0, len = xs.length; i < len; ++i) {\n        if (!isArray(xs[i])) {\n          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);\n        }\n        nativePush.apply(r, xs[i]);\n      }\n      return r;\n    };\n    const bind$3 = (xs, f) => flatten(map$2(xs, f));\n    const forall = (xs, pred) => {\n      for (let i = 0, len = xs.length; i < len; ++i) {\n        const x = xs[i];\n        if (pred(x, i) !== true) {\n          return false;\n        }\n      }\n      return true;\n    };\n    const reverse = xs => {\n      const r = nativeSlice.call(xs, 0);\n      r.reverse();\n      return r;\n    };\n    const difference = (a1, a2) => filter$2(a1, x => !contains$2(a2, x));\n    const mapToObject = (xs, f) => {\n      const r = {};\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        r[String(x)] = f(x, i);\n      }\n      return r;\n    };\n    const pure$2 = x => [x];\n    const sort = (xs, comparator) => {\n      const copy = nativeSlice.call(xs, 0);\n      copy.sort(comparator);\n      return copy;\n    };\n    const get$h = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();\n    const head = xs => get$h(xs, 0);\n    const last$1 = xs => get$h(xs, xs.length - 1);\n    const from = isFunction(Array.from) ? Array.from : x => nativeSlice.call(x);\n    const findMap = (arr, f) => {\n      for (let i = 0; i < arr.length; i++) {\n        const r = f(arr[i], i);\n        if (r.isSome()) {\n          return r;\n        }\n      }\n      return Optional.none();\n    };\n\n    const keys = Object.keys;\n    const hasOwnProperty = Object.hasOwnProperty;\n    const each = (obj, f) => {\n      const props = keys(obj);\n      for (let k = 0, len = props.length; k < len; k++) {\n        const i = props[k];\n        const x = obj[i];\n        f(x, i);\n      }\n    };\n    const map$1 = (obj, f) => {\n      return tupleMap(obj, (x, i) => ({\n        k: i,\n        v: f(x, i)\n      }));\n    };\n    const tupleMap = (obj, f) => {\n      const r = {};\n      each(obj, (x, i) => {\n        const tuple = f(x, i);\n        r[tuple.k] = tuple.v;\n      });\n      return r;\n    };\n    const objAcc = r => (x, i) => {\n      r[i] = x;\n    };\n    const internalFilter = (obj, pred, onTrue, onFalse) => {\n      each(obj, (x, i) => {\n        (pred(x, i) ? onTrue : onFalse)(x, i);\n      });\n    };\n    const bifilter = (obj, pred) => {\n      const t = {};\n      const f = {};\n      internalFilter(obj, pred, objAcc(t), objAcc(f));\n      return {\n        t,\n        f\n      };\n    };\n    const filter$1 = (obj, pred) => {\n      const t = {};\n      internalFilter(obj, pred, objAcc(t), noop);\n      return t;\n    };\n    const mapToArray = (obj, f) => {\n      const r = [];\n      each(obj, (value, name) => {\n        r.push(f(value, name));\n      });\n      return r;\n    };\n    const find$4 = (obj, pred) => {\n      const props = keys(obj);\n      for (let k = 0, len = props.length; k < len; k++) {\n        const i = props[k];\n        const x = obj[i];\n        if (pred(x, i, obj)) {\n          return Optional.some(x);\n        }\n      }\n      return Optional.none();\n    };\n    const values = obj => {\n      return mapToArray(obj, identity);\n    };\n    const get$g = (obj, key) => {\n      return has$2(obj, key) ? Optional.from(obj[key]) : Optional.none();\n    };\n    const has$2 = (obj, key) => hasOwnProperty.call(obj, key);\n    const hasNonNullableKey = (obj, key) => has$2(obj, key) && obj[key] !== undefined && obj[key] !== null;\n\n    const is$1 = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs));\n    const equals = (lhs, rhs, comparator = tripleEquals) => lift2(lhs, rhs, comparator).getOr(lhs.isNone() && rhs.isNone());\n    const cat = arr => {\n      const r = [];\n      const push = x => {\n        r.push(x);\n      };\n      for (let i = 0; i < arr.length; i++) {\n        arr[i].each(push);\n      }\n      return r;\n    };\n    const sequence = arr => {\n      const r = [];\n      for (let i = 0; i < arr.length; i++) {\n        const x = arr[i];\n        if (x.isSome()) {\n          r.push(x.getOrDie());\n        } else {\n          return Optional.none();\n        }\n      }\n      return Optional.some(r);\n    };\n    const lift2 = (oa, ob, f) => oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();\n    const lift3 = (oa, ob, oc, f) => oa.isSome() && ob.isSome() && oc.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie(), oc.getOrDie())) : Optional.none();\n    const mapFrom = (a, f) => a !== undefined && a !== null ? Optional.some(f(a)) : Optional.none();\n    const someIf = (b, a) => b ? Optional.some(a) : Optional.none();\n\n    const addToEnd = (str, suffix) => {\n      return str + suffix;\n    };\n    const removeFromStart = (str, numChars) => {\n      return str.substring(numChars);\n    };\n\n    const checkRange = (str, substr, start) => substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;\n    const removeLeading = (str, prefix) => {\n      return startsWith(str, prefix) ? removeFromStart(str, prefix.length) : str;\n    };\n    const ensureTrailing = (str, suffix) => {\n      return endsWith(str, suffix) ? str : addToEnd(str, suffix);\n    };\n    const contains$1 = (str, substr, start = 0, end) => {\n      const idx = str.indexOf(substr, start);\n      if (idx !== -1) {\n        return isUndefined(end) ? true : idx + substr.length <= end;\n      } else {\n        return false;\n      }\n    };\n    const startsWith = (str, prefix) => {\n      return checkRange(str, prefix, 0);\n    };\n    const endsWith = (str, suffix) => {\n      return checkRange(str, suffix, str.length - suffix.length);\n    };\n    const blank = r => s => s.replace(r, '');\n    const trim$1 = blank(/^\\s+|\\s+$/g);\n    const isNotEmpty = s => s.length > 0;\n    const isEmpty = s => !isNotEmpty(s);\n\n    const isSupported$1 = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue);\n\n    const fromHtml$2 = (html, scope) => {\n      const doc = scope || document;\n      const div = doc.createElement('div');\n      div.innerHTML = html;\n      if (!div.hasChildNodes() || div.childNodes.length > 1) {\n        const message = 'HTML does not have a single root node';\n        console.error(message, html);\n        throw new Error(message);\n      }\n      return fromDom(div.childNodes[0]);\n    };\n    const fromTag = (tag, scope) => {\n      const doc = scope || document;\n      const node = doc.createElement(tag);\n      return fromDom(node);\n    };\n    const fromText = (text, scope) => {\n      const doc = scope || document;\n      const node = doc.createTextNode(text);\n      return fromDom(node);\n    };\n    const fromDom = node => {\n      if (node === null || node === undefined) {\n        throw new Error('Node cannot be null or undefined');\n      }\n      return { dom: node };\n    };\n    const fromPoint = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);\n    const SugarElement = {\n      fromHtml: fromHtml$2,\n      fromTag,\n      fromText,\n      fromDom,\n      fromPoint\n    };\n\n    const Global = typeof window !== 'undefined' ? window : Function('return this;')();\n\n    const path$1 = (parts, scope) => {\n      let o = scope !== undefined && scope !== null ? scope : Global;\n      for (let i = 0; i < parts.length && o !== undefined && o !== null; ++i) {\n        o = o[parts[i]];\n      }\n      return o;\n    };\n    const resolve = (p, scope) => {\n      const parts = p.split('.');\n      return path$1(parts, scope);\n    };\n\n    const unsafe = (name, scope) => {\n      return resolve(name, scope);\n    };\n    const getOrDie$1 = (name, scope) => {\n      const actual = unsafe(name, scope);\n      if (actual === undefined || actual === null) {\n        throw new Error(name + ' not available on this browser');\n      }\n      return actual;\n    };\n\n    const getPrototypeOf$1 = Object.getPrototypeOf;\n    const sandHTMLElement = scope => {\n      return getOrDie$1('HTMLElement', scope);\n    };\n    const isPrototypeOf = x => {\n      const scope = resolve('ownerDocument.defaultView', x);\n      return isObject(x) && (sandHTMLElement(scope).prototype.isPrototypeOf(x) || /^HTML\\w*Element$/.test(getPrototypeOf$1(x).constructor.name));\n    };\n\n    const DOCUMENT = 9;\n    const DOCUMENT_FRAGMENT = 11;\n    const ELEMENT = 1;\n    const TEXT = 3;\n\n    const name$3 = element => {\n      const r = element.dom.nodeName;\n      return r.toLowerCase();\n    };\n    const type$1 = element => element.dom.nodeType;\n    const isType = t => element => type$1(element) === t;\n    const isHTMLElement = element => isElement$1(element) && isPrototypeOf(element.dom);\n    const isElement$1 = isType(ELEMENT);\n    const isText = isType(TEXT);\n    const isDocument = isType(DOCUMENT);\n    const isDocumentFragment = isType(DOCUMENT_FRAGMENT);\n    const isTag = tag => e => isElement$1(e) && name$3(e) === tag;\n\n    const is = (element, selector) => {\n      const dom = element.dom;\n      if (dom.nodeType !== ELEMENT) {\n        return false;\n      } else {\n        const elem = dom;\n        if (elem.matches !== undefined) {\n          return elem.matches(selector);\n        } else if (elem.msMatchesSelector !== undefined) {\n          return elem.msMatchesSelector(selector);\n        } else if (elem.webkitMatchesSelector !== undefined) {\n          return elem.webkitMatchesSelector(selector);\n        } else if (elem.mozMatchesSelector !== undefined) {\n          return elem.mozMatchesSelector(selector);\n        } else {\n          throw new Error('Browser lacks native selectors');\n        }\n      }\n    };\n    const bypassSelector = dom => dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;\n    const all$3 = (selector, scope) => {\n      const base = scope === undefined ? document : scope.dom;\n      return bypassSelector(base) ? [] : map$2(base.querySelectorAll(selector), SugarElement.fromDom);\n    };\n    const one = (selector, scope) => {\n      const base = scope === undefined ? document : scope.dom;\n      return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom);\n    };\n\n    const eq = (e1, e2) => e1.dom === e2.dom;\n    const contains = (e1, e2) => {\n      const d1 = e1.dom;\n      const d2 = e2.dom;\n      return d1 === d2 ? false : d1.contains(d2);\n    };\n\n    const owner$4 = element => SugarElement.fromDom(element.dom.ownerDocument);\n    const documentOrOwner = dos => isDocument(dos) ? dos : owner$4(dos);\n    const documentElement = element => SugarElement.fromDom(documentOrOwner(element).dom.documentElement);\n    const defaultView = element => SugarElement.fromDom(documentOrOwner(element).dom.defaultView);\n    const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom);\n    const parentNode = element => parent(element);\n    const parentElement = element => Optional.from(element.dom.parentElement).map(SugarElement.fromDom);\n    const parents = (element, isRoot) => {\n      const stop = isFunction(isRoot) ? isRoot : never;\n      let dom = element.dom;\n      const ret = [];\n      while (dom.parentNode !== null && dom.parentNode !== undefined) {\n        const rawParent = dom.parentNode;\n        const p = SugarElement.fromDom(rawParent);\n        ret.push(p);\n        if (stop(p) === true) {\n          break;\n        } else {\n          dom = rawParent;\n        }\n      }\n      return ret;\n    };\n    const offsetParent = element => Optional.from(element.dom.offsetParent).map(SugarElement.fromDom);\n    const nextSibling = element => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);\n    const children = element => map$2(element.dom.childNodes, SugarElement.fromDom);\n    const child$2 = (element, index) => {\n      const cs = element.dom.childNodes;\n      return Optional.from(cs[index]).map(SugarElement.fromDom);\n    };\n    const firstChild = element => child$2(element, 0);\n    const spot = (element, offset) => ({\n      element,\n      offset\n    });\n    const leaf = (element, offset) => {\n      const cs = children(element);\n      return cs.length > 0 && offset < cs.length ? spot(cs[offset], 0) : spot(element, offset);\n    };\n\n    const isShadowRoot = dos => isDocumentFragment(dos) && isNonNullable(dos.dom.host);\n    const supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);\n    const isSupported = constant$1(supported);\n    const getRootNode = supported ? e => SugarElement.fromDom(e.dom.getRootNode()) : documentOrOwner;\n    const getContentContainer = dos => isShadowRoot(dos) ? dos : SugarElement.fromDom(documentOrOwner(dos).dom.body);\n    const isInShadowRoot = e => getShadowRoot(e).isSome();\n    const getShadowRoot = e => {\n      const r = getRootNode(e);\n      return isShadowRoot(r) ? Optional.some(r) : Optional.none();\n    };\n    const getShadowHost = e => SugarElement.fromDom(e.dom.host);\n    const getOriginalEventTarget = event => {\n      if (isSupported() && isNonNullable(event.target)) {\n        const el = SugarElement.fromDom(event.target);\n        if (isElement$1(el) && isOpenShadowHost(el)) {\n          if (event.composed && event.composedPath) {\n            const composedPath = event.composedPath();\n            if (composedPath) {\n              return head(composedPath);\n            }\n          }\n        }\n      }\n      return Optional.from(event.target);\n    };\n    const isOpenShadowHost = element => isNonNullable(element.dom.shadowRoot);\n\n    const inBody = element => {\n      const dom = isText(element) ? element.dom.parentNode : element.dom;\n      if (dom === undefined || dom === null || dom.ownerDocument === null) {\n        return false;\n      }\n      const doc = dom.ownerDocument;\n      return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost));\n    };\n    const body = () => getBody(SugarElement.fromDom(document));\n    const getBody = doc => {\n      const b = doc.dom.body;\n      if (b === null || b === undefined) {\n        throw new Error('Body is not available yet');\n      }\n      return SugarElement.fromDom(b);\n    };\n\n    const rawSet = (dom, key, value) => {\n      if (isString(value) || isBoolean(value) || isNumber(value)) {\n        dom.setAttribute(key, value + '');\n      } else {\n        console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);\n        throw new Error('Attribute value was not simple');\n      }\n    };\n    const set$9 = (element, key, value) => {\n      rawSet(element.dom, key, value);\n    };\n    const setAll$1 = (element, attrs) => {\n      const dom = element.dom;\n      each(attrs, (v, k) => {\n        rawSet(dom, k, v);\n      });\n    };\n    const get$f = (element, key) => {\n      const v = element.dom.getAttribute(key);\n      return v === null ? undefined : v;\n    };\n    const getOpt = (element, key) => Optional.from(get$f(element, key));\n    const has$1 = (element, key) => {\n      const dom = element.dom;\n      return dom && dom.hasAttribute ? dom.hasAttribute(key) : false;\n    };\n    const remove$7 = (element, key) => {\n      element.dom.removeAttribute(key);\n    };\n    const clone$2 = element => foldl(element.dom.attributes, (acc, attr) => {\n      acc[attr.name] = attr.value;\n      return acc;\n    }, {});\n\n    const internalSet = (dom, property, value) => {\n      if (!isString(value)) {\n        console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);\n        throw new Error('CSS value must be a string: ' + value);\n      }\n      if (isSupported$1(dom)) {\n        dom.style.setProperty(property, value);\n      }\n    };\n    const internalRemove = (dom, property) => {\n      if (isSupported$1(dom)) {\n        dom.style.removeProperty(property);\n      }\n    };\n    const set$8 = (element, property, value) => {\n      const dom = element.dom;\n      internalSet(dom, property, value);\n    };\n    const setAll = (element, css) => {\n      const dom = element.dom;\n      each(css, (v, k) => {\n        internalSet(dom, k, v);\n      });\n    };\n    const setOptions = (element, css) => {\n      const dom = element.dom;\n      each(css, (v, k) => {\n        v.fold(() => {\n          internalRemove(dom, k);\n        }, value => {\n          internalSet(dom, k, value);\n        });\n      });\n    };\n    const get$e = (element, property) => {\n      const dom = element.dom;\n      const styles = window.getComputedStyle(dom);\n      const r = styles.getPropertyValue(property);\n      return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;\n    };\n    const getUnsafeProperty = (dom, property) => isSupported$1(dom) ? dom.style.getPropertyValue(property) : '';\n    const getRaw = (element, property) => {\n      const dom = element.dom;\n      const raw = getUnsafeProperty(dom, property);\n      return Optional.from(raw).filter(r => r.length > 0);\n    };\n    const getAllRaw = element => {\n      const css = {};\n      const dom = element.dom;\n      if (isSupported$1(dom)) {\n        for (let i = 0; i < dom.style.length; i++) {\n          const ruleName = dom.style.item(i);\n          css[ruleName] = dom.style[ruleName];\n        }\n      }\n      return css;\n    };\n    const isValidValue$1 = (tag, property, value) => {\n      const element = SugarElement.fromTag(tag);\n      set$8(element, property, value);\n      const style = getRaw(element, property);\n      return style.isSome();\n    };\n    const remove$6 = (element, property) => {\n      const dom = element.dom;\n      internalRemove(dom, property);\n      if (is$1(getOpt(element, 'style').map(trim$1), '')) {\n        remove$7(element, 'style');\n      }\n    };\n    const reflow = e => e.dom.offsetWidth;\n\n    const Dimension = (name, getOffset) => {\n      const set = (element, h) => {\n        if (!isNumber(h) && !h.match(/^[0-9]+$/)) {\n          throw new Error(name + '.set accepts only positive integer values. Value was ' + h);\n        }\n        const dom = element.dom;\n        if (isSupported$1(dom)) {\n          dom.style[name] = h + 'px';\n        }\n      };\n      const get = element => {\n        const r = getOffset(element);\n        if (r <= 0 || r === null) {\n          const css = get$e(element, name);\n          return parseFloat(css) || 0;\n        }\n        return r;\n      };\n      const getOuter = get;\n      const aggregate = (element, properties) => foldl(properties, (acc, property) => {\n        const val = get$e(element, property);\n        const value = val === undefined ? 0 : parseInt(val, 10);\n        return isNaN(value) ? acc : acc + value;\n      }, 0);\n      const max = (element, value, properties) => {\n        const cumulativeInclusions = aggregate(element, properties);\n        const absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0;\n        return absoluteMax;\n      };\n      return {\n        set,\n        get,\n        getOuter,\n        aggregate,\n        max\n      };\n    };\n\n    const api$2 = Dimension('height', element => {\n      const dom = element.dom;\n      return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;\n    });\n    const get$d = element => api$2.get(element);\n    const getOuter$2 = element => api$2.getOuter(element);\n    const setMax$1 = (element, value) => {\n      const inclusions = [\n        'margin-top',\n        'border-top-width',\n        'padding-top',\n        'padding-bottom',\n        'border-bottom-width',\n        'margin-bottom'\n      ];\n      const absMax = api$2.max(element, value, inclusions);\n      set$8(element, 'max-height', absMax + 'px');\n    };\n\n    const r$1 = (left, top) => {\n      const translate = (x, y) => r$1(left + x, top + y);\n      return {\n        left,\n        top,\n        translate\n      };\n    };\n    const SugarPosition = r$1;\n\n    const boxPosition = dom => {\n      const box = dom.getBoundingClientRect();\n      return SugarPosition(box.left, box.top);\n    };\n    const firstDefinedOrZero = (a, b) => {\n      if (a !== undefined) {\n        return a;\n      } else {\n        return b !== undefined ? b : 0;\n      }\n    };\n    const absolute$3 = element => {\n      const doc = element.dom.ownerDocument;\n      const body = doc.body;\n      const win = doc.defaultView;\n      const html = doc.documentElement;\n      if (body === element.dom) {\n        return SugarPosition(body.offsetLeft, body.offsetTop);\n      }\n      const scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop);\n      const scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageXOffset, html.scrollLeft);\n      const clientTop = firstDefinedOrZero(html.clientTop, body.clientTop);\n      const clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft);\n      return viewport$1(element).translate(scrollLeft - clientLeft, scrollTop - clientTop);\n    };\n    const viewport$1 = element => {\n      const dom = element.dom;\n      const doc = dom.ownerDocument;\n      const body = doc.body;\n      if (body === dom) {\n        return SugarPosition(body.offsetLeft, body.offsetTop);\n      }\n      if (!inBody(element)) {\n        return SugarPosition(0, 0);\n      }\n      return boxPosition(dom);\n    };\n\n    const api$1 = Dimension('width', element => element.dom.offsetWidth);\n    const set$7 = (element, h) => api$1.set(element, h);\n    const get$c = element => api$1.get(element);\n    const getOuter$1 = element => api$1.getOuter(element);\n    const setMax = (element, value) => {\n      const inclusions = [\n        'margin-left',\n        'border-left-width',\n        'padding-left',\n        'padding-right',\n        'border-right-width',\n        'margin-right'\n      ];\n      const absMax = api$1.max(element, value, inclusions);\n      set$8(element, 'max-width', absMax + 'px');\n    };\n\n    const cached = f => {\n      let called = false;\n      let r;\n      return (...args) => {\n        if (!called) {\n          called = true;\n          r = f.apply(null, args);\n        }\n        return r;\n      };\n    };\n\n    const DeviceType = (os, browser, userAgent, mediaMatch) => {\n      const isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;\n      const isiPhone = os.isiOS() && !isiPad;\n      const isMobile = os.isiOS() || os.isAndroid();\n      const isTouch = isMobile || mediaMatch('(pointer:coarse)');\n      const isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');\n      const isPhone = isiPhone || isMobile && !isTablet;\n      const iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;\n      const isDesktop = !isPhone && !isTablet && !iOSwebview;\n      return {\n        isiPad: constant$1(isiPad),\n        isiPhone: constant$1(isiPhone),\n        isTablet: constant$1(isTablet),\n        isPhone: constant$1(isPhone),\n        isTouch: constant$1(isTouch),\n        isAndroid: os.isAndroid,\n        isiOS: os.isiOS,\n        isWebView: constant$1(iOSwebview),\n        isDesktop: constant$1(isDesktop)\n      };\n    };\n\n    const firstMatch = (regexes, s) => {\n      for (let i = 0; i < regexes.length; i++) {\n        const x = regexes[i];\n        if (x.test(s)) {\n          return x;\n        }\n      }\n      return undefined;\n    };\n    const find$3 = (regexes, agent) => {\n      const r = firstMatch(regexes, agent);\n      if (!r) {\n        return {\n          major: 0,\n          minor: 0\n        };\n      }\n      const group = i => {\n        return Number(agent.replace(r, '$' + i));\n      };\n      return nu$d(group(1), group(2));\n    };\n    const detect$4 = (versionRegexes, agent) => {\n      const cleanedAgent = String(agent).toLowerCase();\n      if (versionRegexes.length === 0) {\n        return unknown$3();\n      }\n      return find$3(versionRegexes, cleanedAgent);\n    };\n    const unknown$3 = () => {\n      return nu$d(0, 0);\n    };\n    const nu$d = (major, minor) => {\n      return {\n        major,\n        minor\n      };\n    };\n    const Version = {\n      nu: nu$d,\n      detect: detect$4,\n      unknown: unknown$3\n    };\n\n    const detectBrowser$1 = (browsers, userAgentData) => {\n      return findMap(userAgentData.brands, uaBrand => {\n        const lcBrand = uaBrand.brand.toLowerCase();\n        return find$5(browsers, browser => {\n          var _a;\n          return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());\n        }).map(info => ({\n          current: info.name,\n          version: Version.nu(parseInt(uaBrand.version, 10), 0)\n        }));\n      });\n    };\n\n    const detect$3 = (candidates, userAgent) => {\n      const agent = String(userAgent).toLowerCase();\n      return find$5(candidates, candidate => {\n        return candidate.search(agent);\n      });\n    };\n    const detectBrowser = (browsers, userAgent) => {\n      return detect$3(browsers, userAgent).map(browser => {\n        const version = Version.detect(browser.versionRegexes, userAgent);\n        return {\n          current: browser.name,\n          version\n        };\n      });\n    };\n    const detectOs = (oses, userAgent) => {\n      return detect$3(oses, userAgent).map(os => {\n        const version = Version.detect(os.versionRegexes, userAgent);\n        return {\n          current: os.name,\n          version\n        };\n      });\n    };\n\n    const normalVersionRegex = /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/;\n    const checkContains = target => {\n      return uastring => {\n        return contains$1(uastring, target);\n      };\n    };\n    const browsers = [\n      {\n        name: 'Edge',\n        versionRegexes: [/.*?edge\\/ ?([0-9]+)\\.([0-9]+)$/],\n        search: uastring => {\n          return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit');\n        }\n      },\n      {\n        name: 'Chromium',\n        brand: 'Chromium',\n        versionRegexes: [\n          /.*?chrome\\/([0-9]+)\\.([0-9]+).*/,\n          normalVersionRegex\n        ],\n        search: uastring => {\n          return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe');\n        }\n      },\n      {\n        name: 'IE',\n        versionRegexes: [\n          /.*?msie\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*?rv:([0-9]+)\\.([0-9]+).*/\n        ],\n        search: uastring => {\n          return contains$1(uastring, 'msie') || contains$1(uastring, 'trident');\n        }\n      },\n      {\n        name: 'Opera',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?opera\\/([0-9]+)\\.([0-9]+).*/\n        ],\n        search: checkContains('opera')\n      },\n      {\n        name: 'Firefox',\n        versionRegexes: [/.*?firefox\\/\\ ?([0-9]+)\\.([0-9]+).*/],\n        search: checkContains('firefox')\n      },\n      {\n        name: 'Safari',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?cpu os ([0-9]+)_([0-9]+).*/\n        ],\n        search: uastring => {\n          return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit');\n        }\n      }\n    ];\n    const oses = [\n      {\n        name: 'Windows',\n        search: checkContains('win'),\n        versionRegexes: [/.*?windows\\ nt\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'iOS',\n        search: uastring => {\n          return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad');\n        },\n        versionRegexes: [\n          /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*cpu os ([0-9]+)_([0-9]+).*/,\n          /.*cpu iphone os ([0-9]+)_([0-9]+).*/\n        ]\n      },\n      {\n        name: 'Android',\n        search: checkContains('android'),\n        versionRegexes: [/.*?android\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'macOS',\n        search: checkContains('mac os x'),\n        versionRegexes: [/.*?mac\\ os\\ x\\ ?([0-9]+)_([0-9]+).*/]\n      },\n      {\n        name: 'Linux',\n        search: checkContains('linux'),\n        versionRegexes: []\n      },\n      {\n        name: 'Solaris',\n        search: checkContains('sunos'),\n        versionRegexes: []\n      },\n      {\n        name: 'FreeBSD',\n        search: checkContains('freebsd'),\n        versionRegexes: []\n      },\n      {\n        name: 'ChromeOS',\n        search: checkContains('cros'),\n        versionRegexes: [/.*?chrome\\/([0-9]+)\\.([0-9]+).*/]\n      }\n    ];\n    const PlatformInfo = {\n      browsers: constant$1(browsers),\n      oses: constant$1(oses)\n    };\n\n    const edge = 'Edge';\n    const chromium = 'Chromium';\n    const ie = 'IE';\n    const opera = 'Opera';\n    const firefox = 'Firefox';\n    const safari = 'Safari';\n    const unknown$2 = () => {\n      return nu$c({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    const nu$c = info => {\n      const current = info.current;\n      const version = info.version;\n      const isBrowser = name => () => current === name;\n      return {\n        current,\n        version,\n        isEdge: isBrowser(edge),\n        isChromium: isBrowser(chromium),\n        isIE: isBrowser(ie),\n        isOpera: isBrowser(opera),\n        isFirefox: isBrowser(firefox),\n        isSafari: isBrowser(safari)\n      };\n    };\n    const Browser = {\n      unknown: unknown$2,\n      nu: nu$c,\n      edge: constant$1(edge),\n      chromium: constant$1(chromium),\n      ie: constant$1(ie),\n      opera: constant$1(opera),\n      firefox: constant$1(firefox),\n      safari: constant$1(safari)\n    };\n\n    const windows = 'Windows';\n    const ios = 'iOS';\n    const android = 'Android';\n    const linux = 'Linux';\n    const macos = 'macOS';\n    const solaris = 'Solaris';\n    const freebsd = 'FreeBSD';\n    const chromeos = 'ChromeOS';\n    const unknown$1 = () => {\n      return nu$b({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    const nu$b = info => {\n      const current = info.current;\n      const version = info.version;\n      const isOS = name => () => current === name;\n      return {\n        current,\n        version,\n        isWindows: isOS(windows),\n        isiOS: isOS(ios),\n        isAndroid: isOS(android),\n        isMacOS: isOS(macos),\n        isLinux: isOS(linux),\n        isSolaris: isOS(solaris),\n        isFreeBSD: isOS(freebsd),\n        isChromeOS: isOS(chromeos)\n      };\n    };\n    const OperatingSystem = {\n      unknown: unknown$1,\n      nu: nu$b,\n      windows: constant$1(windows),\n      ios: constant$1(ios),\n      android: constant$1(android),\n      linux: constant$1(linux),\n      macos: constant$1(macos),\n      solaris: constant$1(solaris),\n      freebsd: constant$1(freebsd),\n      chromeos: constant$1(chromeos)\n    };\n\n    const detect$2 = (userAgent, userAgentDataOpt, mediaMatch) => {\n      const browsers = PlatformInfo.browsers();\n      const oses = PlatformInfo.oses();\n      const browser = userAgentDataOpt.bind(userAgentData => detectBrowser$1(browsers, userAgentData)).orThunk(() => detectBrowser(browsers, userAgent)).fold(Browser.unknown, Browser.nu);\n      const os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);\n      const deviceType = DeviceType(os, browser, userAgent, mediaMatch);\n      return {\n        browser,\n        os,\n        deviceType\n      };\n    };\n    const PlatformDetection = { detect: detect$2 };\n\n    const mediaMatch = query => window.matchMedia(query).matches;\n    let platform = cached(() => PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch));\n    const detect$1 = () => platform();\n\n    const mkEvent = (target, x, y, stop, prevent, kill, raw) => ({\n      target,\n      x,\n      y,\n      stop,\n      prevent,\n      kill,\n      raw\n    });\n    const fromRawEvent$1 = rawEvent => {\n      const target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));\n      const stop = () => rawEvent.stopPropagation();\n      const prevent = () => rawEvent.preventDefault();\n      const kill = compose(prevent, stop);\n      return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);\n    };\n    const handle = (filter, handler) => rawEvent => {\n      if (filter(rawEvent)) {\n        handler(fromRawEvent$1(rawEvent));\n      }\n    };\n    const binder = (element, event, filter, handler, useCapture) => {\n      const wrapped = handle(filter, handler);\n      element.dom.addEventListener(event, wrapped, useCapture);\n      return { unbind: curry(unbind, element, event, wrapped, useCapture) };\n    };\n    const bind$2 = (element, event, filter, handler) => binder(element, event, filter, handler, false);\n    const capture$1 = (element, event, filter, handler) => binder(element, event, filter, handler, true);\n    const unbind = (element, event, handler, useCapture) => {\n      element.dom.removeEventListener(event, handler, useCapture);\n    };\n\n    const before$1 = (marker, element) => {\n      const parent$1 = parent(marker);\n      parent$1.each(v => {\n        v.dom.insertBefore(element.dom, marker.dom);\n      });\n    };\n    const after$2 = (marker, element) => {\n      const sibling = nextSibling(marker);\n      sibling.fold(() => {\n        const parent$1 = parent(marker);\n        parent$1.each(v => {\n          append$2(v, element);\n        });\n      }, v => {\n        before$1(v, element);\n      });\n    };\n    const prepend$1 = (parent, element) => {\n      const firstChild$1 = firstChild(parent);\n      firstChild$1.fold(() => {\n        append$2(parent, element);\n      }, v => {\n        parent.dom.insertBefore(element.dom, v.dom);\n      });\n    };\n    const append$2 = (parent, element) => {\n      parent.dom.appendChild(element.dom);\n    };\n    const appendAt = (parent, element, index) => {\n      child$2(parent, index).fold(() => {\n        append$2(parent, element);\n      }, v => {\n        before$1(v, element);\n      });\n    };\n\n    const append$1 = (parent, elements) => {\n      each$1(elements, x => {\n        append$2(parent, x);\n      });\n    };\n\n    const empty = element => {\n      element.dom.textContent = '';\n      each$1(children(element), rogue => {\n        remove$5(rogue);\n      });\n    };\n    const remove$5 = element => {\n      const dom = element.dom;\n      if (dom.parentNode !== null) {\n        dom.parentNode.removeChild(dom);\n      }\n    };\n\n    const get$b = _DOC => {\n      const doc = _DOC !== undefined ? _DOC.dom : document;\n      const x = doc.body.scrollLeft || doc.documentElement.scrollLeft;\n      const y = doc.body.scrollTop || doc.documentElement.scrollTop;\n      return SugarPosition(x, y);\n    };\n    const to = (x, y, _DOC) => {\n      const doc = _DOC !== undefined ? _DOC.dom : document;\n      const win = doc.defaultView;\n      if (win) {\n        win.scrollTo(x, y);\n      }\n    };\n\n    const get$a = _win => {\n      const win = _win === undefined ? window : _win;\n      if (detect$1().browser.isFirefox()) {\n        return Optional.none();\n      } else {\n        return Optional.from(win.visualViewport);\n      }\n    };\n    const bounds$1 = (x, y, width, height) => ({\n      x,\n      y,\n      width,\n      height,\n      right: x + width,\n      bottom: y + height\n    });\n    const getBounds$3 = _win => {\n      const win = _win === undefined ? window : _win;\n      const doc = win.document;\n      const scroll = get$b(SugarElement.fromDom(doc));\n      return get$a(win).fold(() => {\n        const html = win.document.documentElement;\n        const width = html.clientWidth;\n        const height = html.clientHeight;\n        return bounds$1(scroll.left, scroll.top, width, height);\n      }, visualViewport => bounds$1(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height));\n    };\n\n    const getDocument = () => SugarElement.fromDom(document);\n\n    const walkUp = (navigation, doc) => {\n      const frame = navigation.view(doc);\n      return frame.fold(constant$1([]), f => {\n        const parent = navigation.owner(f);\n        const rest = walkUp(navigation, parent);\n        return [f].concat(rest);\n      });\n    };\n    const pathTo = (element, navigation) => {\n      const d = navigation.owner(element);\n      const paths = walkUp(navigation, d);\n      return Optional.some(paths);\n    };\n\n    const view = doc => {\n      var _a;\n      const element = doc.dom === document ? Optional.none() : Optional.from((_a = doc.dom.defaultView) === null || _a === void 0 ? void 0 : _a.frameElement);\n      return element.map(SugarElement.fromDom);\n    };\n    const owner$3 = element => owner$4(element);\n\n    var Navigation = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        view: view,\n        owner: owner$3\n    });\n\n    const find$2 = element => {\n      const doc = getDocument();\n      const scroll = get$b(doc);\n      const path = pathTo(element, Navigation);\n      return path.fold(curry(absolute$3, element), frames => {\n        const offset = viewport$1(element);\n        const r = foldr(frames, (b, a) => {\n          const loc = viewport$1(a);\n          return {\n            left: b.left + loc.left,\n            top: b.top + loc.top\n          };\n        }, {\n          left: 0,\n          top: 0\n        });\n        return SugarPosition(r.left + offset.left + scroll.left, r.top + offset.top + scroll.top);\n      });\n    };\n\n    const pointed = (point, width, height) => ({\n      point,\n      width,\n      height\n    });\n    const rect = (x, y, width, height) => ({\n      x,\n      y,\n      width,\n      height\n    });\n    const bounds = (x, y, width, height) => ({\n      x,\n      y,\n      width,\n      height,\n      right: x + width,\n      bottom: y + height\n    });\n    const box$1 = element => {\n      const xy = absolute$3(element);\n      const w = getOuter$1(element);\n      const h = getOuter$2(element);\n      return bounds(xy.left, xy.top, w, h);\n    };\n    const absolute$2 = element => {\n      const position = find$2(element);\n      const width = getOuter$1(element);\n      const height = getOuter$2(element);\n      return bounds(position.left, position.top, width, height);\n    };\n    const constrain = (original, constraint) => {\n      const left = Math.max(original.x, constraint.x);\n      const top = Math.max(original.y, constraint.y);\n      const right = Math.min(original.right, constraint.right);\n      const bottom = Math.min(original.bottom, constraint.bottom);\n      const width = right - left;\n      const height = bottom - top;\n      return bounds(left, top, width, height);\n    };\n    const constrainByMany = (original, constraints) => {\n      return foldl(constraints, (acc, c) => constrain(acc, c), original);\n    };\n    const win = () => getBounds$3(window);\n\n    var global$a = hugerte.util.Tools.resolve('hugerte.ThemeManager');\n\n    const value$4 = value => {\n      const applyHelper = fn => fn(value);\n      const constHelper = constant$1(value);\n      const outputHelper = () => output;\n      const output = {\n        tag: true,\n        inner: value,\n        fold: (_onError, onValue) => onValue(value),\n        isValue: always,\n        isError: never,\n        map: mapper => Result.value(mapper(value)),\n        mapError: outputHelper,\n        bind: applyHelper,\n        exists: applyHelper,\n        forall: applyHelper,\n        getOr: constHelper,\n        or: outputHelper,\n        getOrThunk: constHelper,\n        orThunk: outputHelper,\n        getOrDie: constHelper,\n        each: fn => {\n          fn(value);\n        },\n        toOptional: () => Optional.some(value)\n      };\n      return output;\n    };\n    const error$1 = error => {\n      const outputHelper = () => output;\n      const output = {\n        tag: false,\n        inner: error,\n        fold: (onError, _onValue) => onError(error),\n        isValue: never,\n        isError: always,\n        map: outputHelper,\n        mapError: mapper => Result.error(mapper(error)),\n        bind: outputHelper,\n        exists: never,\n        forall: always,\n        getOr: identity,\n        or: identity,\n        getOrThunk: apply$1,\n        orThunk: apply$1,\n        getOrDie: die(String(error)),\n        each: noop,\n        toOptional: Optional.none\n      };\n      return output;\n    };\n    const fromOption = (optional, err) => optional.fold(() => error$1(err), value$4);\n    const Result = {\n      value: value$4,\n      error: error$1,\n      fromOption\n    };\n\n    var SimpleResultType;\n    (function (SimpleResultType) {\n      SimpleResultType[SimpleResultType['Error'] = 0] = 'Error';\n      SimpleResultType[SimpleResultType['Value'] = 1] = 'Value';\n    }(SimpleResultType || (SimpleResultType = {})));\n    const fold$1 = (res, onError, onValue) => res.stype === SimpleResultType.Error ? onError(res.serror) : onValue(res.svalue);\n    const partition$2 = results => {\n      const values = [];\n      const errors = [];\n      each$1(results, obj => {\n        fold$1(obj, err => errors.push(err), val => values.push(val));\n      });\n      return {\n        values,\n        errors\n      };\n    };\n    const mapError = (res, f) => {\n      if (res.stype === SimpleResultType.Error) {\n        return {\n          stype: SimpleResultType.Error,\n          serror: f(res.serror)\n        };\n      } else {\n        return res;\n      }\n    };\n    const map = (res, f) => {\n      if (res.stype === SimpleResultType.Value) {\n        return {\n          stype: SimpleResultType.Value,\n          svalue: f(res.svalue)\n        };\n      } else {\n        return res;\n      }\n    };\n    const bind$1 = (res, f) => {\n      if (res.stype === SimpleResultType.Value) {\n        return f(res.svalue);\n      } else {\n        return res;\n      }\n    };\n    const bindError = (res, f) => {\n      if (res.stype === SimpleResultType.Error) {\n        return f(res.serror);\n      } else {\n        return res;\n      }\n    };\n    const svalue = v => ({\n      stype: SimpleResultType.Value,\n      svalue: v\n    });\n    const serror = e => ({\n      stype: SimpleResultType.Error,\n      serror: e\n    });\n    const toResult$1 = res => fold$1(res, Result.error, Result.value);\n    const fromResult$1 = res => res.fold(serror, svalue);\n    const SimpleResult = {\n      fromResult: fromResult$1,\n      toResult: toResult$1,\n      svalue,\n      partition: partition$2,\n      serror,\n      bind: bind$1,\n      bindError,\n      map,\n      mapError,\n      fold: fold$1\n    };\n\n    const field$2 = (key, newKey, presence, prop) => ({\n      tag: 'field',\n      key,\n      newKey,\n      presence,\n      prop\n    });\n    const customField$1 = (newKey, instantiator) => ({\n      tag: 'custom',\n      newKey,\n      instantiator\n    });\n    const fold = (value, ifField, ifCustom) => {\n      switch (value.tag) {\n      case 'field':\n        return ifField(value.key, value.newKey, value.presence, value.prop);\n      case 'custom':\n        return ifCustom(value.newKey, value.instantiator);\n      }\n    };\n\n    const shallow$1 = (old, nu) => {\n      return nu;\n    };\n    const deep$1 = (old, nu) => {\n      const bothObjects = isPlainObject(old) && isPlainObject(nu);\n      return bothObjects ? deepMerge(old, nu) : nu;\n    };\n    const baseMerge = merger => {\n      return (...objects) => {\n        if (objects.length === 0) {\n          throw new Error(`Can't merge zero objects`);\n        }\n        const ret = {};\n        for (let j = 0; j < objects.length; j++) {\n          const curObject = objects[j];\n          for (const key in curObject) {\n            if (has$2(curObject, key)) {\n              ret[key] = merger(ret[key], curObject[key]);\n            }\n          }\n        }\n        return ret;\n      };\n    };\n    const deepMerge = baseMerge(deep$1);\n    const merge$1 = baseMerge(shallow$1);\n\n    const required$2 = () => ({\n      tag: 'required',\n      process: {}\n    });\n    const defaultedThunk = fallbackThunk => ({\n      tag: 'defaultedThunk',\n      process: fallbackThunk\n    });\n    const defaulted$1 = fallback => defaultedThunk(constant$1(fallback));\n    const asOption = () => ({\n      tag: 'option',\n      process: {}\n    });\n    const mergeWithThunk = baseThunk => ({\n      tag: 'mergeWithThunk',\n      process: baseThunk\n    });\n    const mergeWith = base => mergeWithThunk(constant$1(base));\n\n    const mergeValues$1 = (values, base) => values.length > 0 ? SimpleResult.svalue(deepMerge(base, merge$1.apply(undefined, values))) : SimpleResult.svalue(base);\n    const mergeErrors$1 = errors => compose(SimpleResult.serror, flatten)(errors);\n    const consolidateObj = (objects, base) => {\n      const partition = SimpleResult.partition(objects);\n      return partition.errors.length > 0 ? mergeErrors$1(partition.errors) : mergeValues$1(partition.values, base);\n    };\n    const consolidateArr = objects => {\n      const partitions = SimpleResult.partition(objects);\n      return partitions.errors.length > 0 ? mergeErrors$1(partitions.errors) : SimpleResult.svalue(partitions.values);\n    };\n    const ResultCombine = {\n      consolidateObj,\n      consolidateArr\n    };\n\n    const formatObj = input => {\n      return isObject(input) && keys(input).length > 100 ? ' removed due to size' : JSON.stringify(input, null, 2);\n    };\n    const formatErrors = errors => {\n      const es = errors.length > 10 ? errors.slice(0, 10).concat([{\n          path: [],\n          getErrorInfo: constant$1('... (only showing first ten failures)')\n        }]) : errors;\n      return map$2(es, e => {\n        return 'Failed path: (' + e.path.join(' > ') + ')\\n' + e.getErrorInfo();\n      });\n    };\n\n    const nu$a = (path, getErrorInfo) => {\n      return SimpleResult.serror([{\n          path,\n          getErrorInfo\n        }]);\n    };\n    const missingRequired = (path, key, obj) => nu$a(path, () => 'Could not find valid *required* value for \"' + key + '\" in ' + formatObj(obj));\n    const missingKey = (path, key) => nu$a(path, () => 'Choice schema did not contain choice key: \"' + key + '\"');\n    const missingBranch = (path, branches, branch) => nu$a(path, () => 'The chosen schema: \"' + branch + '\" did not exist in branches: ' + formatObj(branches));\n    const unsupportedFields = (path, unsupported) => nu$a(path, () => 'There are unsupported fields: [' + unsupported.join(', ') + '] specified');\n    const custom = (path, err) => nu$a(path, constant$1(err));\n\n    const value$3 = validator => {\n      const extract = (path, val) => {\n        return SimpleResult.bindError(validator(val), err => custom(path, err));\n      };\n      const toString = constant$1('val');\n      return {\n        extract,\n        toString\n      };\n    };\n    const anyValue$1 = value$3(SimpleResult.svalue);\n\n    const requiredAccess = (path, obj, key, bundle) => get$g(obj, key).fold(() => missingRequired(path, key, obj), bundle);\n    const fallbackAccess = (obj, key, fallback, bundle) => {\n      const v = get$g(obj, key).getOrThunk(() => fallback(obj));\n      return bundle(v);\n    };\n    const optionAccess = (obj, key, bundle) => bundle(get$g(obj, key));\n    const optionDefaultedAccess = (obj, key, fallback, bundle) => {\n      const opt = get$g(obj, key).map(val => val === true ? fallback(obj) : val);\n      return bundle(opt);\n    };\n    const extractField = (field, path, obj, key, prop) => {\n      const bundle = av => prop.extract(path.concat([key]), av);\n      const bundleAsOption = optValue => optValue.fold(() => SimpleResult.svalue(Optional.none()), ov => {\n        const result = prop.extract(path.concat([key]), ov);\n        return SimpleResult.map(result, Optional.some);\n      });\n      switch (field.tag) {\n      case 'required':\n        return requiredAccess(path, obj, key, bundle);\n      case 'defaultedThunk':\n        return fallbackAccess(obj, key, field.process, bundle);\n      case 'option':\n        return optionAccess(obj, key, bundleAsOption);\n      case 'defaultedOptionThunk':\n        return optionDefaultedAccess(obj, key, field.process, bundleAsOption);\n      case 'mergeWithThunk': {\n          return fallbackAccess(obj, key, constant$1({}), v => {\n            const result = deepMerge(field.process(obj), v);\n            return bundle(result);\n          });\n        }\n      }\n    };\n    const extractFields = (path, obj, fields) => {\n      const success = {};\n      const errors = [];\n      for (const field of fields) {\n        fold(field, (key, newKey, presence, prop) => {\n          const result = extractField(presence, path, obj, key, prop);\n          SimpleResult.fold(result, err => {\n            errors.push(...err);\n          }, res => {\n            success[newKey] = res;\n          });\n        }, (newKey, instantiator) => {\n          success[newKey] = instantiator(obj);\n        });\n      }\n      return errors.length > 0 ? SimpleResult.serror(errors) : SimpleResult.svalue(success);\n    };\n    const valueThunk = getDelegate => {\n      const extract = (path, val) => getDelegate().extract(path, val);\n      const toString = () => getDelegate().toString();\n      return {\n        extract,\n        toString\n      };\n    };\n    const getSetKeys = obj => keys(filter$1(obj, isNonNullable));\n    const objOfOnly = fields => {\n      const delegate = objOf(fields);\n      const fieldNames = foldr(fields, (acc, value) => {\n        return fold(value, key => deepMerge(acc, { [key]: true }), constant$1(acc));\n      }, {});\n      const extract = (path, o) => {\n        const keys = isBoolean(o) ? [] : getSetKeys(o);\n        const extra = filter$2(keys, k => !hasNonNullableKey(fieldNames, k));\n        return extra.length === 0 ? delegate.extract(path, o) : unsupportedFields(path, extra);\n      };\n      return {\n        extract,\n        toString: delegate.toString\n      };\n    };\n    const objOf = values => {\n      const extract = (path, o) => extractFields(path, o, values);\n      const toString = () => {\n        const fieldStrings = map$2(values, value => fold(value, (key, _okey, _presence, prop) => key + ' -> ' + prop.toString(), (newKey, _instantiator) => 'state(' + newKey + ')'));\n        return 'obj{\\n' + fieldStrings.join('\\n') + '}';\n      };\n      return {\n        extract,\n        toString\n      };\n    };\n    const arrOf = prop => {\n      const extract = (path, array) => {\n        const results = map$2(array, (a, i) => prop.extract(path.concat(['[' + i + ']']), a));\n        return ResultCombine.consolidateArr(results);\n      };\n      const toString = () => 'array(' + prop.toString() + ')';\n      return {\n        extract,\n        toString\n      };\n    };\n    const oneOf = (props, rawF) => {\n      const f = rawF !== undefined ? rawF : identity;\n      const extract = (path, val) => {\n        const errors = [];\n        for (const prop of props) {\n          const res = prop.extract(path, val);\n          if (res.stype === SimpleResultType.Value) {\n            return {\n              stype: SimpleResultType.Value,\n              svalue: f(res.svalue)\n            };\n          }\n          errors.push(res);\n        }\n        return ResultCombine.consolidateArr(errors);\n      };\n      const toString = () => 'oneOf(' + map$2(props, prop => prop.toString()).join(', ') + ')';\n      return {\n        extract,\n        toString\n      };\n    };\n    const setOf$1 = (validator, prop) => {\n      const validateKeys = (path, keys) => arrOf(value$3(validator)).extract(path, keys);\n      const extract = (path, o) => {\n        const keys$1 = keys(o);\n        const validatedKeys = validateKeys(path, keys$1);\n        return SimpleResult.bind(validatedKeys, validKeys => {\n          const schema = map$2(validKeys, vk => {\n            return field$2(vk, vk, required$2(), prop);\n          });\n          return objOf(schema).extract(path, o);\n        });\n      };\n      const toString = () => 'setOf(' + prop.toString() + ')';\n      return {\n        extract,\n        toString\n      };\n    };\n    const thunk = (_desc, processor) => {\n      const getP = cached(processor);\n      const extract = (path, val) => getP().extract(path, val);\n      const toString = () => getP().toString();\n      return {\n        extract,\n        toString\n      };\n    };\n    const arrOfObj = compose(arrOf, objOf);\n\n    const anyValue = constant$1(anyValue$1);\n    const typedValue = (validator, expectedType) => value$3(a => {\n      const actualType = typeof a;\n      return validator(a) ? SimpleResult.svalue(a) : SimpleResult.serror(`Expected type: ${ expectedType } but got: ${ actualType }`);\n    });\n    const number = typedValue(isNumber, 'number');\n    const string = typedValue(isString, 'string');\n    const boolean = typedValue(isBoolean, 'boolean');\n    const functionProcessor = typedValue(isFunction, 'function');\n    const isPostMessageable = val => {\n      if (Object(val) !== val) {\n        return true;\n      }\n      switch ({}.toString.call(val).slice(8, -1)) {\n      case 'Boolean':\n      case 'Number':\n      case 'String':\n      case 'Date':\n      case 'RegExp':\n      case 'Blob':\n      case 'FileList':\n      case 'ImageData':\n      case 'ImageBitmap':\n      case 'ArrayBuffer':\n        return true;\n      case 'Array':\n      case 'Object':\n        return Object.keys(val).every(prop => isPostMessageable(val[prop]));\n      default:\n        return false;\n      }\n    };\n    const postMessageable = value$3(a => {\n      if (isPostMessageable(a)) {\n        return SimpleResult.svalue(a);\n      } else {\n        return SimpleResult.serror('Expected value to be acceptable for sending via postMessage');\n      }\n    });\n\n    const chooseFrom = (path, input, branches, ch) => {\n      const fields = get$g(branches, ch);\n      return fields.fold(() => missingBranch(path, branches, ch), vp => vp.extract(path.concat(['branch: ' + ch]), input));\n    };\n    const choose$2 = (key, branches) => {\n      const extract = (path, input) => {\n        const choice = get$g(input, key);\n        return choice.fold(() => missingKey(path, key), chosen => chooseFrom(path, input, branches, chosen));\n      };\n      const toString = () => 'chooseOn(' + key + '). Possible values: ' + keys(branches);\n      return {\n        extract,\n        toString\n      };\n    };\n\n    const arrOfVal = () => arrOf(anyValue$1);\n    const valueOf = validator => value$3(v => validator(v).fold(SimpleResult.serror, SimpleResult.svalue));\n    const setOf = (validator, prop) => setOf$1(v => SimpleResult.fromResult(validator(v)), prop);\n    const extractValue = (label, prop, obj) => {\n      const res = prop.extract([label], obj);\n      return SimpleResult.mapError(res, errs => ({\n        input: obj,\n        errors: errs\n      }));\n    };\n    const asRaw = (label, prop, obj) => SimpleResult.toResult(extractValue(label, prop, obj));\n    const getOrDie = extraction => {\n      return extraction.fold(errInfo => {\n        throw new Error(formatError(errInfo));\n      }, identity);\n    };\n    const asRawOrDie$1 = (label, prop, obj) => getOrDie(asRaw(label, prop, obj));\n    const formatError = errInfo => {\n      return 'Errors: \\n' + formatErrors(errInfo.errors).join('\\n') + '\\n\\nInput object: ' + formatObj(errInfo.input);\n    };\n    const choose$1 = (key, branches) => choose$2(key, map$1(branches, objOf));\n    const thunkOf = (desc, schema) => thunk(desc, schema);\n\n    const field$1 = field$2;\n    const customField = customField$1;\n    const validateEnum = values => valueOf(value => contains$2(values, value) ? Result.value(value) : Result.error(`Unsupported value: \"${ value }\", choose one of \"${ values.join(', ') }\".`));\n    const required$1 = key => field$1(key, key, required$2(), anyValue());\n    const requiredOf = (key, schema) => field$1(key, key, required$2(), schema);\n    const requiredNumber = key => requiredOf(key, number);\n    const requiredString = key => requiredOf(key, string);\n    const requiredStringEnum = (key, values) => field$1(key, key, required$2(), validateEnum(values));\n    const requiredBoolean = key => requiredOf(key, boolean);\n    const requiredFunction = key => requiredOf(key, functionProcessor);\n    const forbid = (key, message) => field$1(key, key, asOption(), value$3(_v => SimpleResult.serror('The field: ' + key + ' is forbidden. ' + message)));\n    const requiredObjOf = (key, objSchema) => field$1(key, key, required$2(), objOf(objSchema));\n    const requiredArrayOfObj = (key, objFields) => field$1(key, key, required$2(), arrOfObj(objFields));\n    const requiredArrayOf = (key, schema) => field$1(key, key, required$2(), arrOf(schema));\n    const option$3 = key => field$1(key, key, asOption(), anyValue());\n    const optionOf = (key, schema) => field$1(key, key, asOption(), schema);\n    const optionNumber = key => optionOf(key, number);\n    const optionString = key => optionOf(key, string);\n    const optionStringEnum = (key, values) => optionOf(key, validateEnum(values));\n    const optionFunction = key => optionOf(key, functionProcessor);\n    const optionArrayOf = (key, schema) => optionOf(key, arrOf(schema));\n    const optionObjOf = (key, objSchema) => optionOf(key, objOf(objSchema));\n    const optionObjOfOnly = (key, objSchema) => optionOf(key, objOfOnly(objSchema));\n    const defaulted = (key, fallback) => field$1(key, key, defaulted$1(fallback), anyValue());\n    const defaultedOf = (key, fallback, schema) => field$1(key, key, defaulted$1(fallback), schema);\n    const defaultedNumber = (key, fallback) => defaultedOf(key, fallback, number);\n    const defaultedString = (key, fallback) => defaultedOf(key, fallback, string);\n    const defaultedStringEnum = (key, fallback, values) => defaultedOf(key, fallback, validateEnum(values));\n    const defaultedBoolean = (key, fallback) => defaultedOf(key, fallback, boolean);\n    const defaultedFunction = (key, fallback) => defaultedOf(key, fallback, functionProcessor);\n    const defaultedPostMsg = (key, fallback) => defaultedOf(key, fallback, postMessageable);\n    const defaultedArrayOf = (key, fallback, schema) => defaultedOf(key, fallback, arrOf(schema));\n    const defaultedObjOf = (key, fallback, objSchema) => defaultedOf(key, fallback, objOf(objSchema));\n\n    const Cell = initial => {\n      let value = initial;\n      const get = () => {\n        return value;\n      };\n      const set = v => {\n        value = v;\n      };\n      return {\n        get,\n        set\n      };\n    };\n\n    const generate$7 = cases => {\n      if (!isArray(cases)) {\n        throw new Error('cases must be an array');\n      }\n      if (cases.length === 0) {\n        throw new Error('there must be at least one case');\n      }\n      const constructors = [];\n      const adt = {};\n      each$1(cases, (acase, count) => {\n        const keys$1 = keys(acase);\n        if (keys$1.length !== 1) {\n          throw new Error('one and only one name per case');\n        }\n        const key = keys$1[0];\n        const value = acase[key];\n        if (adt[key] !== undefined) {\n          throw new Error('duplicate key detected:' + key);\n        } else if (key === 'cata') {\n          throw new Error('cannot have a case named cata (sorry)');\n        } else if (!isArray(value)) {\n          throw new Error('case arguments must be an array');\n        }\n        constructors.push(key);\n        adt[key] = (...args) => {\n          const argLength = args.length;\n          if (argLength !== value.length) {\n            throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);\n          }\n          const match = branches => {\n            const branchKeys = keys(branches);\n            if (constructors.length !== branchKeys.length) {\n              throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\\nActual: ' + branchKeys.join(','));\n            }\n            const allReqd = forall(constructors, reqKey => {\n              return contains$2(branchKeys, reqKey);\n            });\n            if (!allReqd) {\n              throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\\nRequired: ' + constructors.join(', '));\n            }\n            return branches[key].apply(null, args);\n          };\n          return {\n            fold: (...foldArgs) => {\n              if (foldArgs.length !== cases.length) {\n                throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length);\n              }\n              const target = foldArgs[count];\n              return target.apply(null, args);\n            },\n            match,\n            log: label => {\n              console.log(label, {\n                constructors,\n                constructor: key,\n                params: args\n              });\n            }\n          };\n        };\n      });\n      return adt;\n    };\n    const Adt = { generate: generate$7 };\n\n    Adt.generate([\n      {\n        bothErrors: [\n          'error1',\n          'error2'\n        ]\n      },\n      {\n        firstError: [\n          'error1',\n          'value2'\n        ]\n      },\n      {\n        secondError: [\n          'value1',\n          'error2'\n        ]\n      },\n      {\n        bothValues: [\n          'value1',\n          'value2'\n        ]\n      }\n    ]);\n    const partition$1 = results => {\n      const errors = [];\n      const values = [];\n      each$1(results, result => {\n        result.fold(err => {\n          errors.push(err);\n        }, value => {\n          values.push(value);\n        });\n      });\n      return {\n        errors,\n        values\n      };\n    };\n\n    const exclude$1 = (obj, fields) => {\n      const r = {};\n      each(obj, (v, k) => {\n        if (!contains$2(fields, k)) {\n          r[k] = v;\n        }\n      });\n      return r;\n    };\n\n    const wrap$2 = (key, value) => ({ [key]: value });\n    const wrapAll$1 = keyvalues => {\n      const r = {};\n      each$1(keyvalues, kv => {\n        r[kv.key] = kv.value;\n      });\n      return r;\n    };\n\n    const exclude = (obj, fields) => exclude$1(obj, fields);\n    const wrap$1 = (key, value) => wrap$2(key, value);\n    const wrapAll = keyvalues => wrapAll$1(keyvalues);\n    const mergeValues = (values, base) => {\n      return values.length === 0 ? Result.value(base) : Result.value(deepMerge(base, merge$1.apply(undefined, values)));\n    };\n    const mergeErrors = errors => Result.error(flatten(errors));\n    const consolidate = (objs, base) => {\n      const partitions = partition$1(objs);\n      return partitions.errors.length > 0 ? mergeErrors(partitions.errors) : mergeValues(partitions.values, base);\n    };\n\n    const ensureIsRoot = isRoot => isFunction(isRoot) ? isRoot : never;\n    const ancestor$2 = (scope, transform, isRoot) => {\n      let element = scope.dom;\n      const stop = ensureIsRoot(isRoot);\n      while (element.parentNode) {\n        element = element.parentNode;\n        const el = SugarElement.fromDom(element);\n        const transformed = transform(el);\n        if (transformed.isSome()) {\n          return transformed;\n        } else if (stop(el)) {\n          break;\n        }\n      }\n      return Optional.none();\n    };\n    const closest$4 = (scope, transform, isRoot) => {\n      const current = transform(scope);\n      const stop = ensureIsRoot(isRoot);\n      return current.orThunk(() => stop(scope) ? Optional.none() : ancestor$2(scope, transform, stop));\n    };\n\n    const isSource = (component, simulatedEvent) => eq(component.element, simulatedEvent.event.target);\n\n    const defaultEventHandler = {\n      can: always,\n      abort: never,\n      run: noop\n    };\n    const nu$9 = parts => {\n      if (!hasNonNullableKey(parts, 'can') && !hasNonNullableKey(parts, 'abort') && !hasNonNullableKey(parts, 'run')) {\n        throw new Error('EventHandler defined by: ' + JSON.stringify(parts, null, 2) + ' does not have can, abort, or run!');\n      }\n      return {\n        ...defaultEventHandler,\n        ...parts\n      };\n    };\n    const all$2 = (handlers, f) => (...args) => foldl(handlers, (acc, handler) => acc && f(handler).apply(undefined, args), true);\n    const any = (handlers, f) => (...args) => foldl(handlers, (acc, handler) => acc || f(handler).apply(undefined, args), false);\n    const read$2 = handler => isFunction(handler) ? {\n      can: always,\n      abort: never,\n      run: handler\n    } : handler;\n    const fuse$1 = handlers => {\n      const can = all$2(handlers, handler => handler.can);\n      const abort = any(handlers, handler => handler.abort);\n      const run = (...args) => {\n        each$1(handlers, handler => {\n          handler.run.apply(undefined, args);\n        });\n      };\n      return {\n        can,\n        abort,\n        run\n      };\n    };\n\n    const constant = constant$1;\n    const touchstart = constant('touchstart');\n    const touchmove = constant('touchmove');\n    const touchend = constant('touchend');\n    const touchcancel = constant('touchcancel');\n    const mousedown = constant('mousedown');\n    const mousemove = constant('mousemove');\n    const mouseout = constant('mouseout');\n    const mouseup = constant('mouseup');\n    const mouseover = constant('mouseover');\n    const focusin = constant('focusin');\n    const focusout = constant('focusout');\n    const keydown = constant('keydown');\n    const keyup = constant('keyup');\n    const input = constant('input');\n    const change = constant('change');\n    const click = constant('click');\n    const transitioncancel = constant('transitioncancel');\n    const transitionend = constant('transitionend');\n    const transitionstart = constant('transitionstart');\n    const selectstart = constant('selectstart');\n\n    const prefixName = name => constant$1('alloy.' + name);\n    const alloy = { tap: prefixName('tap') };\n    const focus$4 = prefixName('focus');\n    const postBlur = prefixName('blur.post');\n    const postPaste = prefixName('paste.post');\n    const receive = prefixName('receive');\n    const execute$5 = prefixName('execute');\n    const focusItem = prefixName('focus.item');\n    const tap = alloy.tap;\n    const longpress = prefixName('longpress');\n    const sandboxClose = prefixName('sandbox.close');\n    const typeaheadCancel = prefixName('typeahead.cancel');\n    const systemInit = prefixName('system.init');\n    const documentTouchmove = prefixName('system.touchmove');\n    const documentTouchend = prefixName('system.touchend');\n    const windowScroll = prefixName('system.scroll');\n    const windowResize = prefixName('system.resize');\n    const attachedToDom = prefixName('system.attached');\n    const detachedFromDom = prefixName('system.detached');\n    const dismissRequested = prefixName('system.dismissRequested');\n    const repositionRequested = prefixName('system.repositionRequested');\n    const focusShifted = prefixName('focusmanager.shifted');\n    const slotVisibility = prefixName('slotcontainer.visibility');\n    const externalElementScroll = prefixName('system.external.element.scroll');\n    const changeTab = prefixName('change.tab');\n    const dismissTab = prefixName('dismiss.tab');\n    const highlight$1 = prefixName('highlight');\n    const dehighlight$1 = prefixName('dehighlight');\n\n    const emit = (component, event) => {\n      dispatchWith(component, component.element, event, {});\n    };\n    const emitWith = (component, event, properties) => {\n      dispatchWith(component, component.element, event, properties);\n    };\n    const emitExecute = component => {\n      emit(component, execute$5());\n    };\n    const dispatch = (component, target, event) => {\n      dispatchWith(component, target, event, {});\n    };\n    const dispatchWith = (component, target, event, properties) => {\n      const data = {\n        target,\n        ...properties\n      };\n      component.getSystem().triggerEvent(event, target, data);\n    };\n    const retargetAndDispatchWith = (component, target, eventName, properties) => {\n      const data = {\n        ...properties,\n        target\n      };\n      component.getSystem().triggerEvent(eventName, target, data);\n    };\n    const dispatchEvent = (component, target, event, simulatedEvent) => {\n      component.getSystem().triggerEvent(event, target, simulatedEvent.event);\n    };\n\n    const derive$2 = configs => wrapAll(configs);\n    const abort = (name, predicate) => {\n      return {\n        key: name,\n        value: nu$9({ abort: predicate })\n      };\n    };\n    const can = (name, predicate) => {\n      return {\n        key: name,\n        value: nu$9({ can: predicate })\n      };\n    };\n    const preventDefault = name => {\n      return {\n        key: name,\n        value: nu$9({\n          run: (component, simulatedEvent) => {\n            simulatedEvent.event.prevent();\n          }\n        })\n      };\n    };\n    const run$1 = (name, handler) => {\n      return {\n        key: name,\n        value: nu$9({ run: handler })\n      };\n    };\n    const runActionExtra = (name, action, extra) => {\n      return {\n        key: name,\n        value: nu$9({\n          run: (component, simulatedEvent) => {\n            action.apply(undefined, [\n              component,\n              simulatedEvent\n            ].concat(extra));\n          }\n        })\n      };\n    };\n    const runOnName = name => {\n      return handler => run$1(name, handler);\n    };\n    const runOnSourceName = name => {\n      return handler => ({\n        key: name,\n        value: nu$9({\n          run: (component, simulatedEvent) => {\n            if (isSource(component, simulatedEvent)) {\n              handler(component, simulatedEvent);\n            }\n          }\n        })\n      });\n    };\n    const redirectToUid = (name, uid) => {\n      return run$1(name, (component, simulatedEvent) => {\n        component.getSystem().getByUid(uid).each(redirectee => {\n          dispatchEvent(redirectee, redirectee.element, name, simulatedEvent);\n        });\n      });\n    };\n    const redirectToPart = (name, detail, partName) => {\n      const uid = detail.partUids[partName];\n      return redirectToUid(name, uid);\n    };\n    const runWithTarget = (name, f) => {\n      return run$1(name, (component, simulatedEvent) => {\n        const ev = simulatedEvent.event;\n        const target = component.getSystem().getByDom(ev.target).getOrThunk(() => {\n          const closest = closest$4(ev.target, el => component.getSystem().getByDom(el).toOptional(), never);\n          return closest.getOr(component);\n        });\n        f(component, target, simulatedEvent);\n      });\n    };\n    const cutter = name => {\n      return run$1(name, (component, simulatedEvent) => {\n        simulatedEvent.cut();\n      });\n    };\n    const stopper = name => {\n      return run$1(name, (component, simulatedEvent) => {\n        simulatedEvent.stop();\n      });\n    };\n    const runOnSource = (name, f) => {\n      return runOnSourceName(name)(f);\n    };\n    const runOnAttached = runOnSourceName(attachedToDom());\n    const runOnDetached = runOnSourceName(detachedFromDom());\n    const runOnInit = runOnSourceName(systemInit());\n    const runOnExecute$1 = runOnName(execute$5());\n\n    const fromHtml$1 = (html, scope) => {\n      const doc = scope || document;\n      const div = doc.createElement('div');\n      div.innerHTML = html;\n      return children(SugarElement.fromDom(div));\n    };\n\n    const get$9 = element => element.dom.innerHTML;\n    const set$6 = (element, content) => {\n      const owner = owner$4(element);\n      const docDom = owner.dom;\n      const fragment = SugarElement.fromDom(docDom.createDocumentFragment());\n      const contentElements = fromHtml$1(content, docDom);\n      append$1(fragment, contentElements);\n      empty(element);\n      append$2(element, fragment);\n    };\n    const getOuter = element => {\n      const container = SugarElement.fromTag('div');\n      const clone = SugarElement.fromDom(element.dom.cloneNode(true));\n      append$2(container, clone);\n      return get$9(container);\n    };\n\n    const clone$1 = (original, isDeep) => SugarElement.fromDom(original.dom.cloneNode(isDeep));\n    const shallow = original => clone$1(original, false);\n    const deep = original => clone$1(original, true);\n\n    const getHtml = element => {\n      if (isShadowRoot(element)) {\n        return '#shadow-root';\n      } else {\n        const clone = shallow(element);\n        return getOuter(clone);\n      }\n    };\n\n    const element = elem => getHtml(elem);\n\n    const isRecursive = (component, originator, target) => eq(originator, component.element) && !eq(originator, target);\n    const events$i = derive$2([can(focus$4(), (component, simulatedEvent) => {\n        const event = simulatedEvent.event;\n        const originator = event.originator;\n        const target = event.target;\n        if (isRecursive(component, originator, target)) {\n          console.warn(focus$4() + ' did not get interpreted by the desired target. ' + '\\nOriginator: ' + element(originator) + '\\nTarget: ' + element(target) + '\\nCheck the ' + focus$4() + ' event handlers');\n          return false;\n        } else {\n          return true;\n        }\n      })]);\n\n    var DefaultEvents = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$i\n    });\n\n    let unique = 0;\n    const generate$6 = prefix => {\n      const date = new Date();\n      const time = date.getTime();\n      const random = Math.floor(Math.random() * 1000000000);\n      unique++;\n      return prefix + '_' + random + unique + String(time);\n    };\n\n    const prefix$1 = constant$1('alloy-id-');\n    const idAttr$1 = constant$1('data-alloy-id');\n\n    const prefix = prefix$1();\n    const idAttr = idAttr$1();\n    const write = (label, elem) => {\n      const id = generate$6(prefix + label);\n      writeOnly(elem, id);\n      return id;\n    };\n    const writeOnly = (elem, uid) => {\n      Object.defineProperty(elem.dom, idAttr, {\n        value: uid,\n        writable: true\n      });\n    };\n    const read$1 = elem => {\n      const id = isElement$1(elem) ? elem.dom[idAttr] : null;\n      return Optional.from(id);\n    };\n    const generate$5 = prefix => generate$6(prefix);\n\n    const make$8 = identity;\n\n    const NoContextApi = getComp => {\n      const getMessage = event => `The component must be in a context to execute: ${ event }` + (getComp ? '\\n' + element(getComp().element) + ' is not in context.' : '');\n      const fail = event => () => {\n        throw new Error(getMessage(event));\n      };\n      const warn = event => () => {\n        console.warn(getMessage(event));\n      };\n      return {\n        debugInfo: constant$1('fake'),\n        triggerEvent: warn('triggerEvent'),\n        triggerFocus: warn('triggerFocus'),\n        triggerEscape: warn('triggerEscape'),\n        broadcast: warn('broadcast'),\n        broadcastOn: warn('broadcastOn'),\n        broadcastEvent: warn('broadcastEvent'),\n        build: fail('build'),\n        buildOrPatch: fail('buildOrPatch'),\n        addToWorld: fail('addToWorld'),\n        removeFromWorld: fail('removeFromWorld'),\n        addToGui: fail('addToGui'),\n        removeFromGui: fail('removeFromGui'),\n        getByUid: fail('getByUid'),\n        getByDom: fail('getByDom'),\n        isConnected: never\n      };\n    };\n    const singleton$1 = NoContextApi();\n\n    const markAsBehaviourApi = (f, apiName, apiFunction) => {\n      const delegate = apiFunction.toString();\n      const endIndex = delegate.indexOf(')') + 1;\n      const openBracketIndex = delegate.indexOf('(');\n      const parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\\s*/);\n      f.toFunctionAnnotation = () => ({\n        name: apiName,\n        parameters: cleanParameters(parameters.slice(0, 1).concat(parameters.slice(3)))\n      });\n      return f;\n    };\n    const cleanParameters = parameters => map$2(parameters, p => endsWith(p, '/*') ? p.substring(0, p.length - '/*'.length) : p);\n    const markAsExtraApi = (f, extraName) => {\n      const delegate = f.toString();\n      const endIndex = delegate.indexOf(')') + 1;\n      const openBracketIndex = delegate.indexOf('(');\n      const parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\\s*/);\n      f.toFunctionAnnotation = () => ({\n        name: extraName,\n        parameters: cleanParameters(parameters)\n      });\n      return f;\n    };\n    const markAsSketchApi = (f, apiFunction) => {\n      const delegate = apiFunction.toString();\n      const endIndex = delegate.indexOf(')') + 1;\n      const openBracketIndex = delegate.indexOf('(');\n      const parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\\s*/);\n      f.toFunctionAnnotation = () => ({\n        name: 'OVERRIDE',\n        parameters: cleanParameters(parameters.slice(1))\n      });\n      return f;\n    };\n\n    const premadeTag = generate$6('alloy-premade');\n    const premade$1 = comp => {\n      Object.defineProperty(comp.element.dom, premadeTag, {\n        value: comp.uid,\n        writable: true\n      });\n      return wrap$1(premadeTag, comp);\n    };\n    const isPremade = element => has$2(element.dom, premadeTag);\n    const getPremade = spec => get$g(spec, premadeTag);\n    const makeApi = f => markAsSketchApi((component, ...rest) => f(component.getApis(), component, ...rest), f);\n\n    const NoState = { init: () => nu$8({ readState: constant$1('No State required') }) };\n    const nu$8 = spec => spec;\n\n    const generateFrom$1 = (spec, all) => {\n      const schema = map$2(all, a => optionObjOf(a.name(), [\n        required$1('config'),\n        defaulted('state', NoState)\n      ]));\n      const validated = asRaw('component.behaviours', objOf(schema), spec.behaviours).fold(errInfo => {\n        throw new Error(formatError(errInfo) + '\\nComplete spec:\\n' + JSON.stringify(spec, null, 2));\n      }, identity);\n      return {\n        list: all,\n        data: map$1(validated, optBlobThunk => {\n          const output = optBlobThunk.map(blob => ({\n            config: blob.config,\n            state: blob.state.init(blob.config)\n          }));\n          return constant$1(output);\n        })\n      };\n    };\n    const getBehaviours$3 = bData => bData.list;\n    const getData$2 = bData => bData.data;\n\n    const byInnerKey = (data, tuple) => {\n      const r = {};\n      each(data, (detail, key) => {\n        each(detail, (value, indexKey) => {\n          const chain = get$g(r, indexKey).getOr([]);\n          r[indexKey] = chain.concat([tuple(key, value)]);\n        });\n      });\n      return r;\n    };\n\n    const nu$7 = s => ({\n      classes: isUndefined(s.classes) ? [] : s.classes,\n      attributes: isUndefined(s.attributes) ? {} : s.attributes,\n      styles: isUndefined(s.styles) ? {} : s.styles\n    });\n    const merge = (defnA, mod) => ({\n      ...defnA,\n      attributes: {\n        ...defnA.attributes,\n        ...mod.attributes\n      },\n      styles: {\n        ...defnA.styles,\n        ...mod.styles\n      },\n      classes: defnA.classes.concat(mod.classes)\n    });\n\n    const combine$2 = (info, baseMod, behaviours, base) => {\n      const modsByBehaviour = { ...baseMod };\n      each$1(behaviours, behaviour => {\n        modsByBehaviour[behaviour.name()] = behaviour.exhibit(info, base);\n      });\n      const byAspect = byInnerKey(modsByBehaviour, (name, modification) => ({\n        name,\n        modification\n      }));\n      const combineObjects = objects => foldr(objects, (b, a) => ({\n        ...a.modification,\n        ...b\n      }), {});\n      const combinedClasses = foldr(byAspect.classes, (b, a) => a.modification.concat(b), []);\n      const combinedAttributes = combineObjects(byAspect.attributes);\n      const combinedStyles = combineObjects(byAspect.styles);\n      return nu$7({\n        classes: combinedClasses,\n        attributes: combinedAttributes,\n        styles: combinedStyles\n      });\n    };\n\n    const sortKeys = (label, keyName, array, order) => {\n      try {\n        const sorted = sort(array, (a, b) => {\n          const aKey = a[keyName];\n          const bKey = b[keyName];\n          const aIndex = order.indexOf(aKey);\n          const bIndex = order.indexOf(bKey);\n          if (aIndex === -1) {\n            throw new Error('The ordering for ' + label + ' does not have an entry for ' + aKey + '.\\nOrder specified: ' + JSON.stringify(order, null, 2));\n          }\n          if (bIndex === -1) {\n            throw new Error('The ordering for ' + label + ' does not have an entry for ' + bKey + '.\\nOrder specified: ' + JSON.stringify(order, null, 2));\n          }\n          if (aIndex < bIndex) {\n            return -1;\n          } else if (bIndex < aIndex) {\n            return 1;\n          } else {\n            return 0;\n          }\n        });\n        return Result.value(sorted);\n      } catch (err) {\n        return Result.error([err]);\n      }\n    };\n\n    const uncurried = (handler, purpose) => ({\n      handler,\n      purpose\n    });\n    const curried = (handler, purpose) => ({\n      cHandler: handler,\n      purpose\n    });\n    const curryArgs = (descHandler, extraArgs) => curried(curry.apply(undefined, [descHandler.handler].concat(extraArgs)), descHandler.purpose);\n    const getCurried = descHandler => descHandler.cHandler;\n\n    const behaviourTuple = (name, handler) => ({\n      name,\n      handler\n    });\n    const nameToHandlers = (behaviours, info) => {\n      const r = {};\n      each$1(behaviours, behaviour => {\n        r[behaviour.name()] = behaviour.handlers(info);\n      });\n      return r;\n    };\n    const groupByEvents = (info, behaviours, base) => {\n      const behaviourEvents = {\n        ...base,\n        ...nameToHandlers(behaviours, info)\n      };\n      return byInnerKey(behaviourEvents, behaviourTuple);\n    };\n    const combine$1 = (info, eventOrder, behaviours, base) => {\n      const byEventName = groupByEvents(info, behaviours, base);\n      return combineGroups(byEventName, eventOrder);\n    };\n    const assemble = rawHandler => {\n      const handler = read$2(rawHandler);\n      return (component, simulatedEvent, ...rest) => {\n        const args = [\n          component,\n          simulatedEvent\n        ].concat(rest);\n        if (handler.abort.apply(undefined, args)) {\n          simulatedEvent.stop();\n        } else if (handler.can.apply(undefined, args)) {\n          handler.run.apply(undefined, args);\n        }\n      };\n    };\n    const missingOrderError = (eventName, tuples) => Result.error(['The event (' + eventName + ') has more than one behaviour that listens to it.\\nWhen this occurs, you must ' + 'specify an event ordering for the behaviours in your spec (e.g. [ \"listing\", \"toggling\" ]).\\nThe behaviours that ' + 'can trigger it are: ' + JSON.stringify(map$2(tuples, c => c.name), null, 2)]);\n    const fuse = (tuples, eventOrder, eventName) => {\n      const order = eventOrder[eventName];\n      if (!order) {\n        return missingOrderError(eventName, tuples);\n      } else {\n        return sortKeys('Event: ' + eventName, 'name', tuples, order).map(sortedTuples => {\n          const handlers = map$2(sortedTuples, tuple => tuple.handler);\n          return fuse$1(handlers);\n        });\n      }\n    };\n    const combineGroups = (byEventName, eventOrder) => {\n      const r = mapToArray(byEventName, (tuples, eventName) => {\n        const combined = tuples.length === 1 ? Result.value(tuples[0].handler) : fuse(tuples, eventOrder, eventName);\n        return combined.map(handler => {\n          const assembled = assemble(handler);\n          const purpose = tuples.length > 1 ? filter$2(eventOrder[eventName], o => exists(tuples, t => t.name === o)).join(' > ') : tuples[0].name;\n          return wrap$1(eventName, uncurried(assembled, purpose));\n        });\n      });\n      return consolidate(r, {});\n    };\n\n    const baseBehaviour = 'alloy.base.behaviour';\n    const schema$z = objOf([\n      field$1('dom', 'dom', required$2(), objOf([\n        required$1('tag'),\n        defaulted('styles', {}),\n        defaulted('classes', []),\n        defaulted('attributes', {}),\n        option$3('value'),\n        option$3('innerHtml')\n      ])),\n      required$1('components'),\n      required$1('uid'),\n      defaulted('events', {}),\n      defaulted('apis', {}),\n      field$1('eventOrder', 'eventOrder', mergeWith({\n        [execute$5()]: [\n          'disabling',\n          baseBehaviour,\n          'toggling',\n          'typeaheadevents'\n        ],\n        [focus$4()]: [\n          baseBehaviour,\n          'focusing',\n          'keying'\n        ],\n        [systemInit()]: [\n          baseBehaviour,\n          'disabling',\n          'toggling',\n          'representing'\n        ],\n        [input()]: [\n          baseBehaviour,\n          'representing',\n          'streaming',\n          'invalidating'\n        ],\n        [detachedFromDom()]: [\n          baseBehaviour,\n          'representing',\n          'item-events',\n          'toolbar-button-events',\n          'tooltipping'\n        ],\n        [mousedown()]: [\n          'focusing',\n          baseBehaviour,\n          'item-type-events'\n        ],\n        [touchstart()]: [\n          'focusing',\n          baseBehaviour,\n          'item-type-events'\n        ],\n        [mouseover()]: [\n          'item-type-events',\n          'tooltipping'\n        ],\n        [receive()]: [\n          'receiving',\n          'reflecting',\n          'tooltipping'\n        ]\n      }), anyValue()),\n      option$3('domModification')\n    ]);\n    const toInfo = spec => asRaw('custom.definition', schema$z, spec);\n    const toDefinition = detail => ({\n      ...detail.dom,\n      uid: detail.uid,\n      domChildren: map$2(detail.components, comp => comp.element)\n    });\n    const toModification = detail => detail.domModification.fold(() => nu$7({}), nu$7);\n    const toEvents = info => info.events;\n\n    const read = (element, attr) => {\n      const value = get$f(element, attr);\n      return value === undefined || value === '' ? [] : value.split(' ');\n    };\n    const add$4 = (element, attr, id) => {\n      const old = read(element, attr);\n      const nu = old.concat([id]);\n      set$9(element, attr, nu.join(' '));\n      return true;\n    };\n    const remove$4 = (element, attr, id) => {\n      const nu = filter$2(read(element, attr), v => v !== id);\n      if (nu.length > 0) {\n        set$9(element, attr, nu.join(' '));\n      } else {\n        remove$7(element, attr);\n      }\n      return false;\n    };\n\n    const supports = element => element.dom.classList !== undefined;\n    const get$8 = element => read(element, 'class');\n    const add$3 = (element, clazz) => add$4(element, 'class', clazz);\n    const remove$3 = (element, clazz) => remove$4(element, 'class', clazz);\n    const toggle$5 = (element, clazz) => {\n      if (contains$2(get$8(element), clazz)) {\n        return remove$3(element, clazz);\n      } else {\n        return add$3(element, clazz);\n      }\n    };\n\n    const add$2 = (element, clazz) => {\n      if (supports(element)) {\n        element.dom.classList.add(clazz);\n      } else {\n        add$3(element, clazz);\n      }\n    };\n    const cleanClass = element => {\n      const classList = supports(element) ? element.dom.classList : get$8(element);\n      if (classList.length === 0) {\n        remove$7(element, 'class');\n      }\n    };\n    const remove$2 = (element, clazz) => {\n      if (supports(element)) {\n        const classList = element.dom.classList;\n        classList.remove(clazz);\n      } else {\n        remove$3(element, clazz);\n      }\n      cleanClass(element);\n    };\n    const toggle$4 = (element, clazz) => {\n      const result = supports(element) ? element.dom.classList.toggle(clazz) : toggle$5(element, clazz);\n      cleanClass(element);\n      return result;\n    };\n    const has = (element, clazz) => supports(element) && element.dom.classList.contains(clazz);\n\n    const add$1 = (element, classes) => {\n      each$1(classes, x => {\n        add$2(element, x);\n      });\n    };\n    const remove$1 = (element, classes) => {\n      each$1(classes, x => {\n        remove$2(element, x);\n      });\n    };\n    const toggle$3 = (element, classes) => {\n      each$1(classes, x => {\n        toggle$4(element, x);\n      });\n    };\n    const hasAll = (element, classes) => forall(classes, clazz => has(element, clazz));\n    const getNative = element => {\n      const classList = element.dom.classList;\n      const r = new Array(classList.length);\n      for (let i = 0; i < classList.length; i++) {\n        const item = classList.item(i);\n        if (item !== null) {\n          r[i] = item;\n        }\n      }\n      return r;\n    };\n    const get$7 = element => supports(element) ? getNative(element) : get$8(element);\n\n    const get$6 = element => element.dom.value;\n    const set$5 = (element, value) => {\n      if (value === undefined) {\n        throw new Error('Value.set was undefined');\n      }\n      element.dom.value = value;\n    };\n\n    const determineObsoleted = (parent, index, oldObsoleted) => {\n      const newObsoleted = child$2(parent, index);\n      return newObsoleted.map(newObs => {\n        const elemChanged = oldObsoleted.exists(o => !eq(o, newObs));\n        if (elemChanged) {\n          const oldTag = oldObsoleted.map(name$3).getOr('span');\n          const marker = SugarElement.fromTag(oldTag);\n          before$1(newObs, marker);\n          return marker;\n        } else {\n          return newObs;\n        }\n      });\n    };\n    const ensureInDom = (parent, child, obsoleted) => {\n      obsoleted.fold(() => append$2(parent, child), obs => {\n        if (!eq(obs, child)) {\n          before$1(obs, child);\n          remove$5(obs);\n        }\n      });\n    };\n    const patchChildrenWith = (parent, nu, f) => {\n      const builtChildren = map$2(nu, f);\n      const currentChildren = children(parent);\n      each$1(currentChildren.slice(builtChildren.length), remove$5);\n      return builtChildren;\n    };\n    const patchSpecChild = (parent, index, spec, build) => {\n      const oldObsoleted = child$2(parent, index);\n      const childComp = build(spec, oldObsoleted);\n      const obsoleted = determineObsoleted(parent, index, oldObsoleted);\n      ensureInDom(parent, childComp.element, obsoleted);\n      return childComp;\n    };\n    const patchSpecChildren = (parent, specs, build) => patchChildrenWith(parent, specs, (spec, index) => patchSpecChild(parent, index, spec, build));\n    const patchDomChildren = (parent, nodes) => patchChildrenWith(parent, nodes, (node, index) => {\n      const optObsoleted = child$2(parent, index);\n      ensureInDom(parent, node, optObsoleted);\n      return node;\n    });\n\n    const diffKeyValueSet = (newObj, oldObj) => {\n      const newKeys = keys(newObj);\n      const oldKeys = keys(oldObj);\n      const toRemove = difference(oldKeys, newKeys);\n      const toSet = bifilter(newObj, (v, k) => {\n        return !has$2(oldObj, k) || v !== oldObj[k];\n      }).t;\n      return {\n        toRemove,\n        toSet\n      };\n    };\n    const reconcileToDom = (definition, obsoleted) => {\n      const {\n        class: clazz,\n        style,\n        ...existingAttributes\n      } = clone$2(obsoleted);\n      const {\n        toSet: attrsToSet,\n        toRemove: attrsToRemove\n      } = diffKeyValueSet(definition.attributes, existingAttributes);\n      const updateAttrs = () => {\n        each$1(attrsToRemove, a => remove$7(obsoleted, a));\n        setAll$1(obsoleted, attrsToSet);\n      };\n      const existingStyles = getAllRaw(obsoleted);\n      const {\n        toSet: stylesToSet,\n        toRemove: stylesToRemove\n      } = diffKeyValueSet(definition.styles, existingStyles);\n      const updateStyles = () => {\n        each$1(stylesToRemove, s => remove$6(obsoleted, s));\n        setAll(obsoleted, stylesToSet);\n      };\n      const existingClasses = get$7(obsoleted);\n      const classesToRemove = difference(existingClasses, definition.classes);\n      const classesToAdd = difference(definition.classes, existingClasses);\n      const updateClasses = () => {\n        add$1(obsoleted, classesToAdd);\n        remove$1(obsoleted, classesToRemove);\n      };\n      const updateHtml = html => {\n        set$6(obsoleted, html);\n      };\n      const updateChildren = () => {\n        const children = definition.domChildren;\n        patchDomChildren(obsoleted, children);\n      };\n      const updateValue = () => {\n        const valueElement = obsoleted;\n        const value = definition.value.getOrUndefined();\n        if (value !== get$6(valueElement)) {\n          set$5(valueElement, value !== null && value !== void 0 ? value : '');\n        }\n      };\n      updateAttrs();\n      updateClasses();\n      updateStyles();\n      definition.innerHtml.fold(updateChildren, updateHtml);\n      updateValue();\n      return obsoleted;\n    };\n\n    const introduceToDom = definition => {\n      const subject = SugarElement.fromTag(definition.tag);\n      setAll$1(subject, definition.attributes);\n      add$1(subject, definition.classes);\n      setAll(subject, definition.styles);\n      definition.innerHtml.each(html => set$6(subject, html));\n      const children = definition.domChildren;\n      append$1(subject, children);\n      definition.value.each(value => {\n        set$5(subject, value);\n      });\n      return subject;\n    };\n    const attemptPatch = (definition, obsoleted) => {\n      try {\n        const e = reconcileToDom(definition, obsoleted);\n        return Optional.some(e);\n      } catch (err) {\n        return Optional.none();\n      }\n    };\n    const hasMixedChildren = definition => definition.innerHtml.isSome() && definition.domChildren.length > 0;\n    const renderToDom = (definition, optObsoleted) => {\n      const canBePatched = candidate => name$3(candidate) === definition.tag && !hasMixedChildren(definition) && !isPremade(candidate);\n      const elem = optObsoleted.filter(canBePatched).bind(obsoleted => attemptPatch(definition, obsoleted)).getOrThunk(() => introduceToDom(definition));\n      writeOnly(elem, definition.uid);\n      return elem;\n    };\n\n    const getBehaviours$2 = spec => {\n      const behaviours = get$g(spec, 'behaviours').getOr({});\n      return bind$3(keys(behaviours), name => {\n        const behaviour = behaviours[name];\n        return isNonNullable(behaviour) ? [behaviour.me] : [];\n      });\n    };\n    const generateFrom = (spec, all) => generateFrom$1(spec, all);\n    const generate$4 = spec => {\n      const all = getBehaviours$2(spec);\n      return generateFrom(spec, all);\n    };\n\n    const getDomDefinition = (info, bList, bData) => {\n      const definition = toDefinition(info);\n      const infoModification = toModification(info);\n      const baseModification = { 'alloy.base.modification': infoModification };\n      const modification = bList.length > 0 ? combine$2(bData, baseModification, bList, definition) : infoModification;\n      return merge(definition, modification);\n    };\n    const getEvents = (info, bList, bData) => {\n      const baseEvents = { 'alloy.base.behaviour': toEvents(info) };\n      return combine$1(bData, info.eventOrder, bList, baseEvents).getOrDie();\n    };\n    const build$2 = (spec, obsoleted) => {\n      const getMe = () => me;\n      const systemApi = Cell(singleton$1);\n      const info = getOrDie(toInfo(spec));\n      const bBlob = generate$4(spec);\n      const bList = getBehaviours$3(bBlob);\n      const bData = getData$2(bBlob);\n      const modDefinition = getDomDefinition(info, bList, bData);\n      const item = renderToDom(modDefinition, obsoleted);\n      const events = getEvents(info, bList, bData);\n      const subcomponents = Cell(info.components);\n      const connect = newApi => {\n        systemApi.set(newApi);\n      };\n      const disconnect = () => {\n        systemApi.set(NoContextApi(getMe));\n      };\n      const syncComponents = () => {\n        const children$1 = children(item);\n        const subs = bind$3(children$1, child => systemApi.get().getByDom(child).fold(() => [], pure$2));\n        subcomponents.set(subs);\n      };\n      const config = behaviour => {\n        const b = bData;\n        const f = isFunction(b[behaviour.name()]) ? b[behaviour.name()] : () => {\n          throw new Error('Could not find ' + behaviour.name() + ' in ' + JSON.stringify(spec, null, 2));\n        };\n        return f();\n      };\n      const hasConfigured = behaviour => isFunction(bData[behaviour.name()]);\n      const getApis = () => info.apis;\n      const readState = behaviourName => bData[behaviourName]().map(b => b.state.readState()).getOr('not enabled');\n      const me = {\n        uid: spec.uid,\n        getSystem: systemApi.get,\n        config,\n        hasConfigured,\n        spec,\n        readState,\n        getApis,\n        connect,\n        disconnect,\n        element: item,\n        syncComponents,\n        components: subcomponents.get,\n        events\n      };\n      return me;\n    };\n\n    const buildSubcomponents = (spec, obsoleted) => {\n      const components = get$g(spec, 'components').getOr([]);\n      return obsoleted.fold(() => map$2(components, build$1), obs => map$2(components, (c, i) => {\n        return buildOrPatch(c, child$2(obs, i));\n      }));\n    };\n    const buildFromSpec = (userSpec, obsoleted) => {\n      const {\n        events: specEvents,\n        ...spec\n      } = make$8(userSpec);\n      const components = buildSubcomponents(spec, obsoleted);\n      const completeSpec = {\n        ...spec,\n        events: {\n          ...DefaultEvents,\n          ...specEvents\n        },\n        components\n      };\n      return Result.value(build$2(completeSpec, obsoleted));\n    };\n    const text$2 = textContent => {\n      const element = SugarElement.fromText(textContent);\n      return external$1({ element });\n    };\n    const external$1 = spec => {\n      const extSpec = asRawOrDie$1('external.component', objOfOnly([\n        required$1('element'),\n        option$3('uid')\n      ]), spec);\n      const systemApi = Cell(NoContextApi());\n      const connect = newApi => {\n        systemApi.set(newApi);\n      };\n      const disconnect = () => {\n        systemApi.set(NoContextApi(() => me));\n      };\n      const uid = extSpec.uid.getOrThunk(() => generate$5('external'));\n      writeOnly(extSpec.element, uid);\n      const me = {\n        uid,\n        getSystem: systemApi.get,\n        config: Optional.none,\n        hasConfigured: never,\n        connect,\n        disconnect,\n        getApis: () => ({}),\n        element: extSpec.element,\n        spec,\n        readState: constant$1('No state'),\n        syncComponents: noop,\n        components: constant$1([]),\n        events: {}\n      };\n      return premade$1(me);\n    };\n    const uids = generate$5;\n    const isSketchSpec$1 = spec => has$2(spec, 'uid');\n    const buildOrPatch = (spec, obsoleted) => getPremade(spec).getOrThunk(() => {\n      const userSpecWithUid = isSketchSpec$1(spec) ? spec : {\n        uid: uids(''),\n        ...spec\n      };\n      return buildFromSpec(userSpecWithUid, obsoleted).getOrDie();\n    });\n    const build$1 = spec => buildOrPatch(spec, Optional.none());\n    const premade = premade$1;\n\n    var ClosestOrAncestor = (is, ancestor, scope, a, isRoot) => {\n      if (is(scope, a)) {\n        return Optional.some(scope);\n      } else if (isFunction(isRoot) && isRoot(scope)) {\n        return Optional.none();\n      } else {\n        return ancestor(scope, a, isRoot);\n      }\n    };\n\n    const ancestor$1 = (scope, predicate, isRoot) => {\n      let element = scope.dom;\n      const stop = isFunction(isRoot) ? isRoot : never;\n      while (element.parentNode) {\n        element = element.parentNode;\n        const el = SugarElement.fromDom(element);\n        if (predicate(el)) {\n          return Optional.some(el);\n        } else if (stop(el)) {\n          break;\n        }\n      }\n      return Optional.none();\n    };\n    const closest$3 = (scope, predicate, isRoot) => {\n      const is = (s, test) => test(s);\n      return ClosestOrAncestor(is, ancestor$1, scope, predicate, isRoot);\n    };\n    const child$1 = (scope, predicate) => {\n      const pred = node => predicate(SugarElement.fromDom(node));\n      const result = find$5(scope.dom.childNodes, pred);\n      return result.map(SugarElement.fromDom);\n    };\n    const descendant$1 = (scope, predicate) => {\n      const descend = node => {\n        for (let i = 0; i < node.childNodes.length; i++) {\n          const child = SugarElement.fromDom(node.childNodes[i]);\n          if (predicate(child)) {\n            return Optional.some(child);\n          }\n          const res = descend(node.childNodes[i]);\n          if (res.isSome()) {\n            return res;\n          }\n        }\n        return Optional.none();\n      };\n      return descend(scope.dom);\n    };\n\n    const closest$2 = (scope, predicate, isRoot) => closest$3(scope, predicate, isRoot).isSome();\n\n    const first$1 = selector => one(selector);\n    const ancestor = (scope, selector, isRoot) => ancestor$1(scope, e => is(e, selector), isRoot);\n    const child = (scope, selector) => child$1(scope, e => is(e, selector));\n    const descendant = (scope, selector) => one(selector, scope);\n    const closest$1 = (scope, selector, isRoot) => {\n      const is$1 = (element, selector) => is(element, selector);\n      return ClosestOrAncestor(is$1, ancestor, scope, selector, isRoot);\n    };\n\n    const attribute = 'aria-controls';\n    const find$1 = queryElem => {\n      const dependent = closest$3(queryElem, elem => {\n        if (!isElement$1(elem)) {\n          return false;\n        }\n        const id = get$f(elem, 'id');\n        return id !== undefined && id.indexOf(attribute) > -1;\n      });\n      return dependent.bind(dep => {\n        const id = get$f(dep, 'id');\n        const dos = getRootNode(dep);\n        return descendant(dos, `[${ attribute }=\"${ id }\"]`);\n      });\n    };\n    const manager = () => {\n      const ariaId = generate$6(attribute);\n      const link = elem => {\n        set$9(elem, attribute, ariaId);\n      };\n      const unlink = elem => {\n        remove$7(elem, attribute);\n      };\n      return {\n        id: ariaId,\n        link,\n        unlink\n      };\n    };\n\n    const isAriaPartOf = (component, queryElem) => find$1(queryElem).exists(owner => isPartOf$1(component, owner));\n    const isPartOf$1 = (component, queryElem) => closest$2(queryElem, el => eq(el, component.element), never) || isAriaPartOf(component, queryElem);\n\n    const unknown = 'unknown';\n    var EventConfiguration;\n    (function (EventConfiguration) {\n      EventConfiguration[EventConfiguration['STOP'] = 0] = 'STOP';\n      EventConfiguration[EventConfiguration['NORMAL'] = 1] = 'NORMAL';\n      EventConfiguration[EventConfiguration['LOGGING'] = 2] = 'LOGGING';\n    }(EventConfiguration || (EventConfiguration = {})));\n    const eventConfig = Cell({});\n    const makeEventLogger = (eventName, initialTarget) => {\n      const sequence = [];\n      const startTime = new Date().getTime();\n      return {\n        logEventCut: (_name, target, purpose) => {\n          sequence.push({\n            outcome: 'cut',\n            target,\n            purpose\n          });\n        },\n        logEventStopped: (_name, target, purpose) => {\n          sequence.push({\n            outcome: 'stopped',\n            target,\n            purpose\n          });\n        },\n        logNoParent: (_name, target, purpose) => {\n          sequence.push({\n            outcome: 'no-parent',\n            target,\n            purpose\n          });\n        },\n        logEventNoHandlers: (_name, target) => {\n          sequence.push({\n            outcome: 'no-handlers-left',\n            target\n          });\n        },\n        logEventResponse: (_name, target, purpose) => {\n          sequence.push({\n            outcome: 'response',\n            purpose,\n            target\n          });\n        },\n        write: () => {\n          const finishTime = new Date().getTime();\n          if (contains$2([\n              'mousemove',\n              'mouseover',\n              'mouseout',\n              systemInit()\n            ], eventName)) {\n            return;\n          }\n          console.log(eventName, {\n            event: eventName,\n            time: finishTime - startTime,\n            target: initialTarget.dom,\n            sequence: map$2(sequence, s => {\n              if (!contains$2([\n                  'cut',\n                  'stopped',\n                  'response'\n                ], s.outcome)) {\n                return s.outcome;\n              } else {\n                return '{' + s.purpose + '} ' + s.outcome + ' at (' + element(s.target) + ')';\n              }\n            })\n          });\n        }\n      };\n    };\n    const processEvent = (eventName, initialTarget, f) => {\n      const status = get$g(eventConfig.get(), eventName).orThunk(() => {\n        const patterns = keys(eventConfig.get());\n        return findMap(patterns, p => eventName.indexOf(p) > -1 ? Optional.some(eventConfig.get()[p]) : Optional.none());\n      }).getOr(EventConfiguration.NORMAL);\n      switch (status) {\n      case EventConfiguration.NORMAL:\n        return f(noLogger());\n      case EventConfiguration.LOGGING: {\n          const logger = makeEventLogger(eventName, initialTarget);\n          const output = f(logger);\n          logger.write();\n          return output;\n        }\n      case EventConfiguration.STOP:\n        return true;\n      }\n    };\n    const path = [\n      'alloy/data/Fields',\n      'alloy/debugging/Debugging'\n    ];\n    const getTrace = () => {\n      const err = new Error();\n      if (err.stack !== undefined) {\n        const lines = err.stack.split('\\n');\n        return find$5(lines, line => line.indexOf('alloy') > 0 && !exists(path, p => line.indexOf(p) > -1)).getOr(unknown);\n      } else {\n        return unknown;\n      }\n    };\n    const ignoreEvent = {\n      logEventCut: noop,\n      logEventStopped: noop,\n      logNoParent: noop,\n      logEventNoHandlers: noop,\n      logEventResponse: noop,\n      write: noop\n    };\n    const monitorEvent = (eventName, initialTarget, f) => processEvent(eventName, initialTarget, f);\n    const noLogger = constant$1(ignoreEvent);\n\n    const menuFields = constant$1([\n      required$1('menu'),\n      required$1('selectedMenu')\n    ]);\n    const itemFields = constant$1([\n      required$1('item'),\n      required$1('selectedItem')\n    ]);\n    constant$1(objOf(itemFields().concat(menuFields())));\n    const itemSchema$3 = constant$1(objOf(itemFields()));\n\n    const _initSize = requiredObjOf('initSize', [\n      required$1('numColumns'),\n      required$1('numRows')\n    ]);\n    const itemMarkers = () => requiredOf('markers', itemSchema$3());\n    const tieredMenuMarkers = () => requiredObjOf('markers', [required$1('backgroundMenu')].concat(menuFields()).concat(itemFields()));\n    const markers$1 = required => requiredObjOf('markers', map$2(required, required$1));\n    const onPresenceHandler = (label, fieldName, presence) => {\n      getTrace();\n      return field$1(fieldName, fieldName, presence, valueOf(f => Result.value((...args) => {\n        return f.apply(undefined, args);\n      })));\n    };\n    const onHandler = fieldName => onPresenceHandler('onHandler', fieldName, defaulted$1(noop));\n    const onKeyboardHandler = fieldName => onPresenceHandler('onKeyboardHandler', fieldName, defaulted$1(Optional.none));\n    const onStrictHandler = fieldName => onPresenceHandler('onHandler', fieldName, required$2());\n    const onStrictKeyboardHandler = fieldName => onPresenceHandler('onKeyboardHandler', fieldName, required$2());\n    const output$1 = (name, value) => customField(name, constant$1(value));\n    const snapshot = name => customField(name, identity);\n    const initSize = constant$1(_initSize);\n\n    const nu$6 = (x, y, bubble, direction, placement, boundsRestriction, labelPrefix, alwaysFit = false) => ({\n      x,\n      y,\n      bubble,\n      direction,\n      placement,\n      restriction: boundsRestriction,\n      label: `${ labelPrefix }-${ placement }`,\n      alwaysFit\n    });\n\n    const adt$a = Adt.generate([\n      { southeast: [] },\n      { southwest: [] },\n      { northeast: [] },\n      { northwest: [] },\n      { south: [] },\n      { north: [] },\n      { east: [] },\n      { west: [] }\n    ]);\n    const cata$2 = (subject, southeast, southwest, northeast, northwest, south, north, east, west) => subject.fold(southeast, southwest, northeast, northwest, south, north, east, west);\n    const cataVertical = (subject, south, middle, north) => subject.fold(south, south, north, north, south, north, middle, middle);\n    const cataHorizontal = (subject, east, middle, west) => subject.fold(east, west, east, west, middle, middle, east, west);\n    const southeast$3 = adt$a.southeast;\n    const southwest$3 = adt$a.southwest;\n    const northeast$3 = adt$a.northeast;\n    const northwest$3 = adt$a.northwest;\n    const south$3 = adt$a.south;\n    const north$3 = adt$a.north;\n    const east$3 = adt$a.east;\n    const west$3 = adt$a.west;\n\n    const cycleBy = (value, delta, min, max) => {\n      const r = value + delta;\n      if (r > max) {\n        return min;\n      } else if (r < min) {\n        return max;\n      } else {\n        return r;\n      }\n    };\n    const clamp = (value, min, max) => Math.min(Math.max(value, min), max);\n\n    const getRestriction = (anchor, restriction) => {\n      switch (restriction) {\n      case 1:\n        return anchor.x;\n      case 0:\n        return anchor.x + anchor.width;\n      case 2:\n        return anchor.y;\n      case 3:\n        return anchor.y + anchor.height;\n      }\n    };\n    const boundsRestriction = (anchor, restrictions) => mapToObject([\n      'left',\n      'right',\n      'top',\n      'bottom'\n    ], dir => get$g(restrictions, dir).map(restriction => getRestriction(anchor, restriction)));\n    const adjustBounds = (bounds$1, restriction, bubbleOffset) => {\n      const applyRestriction = (dir, current) => restriction[dir].map(pos => {\n        const isVerticalAxis = dir === 'top' || dir === 'bottom';\n        const offset = isVerticalAxis ? bubbleOffset.top : bubbleOffset.left;\n        const comparator = dir === 'left' || dir === 'top' ? Math.max : Math.min;\n        const newPos = comparator(pos, current) + offset;\n        return isVerticalAxis ? clamp(newPos, bounds$1.y, bounds$1.bottom) : clamp(newPos, bounds$1.x, bounds$1.right);\n      }).getOr(current);\n      const adjustedLeft = applyRestriction('left', bounds$1.x);\n      const adjustedTop = applyRestriction('top', bounds$1.y);\n      const adjustedRight = applyRestriction('right', bounds$1.right);\n      const adjustedBottom = applyRestriction('bottom', bounds$1.bottom);\n      return bounds(adjustedLeft, adjustedTop, adjustedRight - adjustedLeft, adjustedBottom - adjustedTop);\n    };\n\n    const labelPrefix$2 = 'layout';\n    const eastX$1 = anchor => anchor.x;\n    const middleX$1 = (anchor, element) => anchor.x + anchor.width / 2 - element.width / 2;\n    const westX$1 = (anchor, element) => anchor.x + anchor.width - element.width;\n    const northY$2 = (anchor, element) => anchor.y - element.height;\n    const southY$2 = anchor => anchor.y + anchor.height;\n    const centreY$1 = (anchor, element) => anchor.y + anchor.height / 2 - element.height / 2;\n    const eastEdgeX$1 = anchor => anchor.x + anchor.width;\n    const westEdgeX$1 = (anchor, element) => anchor.x - element.width;\n    const southeast$2 = (anchor, element, bubbles) => nu$6(eastX$1(anchor), southY$2(anchor), bubbles.southeast(), southeast$3(), 'southeast', boundsRestriction(anchor, {\n      left: 1,\n      top: 3\n    }), labelPrefix$2);\n    const southwest$2 = (anchor, element, bubbles) => nu$6(westX$1(anchor, element), southY$2(anchor), bubbles.southwest(), southwest$3(), 'southwest', boundsRestriction(anchor, {\n      right: 0,\n      top: 3\n    }), labelPrefix$2);\n    const northeast$2 = (anchor, element, bubbles) => nu$6(eastX$1(anchor), northY$2(anchor, element), bubbles.northeast(), northeast$3(), 'northeast', boundsRestriction(anchor, {\n      left: 1,\n      bottom: 2\n    }), labelPrefix$2);\n    const northwest$2 = (anchor, element, bubbles) => nu$6(westX$1(anchor, element), northY$2(anchor, element), bubbles.northwest(), northwest$3(), 'northwest', boundsRestriction(anchor, {\n      right: 0,\n      bottom: 2\n    }), labelPrefix$2);\n    const north$2 = (anchor, element, bubbles) => nu$6(middleX$1(anchor, element), northY$2(anchor, element), bubbles.north(), north$3(), 'north', boundsRestriction(anchor, { bottom: 2 }), labelPrefix$2);\n    const south$2 = (anchor, element, bubbles) => nu$6(middleX$1(anchor, element), southY$2(anchor), bubbles.south(), south$3(), 'south', boundsRestriction(anchor, { top: 3 }), labelPrefix$2);\n    const east$2 = (anchor, element, bubbles) => nu$6(eastEdgeX$1(anchor), centreY$1(anchor, element), bubbles.east(), east$3(), 'east', boundsRestriction(anchor, { left: 0 }), labelPrefix$2);\n    const west$2 = (anchor, element, bubbles) => nu$6(westEdgeX$1(anchor, element), centreY$1(anchor, element), bubbles.west(), west$3(), 'west', boundsRestriction(anchor, { right: 1 }), labelPrefix$2);\n    const all$1 = () => [\n      southeast$2,\n      southwest$2,\n      northeast$2,\n      northwest$2,\n      south$2,\n      north$2,\n      east$2,\n      west$2\n    ];\n    const allRtl$1 = () => [\n      southwest$2,\n      southeast$2,\n      northwest$2,\n      northeast$2,\n      south$2,\n      north$2,\n      east$2,\n      west$2\n    ];\n    const aboveOrBelow = () => [\n      northeast$2,\n      northwest$2,\n      southeast$2,\n      southwest$2,\n      north$2,\n      south$2\n    ];\n    const aboveOrBelowRtl = () => [\n      northwest$2,\n      northeast$2,\n      southwest$2,\n      southeast$2,\n      north$2,\n      south$2\n    ];\n    const belowOrAbove = () => [\n      southeast$2,\n      southwest$2,\n      northeast$2,\n      northwest$2,\n      south$2,\n      north$2\n    ];\n    const belowOrAboveRtl = () => [\n      southwest$2,\n      southeast$2,\n      northwest$2,\n      northeast$2,\n      south$2,\n      north$2\n    ];\n\n    const chooseChannels = (channels, message) => message.universal ? channels : filter$2(channels, ch => contains$2(message.channels, ch));\n    const events$h = receiveConfig => derive$2([run$1(receive(), (component, message) => {\n        const channelMap = receiveConfig.channels;\n        const channels = keys(channelMap);\n        const receivingData = message;\n        const targetChannels = chooseChannels(channels, receivingData);\n        each$1(targetChannels, ch => {\n          const channelInfo = channelMap[ch];\n          const channelSchema = channelInfo.schema;\n          const data = asRawOrDie$1('channel[' + ch + '] data\\nReceiver: ' + element(component.element), channelSchema, receivingData.data);\n          channelInfo.onReceive(component, data);\n        });\n      })]);\n\n    var ActiveReceiving = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$h\n    });\n\n    var ReceivingSchema = [requiredOf('channels', setOf(Result.value, objOfOnly([\n        onStrictHandler('onReceive'),\n        defaulted('schema', anyValue())\n      ])))];\n\n    const executeEvent = (bConfig, bState, executor) => runOnExecute$1(component => {\n      executor(component, bConfig, bState);\n    });\n    const loadEvent = (bConfig, bState, f) => runOnInit((component, _simulatedEvent) => {\n      f(component, bConfig, bState);\n    });\n    const create$5 = (schema, name, active, apis, extra, state) => {\n      const configSchema = objOfOnly(schema);\n      const schemaSchema = optionObjOf(name, [optionObjOfOnly('config', schema)]);\n      return doCreate(configSchema, schemaSchema, name, active, apis, extra, state);\n    };\n    const createModes$1 = (modes, name, active, apis, extra, state) => {\n      const configSchema = modes;\n      const schemaSchema = optionObjOf(name, [optionOf('config', modes)]);\n      return doCreate(configSchema, schemaSchema, name, active, apis, extra, state);\n    };\n    const wrapApi = (bName, apiFunction, apiName) => {\n      const f = (component, ...rest) => {\n        const args = [component].concat(rest);\n        return component.config({ name: constant$1(bName) }).fold(() => {\n          throw new Error('We could not find any behaviour configuration for: ' + bName + '. Using API: ' + apiName);\n        }, info => {\n          const rest = Array.prototype.slice.call(args, 1);\n          return apiFunction.apply(undefined, [\n            component,\n            info.config,\n            info.state\n          ].concat(rest));\n        });\n      };\n      return markAsBehaviourApi(f, apiName, apiFunction);\n    };\n    const revokeBehaviour = name => ({\n      key: name,\n      value: undefined\n    });\n    const doCreate = (configSchema, schemaSchema, name, active, apis, extra, state) => {\n      const getConfig = info => hasNonNullableKey(info, name) ? info[name]() : Optional.none();\n      const wrappedApis = map$1(apis, (apiF, apiName) => wrapApi(name, apiF, apiName));\n      const wrappedExtra = map$1(extra, (extraF, extraName) => markAsExtraApi(extraF, extraName));\n      const me = {\n        ...wrappedExtra,\n        ...wrappedApis,\n        revoke: curry(revokeBehaviour, name),\n        config: spec => {\n          const prepared = asRawOrDie$1(name + '-config', configSchema, spec);\n          return {\n            key: name,\n            value: {\n              config: prepared,\n              me,\n              configAsRaw: cached(() => asRawOrDie$1(name + '-config', configSchema, spec)),\n              initialConfig: spec,\n              state\n            }\n          };\n        },\n        schema: constant$1(schemaSchema),\n        exhibit: (info, base) => {\n          return lift2(getConfig(info), get$g(active, 'exhibit'), (behaviourInfo, exhibitor) => {\n            return exhibitor(base, behaviourInfo.config, behaviourInfo.state);\n          }).getOrThunk(() => nu$7({}));\n        },\n        name: constant$1(name),\n        handlers: info => {\n          return getConfig(info).map(behaviourInfo => {\n            const getEvents = get$g(active, 'events').getOr(() => ({}));\n            return getEvents(behaviourInfo.config, behaviourInfo.state);\n          }).getOr({});\n        }\n      };\n      return me;\n    };\n\n    const derive$1 = capabilities => wrapAll(capabilities);\n    const simpleSchema = objOfOnly([\n      required$1('fields'),\n      required$1('name'),\n      defaulted('active', {}),\n      defaulted('apis', {}),\n      defaulted('state', NoState),\n      defaulted('extra', {})\n    ]);\n    const create$4 = data => {\n      const value = asRawOrDie$1('Creating behaviour: ' + data.name, simpleSchema, data);\n      return create$5(value.fields, value.name, value.active, value.apis, value.extra, value.state);\n    };\n    const modeSchema = objOfOnly([\n      required$1('branchKey'),\n      required$1('branches'),\n      required$1('name'),\n      defaulted('active', {}),\n      defaulted('apis', {}),\n      defaulted('state', NoState),\n      defaulted('extra', {})\n    ]);\n    const createModes = data => {\n      const value = asRawOrDie$1('Creating behaviour: ' + data.name, modeSchema, data);\n      return createModes$1(choose$1(value.branchKey, value.branches), value.name, value.active, value.apis, value.extra, value.state);\n    };\n    const revoke = constant$1(undefined);\n\n    const Receiving = create$4({\n      fields: ReceivingSchema,\n      name: 'receiving',\n      active: ActiveReceiving\n    });\n\n    const exhibit$6 = (base, posConfig) => nu$7({\n      classes: [],\n      styles: posConfig.useFixed() ? {} : { position: 'relative' }\n    });\n\n    var ActivePosition = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        exhibit: exhibit$6\n    });\n\n    const focus$3 = (element, preventScroll = false) => element.dom.focus({ preventScroll });\n    const blur$1 = element => element.dom.blur();\n    const hasFocus = element => {\n      const root = getRootNode(element).dom;\n      return element.dom === root.activeElement;\n    };\n    const active$1 = (root = getDocument()) => Optional.from(root.dom.activeElement).map(SugarElement.fromDom);\n    const search = element => active$1(getRootNode(element)).filter(e => element.dom.contains(e.dom));\n\n    const preserve$1 = (f, container) => {\n      const dos = getRootNode(container);\n      const refocus = active$1(dos).bind(focused => {\n        const hasFocus = elem => eq(focused, elem);\n        return hasFocus(container) ? Optional.some(container) : descendant$1(container, hasFocus);\n      });\n      const result = f(container);\n      refocus.each(oldFocus => {\n        active$1(dos).filter(newFocus => eq(newFocus, oldFocus)).fold(() => {\n          focus$3(oldFocus);\n        }, noop);\n      });\n      return result;\n    };\n\n    const NuPositionCss = (position, left, top, right, bottom) => {\n      const toPx = num => num + 'px';\n      return {\n        position,\n        left: left.map(toPx),\n        top: top.map(toPx),\n        right: right.map(toPx),\n        bottom: bottom.map(toPx)\n      };\n    };\n    const toOptions = position => ({\n      ...position,\n      position: Optional.some(position.position)\n    });\n    const applyPositionCss = (element, position) => {\n      setOptions(element, toOptions(position));\n    };\n\n    const adt$9 = Adt.generate([\n      { none: [] },\n      {\n        relative: [\n          'x',\n          'y',\n          'width',\n          'height'\n        ]\n      },\n      {\n        fixed: [\n          'x',\n          'y',\n          'width',\n          'height'\n        ]\n      }\n    ]);\n    const positionWithDirection = (posName, decision, x, y, width, height) => {\n      const decisionRect = decision.rect;\n      const decisionX = decisionRect.x - x;\n      const decisionY = decisionRect.y - y;\n      const decisionWidth = decisionRect.width;\n      const decisionHeight = decisionRect.height;\n      const decisionRight = width - (decisionX + decisionWidth);\n      const decisionBottom = height - (decisionY + decisionHeight);\n      const left = Optional.some(decisionX);\n      const top = Optional.some(decisionY);\n      const right = Optional.some(decisionRight);\n      const bottom = Optional.some(decisionBottom);\n      const none = Optional.none();\n      return cata$2(decision.direction, () => NuPositionCss(posName, left, top, none, none), () => NuPositionCss(posName, none, top, right, none), () => NuPositionCss(posName, left, none, none, bottom), () => NuPositionCss(posName, none, none, right, bottom), () => NuPositionCss(posName, left, top, none, none), () => NuPositionCss(posName, left, none, none, bottom), () => NuPositionCss(posName, left, top, none, none), () => NuPositionCss(posName, none, top, right, none));\n    };\n    const reposition = (origin, decision) => origin.fold(() => {\n      const decisionRect = decision.rect;\n      return NuPositionCss('absolute', Optional.some(decisionRect.x), Optional.some(decisionRect.y), Optional.none(), Optional.none());\n    }, (x, y, width, height) => {\n      return positionWithDirection('absolute', decision, x, y, width, height);\n    }, (x, y, width, height) => {\n      return positionWithDirection('fixed', decision, x, y, width, height);\n    });\n    const toBox = (origin, element) => {\n      const rel = curry(find$2, element);\n      const position = origin.fold(rel, rel, () => {\n        const scroll = get$b();\n        return find$2(element).translate(-scroll.left, -scroll.top);\n      });\n      const width = getOuter$1(element);\n      const height = getOuter$2(element);\n      return bounds(position.left, position.top, width, height);\n    };\n    const viewport = (origin, optBounds) => optBounds.fold(() => origin.fold(win, win, bounds), bounds$1 => origin.fold(constant$1(bounds$1), constant$1(bounds$1), () => {\n      const pos = translate$2(origin, bounds$1.x, bounds$1.y);\n      return bounds(pos.left, pos.top, bounds$1.width, bounds$1.height);\n    }));\n    const translate$2 = (origin, x, y) => {\n      const pos = SugarPosition(x, y);\n      const removeScroll = () => {\n        const outerScroll = get$b();\n        return pos.translate(-outerScroll.left, -outerScroll.top);\n      };\n      return origin.fold(constant$1(pos), constant$1(pos), removeScroll);\n    };\n    const cata$1 = (subject, onNone, onRelative, onFixed) => subject.fold(onNone, onRelative, onFixed);\n    adt$9.none;\n    const relative$1 = adt$9.relative;\n    const fixed$1 = adt$9.fixed;\n\n    const anchor = (anchorBox, origin) => ({\n      anchorBox,\n      origin\n    });\n    const box = (anchorBox, origin) => anchor(anchorBox, origin);\n\n    const placementAttribute = 'data-alloy-placement';\n    const setPlacement$1 = (element, placement) => {\n      set$9(element, placementAttribute, placement);\n    };\n    const getPlacement = element => getOpt(element, placementAttribute);\n    const reset$2 = element => remove$7(element, placementAttribute);\n\n    const adt$8 = Adt.generate([\n      { fit: ['reposition'] },\n      {\n        nofit: [\n          'reposition',\n          'visibleW',\n          'visibleH',\n          'isVisible'\n        ]\n      }\n    ]);\n    const determinePosition = (box, bounds) => {\n      const {\n        x: boundsX,\n        y: boundsY,\n        right: boundsRight,\n        bottom: boundsBottom\n      } = bounds;\n      const {x, y, right, bottom, width, height} = box;\n      const xInBounds = x >= boundsX && x <= boundsRight;\n      const yInBounds = y >= boundsY && y <= boundsBottom;\n      const originInBounds = xInBounds && yInBounds;\n      const rightInBounds = right <= boundsRight && right >= boundsX;\n      const bottomInBounds = bottom <= boundsBottom && bottom >= boundsY;\n      const sizeInBounds = rightInBounds && bottomInBounds;\n      const visibleW = Math.min(width, x >= boundsX ? boundsRight - x : right - boundsX);\n      const visibleH = Math.min(height, y >= boundsY ? boundsBottom - y : bottom - boundsY);\n      return {\n        originInBounds,\n        sizeInBounds,\n        visibleW,\n        visibleH\n      };\n    };\n    const calcReposition = (box, bounds$1) => {\n      const {\n        x: boundsX,\n        y: boundsY,\n        right: boundsRight,\n        bottom: boundsBottom\n      } = bounds$1;\n      const {x, y, width, height} = box;\n      const maxX = Math.max(boundsX, boundsRight - width);\n      const maxY = Math.max(boundsY, boundsBottom - height);\n      const restrictedX = clamp(x, boundsX, maxX);\n      const restrictedY = clamp(y, boundsY, maxY);\n      const restrictedWidth = Math.min(restrictedX + width, boundsRight) - restrictedX;\n      const restrictedHeight = Math.min(restrictedY + height, boundsBottom) - restrictedY;\n      return bounds(restrictedX, restrictedY, restrictedWidth, restrictedHeight);\n    };\n    const calcMaxSizes = (direction, box, bounds) => {\n      const upAvailable = constant$1(box.bottom - bounds.y);\n      const downAvailable = constant$1(bounds.bottom - box.y);\n      const maxHeight = cataVertical(direction, downAvailable, downAvailable, upAvailable);\n      const westAvailable = constant$1(box.right - bounds.x);\n      const eastAvailable = constant$1(bounds.right - box.x);\n      const maxWidth = cataHorizontal(direction, eastAvailable, eastAvailable, westAvailable);\n      return {\n        maxWidth,\n        maxHeight\n      };\n    };\n    const attempt = (candidate, width, height, bounds$1) => {\n      const bubble = candidate.bubble;\n      const bubbleOffset = bubble.offset;\n      const adjustedBounds = adjustBounds(bounds$1, candidate.restriction, bubbleOffset);\n      const newX = candidate.x + bubbleOffset.left;\n      const newY = candidate.y + bubbleOffset.top;\n      const box = bounds(newX, newY, width, height);\n      const {originInBounds, sizeInBounds, visibleW, visibleH} = determinePosition(box, adjustedBounds);\n      const fits = originInBounds && sizeInBounds;\n      const fittedBox = fits ? box : calcReposition(box, adjustedBounds);\n      const isPartlyVisible = fittedBox.width > 0 && fittedBox.height > 0;\n      const {maxWidth, maxHeight} = calcMaxSizes(candidate.direction, fittedBox, bounds$1);\n      const reposition = {\n        rect: fittedBox,\n        maxHeight,\n        maxWidth,\n        direction: candidate.direction,\n        placement: candidate.placement,\n        classes: {\n          on: bubble.classesOn,\n          off: bubble.classesOff\n        },\n        layout: candidate.label,\n        testY: newY\n      };\n      return fits || candidate.alwaysFit ? adt$8.fit(reposition) : adt$8.nofit(reposition, visibleW, visibleH, isPartlyVisible);\n    };\n    const attempts = (element, candidates, anchorBox, elementBox, bubbles, bounds) => {\n      const panelWidth = elementBox.width;\n      const panelHeight = elementBox.height;\n      const attemptBestFit = (layout, reposition, visibleW, visibleH, isVisible) => {\n        const next = layout(anchorBox, elementBox, bubbles, element, bounds);\n        const attemptLayout = attempt(next, panelWidth, panelHeight, bounds);\n        return attemptLayout.fold(constant$1(attemptLayout), (newReposition, newVisibleW, newVisibleH, newIsVisible) => {\n          const improved = isVisible === newIsVisible ? newVisibleH > visibleH || newVisibleW > visibleW : !isVisible && newIsVisible;\n          return improved ? attemptLayout : adt$8.nofit(reposition, visibleW, visibleH, isVisible);\n        });\n      };\n      const abc = foldl(candidates, (b, a) => {\n        const bestNext = curry(attemptBestFit, a);\n        return b.fold(constant$1(b), bestNext);\n      }, adt$8.nofit({\n        rect: anchorBox,\n        maxHeight: elementBox.height,\n        maxWidth: elementBox.width,\n        direction: southeast$3(),\n        placement: 'southeast',\n        classes: {\n          on: [],\n          off: []\n        },\n        layout: 'none',\n        testY: anchorBox.y\n      }, -1, -1, false));\n      return abc.fold(identity, identity);\n    };\n\n    const singleton = doRevoke => {\n      const subject = Cell(Optional.none());\n      const revoke = () => subject.get().each(doRevoke);\n      const clear = () => {\n        revoke();\n        subject.set(Optional.none());\n      };\n      const isSet = () => subject.get().isSome();\n      const get = () => subject.get();\n      const set = s => {\n        revoke();\n        subject.set(Optional.some(s));\n      };\n      return {\n        clear,\n        isSet,\n        get,\n        set\n      };\n    };\n    const destroyable = () => singleton(s => s.destroy());\n    const unbindable = () => singleton(s => s.unbind());\n    const value$2 = () => {\n      const subject = singleton(noop);\n      const on = f => subject.get().each(f);\n      return {\n        ...subject,\n        on\n      };\n    };\n\n    const filter = always;\n    const bind = (element, event, handler) => bind$2(element, event, filter, handler);\n    const capture = (element, event, handler) => capture$1(element, event, filter, handler);\n    const fromRawEvent = fromRawEvent$1;\n\n    const properties = [\n      'top',\n      'bottom',\n      'right',\n      'left'\n    ];\n    const timerAttr = 'data-alloy-transition-timer';\n    const isTransitioning$1 = (element, transition) => hasAll(element, transition.classes);\n    const shouldApplyTransitionCss = (transition, decision, lastPlacement) => {\n      return lastPlacement.exists(placer => {\n        const mode = transition.mode;\n        return mode === 'all' ? true : placer[mode] !== decision[mode];\n      });\n    };\n    const hasChanges = (position, intermediate) => {\n      const round = value => parseFloat(value).toFixed(3);\n      return find$4(intermediate, (value, key) => {\n        const newValue = position[key].map(round);\n        const val = value.map(round);\n        return !equals(newValue, val);\n      }).isSome();\n    };\n    const getTransitionDuration = element => {\n      const get = name => {\n        const style = get$e(element, name);\n        const times = style.split(/\\s*,\\s*/);\n        return filter$2(times, isNotEmpty);\n      };\n      const parse = value => {\n        if (isString(value) && /^[\\d.]+/.test(value)) {\n          const num = parseFloat(value);\n          return endsWith(value, 'ms') ? num : num * 1000;\n        } else {\n          return 0;\n        }\n      };\n      const delay = get('transition-delay');\n      const duration = get('transition-duration');\n      return foldl(duration, (acc, dur, i) => {\n        const time = parse(delay[i]) + parse(dur);\n        return Math.max(acc, time);\n      }, 0);\n    };\n    const setupTransitionListeners = (element, transition) => {\n      const transitionEnd = unbindable();\n      const transitionCancel = unbindable();\n      let timer;\n      const isSourceTransition = e => {\n        var _a;\n        const pseudoElement = (_a = e.raw.pseudoElement) !== null && _a !== void 0 ? _a : '';\n        return eq(e.target, element) && isEmpty(pseudoElement) && contains$2(properties, e.raw.propertyName);\n      };\n      const transitionDone = e => {\n        if (isNullable(e) || isSourceTransition(e)) {\n          transitionEnd.clear();\n          transitionCancel.clear();\n          const type = e === null || e === void 0 ? void 0 : e.raw.type;\n          if (isNullable(type) || type === transitionend()) {\n            clearTimeout(timer);\n            remove$7(element, timerAttr);\n            remove$1(element, transition.classes);\n          }\n        }\n      };\n      const transitionStart = bind(element, transitionstart(), e => {\n        if (isSourceTransition(e)) {\n          transitionStart.unbind();\n          transitionEnd.set(bind(element, transitionend(), transitionDone));\n          transitionCancel.set(bind(element, transitioncancel(), transitionDone));\n        }\n      });\n      const duration = getTransitionDuration(element);\n      requestAnimationFrame(() => {\n        timer = setTimeout(transitionDone, duration + 17);\n        set$9(element, timerAttr, timer);\n      });\n    };\n    const startTransitioning = (element, transition) => {\n      add$1(element, transition.classes);\n      getOpt(element, timerAttr).each(timerId => {\n        clearTimeout(parseInt(timerId, 10));\n        remove$7(element, timerAttr);\n      });\n      setupTransitionListeners(element, transition);\n    };\n    const applyTransitionCss = (element, origin, position, transition, decision, lastPlacement) => {\n      const shouldTransition = shouldApplyTransitionCss(transition, decision, lastPlacement);\n      if (shouldTransition || isTransitioning$1(element, transition)) {\n        set$8(element, 'position', position.position);\n        const rect = toBox(origin, element);\n        const intermediatePosition = reposition(origin, {\n          ...decision,\n          rect\n        });\n        const intermediateCssOptions = mapToObject(properties, prop => intermediatePosition[prop]);\n        if (hasChanges(position, intermediateCssOptions)) {\n          setOptions(element, intermediateCssOptions);\n          if (shouldTransition) {\n            startTransitioning(element, transition);\n          }\n          reflow(element);\n        }\n      } else {\n        remove$1(element, transition.classes);\n      }\n    };\n\n    const elementSize = p => ({\n      width: getOuter$1(p),\n      height: getOuter$2(p)\n    });\n    const layout = (anchorBox, element, bubbles, options) => {\n      remove$6(element, 'max-height');\n      remove$6(element, 'max-width');\n      const elementBox = elementSize(element);\n      return attempts(element, options.preference, anchorBox, elementBox, bubbles, options.bounds);\n    };\n    const setClasses = (element, decision) => {\n      const classInfo = decision.classes;\n      remove$1(element, classInfo.off);\n      add$1(element, classInfo.on);\n    };\n    const setHeight = (element, decision, options) => {\n      const maxHeightFunction = options.maxHeightFunction;\n      maxHeightFunction(element, decision.maxHeight);\n    };\n    const setWidth = (element, decision, options) => {\n      const maxWidthFunction = options.maxWidthFunction;\n      maxWidthFunction(element, decision.maxWidth);\n    };\n    const position$2 = (element, decision, options) => {\n      const positionCss = reposition(options.origin, decision);\n      options.transition.each(transition => {\n        applyTransitionCss(element, options.origin, positionCss, transition, decision, options.lastPlacement);\n      });\n      applyPositionCss(element, positionCss);\n    };\n    const setPlacement = (element, decision) => {\n      setPlacement$1(element, decision.placement);\n    };\n\n    const setMaxHeight = (element, maxHeight) => {\n      setMax$1(element, Math.floor(maxHeight));\n    };\n    const anchored = constant$1((element, available) => {\n      setMaxHeight(element, available);\n      setAll(element, {\n        'overflow-x': 'hidden',\n        'overflow-y': 'auto'\n      });\n    });\n    const expandable$1 = constant$1((element, available) => {\n      setMaxHeight(element, available);\n    });\n\n    const defaultOr = (options, key, dephault) => options[key] === undefined ? dephault : options[key];\n    const simple = (anchor, element, bubble, layouts, lastPlacement, optBounds, overrideOptions, transition) => {\n      const maxHeightFunction = defaultOr(overrideOptions, 'maxHeightFunction', anchored());\n      const maxWidthFunction = defaultOr(overrideOptions, 'maxWidthFunction', noop);\n      const anchorBox = anchor.anchorBox;\n      const origin = anchor.origin;\n      const options = {\n        bounds: viewport(origin, optBounds),\n        origin,\n        preference: layouts,\n        maxHeightFunction,\n        maxWidthFunction,\n        lastPlacement,\n        transition\n      };\n      return go(anchorBox, element, bubble, options);\n    };\n    const go = (anchorBox, element, bubble, options) => {\n      const decision = layout(anchorBox, element, bubble, options);\n      position$2(element, decision, options);\n      setPlacement(element, decision);\n      setClasses(element, decision);\n      setHeight(element, decision, options);\n      setWidth(element, decision, options);\n      return {\n        layout: decision.layout,\n        placement: decision.placement\n      };\n    };\n\n    const allAlignments = [\n      'valignCentre',\n      'alignLeft',\n      'alignRight',\n      'alignCentre',\n      'top',\n      'bottom',\n      'left',\n      'right',\n      'inset'\n    ];\n    const nu$5 = (xOffset, yOffset, classes, insetModifier = 1) => {\n      const insetXOffset = xOffset * insetModifier;\n      const insetYOffset = yOffset * insetModifier;\n      const getClasses = prop => get$g(classes, prop).getOr([]);\n      const make = (xDelta, yDelta, alignmentsOn) => {\n        const alignmentsOff = difference(allAlignments, alignmentsOn);\n        return {\n          offset: SugarPosition(xDelta, yDelta),\n          classesOn: bind$3(alignmentsOn, getClasses),\n          classesOff: bind$3(alignmentsOff, getClasses)\n        };\n      };\n      return {\n        southeast: () => make(-xOffset, yOffset, [\n          'top',\n          'alignLeft'\n        ]),\n        southwest: () => make(xOffset, yOffset, [\n          'top',\n          'alignRight'\n        ]),\n        south: () => make(-xOffset / 2, yOffset, [\n          'top',\n          'alignCentre'\n        ]),\n        northeast: () => make(-xOffset, -yOffset, [\n          'bottom',\n          'alignLeft'\n        ]),\n        northwest: () => make(xOffset, -yOffset, [\n          'bottom',\n          'alignRight'\n        ]),\n        north: () => make(-xOffset / 2, -yOffset, [\n          'bottom',\n          'alignCentre'\n        ]),\n        east: () => make(xOffset, -yOffset / 2, [\n          'valignCentre',\n          'left'\n        ]),\n        west: () => make(-xOffset, -yOffset / 2, [\n          'valignCentre',\n          'right'\n        ]),\n        insetNortheast: () => make(insetXOffset, insetYOffset, [\n          'top',\n          'alignLeft',\n          'inset'\n        ]),\n        insetNorthwest: () => make(-insetXOffset, insetYOffset, [\n          'top',\n          'alignRight',\n          'inset'\n        ]),\n        insetNorth: () => make(-insetXOffset / 2, insetYOffset, [\n          'top',\n          'alignCentre',\n          'inset'\n        ]),\n        insetSoutheast: () => make(insetXOffset, -insetYOffset, [\n          'bottom',\n          'alignLeft',\n          'inset'\n        ]),\n        insetSouthwest: () => make(-insetXOffset, -insetYOffset, [\n          'bottom',\n          'alignRight',\n          'inset'\n        ]),\n        insetSouth: () => make(-insetXOffset / 2, -insetYOffset, [\n          'bottom',\n          'alignCentre',\n          'inset'\n        ]),\n        insetEast: () => make(-insetXOffset, -insetYOffset / 2, [\n          'valignCentre',\n          'right',\n          'inset'\n        ]),\n        insetWest: () => make(insetXOffset, -insetYOffset / 2, [\n          'valignCentre',\n          'left',\n          'inset'\n        ])\n      };\n    };\n    const fallback = () => nu$5(0, 0, {});\n\n    const nu$4 = identity;\n\n    const onDirection = (isLtr, isRtl) => element => getDirection(element) === 'rtl' ? isRtl : isLtr;\n    const getDirection = element => get$e(element, 'direction') === 'rtl' ? 'rtl' : 'ltr';\n\n    var AttributeValue;\n    (function (AttributeValue) {\n      AttributeValue['TopToBottom'] = 'toptobottom';\n      AttributeValue['BottomToTop'] = 'bottomtotop';\n    }(AttributeValue || (AttributeValue = {})));\n    const Attribute = 'data-alloy-vertical-dir';\n    const isBottomToTopDir = el => closest$2(el, current => isElement$1(current) && get$f(current, 'data-alloy-vertical-dir') === AttributeValue.BottomToTop);\n\n    const schema$y = () => optionObjOf('layouts', [\n      required$1('onLtr'),\n      required$1('onRtl'),\n      option$3('onBottomLtr'),\n      option$3('onBottomRtl')\n    ]);\n    const get$5 = (elem, info, defaultLtr, defaultRtl, defaultBottomLtr, defaultBottomRtl, dirElement) => {\n      const isBottomToTop = dirElement.map(isBottomToTopDir).getOr(false);\n      const customLtr = info.layouts.map(ls => ls.onLtr(elem));\n      const customRtl = info.layouts.map(ls => ls.onRtl(elem));\n      const ltr = isBottomToTop ? info.layouts.bind(ls => ls.onBottomLtr.map(f => f(elem))).or(customLtr).getOr(defaultBottomLtr) : customLtr.getOr(defaultLtr);\n      const rtl = isBottomToTop ? info.layouts.bind(ls => ls.onBottomRtl.map(f => f(elem))).or(customRtl).getOr(defaultBottomRtl) : customRtl.getOr(defaultRtl);\n      const f = onDirection(ltr, rtl);\n      return f(elem);\n    };\n\n    const placement$4 = (component, anchorInfo, origin) => {\n      const hotspot = anchorInfo.hotspot;\n      const anchorBox = toBox(origin, hotspot.element);\n      const layouts = get$5(component.element, anchorInfo, belowOrAbove(), belowOrAboveRtl(), aboveOrBelow(), aboveOrBelowRtl(), Optional.some(anchorInfo.hotspot.element));\n      return Optional.some(nu$4({\n        anchorBox,\n        bubble: anchorInfo.bubble.getOr(fallback()),\n        overrides: anchorInfo.overrides,\n        layouts\n      }));\n    };\n    var HotspotAnchor = [\n      required$1('hotspot'),\n      option$3('bubble'),\n      defaulted('overrides', {}),\n      schema$y(),\n      output$1('placement', placement$4)\n    ];\n\n    const placement$3 = (component, anchorInfo, origin) => {\n      const pos = translate$2(origin, anchorInfo.x, anchorInfo.y);\n      const anchorBox = bounds(pos.left, pos.top, anchorInfo.width, anchorInfo.height);\n      const layouts = get$5(component.element, anchorInfo, all$1(), allRtl$1(), all$1(), allRtl$1(), Optional.none());\n      return Optional.some(nu$4({\n        anchorBox,\n        bubble: anchorInfo.bubble,\n        overrides: anchorInfo.overrides,\n        layouts\n      }));\n    };\n    var MakeshiftAnchor = [\n      required$1('x'),\n      required$1('y'),\n      defaulted('height', 0),\n      defaulted('width', 0),\n      defaulted('bubble', fallback()),\n      defaulted('overrides', {}),\n      schema$y(),\n      output$1('placement', placement$3)\n    ];\n\n    const adt$7 = Adt.generate([\n      { screen: ['point'] },\n      {\n        absolute: [\n          'point',\n          'scrollLeft',\n          'scrollTop'\n        ]\n      }\n    ]);\n    const toFixed = pos => pos.fold(identity, (point, scrollLeft, scrollTop) => point.translate(-scrollLeft, -scrollTop));\n    const toAbsolute = pos => pos.fold(identity, identity);\n    const sum = points => foldl(points, (b, a) => b.translate(a.left, a.top), SugarPosition(0, 0));\n    const sumAsFixed = positions => {\n      const points = map$2(positions, toFixed);\n      return sum(points);\n    };\n    const sumAsAbsolute = positions => {\n      const points = map$2(positions, toAbsolute);\n      return sum(points);\n    };\n    const screen = adt$7.screen;\n    const absolute$1 = adt$7.absolute;\n\n    const getOffset = (component, origin, anchorInfo) => {\n      const win = defaultView(anchorInfo.root).dom;\n      const hasSameOwner = frame => {\n        const frameOwner = owner$4(frame);\n        const compOwner = owner$4(component.element);\n        return eq(frameOwner, compOwner);\n      };\n      return Optional.from(win.frameElement).map(SugarElement.fromDom).filter(hasSameOwner).map(absolute$3);\n    };\n    const getRootPoint = (component, origin, anchorInfo) => {\n      const doc = owner$4(component.element);\n      const outerScroll = get$b(doc);\n      const offset = getOffset(component, origin, anchorInfo).getOr(outerScroll);\n      return absolute$1(offset, outerScroll.left, outerScroll.top);\n    };\n\n    const getBox = (left, top, width, height) => {\n      const point = screen(SugarPosition(left, top));\n      return Optional.some(pointed(point, width, height));\n    };\n    const calcNewAnchor = (optBox, rootPoint, anchorInfo, origin, elem) => optBox.map(box => {\n      const points = [\n        rootPoint,\n        box.point\n      ];\n      const topLeft = cata$1(origin, () => sumAsAbsolute(points), () => sumAsAbsolute(points), () => sumAsFixed(points));\n      const anchorBox = rect(topLeft.left, topLeft.top, box.width, box.height);\n      const layoutsLtr = anchorInfo.showAbove ? aboveOrBelow() : belowOrAbove();\n      const layoutsRtl = anchorInfo.showAbove ? aboveOrBelowRtl() : belowOrAboveRtl();\n      const layouts = get$5(elem, anchorInfo, layoutsLtr, layoutsRtl, layoutsLtr, layoutsRtl, Optional.none());\n      return nu$4({\n        anchorBox,\n        bubble: anchorInfo.bubble.getOr(fallback()),\n        overrides: anchorInfo.overrides,\n        layouts\n      });\n    });\n\n    const placement$2 = (component, anchorInfo, origin) => {\n      const rootPoint = getRootPoint(component, origin, anchorInfo);\n      return anchorInfo.node.filter(inBody).bind(target => {\n        const rect = target.dom.getBoundingClientRect();\n        const nodeBox = getBox(rect.left, rect.top, rect.width, rect.height);\n        const elem = anchorInfo.node.getOr(component.element);\n        return calcNewAnchor(nodeBox, rootPoint, anchorInfo, origin, elem);\n      });\n    };\n    var NodeAnchor = [\n      required$1('node'),\n      required$1('root'),\n      option$3('bubble'),\n      schema$y(),\n      defaulted('overrides', {}),\n      defaulted('showAbove', false),\n      output$1('placement', placement$2)\n    ];\n\n    const zeroWidth = '\\uFEFF';\n    const nbsp = '\\xA0';\n\n    const create$3 = (start, soffset, finish, foffset) => ({\n      start,\n      soffset,\n      finish,\n      foffset\n    });\n    const SimRange = { create: create$3 };\n\n    const adt$6 = Adt.generate([\n      { before: ['element'] },\n      {\n        on: [\n          'element',\n          'offset'\n        ]\n      },\n      { after: ['element'] }\n    ]);\n    const cata = (subject, onBefore, onOn, onAfter) => subject.fold(onBefore, onOn, onAfter);\n    const getStart$1 = situ => situ.fold(identity, identity, identity);\n    const before = adt$6.before;\n    const on$1 = adt$6.on;\n    const after$1 = adt$6.after;\n    const Situ = {\n      before,\n      on: on$1,\n      after: after$1,\n      cata,\n      getStart: getStart$1\n    };\n\n    const adt$5 = Adt.generate([\n      { domRange: ['rng'] },\n      {\n        relative: [\n          'startSitu',\n          'finishSitu'\n        ]\n      },\n      {\n        exact: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      }\n    ]);\n    const exactFromRange = simRange => adt$5.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset);\n    const getStart = selection => selection.match({\n      domRange: rng => SugarElement.fromDom(rng.startContainer),\n      relative: (startSitu, _finishSitu) => Situ.getStart(startSitu),\n      exact: (start, _soffset, _finish, _foffset) => start\n    });\n    const domRange = adt$5.domRange;\n    const relative = adt$5.relative;\n    const exact = adt$5.exact;\n    const getWin = selection => {\n      const start = getStart(selection);\n      return defaultView(start);\n    };\n    const range$1 = SimRange.create;\n    const SimSelection = {\n      domRange,\n      relative,\n      exact,\n      exactFromRange,\n      getWin,\n      range: range$1\n    };\n\n    const setStart = (rng, situ) => {\n      situ.fold(e => {\n        rng.setStartBefore(e.dom);\n      }, (e, o) => {\n        rng.setStart(e.dom, o);\n      }, e => {\n        rng.setStartAfter(e.dom);\n      });\n    };\n    const setFinish = (rng, situ) => {\n      situ.fold(e => {\n        rng.setEndBefore(e.dom);\n      }, (e, o) => {\n        rng.setEnd(e.dom, o);\n      }, e => {\n        rng.setEndAfter(e.dom);\n      });\n    };\n    const relativeToNative = (win, startSitu, finishSitu) => {\n      const range = win.document.createRange();\n      setStart(range, startSitu);\n      setFinish(range, finishSitu);\n      return range;\n    };\n    const exactToNative = (win, start, soffset, finish, foffset) => {\n      const rng = win.document.createRange();\n      rng.setStart(start.dom, soffset);\n      rng.setEnd(finish.dom, foffset);\n      return rng;\n    };\n    const toRect = rect => ({\n      left: rect.left,\n      top: rect.top,\n      right: rect.right,\n      bottom: rect.bottom,\n      width: rect.width,\n      height: rect.height\n    });\n    const getFirstRect$1 = rng => {\n      const rects = rng.getClientRects();\n      const rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect();\n      return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect) : Optional.none();\n    };\n    const getBounds$2 = rng => {\n      const rect = rng.getBoundingClientRect();\n      return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect) : Optional.none();\n    };\n\n    const adt$4 = Adt.generate([\n      {\n        ltr: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      },\n      {\n        rtl: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      }\n    ]);\n    const fromRange = (win, type, range) => type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset);\n    const getRanges = (win, selection) => selection.match({\n      domRange: rng => {\n        return {\n          ltr: constant$1(rng),\n          rtl: Optional.none\n        };\n      },\n      relative: (startSitu, finishSitu) => {\n        return {\n          ltr: cached(() => relativeToNative(win, startSitu, finishSitu)),\n          rtl: cached(() => Optional.some(relativeToNative(win, finishSitu, startSitu)))\n        };\n      },\n      exact: (start, soffset, finish, foffset) => {\n        return {\n          ltr: cached(() => exactToNative(win, start, soffset, finish, foffset)),\n          rtl: cached(() => Optional.some(exactToNative(win, finish, foffset, start, soffset)))\n        };\n      }\n    });\n    const doDiagnose = (win, ranges) => {\n      const rng = ranges.ltr();\n      if (rng.collapsed) {\n        const reversed = ranges.rtl().filter(rev => rev.collapsed === false);\n        return reversed.map(rev => adt$4.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset)).getOrThunk(() => fromRange(win, adt$4.ltr, rng));\n      } else {\n        return fromRange(win, adt$4.ltr, rng);\n      }\n    };\n    const diagnose = (win, selection) => {\n      const ranges = getRanges(win, selection);\n      return doDiagnose(win, ranges);\n    };\n    const asLtrRange = (win, selection) => {\n      const diagnosis = diagnose(win, selection);\n      return diagnosis.match({\n        ltr: (start, soffset, finish, foffset) => {\n          const rng = win.document.createRange();\n          rng.setStart(start.dom, soffset);\n          rng.setEnd(finish.dom, foffset);\n          return rng;\n        },\n        rtl: (start, soffset, finish, foffset) => {\n          const rng = win.document.createRange();\n          rng.setStart(finish.dom, foffset);\n          rng.setEnd(start.dom, soffset);\n          return rng;\n        }\n      });\n    };\n    adt$4.ltr;\n    adt$4.rtl;\n\n    const ancestors = (scope, predicate, isRoot) => filter$2(parents(scope, isRoot), predicate);\n\n    const descendants = (scope, selector) => all$3(selector, scope);\n\n    const makeRange = (start, soffset, finish, foffset) => {\n      const doc = owner$4(start);\n      const rng = doc.dom.createRange();\n      rng.setStart(start.dom, soffset);\n      rng.setEnd(finish.dom, foffset);\n      return rng;\n    };\n    const after = (start, soffset, finish, foffset) => {\n      const r = makeRange(start, soffset, finish, foffset);\n      const same = eq(start, finish) && soffset === foffset;\n      return r.collapsed && !same;\n    };\n\n    const getNativeSelection = win => Optional.from(win.getSelection());\n    const readRange = selection => {\n      if (selection.rangeCount > 0) {\n        const firstRng = selection.getRangeAt(0);\n        const lastRng = selection.getRangeAt(selection.rangeCount - 1);\n        return Optional.some(SimRange.create(SugarElement.fromDom(firstRng.startContainer), firstRng.startOffset, SugarElement.fromDom(lastRng.endContainer), lastRng.endOffset));\n      } else {\n        return Optional.none();\n      }\n    };\n    const doGetExact = selection => {\n      if (selection.anchorNode === null || selection.focusNode === null) {\n        return readRange(selection);\n      } else {\n        const anchor = SugarElement.fromDom(selection.anchorNode);\n        const focus = SugarElement.fromDom(selection.focusNode);\n        return after(anchor, selection.anchorOffset, focus, selection.focusOffset) ? Optional.some(SimRange.create(anchor, selection.anchorOffset, focus, selection.focusOffset)) : readRange(selection);\n      }\n    };\n    const getExact = win => getNativeSelection(win).filter(sel => sel.rangeCount > 0).bind(doGetExact);\n    const getFirstRect = (win, selection) => {\n      const rng = asLtrRange(win, selection);\n      return getFirstRect$1(rng);\n    };\n    const getBounds$1 = (win, selection) => {\n      const rng = asLtrRange(win, selection);\n      return getBounds$2(rng);\n    };\n\n    const NodeValue = (is, name) => {\n      const get = element => {\n        if (!is(element)) {\n          throw new Error('Can only get ' + name + ' value of a ' + name + ' node');\n        }\n        return getOption(element).getOr('');\n      };\n      const getOption = element => is(element) ? Optional.from(element.dom.nodeValue) : Optional.none();\n      const set = (element, value) => {\n        if (!is(element)) {\n          throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');\n        }\n        element.dom.nodeValue = value;\n      };\n      return {\n        get,\n        getOption,\n        set\n      };\n    };\n\n    const api = NodeValue(isText, 'text');\n    const get$4 = element => api.get(element);\n\n    const point = (element, offset) => ({\n      element,\n      offset\n    });\n    const descendOnce$1 = (element, offset) => {\n      const children$1 = children(element);\n      if (children$1.length === 0) {\n        return point(element, offset);\n      } else if (offset < children$1.length) {\n        return point(children$1[offset], 0);\n      } else {\n        const last = children$1[children$1.length - 1];\n        const len = isText(last) ? get$4(last).length : children(last).length;\n        return point(last, len);\n      }\n    };\n\n    const descendOnce = (element, offset) => isText(element) ? point(element, offset) : descendOnce$1(element, offset);\n    const isSimRange = detail => detail.foffset !== undefined;\n    const getAnchorSelection = (win, anchorInfo) => {\n      const getSelection = anchorInfo.getSelection.getOrThunk(() => () => getExact(win));\n      return getSelection().map(sel => {\n        if (isSimRange(sel)) {\n          const modStart = descendOnce(sel.start, sel.soffset);\n          const modFinish = descendOnce(sel.finish, sel.foffset);\n          return SimSelection.range(modStart.element, modStart.offset, modFinish.element, modFinish.offset);\n        } else {\n          return sel;\n        }\n      });\n    };\n    const placement$1 = (component, anchorInfo, origin) => {\n      const win = defaultView(anchorInfo.root).dom;\n      const rootPoint = getRootPoint(component, origin, anchorInfo);\n      const selectionBox = getAnchorSelection(win, anchorInfo).bind(sel => {\n        if (isSimRange(sel)) {\n          const optRect = getBounds$1(win, SimSelection.exactFromRange(sel)).orThunk(() => {\n            const zeroWidth$1 = SugarElement.fromText(zeroWidth);\n            before$1(sel.start, zeroWidth$1);\n            const rect = getFirstRect(win, SimSelection.exact(zeroWidth$1, 0, zeroWidth$1, 1));\n            remove$5(zeroWidth$1);\n            return rect;\n          });\n          return optRect.bind(rawRect => {\n            return getBox(rawRect.left, rawRect.top, rawRect.width, rawRect.height);\n          });\n        } else {\n          const selectionRect = map$1(sel, cell => cell.dom.getBoundingClientRect());\n          const bounds = {\n            left: Math.min(selectionRect.firstCell.left, selectionRect.lastCell.left),\n            right: Math.max(selectionRect.firstCell.right, selectionRect.lastCell.right),\n            top: Math.min(selectionRect.firstCell.top, selectionRect.lastCell.top),\n            bottom: Math.max(selectionRect.firstCell.bottom, selectionRect.lastCell.bottom)\n          };\n          return getBox(bounds.left, bounds.top, bounds.right - bounds.left, bounds.bottom - bounds.top);\n        }\n      });\n      const targetElement = getAnchorSelection(win, anchorInfo).bind(sel => {\n        if (isSimRange(sel)) {\n          return isElement$1(sel.start) ? Optional.some(sel.start) : parentElement(sel.start);\n        } else {\n          return Optional.some(sel.firstCell);\n        }\n      });\n      const elem = targetElement.getOr(component.element);\n      return calcNewAnchor(selectionBox, rootPoint, anchorInfo, origin, elem);\n    };\n    var SelectionAnchor = [\n      option$3('getSelection'),\n      required$1('root'),\n      option$3('bubble'),\n      schema$y(),\n      defaulted('overrides', {}),\n      defaulted('showAbove', false),\n      output$1('placement', placement$1)\n    ];\n\n    const labelPrefix$1 = 'link-layout';\n    const eastX = anchor => anchor.x + anchor.width;\n    const westX = (anchor, element) => anchor.x - element.width;\n    const northY$1 = (anchor, element) => anchor.y - element.height + anchor.height;\n    const southY$1 = anchor => anchor.y;\n    const southeast$1 = (anchor, element, bubbles) => nu$6(eastX(anchor), southY$1(anchor), bubbles.southeast(), southeast$3(), 'southeast', boundsRestriction(anchor, {\n      left: 0,\n      top: 2\n    }), labelPrefix$1);\n    const southwest$1 = (anchor, element, bubbles) => nu$6(westX(anchor, element), southY$1(anchor), bubbles.southwest(), southwest$3(), 'southwest', boundsRestriction(anchor, {\n      right: 1,\n      top: 2\n    }), labelPrefix$1);\n    const northeast$1 = (anchor, element, bubbles) => nu$6(eastX(anchor), northY$1(anchor, element), bubbles.northeast(), northeast$3(), 'northeast', boundsRestriction(anchor, {\n      left: 0,\n      bottom: 3\n    }), labelPrefix$1);\n    const northwest$1 = (anchor, element, bubbles) => nu$6(westX(anchor, element), northY$1(anchor, element), bubbles.northwest(), northwest$3(), 'northwest', boundsRestriction(anchor, {\n      right: 1,\n      bottom: 3\n    }), labelPrefix$1);\n    const all = () => [\n      southeast$1,\n      southwest$1,\n      northeast$1,\n      northwest$1\n    ];\n    const allRtl = () => [\n      southwest$1,\n      southeast$1,\n      northwest$1,\n      northeast$1\n    ];\n\n    const placement = (component, submenuInfo, origin) => {\n      const anchorBox = toBox(origin, submenuInfo.item.element);\n      const layouts = get$5(component.element, submenuInfo, all(), allRtl(), all(), allRtl(), Optional.none());\n      return Optional.some(nu$4({\n        anchorBox,\n        bubble: fallback(),\n        overrides: submenuInfo.overrides,\n        layouts\n      }));\n    };\n    var SubmenuAnchor = [\n      required$1('item'),\n      schema$y(),\n      defaulted('overrides', {}),\n      output$1('placement', placement)\n    ];\n\n    var AnchorSchema = choose$1('type', {\n      selection: SelectionAnchor,\n      node: NodeAnchor,\n      hotspot: HotspotAnchor,\n      submenu: SubmenuAnchor,\n      makeshift: MakeshiftAnchor\n    });\n\n    const TransitionSchema = [\n      requiredArrayOf('classes', string),\n      defaultedStringEnum('mode', 'all', [\n        'all',\n        'layout',\n        'placement'\n      ])\n    ];\n    const PositionSchema = [\n      defaulted('useFixed', never),\n      option$3('getBounds')\n    ];\n    const PlacementSchema = [\n      requiredOf('anchor', AnchorSchema),\n      optionObjOf('transition', TransitionSchema)\n    ];\n\n    const getFixedOrigin = () => {\n      const html = document.documentElement;\n      return fixed$1(0, 0, html.clientWidth, html.clientHeight);\n    };\n    const getRelativeOrigin = component => {\n      const position = absolute$3(component.element);\n      const bounds = component.element.dom.getBoundingClientRect();\n      return relative$1(position.left, position.top, bounds.width, bounds.height);\n    };\n    const place = (origin, anchoring, optBounds, placee, lastPlace, transition) => {\n      const anchor = box(anchoring.anchorBox, origin);\n      return simple(anchor, placee.element, anchoring.bubble, anchoring.layouts, lastPlace, optBounds, anchoring.overrides, transition);\n    };\n    const position$1 = (component, posConfig, posState, placee, placementSpec) => {\n      const optWithinBounds = Optional.none();\n      positionWithinBounds(component, posConfig, posState, placee, placementSpec, optWithinBounds);\n    };\n    const positionWithinBounds = (component, posConfig, posState, placee, placementSpec, optWithinBounds) => {\n      const placeeDetail = asRawOrDie$1('placement.info', objOf(PlacementSchema), placementSpec);\n      const anchorage = placeeDetail.anchor;\n      const element = placee.element;\n      const placeeState = posState.get(placee.uid);\n      preserve$1(() => {\n        set$8(element, 'position', 'fixed');\n        const oldVisibility = getRaw(element, 'visibility');\n        set$8(element, 'visibility', 'hidden');\n        const origin = posConfig.useFixed() ? getFixedOrigin() : getRelativeOrigin(component);\n        anchorage.placement(component, anchorage, origin).each(anchoring => {\n          const optBounds = optWithinBounds.orThunk(() => posConfig.getBounds.map(apply$1));\n          const newState = place(origin, anchoring, optBounds, placee, placeeState, placeeDetail.transition);\n          posState.set(placee.uid, newState);\n        });\n        oldVisibility.fold(() => {\n          remove$6(element, 'visibility');\n        }, vis => {\n          set$8(element, 'visibility', vis);\n        });\n        if (getRaw(element, 'left').isNone() && getRaw(element, 'top').isNone() && getRaw(element, 'right').isNone() && getRaw(element, 'bottom').isNone() && is$1(getRaw(element, 'position'), 'fixed')) {\n          remove$6(element, 'position');\n        }\n      }, element);\n    };\n    const getMode = (component, pConfig, _pState) => pConfig.useFixed() ? 'fixed' : 'absolute';\n    const reset$1 = (component, pConfig, posState, placee) => {\n      const element = placee.element;\n      each$1([\n        'position',\n        'left',\n        'right',\n        'top',\n        'bottom'\n      ], prop => remove$6(element, prop));\n      reset$2(element);\n      posState.clear(placee.uid);\n    };\n\n    var PositionApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        position: position$1,\n        positionWithinBounds: positionWithinBounds,\n        getMode: getMode,\n        reset: reset$1\n    });\n\n    const init$g = () => {\n      let state = {};\n      const set = (id, data) => {\n        state[id] = data;\n      };\n      const get = id => get$g(state, id);\n      const clear = id => {\n        if (isNonNullable(id)) {\n          delete state[id];\n        } else {\n          state = {};\n        }\n      };\n      return nu$8({\n        readState: () => state,\n        clear,\n        set,\n        get\n      });\n    };\n\n    var PositioningState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$g\n    });\n\n    const Positioning = create$4({\n      fields: PositionSchema,\n      name: 'positioning',\n      active: ActivePosition,\n      apis: PositionApis,\n      state: PositioningState\n    });\n\n    const isConnected = comp => comp.getSystem().isConnected();\n    const fireDetaching = component => {\n      emit(component, detachedFromDom());\n      const children = component.components();\n      each$1(children, fireDetaching);\n    };\n    const fireAttaching = component => {\n      const children = component.components();\n      each$1(children, fireAttaching);\n      emit(component, attachedToDom());\n    };\n    const virtualAttach = (parent, child) => {\n      parent.getSystem().addToWorld(child);\n      if (inBody(parent.element)) {\n        fireAttaching(child);\n      }\n    };\n    const virtualDetach = comp => {\n      fireDetaching(comp);\n      comp.getSystem().removeFromWorld(comp);\n    };\n    const attach$1 = (parent, child) => {\n      append$2(parent.element, child.element);\n    };\n    const detachChildren$1 = component => {\n      each$1(component.components(), childComp => remove$5(childComp.element));\n      empty(component.element);\n      component.syncComponents();\n    };\n    const replaceChildren = (component, newSpecs, buildNewChildren) => {\n      const subs = component.components();\n      detachChildren$1(component);\n      const newChildren = buildNewChildren(newSpecs);\n      const deleted = difference(subs, newChildren);\n      each$1(deleted, comp => {\n        fireDetaching(comp);\n        component.getSystem().removeFromWorld(comp);\n      });\n      each$1(newChildren, childComp => {\n        if (!isConnected(childComp)) {\n          component.getSystem().addToWorld(childComp);\n          attach$1(component, childComp);\n          if (inBody(component.element)) {\n            fireAttaching(childComp);\n          }\n        } else {\n          attach$1(component, childComp);\n        }\n      });\n      component.syncComponents();\n    };\n    const virtualReplaceChildren = (component, newSpecs, buildNewChildren) => {\n      const subs = component.components();\n      const existingComps = bind$3(newSpecs, spec => getPremade(spec).toArray());\n      each$1(subs, childComp => {\n        if (!contains$2(existingComps, childComp)) {\n          virtualDetach(childComp);\n        }\n      });\n      const newChildren = buildNewChildren(newSpecs);\n      const deleted = difference(subs, newChildren);\n      each$1(deleted, deletedComp => {\n        if (isConnected(deletedComp)) {\n          virtualDetach(deletedComp);\n        }\n      });\n      each$1(newChildren, childComp => {\n        if (!isConnected(childComp)) {\n          virtualAttach(component, childComp);\n        }\n      });\n      component.syncComponents();\n    };\n\n    const attach = (parent, child) => {\n      attachWith(parent, child, append$2);\n    };\n    const attachWith = (parent, child, insertion) => {\n      parent.getSystem().addToWorld(child);\n      insertion(parent.element, child.element);\n      if (inBody(parent.element)) {\n        fireAttaching(child);\n      }\n      parent.syncComponents();\n    };\n    const doDetach = component => {\n      fireDetaching(component);\n      remove$5(component.element);\n      component.getSystem().removeFromWorld(component);\n    };\n    const detach = component => {\n      const parent$1 = parent(component.element).bind(p => component.getSystem().getByDom(p).toOptional());\n      doDetach(component);\n      parent$1.each(p => {\n        p.syncComponents();\n      });\n    };\n    const detachChildren = component => {\n      const subs = component.components();\n      each$1(subs, doDetach);\n      empty(component.element);\n      component.syncComponents();\n    };\n    const attachSystem = (element, guiSystem) => {\n      attachSystemWith(element, guiSystem, append$2);\n    };\n    const attachSystemAfter = (element, guiSystem) => {\n      attachSystemWith(element, guiSystem, after$2);\n    };\n    const attachSystemWith = (element, guiSystem, inserter) => {\n      inserter(element, guiSystem.element);\n      const children$1 = children(guiSystem.element);\n      each$1(children$1, child => {\n        guiSystem.getByDom(child).each(fireAttaching);\n      });\n    };\n    const detachSystem = guiSystem => {\n      const children$1 = children(guiSystem.element);\n      each$1(children$1, child => {\n        guiSystem.getByDom(child).each(fireDetaching);\n      });\n      remove$5(guiSystem.element);\n    };\n\n    const rebuild = (sandbox, sConfig, sState, data) => {\n      sState.get().each(_data => {\n        detachChildren(sandbox);\n      });\n      const point = sConfig.getAttachPoint(sandbox);\n      attach(point, sandbox);\n      const built = sandbox.getSystem().build(data);\n      attach(sandbox, built);\n      sState.set(built);\n      return built;\n    };\n    const open$1 = (sandbox, sConfig, sState, data) => {\n      const newState = rebuild(sandbox, sConfig, sState, data);\n      sConfig.onOpen(sandbox, newState);\n      return newState;\n    };\n    const setContent = (sandbox, sConfig, sState, data) => sState.get().map(() => rebuild(sandbox, sConfig, sState, data));\n    const openWhileCloaked = (sandbox, sConfig, sState, data, transaction) => {\n      cloak(sandbox, sConfig);\n      open$1(sandbox, sConfig, sState, data);\n      transaction();\n      decloak(sandbox, sConfig);\n    };\n    const close$1 = (sandbox, sConfig, sState) => {\n      sState.get().each(data => {\n        detachChildren(sandbox);\n        detach(sandbox);\n        sConfig.onClose(sandbox, data);\n        sState.clear();\n      });\n    };\n    const isOpen$1 = (_sandbox, _sConfig, sState) => sState.isOpen();\n    const isPartOf = (sandbox, sConfig, sState, queryElem) => isOpen$1(sandbox, sConfig, sState) && sState.get().exists(data => sConfig.isPartOf(sandbox, data, queryElem));\n    const getState$2 = (_sandbox, _sConfig, sState) => sState.get();\n    const store = (sandbox, cssKey, attr, newValue) => {\n      getRaw(sandbox.element, cssKey).fold(() => {\n        remove$7(sandbox.element, attr);\n      }, v => {\n        set$9(sandbox.element, attr, v);\n      });\n      set$8(sandbox.element, cssKey, newValue);\n    };\n    const restore = (sandbox, cssKey, attr) => {\n      getOpt(sandbox.element, attr).fold(() => remove$6(sandbox.element, cssKey), oldValue => set$8(sandbox.element, cssKey, oldValue));\n    };\n    const cloak = (sandbox, sConfig, _sState) => {\n      const sink = sConfig.getAttachPoint(sandbox);\n      set$8(sandbox.element, 'position', Positioning.getMode(sink));\n      store(sandbox, 'visibility', sConfig.cloakVisibilityAttr, 'hidden');\n    };\n    const hasPosition = element => exists([\n      'top',\n      'left',\n      'right',\n      'bottom'\n    ], pos => getRaw(element, pos).isSome());\n    const decloak = (sandbox, sConfig, _sState) => {\n      if (!hasPosition(sandbox.element)) {\n        remove$6(sandbox.element, 'position');\n      }\n      restore(sandbox, 'visibility', sConfig.cloakVisibilityAttr);\n    };\n\n    var SandboxApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        cloak: cloak,\n        decloak: decloak,\n        open: open$1,\n        openWhileCloaked: openWhileCloaked,\n        close: close$1,\n        isOpen: isOpen$1,\n        isPartOf: isPartOf,\n        getState: getState$2,\n        setContent: setContent\n    });\n\n    const events$g = (sandboxConfig, sandboxState) => derive$2([run$1(sandboxClose(), (sandbox, _simulatedEvent) => {\n        close$1(sandbox, sandboxConfig, sandboxState);\n      })]);\n\n    var ActiveSandbox = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$g\n    });\n\n    var SandboxSchema = [\n      onHandler('onOpen'),\n      onHandler('onClose'),\n      required$1('isPartOf'),\n      required$1('getAttachPoint'),\n      defaulted('cloakVisibilityAttr', 'data-precloak-visibility')\n    ];\n\n    const init$f = () => {\n      const contents = value$2();\n      const readState = constant$1('not-implemented');\n      return nu$8({\n        readState,\n        isOpen: contents.isSet,\n        clear: contents.clear,\n        set: contents.set,\n        get: contents.get\n      });\n    };\n\n    var SandboxState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$f\n    });\n\n    const Sandboxing = create$4({\n      fields: SandboxSchema,\n      name: 'sandboxing',\n      active: ActiveSandbox,\n      apis: SandboxApis,\n      state: SandboxState\n    });\n\n    const dismissPopups = constant$1('dismiss.popups');\n    const repositionPopups = constant$1('reposition.popups');\n    const mouseReleased = constant$1('mouse.released');\n\n    const schema$x = objOfOnly([\n      defaulted('isExtraPart', never),\n      optionObjOf('fireEventInstead', [defaulted('event', dismissRequested())])\n    ]);\n    const receivingChannel$1 = rawSpec => {\n      const detail = asRawOrDie$1('Dismissal', schema$x, rawSpec);\n      return {\n        [dismissPopups()]: {\n          schema: objOfOnly([required$1('target')]),\n          onReceive: (sandbox, data) => {\n            if (Sandboxing.isOpen(sandbox)) {\n              const isPart = Sandboxing.isPartOf(sandbox, data.target) || detail.isExtraPart(sandbox, data.target);\n              if (!isPart) {\n                detail.fireEventInstead.fold(() => Sandboxing.close(sandbox), fe => emit(sandbox, fe.event));\n              }\n            }\n          }\n        }\n      };\n    };\n\n    const schema$w = objOfOnly([\n      optionObjOf('fireEventInstead', [defaulted('event', repositionRequested())]),\n      requiredFunction('doReposition')\n    ]);\n    const receivingChannel = rawSpec => {\n      const detail = asRawOrDie$1('Reposition', schema$w, rawSpec);\n      return {\n        [repositionPopups()]: {\n          onReceive: sandbox => {\n            if (Sandboxing.isOpen(sandbox)) {\n              detail.fireEventInstead.fold(() => detail.doReposition(sandbox), fe => emit(sandbox, fe.event));\n            }\n          }\n        }\n      };\n    };\n\n    const onLoad$5 = (component, repConfig, repState) => {\n      repConfig.store.manager.onLoad(component, repConfig, repState);\n    };\n    const onUnload$2 = (component, repConfig, repState) => {\n      repConfig.store.manager.onUnload(component, repConfig, repState);\n    };\n    const setValue$3 = (component, repConfig, repState, data) => {\n      repConfig.store.manager.setValue(component, repConfig, repState, data);\n    };\n    const getValue$3 = (component, repConfig, repState) => repConfig.store.manager.getValue(component, repConfig, repState);\n    const getState$1 = (component, repConfig, repState) => repState;\n\n    var RepresentApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        onLoad: onLoad$5,\n        onUnload: onUnload$2,\n        setValue: setValue$3,\n        getValue: getValue$3,\n        getState: getState$1\n    });\n\n    const events$f = (repConfig, repState) => {\n      const es = repConfig.resetOnDom ? [\n        runOnAttached((comp, _se) => {\n          onLoad$5(comp, repConfig, repState);\n        }),\n        runOnDetached((comp, _se) => {\n          onUnload$2(comp, repConfig, repState);\n        })\n      ] : [loadEvent(repConfig, repState, onLoad$5)];\n      return derive$2(es);\n    };\n\n    var ActiveRepresenting = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$f\n    });\n\n    const memory$1 = () => {\n      const data = Cell(null);\n      const readState = () => ({\n        mode: 'memory',\n        value: data.get()\n      });\n      const isNotSet = () => data.get() === null;\n      const clear = () => {\n        data.set(null);\n      };\n      return nu$8({\n        set: data.set,\n        get: data.get,\n        isNotSet,\n        clear,\n        readState\n      });\n    };\n    const manual = () => {\n      const readState = noop;\n      return nu$8({ readState });\n    };\n    const dataset = () => {\n      const dataByValue = Cell({});\n      const dataByText = Cell({});\n      const readState = () => ({\n        mode: 'dataset',\n        dataByValue: dataByValue.get(),\n        dataByText: dataByText.get()\n      });\n      const clear = () => {\n        dataByValue.set({});\n        dataByText.set({});\n      };\n      const lookup = itemString => get$g(dataByValue.get(), itemString).orThunk(() => get$g(dataByText.get(), itemString));\n      const update = items => {\n        const currentDataByValue = dataByValue.get();\n        const currentDataByText = dataByText.get();\n        const newDataByValue = {};\n        const newDataByText = {};\n        each$1(items, item => {\n          newDataByValue[item.value] = item;\n          get$g(item, 'meta').each(meta => {\n            get$g(meta, 'text').each(text => {\n              newDataByText[text] = item;\n            });\n          });\n        });\n        dataByValue.set({\n          ...currentDataByValue,\n          ...newDataByValue\n        });\n        dataByText.set({\n          ...currentDataByText,\n          ...newDataByText\n        });\n      };\n      return nu$8({\n        readState,\n        lookup,\n        update,\n        clear\n      });\n    };\n    const init$e = spec => spec.store.manager.state(spec);\n\n    var RepresentState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        memory: memory$1,\n        dataset: dataset,\n        manual: manual,\n        init: init$e\n    });\n\n    const setValue$2 = (component, repConfig, repState, data) => {\n      const store = repConfig.store;\n      repState.update([data]);\n      store.setValue(component, data);\n      repConfig.onSetValue(component, data);\n    };\n    const getValue$2 = (component, repConfig, repState) => {\n      const store = repConfig.store;\n      const key = store.getDataKey(component);\n      return repState.lookup(key).getOrThunk(() => store.getFallbackEntry(key));\n    };\n    const onLoad$4 = (component, repConfig, repState) => {\n      const store = repConfig.store;\n      store.initialValue.each(data => {\n        setValue$2(component, repConfig, repState, data);\n      });\n    };\n    const onUnload$1 = (component, repConfig, repState) => {\n      repState.clear();\n    };\n    var DatasetStore = [\n      option$3('initialValue'),\n      required$1('getFallbackEntry'),\n      required$1('getDataKey'),\n      required$1('setValue'),\n      output$1('manager', {\n        setValue: setValue$2,\n        getValue: getValue$2,\n        onLoad: onLoad$4,\n        onUnload: onUnload$1,\n        state: dataset\n      })\n    ];\n\n    const getValue$1 = (component, repConfig, _repState) => repConfig.store.getValue(component);\n    const setValue$1 = (component, repConfig, _repState, data) => {\n      repConfig.store.setValue(component, data);\n      repConfig.onSetValue(component, data);\n    };\n    const onLoad$3 = (component, repConfig, _repState) => {\n      repConfig.store.initialValue.each(data => {\n        repConfig.store.setValue(component, data);\n      });\n    };\n    var ManualStore = [\n      required$1('getValue'),\n      defaulted('setValue', noop),\n      option$3('initialValue'),\n      output$1('manager', {\n        setValue: setValue$1,\n        getValue: getValue$1,\n        onLoad: onLoad$3,\n        onUnload: noop,\n        state: NoState.init\n      })\n    ];\n\n    const setValue = (component, repConfig, repState, data) => {\n      repState.set(data);\n      repConfig.onSetValue(component, data);\n    };\n    const getValue = (component, repConfig, repState) => repState.get();\n    const onLoad$2 = (component, repConfig, repState) => {\n      repConfig.store.initialValue.each(initVal => {\n        if (repState.isNotSet()) {\n          repState.set(initVal);\n        }\n      });\n    };\n    const onUnload = (component, repConfig, repState) => {\n      repState.clear();\n    };\n    var MemoryStore = [\n      option$3('initialValue'),\n      output$1('manager', {\n        setValue,\n        getValue,\n        onLoad: onLoad$2,\n        onUnload,\n        state: memory$1\n      })\n    ];\n\n    var RepresentSchema = [\n      defaultedOf('store', { mode: 'memory' }, choose$1('mode', {\n        memory: MemoryStore,\n        manual: ManualStore,\n        dataset: DatasetStore\n      })),\n      onHandler('onSetValue'),\n      defaulted('resetOnDom', false)\n    ];\n\n    const Representing = create$4({\n      fields: RepresentSchema,\n      name: 'representing',\n      active: ActiveRepresenting,\n      apis: RepresentApis,\n      extra: {\n        setValueFrom: (component, source) => {\n          const value = Representing.getValue(source);\n          Representing.setValue(component, value);\n        }\n      },\n      state: RepresentState\n    });\n\n    const field = (name, forbidden) => defaultedObjOf(name, {}, map$2(forbidden, f => forbid(f.name(), 'Cannot configure ' + f.name() + ' for ' + name)).concat([customField('dump', identity)]));\n    const get$3 = data => data.dump;\n    const augment = (data, original) => ({\n      ...derive$1(original),\n      ...data.dump\n    });\n    const SketchBehaviours = {\n      field,\n      augment,\n      get: get$3\n    };\n\n    const _placeholder = 'placeholder';\n    const adt$3 = Adt.generate([\n      {\n        single: [\n          'required',\n          'valueThunk'\n        ]\n      },\n      {\n        multiple: [\n          'required',\n          'valueThunks'\n        ]\n      }\n    ]);\n    const isSubstituted = spec => has$2(spec, 'uiType');\n    const subPlaceholder = (owner, detail, compSpec, placeholders) => {\n      if (owner.exists(o => o !== compSpec.owner)) {\n        return adt$3.single(true, constant$1(compSpec));\n      }\n      return get$g(placeholders, compSpec.name).fold(() => {\n        throw new Error('Unknown placeholder component: ' + compSpec.name + '\\nKnown: [' + keys(placeholders) + ']\\nNamespace: ' + owner.getOr('none') + '\\nSpec: ' + JSON.stringify(compSpec, null, 2));\n      }, newSpec => newSpec.replace());\n    };\n    const scan = (owner, detail, compSpec, placeholders) => {\n      if (isSubstituted(compSpec) && compSpec.uiType === _placeholder) {\n        return subPlaceholder(owner, detail, compSpec, placeholders);\n      } else {\n        return adt$3.single(false, constant$1(compSpec));\n      }\n    };\n    const substitute = (owner, detail, compSpec, placeholders) => {\n      const base = scan(owner, detail, compSpec, placeholders);\n      return base.fold((req, valueThunk) => {\n        const value = isSubstituted(compSpec) ? valueThunk(detail, compSpec.config, compSpec.validated) : valueThunk(detail);\n        const childSpecs = get$g(value, 'components').getOr([]);\n        const substituted = bind$3(childSpecs, c => substitute(owner, detail, c, placeholders));\n        return [{\n            ...value,\n            components: substituted\n          }];\n      }, (req, valuesThunk) => {\n        if (isSubstituted(compSpec)) {\n          const values = valuesThunk(detail, compSpec.config, compSpec.validated);\n          const preprocessor = compSpec.validated.preprocess.getOr(identity);\n          return preprocessor(values);\n        } else {\n          return valuesThunk(detail);\n        }\n      });\n    };\n    const substituteAll = (owner, detail, components, placeholders) => bind$3(components, c => substitute(owner, detail, c, placeholders));\n    const oneReplace = (label, replacements) => {\n      let called = false;\n      const used = () => called;\n      const replace = () => {\n        if (called) {\n          throw new Error('Trying to use the same placeholder more than once: ' + label);\n        }\n        called = true;\n        return replacements;\n      };\n      const required = () => replacements.fold((req, _) => req, (req, _) => req);\n      return {\n        name: constant$1(label),\n        required,\n        used,\n        replace\n      };\n    };\n    const substitutePlaces = (owner, detail, components, placeholders) => {\n      const ps = map$1(placeholders, (ph, name) => oneReplace(name, ph));\n      const outcome = substituteAll(owner, detail, components, ps);\n      each(ps, p => {\n        if (p.used() === false && p.required()) {\n          throw new Error('Placeholder: ' + p.name() + ' was not found in components list\\nNamespace: ' + owner.getOr('none') + '\\nComponents: ' + JSON.stringify(detail.components, null, 2));\n        }\n      });\n      return outcome;\n    };\n    const single$2 = adt$3.single;\n    const multiple = adt$3.multiple;\n    const placeholder = constant$1(_placeholder);\n\n    const adt$2 = Adt.generate([\n      { required: ['data'] },\n      { external: ['data'] },\n      { optional: ['data'] },\n      { group: ['data'] }\n    ]);\n    const fFactory = defaulted('factory', { sketch: identity });\n    const fSchema = defaulted('schema', []);\n    const fName = required$1('name');\n    const fPname = field$1('pname', 'pname', defaultedThunk(typeSpec => '<alloy.' + generate$6(typeSpec.name) + '>'), anyValue());\n    const fGroupSchema = customField('schema', () => [option$3('preprocess')]);\n    const fDefaults = defaulted('defaults', constant$1({}));\n    const fOverrides = defaulted('overrides', constant$1({}));\n    const requiredSpec = objOf([\n      fFactory,\n      fSchema,\n      fName,\n      fPname,\n      fDefaults,\n      fOverrides\n    ]);\n    const externalSpec = objOf([\n      fFactory,\n      fSchema,\n      fName,\n      fDefaults,\n      fOverrides\n    ]);\n    const optionalSpec = objOf([\n      fFactory,\n      fSchema,\n      fName,\n      fPname,\n      fDefaults,\n      fOverrides\n    ]);\n    const groupSpec = objOf([\n      fFactory,\n      fGroupSchema,\n      fName,\n      required$1('unit'),\n      fPname,\n      fDefaults,\n      fOverrides\n    ]);\n    const asNamedPart = part => {\n      return part.fold(Optional.some, Optional.none, Optional.some, Optional.some);\n    };\n    const name$2 = part => {\n      const get = data => data.name;\n      return part.fold(get, get, get, get);\n    };\n    const asCommon = part => {\n      return part.fold(identity, identity, identity, identity);\n    };\n    const convert = (adtConstructor, partSchema) => spec => {\n      const data = asRawOrDie$1('Converting part type', partSchema, spec);\n      return adtConstructor(data);\n    };\n    const required = convert(adt$2.required, requiredSpec);\n    const external = convert(adt$2.external, externalSpec);\n    const optional = convert(adt$2.optional, optionalSpec);\n    const group = convert(adt$2.group, groupSpec);\n    const original = constant$1('entirety');\n\n    var PartType = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        required: required,\n        external: external,\n        optional: optional,\n        group: group,\n        asNamedPart: asNamedPart,\n        name: name$2,\n        asCommon: asCommon,\n        original: original\n    });\n\n    const combine = (detail, data, partSpec, partValidated) => deepMerge(data.defaults(detail, partSpec, partValidated), partSpec, { uid: detail.partUids[data.name] }, data.overrides(detail, partSpec, partValidated));\n    const subs = (owner, detail, parts) => {\n      const internals = {};\n      const externals = {};\n      each$1(parts, part => {\n        part.fold(data => {\n          internals[data.pname] = single$2(true, (detail, partSpec, partValidated) => data.factory.sketch(combine(detail, data, partSpec, partValidated)));\n        }, data => {\n          const partSpec = detail.parts[data.name];\n          externals[data.name] = constant$1(data.factory.sketch(combine(detail, data, partSpec[original()]), partSpec));\n        }, data => {\n          internals[data.pname] = single$2(false, (detail, partSpec, partValidated) => data.factory.sketch(combine(detail, data, partSpec, partValidated)));\n        }, data => {\n          internals[data.pname] = multiple(true, (detail, _partSpec, _partValidated) => {\n            const units = detail[data.name];\n            return map$2(units, u => data.factory.sketch(deepMerge(data.defaults(detail, u, _partValidated), u, data.overrides(detail, u))));\n          });\n        });\n      });\n      return {\n        internals: constant$1(internals),\n        externals: constant$1(externals)\n      };\n    };\n\n    const generate$3 = (owner, parts) => {\n      const r = {};\n      each$1(parts, part => {\n        asNamedPart(part).each(np => {\n          const g = doGenerateOne(owner, np.pname);\n          r[np.name] = config => {\n            const validated = asRawOrDie$1('Part: ' + np.name + ' in ' + owner, objOf(np.schema), config);\n            return {\n              ...g,\n              config,\n              validated\n            };\n          };\n        });\n      });\n      return r;\n    };\n    const doGenerateOne = (owner, pname) => ({\n      uiType: placeholder(),\n      owner,\n      name: pname\n    });\n    const generateOne$1 = (owner, pname, config) => ({\n      uiType: placeholder(),\n      owner,\n      name: pname,\n      config,\n      validated: {}\n    });\n    const schemas = parts => bind$3(parts, part => part.fold(Optional.none, Optional.some, Optional.none, Optional.none).map(data => requiredObjOf(data.name, data.schema.concat([snapshot(original())]))).toArray());\n    const names = parts => map$2(parts, name$2);\n    const substitutes = (owner, detail, parts) => subs(owner, detail, parts);\n    const components$1 = (owner, detail, internals) => substitutePlaces(Optional.some(owner), detail, detail.components, internals);\n    const getPart = (component, detail, partKey) => {\n      const uid = detail.partUids[partKey];\n      return component.getSystem().getByUid(uid).toOptional();\n    };\n    const getPartOrDie = (component, detail, partKey) => getPart(component, detail, partKey).getOrDie('Could not find part: ' + partKey);\n    const getParts = (component, detail, partKeys) => {\n      const r = {};\n      const uids = detail.partUids;\n      const system = component.getSystem();\n      each$1(partKeys, pk => {\n        r[pk] = constant$1(system.getByUid(uids[pk]));\n      });\n      return r;\n    };\n    const getAllParts = (component, detail) => {\n      const system = component.getSystem();\n      return map$1(detail.partUids, (pUid, _k) => constant$1(system.getByUid(pUid)));\n    };\n    const getAllPartNames = detail => keys(detail.partUids);\n    const getPartsOrDie = (component, detail, partKeys) => {\n      const r = {};\n      const uids = detail.partUids;\n      const system = component.getSystem();\n      each$1(partKeys, pk => {\n        r[pk] = constant$1(system.getByUid(uids[pk]).getOrDie());\n      });\n      return r;\n    };\n    const defaultUids = (baseUid, partTypes) => {\n      const partNames = names(partTypes);\n      return wrapAll(map$2(partNames, pn => ({\n        key: pn,\n        value: baseUid + '-' + pn\n      })));\n    };\n    const defaultUidsSchema = partTypes => field$1('partUids', 'partUids', mergeWithThunk(spec => defaultUids(spec.uid, partTypes)), anyValue());\n\n    var AlloyParts = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        generate: generate$3,\n        generateOne: generateOne$1,\n        schemas: schemas,\n        names: names,\n        substitutes: substitutes,\n        components: components$1,\n        defaultUids: defaultUids,\n        defaultUidsSchema: defaultUidsSchema,\n        getAllParts: getAllParts,\n        getAllPartNames: getAllPartNames,\n        getPart: getPart,\n        getPartOrDie: getPartOrDie,\n        getParts: getParts,\n        getPartsOrDie: getPartsOrDie\n    });\n\n    const base = (partSchemas, partUidsSchemas) => {\n      const ps = partSchemas.length > 0 ? [requiredObjOf('parts', partSchemas)] : [];\n      return ps.concat([\n        required$1('uid'),\n        defaulted('dom', {}),\n        defaulted('components', []),\n        snapshot('originalSpec'),\n        defaulted('debug.sketcher', {})\n      ]).concat(partUidsSchemas);\n    };\n    const asRawOrDie = (label, schema, spec, partSchemas, partUidsSchemas) => {\n      const baseS = base(partSchemas, partUidsSchemas);\n      return asRawOrDie$1(label + ' [SpecSchema]', objOfOnly(baseS.concat(schema)), spec);\n    };\n\n    const single$1 = (owner, schema, factory, spec) => {\n      const specWithUid = supplyUid(spec);\n      const detail = asRawOrDie(owner, schema, specWithUid, [], []);\n      return factory(detail, specWithUid);\n    };\n    const composite$1 = (owner, schema, partTypes, factory, spec) => {\n      const specWithUid = supplyUid(spec);\n      const partSchemas = schemas(partTypes);\n      const partUidsSchema = defaultUidsSchema(partTypes);\n      const detail = asRawOrDie(owner, schema, specWithUid, partSchemas, [partUidsSchema]);\n      const subs = substitutes(owner, detail, partTypes);\n      const components = components$1(owner, detail, subs.internals());\n      return factory(detail, components, specWithUid, subs.externals());\n    };\n    const hasUid = spec => has$2(spec, 'uid');\n    const supplyUid = spec => {\n      return hasUid(spec) ? spec : {\n        ...spec,\n        uid: generate$5('uid')\n      };\n    };\n\n    const isSketchSpec = spec => {\n      return spec.uid !== undefined;\n    };\n    const singleSchema = objOfOnly([\n      required$1('name'),\n      required$1('factory'),\n      required$1('configFields'),\n      defaulted('apis', {}),\n      defaulted('extraApis', {})\n    ]);\n    const compositeSchema = objOfOnly([\n      required$1('name'),\n      required$1('factory'),\n      required$1('configFields'),\n      required$1('partFields'),\n      defaulted('apis', {}),\n      defaulted('extraApis', {})\n    ]);\n    const single = rawConfig => {\n      const config = asRawOrDie$1('Sketcher for ' + rawConfig.name, singleSchema, rawConfig);\n      const sketch = spec => single$1(config.name, config.configFields, config.factory, spec);\n      const apis = map$1(config.apis, makeApi);\n      const extraApis = map$1(config.extraApis, (f, k) => markAsExtraApi(f, k));\n      return {\n        name: config.name,\n        configFields: config.configFields,\n        sketch,\n        ...apis,\n        ...extraApis\n      };\n    };\n    const composite = rawConfig => {\n      const config = asRawOrDie$1('Sketcher for ' + rawConfig.name, compositeSchema, rawConfig);\n      const sketch = spec => composite$1(config.name, config.configFields, config.partFields, config.factory, spec);\n      const parts = generate$3(config.name, config.partFields);\n      const apis = map$1(config.apis, makeApi);\n      const extraApis = map$1(config.extraApis, (f, k) => markAsExtraApi(f, k));\n      return {\n        name: config.name,\n        partFields: config.partFields,\n        configFields: config.configFields,\n        sketch,\n        parts,\n        ...apis,\n        ...extraApis\n      };\n    };\n\n    const inside = target => isTag('input')(target) && get$f(target, 'type') !== 'radio' || isTag('textarea')(target);\n\n    const getCurrent = (component, composeConfig, _composeState) => composeConfig.find(component);\n\n    var ComposeApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        getCurrent: getCurrent\n    });\n\n    const ComposeSchema = [required$1('find')];\n\n    const Composing = create$4({\n      fields: ComposeSchema,\n      name: 'composing',\n      apis: ComposeApis\n    });\n\n    const nativeDisabled = [\n      'input',\n      'button',\n      'textarea',\n      'select'\n    ];\n    const onLoad$1 = (component, disableConfig, disableState) => {\n      const f = disableConfig.disabled() ? disable : enable;\n      f(component, disableConfig);\n    };\n    const hasNative = (component, config) => config.useNative === true && contains$2(nativeDisabled, name$3(component.element));\n    const nativeIsDisabled = component => has$1(component.element, 'disabled');\n    const nativeDisable = component => {\n      set$9(component.element, 'disabled', 'disabled');\n    };\n    const nativeEnable = component => {\n      remove$7(component.element, 'disabled');\n    };\n    const ariaIsDisabled = component => get$f(component.element, 'aria-disabled') === 'true';\n    const ariaDisable = component => {\n      set$9(component.element, 'aria-disabled', 'true');\n    };\n    const ariaEnable = component => {\n      set$9(component.element, 'aria-disabled', 'false');\n    };\n    const disable = (component, disableConfig, _disableState) => {\n      disableConfig.disableClass.each(disableClass => {\n        add$2(component.element, disableClass);\n      });\n      const f = hasNative(component, disableConfig) ? nativeDisable : ariaDisable;\n      f(component);\n      disableConfig.onDisabled(component);\n    };\n    const enable = (component, disableConfig, _disableState) => {\n      disableConfig.disableClass.each(disableClass => {\n        remove$2(component.element, disableClass);\n      });\n      const f = hasNative(component, disableConfig) ? nativeEnable : ariaEnable;\n      f(component);\n      disableConfig.onEnabled(component);\n    };\n    const isDisabled = (component, disableConfig) => hasNative(component, disableConfig) ? nativeIsDisabled(component) : ariaIsDisabled(component);\n    const set$4 = (component, disableConfig, disableState, disabled) => {\n      const f = disabled ? disable : enable;\n      f(component, disableConfig);\n    };\n\n    var DisableApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        enable: enable,\n        disable: disable,\n        isDisabled: isDisabled,\n        onLoad: onLoad$1,\n        set: set$4\n    });\n\n    const exhibit$5 = (base, disableConfig) => nu$7({ classes: disableConfig.disabled() ? disableConfig.disableClass.toArray() : [] });\n    const events$e = (disableConfig, disableState) => derive$2([\n      abort(execute$5(), (component, _simulatedEvent) => isDisabled(component, disableConfig)),\n      loadEvent(disableConfig, disableState, onLoad$1)\n    ]);\n\n    var ActiveDisable = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        exhibit: exhibit$5,\n        events: events$e\n    });\n\n    var DisableSchema = [\n      defaultedFunction('disabled', never),\n      defaulted('useNative', true),\n      option$3('disableClass'),\n      onHandler('onDisabled'),\n      onHandler('onEnabled')\n    ];\n\n    const Disabling = create$4({\n      fields: DisableSchema,\n      name: 'disabling',\n      active: ActiveDisable,\n      apis: DisableApis\n    });\n\n    const dehighlightAllExcept = (component, hConfig, hState, skip) => {\n      const highlighted = descendants(component.element, '.' + hConfig.highlightClass);\n      each$1(highlighted, h => {\n        const shouldSkip = exists(skip, skipComp => eq(skipComp.element, h));\n        if (!shouldSkip) {\n          remove$2(h, hConfig.highlightClass);\n          component.getSystem().getByDom(h).each(target => {\n            hConfig.onDehighlight(component, target);\n            emit(target, dehighlight$1());\n          });\n        }\n      });\n    };\n    const dehighlightAll = (component, hConfig, hState) => dehighlightAllExcept(component, hConfig, hState, []);\n    const dehighlight = (component, hConfig, hState, target) => {\n      if (isHighlighted(component, hConfig, hState, target)) {\n        remove$2(target.element, hConfig.highlightClass);\n        hConfig.onDehighlight(component, target);\n        emit(target, dehighlight$1());\n      }\n    };\n    const highlight = (component, hConfig, hState, target) => {\n      dehighlightAllExcept(component, hConfig, hState, [target]);\n      if (!isHighlighted(component, hConfig, hState, target)) {\n        add$2(target.element, hConfig.highlightClass);\n        hConfig.onHighlight(component, target);\n        emit(target, highlight$1());\n      }\n    };\n    const highlightFirst = (component, hConfig, hState) => {\n      getFirst(component, hConfig).each(firstComp => {\n        highlight(component, hConfig, hState, firstComp);\n      });\n    };\n    const highlightLast = (component, hConfig, hState) => {\n      getLast(component, hConfig).each(lastComp => {\n        highlight(component, hConfig, hState, lastComp);\n      });\n    };\n    const highlightAt = (component, hConfig, hState, index) => {\n      getByIndex(component, hConfig, hState, index).fold(err => {\n        throw err;\n      }, firstComp => {\n        highlight(component, hConfig, hState, firstComp);\n      });\n    };\n    const highlightBy = (component, hConfig, hState, predicate) => {\n      const candidates = getCandidates(component, hConfig);\n      const targetComp = find$5(candidates, predicate);\n      targetComp.each(c => {\n        highlight(component, hConfig, hState, c);\n      });\n    };\n    const isHighlighted = (component, hConfig, hState, queryTarget) => has(queryTarget.element, hConfig.highlightClass);\n    const getHighlighted = (component, hConfig, _hState) => descendant(component.element, '.' + hConfig.highlightClass).bind(e => component.getSystem().getByDom(e).toOptional());\n    const getByIndex = (component, hConfig, hState, index) => {\n      const items = descendants(component.element, '.' + hConfig.itemClass);\n      return Optional.from(items[index]).fold(() => Result.error(new Error('No element found with index ' + index)), component.getSystem().getByDom);\n    };\n    const getFirst = (component, hConfig, _hState) => descendant(component.element, '.' + hConfig.itemClass).bind(e => component.getSystem().getByDom(e).toOptional());\n    const getLast = (component, hConfig, _hState) => {\n      const items = descendants(component.element, '.' + hConfig.itemClass);\n      const last = items.length > 0 ? Optional.some(items[items.length - 1]) : Optional.none();\n      return last.bind(c => component.getSystem().getByDom(c).toOptional());\n    };\n    const getDelta$2 = (component, hConfig, hState, delta) => {\n      const items = descendants(component.element, '.' + hConfig.itemClass);\n      const current = findIndex$1(items, item => has(item, hConfig.highlightClass));\n      return current.bind(selected => {\n        const dest = cycleBy(selected, delta, 0, items.length - 1);\n        return component.getSystem().getByDom(items[dest]).toOptional();\n      });\n    };\n    const getPrevious = (component, hConfig, hState) => getDelta$2(component, hConfig, hState, -1);\n    const getNext = (component, hConfig, hState) => getDelta$2(component, hConfig, hState, +1);\n    const getCandidates = (component, hConfig, _hState) => {\n      const items = descendants(component.element, '.' + hConfig.itemClass);\n      return cat(map$2(items, i => component.getSystem().getByDom(i).toOptional()));\n    };\n\n    var HighlightApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        dehighlightAll: dehighlightAll,\n        dehighlight: dehighlight,\n        highlight: highlight,\n        highlightFirst: highlightFirst,\n        highlightLast: highlightLast,\n        highlightAt: highlightAt,\n        highlightBy: highlightBy,\n        isHighlighted: isHighlighted,\n        getHighlighted: getHighlighted,\n        getFirst: getFirst,\n        getLast: getLast,\n        getPrevious: getPrevious,\n        getNext: getNext,\n        getCandidates: getCandidates\n    });\n\n    var HighlightSchema = [\n      required$1('highlightClass'),\n      required$1('itemClass'),\n      onHandler('onHighlight'),\n      onHandler('onDehighlight')\n    ];\n\n    const Highlighting = create$4({\n      fields: HighlightSchema,\n      name: 'highlighting',\n      apis: HighlightApis\n    });\n\n    const BACKSPACE = [8];\n    const TAB = [9];\n    const ENTER = [13];\n    const ESCAPE = [27];\n    const SPACE = [32];\n    const LEFT = [37];\n    const UP = [38];\n    const RIGHT = [39];\n    const DOWN = [40];\n\n    const cyclePrev = (values, index, predicate) => {\n      const before = reverse(values.slice(0, index));\n      const after = reverse(values.slice(index + 1));\n      return find$5(before.concat(after), predicate);\n    };\n    const tryPrev = (values, index, predicate) => {\n      const before = reverse(values.slice(0, index));\n      return find$5(before, predicate);\n    };\n    const cycleNext = (values, index, predicate) => {\n      const before = values.slice(0, index);\n      const after = values.slice(index + 1);\n      return find$5(after.concat(before), predicate);\n    };\n    const tryNext = (values, index, predicate) => {\n      const after = values.slice(index + 1);\n      return find$5(after, predicate);\n    };\n\n    const inSet = keys => event => {\n      const raw = event.raw;\n      return contains$2(keys, raw.which);\n    };\n    const and = preds => event => forall(preds, pred => pred(event));\n    const isShift$1 = event => {\n      const raw = event.raw;\n      return raw.shiftKey === true;\n    };\n    const isControl = event => {\n      const raw = event.raw;\n      return raw.ctrlKey === true;\n    };\n    const isNotShift = not(isShift$1);\n\n    const rule = (matches, action) => ({\n      matches,\n      classification: action\n    });\n    const choose = (transitions, event) => {\n      const transition = find$5(transitions, t => t.matches(event));\n      return transition.map(t => t.classification);\n    };\n\n    const reportFocusShifting = (component, prevFocus, newFocus) => {\n      const noChange = prevFocus.exists(p => newFocus.exists(n => eq(n, p)));\n      if (!noChange) {\n        emitWith(component, focusShifted(), {\n          prevFocus,\n          newFocus\n        });\n      }\n    };\n    const dom$2 = () => {\n      const get = component => search(component.element);\n      const set = (component, focusee) => {\n        const prevFocus = get(component);\n        component.getSystem().triggerFocus(focusee, component.element);\n        const newFocus = get(component);\n        reportFocusShifting(component, prevFocus, newFocus);\n      };\n      return {\n        get,\n        set\n      };\n    };\n    const highlights = () => {\n      const get = component => Highlighting.getHighlighted(component).map(item => item.element);\n      const set = (component, element) => {\n        const prevFocus = get(component);\n        component.getSystem().getByDom(element).fold(noop, item => {\n          Highlighting.highlight(component, item);\n        });\n        const newFocus = get(component);\n        reportFocusShifting(component, prevFocus, newFocus);\n      };\n      return {\n        get,\n        set\n      };\n    };\n\n    var FocusInsideModes;\n    (function (FocusInsideModes) {\n      FocusInsideModes['OnFocusMode'] = 'onFocus';\n      FocusInsideModes['OnEnterOrSpaceMode'] = 'onEnterOrSpace';\n      FocusInsideModes['OnApiMode'] = 'onApi';\n    }(FocusInsideModes || (FocusInsideModes = {})));\n\n    const typical = (infoSchema, stateInit, getKeydownRules, getKeyupRules, optFocusIn) => {\n      const schema = () => infoSchema.concat([\n        defaulted('focusManager', dom$2()),\n        defaultedOf('focusInside', 'onFocus', valueOf(val => contains$2([\n          'onFocus',\n          'onEnterOrSpace',\n          'onApi'\n        ], val) ? Result.value(val) : Result.error('Invalid value for focusInside'))),\n        output$1('handler', me),\n        output$1('state', stateInit),\n        output$1('sendFocusIn', optFocusIn)\n      ]);\n      const processKey = (component, simulatedEvent, getRules, keyingConfig, keyingState) => {\n        const rules = getRules(component, simulatedEvent, keyingConfig, keyingState);\n        return choose(rules, simulatedEvent.event).bind(rule => rule(component, simulatedEvent, keyingConfig, keyingState));\n      };\n      const toEvents = (keyingConfig, keyingState) => {\n        const onFocusHandler = keyingConfig.focusInside !== FocusInsideModes.OnFocusMode ? Optional.none() : optFocusIn(keyingConfig).map(focusIn => run$1(focus$4(), (component, simulatedEvent) => {\n          focusIn(component, keyingConfig, keyingState);\n          simulatedEvent.stop();\n        }));\n        const tryGoInsideComponent = (component, simulatedEvent) => {\n          const isEnterOrSpace = inSet(SPACE.concat(ENTER))(simulatedEvent.event);\n          if (keyingConfig.focusInside === FocusInsideModes.OnEnterOrSpaceMode && isEnterOrSpace && isSource(component, simulatedEvent)) {\n            optFocusIn(keyingConfig).each(focusIn => {\n              focusIn(component, keyingConfig, keyingState);\n              simulatedEvent.stop();\n            });\n          }\n        };\n        const keyboardEvents = [\n          run$1(keydown(), (component, simulatedEvent) => {\n            processKey(component, simulatedEvent, getKeydownRules, keyingConfig, keyingState).fold(() => {\n              tryGoInsideComponent(component, simulatedEvent);\n            }, _ => {\n              simulatedEvent.stop();\n            });\n          }),\n          run$1(keyup(), (component, simulatedEvent) => {\n            processKey(component, simulatedEvent, getKeyupRules, keyingConfig, keyingState).each(_ => {\n              simulatedEvent.stop();\n            });\n          })\n        ];\n        return derive$2(onFocusHandler.toArray().concat(keyboardEvents));\n      };\n      const me = {\n        schema,\n        processKey,\n        toEvents\n      };\n      return me;\n    };\n\n    const create$2 = cyclicField => {\n      const schema = [\n        option$3('onEscape'),\n        option$3('onEnter'),\n        defaulted('selector', '[data-alloy-tabstop=\"true\"]:not(:disabled)'),\n        defaulted('firstTabstop', 0),\n        defaulted('useTabstopAt', always),\n        option$3('visibilitySelector')\n      ].concat([cyclicField]);\n      const isVisible = (tabbingConfig, element) => {\n        const target = tabbingConfig.visibilitySelector.bind(sel => closest$1(element, sel)).getOr(element);\n        return get$d(target) > 0;\n      };\n      const findInitial = (component, tabbingConfig) => {\n        const tabstops = descendants(component.element, tabbingConfig.selector);\n        const visibles = filter$2(tabstops, elem => isVisible(tabbingConfig, elem));\n        return Optional.from(visibles[tabbingConfig.firstTabstop]);\n      };\n      const findCurrent = (component, tabbingConfig) => tabbingConfig.focusManager.get(component).bind(elem => closest$1(elem, tabbingConfig.selector));\n      const isTabstop = (tabbingConfig, element) => isVisible(tabbingConfig, element) && tabbingConfig.useTabstopAt(element);\n      const focusIn = (component, tabbingConfig, _tabbingState) => {\n        findInitial(component, tabbingConfig).each(target => {\n          tabbingConfig.focusManager.set(component, target);\n        });\n      };\n      const goFromTabstop = (component, tabstops, stopIndex, tabbingConfig, cycle) => cycle(tabstops, stopIndex, elem => isTabstop(tabbingConfig, elem)).fold(() => tabbingConfig.cyclic ? Optional.some(true) : Optional.none(), target => {\n        tabbingConfig.focusManager.set(component, target);\n        return Optional.some(true);\n      });\n      const go = (component, _simulatedEvent, tabbingConfig, cycle) => {\n        const tabstops = descendants(component.element, tabbingConfig.selector);\n        return findCurrent(component, tabbingConfig).bind(tabstop => {\n          const optStopIndex = findIndex$1(tabstops, curry(eq, tabstop));\n          return optStopIndex.bind(stopIndex => goFromTabstop(component, tabstops, stopIndex, tabbingConfig, cycle));\n        });\n      };\n      const goBackwards = (component, simulatedEvent, tabbingConfig) => {\n        const navigate = tabbingConfig.cyclic ? cyclePrev : tryPrev;\n        return go(component, simulatedEvent, tabbingConfig, navigate);\n      };\n      const goForwards = (component, simulatedEvent, tabbingConfig) => {\n        const navigate = tabbingConfig.cyclic ? cycleNext : tryNext;\n        return go(component, simulatedEvent, tabbingConfig, navigate);\n      };\n      const isFirstChild = elem => parentNode(elem).bind(firstChild).exists(child => eq(child, elem));\n      const goFromPseudoTabstop = (component, simulatedEvent, tabbingConfig) => findCurrent(component, tabbingConfig).filter(elem => !tabbingConfig.useTabstopAt(elem)).bind(elem => (isFirstChild(elem) ? goBackwards : goForwards)(component, simulatedEvent, tabbingConfig));\n      const execute = (component, simulatedEvent, tabbingConfig) => tabbingConfig.onEnter.bind(f => f(component, simulatedEvent));\n      const exit = (component, simulatedEvent, tabbingConfig) => tabbingConfig.onEscape.bind(f => f(component, simulatedEvent));\n      const getKeydownRules = constant$1([\n        rule(and([\n          isShift$1,\n          inSet(TAB)\n        ]), goBackwards),\n        rule(inSet(TAB), goForwards),\n        rule(and([\n          isNotShift,\n          inSet(ENTER)\n        ]), execute)\n      ]);\n      const getKeyupRules = constant$1([\n        rule(inSet(ESCAPE), exit),\n        rule(inSet(TAB), goFromPseudoTabstop)\n      ]);\n      return typical(schema, NoState.init, getKeydownRules, getKeyupRules, () => Optional.some(focusIn));\n    };\n\n    var AcyclicType = create$2(customField('cyclic', never));\n\n    var CyclicType = create$2(customField('cyclic', always));\n\n    const doDefaultExecute = (component, _simulatedEvent, focused) => {\n      dispatch(component, focused, execute$5());\n      return Optional.some(true);\n    };\n    const defaultExecute = (component, simulatedEvent, focused) => {\n      const isComplex = inside(focused) && inSet(SPACE)(simulatedEvent.event);\n      return isComplex ? Optional.none() : doDefaultExecute(component, simulatedEvent, focused);\n    };\n    const stopEventForFirefox = (_component, _simulatedEvent) => Optional.some(true);\n\n    const schema$v = [\n      defaulted('execute', defaultExecute),\n      defaulted('useSpace', false),\n      defaulted('useEnter', true),\n      defaulted('useControlEnter', false),\n      defaulted('useDown', false)\n    ];\n    const execute$4 = (component, simulatedEvent, executeConfig) => executeConfig.execute(component, simulatedEvent, component.element);\n    const getKeydownRules$5 = (component, _simulatedEvent, executeConfig, _executeState) => {\n      const spaceExec = executeConfig.useSpace && !inside(component.element) ? SPACE : [];\n      const enterExec = executeConfig.useEnter ? ENTER : [];\n      const downExec = executeConfig.useDown ? DOWN : [];\n      const execKeys = spaceExec.concat(enterExec).concat(downExec);\n      return [rule(inSet(execKeys), execute$4)].concat(executeConfig.useControlEnter ? [rule(and([\n          isControl,\n          inSet(ENTER)\n        ]), execute$4)] : []);\n    };\n    const getKeyupRules$5 = (component, _simulatedEvent, executeConfig, _executeState) => executeConfig.useSpace && !inside(component.element) ? [rule(inSet(SPACE), stopEventForFirefox)] : [];\n    var ExecutionType = typical(schema$v, NoState.init, getKeydownRules$5, getKeyupRules$5, () => Optional.none());\n\n    const flatgrid$1 = () => {\n      const dimensions = value$2();\n      const setGridSize = (numRows, numColumns) => {\n        dimensions.set({\n          numRows,\n          numColumns\n        });\n      };\n      const getNumRows = () => dimensions.get().map(d => d.numRows);\n      const getNumColumns = () => dimensions.get().map(d => d.numColumns);\n      return nu$8({\n        readState: () => dimensions.get().map(d => ({\n          numRows: String(d.numRows),\n          numColumns: String(d.numColumns)\n        })).getOr({\n          numRows: '?',\n          numColumns: '?'\n        }),\n        setGridSize,\n        getNumRows,\n        getNumColumns\n      });\n    };\n    const init$d = spec => spec.state(spec);\n\n    var KeyingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        flatgrid: flatgrid$1,\n        init: init$d\n    });\n\n    const useH = movement => (component, simulatedEvent, config, state) => {\n      const move = movement(component.element);\n      return use(move, component, simulatedEvent, config, state);\n    };\n    const west$1 = (moveLeft, moveRight) => {\n      const movement = onDirection(moveLeft, moveRight);\n      return useH(movement);\n    };\n    const east$1 = (moveLeft, moveRight) => {\n      const movement = onDirection(moveRight, moveLeft);\n      return useH(movement);\n    };\n    const useV = move => (component, simulatedEvent, config, state) => use(move, component, simulatedEvent, config, state);\n    const use = (move, component, simulatedEvent, config, state) => {\n      const outcome = config.focusManager.get(component).bind(focused => move(component.element, focused, config, state));\n      return outcome.map(newFocus => {\n        config.focusManager.set(component, newFocus);\n        return true;\n      });\n    };\n    const north$1 = useV;\n    const south$1 = useV;\n    const move$1 = useV;\n\n    const isHidden$1 = dom => dom.offsetWidth <= 0 && dom.offsetHeight <= 0;\n    const isVisible = element => !isHidden$1(element.dom);\n\n    const locate = (candidates, predicate) => findIndex$1(candidates, predicate).map(index => ({\n      index,\n      candidates\n    }));\n\n    const locateVisible = (container, current, selector) => {\n      const predicate = x => eq(x, current);\n      const candidates = descendants(container, selector);\n      const visible = filter$2(candidates, isVisible);\n      return locate(visible, predicate);\n    };\n    const findIndex = (elements, target) => findIndex$1(elements, elem => eq(target, elem));\n\n    const withGrid = (values, index, numCols, f) => {\n      const oldRow = Math.floor(index / numCols);\n      const oldColumn = index % numCols;\n      return f(oldRow, oldColumn).bind(address => {\n        const newIndex = address.row * numCols + address.column;\n        return newIndex >= 0 && newIndex < values.length ? Optional.some(values[newIndex]) : Optional.none();\n      });\n    };\n    const cycleHorizontal$1 = (values, index, numRows, numCols, delta) => withGrid(values, index, numCols, (oldRow, oldColumn) => {\n      const onLastRow = oldRow === numRows - 1;\n      const colsInRow = onLastRow ? values.length - oldRow * numCols : numCols;\n      const newColumn = cycleBy(oldColumn, delta, 0, colsInRow - 1);\n      return Optional.some({\n        row: oldRow,\n        column: newColumn\n      });\n    });\n    const cycleVertical$1 = (values, index, numRows, numCols, delta) => withGrid(values, index, numCols, (oldRow, oldColumn) => {\n      const newRow = cycleBy(oldRow, delta, 0, numRows - 1);\n      const onLastRow = newRow === numRows - 1;\n      const colsInRow = onLastRow ? values.length - newRow * numCols : numCols;\n      const newCol = clamp(oldColumn, 0, colsInRow - 1);\n      return Optional.some({\n        row: newRow,\n        column: newCol\n      });\n    });\n    const cycleRight$1 = (values, index, numRows, numCols) => cycleHorizontal$1(values, index, numRows, numCols, +1);\n    const cycleLeft$1 = (values, index, numRows, numCols) => cycleHorizontal$1(values, index, numRows, numCols, -1);\n    const cycleUp$1 = (values, index, numRows, numCols) => cycleVertical$1(values, index, numRows, numCols, -1);\n    const cycleDown$1 = (values, index, numRows, numCols) => cycleVertical$1(values, index, numRows, numCols, +1);\n\n    const schema$u = [\n      required$1('selector'),\n      defaulted('execute', defaultExecute),\n      onKeyboardHandler('onEscape'),\n      defaulted('captureTab', false),\n      initSize()\n    ];\n    const focusIn$3 = (component, gridConfig, _gridState) => {\n      descendant(component.element, gridConfig.selector).each(first => {\n        gridConfig.focusManager.set(component, first);\n      });\n    };\n    const findCurrent$1 = (component, gridConfig) => gridConfig.focusManager.get(component).bind(elem => closest$1(elem, gridConfig.selector));\n    const execute$3 = (component, simulatedEvent, gridConfig, _gridState) => findCurrent$1(component, gridConfig).bind(focused => gridConfig.execute(component, simulatedEvent, focused));\n    const doMove$2 = cycle => (element, focused, gridConfig, gridState) => locateVisible(element, focused, gridConfig.selector).bind(identified => cycle(identified.candidates, identified.index, gridState.getNumRows().getOr(gridConfig.initSize.numRows), gridState.getNumColumns().getOr(gridConfig.initSize.numColumns)));\n    const handleTab = (_component, _simulatedEvent, gridConfig) => gridConfig.captureTab ? Optional.some(true) : Optional.none();\n    const doEscape$1 = (component, simulatedEvent, gridConfig) => gridConfig.onEscape(component, simulatedEvent);\n    const moveLeft$3 = doMove$2(cycleLeft$1);\n    const moveRight$3 = doMove$2(cycleRight$1);\n    const moveNorth$1 = doMove$2(cycleUp$1);\n    const moveSouth$1 = doMove$2(cycleDown$1);\n    const getKeydownRules$4 = constant$1([\n      rule(inSet(LEFT), west$1(moveLeft$3, moveRight$3)),\n      rule(inSet(RIGHT), east$1(moveLeft$3, moveRight$3)),\n      rule(inSet(UP), north$1(moveNorth$1)),\n      rule(inSet(DOWN), south$1(moveSouth$1)),\n      rule(and([\n        isShift$1,\n        inSet(TAB)\n      ]), handleTab),\n      rule(and([\n        isNotShift,\n        inSet(TAB)\n      ]), handleTab),\n      rule(inSet(SPACE.concat(ENTER)), execute$3)\n    ]);\n    const getKeyupRules$4 = constant$1([\n      rule(inSet(ESCAPE), doEscape$1),\n      rule(inSet(SPACE), stopEventForFirefox)\n    ]);\n    var FlatgridType = typical(schema$u, flatgrid$1, getKeydownRules$4, getKeyupRules$4, () => Optional.some(focusIn$3));\n\n    const f = (container, selector, current, delta, getNewIndex) => {\n      const isDisabledButton = candidate => name$3(candidate) === 'button' && get$f(candidate, 'disabled') === 'disabled';\n      const tryNewIndex = (initial, index, candidates) => getNewIndex(initial, index, delta, 0, candidates.length - 1, candidates[index], newIndex => isDisabledButton(candidates[newIndex]) ? tryNewIndex(initial, newIndex, candidates) : Optional.from(candidates[newIndex]));\n      return locateVisible(container, current, selector).bind(identified => {\n        const index = identified.index;\n        const candidates = identified.candidates;\n        return tryNewIndex(index, index, candidates);\n      });\n    };\n    const horizontalWithoutCycles = (container, selector, current, delta) => f(container, selector, current, delta, (prevIndex, v, d, min, max, oldCandidate, onNewIndex) => {\n      const newIndex = clamp(v + d, min, max);\n      return newIndex === prevIndex ? Optional.from(oldCandidate) : onNewIndex(newIndex);\n    });\n    const horizontal = (container, selector, current, delta) => f(container, selector, current, delta, (prevIndex, v, d, min, max, _oldCandidate, onNewIndex) => {\n      const newIndex = cycleBy(v, d, min, max);\n      return newIndex === prevIndex ? Optional.none() : onNewIndex(newIndex);\n    });\n\n    const schema$t = [\n      required$1('selector'),\n      defaulted('getInitial', Optional.none),\n      defaulted('execute', defaultExecute),\n      onKeyboardHandler('onEscape'),\n      defaulted('executeOnMove', false),\n      defaulted('allowVertical', true),\n      defaulted('allowHorizontal', true),\n      defaulted('cycles', true)\n    ];\n    const findCurrent = (component, flowConfig) => flowConfig.focusManager.get(component).bind(elem => closest$1(elem, flowConfig.selector));\n    const execute$2 = (component, simulatedEvent, flowConfig) => findCurrent(component, flowConfig).bind(focused => flowConfig.execute(component, simulatedEvent, focused));\n    const focusIn$2 = (component, flowConfig, _state) => {\n      flowConfig.getInitial(component).orThunk(() => descendant(component.element, flowConfig.selector)).each(first => {\n        flowConfig.focusManager.set(component, first);\n      });\n    };\n    const moveLeft$2 = (element, focused, info) => (info.cycles ? horizontal : horizontalWithoutCycles)(element, info.selector, focused, -1);\n    const moveRight$2 = (element, focused, info) => (info.cycles ? horizontal : horizontalWithoutCycles)(element, info.selector, focused, +1);\n    const doMove$1 = movement => (component, simulatedEvent, flowConfig, flowState) => movement(component, simulatedEvent, flowConfig, flowState).bind(() => flowConfig.executeOnMove ? execute$2(component, simulatedEvent, flowConfig) : Optional.some(true));\n    const doEscape = (component, simulatedEvent, flowConfig) => flowConfig.onEscape(component, simulatedEvent);\n    const getKeydownRules$3 = (_component, _se, flowConfig, _flowState) => {\n      const westMovers = [...flowConfig.allowHorizontal ? LEFT : []].concat(flowConfig.allowVertical ? UP : []);\n      const eastMovers = [...flowConfig.allowHorizontal ? RIGHT : []].concat(flowConfig.allowVertical ? DOWN : []);\n      return [\n        rule(inSet(westMovers), doMove$1(west$1(moveLeft$2, moveRight$2))),\n        rule(inSet(eastMovers), doMove$1(east$1(moveLeft$2, moveRight$2))),\n        rule(inSet(ENTER), execute$2),\n        rule(inSet(SPACE), execute$2)\n      ];\n    };\n    const getKeyupRules$3 = constant$1([\n      rule(inSet(SPACE), stopEventForFirefox),\n      rule(inSet(ESCAPE), doEscape)\n    ]);\n    var FlowType = typical(schema$t, NoState.init, getKeydownRules$3, getKeyupRules$3, () => Optional.some(focusIn$2));\n\n    const toCell = (matrix, rowIndex, columnIndex) => Optional.from(matrix[rowIndex]).bind(row => Optional.from(row[columnIndex]).map(cell => ({\n      rowIndex,\n      columnIndex,\n      cell\n    })));\n    const cycleHorizontal = (matrix, rowIndex, startCol, deltaCol) => {\n      const row = matrix[rowIndex];\n      const colsInRow = row.length;\n      const newColIndex = cycleBy(startCol, deltaCol, 0, colsInRow - 1);\n      return toCell(matrix, rowIndex, newColIndex);\n    };\n    const cycleVertical = (matrix, colIndex, startRow, deltaRow) => {\n      const nextRowIndex = cycleBy(startRow, deltaRow, 0, matrix.length - 1);\n      const colsInNextRow = matrix[nextRowIndex].length;\n      const nextColIndex = clamp(colIndex, 0, colsInNextRow - 1);\n      return toCell(matrix, nextRowIndex, nextColIndex);\n    };\n    const moveHorizontal = (matrix, rowIndex, startCol, deltaCol) => {\n      const row = matrix[rowIndex];\n      const colsInRow = row.length;\n      const newColIndex = clamp(startCol + deltaCol, 0, colsInRow - 1);\n      return toCell(matrix, rowIndex, newColIndex);\n    };\n    const moveVertical = (matrix, colIndex, startRow, deltaRow) => {\n      const nextRowIndex = clamp(startRow + deltaRow, 0, matrix.length - 1);\n      const colsInNextRow = matrix[nextRowIndex].length;\n      const nextColIndex = clamp(colIndex, 0, colsInNextRow - 1);\n      return toCell(matrix, nextRowIndex, nextColIndex);\n    };\n    const cycleRight = (matrix, startRow, startCol) => cycleHorizontal(matrix, startRow, startCol, +1);\n    const cycleLeft = (matrix, startRow, startCol) => cycleHorizontal(matrix, startRow, startCol, -1);\n    const cycleUp = (matrix, startRow, startCol) => cycleVertical(matrix, startCol, startRow, -1);\n    const cycleDown = (matrix, startRow, startCol) => cycleVertical(matrix, startCol, startRow, +1);\n    const moveLeft$1 = (matrix, startRow, startCol) => moveHorizontal(matrix, startRow, startCol, -1);\n    const moveRight$1 = (matrix, startRow, startCol) => moveHorizontal(matrix, startRow, startCol, +1);\n    const moveUp$1 = (matrix, startRow, startCol) => moveVertical(matrix, startCol, startRow, -1);\n    const moveDown$1 = (matrix, startRow, startCol) => moveVertical(matrix, startCol, startRow, +1);\n\n    const schema$s = [\n      requiredObjOf('selectors', [\n        required$1('row'),\n        required$1('cell')\n      ]),\n      defaulted('cycles', true),\n      defaulted('previousSelector', Optional.none),\n      defaulted('execute', defaultExecute)\n    ];\n    const focusIn$1 = (component, matrixConfig, _state) => {\n      const focused = matrixConfig.previousSelector(component).orThunk(() => {\n        const selectors = matrixConfig.selectors;\n        return descendant(component.element, selectors.cell);\n      });\n      focused.each(cell => {\n        matrixConfig.focusManager.set(component, cell);\n      });\n    };\n    const execute$1 = (component, simulatedEvent, matrixConfig) => search(component.element).bind(focused => matrixConfig.execute(component, simulatedEvent, focused));\n    const toMatrix = (rows, matrixConfig) => map$2(rows, row => descendants(row, matrixConfig.selectors.cell));\n    const doMove = (ifCycle, ifMove) => (element, focused, matrixConfig) => {\n      const move = matrixConfig.cycles ? ifCycle : ifMove;\n      return closest$1(focused, matrixConfig.selectors.row).bind(inRow => {\n        const cellsInRow = descendants(inRow, matrixConfig.selectors.cell);\n        return findIndex(cellsInRow, focused).bind(colIndex => {\n          const allRows = descendants(element, matrixConfig.selectors.row);\n          return findIndex(allRows, inRow).bind(rowIndex => {\n            const matrix = toMatrix(allRows, matrixConfig);\n            return move(matrix, rowIndex, colIndex).map(next => next.cell);\n          });\n        });\n      });\n    };\n    const moveLeft = doMove(cycleLeft, moveLeft$1);\n    const moveRight = doMove(cycleRight, moveRight$1);\n    const moveNorth = doMove(cycleUp, moveUp$1);\n    const moveSouth = doMove(cycleDown, moveDown$1);\n    const getKeydownRules$2 = constant$1([\n      rule(inSet(LEFT), west$1(moveLeft, moveRight)),\n      rule(inSet(RIGHT), east$1(moveLeft, moveRight)),\n      rule(inSet(UP), north$1(moveNorth)),\n      rule(inSet(DOWN), south$1(moveSouth)),\n      rule(inSet(SPACE.concat(ENTER)), execute$1)\n    ]);\n    const getKeyupRules$2 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);\n    var MatrixType = typical(schema$s, NoState.init, getKeydownRules$2, getKeyupRules$2, () => Optional.some(focusIn$1));\n\n    const schema$r = [\n      required$1('selector'),\n      defaulted('execute', defaultExecute),\n      defaulted('moveOnTab', false)\n    ];\n    const execute = (component, simulatedEvent, menuConfig) => menuConfig.focusManager.get(component).bind(focused => menuConfig.execute(component, simulatedEvent, focused));\n    const focusIn = (component, menuConfig, _state) => {\n      descendant(component.element, menuConfig.selector).each(first => {\n        menuConfig.focusManager.set(component, first);\n      });\n    };\n    const moveUp = (element, focused, info) => horizontal(element, info.selector, focused, -1);\n    const moveDown = (element, focused, info) => horizontal(element, info.selector, focused, +1);\n    const fireShiftTab = (component, simulatedEvent, menuConfig, menuState) => menuConfig.moveOnTab ? move$1(moveUp)(component, simulatedEvent, menuConfig, menuState) : Optional.none();\n    const fireTab = (component, simulatedEvent, menuConfig, menuState) => menuConfig.moveOnTab ? move$1(moveDown)(component, simulatedEvent, menuConfig, menuState) : Optional.none();\n    const getKeydownRules$1 = constant$1([\n      rule(inSet(UP), move$1(moveUp)),\n      rule(inSet(DOWN), move$1(moveDown)),\n      rule(and([\n        isShift$1,\n        inSet(TAB)\n      ]), fireShiftTab),\n      rule(and([\n        isNotShift,\n        inSet(TAB)\n      ]), fireTab),\n      rule(inSet(ENTER), execute),\n      rule(inSet(SPACE), execute)\n    ]);\n    const getKeyupRules$1 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);\n    var MenuType = typical(schema$r, NoState.init, getKeydownRules$1, getKeyupRules$1, () => Optional.some(focusIn));\n\n    const schema$q = [\n      onKeyboardHandler('onSpace'),\n      onKeyboardHandler('onEnter'),\n      onKeyboardHandler('onShiftEnter'),\n      onKeyboardHandler('onLeft'),\n      onKeyboardHandler('onRight'),\n      onKeyboardHandler('onTab'),\n      onKeyboardHandler('onShiftTab'),\n      onKeyboardHandler('onUp'),\n      onKeyboardHandler('onDown'),\n      onKeyboardHandler('onEscape'),\n      defaulted('stopSpaceKeyup', false),\n      option$3('focusIn')\n    ];\n    const getKeydownRules = (component, simulatedEvent, specialInfo) => [\n      rule(inSet(SPACE), specialInfo.onSpace),\n      rule(and([\n        isNotShift,\n        inSet(ENTER)\n      ]), specialInfo.onEnter),\n      rule(and([\n        isShift$1,\n        inSet(ENTER)\n      ]), specialInfo.onShiftEnter),\n      rule(and([\n        isShift$1,\n        inSet(TAB)\n      ]), specialInfo.onShiftTab),\n      rule(and([\n        isNotShift,\n        inSet(TAB)\n      ]), specialInfo.onTab),\n      rule(inSet(UP), specialInfo.onUp),\n      rule(inSet(DOWN), specialInfo.onDown),\n      rule(inSet(LEFT), specialInfo.onLeft),\n      rule(inSet(RIGHT), specialInfo.onRight),\n      rule(inSet(SPACE), specialInfo.onSpace)\n    ];\n    const getKeyupRules = (component, simulatedEvent, specialInfo) => [\n      ...specialInfo.stopSpaceKeyup ? [rule(inSet(SPACE), stopEventForFirefox)] : [],\n      rule(inSet(ESCAPE), specialInfo.onEscape)\n    ];\n    var SpecialType = typical(schema$q, NoState.init, getKeydownRules, getKeyupRules, specialInfo => specialInfo.focusIn);\n\n    const acyclic = AcyclicType.schema();\n    const cyclic = CyclicType.schema();\n    const flow = FlowType.schema();\n    const flatgrid = FlatgridType.schema();\n    const matrix = MatrixType.schema();\n    const execution = ExecutionType.schema();\n    const menu = MenuType.schema();\n    const special = SpecialType.schema();\n\n    var KeyboardBranches = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        acyclic: acyclic,\n        cyclic: cyclic,\n        flow: flow,\n        flatgrid: flatgrid,\n        matrix: matrix,\n        execution: execution,\n        menu: menu,\n        special: special\n    });\n\n    const isFlatgridState = keyState => hasNonNullableKey(keyState, 'setGridSize');\n    const Keying = createModes({\n      branchKey: 'mode',\n      branches: KeyboardBranches,\n      name: 'keying',\n      active: {\n        events: (keyingConfig, keyingState) => {\n          const handler = keyingConfig.handler;\n          return handler.toEvents(keyingConfig, keyingState);\n        }\n      },\n      apis: {\n        focusIn: (component, keyConfig, keyState) => {\n          keyConfig.sendFocusIn(keyConfig).fold(() => {\n            component.getSystem().triggerFocus(component.element, component.element);\n          }, sendFocusIn => {\n            sendFocusIn(component, keyConfig, keyState);\n          });\n        },\n        setGridSize: (component, keyConfig, keyState, numRows, numColumns) => {\n          if (!isFlatgridState(keyState)) {\n            console.error('Layout does not support setGridSize');\n          } else {\n            keyState.setGridSize(numRows, numColumns);\n          }\n        }\n      },\n      state: KeyingState\n    });\n\n    const withoutReuse = (parent, data) => {\n      preserve$1(() => {\n        replaceChildren(parent, data, () => map$2(data, parent.getSystem().build));\n      }, parent.element);\n    };\n    const withReuse = (parent, data) => {\n      preserve$1(() => {\n        virtualReplaceChildren(parent, data, () => {\n          return patchSpecChildren(parent.element, data, parent.getSystem().buildOrPatch);\n        });\n      }, parent.element);\n    };\n\n    const virtualReplace = (component, replacee, replaceeIndex, childSpec) => {\n      virtualDetach(replacee);\n      const child = patchSpecChild(component.element, replaceeIndex, childSpec, component.getSystem().buildOrPatch);\n      virtualAttach(component, child);\n      component.syncComponents();\n    };\n    const insert = (component, insertion, childSpec) => {\n      const child = component.getSystem().build(childSpec);\n      attachWith(component, child, insertion);\n    };\n    const replace = (component, replacee, replaceeIndex, childSpec) => {\n      detach(replacee);\n      insert(component, (p, c) => appendAt(p, c, replaceeIndex), childSpec);\n    };\n    const set$3 = (component, replaceConfig, replaceState, data) => {\n      const replacer = replaceConfig.reuseDom ? withReuse : withoutReuse;\n      return replacer(component, data);\n    };\n    const append = (component, replaceConfig, replaceState, appendee) => {\n      insert(component, append$2, appendee);\n    };\n    const prepend = (component, replaceConfig, replaceState, prependee) => {\n      insert(component, prepend$1, prependee);\n    };\n    const remove = (component, replaceConfig, replaceState, removee) => {\n      const children = contents(component);\n      const foundChild = find$5(children, child => eq(removee.element, child.element));\n      foundChild.each(detach);\n    };\n    const contents = (component, _replaceConfig) => component.components();\n    const replaceAt = (component, replaceConfig, replaceState, replaceeIndex, replacer) => {\n      const children = contents(component);\n      return Optional.from(children[replaceeIndex]).map(replacee => {\n        replacer.fold(() => detach(replacee), r => {\n          const replacer = replaceConfig.reuseDom ? virtualReplace : replace;\n          replacer(component, replacee, replaceeIndex, r);\n        });\n        return replacee;\n      });\n    };\n    const replaceBy = (component, replaceConfig, replaceState, replaceePred, replacer) => {\n      const children = contents(component);\n      return findIndex$1(children, replaceePred).bind(replaceeIndex => replaceAt(component, replaceConfig, replaceState, replaceeIndex, replacer));\n    };\n\n    var ReplaceApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        append: append,\n        prepend: prepend,\n        remove: remove,\n        replaceAt: replaceAt,\n        replaceBy: replaceBy,\n        set: set$3,\n        contents: contents\n    });\n\n    const Replacing = create$4({\n      fields: [defaultedBoolean('reuseDom', true)],\n      name: 'replacing',\n      apis: ReplaceApis\n    });\n\n    const events$d = (name, eventHandlers) => {\n      const events = derive$2(eventHandlers);\n      return create$4({\n        fields: [required$1('enabled')],\n        name,\n        active: { events: constant$1(events) }\n      });\n    };\n    const config = (name, eventHandlers) => {\n      const me = events$d(name, eventHandlers);\n      return {\n        key: name,\n        value: {\n          config: {},\n          me,\n          configAsRaw: constant$1({}),\n          initialConfig: {},\n          state: NoState\n        }\n      };\n    };\n\n    const focus$2 = (component, focusConfig) => {\n      if (!focusConfig.ignore) {\n        focus$3(component.element);\n        focusConfig.onFocus(component);\n      }\n    };\n    const blur = (component, focusConfig) => {\n      if (!focusConfig.ignore) {\n        blur$1(component.element);\n      }\n    };\n    const isFocused = component => hasFocus(component.element);\n\n    var FocusApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        focus: focus$2,\n        blur: blur,\n        isFocused: isFocused\n    });\n\n    const exhibit$4 = (base, focusConfig) => {\n      const mod = focusConfig.ignore ? {} : { attributes: { tabindex: '-1' } };\n      return nu$7(mod);\n    };\n    const events$c = focusConfig => derive$2([run$1(focus$4(), (component, simulatedEvent) => {\n        focus$2(component, focusConfig);\n        simulatedEvent.stop();\n      })].concat(focusConfig.stopMousedown ? [run$1(mousedown(), (_, simulatedEvent) => {\n        simulatedEvent.event.prevent();\n      })] : []));\n\n    var ActiveFocus = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        exhibit: exhibit$4,\n        events: events$c\n    });\n\n    var FocusSchema = [\n      onHandler('onFocus'),\n      defaulted('stopMousedown', false),\n      defaulted('ignore', false)\n    ];\n\n    const Focusing = create$4({\n      fields: FocusSchema,\n      name: 'focusing',\n      active: ActiveFocus,\n      apis: FocusApis\n    });\n\n    const SetupBehaviourCellState = initialState => {\n      const init = () => {\n        const cell = Cell(initialState);\n        const get = () => cell.get();\n        const set = newState => cell.set(newState);\n        const clear = () => cell.set(initialState);\n        const readState = () => cell.get();\n        return {\n          get,\n          set,\n          clear,\n          readState\n        };\n      };\n      return { init };\n    };\n\n    const updateAriaState = (component, toggleConfig, toggleState) => {\n      const ariaInfo = toggleConfig.aria;\n      ariaInfo.update(component, ariaInfo, toggleState.get());\n    };\n    const updateClass = (component, toggleConfig, toggleState) => {\n      toggleConfig.toggleClass.each(toggleClass => {\n        if (toggleState.get()) {\n          add$2(component.element, toggleClass);\n        } else {\n          remove$2(component.element, toggleClass);\n        }\n      });\n    };\n    const set$2 = (component, toggleConfig, toggleState, state) => {\n      const initialState = toggleState.get();\n      toggleState.set(state);\n      updateClass(component, toggleConfig, toggleState);\n      updateAriaState(component, toggleConfig, toggleState);\n      if (initialState !== state) {\n        toggleConfig.onToggled(component, state);\n      }\n    };\n    const toggle$2 = (component, toggleConfig, toggleState) => {\n      set$2(component, toggleConfig, toggleState, !toggleState.get());\n    };\n    const on = (component, toggleConfig, toggleState) => {\n      set$2(component, toggleConfig, toggleState, true);\n    };\n    const off = (component, toggleConfig, toggleState) => {\n      set$2(component, toggleConfig, toggleState, false);\n    };\n    const isOn = (component, toggleConfig, toggleState) => toggleState.get();\n    const onLoad = (component, toggleConfig, toggleState) => {\n      set$2(component, toggleConfig, toggleState, toggleConfig.selected);\n    };\n\n    var ToggleApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        onLoad: onLoad,\n        toggle: toggle$2,\n        isOn: isOn,\n        on: on,\n        off: off,\n        set: set$2\n    });\n\n    const exhibit$3 = () => nu$7({});\n    const events$b = (toggleConfig, toggleState) => {\n      const execute = executeEvent(toggleConfig, toggleState, toggle$2);\n      const load = loadEvent(toggleConfig, toggleState, onLoad);\n      return derive$2(flatten([\n        toggleConfig.toggleOnExecute ? [execute] : [],\n        [load]\n      ]));\n    };\n\n    var ActiveToggle = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        exhibit: exhibit$3,\n        events: events$b\n    });\n\n    const updatePressed = (component, ariaInfo, status) => {\n      set$9(component.element, 'aria-pressed', status);\n      if (ariaInfo.syncWithExpanded) {\n        updateExpanded(component, ariaInfo, status);\n      }\n    };\n    const updateSelected = (component, ariaInfo, status) => {\n      set$9(component.element, 'aria-selected', status);\n    };\n    const updateChecked = (component, ariaInfo, status) => {\n      set$9(component.element, 'aria-checked', status);\n    };\n    const updateExpanded = (component, ariaInfo, status) => {\n      set$9(component.element, 'aria-expanded', status);\n    };\n\n    var ToggleSchema = [\n      defaulted('selected', false),\n      option$3('toggleClass'),\n      defaulted('toggleOnExecute', true),\n      onHandler('onToggled'),\n      defaultedOf('aria', { mode: 'none' }, choose$1('mode', {\n        pressed: [\n          defaulted('syncWithExpanded', false),\n          output$1('update', updatePressed)\n        ],\n        checked: [output$1('update', updateChecked)],\n        expanded: [output$1('update', updateExpanded)],\n        selected: [output$1('update', updateSelected)],\n        none: [output$1('update', noop)]\n      }))\n    ];\n\n    const Toggling = create$4({\n      fields: ToggleSchema,\n      name: 'toggling',\n      active: ActiveToggle,\n      apis: ToggleApis,\n      state: SetupBehaviourCellState(false)\n    });\n\n    const pointerEvents = () => {\n      const onClick = (component, simulatedEvent) => {\n        simulatedEvent.stop();\n        emitExecute(component);\n      };\n      return [\n        run$1(click(), onClick),\n        run$1(tap(), onClick),\n        cutter(touchstart()),\n        cutter(mousedown())\n      ];\n    };\n    const events$a = optAction => {\n      const executeHandler = action => runOnExecute$1((component, simulatedEvent) => {\n        action(component);\n        simulatedEvent.stop();\n      });\n      return derive$2(flatten([\n        optAction.map(executeHandler).toArray(),\n        pointerEvents()\n      ]));\n    };\n\n    const hoverEvent = 'alloy.item-hover';\n    const focusEvent = 'alloy.item-focus';\n    const toggledEvent = 'alloy.item-toggled';\n    const onHover = item => {\n      if (search(item.element).isNone() || Focusing.isFocused(item)) {\n        if (!Focusing.isFocused(item)) {\n          Focusing.focus(item);\n        }\n        emitWith(item, hoverEvent, { item });\n      }\n    };\n    const onFocus$1 = item => {\n      emitWith(item, focusEvent, { item });\n    };\n    const onToggled = (item, state) => {\n      emitWith(item, toggledEvent, {\n        item,\n        state\n      });\n    };\n    const hover = constant$1(hoverEvent);\n    const focus$1 = constant$1(focusEvent);\n    const toggled = constant$1(toggledEvent);\n\n    const getItemRole = detail => detail.toggling.map(toggling => toggling.exclusive ? 'menuitemradio' : 'menuitemcheckbox').getOr('menuitem');\n    const getTogglingSpec = tConfig => ({\n      aria: { mode: 'checked' },\n      ...filter$1(tConfig, (_value, name) => name !== 'exclusive'),\n      onToggled: (component, state) => {\n        if (isFunction(tConfig.onToggled)) {\n          tConfig.onToggled(component, state);\n        }\n        onToggled(component, state);\n      }\n    });\n    const builder$2 = detail => ({\n      dom: detail.dom,\n      domModification: {\n        ...detail.domModification,\n        attributes: {\n          'role': getItemRole(detail),\n          ...detail.domModification.attributes,\n          'aria-haspopup': detail.hasSubmenu,\n          ...detail.hasSubmenu ? { 'aria-expanded': false } : {}\n        }\n      },\n      behaviours: SketchBehaviours.augment(detail.itemBehaviours, [\n        detail.toggling.fold(Toggling.revoke, tConfig => Toggling.config(getTogglingSpec(tConfig))),\n        Focusing.config({\n          ignore: detail.ignoreFocus,\n          stopMousedown: detail.ignoreFocus,\n          onFocus: component => {\n            onFocus$1(component);\n          }\n        }),\n        Keying.config({ mode: 'execution' }),\n        Representing.config({\n          store: {\n            mode: 'memory',\n            initialValue: detail.data\n          }\n        }),\n        config('item-type-events', [\n          ...pointerEvents(),\n          run$1(mouseover(), onHover),\n          run$1(focusItem(), Focusing.focus)\n        ])\n      ]),\n      components: detail.components,\n      eventOrder: detail.eventOrder\n    });\n    const schema$p = [\n      required$1('data'),\n      required$1('components'),\n      required$1('dom'),\n      defaulted('hasSubmenu', false),\n      option$3('toggling'),\n      SketchBehaviours.field('itemBehaviours', [\n        Toggling,\n        Focusing,\n        Keying,\n        Representing\n      ]),\n      defaulted('ignoreFocus', false),\n      defaulted('domModification', {}),\n      output$1('builder', builder$2),\n      defaulted('eventOrder', {})\n    ];\n\n    const builder$1 = detail => ({\n      dom: detail.dom,\n      components: detail.components,\n      events: derive$2([stopper(focusItem())])\n    });\n    const schema$o = [\n      required$1('dom'),\n      required$1('components'),\n      output$1('builder', builder$1)\n    ];\n\n    const owner$2 = constant$1('item-widget');\n    const parts$h = constant$1([required({\n        name: 'widget',\n        overrides: detail => {\n          return {\n            behaviours: derive$1([Representing.config({\n                store: {\n                  mode: 'manual',\n                  getValue: _component => {\n                    return detail.data;\n                  },\n                  setValue: noop\n                }\n              })])\n          };\n        }\n      })]);\n\n    const builder = detail => {\n      const subs = substitutes(owner$2(), detail, parts$h());\n      const components = components$1(owner$2(), detail, subs.internals());\n      const focusWidget = component => getPart(component, detail, 'widget').map(widget => {\n        Keying.focusIn(widget);\n        return widget;\n      });\n      const onHorizontalArrow = (component, simulatedEvent) => inside(simulatedEvent.event.target) ? Optional.none() : (() => {\n        if (detail.autofocus) {\n          simulatedEvent.setSource(component.element);\n          return Optional.none();\n        } else {\n          return Optional.none();\n        }\n      })();\n      return {\n        dom: detail.dom,\n        components,\n        domModification: detail.domModification,\n        events: derive$2([\n          runOnExecute$1((component, simulatedEvent) => {\n            focusWidget(component).each(_widget => {\n              simulatedEvent.stop();\n            });\n          }),\n          run$1(mouseover(), onHover),\n          run$1(focusItem(), (component, _simulatedEvent) => {\n            if (detail.autofocus) {\n              focusWidget(component);\n            } else {\n              Focusing.focus(component);\n            }\n          })\n        ]),\n        behaviours: SketchBehaviours.augment(detail.widgetBehaviours, [\n          Representing.config({\n            store: {\n              mode: 'memory',\n              initialValue: detail.data\n            }\n          }),\n          Focusing.config({\n            ignore: detail.ignoreFocus,\n            onFocus: component => {\n              onFocus$1(component);\n            }\n          }),\n          Keying.config({\n            mode: 'special',\n            focusIn: detail.autofocus ? component => {\n              focusWidget(component);\n            } : revoke(),\n            onLeft: onHorizontalArrow,\n            onRight: onHorizontalArrow,\n            onEscape: (component, simulatedEvent) => {\n              if (!Focusing.isFocused(component) && !detail.autofocus) {\n                Focusing.focus(component);\n                return Optional.some(true);\n              } else if (detail.autofocus) {\n                simulatedEvent.setSource(component.element);\n                return Optional.none();\n              } else {\n                return Optional.none();\n              }\n            }\n          })\n        ])\n      };\n    };\n    const schema$n = [\n      required$1('uid'),\n      required$1('data'),\n      required$1('components'),\n      required$1('dom'),\n      defaulted('autofocus', false),\n      defaulted('ignoreFocus', false),\n      SketchBehaviours.field('widgetBehaviours', [\n        Representing,\n        Focusing,\n        Keying\n      ]),\n      defaulted('domModification', {}),\n      defaultUidsSchema(parts$h()),\n      output$1('builder', builder)\n    ];\n\n    const itemSchema$2 = choose$1('type', {\n      widget: schema$n,\n      item: schema$p,\n      separator: schema$o\n    });\n    const configureGrid = (detail, movementInfo) => ({\n      mode: 'flatgrid',\n      selector: '.' + detail.markers.item,\n      initSize: {\n        numColumns: movementInfo.initSize.numColumns,\n        numRows: movementInfo.initSize.numRows\n      },\n      focusManager: detail.focusManager\n    });\n    const configureMatrix = (detail, movementInfo) => ({\n      mode: 'matrix',\n      selectors: {\n        row: movementInfo.rowSelector,\n        cell: '.' + detail.markers.item\n      },\n      previousSelector: movementInfo.previousSelector,\n      focusManager: detail.focusManager\n    });\n    const configureMenu = (detail, movementInfo) => ({\n      mode: 'menu',\n      selector: '.' + detail.markers.item,\n      moveOnTab: movementInfo.moveOnTab,\n      focusManager: detail.focusManager\n    });\n    const parts$g = constant$1([group({\n        factory: {\n          sketch: spec => {\n            const itemInfo = asRawOrDie$1('menu.spec item', itemSchema$2, spec);\n            return itemInfo.builder(itemInfo);\n          }\n        },\n        name: 'items',\n        unit: 'item',\n        defaults: (detail, u) => {\n          return has$2(u, 'uid') ? u : {\n            ...u,\n            uid: generate$5('item')\n          };\n        },\n        overrides: (detail, u) => {\n          return {\n            type: u.type,\n            ignoreFocus: detail.fakeFocus,\n            domModification: { classes: [detail.markers.item] }\n          };\n        }\n      })]);\n    const schema$m = constant$1([\n      required$1('value'),\n      required$1('items'),\n      required$1('dom'),\n      required$1('components'),\n      defaulted('eventOrder', {}),\n      field('menuBehaviours', [\n        Highlighting,\n        Representing,\n        Composing,\n        Keying\n      ]),\n      defaultedOf('movement', {\n        mode: 'menu',\n        moveOnTab: true\n      }, choose$1('mode', {\n        grid: [\n          initSize(),\n          output$1('config', configureGrid)\n        ],\n        matrix: [\n          output$1('config', configureMatrix),\n          required$1('rowSelector'),\n          defaulted('previousSelector', Optional.none)\n        ],\n        menu: [\n          defaulted('moveOnTab', true),\n          output$1('config', configureMenu)\n        ]\n      })),\n      itemMarkers(),\n      defaulted('fakeFocus', false),\n      defaulted('focusManager', dom$2()),\n      onHandler('onHighlight'),\n      onHandler('onDehighlight')\n    ]);\n\n    const focus = constant$1('alloy.menu-focus');\n\n    const deselectOtherRadioItems = (menu, item) => {\n      const checkedRadioItems = descendants(menu.element, '[role=\"menuitemradio\"][aria-checked=\"true\"]');\n      each$1(checkedRadioItems, ele => {\n        if (!eq(ele, item.element)) {\n          menu.getSystem().getByDom(ele).each(c => {\n            Toggling.off(c);\n          });\n        }\n      });\n    };\n    const make$7 = (detail, components, _spec, _externals) => ({\n      uid: detail.uid,\n      dom: detail.dom,\n      markers: detail.markers,\n      behaviours: augment(detail.menuBehaviours, [\n        Highlighting.config({\n          highlightClass: detail.markers.selectedItem,\n          itemClass: detail.markers.item,\n          onHighlight: detail.onHighlight,\n          onDehighlight: detail.onDehighlight\n        }),\n        Representing.config({\n          store: {\n            mode: 'memory',\n            initialValue: detail.value\n          }\n        }),\n        Composing.config({ find: Optional.some }),\n        Keying.config(detail.movement.config(detail, detail.movement))\n      ]),\n      events: derive$2([\n        run$1(focus$1(), (menu, simulatedEvent) => {\n          const event = simulatedEvent.event;\n          menu.getSystem().getByDom(event.target).each(item => {\n            Highlighting.highlight(menu, item);\n            simulatedEvent.stop();\n            emitWith(menu, focus(), {\n              menu,\n              item\n            });\n          });\n        }),\n        run$1(hover(), (menu, simulatedEvent) => {\n          const item = simulatedEvent.event.item;\n          Highlighting.highlight(menu, item);\n        }),\n        run$1(toggled(), (menu, simulatedEvent) => {\n          const {item, state} = simulatedEvent.event;\n          if (state && get$f(item.element, 'role') === 'menuitemradio') {\n            deselectOtherRadioItems(menu, item);\n          }\n        })\n      ]),\n      components,\n      eventOrder: detail.eventOrder,\n      domModification: { attributes: { role: 'menu' } }\n    });\n\n    const Menu = composite({\n      name: 'Menu',\n      configFields: schema$m(),\n      partFields: parts$g(),\n      factory: make$7\n    });\n\n    const transpose$1 = obj => tupleMap(obj, (v, k) => ({\n      k: v,\n      v: k\n    }));\n    const trace = (items, byItem, byMenu, finish) => get$g(byMenu, finish).bind(triggerItem => get$g(items, triggerItem).bind(triggerMenu => {\n      const rest = trace(items, byItem, byMenu, triggerMenu);\n      return Optional.some([triggerMenu].concat(rest));\n    })).getOr([]);\n    const generate$2 = (menus, expansions) => {\n      const items = {};\n      each(menus, (menuItems, menu) => {\n        each$1(menuItems, item => {\n          items[item] = menu;\n        });\n      });\n      const byItem = expansions;\n      const byMenu = transpose$1(expansions);\n      const menuPaths = map$1(byMenu, (_triggerItem, submenu) => [submenu].concat(trace(items, byItem, byMenu, submenu)));\n      return map$1(items, menu => get$g(menuPaths, menu).getOr([menu]));\n    };\n\n    const init$c = () => {\n      const expansions = Cell({});\n      const menus = Cell({});\n      const paths = Cell({});\n      const primary = value$2();\n      const directory = Cell({});\n      const clear = () => {\n        expansions.set({});\n        menus.set({});\n        paths.set({});\n        primary.clear();\n      };\n      const isClear = () => primary.get().isNone();\n      const setMenuBuilt = (menuName, built) => {\n        menus.set({\n          ...menus.get(),\n          [menuName]: {\n            type: 'prepared',\n            menu: built\n          }\n        });\n      };\n      const setContents = (sPrimary, sMenus, sExpansions, dir) => {\n        primary.set(sPrimary);\n        expansions.set(sExpansions);\n        menus.set(sMenus);\n        directory.set(dir);\n        const sPaths = generate$2(dir, sExpansions);\n        paths.set(sPaths);\n      };\n      const getTriggeringItem = menuValue => find$4(expansions.get(), (v, _k) => v === menuValue);\n      const getTriggerData = (menuValue, getItemByValue, path) => getPreparedMenu(menuValue).bind(menu => getTriggeringItem(menuValue).bind(triggeringItemValue => getItemByValue(triggeringItemValue).map(triggeredItem => ({\n        triggeredMenu: menu,\n        triggeringItem: triggeredItem,\n        triggeringPath: path\n      }))));\n      const getTriggeringPath = (itemValue, getItemByValue) => {\n        const extraPath = filter$2(lookupItem(itemValue).toArray(), menuValue => getPreparedMenu(menuValue).isSome());\n        return get$g(paths.get(), itemValue).bind(path => {\n          const revPath = reverse(extraPath.concat(path));\n          const triggers = bind$3(revPath, (menuValue, menuIndex) => getTriggerData(menuValue, getItemByValue, revPath.slice(0, menuIndex + 1)).fold(() => is$1(primary.get(), menuValue) ? [] : [Optional.none()], data => [Optional.some(data)]));\n          return sequence(triggers);\n        });\n      };\n      const expand = itemValue => get$g(expansions.get(), itemValue).map(menu => {\n        const current = get$g(paths.get(), itemValue).getOr([]);\n        return [menu].concat(current);\n      });\n      const collapse = itemValue => get$g(paths.get(), itemValue).bind(path => path.length > 1 ? Optional.some(path.slice(1)) : Optional.none());\n      const refresh = itemValue => get$g(paths.get(), itemValue);\n      const getPreparedMenu = menuValue => lookupMenu(menuValue).bind(extractPreparedMenu);\n      const lookupMenu = menuValue => get$g(menus.get(), menuValue);\n      const lookupItem = itemValue => get$g(expansions.get(), itemValue);\n      const otherMenus = path => {\n        const menuValues = directory.get();\n        return difference(keys(menuValues), path);\n      };\n      const getPrimary = () => primary.get().bind(getPreparedMenu);\n      const getMenus = () => menus.get();\n      return {\n        setMenuBuilt,\n        setContents,\n        expand,\n        refresh,\n        collapse,\n        lookupMenu,\n        lookupItem,\n        otherMenus,\n        getPrimary,\n        getMenus,\n        clear,\n        isClear,\n        getTriggeringPath\n      };\n    };\n    const extractPreparedMenu = prep => prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none();\n    const LayeredState = {\n      init: init$c,\n      extractPreparedMenu\n    };\n\n    const onMenuItemHighlightedEvent = generate$6('tiered-menu-item-highlight');\n    const onMenuItemDehighlightedEvent = generate$6('tiered-menu-item-dehighlight');\n\n    var HighlightOnOpen;\n    (function (HighlightOnOpen) {\n      HighlightOnOpen[HighlightOnOpen['HighlightMenuAndItem'] = 0] = 'HighlightMenuAndItem';\n      HighlightOnOpen[HighlightOnOpen['HighlightJustMenu'] = 1] = 'HighlightJustMenu';\n      HighlightOnOpen[HighlightOnOpen['HighlightNone'] = 2] = 'HighlightNone';\n    }(HighlightOnOpen || (HighlightOnOpen = {})));\n\n    const make$6 = (detail, _rawUiSpec) => {\n      const submenuParentItems = value$2();\n      const buildMenus = (container, primaryName, menus) => map$1(menus, (spec, name) => {\n        const makeSketch = () => Menu.sketch({\n          ...spec,\n          value: name,\n          markers: detail.markers,\n          fakeFocus: detail.fakeFocus,\n          onHighlight: (menuComp, itemComp) => {\n            const highlightData = {\n              menuComp,\n              itemComp\n            };\n            emitWith(menuComp, onMenuItemHighlightedEvent, highlightData);\n          },\n          onDehighlight: (menuComp, itemComp) => {\n            const dehighlightData = {\n              menuComp,\n              itemComp\n            };\n            emitWith(menuComp, onMenuItemDehighlightedEvent, dehighlightData);\n          },\n          focusManager: detail.fakeFocus ? highlights() : dom$2()\n        });\n        return name === primaryName ? {\n          type: 'prepared',\n          menu: container.getSystem().build(makeSketch())\n        } : {\n          type: 'notbuilt',\n          nbMenu: makeSketch\n        };\n      });\n      const layeredState = LayeredState.init();\n      const setup = container => {\n        const componentMap = buildMenus(container, detail.data.primary, detail.data.menus);\n        const directory = toDirectory();\n        layeredState.setContents(detail.data.primary, componentMap, detail.data.expansions, directory);\n        return layeredState.getPrimary();\n      };\n      const getItemValue = item => Representing.getValue(item).value;\n      const getItemByValue = (_container, menus, itemValue) => findMap(menus, menu => {\n        if (!menu.getSystem().isConnected()) {\n          return Optional.none();\n        }\n        const candidates = Highlighting.getCandidates(menu);\n        return find$5(candidates, c => getItemValue(c) === itemValue);\n      });\n      const toDirectory = _container => map$1(detail.data.menus, (data, _menuName) => bind$3(data.items, item => item.type === 'separator' ? [] : [item.data.value]));\n      const setActiveMenu = Highlighting.highlight;\n      const setActiveMenuAndItem = (container, menu) => {\n        setActiveMenu(container, menu);\n        Highlighting.getHighlighted(menu).orThunk(() => Highlighting.getFirst(menu)).each(item => {\n          if (detail.fakeFocus) {\n            Highlighting.highlight(menu, item);\n          } else {\n            dispatch(container, item.element, focusItem());\n          }\n        });\n      };\n      const getMenus = (state, menuValues) => cat(map$2(menuValues, mv => state.lookupMenu(mv).bind(prep => prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none())));\n      const closeOthers = (container, state, path) => {\n        const others = getMenus(state, state.otherMenus(path));\n        each$1(others, o => {\n          remove$1(o.element, [detail.markers.backgroundMenu]);\n          if (!detail.stayInDom) {\n            Replacing.remove(container, o);\n          }\n        });\n      };\n      const getSubmenuParents = container => submenuParentItems.get().getOrThunk(() => {\n        const r = {};\n        const items = descendants(container.element, `.${ detail.markers.item }`);\n        const parentItems = filter$2(items, i => get$f(i, 'aria-haspopup') === 'true');\n        each$1(parentItems, i => {\n          container.getSystem().getByDom(i).each(itemComp => {\n            const key = getItemValue(itemComp);\n            r[key] = itemComp;\n          });\n        });\n        submenuParentItems.set(r);\n        return r;\n      });\n      const updateAriaExpansions = (container, path) => {\n        const parentItems = getSubmenuParents(container);\n        each(parentItems, (v, k) => {\n          const expanded = contains$2(path, k);\n          set$9(v.element, 'aria-expanded', expanded);\n        });\n      };\n      const updateMenuPath = (container, state, path) => Optional.from(path[0]).bind(latestMenuName => state.lookupMenu(latestMenuName).bind(menuPrep => {\n        if (menuPrep.type === 'notbuilt') {\n          return Optional.none();\n        } else {\n          const activeMenu = menuPrep.menu;\n          const rest = getMenus(state, path.slice(1));\n          each$1(rest, r => {\n            add$2(r.element, detail.markers.backgroundMenu);\n          });\n          if (!inBody(activeMenu.element)) {\n            Replacing.append(container, premade(activeMenu));\n          }\n          remove$1(activeMenu.element, [detail.markers.backgroundMenu]);\n          setActiveMenuAndItem(container, activeMenu);\n          closeOthers(container, state, path);\n          return Optional.some(activeMenu);\n        }\n      }));\n      let ExpandHighlightDecision;\n      (function (ExpandHighlightDecision) {\n        ExpandHighlightDecision[ExpandHighlightDecision['HighlightSubmenu'] = 0] = 'HighlightSubmenu';\n        ExpandHighlightDecision[ExpandHighlightDecision['HighlightParent'] = 1] = 'HighlightParent';\n      }(ExpandHighlightDecision || (ExpandHighlightDecision = {})));\n      const buildIfRequired = (container, menuName, menuPrep) => {\n        if (menuPrep.type === 'notbuilt') {\n          const menu = container.getSystem().build(menuPrep.nbMenu());\n          layeredState.setMenuBuilt(menuName, menu);\n          return menu;\n        } else {\n          return menuPrep.menu;\n        }\n      };\n      const expandRight = (container, item, decision = ExpandHighlightDecision.HighlightSubmenu) => {\n        if (item.hasConfigured(Disabling) && Disabling.isDisabled(item)) {\n          return Optional.some(item);\n        } else {\n          const value = getItemValue(item);\n          return layeredState.expand(value).bind(path => {\n            updateAriaExpansions(container, path);\n            return Optional.from(path[0]).bind(menuName => layeredState.lookupMenu(menuName).bind(activeMenuPrep => {\n              const activeMenu = buildIfRequired(container, menuName, activeMenuPrep);\n              if (!inBody(activeMenu.element)) {\n                Replacing.append(container, premade(activeMenu));\n              }\n              detail.onOpenSubmenu(container, item, activeMenu, reverse(path));\n              if (decision === ExpandHighlightDecision.HighlightSubmenu) {\n                Highlighting.highlightFirst(activeMenu);\n                return updateMenuPath(container, layeredState, path);\n              } else {\n                Highlighting.dehighlightAll(activeMenu);\n                return Optional.some(item);\n              }\n            }));\n          });\n        }\n      };\n      const collapseLeft = (container, item) => {\n        const value = getItemValue(item);\n        return layeredState.collapse(value).bind(path => {\n          updateAriaExpansions(container, path);\n          return updateMenuPath(container, layeredState, path).map(activeMenu => {\n            detail.onCollapseMenu(container, item, activeMenu);\n            return activeMenu;\n          });\n        });\n      };\n      const updateView = (container, item) => {\n        const value = getItemValue(item);\n        return layeredState.refresh(value).bind(path => {\n          updateAriaExpansions(container, path);\n          return updateMenuPath(container, layeredState, path);\n        });\n      };\n      const onRight = (container, item) => inside(item.element) ? Optional.none() : expandRight(container, item, ExpandHighlightDecision.HighlightSubmenu);\n      const onLeft = (container, item) => inside(item.element) ? Optional.none() : collapseLeft(container, item);\n      const onEscape = (container, item) => collapseLeft(container, item).orThunk(() => detail.onEscape(container, item).map(() => container));\n      const keyOnItem = f => (container, simulatedEvent) => {\n        return closest$1(simulatedEvent.getSource(), `.${ detail.markers.item }`).bind(target => container.getSystem().getByDom(target).toOptional().bind(item => f(container, item).map(always)));\n      };\n      const events = derive$2([\n        run$1(focus(), (tmenu, simulatedEvent) => {\n          const item = simulatedEvent.event.item;\n          layeredState.lookupItem(getItemValue(item)).each(() => {\n            const menu = simulatedEvent.event.menu;\n            Highlighting.highlight(tmenu, menu);\n            const value = getItemValue(simulatedEvent.event.item);\n            layeredState.refresh(value).each(path => closeOthers(tmenu, layeredState, path));\n          });\n        }),\n        runOnExecute$1((component, simulatedEvent) => {\n          const target = simulatedEvent.event.target;\n          component.getSystem().getByDom(target).each(item => {\n            const itemValue = getItemValue(item);\n            if (itemValue.indexOf('collapse-item') === 0) {\n              collapseLeft(component, item);\n            }\n            expandRight(component, item, ExpandHighlightDecision.HighlightSubmenu).fold(() => {\n              detail.onExecute(component, item);\n            }, noop);\n          });\n        }),\n        runOnAttached((container, _simulatedEvent) => {\n          setup(container).each(primary => {\n            Replacing.append(container, premade(primary));\n            detail.onOpenMenu(container, primary);\n            if (detail.highlightOnOpen === HighlightOnOpen.HighlightMenuAndItem) {\n              setActiveMenuAndItem(container, primary);\n            } else if (detail.highlightOnOpen === HighlightOnOpen.HighlightJustMenu) {\n              setActiveMenu(container, primary);\n            }\n          });\n        }),\n        run$1(onMenuItemHighlightedEvent, (tmenuComp, se) => {\n          detail.onHighlightItem(tmenuComp, se.event.menuComp, se.event.itemComp);\n        }),\n        run$1(onMenuItemDehighlightedEvent, (tmenuComp, se) => {\n          detail.onDehighlightItem(tmenuComp, se.event.menuComp, se.event.itemComp);\n        }),\n        ...detail.navigateOnHover ? [run$1(hover(), (tmenu, simulatedEvent) => {\n            const item = simulatedEvent.event.item;\n            updateView(tmenu, item);\n            expandRight(tmenu, item, ExpandHighlightDecision.HighlightParent);\n            detail.onHover(tmenu, item);\n          })] : []\n      ]);\n      const getActiveItem = container => Highlighting.getHighlighted(container).bind(Highlighting.getHighlighted);\n      const collapseMenuApi = container => {\n        getActiveItem(container).each(currentItem => {\n          collapseLeft(container, currentItem);\n        });\n      };\n      const highlightPrimary = container => {\n        layeredState.getPrimary().each(primary => {\n          setActiveMenuAndItem(container, primary);\n        });\n      };\n      const extractMenuFromContainer = container => Optional.from(container.components()[0]).filter(comp => get$f(comp.element, 'role') === 'menu');\n      const repositionMenus = container => {\n        const maybeActivePrimary = layeredState.getPrimary().bind(primary => getActiveItem(container).bind(currentItem => {\n          const itemValue = getItemValue(currentItem);\n          const allMenus = values(layeredState.getMenus());\n          const preparedMenus = cat(map$2(allMenus, LayeredState.extractPreparedMenu));\n          return layeredState.getTriggeringPath(itemValue, v => getItemByValue(container, preparedMenus, v));\n        }).map(triggeringPath => ({\n          primary,\n          triggeringPath\n        })));\n        maybeActivePrimary.fold(() => {\n          extractMenuFromContainer(container).each(primaryMenu => {\n            detail.onRepositionMenu(container, primaryMenu, []);\n          });\n        }, ({primary, triggeringPath}) => {\n          detail.onRepositionMenu(container, primary, triggeringPath);\n        });\n      };\n      const apis = {\n        collapseMenu: collapseMenuApi,\n        highlightPrimary,\n        repositionMenus\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        markers: detail.markers,\n        behaviours: augment(detail.tmenuBehaviours, [\n          Keying.config({\n            mode: 'special',\n            onRight: keyOnItem(onRight),\n            onLeft: keyOnItem(onLeft),\n            onEscape: keyOnItem(onEscape),\n            focusIn: (container, _keyInfo) => {\n              layeredState.getPrimary().each(primary => {\n                dispatch(container, primary.element, focusItem());\n              });\n            }\n          }),\n          Highlighting.config({\n            highlightClass: detail.markers.selectedMenu,\n            itemClass: detail.markers.menu\n          }),\n          Composing.config({\n            find: container => {\n              return Highlighting.getHighlighted(container);\n            }\n          }),\n          Replacing.config({})\n        ]),\n        eventOrder: detail.eventOrder,\n        apis,\n        events\n      };\n    };\n    const collapseItem$1 = constant$1('collapse-item');\n\n    const tieredData = (primary, menus, expansions) => ({\n      primary,\n      menus,\n      expansions\n    });\n    const singleData = (name, menu) => ({\n      primary: name,\n      menus: wrap$1(name, menu),\n      expansions: {}\n    });\n    const collapseItem = text => ({\n      value: generate$6(collapseItem$1()),\n      meta: { text }\n    });\n    const tieredMenu = single({\n      name: 'TieredMenu',\n      configFields: [\n        onStrictKeyboardHandler('onExecute'),\n        onStrictKeyboardHandler('onEscape'),\n        onStrictHandler('onOpenMenu'),\n        onStrictHandler('onOpenSubmenu'),\n        onHandler('onRepositionMenu'),\n        onHandler('onCollapseMenu'),\n        defaulted('highlightOnOpen', HighlightOnOpen.HighlightMenuAndItem),\n        requiredObjOf('data', [\n          required$1('primary'),\n          required$1('menus'),\n          required$1('expansions')\n        ]),\n        defaulted('fakeFocus', false),\n        onHandler('onHighlightItem'),\n        onHandler('onDehighlightItem'),\n        onHandler('onHover'),\n        tieredMenuMarkers(),\n        required$1('dom'),\n        defaulted('navigateOnHover', true),\n        defaulted('stayInDom', false),\n        field('tmenuBehaviours', [\n          Keying,\n          Highlighting,\n          Composing,\n          Replacing\n        ]),\n        defaulted('eventOrder', {})\n      ],\n      apis: {\n        collapseMenu: (apis, tmenu) => {\n          apis.collapseMenu(tmenu);\n        },\n        highlightPrimary: (apis, tmenu) => {\n          apis.highlightPrimary(tmenu);\n        },\n        repositionMenus: (apis, tmenu) => {\n          apis.repositionMenus(tmenu);\n        }\n      },\n      factory: make$6,\n      extraApis: {\n        tieredData,\n        singleData,\n        collapseItem\n      }\n    });\n\n    const makeMenu = (detail, menuSandbox, placementSpec, menuSpec, getBounds) => {\n      const lazySink = () => detail.lazySink(menuSandbox);\n      const layouts = menuSpec.type === 'horizontal' ? {\n        layouts: {\n          onLtr: () => belowOrAbove(),\n          onRtl: () => belowOrAboveRtl()\n        }\n      } : {};\n      const isFirstTierSubmenu = triggeringPaths => triggeringPaths.length === 2;\n      const getSubmenuLayouts = triggeringPaths => isFirstTierSubmenu(triggeringPaths) ? layouts : {};\n      return tieredMenu.sketch({\n        dom: { tag: 'div' },\n        data: menuSpec.data,\n        markers: menuSpec.menu.markers,\n        highlightOnOpen: menuSpec.menu.highlightOnOpen,\n        fakeFocus: menuSpec.menu.fakeFocus,\n        onEscape: () => {\n          Sandboxing.close(menuSandbox);\n          detail.onEscape.map(handler => handler(menuSandbox));\n          return Optional.some(true);\n        },\n        onExecute: () => {\n          return Optional.some(true);\n        },\n        onOpenMenu: (tmenu, menu) => {\n          Positioning.positionWithinBounds(lazySink().getOrDie(), menu, placementSpec, getBounds());\n        },\n        onOpenSubmenu: (tmenu, item, submenu, triggeringPaths) => {\n          const sink = lazySink().getOrDie();\n          Positioning.position(sink, submenu, {\n            anchor: {\n              type: 'submenu',\n              item,\n              ...getSubmenuLayouts(triggeringPaths)\n            }\n          });\n        },\n        onRepositionMenu: (tmenu, primaryMenu, submenuTriggers) => {\n          const sink = lazySink().getOrDie();\n          Positioning.positionWithinBounds(sink, primaryMenu, placementSpec, getBounds());\n          each$1(submenuTriggers, st => {\n            const submenuLayouts = getSubmenuLayouts(st.triggeringPath);\n            Positioning.position(sink, st.triggeredMenu, {\n              anchor: {\n                type: 'submenu',\n                item: st.triggeringItem,\n                ...submenuLayouts\n              }\n            });\n          });\n        }\n      });\n    };\n    const factory$o = (detail, spec) => {\n      const isPartOfRelated = (sandbox, queryElem) => {\n        const related = detail.getRelated(sandbox);\n        return related.exists(rel => isPartOf$1(rel, queryElem));\n      };\n      const setContent = (sandbox, thing) => {\n        Sandboxing.setContent(sandbox, thing);\n      };\n      const showAt = (sandbox, thing, placementSpec) => {\n        const getBounds = Optional.none;\n        showWithinBounds(sandbox, thing, placementSpec, getBounds);\n      };\n      const showWithinBounds = (sandbox, thing, placementSpec, getBounds) => {\n        const sink = detail.lazySink(sandbox).getOrDie();\n        Sandboxing.openWhileCloaked(sandbox, thing, () => Positioning.positionWithinBounds(sink, sandbox, placementSpec, getBounds()));\n        Representing.setValue(sandbox, Optional.some({\n          mode: 'position',\n          config: placementSpec,\n          getBounds\n        }));\n      };\n      const showMenuAt = (sandbox, placementSpec, menuSpec) => {\n        showMenuWithinBounds(sandbox, placementSpec, menuSpec, Optional.none);\n      };\n      const showMenuWithinBounds = (sandbox, placementSpec, menuSpec, getBounds) => {\n        const menu = makeMenu(detail, sandbox, placementSpec, menuSpec, getBounds);\n        Sandboxing.open(sandbox, menu);\n        Representing.setValue(sandbox, Optional.some({\n          mode: 'menu',\n          menu\n        }));\n      };\n      const hide = sandbox => {\n        if (Sandboxing.isOpen(sandbox)) {\n          Representing.setValue(sandbox, Optional.none());\n          Sandboxing.close(sandbox);\n        }\n      };\n      const getContent = sandbox => Sandboxing.getState(sandbox);\n      const reposition = sandbox => {\n        if (Sandboxing.isOpen(sandbox)) {\n          Representing.getValue(sandbox).each(state => {\n            switch (state.mode) {\n            case 'menu':\n              Sandboxing.getState(sandbox).each(tieredMenu.repositionMenus);\n              break;\n            case 'position':\n              const sink = detail.lazySink(sandbox).getOrDie();\n              Positioning.positionWithinBounds(sink, sandbox, state.config, state.getBounds());\n              break;\n            }\n          });\n        }\n      };\n      const apis = {\n        setContent,\n        showAt,\n        showWithinBounds,\n        showMenuAt,\n        showMenuWithinBounds,\n        hide,\n        getContent,\n        reposition,\n        isOpen: Sandboxing.isOpen\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        behaviours: augment(detail.inlineBehaviours, [\n          Sandboxing.config({\n            isPartOf: (sandbox, data, queryElem) => {\n              return isPartOf$1(data, queryElem) || isPartOfRelated(sandbox, queryElem);\n            },\n            getAttachPoint: sandbox => {\n              return detail.lazySink(sandbox).getOrDie();\n            },\n            onOpen: sandbox => {\n              detail.onShow(sandbox);\n            },\n            onClose: sandbox => {\n              detail.onHide(sandbox);\n            }\n          }),\n          Representing.config({\n            store: {\n              mode: 'memory',\n              initialValue: Optional.none()\n            }\n          }),\n          Receiving.config({\n            channels: {\n              ...receivingChannel$1({\n                isExtraPart: spec.isExtraPart,\n                ...detail.fireDismissalEventInstead.map(fe => ({ fireEventInstead: { event: fe.event } })).getOr({})\n              }),\n              ...receivingChannel({\n                ...detail.fireRepositionEventInstead.map(fe => ({ fireEventInstead: { event: fe.event } })).getOr({}),\n                doReposition: reposition\n              })\n            }\n          })\n        ]),\n        eventOrder: detail.eventOrder,\n        apis\n      };\n    };\n    const InlineView = single({\n      name: 'InlineView',\n      configFields: [\n        required$1('lazySink'),\n        onHandler('onShow'),\n        onHandler('onHide'),\n        optionFunction('onEscape'),\n        field('inlineBehaviours', [\n          Sandboxing,\n          Representing,\n          Receiving\n        ]),\n        optionObjOf('fireDismissalEventInstead', [defaulted('event', dismissRequested())]),\n        optionObjOf('fireRepositionEventInstead', [defaulted('event', repositionRequested())]),\n        defaulted('getRelated', Optional.none),\n        defaulted('isExtraPart', never),\n        defaulted('eventOrder', Optional.none)\n      ],\n      factory: factory$o,\n      apis: {\n        showAt: (apis, component, anchor, thing) => {\n          apis.showAt(component, anchor, thing);\n        },\n        showWithinBounds: (apis, component, anchor, thing, bounds) => {\n          apis.showWithinBounds(component, anchor, thing, bounds);\n        },\n        showMenuAt: (apis, component, anchor, menuSpec) => {\n          apis.showMenuAt(component, anchor, menuSpec);\n        },\n        showMenuWithinBounds: (apis, component, anchor, menuSpec, bounds) => {\n          apis.showMenuWithinBounds(component, anchor, menuSpec, bounds);\n        },\n        hide: (apis, component) => {\n          apis.hide(component);\n        },\n        isOpen: (apis, component) => apis.isOpen(component),\n        getContent: (apis, component) => apis.getContent(component),\n        setContent: (apis, component, thing) => {\n          apis.setContent(component, thing);\n        },\n        reposition: (apis, component) => {\n          apis.reposition(component);\n        }\n      }\n    });\n\n    var global$9 = hugerte.util.Tools.resolve('hugerte.util.Delay');\n\n    const factory$n = detail => {\n      const events = events$a(detail.action);\n      const tag = detail.dom.tag;\n      const lookupAttr = attr => get$g(detail.dom, 'attributes').bind(attrs => get$g(attrs, attr));\n      const getModAttributes = () => {\n        if (tag === 'button') {\n          const type = lookupAttr('type').getOr('button');\n          const roleAttrs = lookupAttr('role').map(role => ({ role })).getOr({});\n          return {\n            type,\n            ...roleAttrs\n          };\n        } else {\n          const role = detail.role.getOr(lookupAttr('role').getOr('button'));\n          return { role };\n        }\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: detail.components,\n        events,\n        behaviours: SketchBehaviours.augment(detail.buttonBehaviours, [\n          Focusing.config({}),\n          Keying.config({\n            mode: 'execution',\n            useSpace: true,\n            useEnter: true\n          })\n        ]),\n        domModification: { attributes: getModAttributes() },\n        eventOrder: detail.eventOrder\n      };\n    };\n    const Button = single({\n      name: 'Button',\n      factory: factory$n,\n      configFields: [\n        defaulted('uid', undefined),\n        required$1('dom'),\n        defaulted('components', []),\n        SketchBehaviours.field('buttonBehaviours', [\n          Focusing,\n          Keying\n        ]),\n        option$3('action'),\n        option$3('role'),\n        defaulted('eventOrder', {})\n      ]\n    });\n\n    const getAttrs = elem => {\n      const attributes = elem.dom.attributes !== undefined ? elem.dom.attributes : [];\n      return foldl(attributes, (b, attr) => {\n        if (attr.name === 'class') {\n          return b;\n        } else {\n          return {\n            ...b,\n            [attr.name]: attr.value\n          };\n        }\n      }, {});\n    };\n    const getClasses = elem => Array.prototype.slice.call(elem.dom.classList, 0);\n    const fromHtml = html => {\n      const elem = SugarElement.fromHtml(html);\n      const children$1 = children(elem);\n      const attrs = getAttrs(elem);\n      const classes = getClasses(elem);\n      const contents = children$1.length === 0 ? {} : { innerHtml: get$9(elem) };\n      return {\n        tag: name$3(elem),\n        classes,\n        attributes: attrs,\n        ...contents\n      };\n    };\n\n    const record = spec => {\n      const uid = isSketchSpec(spec) && hasNonNullableKey(spec, 'uid') ? spec.uid : generate$5('memento');\n      const get = anyInSystem => anyInSystem.getSystem().getByUid(uid).getOrDie();\n      const getOpt = anyInSystem => anyInSystem.getSystem().getByUid(uid).toOptional();\n      const asSpec = () => ({\n        ...spec,\n        uid\n      });\n      return {\n        get,\n        getOpt,\n        asSpec\n      };\n    };\n\n    /*! @license DOMPurify 3.2.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.4/LICENSE */\n\n    const {\n      entries,\n      setPrototypeOf,\n      isFrozen,\n      getPrototypeOf,\n      getOwnPropertyDescriptor\n    } = Object;\n    let {\n      freeze,\n      seal,\n      create: create$1\n    } = Object; // eslint-disable-line import/no-mutable-exports\n    let {\n      apply,\n      construct\n    } = typeof Reflect !== 'undefined' && Reflect;\n    if (!freeze) {\n      freeze = function freeze(x) {\n        return x;\n      };\n    }\n    if (!seal) {\n      seal = function seal(x) {\n        return x;\n      };\n    }\n    if (!apply) {\n      apply = function apply(fun, thisValue, args) {\n        return fun.apply(thisValue, args);\n      };\n    }\n    if (!construct) {\n      construct = function construct(Func, args) {\n        return new Func(...args);\n      };\n    }\n    const arrayForEach = unapply(Array.prototype.forEach);\n    const arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\n    const arrayPop = unapply(Array.prototype.pop);\n    const arrayPush = unapply(Array.prototype.push);\n    const arraySplice = unapply(Array.prototype.splice);\n    const stringToLowerCase = unapply(String.prototype.toLowerCase);\n    const stringToString = unapply(String.prototype.toString);\n    const stringMatch = unapply(String.prototype.match);\n    const stringReplace = unapply(String.prototype.replace);\n    const stringIndexOf = unapply(String.prototype.indexOf);\n    const stringTrim = unapply(String.prototype.trim);\n    const objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\n    const regExpTest = unapply(RegExp.prototype.test);\n    const typeErrorCreate = unconstruct(TypeError);\n    /**\n     * Creates a new function that calls the given function with a specified thisArg and arguments.\n     *\n     * @param func - The function to be wrapped and called.\n     * @returns A new function that calls the given function with a specified thisArg and arguments.\n     */\n    function unapply(func) {\n      return function (thisArg) {\n        for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n          args[_key - 1] = arguments[_key];\n        }\n        return apply(func, thisArg, args);\n      };\n    }\n    /**\n     * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n     *\n     * @param func - The constructor function to be wrapped and called.\n     * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n     */\n    function unconstruct(func) {\n      return function () {\n        for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n          args[_key2] = arguments[_key2];\n        }\n        return construct(func, args);\n      };\n    }\n    /**\n     * Add properties to a lookup table\n     *\n     * @param set - The set to which elements will be added.\n     * @param array - The array containing elements to be added to the set.\n     * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n     * @returns The modified set with added elements.\n     */\n    function addToSet(set, array) {\n      let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n      if (setPrototypeOf) {\n        // Make 'in' and truthy checks like Boolean(set.constructor)\n        // independent of any properties defined on Object.prototype.\n        // Prevent prototype setters from intercepting set as a this value.\n        setPrototypeOf(set, null);\n      }\n      let l = array.length;\n      while (l--) {\n        let element = array[l];\n        if (typeof element === 'string') {\n          const lcElement = transformCaseFunc(element);\n          if (lcElement !== element) {\n            // Config presets (e.g. tags.js, attrs.js) are immutable.\n            if (!isFrozen(array)) {\n              array[l] = lcElement;\n            }\n            element = lcElement;\n          }\n        }\n        set[element] = true;\n      }\n      return set;\n    }\n    /**\n     * Clean up an array to harden against CSPP\n     *\n     * @param array - The array to be cleaned.\n     * @returns The cleaned version of the array\n     */\n    function cleanArray(array) {\n      for (let index = 0; index < array.length; index++) {\n        const isPropertyExist = objectHasOwnProperty(array, index);\n        if (!isPropertyExist) {\n          array[index] = null;\n        }\n      }\n      return array;\n    }\n    /**\n     * Shallow clone an object\n     *\n     * @param object - The object to be cloned.\n     * @returns A new object that copies the original.\n     */\n    function clone(object) {\n      const newObject = create$1(null);\n      for (const [property, value] of entries(object)) {\n        const isPropertyExist = objectHasOwnProperty(object, property);\n        if (isPropertyExist) {\n          if (Array.isArray(value)) {\n            newObject[property] = cleanArray(value);\n          } else if (value && typeof value === 'object' && value.constructor === Object) {\n            newObject[property] = clone(value);\n          } else {\n            newObject[property] = value;\n          }\n        }\n      }\n      return newObject;\n    }\n    /**\n     * This method automatically checks if the prop is function or getter and behaves accordingly.\n     *\n     * @param object - The object to look up the getter function in its prototype chain.\n     * @param prop - The property name for which to find the getter function.\n     * @returns The getter function found in the prototype chain or a fallback function.\n     */\n    function lookupGetter(object, prop) {\n      while (object !== null) {\n        const desc = getOwnPropertyDescriptor(object, prop);\n        if (desc) {\n          if (desc.get) {\n            return unapply(desc.get);\n          }\n          if (typeof desc.value === 'function') {\n            return unapply(desc.value);\n          }\n        }\n        object = getPrototypeOf(object);\n      }\n      function fallbackValue() {\n        return null;\n      }\n      return fallbackValue;\n    }\n\n    const html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\n    const svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\n    const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n    // List of SVG elements that are disallowed by default.\n    // We still need to know them so that we can do namespace\n    // checks properly in case one wants to add them to\n    // allow-list.\n    const svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\n    const mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n    // Similarly to SVG, we want to know all MathML elements,\n    // even those that we disallow by default.\n    const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\n    const text$1 = freeze(['#text']);\n\n    const html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);\n    const svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\n    const mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\n    const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n    // eslint-disable-next-line unicorn/better-regex\n    const MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\n    const ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\n    const TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\n    const DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\n    const ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\n    const IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n    );\n    const IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\n    const ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n    );\n    const DOCTYPE_NAME = seal(/^html$/i);\n    const CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\n    var EXPRESSIONS = /*#__PURE__*/Object.freeze({\n      __proto__: null,\n      ARIA_ATTR: ARIA_ATTR,\n      ATTR_WHITESPACE: ATTR_WHITESPACE,\n      CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n      DATA_ATTR: DATA_ATTR,\n      DOCTYPE_NAME: DOCTYPE_NAME,\n      ERB_EXPR: ERB_EXPR,\n      IS_ALLOWED_URI: IS_ALLOWED_URI,\n      IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n      MUSTACHE_EXPR: MUSTACHE_EXPR,\n      TMPLIT_EXPR: TMPLIT_EXPR\n    });\n\n    /* eslint-disable @typescript-eslint/indent */\n    // https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n    const NODE_TYPE = {\n      element: 1,\n      attribute: 2,\n      text: 3,\n      cdataSection: 4,\n      entityReference: 5,\n      // Deprecated\n      entityNode: 6,\n      // Deprecated\n      progressingInstruction: 7,\n      comment: 8,\n      document: 9,\n      documentType: 10,\n      documentFragment: 11,\n      notation: 12 // Deprecated\n    };\n    const getGlobal = function getGlobal() {\n      return typeof window === 'undefined' ? null : window;\n    };\n    /**\n     * Creates a no-op policy for internal use only.\n     * Don't export this function outside this module!\n     * @param trustedTypes The policy factory.\n     * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n     * @return The policy created (or null, if Trusted Types\n     * are not supported or creating the policy failed).\n     */\n    const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n      if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n        return null;\n      }\n      // Allow the callers to control the unique policy name\n      // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n      // Policy creation with duplicate names throws in Trusted Types.\n      let suffix = null;\n      const ATTR_NAME = 'data-tt-policy-suffix';\n      if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n        suffix = purifyHostElement.getAttribute(ATTR_NAME);\n      }\n      const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n      try {\n        return trustedTypes.createPolicy(policyName, {\n          createHTML(html) {\n            return html;\n          },\n          createScriptURL(scriptUrl) {\n            return scriptUrl;\n          }\n        });\n      } catch (_) {\n        // Policy creation failed (most likely another DOMPurify script has\n        // already run). Skip creating the policy, as this will only cause errors\n        // if TT are enforced.\n        console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n        return null;\n      }\n    };\n    const _createHooksMap = function _createHooksMap() {\n      return {\n        afterSanitizeAttributes: [],\n        afterSanitizeElements: [],\n        afterSanitizeShadowDOM: [],\n        beforeSanitizeAttributes: [],\n        beforeSanitizeElements: [],\n        beforeSanitizeShadowDOM: [],\n        uponSanitizeAttribute: [],\n        uponSanitizeElement: [],\n        uponSanitizeShadowNode: []\n      };\n    };\n    function createDOMPurify() {\n      let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n      const DOMPurify = root => createDOMPurify(root);\n      DOMPurify.version = '3.2.4';\n      DOMPurify.removed = [];\n      if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n        // Not running in a browser, provide a factory function\n        // so that you can pass your own Window\n        DOMPurify.isSupported = false;\n        return DOMPurify;\n      }\n      let {\n        document\n      } = window;\n      const originalDocument = document;\n      const currentScript = originalDocument.currentScript;\n      const {\n        DocumentFragment,\n        HTMLTemplateElement,\n        Node,\n        Element,\n        NodeFilter,\n        NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n        HTMLFormElement,\n        DOMParser,\n        trustedTypes\n      } = window;\n      const ElementPrototype = Element.prototype;\n      const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n      const remove = lookupGetter(ElementPrototype, 'remove');\n      const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n      const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n      const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n      // As per issue #47, the web-components registry is inherited by a\n      // new document created via createHTMLDocument. As per the spec\n      // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n      // a new empty registry is used when creating a template contents owner\n      // document, so we use that as our parent document to ensure nothing\n      // is inherited.\n      if (typeof HTMLTemplateElement === 'function') {\n        const template = document.createElement('template');\n        if (template.content && template.content.ownerDocument) {\n          document = template.content.ownerDocument;\n        }\n      }\n      let trustedTypesPolicy;\n      let emptyHTML = '';\n      const {\n        implementation,\n        createNodeIterator,\n        createDocumentFragment,\n        getElementsByTagName\n      } = document;\n      const {\n        importNode\n      } = originalDocument;\n      let hooks = _createHooksMap();\n      /**\n       * Expose whether this browser supports running the full DOMPurify.\n       */\n      DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n      const {\n        MUSTACHE_EXPR,\n        ERB_EXPR,\n        TMPLIT_EXPR,\n        DATA_ATTR,\n        ARIA_ATTR,\n        IS_SCRIPT_OR_DATA,\n        ATTR_WHITESPACE,\n        CUSTOM_ELEMENT\n      } = EXPRESSIONS;\n      let {\n        IS_ALLOWED_URI: IS_ALLOWED_URI$1\n      } = EXPRESSIONS;\n      /**\n       * We consider the elements and attributes below to be safe. Ideally\n       * don't add any new ones but feel free to remove unwanted ones.\n       */\n      /* allowed element names */\n      let ALLOWED_TAGS = null;\n      const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text$1]);\n      /* Allowed attribute names */\n      let ALLOWED_ATTR = null;\n      const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n      /*\n       * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n       * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n       * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n       * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n       */\n      let CUSTOM_ELEMENT_HANDLING = Object.seal(create$1(null, {\n        tagNameCheck: {\n          writable: true,\n          configurable: false,\n          enumerable: true,\n          value: null\n        },\n        attributeNameCheck: {\n          writable: true,\n          configurable: false,\n          enumerable: true,\n          value: null\n        },\n        allowCustomizedBuiltInElements: {\n          writable: true,\n          configurable: false,\n          enumerable: true,\n          value: false\n        }\n      }));\n      /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n      let FORBID_TAGS = null;\n      /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n      let FORBID_ATTR = null;\n      /* Decide if ARIA attributes are okay */\n      let ALLOW_ARIA_ATTR = true;\n      /* Decide if custom data attributes are okay */\n      let ALLOW_DATA_ATTR = true;\n      /* Decide if unknown protocols are okay */\n      let ALLOW_UNKNOWN_PROTOCOLS = false;\n      /* Decide if self-closing tags in attributes are allowed.\n       * Usually removed due to a mXSS issue in jQuery 3.0 */\n      let ALLOW_SELF_CLOSE_IN_ATTR = true;\n      /* Output should be safe for common template engines.\n       * This means, DOMPurify removes data attributes, mustaches and ERB\n       */\n      let SAFE_FOR_TEMPLATES = false;\n      /* Output should be safe even for XML used within HTML and alike.\n       * This means, DOMPurify removes comments when containing risky content.\n       */\n      let SAFE_FOR_XML = true;\n      /* Decide if document with <html>... should be returned */\n      let WHOLE_DOCUMENT = false;\n      /* Track whether config is already set on this instance of DOMPurify. */\n      let SET_CONFIG = false;\n      /* Decide if all elements (e.g. style, script) must be children of\n       * document.body. By default, browsers might move them to document.head */\n      let FORCE_BODY = false;\n      /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n       * string (or a TrustedHTML object if Trusted Types are supported).\n       * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n       */\n      let RETURN_DOM = false;\n      /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n       * string  (or a TrustedHTML object if Trusted Types are supported) */\n      let RETURN_DOM_FRAGMENT = false;\n      /* Try to return a Trusted Type object instead of a string, return a string in\n       * case Trusted Types are not supported  */\n      let RETURN_TRUSTED_TYPE = false;\n      /* Output should be free from DOM clobbering attacks?\n       * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n       */\n      let SANITIZE_DOM = true;\n      /* Achieve full DOM Clobbering protection by isolating the namespace of named\n       * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n       *\n       * HTML/DOM spec rules that enable DOM Clobbering:\n       *   - Named Access on Window (§7.3.3)\n       *   - DOM Tree Accessors (§3.1.5)\n       *   - Form Element Parent-Child Relations (§4.10.3)\n       *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n       *   - HTMLCollection (§4.2.10.2)\n       *\n       * Namespace isolation is implemented by prefixing `id` and `name` attributes\n       * with a constant string, i.e., `user-content-`\n       */\n      let SANITIZE_NAMED_PROPS = false;\n      const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n      /* Keep element content when removing element? */\n      let KEEP_CONTENT = true;\n      /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n       * of importing it into a new Document and returning a sanitized copy */\n      let IN_PLACE = false;\n      /* Allow usage of profiles like html, svg and mathMl */\n      let USE_PROFILES = {};\n      /* Tags to ignore content of when KEEP_CONTENT is true */\n      let FORBID_CONTENTS = null;\n      const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n      /* Tags that are safe for data: URIs */\n      let DATA_URI_TAGS = null;\n      const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n      /* Attributes safe for values like \"javascript:\" */\n      let URI_SAFE_ATTRIBUTES = null;\n      const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n      const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n      const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n      const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n      /* Document namespace */\n      let NAMESPACE = HTML_NAMESPACE;\n      let IS_EMPTY_INPUT = false;\n      /* Allowed XHTML+XML namespaces */\n      let ALLOWED_NAMESPACES = null;\n      const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n      let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n      let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n      // Certain elements are allowed in both SVG and HTML\n      // namespace. We need to specify them explicitly\n      // so that they don't get erroneously deleted from\n      // HTML namespace.\n      const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n      /* Parsing of strict XHTML documents */\n      let PARSER_MEDIA_TYPE = null;\n      const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n      const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n      let transformCaseFunc = null;\n      /* Keep a reference to config to pass to hooks */\n      let CONFIG = null;\n      /* Ideally, do not touch anything below this line */\n      /* ______________________________________________ */\n      const formElement = document.createElement('form');\n      const isRegexOrFunction = function isRegexOrFunction(testValue) {\n        return testValue instanceof RegExp || testValue instanceof Function;\n      };\n      /**\n       * _parseConfig\n       *\n       * @param cfg optional config literal\n       */\n      // eslint-disable-next-line complexity\n      const _parseConfig = function _parseConfig() {\n        let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        if (CONFIG && CONFIG === cfg) {\n          return;\n        }\n        /* Shield configuration object from tampering */\n        if (!cfg || typeof cfg !== 'object') {\n          cfg = {};\n        }\n        /* Shield configuration object from prototype pollution */\n        cfg = clone(cfg);\n        PARSER_MEDIA_TYPE =\n        // eslint-disable-next-line unicorn/prefer-includes\n        SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n        // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n        transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n        /* Set configuration parameters */\n        ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n        ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n        ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n        URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n        DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n        FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n        FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};\n        FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};\n        USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n        ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n        ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n        ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n        ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n        SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n        SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n        WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n        RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n        RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n        RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n        FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n        SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n        SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n        KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n        IN_PLACE = cfg.IN_PLACE || false; // Default false\n        IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n        NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n        MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;\n        HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;\n        CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n        if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n          CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n        }\n        if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n          CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n        }\n        if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n          CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n        }\n        if (SAFE_FOR_TEMPLATES) {\n          ALLOW_DATA_ATTR = false;\n        }\n        if (RETURN_DOM_FRAGMENT) {\n          RETURN_DOM = true;\n        }\n        /* Parse profile info */\n        if (USE_PROFILES) {\n          ALLOWED_TAGS = addToSet({}, text$1);\n          ALLOWED_ATTR = [];\n          if (USE_PROFILES.html === true) {\n            addToSet(ALLOWED_TAGS, html$1);\n            addToSet(ALLOWED_ATTR, html);\n          }\n          if (USE_PROFILES.svg === true) {\n            addToSet(ALLOWED_TAGS, svg$1);\n            addToSet(ALLOWED_ATTR, svg);\n            addToSet(ALLOWED_ATTR, xml);\n          }\n          if (USE_PROFILES.svgFilters === true) {\n            addToSet(ALLOWED_TAGS, svgFilters);\n            addToSet(ALLOWED_ATTR, svg);\n            addToSet(ALLOWED_ATTR, xml);\n          }\n          if (USE_PROFILES.mathMl === true) {\n            addToSet(ALLOWED_TAGS, mathMl$1);\n            addToSet(ALLOWED_ATTR, mathMl);\n            addToSet(ALLOWED_ATTR, xml);\n          }\n        }\n        /* Merge configuration parameters */\n        if (cfg.ADD_TAGS) {\n          if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n            ALLOWED_TAGS = clone(ALLOWED_TAGS);\n          }\n          addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n        }\n        if (cfg.ADD_ATTR) {\n          if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n            ALLOWED_ATTR = clone(ALLOWED_ATTR);\n          }\n          addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n        }\n        if (cfg.ADD_URI_SAFE_ATTR) {\n          addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n        }\n        if (cfg.FORBID_CONTENTS) {\n          if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n            FORBID_CONTENTS = clone(FORBID_CONTENTS);\n          }\n          addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n        }\n        /* Add #text in case KEEP_CONTENT is set to true */\n        if (KEEP_CONTENT) {\n          ALLOWED_TAGS['#text'] = true;\n        }\n        /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n        if (WHOLE_DOCUMENT) {\n          addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n        }\n        /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n        if (ALLOWED_TAGS.table) {\n          addToSet(ALLOWED_TAGS, ['tbody']);\n          delete FORBID_TAGS.tbody;\n        }\n        if (cfg.TRUSTED_TYPES_POLICY) {\n          if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n            throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n          }\n          if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n            throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n          }\n          // Overwrite existing TrustedTypes policy.\n          trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n          // Sign local variables required by `sanitize`.\n          emptyHTML = trustedTypesPolicy.createHTML('');\n        } else {\n          // Uninitialized policy, attempt to initialize the internal dompurify policy.\n          if (trustedTypesPolicy === undefined) {\n            trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n          }\n          // If creating the internal policy succeeded sign internal variables.\n          if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n            emptyHTML = trustedTypesPolicy.createHTML('');\n          }\n        }\n        // Prevent further manipulation of configuration.\n        // Not available in IE8, Safari 5, etc.\n        if (freeze) {\n          freeze(cfg);\n        }\n        CONFIG = cfg;\n      };\n      /* Keep track of all possible SVG and MathML tags\n       * so that we can perform the namespace checks\n       * correctly. */\n      const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n      const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n      /**\n       * @param element a DOM element whose namespace is being checked\n       * @returns Return false if the element has a\n       *  namespace that a spec-compliant parser would never\n       *  return. Return true otherwise.\n       */\n      const _checkValidNamespace = function _checkValidNamespace(element) {\n        let parent = getParentNode(element);\n        // In JSDOM, if we're inside shadow DOM, then parentNode\n        // can be null. We just simulate parent in this case.\n        if (!parent || !parent.tagName) {\n          parent = {\n            namespaceURI: NAMESPACE,\n            tagName: 'template'\n          };\n        }\n        const tagName = stringToLowerCase(element.tagName);\n        const parentTagName = stringToLowerCase(parent.tagName);\n        if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n          return false;\n        }\n        if (element.namespaceURI === SVG_NAMESPACE) {\n          // The only way to switch from HTML namespace to SVG\n          // is via <svg>. If it happens via any other tag, then\n          // it should be killed.\n          if (parent.namespaceURI === HTML_NAMESPACE) {\n            return tagName === 'svg';\n          }\n          // The only way to switch from MathML to SVG is via`\n          // svg if parent is either <annotation-xml> or MathML\n          // text integration points.\n          if (parent.namespaceURI === MATHML_NAMESPACE) {\n            return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n          }\n          // We only allow elements that are defined in SVG\n          // spec. All others are disallowed in SVG namespace.\n          return Boolean(ALL_SVG_TAGS[tagName]);\n        }\n        if (element.namespaceURI === MATHML_NAMESPACE) {\n          // The only way to switch from HTML namespace to MathML\n          // is via <math>. If it happens via any other tag, then\n          // it should be killed.\n          if (parent.namespaceURI === HTML_NAMESPACE) {\n            return tagName === 'math';\n          }\n          // The only way to switch from SVG to MathML is via\n          // <math> and HTML integration points\n          if (parent.namespaceURI === SVG_NAMESPACE) {\n            return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n          }\n          // We only allow elements that are defined in MathML\n          // spec. All others are disallowed in MathML namespace.\n          return Boolean(ALL_MATHML_TAGS[tagName]);\n        }\n        if (element.namespaceURI === HTML_NAMESPACE) {\n          // The only way to switch from SVG to HTML is via\n          // HTML integration points, and from MathML to HTML\n          // is via MathML text integration points\n          if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n            return false;\n          }\n          if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n            return false;\n          }\n          // We disallow tags that are specific for MathML\n          // or SVG and should never appear in HTML namespace\n          return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n        }\n        // For XHTML and XML documents that support custom namespaces\n        if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n          return true;\n        }\n        // The code should never reach this place (this means\n        // that the element somehow got namespace that is not\n        // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n        // Return false just in case.\n        return false;\n      };\n      /**\n       * _forceRemove\n       *\n       * @param node a DOM node\n       */\n      const _forceRemove = function _forceRemove(node) {\n        arrayPush(DOMPurify.removed, {\n          element: node\n        });\n        try {\n          // eslint-disable-next-line unicorn/prefer-dom-node-remove\n          getParentNode(node).removeChild(node);\n        } catch (_) {\n          remove(node);\n        }\n      };\n      /**\n       * _removeAttribute\n       *\n       * @param name an Attribute name\n       * @param element a DOM node\n       */\n      const _removeAttribute = function _removeAttribute(name, element) {\n        try {\n          arrayPush(DOMPurify.removed, {\n            attribute: element.getAttributeNode(name),\n            from: element\n          });\n        } catch (_) {\n          arrayPush(DOMPurify.removed, {\n            attribute: null,\n            from: element\n          });\n        }\n        element.removeAttribute(name);\n        // We void attribute values for unremovable \"is\" attributes\n        if (name === 'is') {\n          if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n            try {\n              _forceRemove(element);\n            } catch (_) {}\n          } else {\n            try {\n              element.setAttribute(name, '');\n            } catch (_) {}\n          }\n        }\n      };\n      /**\n       * _initDocument\n       *\n       * @param dirty - a string of dirty markup\n       * @return a DOM, filled with the dirty markup\n       */\n      const _initDocument = function _initDocument(dirty) {\n        /* Create a HTML document */\n        let doc = null;\n        let leadingWhitespace = null;\n        if (FORCE_BODY) {\n          dirty = '<remove></remove>' + dirty;\n        } else {\n          /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n          const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n          leadingWhitespace = matches && matches[0];\n        }\n        if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n          // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n          dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n        }\n        const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n        /*\n         * Use the DOMParser API by default, fallback later if needs be\n         * DOMParser not work for svg when has multiple root element.\n         */\n        if (NAMESPACE === HTML_NAMESPACE) {\n          try {\n            doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n          } catch (_) {}\n        }\n        /* Use createHTMLDocument in case DOMParser is not available */\n        if (!doc || !doc.documentElement) {\n          doc = implementation.createDocument(NAMESPACE, 'template', null);\n          try {\n            doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n          } catch (_) {\n            // Syntax error if dirtyPayload is invalid xml\n          }\n        }\n        const body = doc.body || doc.documentElement;\n        if (dirty && leadingWhitespace) {\n          body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n        }\n        /* Work on whole document or just its body */\n        if (NAMESPACE === HTML_NAMESPACE) {\n          return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n        }\n        return WHOLE_DOCUMENT ? doc.documentElement : body;\n      };\n      /**\n       * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n       *\n       * @param root The root element or node to start traversing on.\n       * @return The created NodeIterator\n       */\n      const _createNodeIterator = function _createNodeIterator(root) {\n        return createNodeIterator.call(root.ownerDocument || root, root,\n        // eslint-disable-next-line no-bitwise\n        NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n      };\n      /**\n       * _isClobbered\n       *\n       * @param element element to check for clobbering attacks\n       * @return true if clobbered, false if safe\n       */\n      const _isClobbered = function _isClobbered(element) {\n        return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n      };\n      /**\n       * Checks whether the given object is a DOM node.\n       *\n       * @param value object to check whether it's a DOM node\n       * @return true is object is a DOM node\n       */\n      const _isNode = function _isNode(value) {\n        return typeof Node === 'function' && value instanceof Node;\n      };\n      function _executeHooks(hooks, currentNode, data) {\n        arrayForEach(hooks, hook => {\n          hook.call(DOMPurify, currentNode, data, CONFIG);\n        });\n      }\n      /**\n       * _sanitizeElements\n       *\n       * @protect nodeName\n       * @protect textContent\n       * @protect removeChild\n       * @param currentNode to check for permission to exist\n       * @return true if node was killed, false if left alive\n       */\n      const _sanitizeElements = function _sanitizeElements(currentNode) {\n        let content = null;\n        /* Execute a hook if present */\n        _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n        /* Check if element is clobbered or can clobber */\n        if (_isClobbered(currentNode)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Now let's check the element's type and name */\n        const tagName = transformCaseFunc(currentNode.nodeName);\n        /* Execute a hook if present */\n        _executeHooks(hooks.uponSanitizeElement, currentNode, {\n          tagName,\n          allowedTags: ALLOWED_TAGS\n        });\n        /* Detect mXSS attempts abusing namespace confusion */\n        if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Remove any occurrence of processing instructions */\n        if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Remove any kind of possibly harmful comments */\n        if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Remove element if anything forbids its presence */\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          /* Check if we have a custom element to handle */\n          if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n            if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n              return false;\n            }\n            if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n              return false;\n            }\n          }\n          /* Keep content except for bad-listed elements */\n          if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n            const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n            const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n            if (childNodes && parentNode) {\n              const childCount = childNodes.length;\n              for (let i = childCount - 1; i >= 0; --i) {\n                const childClone = cloneNode(childNodes[i], true);\n                childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n                parentNode.insertBefore(childClone, getNextSibling(currentNode));\n              }\n            }\n          }\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Check whether element has a valid namespace */\n        if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Make sure that older browsers don't get fallback-tag mXSS */\n        if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Sanitize element content to be template-safe */\n        if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n          /* Get the element's text content */\n          content = currentNode.textContent;\n          arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n            content = stringReplace(content, expr, ' ');\n          });\n          if (currentNode.textContent !== content) {\n            arrayPush(DOMPurify.removed, {\n              element: currentNode.cloneNode()\n            });\n            currentNode.textContent = content;\n          }\n        }\n        /* Execute a hook if present */\n        _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n        return false;\n      };\n      /**\n       * _isValidAttribute\n       *\n       * @param lcTag Lowercase tag name of containing element.\n       * @param lcName Lowercase attribute name.\n       * @param value Attribute value.\n       * @return Returns true if `value` is valid, otherwise false.\n       */\n      // eslint-disable-next-line complexity\n      const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n        /* Make sure attribute cannot clobber */\n        if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n          return false;\n        }\n        /* Allow valid data-* attributes: At least one character after \"-\"\n            (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n            XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n            We don't need to check the value; it's always URI safe. */\n        if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n          if (\n          // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n          // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n          // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n          _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) ||\n          // Alternative, second condition checks if it's an `is`-attribute, AND\n          // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n          lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n            return false;\n          }\n          /* Check value is safe. First, is attr inert? If so, is safe */\n        } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n          return false;\n        } else ;\n        return true;\n      };\n      /**\n       * _isBasicCustomElement\n       * checks if at least one dash is included in tagName, and it's not the first char\n       * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n       *\n       * @param tagName name of the tag of the node to sanitize\n       * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n       */\n      const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n        return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n      };\n      /**\n       * _sanitizeAttributes\n       *\n       * @protect attributes\n       * @protect nodeName\n       * @protect removeAttribute\n       * @protect setAttribute\n       *\n       * @param currentNode to sanitize\n       */\n      const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n        /* Execute a hook if present */\n        _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n        const {\n          attributes\n        } = currentNode;\n        /* Check if we have attributes; if not we might have a text node */\n        if (!attributes || _isClobbered(currentNode)) {\n          return;\n        }\n        const hookEvent = {\n          attrName: '',\n          attrValue: '',\n          keepAttr: true,\n          allowedAttributes: ALLOWED_ATTR,\n          forceKeepAttr: undefined\n        };\n        let l = attributes.length;\n        /* Go backwards over all attributes; safely remove bad ones */\n        while (l--) {\n          const attr = attributes[l];\n          const {\n            name,\n            namespaceURI,\n            value: attrValue\n          } = attr;\n          const lcName = transformCaseFunc(name);\n          let value = name === 'value' ? attrValue : stringTrim(attrValue);\n          const initValue = value;\n          /* Execute a hook if present */\n          hookEvent.attrName = lcName;\n          hookEvent.attrValue = value;\n          hookEvent.keepAttr = true;\n          hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n          _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n          value = hookEvent.attrValue;\n          /* Full DOM Clobbering protection via namespace isolation,\n           * Prefix id and name attributes with `user-content-`\n           */\n          if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n            // Remove the attribute with this value\n            _removeAttribute(name, currentNode);\n            // Prefix the value and later re-create the attribute with the sanitized value\n            value = SANITIZE_NAMED_PROPS_PREFIX + value;\n          }\n          /* Work around a security issue with comments inside attributes */\n          if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title)/i, value)) {\n            _removeAttribute(name, currentNode);\n            continue;\n          }\n          /* Did the hooks approve of the attribute? */\n          if (hookEvent.forceKeepAttr) {\n            continue;\n          }\n          /* Did the hooks approve of the attribute? */\n          if (!hookEvent.keepAttr) {\n            _removeAttribute(name, currentNode);\n            continue;\n          }\n          /* Work around a security issue in jQuery 3.0 */\n          if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n            _removeAttribute(name, currentNode);\n            continue;\n          }\n          /* Sanitize attribute content to be template-safe */\n          if (SAFE_FOR_TEMPLATES) {\n            arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n              value = stringReplace(value, expr, ' ');\n            });\n          }\n          /* Is `value` valid for this attribute? */\n          const lcTag = transformCaseFunc(currentNode.nodeName);\n          if (!_isValidAttribute(lcTag, lcName, value)) {\n            _removeAttribute(name, currentNode);\n            continue;\n          }\n          /* Handle attributes that require Trusted Types */\n          if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n            if (namespaceURI) ; else {\n              switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n                case 'TrustedHTML':\n                  {\n                    value = trustedTypesPolicy.createHTML(value);\n                    break;\n                  }\n                case 'TrustedScriptURL':\n                  {\n                    value = trustedTypesPolicy.createScriptURL(value);\n                    break;\n                  }\n              }\n            }\n          }\n          /* Handle invalid data-* attribute set by try-catching it */\n          if (value !== initValue) {\n            try {\n              if (namespaceURI) {\n                currentNode.setAttributeNS(namespaceURI, name, value);\n              } else {\n                /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n                currentNode.setAttribute(name, value);\n              }\n              if (_isClobbered(currentNode)) {\n                _forceRemove(currentNode);\n              } else {\n                arrayPop(DOMPurify.removed);\n              }\n            } catch (_) {}\n          }\n        }\n        /* Execute a hook if present */\n        _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n      };\n      /**\n       * _sanitizeShadowDOM\n       *\n       * @param fragment to iterate over recursively\n       */\n      const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n        let shadowNode = null;\n        const shadowIterator = _createNodeIterator(fragment);\n        /* Execute a hook if present */\n        _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n        while (shadowNode = shadowIterator.nextNode()) {\n          /* Execute a hook if present */\n          _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n          /* Sanitize tags and elements */\n          _sanitizeElements(shadowNode);\n          /* Check attributes next */\n          _sanitizeAttributes(shadowNode);\n          /* Deep shadow DOM detected */\n          if (shadowNode.content instanceof DocumentFragment) {\n            _sanitizeShadowDOM(shadowNode.content);\n          }\n        }\n        /* Execute a hook if present */\n        _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n      };\n      // eslint-disable-next-line complexity\n      DOMPurify.sanitize = function (dirty) {\n        let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        let body = null;\n        let importedNode = null;\n        let currentNode = null;\n        let returnNode = null;\n        /* Make sure we have a string to sanitize.\n          DO NOT return early, as this will return the wrong type if\n          the user has requested a DOM object rather than a string */\n        IS_EMPTY_INPUT = !dirty;\n        if (IS_EMPTY_INPUT) {\n          dirty = '<!-->';\n        }\n        /* Stringify, in case dirty is an object */\n        if (typeof dirty !== 'string' && !_isNode(dirty)) {\n          if (typeof dirty.toString === 'function') {\n            dirty = dirty.toString();\n            if (typeof dirty !== 'string') {\n              throw typeErrorCreate('dirty is not a string, aborting');\n            }\n          } else {\n            throw typeErrorCreate('toString is not a function');\n          }\n        }\n        /* Return dirty HTML if DOMPurify cannot run */\n        if (!DOMPurify.isSupported) {\n          return dirty;\n        }\n        /* Assign config vars */\n        if (!SET_CONFIG) {\n          _parseConfig(cfg);\n        }\n        /* Clean up removed elements */\n        DOMPurify.removed = [];\n        /* Check if dirty is correctly typed for IN_PLACE */\n        if (typeof dirty === 'string') {\n          IN_PLACE = false;\n        }\n        if (IN_PLACE) {\n          /* Do some early pre-sanitization to avoid unsafe root nodes */\n          if (dirty.nodeName) {\n            const tagName = transformCaseFunc(dirty.nodeName);\n            if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n              throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n            }\n          }\n        } else if (dirty instanceof Node) {\n          /* If dirty is a DOM element, append to an empty document to avoid\n             elements being stripped by the parser */\n          body = _initDocument('<!---->');\n          importedNode = body.ownerDocument.importNode(dirty, true);\n          if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n            /* Node is already a body, use as is */\n            body = importedNode;\n          } else if (importedNode.nodeName === 'HTML') {\n            body = importedNode;\n          } else {\n            // eslint-disable-next-line unicorn/prefer-dom-node-append\n            body.appendChild(importedNode);\n          }\n        } else {\n          /* Exit directly if we have nothing to do */\n          if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n          // eslint-disable-next-line unicorn/prefer-includes\n          dirty.indexOf('<') === -1) {\n            return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n          }\n          /* Initialize the document to work on */\n          body = _initDocument(dirty);\n          /* Check we have a DOM node from the data */\n          if (!body) {\n            return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n          }\n        }\n        /* Remove first element node (ours) if FORCE_BODY is set */\n        if (body && FORCE_BODY) {\n          _forceRemove(body.firstChild);\n        }\n        /* Get node iterator */\n        const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n        /* Now start iterating over the created document */\n        while (currentNode = nodeIterator.nextNode()) {\n          /* Sanitize tags and elements */\n          _sanitizeElements(currentNode);\n          /* Check attributes next */\n          _sanitizeAttributes(currentNode);\n          /* Shadow DOM detected, sanitize it */\n          if (currentNode.content instanceof DocumentFragment) {\n            _sanitizeShadowDOM(currentNode.content);\n          }\n        }\n        /* If we sanitized `dirty` in-place, return it. */\n        if (IN_PLACE) {\n          return dirty;\n        }\n        /* Return sanitized string or DOM */\n        if (RETURN_DOM) {\n          if (RETURN_DOM_FRAGMENT) {\n            returnNode = createDocumentFragment.call(body.ownerDocument);\n            while (body.firstChild) {\n              // eslint-disable-next-line unicorn/prefer-dom-node-append\n              returnNode.appendChild(body.firstChild);\n            }\n          } else {\n            returnNode = body;\n          }\n          if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n            /*\n              AdoptNode() is not used because internal state is not reset\n              (e.g. the past names map of a HTMLFormElement), this is safe\n              in theory but we would rather not risk another attack vector.\n              The state that is cloned by importNode() is explicitly defined\n              by the specs.\n            */\n            returnNode = importNode.call(originalDocument, returnNode, true);\n          }\n          return returnNode;\n        }\n        let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n        /* Serialize doctype if allowed */\n        if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n          serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n        }\n        /* Sanitize final string template-safe */\n        if (SAFE_FOR_TEMPLATES) {\n          arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n            serializedHTML = stringReplace(serializedHTML, expr, ' ');\n          });\n        }\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n      };\n      DOMPurify.setConfig = function () {\n        let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        _parseConfig(cfg);\n        SET_CONFIG = true;\n      };\n      DOMPurify.clearConfig = function () {\n        CONFIG = null;\n        SET_CONFIG = false;\n      };\n      DOMPurify.isValidAttribute = function (tag, attr, value) {\n        /* Initialize shared config vars if necessary. */\n        if (!CONFIG) {\n          _parseConfig({});\n        }\n        const lcTag = transformCaseFunc(tag);\n        const lcName = transformCaseFunc(attr);\n        return _isValidAttribute(lcTag, lcName, value);\n      };\n      DOMPurify.addHook = function (entryPoint, hookFunction) {\n        if (typeof hookFunction !== 'function') {\n          return;\n        }\n        arrayPush(hooks[entryPoint], hookFunction);\n      };\n      DOMPurify.removeHook = function (entryPoint, hookFunction) {\n        if (hookFunction !== undefined) {\n          const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n          return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n        }\n        return arrayPop(hooks[entryPoint]);\n      };\n      DOMPurify.removeHooks = function (entryPoint) {\n        hooks[entryPoint] = [];\n      };\n      DOMPurify.removeAllHooks = function () {\n        hooks = _createHooksMap();\n      };\n      return DOMPurify;\n    }\n    var purify = createDOMPurify();\n\n    const sanitizeHtmlString = html => purify().sanitize(html);\n\n    var global$8 = hugerte.util.Tools.resolve('hugerte.util.I18n');\n\n    const rtlTransform = {\n      'indent': true,\n      'outdent': true,\n      'table-insert-column-after': true,\n      'table-insert-column-before': true,\n      'paste-column-after': true,\n      'paste-column-before': true,\n      'unordered-list': true,\n      'list-bull-circle': true,\n      'list-bull-default': true,\n      'list-bull-square': true\n    };\n    const defaultIconName = 'temporary-placeholder';\n    const defaultIcon = icons => () => get$g(icons, defaultIconName).getOr('!not found!');\n    const getIconName = (name, icons) => {\n      const lcName = name.toLowerCase();\n      if (global$8.isRtl()) {\n        const rtlName = ensureTrailing(lcName, '-rtl');\n        return has$2(icons, rtlName) ? rtlName : lcName;\n      } else {\n        return lcName;\n      }\n    };\n    const lookupIcon = (name, icons) => get$g(icons, getIconName(name, icons));\n    const get$2 = (name, iconProvider) => {\n      const icons = iconProvider();\n      return lookupIcon(name, icons).getOrThunk(defaultIcon(icons));\n    };\n    const getOr = (name, iconProvider, fallbackIcon) => {\n      const icons = iconProvider();\n      return lookupIcon(name, icons).or(fallbackIcon).getOrThunk(defaultIcon(icons));\n    };\n    const needsRtlTransform = iconName => global$8.isRtl() ? has$2(rtlTransform, iconName) : false;\n    const addFocusableBehaviour = () => config('add-focusable', [runOnAttached(comp => {\n        child(comp.element, 'svg').each(svg => set$9(svg, 'focusable', 'false'));\n      })]);\n    const renderIcon$3 = (spec, iconName, icons, fallbackIcon) => {\n      var _a, _b;\n      const rtlIconClasses = needsRtlTransform(iconName) ? ['tox-icon--flip'] : [];\n      const iconHtml = get$g(icons, getIconName(iconName, icons)).or(fallbackIcon).getOrThunk(defaultIcon(icons));\n      return {\n        dom: {\n          tag: spec.tag,\n          attributes: (_a = spec.attributes) !== null && _a !== void 0 ? _a : {},\n          classes: spec.classes.concat(rtlIconClasses),\n          innerHtml: iconHtml\n        },\n        behaviours: derive$1([\n          ...(_b = spec.behaviours) !== null && _b !== void 0 ? _b : [],\n          addFocusableBehaviour()\n        ])\n      };\n    };\n    const render$3 = (iconName, spec, iconProvider, fallbackIcon = Optional.none()) => renderIcon$3(spec, iconName, iconProvider(), fallbackIcon);\n    const renderFirst = (iconNames, spec, iconProvider) => {\n      const icons = iconProvider();\n      const iconName = find$5(iconNames, name => has$2(icons, getIconName(name, icons)));\n      return renderIcon$3(spec, iconName.getOr(defaultIconName), icons, Optional.none());\n    };\n\n    const notificationIconMap = {\n      success: 'checkmark',\n      error: 'warning',\n      err: 'error',\n      warning: 'warning',\n      warn: 'warning',\n      info: 'info'\n    };\n    const factory$m = detail => {\n      const memBannerText = record({\n        dom: fromHtml(`<p>${ sanitizeHtmlString(detail.translationProvider(detail.text)) }</p>`),\n        behaviours: derive$1([Replacing.config({})])\n      });\n      const renderPercentBar = percent => ({\n        dom: {\n          tag: 'div',\n          classes: ['tox-bar'],\n          styles: { width: `${ percent }%` }\n        }\n      });\n      const renderPercentText = percent => ({\n        dom: {\n          tag: 'div',\n          classes: ['tox-text'],\n          innerHtml: `${ percent }%`\n        }\n      });\n      const memBannerProgress = record({\n        dom: {\n          tag: 'div',\n          classes: detail.progress ? [\n            'tox-progress-bar',\n            'tox-progress-indicator'\n          ] : ['tox-progress-bar']\n        },\n        components: [\n          {\n            dom: {\n              tag: 'div',\n              classes: ['tox-bar-container']\n            },\n            components: [renderPercentBar(0)]\n          },\n          renderPercentText(0)\n        ],\n        behaviours: derive$1([Replacing.config({})])\n      });\n      const updateProgress = (comp, percent) => {\n        if (comp.getSystem().isConnected()) {\n          memBannerProgress.getOpt(comp).each(progress => {\n            Replacing.set(progress, [\n              {\n                dom: {\n                  tag: 'div',\n                  classes: ['tox-bar-container']\n                },\n                components: [renderPercentBar(percent)]\n              },\n              renderPercentText(percent)\n            ]);\n          });\n        }\n      };\n      const updateText = (comp, text) => {\n        if (comp.getSystem().isConnected()) {\n          const banner = memBannerText.get(comp);\n          Replacing.set(banner, [text$2(text)]);\n        }\n      };\n      const apis = {\n        updateProgress,\n        updateText\n      };\n      const iconChoices = flatten([\n        detail.icon.toArray(),\n        detail.level.toArray(),\n        detail.level.bind(level => Optional.from(notificationIconMap[level])).toArray()\n      ]);\n      const memButton = record(Button.sketch({\n        dom: {\n          tag: 'button',\n          classes: [\n            'tox-notification__dismiss',\n            'tox-button',\n            'tox-button--naked',\n            'tox-button--icon'\n          ]\n        },\n        components: [render$3('close', {\n            tag: 'span',\n            classes: ['tox-icon'],\n            attributes: { 'aria-label': detail.translationProvider('Close') }\n          }, detail.iconProvider)],\n        action: comp => {\n          detail.onAction(comp);\n        }\n      }));\n      const notificationIconSpec = renderFirst(iconChoices, {\n        tag: 'div',\n        classes: ['tox-notification__icon']\n      }, detail.iconProvider);\n      const notificationBodySpec = {\n        dom: {\n          tag: 'div',\n          classes: ['tox-notification__body']\n        },\n        components: [memBannerText.asSpec()],\n        behaviours: derive$1([Replacing.config({})])\n      };\n      const components = [\n        notificationIconSpec,\n        notificationBodySpec\n      ];\n      return {\n        uid: detail.uid,\n        dom: {\n          tag: 'div',\n          attributes: { role: 'alert' },\n          classes: detail.level.map(level => [\n            'tox-notification',\n            'tox-notification--in',\n            `tox-notification--${ level }`\n          ]).getOr([\n            'tox-notification',\n            'tox-notification--in'\n          ])\n        },\n        behaviours: derive$1([\n          Focusing.config({}),\n          config('notification-events', [run$1(focusin(), comp => {\n              memButton.getOpt(comp).each(Focusing.focus);\n            })])\n        ]),\n        components: components.concat(detail.progress ? [memBannerProgress.asSpec()] : []).concat([memButton.asSpec()]),\n        apis\n      };\n    };\n    const Notification = single({\n      name: 'Notification',\n      factory: factory$m,\n      configFields: [\n        option$3('level'),\n        required$1('progress'),\n        option$3('icon'),\n        required$1('onAction'),\n        required$1('text'),\n        required$1('iconProvider'),\n        required$1('translationProvider')\n      ],\n      apis: {\n        updateProgress: (apis, comp, percent) => {\n          apis.updateProgress(comp, percent);\n        },\n        updateText: (apis, comp, text) => {\n          apis.updateText(comp, text);\n        }\n      }\n    });\n\n    var NotificationManagerImpl = (editor, extras, uiMothership) => {\n      const sharedBackstage = extras.backstage.shared;\n      const getBounds = () => {\n        const contentArea = box$1(SugarElement.fromDom(editor.getContentAreaContainer()));\n        const win$1 = win();\n        const x = clamp(win$1.x, contentArea.x, contentArea.right);\n        const y = clamp(win$1.y, contentArea.y, contentArea.bottom);\n        const right = Math.max(contentArea.right, win$1.right);\n        const bottom = Math.max(contentArea.bottom, win$1.bottom);\n        return Optional.some(bounds(x, y, right - x, bottom - y));\n      };\n      const open = (settings, closeCallback) => {\n        const close = () => {\n          closeCallback();\n          InlineView.hide(notificationWrapper);\n        };\n        const notification = build$1(Notification.sketch({\n          text: settings.text,\n          level: contains$2([\n            'success',\n            'error',\n            'warning',\n            'warn',\n            'info'\n          ], settings.type) ? settings.type : undefined,\n          progress: settings.progressBar === true,\n          icon: settings.icon,\n          onAction: close,\n          iconProvider: sharedBackstage.providers.icons,\n          translationProvider: sharedBackstage.providers.translate\n        }));\n        const notificationWrapper = build$1(InlineView.sketch({\n          dom: {\n            tag: 'div',\n            classes: ['tox-notifications-container']\n          },\n          lazySink: sharedBackstage.getSink,\n          fireDismissalEventInstead: {},\n          ...sharedBackstage.header.isPositionedAtTop() ? {} : { fireRepositionEventInstead: {} }\n        }));\n        uiMothership.add(notificationWrapper);\n        if (isNumber(settings.timeout) && settings.timeout > 0) {\n          global$9.setEditorTimeout(editor, () => {\n            close();\n          }, settings.timeout);\n        }\n        const reposition = () => {\n          const notificationSpec = premade(notification);\n          const anchorOverrides = { maxHeightFunction: expandable$1() };\n          const allNotifications = editor.notificationManager.getNotifications();\n          if (allNotifications[0] === thisNotification) {\n            const anchor = {\n              ...sharedBackstage.anchors.banner(),\n              overrides: anchorOverrides\n            };\n            InlineView.showWithinBounds(notificationWrapper, notificationSpec, { anchor }, getBounds);\n          } else {\n            indexOf(allNotifications, thisNotification).each(idx => {\n              const previousNotification = allNotifications[idx - 1].getEl();\n              const nodeAnchor = {\n                type: 'node',\n                root: body(),\n                node: Optional.some(SugarElement.fromDom(previousNotification)),\n                overrides: anchorOverrides,\n                layouts: {\n                  onRtl: () => [south$2],\n                  onLtr: () => [south$2]\n                }\n              };\n              InlineView.showWithinBounds(notificationWrapper, notificationSpec, { anchor: nodeAnchor }, getBounds);\n            });\n          }\n        };\n        const thisNotification = {\n          close,\n          reposition,\n          text: nuText => {\n            Notification.updateText(notification, nuText);\n          },\n          settings,\n          getEl: () => notification.element.dom,\n          progressBar: {\n            value: percent => {\n              Notification.updateProgress(notification, percent);\n            }\n          }\n        };\n        return thisNotification;\n      };\n      const close = notification => {\n        notification.close();\n      };\n      const getArgs = notification => {\n        return notification.settings;\n      };\n      return {\n        open,\n        close,\n        getArgs\n      };\n    };\n\n    var global$7 = hugerte.util.Tools.resolve('hugerte.dom.DOMUtils');\n\n    var global$6 = hugerte.util.Tools.resolve('hugerte.EditorManager');\n\n    var global$5 = hugerte.util.Tools.resolve('hugerte.Env');\n\n    var ToolbarMode$1;\n    (function (ToolbarMode) {\n      ToolbarMode['default'] = 'wrap';\n      ToolbarMode['floating'] = 'floating';\n      ToolbarMode['sliding'] = 'sliding';\n      ToolbarMode['scrolling'] = 'scrolling';\n    }(ToolbarMode$1 || (ToolbarMode$1 = {})));\n    var ToolbarLocation$1;\n    (function (ToolbarLocation) {\n      ToolbarLocation['auto'] = 'auto';\n      ToolbarLocation['top'] = 'top';\n      ToolbarLocation['bottom'] = 'bottom';\n    }(ToolbarLocation$1 || (ToolbarLocation$1 = {})));\n    const option$2 = name => editor => editor.options.get(name);\n    const wrapOptional = fn => editor => Optional.from(fn(editor));\n    const register$e = editor => {\n      const isPhone = global$5.deviceType.isPhone();\n      const isMobile = global$5.deviceType.isTablet() || isPhone;\n      const registerOption = editor.options.register;\n      const stringOrFalseProcessor = value => isString(value) || value === false;\n      const stringOrNumberProcessor = value => isString(value) || isNumber(value);\n      registerOption('skin', {\n        processor: value => isString(value) || value === false,\n        default: 'oxide'\n      });\n      registerOption('skin_url', { processor: 'string' });\n      registerOption('height', {\n        processor: stringOrNumberProcessor,\n        default: Math.max(editor.getElement().offsetHeight, 400)\n      });\n      registerOption('width', {\n        processor: stringOrNumberProcessor,\n        default: global$7.DOM.getStyle(editor.getElement(), 'width')\n      });\n      registerOption('min_height', {\n        processor: 'number',\n        default: 100\n      });\n      registerOption('min_width', { processor: 'number' });\n      registerOption('max_height', { processor: 'number' });\n      registerOption('max_width', { processor: 'number' });\n      registerOption('style_formats', { processor: 'object[]' });\n      registerOption('style_formats_merge', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('style_formats_autohide', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('line_height_formats', {\n        processor: 'string',\n        default: '1 1.1 1.2 1.3 1.4 1.5 2'\n      });\n      registerOption('font_family_formats', {\n        processor: 'string',\n        default: 'Andale Mono=andale mono,monospace;' + 'Arial=arial,helvetica,sans-serif;' + 'Arial Black=arial black,sans-serif;' + 'Book Antiqua=book antiqua,palatino,serif;' + 'Comic Sans MS=comic sans ms,sans-serif;' + 'Courier New=courier new,courier,monospace;' + 'Georgia=georgia,palatino,serif;' + 'Helvetica=helvetica,arial,sans-serif;' + 'Impact=impact,sans-serif;' + 'Symbol=symbol;' + 'Tahoma=tahoma,arial,helvetica,sans-serif;' + 'Terminal=terminal,monaco,monospace;' + 'Times New Roman=times new roman,times,serif;' + 'Trebuchet MS=trebuchet ms,geneva,sans-serif;' + 'Verdana=verdana,geneva,sans-serif;' + 'Webdings=webdings;' + 'Wingdings=wingdings,zapf dingbats'\n      });\n      registerOption('font_size_formats', {\n        processor: 'string',\n        default: '8pt 10pt 12pt 14pt 18pt 24pt 36pt'\n      });\n      registerOption('font_size_input_default_unit', {\n        processor: 'string',\n        default: 'pt'\n      });\n      registerOption('block_formats', {\n        processor: 'string',\n        default: 'Paragraph=p;' + 'Heading 1=h1;' + 'Heading 2=h2;' + 'Heading 3=h3;' + 'Heading 4=h4;' + 'Heading 5=h5;' + 'Heading 6=h6;' + 'Preformatted=pre'\n      });\n      registerOption('content_langs', { processor: 'object[]' });\n      registerOption('removed_menuitems', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('menubar', {\n        processor: value => isString(value) || isBoolean(value),\n        default: !isPhone\n      });\n      registerOption('menu', {\n        processor: 'object',\n        default: {}\n      });\n      registerOption('toolbar', {\n        processor: value => {\n          if (isBoolean(value) || isString(value) || isArray(value)) {\n            return {\n              value,\n              valid: true\n            };\n          } else {\n            return {\n              valid: false,\n              message: 'Must be a boolean, string or array.'\n            };\n          }\n        },\n        default: true\n      });\n      range$2(9, num => {\n        registerOption('toolbar' + (num + 1), { processor: 'string' });\n      });\n      registerOption('toolbar_mode', {\n        processor: 'string',\n        default: isMobile ? 'scrolling' : 'floating'\n      });\n      registerOption('toolbar_groups', {\n        processor: 'object',\n        default: {}\n      });\n      registerOption('toolbar_location', {\n        processor: 'string',\n        default: ToolbarLocation$1.auto\n      });\n      registerOption('toolbar_persist', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('toolbar_sticky', {\n        processor: 'boolean',\n        default: editor.inline\n      });\n      registerOption('toolbar_sticky_offset', {\n        processor: 'number',\n        default: 0\n      });\n      registerOption('fixed_toolbar_container', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('fixed_toolbar_container_target', { processor: 'object' });\n      registerOption('ui_mode', {\n        processor: 'string',\n        default: 'combined'\n      });\n      registerOption('file_picker_callback', { processor: 'function' });\n      registerOption('file_picker_validator_handler', { processor: 'function' });\n      registerOption('file_picker_types', { processor: 'string' });\n      registerOption('typeahead_urls', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('anchor_top', {\n        processor: stringOrFalseProcessor,\n        default: '#top'\n      });\n      registerOption('anchor_bottom', {\n        processor: stringOrFalseProcessor,\n        default: '#bottom'\n      });\n      registerOption('draggable_modal', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('statusbar', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('elementpath', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('branding', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('resize', {\n        processor: value => value === 'both' || isBoolean(value),\n        default: !global$5.deviceType.isTouch()\n      });\n      registerOption('sidebar_show', { processor: 'string' });\n      registerOption('help_accessibility', {\n        processor: 'boolean',\n        default: editor.hasPlugin('help')\n      });\n      registerOption('default_font_stack', {\n        processor: 'string[]',\n        default: []\n      });\n    };\n    const isReadOnly = option$2('readonly');\n    const getHeightOption = option$2('height');\n    const getWidthOption = option$2('width');\n    const getMinWidthOption = wrapOptional(option$2('min_width'));\n    const getMinHeightOption = wrapOptional(option$2('min_height'));\n    const getMaxWidthOption = wrapOptional(option$2('max_width'));\n    const getMaxHeightOption = wrapOptional(option$2('max_height'));\n    const getUserStyleFormats = wrapOptional(option$2('style_formats'));\n    const shouldMergeStyleFormats = option$2('style_formats_merge');\n    const shouldAutoHideStyleFormats = option$2('style_formats_autohide');\n    const getContentLanguages = option$2('content_langs');\n    const getRemovedMenuItems = option$2('removed_menuitems');\n    const getToolbarMode = option$2('toolbar_mode');\n    const getToolbarGroups = option$2('toolbar_groups');\n    const getToolbarLocation = option$2('toolbar_location');\n    const fixedContainerSelector = option$2('fixed_toolbar_container');\n    const fixedToolbarContainerTarget = option$2('fixed_toolbar_container_target');\n    const isToolbarPersist = option$2('toolbar_persist');\n    const getStickyToolbarOffset = option$2('toolbar_sticky_offset');\n    const getMenubar = option$2('menubar');\n    const getToolbar = option$2('toolbar');\n    const getFilePickerCallback = option$2('file_picker_callback');\n    const getFilePickerValidatorHandler = option$2('file_picker_validator_handler');\n    const getFontSizeInputDefaultUnit = option$2('font_size_input_default_unit');\n    const getFilePickerTypes = option$2('file_picker_types');\n    const useTypeaheadUrls = option$2('typeahead_urls');\n    const getAnchorTop = option$2('anchor_top');\n    const getAnchorBottom = option$2('anchor_bottom');\n    const isDraggableModal$1 = option$2('draggable_modal');\n    const useStatusBar = option$2('statusbar');\n    const useElementPath = option$2('elementpath');\n    const useBranding = option$2('branding');\n    const getResize = option$2('resize');\n    const getPasteAsText = option$2('paste_as_text');\n    const getSidebarShow = option$2('sidebar_show');\n    const useHelpAccessibility = option$2('help_accessibility');\n    const getDefaultFontStack = option$2('default_font_stack');\n    const isSkinDisabled = editor => editor.options.get('skin') === false;\n    const isMenubarEnabled = editor => editor.options.get('menubar') !== false;\n    const getSkinUrl = editor => {\n      const skinUrl = editor.options.get('skin_url');\n      if (isSkinDisabled(editor)) {\n        return skinUrl;\n      } else {\n        if (skinUrl) {\n          return editor.documentBaseURI.toAbsolute(skinUrl);\n        } else {\n          const skin = editor.options.get('skin');\n          return global$6.baseURL + '/skins/ui/' + skin;\n        }\n      }\n    };\n    const getSkinUrlOption = editor => Optional.from(editor.options.get('skin_url'));\n    const getLineHeightFormats = editor => editor.options.get('line_height_formats').split(' ');\n    const isToolbarEnabled = editor => {\n      const toolbar = getToolbar(editor);\n      const isToolbarString = isString(toolbar);\n      const isToolbarObjectArray = isArray(toolbar) && toolbar.length > 0;\n      return !isMultipleToolbars(editor) && (isToolbarObjectArray || isToolbarString || toolbar === true);\n    };\n    const getMultipleToolbarsOption = editor => {\n      const toolbars = range$2(9, num => editor.options.get('toolbar' + (num + 1)));\n      const toolbarArray = filter$2(toolbars, isString);\n      return someIf(toolbarArray.length > 0, toolbarArray);\n    };\n    const isMultipleToolbars = editor => getMultipleToolbarsOption(editor).fold(() => {\n      const toolbar = getToolbar(editor);\n      return isArrayOf(toolbar, isString) && toolbar.length > 0;\n    }, always);\n    const isToolbarLocationBottom = editor => getToolbarLocation(editor) === ToolbarLocation$1.bottom;\n    const fixedContainerTarget = editor => {\n      var _a;\n      if (!editor.inline) {\n        return Optional.none();\n      }\n      const selector = (_a = fixedContainerSelector(editor)) !== null && _a !== void 0 ? _a : '';\n      if (selector.length > 0) {\n        return descendant(body(), selector);\n      }\n      const element = fixedToolbarContainerTarget(editor);\n      if (isNonNullable(element)) {\n        return Optional.some(SugarElement.fromDom(element));\n      }\n      return Optional.none();\n    };\n    const useFixedContainer = editor => editor.inline && fixedContainerTarget(editor).isSome();\n    const getUiContainer = editor => {\n      const fixedContainer = fixedContainerTarget(editor);\n      return fixedContainer.getOrThunk(() => getContentContainer(getRootNode(SugarElement.fromDom(editor.getElement()))));\n    };\n    const isDistractionFree = editor => editor.inline && !isMenubarEnabled(editor) && !isToolbarEnabled(editor) && !isMultipleToolbars(editor);\n    const isStickyToolbar = editor => {\n      const isStickyToolbar = editor.options.get('toolbar_sticky');\n      return (isStickyToolbar || editor.inline) && !useFixedContainer(editor) && !isDistractionFree(editor);\n    };\n    const isSplitUiMode = editor => !useFixedContainer(editor) && editor.options.get('ui_mode') === 'split';\n    const getMenus = editor => {\n      const menu = editor.options.get('menu');\n      return map$1(menu, menu => ({\n        ...menu,\n        items: menu.items\n      }));\n    };\n\n    var Options = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        get ToolbarMode () { return ToolbarMode$1; },\n        get ToolbarLocation () { return ToolbarLocation$1; },\n        register: register$e,\n        getSkinUrl: getSkinUrl,\n        getSkinUrlOption: getSkinUrlOption,\n        isReadOnly: isReadOnly,\n        isSkinDisabled: isSkinDisabled,\n        getHeightOption: getHeightOption,\n        getWidthOption: getWidthOption,\n        getMinWidthOption: getMinWidthOption,\n        getMinHeightOption: getMinHeightOption,\n        getMaxWidthOption: getMaxWidthOption,\n        getMaxHeightOption: getMaxHeightOption,\n        getUserStyleFormats: getUserStyleFormats,\n        shouldMergeStyleFormats: shouldMergeStyleFormats,\n        shouldAutoHideStyleFormats: shouldAutoHideStyleFormats,\n        getLineHeightFormats: getLineHeightFormats,\n        getContentLanguages: getContentLanguages,\n        getRemovedMenuItems: getRemovedMenuItems,\n        isMenubarEnabled: isMenubarEnabled,\n        isMultipleToolbars: isMultipleToolbars,\n        isToolbarEnabled: isToolbarEnabled,\n        isToolbarPersist: isToolbarPersist,\n        getMultipleToolbarsOption: getMultipleToolbarsOption,\n        getUiContainer: getUiContainer,\n        useFixedContainer: useFixedContainer,\n        isSplitUiMode: isSplitUiMode,\n        getToolbarMode: getToolbarMode,\n        isDraggableModal: isDraggableModal$1,\n        isDistractionFree: isDistractionFree,\n        isStickyToolbar: isStickyToolbar,\n        getStickyToolbarOffset: getStickyToolbarOffset,\n        getToolbarLocation: getToolbarLocation,\n        isToolbarLocationBottom: isToolbarLocationBottom,\n        getToolbarGroups: getToolbarGroups,\n        getMenus: getMenus,\n        getMenubar: getMenubar,\n        getToolbar: getToolbar,\n        getFilePickerCallback: getFilePickerCallback,\n        getFilePickerTypes: getFilePickerTypes,\n        useTypeaheadUrls: useTypeaheadUrls,\n        getAnchorTop: getAnchorTop,\n        getAnchorBottom: getAnchorBottom,\n        getFilePickerValidatorHandler: getFilePickerValidatorHandler,\n        getFontSizeInputDefaultUnit: getFontSizeInputDefaultUnit,\n        useStatusBar: useStatusBar,\n        useElementPath: useElementPath,\n        useBranding: useBranding,\n        getResize: getResize,\n        getPasteAsText: getPasteAsText,\n        getSidebarShow: getSidebarShow,\n        useHelpAccessibility: useHelpAccessibility,\n        getDefaultFontStack: getDefaultFontStack\n    });\n\n    const setup$e = (api, editor) => {\n      const redirectKeyToItem = (item, e) => {\n        emitWith(item, keydown(), { raw: e });\n      };\n      const getItem = () => api.getMenu().bind(Highlighting.getHighlighted);\n      editor.on('keydown', e => {\n        const keyCode = e.which;\n        if (!api.isActive()) {\n          return;\n        }\n        if (api.isMenuOpen()) {\n          if (keyCode === 13) {\n            getItem().each(emitExecute);\n            e.preventDefault();\n          } else if (keyCode === 40) {\n            getItem().fold(() => {\n              api.getMenu().each(Highlighting.highlightFirst);\n            }, item => {\n              redirectKeyToItem(item, e);\n            });\n            e.preventDefault();\n            e.stopImmediatePropagation();\n          } else if (keyCode === 37 || keyCode === 38 || keyCode === 39) {\n            getItem().each(item => {\n              redirectKeyToItem(item, e);\n              e.preventDefault();\n              e.stopImmediatePropagation();\n            });\n          }\n        } else {\n          if (keyCode === 13 || keyCode === 38 || keyCode === 40) {\n            api.cancelIfNecessary();\n          }\n        }\n      });\n      editor.on('NodeChange', () => {\n        if (api.isActive() && !api.isProcessingAction() && !editor.queryCommandState('mceAutoCompleterInRange')) {\n          api.cancelIfNecessary();\n        }\n      });\n    };\n    const AutocompleterEditorEvents = { setup: setup$e };\n\n    var ItemResponse;\n    (function (ItemResponse) {\n      ItemResponse[ItemResponse['CLOSE_ON_EXECUTE'] = 0] = 'CLOSE_ON_EXECUTE';\n      ItemResponse[ItemResponse['BUBBLE_TO_SANDBOX'] = 1] = 'BUBBLE_TO_SANDBOX';\n    }(ItemResponse || (ItemResponse = {})));\n    var ItemResponse$1 = ItemResponse;\n\n    const navClass = 'tox-menu-nav__js';\n    const selectableClass = 'tox-collection__item';\n    const colorClass = 'tox-swatch';\n    const presetClasses = {\n      normal: navClass,\n      color: colorClass\n    };\n    const tickedClass = 'tox-collection__item--enabled';\n    const groupHeadingClass = 'tox-collection__group-heading';\n    const iconClass = 'tox-collection__item-icon';\n    const textClass = 'tox-collection__item-label';\n    const accessoryClass = 'tox-collection__item-accessory';\n    const caretClass = 'tox-collection__item-caret';\n    const checkmarkClass = 'tox-collection__item-checkmark';\n    const activeClass = 'tox-collection__item--active';\n    const containerClass = 'tox-collection__item-container';\n    const containerColumnClass = 'tox-collection__item-container--column';\n    const containerRowClass = 'tox-collection__item-container--row';\n    const containerAlignRightClass = 'tox-collection__item-container--align-right';\n    const containerAlignLeftClass = 'tox-collection__item-container--align-left';\n    const containerValignTopClass = 'tox-collection__item-container--valign-top';\n    const containerValignMiddleClass = 'tox-collection__item-container--valign-middle';\n    const containerValignBottomClass = 'tox-collection__item-container--valign-bottom';\n    const classForPreset = presets => get$g(presetClasses, presets).getOr(navClass);\n\n    const forMenu = presets => {\n      if (presets === 'color') {\n        return 'tox-swatches';\n      } else {\n        return 'tox-menu';\n      }\n    };\n    const classes = presets => ({\n      backgroundMenu: 'tox-background-menu',\n      selectedMenu: 'tox-selected-menu',\n      selectedItem: 'tox-collection__item--active',\n      hasIcons: 'tox-menu--has-icons',\n      menu: forMenu(presets),\n      tieredMenu: 'tox-tiered-menu'\n    });\n\n    const markers = presets => {\n      const menuClasses = classes(presets);\n      return {\n        backgroundMenu: menuClasses.backgroundMenu,\n        selectedMenu: menuClasses.selectedMenu,\n        menu: menuClasses.menu,\n        selectedItem: menuClasses.selectedItem,\n        item: classForPreset(presets)\n      };\n    };\n    const dom$1 = (hasIcons, columns, presets) => {\n      const menuClasses = classes(presets);\n      return {\n        tag: 'div',\n        classes: flatten([\n          [\n            menuClasses.menu,\n            `tox-menu-${ columns }-column`\n          ],\n          hasIcons ? [menuClasses.hasIcons] : []\n        ])\n      };\n    };\n    const components = [Menu.parts.items({})];\n    const part = (hasIcons, columns, presets) => {\n      const menuClasses = classes(presets);\n      const d = {\n        tag: 'div',\n        classes: flatten([[menuClasses.tieredMenu]])\n      };\n      return {\n        dom: d,\n        markers: markers(presets)\n      };\n    };\n\n    const schema$l = constant$1([\n      option$3('data'),\n      defaulted('inputAttributes', {}),\n      defaulted('inputStyles', {}),\n      defaulted('tag', 'input'),\n      defaulted('inputClasses', []),\n      onHandler('onSetValue'),\n      defaulted('styles', {}),\n      defaulted('eventOrder', {}),\n      field('inputBehaviours', [\n        Representing,\n        Focusing\n      ]),\n      defaulted('selectOnFocus', true)\n    ]);\n    const focusBehaviours = detail => derive$1([Focusing.config({\n        onFocus: !detail.selectOnFocus ? noop : component => {\n          const input = component.element;\n          const value = get$6(input);\n          input.dom.setSelectionRange(0, value.length);\n        }\n      })]);\n    const behaviours = detail => ({\n      ...focusBehaviours(detail),\n      ...augment(detail.inputBehaviours, [Representing.config({\n          store: {\n            mode: 'manual',\n            ...detail.data.map(data => ({ initialValue: data })).getOr({}),\n            getValue: input => {\n              return get$6(input.element);\n            },\n            setValue: (input, data) => {\n              const current = get$6(input.element);\n              if (current !== data) {\n                set$5(input.element, data);\n              }\n            }\n          },\n          onSetValue: detail.onSetValue\n        })])\n    });\n    const dom = detail => ({\n      tag: detail.tag,\n      attributes: {\n        type: 'text',\n        ...detail.inputAttributes\n      },\n      styles: detail.inputStyles,\n      classes: detail.inputClasses\n    });\n\n    const factory$l = (detail, _spec) => ({\n      uid: detail.uid,\n      dom: dom(detail),\n      components: [],\n      behaviours: behaviours(detail),\n      eventOrder: detail.eventOrder\n    });\n    const Input = single({\n      name: 'Input',\n      configFields: schema$l(),\n      factory: factory$l\n    });\n\n    const refetchTriggerEvent = generate$6('refetch-trigger-event');\n    const redirectMenuItemInteractionEvent = generate$6('redirect-menu-item-interaction');\n\n    const menuSearcherClass = 'tox-menu__searcher';\n    const findWithinSandbox = sandboxComp => {\n      return descendant(sandboxComp.element, `.${ menuSearcherClass }`).bind(inputElem => sandboxComp.getSystem().getByDom(inputElem).toOptional());\n    };\n    const findWithinMenu = findWithinSandbox;\n    const restoreState = (inputComp, searcherState) => {\n      Representing.setValue(inputComp, searcherState.fetchPattern);\n      inputComp.element.dom.selectionStart = searcherState.selectionStart;\n      inputComp.element.dom.selectionEnd = searcherState.selectionEnd;\n    };\n    const saveState = inputComp => {\n      const fetchPattern = Representing.getValue(inputComp);\n      const selectionStart = inputComp.element.dom.selectionStart;\n      const selectionEnd = inputComp.element.dom.selectionEnd;\n      return {\n        fetchPattern,\n        selectionStart,\n        selectionEnd\n      };\n    };\n    const setActiveDescendant = (inputComp, active) => {\n      getOpt(active.element, 'id').each(id => set$9(inputComp.element, 'aria-activedescendant', id));\n    };\n    const renderMenuSearcher = spec => {\n      const handleByBrowser = (comp, se) => {\n        se.cut();\n        return Optional.none();\n      };\n      const handleByHighlightedItem = (comp, se) => {\n        const eventData = {\n          interactionEvent: se.event,\n          eventType: se.event.raw.type\n        };\n        emitWith(comp, redirectMenuItemInteractionEvent, eventData);\n        return Optional.some(true);\n      };\n      const customSearcherEventsName = 'searcher-events';\n      return {\n        dom: {\n          tag: 'div',\n          classes: [selectableClass]\n        },\n        components: [Input.sketch({\n            inputClasses: [\n              menuSearcherClass,\n              'tox-textfield'\n            ],\n            inputAttributes: {\n              ...spec.placeholder.map(placeholder => ({ placeholder: spec.i18n(placeholder) })).getOr({}),\n              'type': 'search',\n              'aria-autocomplete': 'list'\n            },\n            inputBehaviours: derive$1([\n              config(customSearcherEventsName, [\n                run$1(input(), inputComp => {\n                  emit(inputComp, refetchTriggerEvent);\n                }),\n                run$1(keydown(), (inputComp, se) => {\n                  if (se.event.raw.key === 'Escape') {\n                    se.stop();\n                  }\n                })\n              ]),\n              Keying.config({\n                mode: 'special',\n                onLeft: handleByBrowser,\n                onRight: handleByBrowser,\n                onSpace: handleByBrowser,\n                onEnter: handleByHighlightedItem,\n                onEscape: handleByHighlightedItem,\n                onUp: handleByHighlightedItem,\n                onDown: handleByHighlightedItem\n              })\n            ]),\n            eventOrder: {\n              keydown: [\n                customSearcherEventsName,\n                Keying.name()\n              ]\n            }\n          })]\n      };\n    };\n\n    const searchResultsClass = 'tox-collection--results__js';\n    const augmentWithAria = item => {\n      var _a;\n      if (item.dom) {\n        return {\n          ...item,\n          dom: {\n            ...item.dom,\n            attributes: {\n              ...(_a = item.dom.attributes) !== null && _a !== void 0 ? _a : {},\n              'id': generate$6('aria-item-search-result-id'),\n              'aria-selected': 'false'\n            }\n          }\n        };\n      } else {\n        return item;\n      }\n    };\n\n    const chunk = (rowDom, numColumns) => items => {\n      const chunks = chunk$1(items, numColumns);\n      return map$2(chunks, c => ({\n        dom: rowDom,\n        components: c\n      }));\n    };\n    const forSwatch = columns => ({\n      dom: {\n        tag: 'div',\n        classes: [\n          'tox-menu',\n          'tox-swatches-menu'\n        ]\n      },\n      components: [{\n          dom: {\n            tag: 'div',\n            classes: ['tox-swatches']\n          },\n          components: [Menu.parts.items({\n              preprocess: columns !== 'auto' ? chunk({\n                tag: 'div',\n                classes: ['tox-swatches__row']\n              }, columns) : identity\n            })]\n        }]\n    });\n    const forToolbar = columns => ({\n      dom: {\n        tag: 'div',\n        classes: [\n          'tox-menu',\n          'tox-collection',\n          'tox-collection--toolbar',\n          'tox-collection--toolbar-lg'\n        ]\n      },\n      components: [Menu.parts.items({\n          preprocess: chunk({\n            tag: 'div',\n            classes: ['tox-collection__group']\n          }, columns)\n        })]\n    });\n    const preprocessCollection = (items, isSeparator) => {\n      const allSplits = [];\n      let currentSplit = [];\n      each$1(items, (item, i) => {\n        if (isSeparator(item, i)) {\n          if (currentSplit.length > 0) {\n            allSplits.push(currentSplit);\n          }\n          currentSplit = [];\n          if (has$2(item.dom, 'innerHtml') || item.components && item.components.length > 0) {\n            currentSplit.push(item);\n          }\n        } else {\n          currentSplit.push(item);\n        }\n      });\n      if (currentSplit.length > 0) {\n        allSplits.push(currentSplit);\n      }\n      return map$2(allSplits, s => ({\n        dom: {\n          tag: 'div',\n          classes: ['tox-collection__group']\n        },\n        components: s\n      }));\n    };\n    const insertItemsPlaceholder = (columns, initItems, onItem) => {\n      return Menu.parts.items({\n        preprocess: rawItems => {\n          const enrichedItems = map$2(rawItems, onItem);\n          if (columns !== 'auto' && columns > 1) {\n            return chunk({\n              tag: 'div',\n              classes: ['tox-collection__group']\n            }, columns)(enrichedItems);\n          } else {\n            return preprocessCollection(enrichedItems, (_item, i) => initItems[i].type === 'separator');\n          }\n        }\n      });\n    };\n    const forCollection = (columns, initItems, _hasIcons = true) => ({\n      dom: {\n        tag: 'div',\n        classes: [\n          'tox-menu',\n          'tox-collection'\n        ].concat(columns === 1 ? ['tox-collection--list'] : ['tox-collection--grid'])\n      },\n      components: [insertItemsPlaceholder(columns, initItems, identity)]\n    });\n    const forCollectionWithSearchResults = (columns, initItems, _hasIcons = true) => {\n      const ariaControlsSearchResults = generate$6('aria-controls-search-results');\n      return {\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-menu',\n            'tox-collection',\n            searchResultsClass\n          ].concat(columns === 1 ? ['tox-collection--list'] : ['tox-collection--grid']),\n          attributes: { id: ariaControlsSearchResults }\n        },\n        components: [insertItemsPlaceholder(columns, initItems, augmentWithAria)]\n      };\n    };\n    const forCollectionWithSearchField = (columns, initItems, searchField) => {\n      const ariaControlsSearchResults = generate$6('aria-controls-search-results');\n      return {\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-menu',\n            'tox-collection'\n          ].concat(columns === 1 ? ['tox-collection--list'] : ['tox-collection--grid'])\n        },\n        components: [\n          renderMenuSearcher({\n            i18n: global$8.translate,\n            placeholder: searchField.placeholder\n          }),\n          {\n            dom: {\n              tag: 'div',\n              classes: [\n                ...columns === 1 ? ['tox-collection--list'] : ['tox-collection--grid'],\n                searchResultsClass\n              ],\n              attributes: { id: ariaControlsSearchResults }\n            },\n            components: [insertItemsPlaceholder(columns, initItems, augmentWithAria)]\n          }\n        ]\n      };\n    };\n    const forHorizontalCollection = (initItems, _hasIcons = true) => ({\n      dom: {\n        tag: 'div',\n        classes: [\n          'tox-collection',\n          'tox-collection--horizontal'\n        ]\n      },\n      components: [Menu.parts.items({ preprocess: items => preprocessCollection(items, (_item, i) => initItems[i].type === 'separator') })]\n    });\n\n    const menuHasIcons = xs => exists(xs, item => 'icon' in item && item.icon !== undefined);\n    const handleError = error => {\n      console.error(formatError(error));\n      console.log(error);\n      return Optional.none();\n    };\n    const createHorizontalPartialMenuWithAlloyItems = (value, _hasIcons, items, _columns, _menuLayout) => {\n      const structure = forHorizontalCollection(items);\n      return {\n        value,\n        dom: structure.dom,\n        components: structure.components,\n        items\n      };\n    };\n    const createPartialMenuWithAlloyItems = (value, hasIcons, items, columns, menuLayout) => {\n      const getNormalStructure = () => {\n        if (menuLayout.menuType !== 'searchable') {\n          return forCollection(columns, items);\n        } else {\n          return menuLayout.searchMode.searchMode === 'search-with-field' ? forCollectionWithSearchField(columns, items, menuLayout.searchMode) : forCollectionWithSearchResults(columns, items);\n        }\n      };\n      if (menuLayout.menuType === 'color') {\n        const structure = forSwatch(columns);\n        return {\n          value,\n          dom: structure.dom,\n          components: structure.components,\n          items\n        };\n      } else if (menuLayout.menuType === 'normal' && columns === 'auto') {\n        const structure = forCollection(columns, items);\n        return {\n          value,\n          dom: structure.dom,\n          components: structure.components,\n          items\n        };\n      } else if (menuLayout.menuType === 'normal' || menuLayout.menuType === 'searchable') {\n        const structure = getNormalStructure();\n        return {\n          value,\n          dom: structure.dom,\n          components: structure.components,\n          items\n        };\n      } else if (menuLayout.menuType === 'listpreview' && columns !== 'auto') {\n        const structure = forToolbar(columns);\n        return {\n          value,\n          dom: structure.dom,\n          components: structure.components,\n          items\n        };\n      } else {\n        return {\n          value,\n          dom: dom$1(hasIcons, columns, menuLayout.menuType),\n          components: components,\n          items\n        };\n      }\n    };\n\n    const type = requiredString('type');\n    const name$1 = requiredString('name');\n    const label = requiredString('label');\n    const text = requiredString('text');\n    const title = requiredString('title');\n    const icon = requiredString('icon');\n    const value$1 = requiredString('value');\n    const fetch$1 = requiredFunction('fetch');\n    const getSubmenuItems = requiredFunction('getSubmenuItems');\n    const onAction = requiredFunction('onAction');\n    const onItemAction = requiredFunction('onItemAction');\n    const onSetup = defaultedFunction('onSetup', () => noop);\n    const optionalName = optionString('name');\n    const optionalText = optionString('text');\n    const optionalIcon = optionString('icon');\n    const optionalTooltip = optionString('tooltip');\n    const optionalLabel = optionString('label');\n    const optionalShortcut = optionString('shortcut');\n    const optionalSelect = optionFunction('select');\n    const active = defaultedBoolean('active', false);\n    const borderless = defaultedBoolean('borderless', false);\n    const enabled = defaultedBoolean('enabled', true);\n    const primary = defaultedBoolean('primary', false);\n    const defaultedColumns = num => defaulted('columns', num);\n    const defaultedMeta = defaulted('meta', {});\n    const defaultedOnAction = defaultedFunction('onAction', noop);\n    const defaultedType = type => defaultedString('type', type);\n    const generatedName = namePrefix => field$1('name', 'name', defaultedThunk(() => generate$6(`${ namePrefix }-name`)), string);\n    const generatedValue = valuePrefix => field$1('value', 'value', defaultedThunk(() => generate$6(`${ valuePrefix }-value`)), anyValue());\n\n    const separatorMenuItemSchema = objOf([\n      type,\n      optionalText\n    ]);\n    const createSeparatorMenuItem = spec => asRaw('separatormenuitem', separatorMenuItemSchema, spec);\n\n    const autocompleterItemSchema = objOf([\n      defaultedType('autocompleteitem'),\n      active,\n      enabled,\n      defaultedMeta,\n      value$1,\n      optionalText,\n      optionalIcon\n    ]);\n    const createSeparatorItem = spec => asRaw('Autocompleter.Separator', separatorMenuItemSchema, spec);\n    const createAutocompleterItem = spec => asRaw('Autocompleter.Item', autocompleterItemSchema, spec);\n\n    const baseToolbarButtonFields = [\n      enabled,\n      optionalTooltip,\n      optionalIcon,\n      optionalText,\n      onSetup\n    ];\n    const toolbarButtonSchema = objOf([\n      type,\n      onAction,\n      optionalShortcut\n    ].concat(baseToolbarButtonFields));\n    const createToolbarButton = spec => asRaw('toolbarbutton', toolbarButtonSchema, spec);\n\n    const baseToolbarToggleButtonFields = [active].concat(baseToolbarButtonFields);\n    const toggleButtonSchema = objOf(baseToolbarToggleButtonFields.concat([\n      type,\n      onAction,\n      optionalShortcut\n    ]));\n    const createToggleButton = spec => asRaw('ToggleButton', toggleButtonSchema, spec);\n\n    const contextBarFields = [\n      defaultedFunction('predicate', never),\n      defaultedStringEnum('scope', 'node', [\n        'node',\n        'editor'\n      ]),\n      defaultedStringEnum('position', 'selection', [\n        'node',\n        'selection',\n        'line'\n      ])\n    ];\n\n    const contextButtonFields = baseToolbarButtonFields.concat([\n      defaultedType('contextformbutton'),\n      primary,\n      onAction,\n      customField('original', identity)\n    ]);\n    const contextToggleButtonFields = baseToolbarToggleButtonFields.concat([\n      defaultedType('contextformbutton'),\n      primary,\n      onAction,\n      customField('original', identity)\n    ]);\n    const launchButtonFields = baseToolbarButtonFields.concat([defaultedType('contextformbutton')]);\n    const launchToggleButtonFields = baseToolbarToggleButtonFields.concat([defaultedType('contextformtogglebutton')]);\n    const toggleOrNormal = choose$1('type', {\n      contextformbutton: contextButtonFields,\n      contextformtogglebutton: contextToggleButtonFields\n    });\n    const contextFormSchema = objOf([\n      defaultedType('contextform'),\n      defaultedFunction('initValue', constant$1('')),\n      optionalLabel,\n      requiredArrayOf('commands', toggleOrNormal),\n      optionOf('launch', choose$1('type', {\n        contextformbutton: launchButtonFields,\n        contextformtogglebutton: launchToggleButtonFields\n      }))\n    ].concat(contextBarFields));\n    const createContextForm = spec => asRaw('ContextForm', contextFormSchema, spec);\n\n    const contextToolbarSchema = objOf([\n      defaultedType('contexttoolbar'),\n      requiredString('items')\n    ].concat(contextBarFields));\n    const createContextToolbar = spec => asRaw('ContextToolbar', contextToolbarSchema, spec);\n\n    const cardImageFields = [\n      type,\n      requiredString('src'),\n      optionString('alt'),\n      defaultedArrayOf('classes', [], string)\n    ];\n    const cardImageSchema = objOf(cardImageFields);\n\n    const cardTextFields = [\n      type,\n      text,\n      optionalName,\n      defaultedArrayOf('classes', ['tox-collection__item-label'], string)\n    ];\n    const cardTextSchema = objOf(cardTextFields);\n\n    const itemSchema$1 = valueThunk(() => choose$2('type', {\n      cardimage: cardImageSchema,\n      cardtext: cardTextSchema,\n      cardcontainer: cardContainerSchema\n    }));\n    const cardContainerSchema = objOf([\n      type,\n      defaultedString('direction', 'horizontal'),\n      defaultedString('align', 'left'),\n      defaultedString('valign', 'middle'),\n      requiredArrayOf('items', itemSchema$1)\n    ]);\n\n    const commonMenuItemFields = [\n      enabled,\n      optionalText,\n      optionalShortcut,\n      generatedValue('menuitem'),\n      defaultedMeta\n    ];\n\n    const cardMenuItemSchema = objOf([\n      type,\n      optionalLabel,\n      requiredArrayOf('items', itemSchema$1),\n      onSetup,\n      defaultedOnAction\n    ].concat(commonMenuItemFields));\n    const createCardMenuItem = spec => asRaw('cardmenuitem', cardMenuItemSchema, spec);\n\n    const choiceMenuItemSchema = objOf([\n      type,\n      active,\n      optionalIcon\n    ].concat(commonMenuItemFields));\n    const createChoiceMenuItem = spec => asRaw('choicemenuitem', choiceMenuItemSchema, spec);\n\n    const baseFields = [\n      type,\n      requiredString('fancytype'),\n      defaultedOnAction\n    ];\n    const insertTableFields = [defaulted('initData', {})].concat(baseFields);\n    const colorSwatchFields = [\n      optionFunction('select'),\n      defaultedObjOf('initData', {}, [\n        defaultedBoolean('allowCustomColors', true),\n        defaultedString('storageKey', 'default'),\n        optionArrayOf('colors', anyValue())\n      ])\n    ].concat(baseFields);\n    const fancyMenuItemSchema = choose$1('fancytype', {\n      inserttable: insertTableFields,\n      colorswatch: colorSwatchFields\n    });\n    const createFancyMenuItem = spec => asRaw('fancymenuitem', fancyMenuItemSchema, spec);\n\n    const menuItemSchema = objOf([\n      type,\n      onSetup,\n      defaultedOnAction,\n      optionalIcon\n    ].concat(commonMenuItemFields));\n    const createMenuItem = spec => asRaw('menuitem', menuItemSchema, spec);\n\n    const nestedMenuItemSchema = objOf([\n      type,\n      getSubmenuItems,\n      onSetup,\n      optionalIcon\n    ].concat(commonMenuItemFields));\n    const createNestedMenuItem = spec => asRaw('nestedmenuitem', nestedMenuItemSchema, spec);\n\n    const toggleMenuItemSchema = objOf([\n      type,\n      optionalIcon,\n      active,\n      onSetup,\n      onAction\n    ].concat(commonMenuItemFields));\n    const createToggleMenuItem = spec => asRaw('togglemenuitem', toggleMenuItemSchema, spec);\n\n    const detectSize = (comp, margin, selectorClass) => {\n      const descendants$1 = descendants(comp.element, '.' + selectorClass);\n      if (descendants$1.length > 0) {\n        const columnLength = findIndex$1(descendants$1, c => {\n          const thisTop = c.dom.getBoundingClientRect().top;\n          const cTop = descendants$1[0].dom.getBoundingClientRect().top;\n          return Math.abs(thisTop - cTop) > margin;\n        }).getOr(descendants$1.length);\n        return Optional.some({\n          numColumns: columnLength,\n          numRows: Math.ceil(descendants$1.length / columnLength)\n        });\n      } else {\n        return Optional.none();\n      }\n    };\n\n    const namedEvents = (name, handlers) => derive$1([config(name, handlers)]);\n    const unnamedEvents = handlers => namedEvents(generate$6('unnamed-events'), handlers);\n    const SimpleBehaviours = {\n      namedEvents,\n      unnamedEvents\n    };\n\n    const ExclusivityChannel = generate$6('tooltip.exclusive');\n    const ShowTooltipEvent = generate$6('tooltip.show');\n    const HideTooltipEvent = generate$6('tooltip.hide');\n    const ImmediateHideTooltipEvent = generate$6('tooltip.immediateHide');\n    const ImmediateShowTooltipEvent = generate$6('tooltip.immediateShow');\n\n    const hideAllExclusive = (component, _tConfig, _tState) => {\n      component.getSystem().broadcastOn([ExclusivityChannel], {});\n    };\n    const setComponents = (component, tConfig, tState, specs) => {\n      tState.getTooltip().each(tooltip => {\n        if (tooltip.getSystem().isConnected()) {\n          Replacing.set(tooltip, specs);\n        }\n      });\n    };\n\n    var TooltippingApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        hideAllExclusive: hideAllExclusive,\n        setComponents: setComponents\n    });\n\n    const events$9 = (tooltipConfig, state) => {\n      const hide = comp => {\n        state.getTooltip().each(p => {\n          if (p.getSystem().isConnected()) {\n            detach(p);\n            tooltipConfig.onHide(comp, p);\n            state.clearTooltip();\n          }\n        });\n        state.clearTimer();\n      };\n      const show = comp => {\n        if (!state.isShowing()) {\n          hideAllExclusive(comp);\n          const sink = tooltipConfig.lazySink(comp).getOrDie();\n          const popup = comp.getSystem().build({\n            dom: tooltipConfig.tooltipDom,\n            components: tooltipConfig.tooltipComponents,\n            events: derive$2(tooltipConfig.mode === 'normal' ? [\n              run$1(mouseover(), _ => {\n                emit(comp, ShowTooltipEvent);\n              }),\n              run$1(mouseout(), _ => {\n                emit(comp, HideTooltipEvent);\n              })\n            ] : []),\n            behaviours: derive$1([Replacing.config({})])\n          });\n          state.setTooltip(popup);\n          attach(sink, popup);\n          tooltipConfig.onShow(comp, popup);\n          Positioning.position(sink, popup, { anchor: tooltipConfig.anchor(comp) });\n        }\n      };\n      const reposition = comp => {\n        state.getTooltip().each(tooltip => {\n          const sink = tooltipConfig.lazySink(comp).getOrDie();\n          Positioning.position(sink, tooltip, { anchor: tooltipConfig.anchor(comp) });\n        });\n      };\n      const getEvents = () => {\n        switch (tooltipConfig.mode) {\n        case 'normal':\n          return [\n            run$1(focusin(), comp => {\n              emit(comp, ImmediateShowTooltipEvent);\n            }),\n            run$1(postBlur(), comp => {\n              emit(comp, ImmediateHideTooltipEvent);\n            }),\n            run$1(mouseover(), comp => {\n              emit(comp, ShowTooltipEvent);\n            }),\n            run$1(mouseout(), comp => {\n              emit(comp, HideTooltipEvent);\n            })\n          ];\n        case 'follow-highlight':\n          return [\n            run$1(highlight$1(), (comp, _se) => {\n              emit(comp, ShowTooltipEvent);\n            }),\n            run$1(dehighlight$1(), comp => {\n              emit(comp, HideTooltipEvent);\n            })\n          ];\n        case 'children-normal':\n          return [\n            run$1(focusin(), (comp, se) => {\n              search(comp.element).each(_ => {\n                if (is(se.event.target, '[data-mce-tooltip]')) {\n                  state.getTooltip().fold(() => {\n                    emit(comp, ImmediateShowTooltipEvent);\n                  }, tooltip => {\n                    if (state.isShowing()) {\n                      tooltipConfig.onShow(comp, tooltip);\n                      reposition(comp);\n                    }\n                  });\n                }\n              });\n            }),\n            run$1(postBlur(), comp => {\n              search(comp.element).fold(() => {\n                emit(comp, ImmediateHideTooltipEvent);\n              }, noop);\n            }),\n            run$1(mouseover(), comp => {\n              descendant(comp.element, '[data-mce-tooltip]:hover').each(_ => {\n                state.getTooltip().fold(() => {\n                  emit(comp, ShowTooltipEvent);\n                }, tooltip => {\n                  if (state.isShowing()) {\n                    tooltipConfig.onShow(comp, tooltip);\n                    reposition(comp);\n                  }\n                });\n              });\n            }),\n            run$1(mouseout(), comp => {\n              descendant(comp.element, '[data-mce-tooltip]:hover').fold(() => {\n                emit(comp, HideTooltipEvent);\n              }, noop);\n            })\n          ];\n        default:\n          return [\n            run$1(focusin(), (comp, se) => {\n              search(comp.element).each(_ => {\n                if (is(se.event.target, '[data-mce-tooltip]')) {\n                  state.getTooltip().fold(() => {\n                    emit(comp, ImmediateShowTooltipEvent);\n                  }, tooltip => {\n                    if (state.isShowing()) {\n                      tooltipConfig.onShow(comp, tooltip);\n                      reposition(comp);\n                    }\n                  });\n                }\n              });\n            }),\n            run$1(postBlur(), comp => {\n              search(comp.element).fold(() => {\n                emit(comp, ImmediateHideTooltipEvent);\n              }, noop);\n            })\n          ];\n        }\n      };\n      return derive$2(flatten([\n        [\n          run$1(ShowTooltipEvent, comp => {\n            state.resetTimer(() => {\n              show(comp);\n            }, tooltipConfig.delayForShow());\n          }),\n          run$1(HideTooltipEvent, comp => {\n            state.resetTimer(() => {\n              hide(comp);\n            }, tooltipConfig.delayForHide());\n          }),\n          run$1(ImmediateShowTooltipEvent, comp => {\n            state.resetTimer(() => {\n              show(comp);\n            }, 0);\n          }),\n          run$1(ImmediateHideTooltipEvent, comp => {\n            state.resetTimer(() => {\n              hide(comp);\n            }, 0);\n          }),\n          run$1(receive(), (comp, message) => {\n            const receivingData = message;\n            if (!receivingData.universal) {\n              if (contains$2(receivingData.channels, ExclusivityChannel)) {\n                hide(comp);\n              }\n            }\n          }),\n          runOnDetached(comp => {\n            hide(comp);\n          })\n        ],\n        getEvents()\n      ]));\n    };\n\n    var ActiveTooltipping = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$9\n    });\n\n    var TooltippingSchema = [\n      required$1('lazySink'),\n      required$1('tooltipDom'),\n      defaulted('exclusive', true),\n      defaulted('tooltipComponents', []),\n      defaultedFunction('delayForShow', constant$1(300)),\n      defaultedFunction('delayForHide', constant$1(300)),\n      defaultedStringEnum('mode', 'normal', [\n        'normal',\n        'follow-highlight',\n        'children-keyboard-focus',\n        'children-normal'\n      ]),\n      defaulted('anchor', comp => ({\n        type: 'hotspot',\n        hotspot: comp,\n        layouts: {\n          onLtr: constant$1([\n            south$2,\n            north$2,\n            southeast$2,\n            northeast$2,\n            southwest$2,\n            northwest$2\n          ]),\n          onRtl: constant$1([\n            south$2,\n            north$2,\n            southeast$2,\n            northeast$2,\n            southwest$2,\n            northwest$2\n          ])\n        },\n        bubble: nu$5(0, -2, {})\n      })),\n      onHandler('onHide'),\n      onHandler('onShow')\n    ];\n\n    const init$b = () => {\n      const timer = value$2();\n      const popup = value$2();\n      const clearTimer = () => {\n        timer.on(clearTimeout);\n      };\n      const resetTimer = (f, delay) => {\n        clearTimer();\n        timer.set(setTimeout(f, delay));\n      };\n      const readState = constant$1('not-implemented');\n      return nu$8({\n        getTooltip: popup.get,\n        isShowing: popup.isSet,\n        setTooltip: popup.set,\n        clearTooltip: popup.clear,\n        clearTimer,\n        resetTimer,\n        readState\n      });\n    };\n\n    var TooltippingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$b\n    });\n\n    const Tooltipping = create$4({\n      fields: TooltippingSchema,\n      name: 'tooltipping',\n      active: ActiveTooltipping,\n      state: TooltippingState,\n      apis: TooltippingApis\n    });\n\n    const escape = text => text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n    const ReadOnlyChannel = 'silver.readonly';\n    const ReadOnlyDataSchema = objOf([requiredBoolean('readonly')]);\n    const broadcastReadonly = (uiRefs, readonly) => {\n      const outerContainer = uiRefs.mainUi.outerContainer;\n      const target = outerContainer.element;\n      const motherships = [\n        uiRefs.mainUi.mothership,\n        ...uiRefs.uiMotherships\n      ];\n      if (readonly) {\n        each$1(motherships, m => {\n          m.broadcastOn([dismissPopups()], { target });\n        });\n      }\n      each$1(motherships, m => {\n        m.broadcastOn([ReadOnlyChannel], { readonly });\n      });\n    };\n    const setupReadonlyModeSwitch = (editor, uiRefs) => {\n      editor.on('init', () => {\n        if (editor.mode.isReadOnly()) {\n          broadcastReadonly(uiRefs, true);\n        }\n      });\n      editor.on('SwitchMode', () => broadcastReadonly(uiRefs, editor.mode.isReadOnly()));\n      if (isReadOnly(editor)) {\n        editor.mode.set('readonly');\n      }\n    };\n    const receivingConfig = () => Receiving.config({\n      channels: {\n        [ReadOnlyChannel]: {\n          schema: ReadOnlyDataSchema,\n          onReceive: (comp, data) => {\n            Disabling.set(comp, data.readonly);\n          }\n        }\n      }\n    });\n\n    const item = disabled => Disabling.config({\n      disabled,\n      disableClass: 'tox-collection__item--state-disabled'\n    });\n    const button = disabled => Disabling.config({ disabled });\n    const splitButton = disabled => Disabling.config({\n      disabled,\n      disableClass: 'tox-tbtn--disabled'\n    });\n    const toolbarButton = disabled => Disabling.config({\n      disabled,\n      disableClass: 'tox-tbtn--disabled',\n      useNative: false\n    });\n    const DisablingConfigs = {\n      item,\n      button,\n      splitButton,\n      toolbarButton\n    };\n\n    const runWithApi = (info, comp) => {\n      const api = info.getApi(comp);\n      return f => {\n        f(api);\n      };\n    };\n    const onControlAttached = (info, editorOffCell) => runOnAttached(comp => {\n      const run = runWithApi(info, comp);\n      run(api => {\n        const onDestroy = info.onSetup(api);\n        if (isFunction(onDestroy)) {\n          editorOffCell.set(onDestroy);\n        }\n      });\n    });\n    const onControlDetached = (getApi, editorOffCell) => runOnDetached(comp => runWithApi(getApi, comp)(editorOffCell.get()));\n\n    const onMenuItemExecute = (info, itemResponse) => runOnExecute$1((comp, simulatedEvent) => {\n      runWithApi(info, comp)(info.onAction);\n      if (!info.triggersSubmenu && itemResponse === ItemResponse$1.CLOSE_ON_EXECUTE) {\n        if (comp.getSystem().isConnected()) {\n          emit(comp, sandboxClose());\n        }\n        simulatedEvent.stop();\n      }\n    });\n    const menuItemEventOrder = {\n      [execute$5()]: [\n        'disabling',\n        'alloy.base.behaviour',\n        'toggling',\n        'item-events'\n      ]\n    };\n\n    const componentRenderPipeline = cat;\n    const renderCommonItem = (spec, structure, itemResponse, providersBackstage) => {\n      const editorOffCell = Cell(noop);\n      return {\n        type: 'item',\n        dom: structure.dom,\n        components: componentRenderPipeline(structure.optComponents),\n        data: spec.data,\n        eventOrder: menuItemEventOrder,\n        hasSubmenu: spec.triggersSubmenu,\n        itemBehaviours: derive$1([\n          config('item-events', [\n            onMenuItemExecute(spec, itemResponse),\n            onControlAttached(spec, editorOffCell),\n            onControlDetached(spec, editorOffCell)\n          ]),\n          DisablingConfigs.item(() => !spec.enabled || providersBackstage.isDisabled()),\n          receivingConfig(),\n          Replacing.config({})\n        ].concat(spec.itemBehaviours))\n      };\n    };\n    const buildData = source => ({\n      value: source.value,\n      meta: {\n        text: source.text.getOr(''),\n        ...source.meta\n      }\n    });\n\n    const convertText = source => {\n      const isMac = global$5.os.isMacOS() || global$5.os.isiOS();\n      const mac = {\n        alt: '\\u2325',\n        ctrl: '\\u2303',\n        shift: '\\u21E7',\n        meta: '\\u2318',\n        access: '\\u2303\\u2325'\n      };\n      const other = {\n        meta: 'Ctrl',\n        access: 'Shift+Alt'\n      };\n      const replace = isMac ? mac : other;\n      const shortcut = source.split('+');\n      const updated = map$2(shortcut, segment => {\n        const search = segment.toLowerCase().trim();\n        return has$2(replace, search) ? replace[search] : segment;\n      });\n      return isMac ? updated.join('') : updated.join('+');\n    };\n\n    const renderIcon$2 = (name, icons, classes = [iconClass]) => render$3(name, {\n      tag: 'div',\n      classes\n    }, icons);\n    const renderText = text => ({\n      dom: {\n        tag: 'div',\n        classes: [textClass]\n      },\n      components: [text$2(global$8.translate(text))]\n    });\n    const renderHtml = (html, classes) => ({\n      dom: {\n        tag: 'div',\n        classes,\n        innerHtml: html\n      }\n    });\n    const renderStyledText = (style, text) => ({\n      dom: {\n        tag: 'div',\n        classes: [textClass]\n      },\n      components: [{\n          dom: {\n            tag: style.tag,\n            styles: style.styles\n          },\n          components: [text$2(global$8.translate(text))]\n        }]\n    });\n    const renderShortcut = shortcut => ({\n      dom: {\n        tag: 'div',\n        classes: [accessoryClass]\n      },\n      components: [text$2(convertText(shortcut))]\n    });\n    const renderCheckmark = icons => renderIcon$2('checkmark', icons, [checkmarkClass]);\n    const renderSubmenuCaret = icons => renderIcon$2('chevron-right', icons, [caretClass]);\n    const renderDownwardsCaret = icons => renderIcon$2('chevron-down', icons, [caretClass]);\n    const renderContainer = (container, components) => {\n      const directionClass = container.direction === 'vertical' ? containerColumnClass : containerRowClass;\n      const alignClass = container.align === 'left' ? containerAlignLeftClass : containerAlignRightClass;\n      const getValignClass = () => {\n        switch (container.valign) {\n        case 'top':\n          return containerValignTopClass;\n        case 'middle':\n          return containerValignMiddleClass;\n        case 'bottom':\n          return containerValignBottomClass;\n        }\n      };\n      return {\n        dom: {\n          tag: 'div',\n          classes: [\n            containerClass,\n            directionClass,\n            alignClass,\n            getValignClass()\n          ]\n        },\n        components\n      };\n    };\n    const renderImage = (src, classes, alt) => ({\n      dom: {\n        tag: 'img',\n        classes,\n        attributes: {\n          src,\n          alt: alt.getOr('')\n        }\n      }\n    });\n\n    const renderColorStructure = (item, providerBackstage, fallbackIcon) => {\n      const colorPickerCommand = 'custom';\n      const removeColorCommand = 'remove';\n      const itemValue = item.value;\n      const iconSvg = item.iconContent.map(name => getOr(name, providerBackstage.icons, fallbackIcon));\n      const attributes = item.ariaLabel.map(al => ({\n        'aria-label': providerBackstage.translate(al),\n        'data-mce-name': al\n      })).getOr({});\n      const getDom = () => {\n        const common = colorClass;\n        const icon = iconSvg.getOr('');\n        const baseDom = {\n          tag: 'div',\n          attributes,\n          classes: [common]\n        };\n        if (itemValue === colorPickerCommand) {\n          return {\n            ...baseDom,\n            tag: 'button',\n            classes: [\n              ...baseDom.classes,\n              'tox-swatches__picker-btn'\n            ],\n            innerHtml: icon\n          };\n        } else if (itemValue === removeColorCommand) {\n          return {\n            ...baseDom,\n            classes: [\n              ...baseDom.classes,\n              'tox-swatch--remove'\n            ],\n            innerHtml: icon\n          };\n        } else if (isNonNullable(itemValue)) {\n          return {\n            ...baseDom,\n            attributes: {\n              ...baseDom.attributes,\n              'data-mce-color': itemValue\n            },\n            styles: { 'background-color': itemValue },\n            innerHtml: icon\n          };\n        } else {\n          return baseDom;\n        }\n      };\n      return {\n        dom: getDom(),\n        optComponents: []\n      };\n    };\n    const renderItemDomStructure = ariaLabel => {\n      const domTitle = ariaLabel.map(label => ({\n        attributes: {\n          'id': generate$6('menu-item'),\n          'aria-label': global$8.translate(label)\n        }\n      })).getOr({});\n      return {\n        tag: 'div',\n        classes: [\n          navClass,\n          selectableClass\n        ],\n        ...domTitle\n      };\n    };\n    const renderNormalItemStructure = (info, providersBackstage, renderIcons, fallbackIcon) => {\n      const iconSpec = {\n        tag: 'div',\n        classes: [iconClass]\n      };\n      const renderIcon = iconName => render$3(iconName, iconSpec, providersBackstage.icons, fallbackIcon);\n      const renderEmptyIcon = () => Optional.some({ dom: iconSpec });\n      const leftIcon = renderIcons ? info.iconContent.map(renderIcon).orThunk(renderEmptyIcon) : Optional.none();\n      const checkmark = info.checkMark;\n      const textRender = Optional.from(info.meta).fold(() => renderText, meta => has$2(meta, 'style') ? curry(renderStyledText, meta.style) : renderText);\n      const content = info.htmlContent.fold(() => info.textContent.map(textRender), html => Optional.some(renderHtml(html, [textClass])));\n      const menuItem = {\n        dom: renderItemDomStructure(info.ariaLabel),\n        optComponents: [\n          leftIcon,\n          content,\n          info.shortcutContent.map(renderShortcut),\n          checkmark,\n          info.caret\n        ]\n      };\n      return menuItem;\n    };\n    const renderItemStructure = (info, providersBackstage, renderIcons, fallbackIcon = Optional.none()) => {\n      if (info.presets === 'color') {\n        return renderColorStructure(info, providersBackstage, fallbackIcon);\n      } else {\n        return renderNormalItemStructure(info, providersBackstage, renderIcons, fallbackIcon);\n      }\n    };\n\n    const tooltipBehaviour = (meta, sharedBackstage, tooltipText) => get$g(meta, 'tooltipWorker').map(tooltipWorker => [Tooltipping.config({\n        lazySink: sharedBackstage.getSink,\n        tooltipDom: {\n          tag: 'div',\n          classes: ['tox-tooltip-worker-container']\n        },\n        tooltipComponents: [],\n        anchor: comp => ({\n          type: 'submenu',\n          item: comp,\n          overrides: { maxHeightFunction: expandable$1 }\n        }),\n        mode: 'follow-highlight',\n        onShow: (component, _tooltip) => {\n          tooltipWorker(elm => {\n            Tooltipping.setComponents(component, [external$1({ element: SugarElement.fromDom(elm) })]);\n          });\n        }\n      })]).getOrThunk(() => {\n      return tooltipText.map(text => [Tooltipping.config({\n          ...sharedBackstage.providers.tooltips.getConfig({ tooltipText: text }),\n          mode: 'follow-highlight'\n        })]).getOr([]);\n    });\n    const encodeText = text => global$7.DOM.encode(text);\n    const replaceText = (text, matchText) => {\n      const translated = global$8.translate(text);\n      const encoded = encodeText(translated);\n      if (matchText.length > 0) {\n        const escapedMatchRegex = new RegExp(escape(matchText), 'gi');\n        return encoded.replace(escapedMatchRegex, match => `<span class=\"tox-autocompleter-highlight\">${ match }</span>`);\n      } else {\n        return encoded;\n      }\n    };\n    const renderAutocompleteItem = (spec, matchText, useText, presets, onItemValueHandler, itemResponse, sharedBackstage, renderIcons = true) => {\n      const structure = renderItemStructure({\n        presets,\n        textContent: Optional.none(),\n        htmlContent: useText ? spec.text.map(text => replaceText(text, matchText)) : Optional.none(),\n        ariaLabel: spec.text,\n        iconContent: spec.icon,\n        shortcutContent: Optional.none(),\n        checkMark: Optional.none(),\n        caret: Optional.none(),\n        value: spec.value\n      }, sharedBackstage.providers, renderIcons, spec.icon);\n      const tooltipString = spec.text.filter(text => !useText && text !== '');\n      return renderCommonItem({\n        data: buildData(spec),\n        enabled: spec.enabled,\n        getApi: constant$1({}),\n        onAction: _api => onItemValueHandler(spec.value, spec.meta),\n        onSetup: constant$1(noop),\n        triggersSubmenu: false,\n        itemBehaviours: tooltipBehaviour(spec, sharedBackstage, tooltipString)\n      }, structure, itemResponse, sharedBackstage.providers);\n    };\n\n    const render$2 = (items, extras) => map$2(items, item => {\n      switch (item.type) {\n      case 'cardcontainer':\n        return renderContainer(item, render$2(item.items, extras));\n      case 'cardimage':\n        return renderImage(item.src, item.classes, item.alt);\n      case 'cardtext':\n        const shouldHighlight = item.name.exists(name => contains$2(extras.cardText.highlightOn, name));\n        const matchText = shouldHighlight ? Optional.from(extras.cardText.matchText).getOr('') : '';\n        return renderHtml(replaceText(item.text, matchText), item.classes);\n      }\n    });\n    const renderCardMenuItem = (spec, itemResponse, sharedBackstage, extras) => {\n      const getApi = component => ({\n        isEnabled: () => !Disabling.isDisabled(component),\n        setEnabled: state => {\n          Disabling.set(component, !state);\n          each$1(descendants(component.element, '*'), elm => {\n            component.getSystem().getByDom(elm).each(comp => {\n              if (comp.hasConfigured(Disabling)) {\n                Disabling.set(comp, !state);\n              }\n            });\n          });\n        }\n      });\n      const structure = {\n        dom: renderItemDomStructure(spec.label),\n        optComponents: [Optional.some({\n            dom: {\n              tag: 'div',\n              classes: [\n                containerClass,\n                containerRowClass\n              ]\n            },\n            components: render$2(spec.items, extras)\n          })]\n      };\n      return renderCommonItem({\n        data: buildData({\n          text: Optional.none(),\n          ...spec\n        }),\n        enabled: spec.enabled,\n        getApi,\n        onAction: spec.onAction,\n        onSetup: spec.onSetup,\n        triggersSubmenu: false,\n        itemBehaviours: Optional.from(extras.itemBehaviours).getOr([])\n      }, structure, itemResponse, sharedBackstage.providers);\n    };\n\n    const renderChoiceItem = (spec, useText, presets, onItemValueHandler, isSelected, itemResponse, providersBackstage, renderIcons = true) => {\n      const getApi = component => ({\n        setActive: state => {\n          Toggling.set(component, state);\n        },\n        isActive: () => Toggling.isOn(component),\n        isEnabled: () => !Disabling.isDisabled(component),\n        setEnabled: state => Disabling.set(component, !state)\n      });\n      const structure = renderItemStructure({\n        presets,\n        textContent: useText ? spec.text : Optional.none(),\n        htmlContent: Optional.none(),\n        ariaLabel: spec.text,\n        iconContent: spec.icon,\n        shortcutContent: useText ? spec.shortcut : Optional.none(),\n        checkMark: useText ? Optional.some(renderCheckmark(providersBackstage.icons)) : Optional.none(),\n        caret: Optional.none(),\n        value: spec.value\n      }, providersBackstage, renderIcons);\n      const optTooltipping = spec.text.filter(constant$1(!useText)).map(t => Tooltipping.config(providersBackstage.tooltips.getConfig({ tooltipText: providersBackstage.translate(t) })));\n      return deepMerge(renderCommonItem({\n        data: buildData(spec),\n        enabled: spec.enabled,\n        getApi,\n        onAction: _api => onItemValueHandler(spec.value),\n        onSetup: api => {\n          api.setActive(isSelected);\n          return noop;\n        },\n        triggersSubmenu: false,\n        itemBehaviours: [...optTooltipping.toArray()]\n      }, structure, itemResponse, providersBackstage), {\n        toggling: {\n          toggleClass: tickedClass,\n          toggleOnExecute: false,\n          selected: spec.active,\n          exclusive: true\n        }\n      });\n    };\n\n    const parts$f = generate$3(owner$2(), parts$h());\n\n    const hexColour = value => ({ value: normalizeHex(value) });\n    const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n    const longformRegex = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i;\n    const isHexString = hex => shorthandRegex.test(hex) || longformRegex.test(hex);\n    const normalizeHex = hex => removeLeading(hex, '#').toUpperCase();\n    const fromString$1 = hex => isHexString(hex) ? Optional.some({ value: normalizeHex(hex) }) : Optional.none();\n    const getLongForm = hex => {\n      const hexString = hex.value.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);\n      return { value: hexString };\n    };\n    const extractValues = hex => {\n      const longForm = getLongForm(hex);\n      const splitForm = longformRegex.exec(longForm.value);\n      return splitForm === null ? [\n        'FFFFFF',\n        'FF',\n        'FF',\n        'FF'\n      ] : splitForm;\n    };\n    const toHex = component => {\n      const hex = component.toString(16);\n      return (hex.length === 1 ? '0' + hex : hex).toUpperCase();\n    };\n    const fromRgba = rgbaColour => {\n      const value = toHex(rgbaColour.red) + toHex(rgbaColour.green) + toHex(rgbaColour.blue);\n      return hexColour(value);\n    };\n\n    const min = Math.min;\n    const max = Math.max;\n    const round$1 = Math.round;\n    const rgbRegex = /^\\s*rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/i;\n    const rgbaRegex = /^\\s*rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d?(?:\\.\\d+)?)\\s*\\)\\s*$/i;\n    const rgbaColour = (red, green, blue, alpha) => ({\n      red,\n      green,\n      blue,\n      alpha\n    });\n    const isRgbaComponent = value => {\n      const num = parseInt(value, 10);\n      return num.toString() === value && num >= 0 && num <= 255;\n    };\n    const fromHsv = hsv => {\n      let r;\n      let g;\n      let b;\n      const hue = (hsv.hue || 0) % 360;\n      let saturation = hsv.saturation / 100;\n      let brightness = hsv.value / 100;\n      saturation = max(0, min(saturation, 1));\n      brightness = max(0, min(brightness, 1));\n      if (saturation === 0) {\n        r = g = b = round$1(255 * brightness);\n        return rgbaColour(r, g, b, 1);\n      }\n      const side = hue / 60;\n      const chroma = brightness * saturation;\n      const x = chroma * (1 - Math.abs(side % 2 - 1));\n      const match = brightness - chroma;\n      switch (Math.floor(side)) {\n      case 0:\n        r = chroma;\n        g = x;\n        b = 0;\n        break;\n      case 1:\n        r = x;\n        g = chroma;\n        b = 0;\n        break;\n      case 2:\n        r = 0;\n        g = chroma;\n        b = x;\n        break;\n      case 3:\n        r = 0;\n        g = x;\n        b = chroma;\n        break;\n      case 4:\n        r = x;\n        g = 0;\n        b = chroma;\n        break;\n      case 5:\n        r = chroma;\n        g = 0;\n        b = x;\n        break;\n      default:\n        r = g = b = 0;\n      }\n      r = round$1(255 * (r + match));\n      g = round$1(255 * (g + match));\n      b = round$1(255 * (b + match));\n      return rgbaColour(r, g, b, 1);\n    };\n    const fromHex = hexColour => {\n      const result = extractValues(hexColour);\n      const red = parseInt(result[1], 16);\n      const green = parseInt(result[2], 16);\n      const blue = parseInt(result[3], 16);\n      return rgbaColour(red, green, blue, 1);\n    };\n    const fromStringValues = (red, green, blue, alpha) => {\n      const r = parseInt(red, 10);\n      const g = parseInt(green, 10);\n      const b = parseInt(blue, 10);\n      const a = parseFloat(alpha);\n      return rgbaColour(r, g, b, a);\n    };\n    const fromString = rgbaString => {\n      if (rgbaString === 'transparent') {\n        return Optional.some(rgbaColour(0, 0, 0, 0));\n      }\n      const rgbMatch = rgbRegex.exec(rgbaString);\n      if (rgbMatch !== null) {\n        return Optional.some(fromStringValues(rgbMatch[1], rgbMatch[2], rgbMatch[3], '1'));\n      }\n      const rgbaMatch = rgbaRegex.exec(rgbaString);\n      if (rgbaMatch !== null) {\n        return Optional.some(fromStringValues(rgbaMatch[1], rgbaMatch[2], rgbaMatch[3], rgbaMatch[4]));\n      }\n      return Optional.none();\n    };\n    const toString = rgba => `rgba(${ rgba.red },${ rgba.green },${ rgba.blue },${ rgba.alpha })`;\n    const red = rgbaColour(255, 0, 0, 1);\n\n    const fireSkinLoaded$1 = editor => {\n      editor.dispatch('SkinLoaded');\n    };\n    const fireSkinLoadError$1 = (editor, error) => {\n      editor.dispatch('SkinLoadError', error);\n    };\n    const fireResizeEditor = editor => {\n      editor.dispatch('ResizeEditor');\n    };\n    const fireResizeContent = (editor, e) => {\n      editor.dispatch('ResizeContent', e);\n    };\n    const fireScrollContent = (editor, e) => {\n      editor.dispatch('ScrollContent', e);\n    };\n    const fireTextColorChange = (editor, data) => {\n      editor.dispatch('TextColorChange', data);\n    };\n    const fireAfterProgressState = (editor, state) => {\n      editor.dispatch('AfterProgressState', { state });\n    };\n    const fireResolveName = (editor, node) => editor.dispatch('ResolveName', {\n      name: node.nodeName.toLowerCase(),\n      target: node\n    });\n    const fireToggleToolbarDrawer = (editor, state) => {\n      editor.dispatch('ToggleToolbarDrawer', { state });\n    };\n    const fireStylesTextUpdate = (editor, data) => {\n      editor.dispatch('StylesTextUpdate', data);\n    };\n    const fireAlignTextUpdate = (editor, data) => {\n      editor.dispatch('AlignTextUpdate', data);\n    };\n    const fireFontSizeTextUpdate = (editor, data) => {\n      editor.dispatch('FontSizeTextUpdate', data);\n    };\n    const fireFontSizeInputTextUpdate = (editor, data) => {\n      editor.dispatch('FontSizeInputTextUpdate', data);\n    };\n    const fireBlocksTextUpdate = (editor, data) => {\n      editor.dispatch('BlocksTextUpdate', data);\n    };\n    const fireFontFamilyTextUpdate = (editor, data) => {\n      editor.dispatch('FontFamilyTextUpdate', data);\n    };\n\n    const composeUnbinders = (f, g) => () => {\n      f();\n      g();\n    };\n    const onSetupEditableToggle = editor => onSetupEvent(editor, 'NodeChange', api => {\n      api.setEnabled(editor.selection.isEditable());\n    });\n    const onSetupFormatToggle = (editor, name) => api => {\n      const boundFormatChangeCallback = unbindable();\n      const init = () => {\n        api.setActive(editor.formatter.match(name));\n        const binding = editor.formatter.formatChanged(name, api.setActive);\n        boundFormatChangeCallback.set(binding);\n      };\n      editor.initialized ? init() : editor.once('init', init);\n      return () => {\n        editor.off('init', init);\n        boundFormatChangeCallback.clear();\n      };\n    };\n    const onSetupStateToggle = (editor, name) => api => {\n      const unbindEditableToogle = onSetupEditableToggle(editor)(api);\n      const unbindFormatToggle = onSetupFormatToggle(editor, name)(api);\n      return () => {\n        unbindEditableToogle();\n        unbindFormatToggle();\n      };\n    };\n    const onSetupEvent = (editor, event, f) => api => {\n      const handleEvent = () => f(api);\n      const init = () => {\n        f(api);\n        editor.on(event, handleEvent);\n      };\n      editor.initialized ? init() : editor.once('init', init);\n      return () => {\n        editor.off('init', init);\n        editor.off(event, handleEvent);\n      };\n    };\n    const onActionToggleFormat$1 = editor => rawItem => () => {\n      editor.undoManager.transact(() => {\n        editor.focus();\n        editor.execCommand('mceToggleFormat', false, rawItem.format);\n      });\n    };\n    const onActionExecCommand = (editor, command) => () => editor.execCommand(command);\n\n    var global$4 = hugerte.util.Tools.resolve('hugerte.util.LocalStorage');\n\n    const cacheStorage = {};\n    const ColorCache = (storageId, max = 10) => {\n      const storageString = global$4.getItem(storageId);\n      const localstorage = isString(storageString) ? JSON.parse(storageString) : [];\n      const prune = list => {\n        const diff = max - list.length;\n        return diff < 0 ? list.slice(0, max) : list;\n      };\n      const cache = prune(localstorage);\n      const add = key => {\n        indexOf(cache, key).each(remove);\n        cache.unshift(key);\n        if (cache.length > max) {\n          cache.pop();\n        }\n        global$4.setItem(storageId, JSON.stringify(cache));\n      };\n      const remove = idx => {\n        cache.splice(idx, 1);\n      };\n      const state = () => cache.slice(0);\n      return {\n        add,\n        state\n      };\n    };\n    const getCacheForId = id => get$g(cacheStorage, id).getOrThunk(() => {\n      const storageId = `hugerte-custom-colors-${ id }`;\n      const currentData = global$4.getItem(storageId);\n      if (isNullable(currentData)) {\n        const legacyDefault = global$4.getItem('hugerte-custom-colors');\n        global$4.setItem(storageId, isNonNullable(legacyDefault) ? legacyDefault : '[]');\n      }\n      const storage = ColorCache(storageId, 10);\n      cacheStorage[id] = storage;\n      return storage;\n    });\n    const getCurrentColors = id => map$2(getCacheForId(id).state(), color => ({\n      type: 'choiceitem',\n      text: color,\n      icon: 'checkmark',\n      value: color\n    }));\n    const addColor = (id, color) => {\n      getCacheForId(id).add(color);\n    };\n\n    const hsvColour = (hue, saturation, value) => ({\n      hue,\n      saturation,\n      value\n    });\n    const fromRgb = rgbaColour => {\n      let h = 0;\n      let s = 0;\n      let v = 0;\n      const r = rgbaColour.red / 255;\n      const g = rgbaColour.green / 255;\n      const b = rgbaColour.blue / 255;\n      const minRGB = Math.min(r, Math.min(g, b));\n      const maxRGB = Math.max(r, Math.max(g, b));\n      if (minRGB === maxRGB) {\n        v = minRGB;\n        return hsvColour(0, 0, v * 100);\n      }\n      const d = r === minRGB ? g - b : b === minRGB ? r - g : b - r;\n      h = r === minRGB ? 3 : b === minRGB ? 1 : 5;\n      h = 60 * (h - d / (maxRGB - minRGB));\n      s = (maxRGB - minRGB) / maxRGB;\n      v = maxRGB;\n      return hsvColour(Math.round(h), Math.round(s * 100), Math.round(v * 100));\n    };\n\n    const hexToHsv = hex => fromRgb(fromHex(hex));\n    const hsvToHex = hsv => fromRgba(fromHsv(hsv));\n    const anyToHex = color => fromString$1(color).orThunk(() => fromString(color).map(fromRgba)).getOrThunk(() => {\n      const canvas = document.createElement('canvas');\n      canvas.height = 1;\n      canvas.width = 1;\n      const canvasContext = canvas.getContext('2d');\n      canvasContext.clearRect(0, 0, canvas.width, canvas.height);\n      canvasContext.fillStyle = '#FFFFFF';\n      canvasContext.fillStyle = color;\n      canvasContext.fillRect(0, 0, 1, 1);\n      const rgba = canvasContext.getImageData(0, 0, 1, 1).data;\n      const r = rgba[0];\n      const g = rgba[1];\n      const b = rgba[2];\n      const a = rgba[3];\n      return fromRgba(rgbaColour(r, g, b, a));\n    });\n\n    const foregroundId = 'forecolor';\n    const backgroundId = 'hilitecolor';\n    const fallbackCols = 5;\n    const mapColors = colorMap => {\n      const colors = [];\n      for (let i = 0; i < colorMap.length; i += 2) {\n        colors.push({\n          text: colorMap[i + 1],\n          value: '#' + anyToHex(colorMap[i]).value,\n          icon: 'checkmark',\n          type: 'choiceitem'\n        });\n      }\n      return colors;\n    };\n    const option$1 = name => editor => editor.options.get(name);\n    const fallbackColor = '#000000';\n    const register$d = editor => {\n      const registerOption = editor.options.register;\n      const colorProcessor = value => {\n        if (isArrayOf(value, isString)) {\n          return {\n            value: mapColors(value),\n            valid: true\n          };\n        } else {\n          return {\n            valid: false,\n            message: 'Must be an array of strings.'\n          };\n        }\n      };\n      const colorColsProcessor = value => {\n        if (isNumber(value) && value > 0) {\n          return {\n            value,\n            valid: true\n          };\n        } else {\n          return {\n            valid: false,\n            message: 'Must be a positive number.'\n          };\n        }\n      };\n      registerOption('color_map', {\n        processor: colorProcessor,\n        default: [\n          '#BFEDD2',\n          'Light Green',\n          '#FBEEB8',\n          'Light Yellow',\n          '#F8CAC6',\n          'Light Red',\n          '#ECCAFA',\n          'Light Purple',\n          '#C2E0F4',\n          'Light Blue',\n          '#2DC26B',\n          'Green',\n          '#F1C40F',\n          'Yellow',\n          '#E03E2D',\n          'Red',\n          '#B96AD9',\n          'Purple',\n          '#3598DB',\n          'Blue',\n          '#169179',\n          'Dark Turquoise',\n          '#E67E23',\n          'Orange',\n          '#BA372A',\n          'Dark Red',\n          '#843FA1',\n          'Dark Purple',\n          '#236FA1',\n          'Dark Blue',\n          '#ECF0F1',\n          'Light Gray',\n          '#CED4D9',\n          'Medium Gray',\n          '#95A5A6',\n          'Gray',\n          '#7E8C8D',\n          'Dark Gray',\n          '#34495E',\n          'Navy Blue',\n          '#000000',\n          'Black',\n          '#ffffff',\n          'White'\n        ]\n      });\n      registerOption('color_map_background', { processor: colorProcessor });\n      registerOption('color_map_foreground', { processor: colorProcessor });\n      registerOption('color_cols', {\n        processor: colorColsProcessor,\n        default: calcCols(editor)\n      });\n      registerOption('color_cols_foreground', {\n        processor: colorColsProcessor,\n        default: defaultCols(editor, foregroundId)\n      });\n      registerOption('color_cols_background', {\n        processor: colorColsProcessor,\n        default: defaultCols(editor, backgroundId)\n      });\n      registerOption('custom_colors', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('color_default_foreground', {\n        processor: 'string',\n        default: fallbackColor\n      });\n      registerOption('color_default_background', {\n        processor: 'string',\n        default: fallbackColor\n      });\n    };\n    const getColors$2 = (editor, id) => {\n      if (id === foregroundId && editor.options.isSet('color_map_foreground')) {\n        return option$1('color_map_foreground')(editor);\n      } else if (id === backgroundId && editor.options.isSet('color_map_background')) {\n        return option$1('color_map_background')(editor);\n      } else {\n        return option$1('color_map')(editor);\n      }\n    };\n    const calcCols = (editor, id = 'default') => Math.max(fallbackCols, Math.ceil(Math.sqrt(getColors$2(editor, id).length)));\n    const defaultCols = (editor, id) => {\n      const defaultCols = option$1('color_cols')(editor);\n      const calculatedCols = calcCols(editor, id);\n      if (defaultCols === calcCols(editor)) {\n        return calculatedCols;\n      } else {\n        return defaultCols;\n      }\n    };\n    const getColorCols$1 = (editor, id = 'default') => {\n      const getCols = () => {\n        if (id === foregroundId) {\n          return option$1('color_cols_foreground')(editor);\n        } else if (id === backgroundId) {\n          return option$1('color_cols_background')(editor);\n        } else {\n          return option$1('color_cols')(editor);\n        }\n      };\n      return Math.round(getCols());\n    };\n    const hasCustomColors$1 = option$1('custom_colors');\n    const getDefaultForegroundColor = option$1('color_default_foreground');\n    const getDefaultBackgroundColor = option$1('color_default_background');\n\n    const defaultBackgroundColor = 'rgba(0, 0, 0, 0)';\n    const isValidBackgroundColor = value => fromString(value).exists(c => c.alpha !== 0);\n    const getClosestCssBackgroundColorValue = scope => {\n      return closest$4(scope, node => {\n        if (isElement$1(node)) {\n          const color = get$e(node, 'background-color');\n          return someIf(isValidBackgroundColor(color), color);\n        } else {\n          return Optional.none();\n        }\n      }).getOr(defaultBackgroundColor);\n    };\n    const getCurrentColor = (editor, format) => {\n      const node = SugarElement.fromDom(editor.selection.getStart());\n      const cssRgbValue = format === 'hilitecolor' ? getClosestCssBackgroundColorValue(node) : get$e(node, 'color');\n      return fromString(cssRgbValue).map(rgba => '#' + fromRgba(rgba).value);\n    };\n    const applyFormat = (editor, format, value) => {\n      editor.undoManager.transact(() => {\n        editor.focus();\n        editor.formatter.apply(format, { value });\n        editor.nodeChanged();\n      });\n    };\n    const removeFormat = (editor, format) => {\n      editor.undoManager.transact(() => {\n        editor.focus();\n        editor.formatter.remove(format, { value: null }, undefined, true);\n        editor.nodeChanged();\n      });\n    };\n    const registerCommands = editor => {\n      editor.addCommand('mceApplyTextcolor', (format, value) => {\n        applyFormat(editor, format, value);\n      });\n      editor.addCommand('mceRemoveTextcolor', format => {\n        removeFormat(editor, format);\n      });\n    };\n    const getAdditionalColors = hasCustom => {\n      const type = 'choiceitem';\n      const remove = {\n        type,\n        text: 'Remove color',\n        icon: 'color-swatch-remove-color',\n        value: 'remove'\n      };\n      const custom = {\n        type,\n        text: 'Custom color',\n        icon: 'color-picker',\n        value: 'custom'\n      };\n      return hasCustom ? [\n        remove,\n        custom\n      ] : [remove];\n    };\n    const applyColor = (editor, format, value, onChoice) => {\n      if (value === 'custom') {\n        const dialog = colorPickerDialog(editor);\n        dialog(colorOpt => {\n          colorOpt.each(color => {\n            addColor(format, color);\n            editor.execCommand('mceApplyTextcolor', format, color);\n            onChoice(color);\n          });\n        }, getCurrentColor(editor, format).getOr(fallbackColor));\n      } else if (value === 'remove') {\n        onChoice('');\n        editor.execCommand('mceRemoveTextcolor', format);\n      } else {\n        onChoice(value);\n        editor.execCommand('mceApplyTextcolor', format, value);\n      }\n    };\n    const getColors$1 = (colors, id, hasCustom) => colors.concat(getCurrentColors(id).concat(getAdditionalColors(hasCustom)));\n    const getFetch$1 = (colors, id, hasCustom) => callback => {\n      callback(getColors$1(colors, id, hasCustom));\n    };\n    const setIconColor = (splitButtonApi, name, newColor) => {\n      const id = name === 'forecolor' ? 'tox-icon-text-color__color' : 'tox-icon-highlight-bg-color__color';\n      splitButtonApi.setIconFill(id, newColor);\n    };\n    const setTooltip = (buttonApi, tooltip) => {\n      buttonApi.setTooltip(tooltip);\n    };\n    const select$1 = (editor, format) => value => {\n      const optCurrentHex = getCurrentColor(editor, format);\n      return is$1(optCurrentHex, value.toUpperCase());\n    };\n    const getToolTipText = (editor, format, lastColor) => {\n      if (isEmpty(lastColor)) {\n        return format === 'forecolor' ? 'Text color' : 'Background color';\n      }\n      const tooltipPrefix = format === 'forecolor' ? 'Text color {0}' : 'Background color {0}';\n      const colors = getColors$1(getColors$2(editor, format), format, false);\n      const colorText = find$5(colors, c => c.value === lastColor).getOr({ text: '' }).text;\n      return editor.translate([\n        tooltipPrefix,\n        editor.translate(colorText)\n      ]);\n    };\n    const registerTextColorButton = (editor, name, format, lastColor) => {\n      editor.ui.registry.addSplitButton(name, {\n        tooltip: getToolTipText(editor, format, lastColor.get()),\n        presets: 'color',\n        icon: name === 'forecolor' ? 'text-color' : 'highlight-bg-color',\n        select: select$1(editor, format),\n        columns: getColorCols$1(editor, format),\n        fetch: getFetch$1(getColors$2(editor, format), format, hasCustomColors$1(editor)),\n        onAction: _splitButtonApi => {\n          applyColor(editor, format, lastColor.get(), noop);\n        },\n        onItemAction: (_splitButtonApi, value) => {\n          applyColor(editor, format, value, newColor => {\n            lastColor.set(newColor);\n            fireTextColorChange(editor, {\n              name,\n              color: newColor\n            });\n          });\n        },\n        onSetup: splitButtonApi => {\n          setIconColor(splitButtonApi, name, lastColor.get());\n          const handler = e => {\n            if (e.name === name) {\n              setIconColor(splitButtonApi, e.name, e.color);\n              setTooltip(splitButtonApi, getToolTipText(editor, format, e.color));\n            }\n          };\n          editor.on('TextColorChange', handler);\n          return composeUnbinders(onSetupEditableToggle(editor)(splitButtonApi), () => {\n            editor.off('TextColorChange', handler);\n          });\n        }\n      });\n    };\n    const registerTextColorMenuItem = (editor, name, format, text, lastColor) => {\n      editor.ui.registry.addNestedMenuItem(name, {\n        text,\n        icon: name === 'forecolor' ? 'text-color' : 'highlight-bg-color',\n        onSetup: api => {\n          setTooltip(api, getToolTipText(editor, format, lastColor.get()));\n          setIconColor(api, name, lastColor.get());\n          return onSetupEditableToggle(editor)(api);\n        },\n        getSubmenuItems: () => [{\n            type: 'fancymenuitem',\n            fancytype: 'colorswatch',\n            select: select$1(editor, format),\n            initData: { storageKey: format },\n            onAction: data => {\n              applyColor(editor, format, data.value, newColor => {\n                lastColor.set(newColor);\n                fireTextColorChange(editor, {\n                  name,\n                  color: newColor\n                });\n              });\n            }\n          }]\n      });\n    };\n    const colorPickerDialog = editor => (callback, value) => {\n      let isValid = false;\n      const onSubmit = api => {\n        const data = api.getData();\n        const hex = data.colorpicker;\n        if (isValid) {\n          callback(Optional.from(hex));\n          api.close();\n        } else {\n          editor.windowManager.alert(editor.translate([\n            'Invalid hex color code: {0}',\n            hex\n          ]));\n        }\n      };\n      const onAction = (_api, details) => {\n        if (details.name === 'hex-valid') {\n          isValid = details.value;\n        }\n      };\n      const initialData = { colorpicker: value };\n      editor.windowManager.open({\n        title: 'Color Picker',\n        size: 'normal',\n        body: {\n          type: 'panel',\n          items: [{\n              type: 'colorpicker',\n              name: 'colorpicker',\n              label: 'Color'\n            }]\n        },\n        buttons: [\n          {\n            type: 'cancel',\n            name: 'cancel',\n            text: 'Cancel'\n          },\n          {\n            type: 'submit',\n            name: 'save',\n            text: 'Save',\n            primary: true\n          }\n        ],\n        initialData,\n        onAction,\n        onSubmit,\n        onClose: noop,\n        onCancel: () => {\n          callback(Optional.none());\n        }\n      });\n    };\n    const register$c = editor => {\n      registerCommands(editor);\n      const fallbackColorForeground = getDefaultForegroundColor(editor);\n      const fallbackColorBackground = getDefaultBackgroundColor(editor);\n      const lastForeColor = Cell(fallbackColorForeground);\n      const lastBackColor = Cell(fallbackColorBackground);\n      registerTextColorButton(editor, 'forecolor', 'forecolor', lastForeColor);\n      registerTextColorButton(editor, 'backcolor', 'hilitecolor', lastBackColor);\n      registerTextColorMenuItem(editor, 'forecolor', 'forecolor', 'Text color', lastForeColor);\n      registerTextColorMenuItem(editor, 'backcolor', 'hilitecolor', 'Background color', lastBackColor);\n    };\n\n    const createPartialChoiceMenu = (value, items, onItemValueHandler, columns, presets, itemResponse, select, providersBackstage) => {\n      const hasIcons = menuHasIcons(items);\n      const presetItemTypes = presets !== 'color' ? 'normal' : 'color';\n      const alloyItems = createChoiceItems(items, onItemValueHandler, columns, presetItemTypes, itemResponse, select, providersBackstage);\n      const menuLayout = { menuType: presets };\n      return createPartialMenuWithAlloyItems(value, hasIcons, alloyItems, columns, menuLayout);\n    };\n    const createChoiceItems = (items, onItemValueHandler, columns, itemPresets, itemResponse, select, providersBackstage) => cat(map$2(items, item => {\n      if (item.type === 'choiceitem') {\n        return createChoiceMenuItem(item).fold(handleError, d => Optional.some(renderChoiceItem(d, columns === 1, itemPresets, onItemValueHandler, select(d.value), itemResponse, providersBackstage, menuHasIcons(items))));\n      } else {\n        return Optional.none();\n      }\n    }));\n\n    const deriveMenuMovement = (columns, presets) => {\n      const menuMarkers = markers(presets);\n      if (columns === 1) {\n        return {\n          mode: 'menu',\n          moveOnTab: true\n        };\n      } else if (columns === 'auto') {\n        return {\n          mode: 'grid',\n          selector: '.' + menuMarkers.item,\n          initSize: {\n            numColumns: 1,\n            numRows: 1\n          }\n        };\n      } else {\n        const rowClass = presets === 'color' ? 'tox-swatches__row' : 'tox-collection__group';\n        return {\n          mode: 'matrix',\n          rowSelector: '.' + rowClass,\n          previousSelector: menu => {\n            return presets === 'color' ? descendant(menu.element, '[aria-checked=true]') : Optional.none();\n          }\n        };\n      }\n    };\n    const deriveCollectionMovement = (columns, presets) => {\n      if (columns === 1) {\n        return {\n          mode: 'menu',\n          moveOnTab: false,\n          selector: '.tox-collection__item'\n        };\n      } else if (columns === 'auto') {\n        return {\n          mode: 'flatgrid',\n          selector: '.' + 'tox-collection__item',\n          initSize: {\n            numColumns: 1,\n            numRows: 1\n          }\n        };\n      } else {\n        return {\n          mode: 'matrix',\n          selectors: {\n            row: presets === 'color' ? '.tox-swatches__row' : '.tox-collection__group',\n            cell: presets === 'color' ? `.${ colorClass }` : `.${ selectableClass }`\n          }\n        };\n      }\n    };\n\n    const renderColorSwatchItem = (spec, backstage) => {\n      const items = getColorItems(spec, backstage);\n      const columns = backstage.colorinput.getColorCols(spec.initData.storageKey);\n      const presets = 'color';\n      const menuSpec = createPartialChoiceMenu(generate$6('menu-value'), items, value => {\n        spec.onAction({ value });\n      }, columns, presets, ItemResponse$1.CLOSE_ON_EXECUTE, spec.select.getOr(never), backstage.shared.providers);\n      const widgetSpec = {\n        ...menuSpec,\n        markers: markers(presets),\n        movement: deriveMenuMovement(columns, presets)\n      };\n      return {\n        type: 'widget',\n        data: { value: generate$6('widget-id') },\n        dom: {\n          tag: 'div',\n          classes: ['tox-fancymenuitem']\n        },\n        autofocus: true,\n        components: [parts$f.widget(Menu.sketch(widgetSpec))]\n      };\n    };\n    const getColorItems = (spec, backstage) => {\n      const useCustomColors = spec.initData.allowCustomColors && backstage.colorinput.hasCustomColors();\n      return spec.initData.colors.fold(() => getColors$1(backstage.colorinput.getColors(spec.initData.storageKey), spec.initData.storageKey, useCustomColors), colors => colors.concat(getAdditionalColors(useCustomColors)));\n    };\n\n    const cellOverEvent = generate$6('cell-over');\n    const cellExecuteEvent = generate$6('cell-execute');\n    const makeAnnouncementText = backstage => (row, col) => backstage.shared.providers.translate([\n      '{0} columns, {1} rows',\n      col,\n      row\n    ]);\n    const makeCell = (row, col, label) => {\n      const emitCellOver = c => emitWith(c, cellOverEvent, {\n        row,\n        col\n      });\n      const emitExecute = c => emitWith(c, cellExecuteEvent, {\n        row,\n        col\n      });\n      const onClick = (c, se) => {\n        se.stop();\n        emitExecute(c);\n      };\n      return build$1({\n        dom: {\n          tag: 'div',\n          attributes: {\n            role: 'button',\n            ['aria-label']: label\n          }\n        },\n        behaviours: derive$1([\n          config('insert-table-picker-cell', [\n            run$1(mouseover(), Focusing.focus),\n            run$1(execute$5(), emitExecute),\n            run$1(click(), onClick),\n            run$1(tap(), onClick)\n          ]),\n          Toggling.config({\n            toggleClass: 'tox-insert-table-picker__selected',\n            toggleOnExecute: false\n          }),\n          Focusing.config({ onFocus: emitCellOver })\n        ])\n      });\n    };\n    const makeCells = (getCellLabel, numRows, numCols) => {\n      const cells = [];\n      for (let i = 0; i < numRows; i++) {\n        const row = [];\n        for (let j = 0; j < numCols; j++) {\n          const label = getCellLabel(i + 1, j + 1);\n          row.push(makeCell(i, j, label));\n        }\n        cells.push(row);\n      }\n      return cells;\n    };\n    const selectCells = (cells, selectedRow, selectedColumn, numRows, numColumns) => {\n      for (let i = 0; i < numRows; i++) {\n        for (let j = 0; j < numColumns; j++) {\n          Toggling.set(cells[i][j], i <= selectedRow && j <= selectedColumn);\n        }\n      }\n    };\n    const makeComponents = cells => bind$3(cells, cellRow => map$2(cellRow, premade));\n    const makeLabelText = (row, col) => text$2(`${ col }x${ row }`);\n    const renderInsertTableMenuItem = (spec, backstage) => {\n      const numRows = 10;\n      const numColumns = 10;\n      const getCellLabel = makeAnnouncementText(backstage);\n      const cells = makeCells(getCellLabel, numRows, numColumns);\n      const emptyLabelText = makeLabelText(0, 0);\n      const memLabel = record({\n        dom: {\n          tag: 'span',\n          classes: ['tox-insert-table-picker__label']\n        },\n        components: [emptyLabelText],\n        behaviours: derive$1([Replacing.config({})])\n      });\n      return {\n        type: 'widget',\n        data: { value: generate$6('widget-id') },\n        dom: {\n          tag: 'div',\n          classes: ['tox-fancymenuitem']\n        },\n        autofocus: true,\n        components: [parts$f.widget({\n            dom: {\n              tag: 'div',\n              classes: ['tox-insert-table-picker']\n            },\n            components: makeComponents(cells).concat(memLabel.asSpec()),\n            behaviours: derive$1([\n              config('insert-table-picker', [\n                runOnAttached(c => {\n                  Replacing.set(memLabel.get(c), [emptyLabelText]);\n                }),\n                runWithTarget(cellOverEvent, (c, t, e) => {\n                  const {row, col} = e.event;\n                  selectCells(cells, row, col, numRows, numColumns);\n                  Replacing.set(memLabel.get(c), [makeLabelText(row + 1, col + 1)]);\n                }),\n                runWithTarget(cellExecuteEvent, (c, _, e) => {\n                  const {row, col} = e.event;\n                  spec.onAction({\n                    numRows: row + 1,\n                    numColumns: col + 1\n                  });\n                  emit(c, sandboxClose());\n                })\n              ]),\n              Keying.config({\n                initSize: {\n                  numRows,\n                  numColumns\n                },\n                mode: 'flatgrid',\n                selector: '[role=\"button\"]'\n              })\n            ])\n          })]\n      };\n    };\n\n    const fancyMenuItems = {\n      inserttable: renderInsertTableMenuItem,\n      colorswatch: renderColorSwatchItem\n    };\n    const renderFancyMenuItem = (spec, backstage) => get$g(fancyMenuItems, spec.fancytype).map(render => render(spec, backstage));\n\n    const renderNestedItem = (spec, itemResponse, providersBackstage, renderIcons = true, downwardsCaret = false) => {\n      const caret = downwardsCaret ? renderDownwardsCaret(providersBackstage.icons) : renderSubmenuCaret(providersBackstage.icons);\n      const getApi = component => ({\n        isEnabled: () => !Disabling.isDisabled(component),\n        setEnabled: state => Disabling.set(component, !state),\n        setIconFill: (id, value) => {\n          descendant(component.element, `svg path[class=\"${ id }\"], rect[class=\"${ id }\"]`).each(underlinePath => {\n            set$9(underlinePath, 'fill', value);\n          });\n        },\n        setTooltip: tooltip => {\n          const translatedTooltip = providersBackstage.translate(tooltip);\n          set$9(component.element, 'aria-label', translatedTooltip);\n        }\n      });\n      const structure = renderItemStructure({\n        presets: 'normal',\n        iconContent: spec.icon,\n        textContent: spec.text,\n        htmlContent: Optional.none(),\n        ariaLabel: spec.text,\n        caret: Optional.some(caret),\n        checkMark: Optional.none(),\n        shortcutContent: spec.shortcut\n      }, providersBackstage, renderIcons);\n      return renderCommonItem({\n        data: buildData(spec),\n        getApi,\n        enabled: spec.enabled,\n        onAction: noop,\n        onSetup: spec.onSetup,\n        triggersSubmenu: true,\n        itemBehaviours: []\n      }, structure, itemResponse, providersBackstage);\n    };\n\n    const renderNormalItem = (spec, itemResponse, providersBackstage, renderIcons = true) => {\n      const getApi = component => ({\n        isEnabled: () => !Disabling.isDisabled(component),\n        setEnabled: state => Disabling.set(component, !state)\n      });\n      const structure = renderItemStructure({\n        presets: 'normal',\n        iconContent: spec.icon,\n        textContent: spec.text,\n        htmlContent: Optional.none(),\n        ariaLabel: spec.text,\n        caret: Optional.none(),\n        checkMark: Optional.none(),\n        shortcutContent: spec.shortcut\n      }, providersBackstage, renderIcons);\n      return renderCommonItem({\n        data: buildData(spec),\n        getApi,\n        enabled: spec.enabled,\n        onAction: spec.onAction,\n        onSetup: spec.onSetup,\n        triggersSubmenu: false,\n        itemBehaviours: []\n      }, structure, itemResponse, providersBackstage);\n    };\n\n    const renderSeparatorItem = spec => ({\n      type: 'separator',\n      dom: {\n        tag: 'div',\n        classes: [\n          selectableClass,\n          groupHeadingClass\n        ]\n      },\n      components: spec.text.map(text$2).toArray()\n    });\n\n    const renderToggleMenuItem = (spec, itemResponse, providersBackstage, renderIcons = true) => {\n      const getApi = component => ({\n        setActive: state => {\n          Toggling.set(component, state);\n        },\n        isActive: () => Toggling.isOn(component),\n        isEnabled: () => !Disabling.isDisabled(component),\n        setEnabled: state => Disabling.set(component, !state)\n      });\n      const structure = renderItemStructure({\n        iconContent: spec.icon,\n        textContent: spec.text,\n        htmlContent: Optional.none(),\n        ariaLabel: spec.text,\n        checkMark: Optional.some(renderCheckmark(providersBackstage.icons)),\n        caret: Optional.none(),\n        shortcutContent: spec.shortcut,\n        presets: 'normal',\n        meta: spec.meta\n      }, providersBackstage, renderIcons);\n      return deepMerge(renderCommonItem({\n        data: buildData(spec),\n        enabled: spec.enabled,\n        getApi,\n        onAction: spec.onAction,\n        onSetup: spec.onSetup,\n        triggersSubmenu: false,\n        itemBehaviours: []\n      }, structure, itemResponse, providersBackstage), {\n        toggling: {\n          toggleClass: tickedClass,\n          toggleOnExecute: false,\n          selected: spec.active\n        }\n      });\n    };\n\n    const autocomplete = renderAutocompleteItem;\n    const separator$3 = renderSeparatorItem;\n    const normal = renderNormalItem;\n    const nested = renderNestedItem;\n    const toggle$1 = renderToggleMenuItem;\n    const fancy = renderFancyMenuItem;\n    const card = renderCardMenuItem;\n\n    const getCoupled = (component, coupleConfig, coupleState, name) => coupleState.getOrCreate(component, coupleConfig, name);\n    const getExistingCoupled = (component, coupleConfig, coupleState, name) => coupleState.getExisting(component, coupleConfig, name);\n\n    var CouplingApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        getCoupled: getCoupled,\n        getExistingCoupled: getExistingCoupled\n    });\n\n    var CouplingSchema = [requiredOf('others', setOf(Result.value, anyValue()))];\n\n    const init$a = () => {\n      const coupled = {};\n      const lookupCoupled = (coupleConfig, coupledName) => {\n        const available = keys(coupleConfig.others);\n        if (available.length === 0) {\n          throw new Error('Cannot find any known coupled components');\n        } else {\n          return get$g(coupled, coupledName);\n        }\n      };\n      const getOrCreate = (component, coupleConfig, name) => {\n        return lookupCoupled(coupleConfig, name).getOrThunk(() => {\n          const builder = get$g(coupleConfig.others, name).getOrDie('No information found for coupled component: ' + name);\n          const spec = builder(component);\n          const built = component.getSystem().build(spec);\n          coupled[name] = built;\n          return built;\n        });\n      };\n      const getExisting = (component, coupleConfig, name) => {\n        return lookupCoupled(coupleConfig, name).orThunk(() => {\n          get$g(coupleConfig.others, name).getOrDie('No information found for coupled component: ' + name);\n          return Optional.none();\n        });\n      };\n      const readState = constant$1({});\n      return nu$8({\n        readState,\n        getExisting,\n        getOrCreate\n      });\n    };\n\n    var CouplingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$a\n    });\n\n    const Coupling = create$4({\n      fields: CouplingSchema,\n      name: 'coupling',\n      apis: CouplingApis,\n      state: CouplingState\n    });\n\n    const nu$3 = baseFn => {\n      let data = Optional.none();\n      let callbacks = [];\n      const map = f => nu$3(nCallback => {\n        get(data => {\n          nCallback(f(data));\n        });\n      });\n      const get = nCallback => {\n        if (isReady()) {\n          call(nCallback);\n        } else {\n          callbacks.push(nCallback);\n        }\n      };\n      const set = x => {\n        if (!isReady()) {\n          data = Optional.some(x);\n          run(callbacks);\n          callbacks = [];\n        }\n      };\n      const isReady = () => data.isSome();\n      const run = cbs => {\n        each$1(cbs, call);\n      };\n      const call = cb => {\n        data.each(x => {\n          setTimeout(() => {\n            cb(x);\n          }, 0);\n        });\n      };\n      baseFn(set);\n      return {\n        get,\n        map,\n        isReady\n      };\n    };\n    const pure$1 = a => nu$3(callback => {\n      callback(a);\n    });\n    const LazyValue = {\n      nu: nu$3,\n      pure: pure$1\n    };\n\n    const errorReporter = err => {\n      setTimeout(() => {\n        throw err;\n      }, 0);\n    };\n    const make$5 = run => {\n      const get = callback => {\n        run().then(callback, errorReporter);\n      };\n      const map = fab => {\n        return make$5(() => run().then(fab));\n      };\n      const bind = aFutureB => {\n        return make$5(() => run().then(v => aFutureB(v).toPromise()));\n      };\n      const anonBind = futureB => {\n        return make$5(() => run().then(() => futureB.toPromise()));\n      };\n      const toLazy = () => {\n        return LazyValue.nu(get);\n      };\n      const toCached = () => {\n        let cache = null;\n        return make$5(() => {\n          if (cache === null) {\n            cache = run();\n          }\n          return cache;\n        });\n      };\n      const toPromise = run;\n      return {\n        map,\n        bind,\n        anonBind,\n        toLazy,\n        toCached,\n        toPromise,\n        get\n      };\n    };\n    const nu$2 = baseFn => {\n      return make$5(() => new Promise(baseFn));\n    };\n    const pure = a => {\n      return make$5(() => Promise.resolve(a));\n    };\n    const Future = {\n      nu: nu$2,\n      pure\n    };\n\n    const suffix = constant$1('sink');\n    const partType$1 = constant$1(optional({\n      name: suffix(),\n      overrides: constant$1({\n        dom: { tag: 'div' },\n        behaviours: derive$1([Positioning.config({ useFixed: always })]),\n        events: derive$2([\n          cutter(keydown()),\n          cutter(mousedown()),\n          cutter(click())\n        ])\n      })\n    }));\n\n    const getAnchor = (detail, component) => {\n      const hotspot = detail.getHotspot(component).getOr(component);\n      const type = 'hotspot';\n      const overrides = detail.getAnchorOverrides();\n      return detail.layouts.fold(() => ({\n        type,\n        hotspot,\n        overrides\n      }), layouts => ({\n        type,\n        hotspot,\n        overrides,\n        layouts\n      }));\n    };\n    const fetch = (detail, mapFetch, component) => {\n      const fetcher = detail.fetch;\n      return fetcher(component).map(mapFetch);\n    };\n    const openF = (detail, mapFetch, anchor, component, sandbox, externals, highlightOnOpen) => {\n      const futureData = fetch(detail, mapFetch, component);\n      const getLazySink = getSink(component, detail);\n      return futureData.map(tdata => tdata.bind(data => Optional.from(tieredMenu.sketch({\n        ...externals.menu(),\n        uid: generate$5(''),\n        data,\n        highlightOnOpen,\n        onOpenMenu: (tmenu, menu) => {\n          const sink = getLazySink().getOrDie();\n          Positioning.position(sink, menu, { anchor });\n          Sandboxing.decloak(sandbox);\n        },\n        onOpenSubmenu: (tmenu, item, submenu) => {\n          const sink = getLazySink().getOrDie();\n          Positioning.position(sink, submenu, {\n            anchor: {\n              type: 'submenu',\n              item\n            }\n          });\n          Sandboxing.decloak(sandbox);\n        },\n        onRepositionMenu: (tmenu, primaryMenu, submenuTriggers) => {\n          const sink = getLazySink().getOrDie();\n          Positioning.position(sink, primaryMenu, { anchor });\n          each$1(submenuTriggers, st => {\n            Positioning.position(sink, st.triggeredMenu, {\n              anchor: {\n                type: 'submenu',\n                item: st.triggeringItem\n              }\n            });\n          });\n        },\n        onEscape: () => {\n          Focusing.focus(component);\n          Sandboxing.close(sandbox);\n          return Optional.some(true);\n        }\n      }))));\n    };\n    const open = (detail, mapFetch, hotspot, sandbox, externals, onOpenSync, highlightOnOpen) => {\n      const anchor = getAnchor(detail, hotspot);\n      const processed = openF(detail, mapFetch, anchor, hotspot, sandbox, externals, highlightOnOpen);\n      return processed.map(tdata => {\n        tdata.fold(() => {\n          if (Sandboxing.isOpen(sandbox)) {\n            Sandboxing.close(sandbox);\n          }\n        }, data => {\n          Sandboxing.cloak(sandbox);\n          Sandboxing.open(sandbox, data);\n          onOpenSync(sandbox);\n        });\n        return sandbox;\n      });\n    };\n    const close = (detail, mapFetch, component, sandbox, _externals, _onOpenSync, _highlightOnOpen) => {\n      Sandboxing.close(sandbox);\n      return Future.pure(sandbox);\n    };\n    const togglePopup = (detail, mapFetch, hotspot, externals, onOpenSync, highlightOnOpen) => {\n      const sandbox = Coupling.getCoupled(hotspot, 'sandbox');\n      const showing = Sandboxing.isOpen(sandbox);\n      const action = showing ? close : open;\n      return action(detail, mapFetch, hotspot, sandbox, externals, onOpenSync, highlightOnOpen);\n    };\n    const matchWidth = (hotspot, container, useMinWidth) => {\n      const menu = Composing.getCurrent(container).getOr(container);\n      const buttonWidth = get$c(hotspot.element);\n      if (useMinWidth) {\n        set$8(menu.element, 'min-width', buttonWidth + 'px');\n      } else {\n        set$7(menu.element, buttonWidth);\n      }\n    };\n    const getSink = (anyInSystem, sinkDetail) => anyInSystem.getSystem().getByUid(sinkDetail.uid + '-' + suffix()).map(internalSink => () => Result.value(internalSink)).getOrThunk(() => sinkDetail.lazySink.fold(() => () => Result.error(new Error('No internal sink is specified, nor could an external sink be found')), lazySinkFn => () => lazySinkFn(anyInSystem)));\n    const doRepositionMenus = sandbox => {\n      Sandboxing.getState(sandbox).each(tmenu => {\n        tieredMenu.repositionMenus(tmenu);\n      });\n    };\n    const makeSandbox$1 = (detail, hotspot, extras) => {\n      const ariaControls = manager();\n      const onOpen = (component, menu) => {\n        const anchor = getAnchor(detail, hotspot);\n        ariaControls.link(hotspot.element);\n        if (detail.matchWidth) {\n          matchWidth(anchor.hotspot, menu, detail.useMinWidth);\n        }\n        detail.onOpen(anchor, component, menu);\n        if (extras !== undefined && extras.onOpen !== undefined) {\n          extras.onOpen(component, menu);\n        }\n      };\n      const onClose = (component, menu) => {\n        ariaControls.unlink(hotspot.element);\n        lazySink().getOr(menu).element.dom.dispatchEvent(new window.FocusEvent('focusout'));\n        if (extras !== undefined && extras.onClose !== undefined) {\n          extras.onClose(component, menu);\n        }\n      };\n      const lazySink = getSink(hotspot, detail);\n      return {\n        dom: {\n          tag: 'div',\n          classes: detail.sandboxClasses,\n          attributes: {\n            id: ariaControls.id,\n            role: 'listbox'\n          }\n        },\n        behaviours: SketchBehaviours.augment(detail.sandboxBehaviours, [\n          Representing.config({\n            store: {\n              mode: 'memory',\n              initialValue: hotspot\n            }\n          }),\n          Sandboxing.config({\n            onOpen,\n            onClose,\n            isPartOf: (container, data, queryElem) => {\n              return isPartOf$1(data, queryElem) || isPartOf$1(hotspot, queryElem);\n            },\n            getAttachPoint: () => {\n              return lazySink().getOrDie();\n            }\n          }),\n          Composing.config({\n            find: sandbox => {\n              return Sandboxing.getState(sandbox).bind(menu => Composing.getCurrent(menu));\n            }\n          }),\n          Receiving.config({\n            channels: {\n              ...receivingChannel$1({ isExtraPart: never }),\n              ...receivingChannel({ doReposition: doRepositionMenus })\n            }\n          })\n        ])\n      };\n    };\n    const repositionMenus = comp => {\n      const sandbox = Coupling.getCoupled(comp, 'sandbox');\n      doRepositionMenus(sandbox);\n    };\n\n    const sandboxFields = () => [\n      defaulted('sandboxClasses', []),\n      SketchBehaviours.field('sandboxBehaviours', [\n        Composing,\n        Receiving,\n        Sandboxing,\n        Representing\n      ])\n    ];\n\n    const schema$k = constant$1([\n      required$1('dom'),\n      required$1('fetch'),\n      onHandler('onOpen'),\n      onKeyboardHandler('onExecute'),\n      defaulted('getHotspot', Optional.some),\n      defaulted('getAnchorOverrides', constant$1({})),\n      schema$y(),\n      field('dropdownBehaviours', [\n        Toggling,\n        Coupling,\n        Keying,\n        Focusing\n      ]),\n      required$1('toggleClass'),\n      defaulted('eventOrder', {}),\n      option$3('lazySink'),\n      defaulted('matchWidth', false),\n      defaulted('useMinWidth', false),\n      option$3('role')\n    ].concat(sandboxFields()));\n    const parts$e = constant$1([\n      external({\n        schema: [\n          tieredMenuMarkers(),\n          defaulted('fakeFocus', false)\n        ],\n        name: 'menu',\n        defaults: detail => {\n          return { onExecute: detail.onExecute };\n        }\n      }),\n      partType$1()\n    ]);\n\n    const factory$k = (detail, components, _spec, externals) => {\n      const lookupAttr = attr => get$g(detail.dom, 'attributes').bind(attrs => get$g(attrs, attr));\n      const switchToMenu = sandbox => {\n        Sandboxing.getState(sandbox).each(tmenu => {\n          tieredMenu.highlightPrimary(tmenu);\n        });\n      };\n      const togglePopup$1 = (dropdownComp, onOpenSync, highlightOnOpen) => {\n        return togglePopup(detail, identity, dropdownComp, externals, onOpenSync, highlightOnOpen);\n      };\n      const action = component => {\n        const onOpenSync = switchToMenu;\n        togglePopup$1(component, onOpenSync, HighlightOnOpen.HighlightMenuAndItem).get(noop);\n      };\n      const apis = {\n        expand: comp => {\n          if (!Toggling.isOn(comp)) {\n            togglePopup$1(comp, noop, HighlightOnOpen.HighlightNone).get(noop);\n          }\n        },\n        open: comp => {\n          if (!Toggling.isOn(comp)) {\n            togglePopup$1(comp, noop, HighlightOnOpen.HighlightMenuAndItem).get(noop);\n          }\n        },\n        refetch: comp => {\n          const optSandbox = Coupling.getExistingCoupled(comp, 'sandbox');\n          return optSandbox.fold(() => {\n            return togglePopup$1(comp, noop, HighlightOnOpen.HighlightMenuAndItem).map(noop);\n          }, sandboxComp => {\n            return open(detail, identity, comp, sandboxComp, externals, noop, HighlightOnOpen.HighlightMenuAndItem).map(noop);\n          });\n        },\n        isOpen: Toggling.isOn,\n        close: comp => {\n          if (Toggling.isOn(comp)) {\n            togglePopup$1(comp, noop, HighlightOnOpen.HighlightMenuAndItem).get(noop);\n          }\n        },\n        repositionMenus: comp => {\n          if (Toggling.isOn(comp)) {\n            repositionMenus(comp);\n          }\n        }\n      };\n      const triggerExecute = (comp, _se) => {\n        emitExecute(comp);\n        return Optional.some(true);\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components,\n        behaviours: augment(detail.dropdownBehaviours, [\n          Toggling.config({\n            toggleClass: detail.toggleClass,\n            aria: { mode: 'expanded' }\n          }),\n          Coupling.config({\n            others: {\n              sandbox: hotspot => {\n                return makeSandbox$1(detail, hotspot, {\n                  onOpen: () => Toggling.on(hotspot),\n                  onClose: () => Toggling.off(hotspot)\n                });\n              }\n            }\n          }),\n          Keying.config({\n            mode: 'special',\n            onSpace: triggerExecute,\n            onEnter: triggerExecute,\n            onDown: (comp, _se) => {\n              if (Dropdown.isOpen(comp)) {\n                const sandbox = Coupling.getCoupled(comp, 'sandbox');\n                switchToMenu(sandbox);\n              } else {\n                Dropdown.open(comp);\n              }\n              return Optional.some(true);\n            },\n            onEscape: (comp, _se) => {\n              if (Dropdown.isOpen(comp)) {\n                Dropdown.close(comp);\n                return Optional.some(true);\n              } else {\n                return Optional.none();\n              }\n            }\n          }),\n          Focusing.config({})\n        ]),\n        events: events$a(Optional.some(action)),\n        eventOrder: {\n          ...detail.eventOrder,\n          [execute$5()]: [\n            'disabling',\n            'toggling',\n            'alloy.base.behaviour'\n          ]\n        },\n        apis,\n        domModification: {\n          attributes: {\n            'aria-haspopup': 'true',\n            ...detail.role.fold(() => ({}), role => ({ role })),\n            ...detail.dom.tag === 'button' ? { type: lookupAttr('type').getOr('button') } : {}\n          }\n        }\n      };\n    };\n    const Dropdown = composite({\n      name: 'Dropdown',\n      configFields: schema$k(),\n      partFields: parts$e(),\n      factory: factory$k,\n      apis: {\n        open: (apis, comp) => apis.open(comp),\n        refetch: (apis, comp) => apis.refetch(comp),\n        expand: (apis, comp) => apis.expand(comp),\n        close: (apis, comp) => apis.close(comp),\n        isOpen: (apis, comp) => apis.isOpen(comp),\n        repositionMenus: (apis, comp) => apis.repositionMenus(comp)\n      }\n    });\n\n    const identifyMenuLayout = searchMode => {\n      switch (searchMode.searchMode) {\n      case 'no-search': {\n          return { menuType: 'normal' };\n        }\n      default: {\n          return {\n            menuType: 'searchable',\n            searchMode\n          };\n        }\n      }\n    };\n    const handleRefetchTrigger = originalSandboxComp => {\n      const dropdown = Representing.getValue(originalSandboxComp);\n      const optSearcherState = findWithinSandbox(originalSandboxComp).map(saveState);\n      Dropdown.refetch(dropdown).get(() => {\n        const newSandboxComp = Coupling.getCoupled(dropdown, 'sandbox');\n        optSearcherState.each(searcherState => findWithinSandbox(newSandboxComp).each(inputComp => restoreState(inputComp, searcherState)));\n      });\n    };\n    const handleRedirectToMenuItem = (sandboxComp, se) => {\n      getActiveMenuItemFrom(sandboxComp).each(activeItem => {\n        retargetAndDispatchWith(sandboxComp, activeItem.element, se.event.eventType, se.event.interactionEvent);\n      });\n    };\n    const getActiveMenuItemFrom = sandboxComp => {\n      return Sandboxing.getState(sandboxComp).bind(Highlighting.getHighlighted).bind(Highlighting.getHighlighted);\n    };\n    const getSearchResults = activeMenuComp => {\n      return has(activeMenuComp.element, searchResultsClass) ? Optional.some(activeMenuComp.element) : descendant(activeMenuComp.element, '.' + searchResultsClass);\n    };\n    const updateAriaOnHighlight = (tmenuComp, menuComp, itemComp) => {\n      findWithinMenu(tmenuComp).each(inputComp => {\n        setActiveDescendant(inputComp, itemComp);\n        const optActiveResults = getSearchResults(menuComp);\n        optActiveResults.each(resultsElem => {\n          getOpt(resultsElem, 'id').each(controlledId => set$9(inputComp.element, 'aria-controls', controlledId));\n        });\n      });\n      set$9(itemComp.element, 'aria-selected', 'true');\n    };\n    const updateAriaOnDehighlight = (tmenuComp, menuComp, itemComp) => {\n      set$9(itemComp.element, 'aria-selected', 'false');\n    };\n    const focusSearchField = tmenuComp => {\n      findWithinMenu(tmenuComp).each(searcherComp => Focusing.focus(searcherComp));\n    };\n    const getSearchPattern = dropdownComp => {\n      const optSandboxComp = Coupling.getExistingCoupled(dropdownComp, 'sandbox');\n      return optSandboxComp.bind(findWithinSandbox).map(saveState).map(state => state.fetchPattern).getOr('');\n    };\n\n    var FocusMode;\n    (function (FocusMode) {\n      FocusMode[FocusMode['ContentFocus'] = 0] = 'ContentFocus';\n      FocusMode[FocusMode['UiFocus'] = 1] = 'UiFocus';\n    }(FocusMode || (FocusMode = {})));\n    const createMenuItemFromBridge = (item, itemResponse, backstage, menuHasIcons, isHorizontalMenu) => {\n      const providersBackstage = backstage.shared.providers;\n      const parseForHorizontalMenu = menuitem => !isHorizontalMenu ? menuitem : {\n        ...menuitem,\n        shortcut: Optional.none(),\n        icon: menuitem.text.isSome() ? Optional.none() : menuitem.icon\n      };\n      switch (item.type) {\n      case 'menuitem':\n        return createMenuItem(item).fold(handleError, d => Optional.some(normal(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons)));\n      case 'nestedmenuitem':\n        return createNestedMenuItem(item).fold(handleError, d => Optional.some(nested(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons, isHorizontalMenu)));\n      case 'togglemenuitem':\n        return createToggleMenuItem(item).fold(handleError, d => Optional.some(toggle$1(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons)));\n      case 'separator':\n        return createSeparatorMenuItem(item).fold(handleError, d => Optional.some(separator$3(d)));\n      case 'fancymenuitem':\n        return createFancyMenuItem(item).fold(handleError, d => fancy(d, backstage));\n      default: {\n          console.error('Unknown item in general menu', item);\n          return Optional.none();\n        }\n      }\n    };\n    const createAutocompleteItems = (items, matchText, onItemValueHandler, columns, itemResponse, sharedBackstage, highlightOn) => {\n      const renderText = columns === 1;\n      const renderIcons = !renderText || menuHasIcons(items);\n      return cat(map$2(items, item => {\n        switch (item.type) {\n        case 'separator':\n          return createSeparatorItem(item).fold(handleError, d => Optional.some(separator$3(d)));\n        case 'cardmenuitem':\n          return createCardMenuItem(item).fold(handleError, d => Optional.some(card({\n            ...d,\n            onAction: api => {\n              d.onAction(api);\n              onItemValueHandler(d.value, d.meta);\n            }\n          }, itemResponse, sharedBackstage, {\n            itemBehaviours: tooltipBehaviour(d.meta, sharedBackstage, Optional.none()),\n            cardText: {\n              matchText,\n              highlightOn\n            }\n          })));\n        case 'autocompleteitem':\n        default:\n          return createAutocompleterItem(item).fold(handleError, d => Optional.some(autocomplete(d, matchText, renderText, 'normal', onItemValueHandler, itemResponse, sharedBackstage, renderIcons)));\n        }\n      }));\n    };\n    const createPartialMenu = (value, items, itemResponse, backstage, isHorizontalMenu, searchMode) => {\n      const hasIcons = menuHasIcons(items);\n      const alloyItems = cat(map$2(items, item => {\n        const itemHasIcon = i => isHorizontalMenu ? !has$2(i, 'text') : hasIcons;\n        const createItem = i => createMenuItemFromBridge(i, itemResponse, backstage, itemHasIcon(i), isHorizontalMenu);\n        if (item.type === 'nestedmenuitem' && item.getSubmenuItems().length <= 0) {\n          return createItem({\n            ...item,\n            enabled: false\n          });\n        } else {\n          return createItem(item);\n        }\n      }));\n      const menuLayout = identifyMenuLayout(searchMode);\n      const createPartial = isHorizontalMenu ? createHorizontalPartialMenuWithAlloyItems : createPartialMenuWithAlloyItems;\n      return createPartial(value, hasIcons, alloyItems, 1, menuLayout);\n    };\n    const createTieredDataFrom = partialMenu => tieredMenu.singleData(partialMenu.value, partialMenu);\n    const createInlineMenuFrom = (partialMenu, columns, focusMode, presets) => {\n      const movement = deriveMenuMovement(columns, presets);\n      const menuMarkers = markers(presets);\n      return {\n        data: createTieredDataFrom({\n          ...partialMenu,\n          movement,\n          menuBehaviours: SimpleBehaviours.unnamedEvents(columns !== 'auto' ? [] : [runOnAttached((comp, _se) => {\n              detectSize(comp, 4, menuMarkers.item).each(({numColumns, numRows}) => {\n                Keying.setGridSize(comp, numRows, numColumns);\n              });\n            })])\n        }),\n        menu: {\n          markers: markers(presets),\n          fakeFocus: focusMode === FocusMode.ContentFocus\n        }\n      };\n    };\n\n    const rangeToSimRange = r => SimRange.create(SugarElement.fromDom(r.startContainer), r.startOffset, SugarElement.fromDom(r.endContainer), r.endOffset);\n    const register$b = (editor, sharedBackstage) => {\n      const autocompleterId = generate$6('autocompleter');\n      const processingAction = Cell(false);\n      const activeState = Cell(false);\n      const activeRange = value$2();\n      const autocompleter = build$1(InlineView.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-autocompleter'],\n          attributes: { id: autocompleterId }\n        },\n        components: [],\n        fireDismissalEventInstead: {},\n        inlineBehaviours: derive$1([config('dismissAutocompleter', [\n            run$1(dismissRequested(), () => cancelIfNecessary()),\n            run$1(highlight$1(), (_, se) => {\n              getOpt(se.event.target, 'id').each(id => set$9(SugarElement.fromDom(editor.getBody()), 'aria-activedescendant', id));\n            })\n          ])]),\n        lazySink: sharedBackstage.getSink\n      }));\n      const isMenuOpen = () => InlineView.isOpen(autocompleter);\n      const isActive = activeState.get;\n      const hideIfNecessary = () => {\n        if (isMenuOpen()) {\n          InlineView.hide(autocompleter);\n          editor.dom.remove(autocompleterId, false);\n          const editorBody = SugarElement.fromDom(editor.getBody());\n          getOpt(editorBody, 'aria-owns').filter(ariaOwnsAttr => ariaOwnsAttr === autocompleterId).each(() => {\n            remove$7(editorBody, 'aria-owns');\n            remove$7(editorBody, 'aria-activedescendant');\n          });\n        }\n      };\n      const getMenu = () => InlineView.getContent(autocompleter).bind(tmenu => {\n        return get$h(tmenu.components(), 0);\n      });\n      const cancelIfNecessary = () => editor.execCommand('mceAutocompleterClose');\n      const getCombinedItems = matches => {\n        const columns = findMap(matches, m => Optional.from(m.columns)).getOr(1);\n        return bind$3(matches, match => {\n          const choices = match.items;\n          return createAutocompleteItems(choices, match.matchText, (itemValue, itemMeta) => {\n            const autocompleterApi = {\n              hide: () => cancelIfNecessary(),\n              reload: fetchOptions => {\n                hideIfNecessary();\n                editor.execCommand('mceAutocompleterReload', false, { fetchOptions });\n              }\n            };\n            editor.execCommand('mceAutocompleterRefreshActiveRange');\n            activeRange.get().each(range => {\n              processingAction.set(true);\n              match.onAction(autocompleterApi, range, itemValue, itemMeta);\n              processingAction.set(false);\n            });\n          }, columns, ItemResponse$1.BUBBLE_TO_SANDBOX, sharedBackstage, match.highlightOn);\n        });\n      };\n      const display = (lookupData, items) => {\n        const columns = findMap(lookupData, ld => Optional.from(ld.columns)).getOr(1);\n        InlineView.showMenuAt(autocompleter, {\n          anchor: {\n            type: 'selection',\n            getSelection: () => activeRange.get().map(rangeToSimRange),\n            root: SugarElement.fromDom(editor.getBody())\n          }\n        }, createInlineMenuFrom(createPartialMenuWithAlloyItems('autocompleter-value', true, items, columns, { menuType: 'normal' }), columns, FocusMode.ContentFocus, 'normal'));\n        getMenu().each(Highlighting.highlightFirst);\n      };\n      const updateDisplay = lookupData => {\n        const combinedItems = getCombinedItems(lookupData);\n        if (combinedItems.length > 0) {\n          display(lookupData, combinedItems);\n          set$9(SugarElement.fromDom(editor.getBody()), 'aria-owns', autocompleterId);\n          if (!editor.inline) {\n            cloneAutocompleterToEditorDoc();\n          }\n        } else {\n          hideIfNecessary();\n        }\n      };\n      const cloneAutocompleterToEditorDoc = () => {\n        if (editor.dom.get(autocompleterId)) {\n          editor.dom.remove(autocompleterId, false);\n        }\n        const docElm = editor.getDoc().documentElement;\n        const selection = editor.selection.getNode();\n        const newElm = deep(autocompleter.element);\n        setAll(newElm, {\n          border: '0',\n          clip: 'rect(0 0 0 0)',\n          height: '1px',\n          margin: '-1px',\n          overflow: 'hidden',\n          padding: '0',\n          position: 'absolute',\n          width: '1px',\n          top: `${ selection.offsetTop }px`,\n          left: `${ selection.offsetLeft }px`\n        });\n        editor.dom.add(docElm, newElm.dom);\n        descendant(newElm, '[role=\"menu\"]').each(child => {\n          remove$6(child, 'position');\n          remove$6(child, 'max-height');\n        });\n      };\n      editor.on('AutocompleterStart', ({lookupData}) => {\n        activeState.set(true);\n        processingAction.set(false);\n        updateDisplay(lookupData);\n      });\n      editor.on('AutocompleterUpdate', ({lookupData}) => updateDisplay(lookupData));\n      editor.on('AutocompleterUpdateActiveRange', ({range}) => activeRange.set(range));\n      editor.on('AutocompleterEnd', () => {\n        hideIfNecessary();\n        activeState.set(false);\n        processingAction.set(false);\n        activeRange.clear();\n      });\n      const autocompleterUiApi = {\n        cancelIfNecessary,\n        isMenuOpen,\n        isActive,\n        isProcessingAction: processingAction.get,\n        getMenu\n      };\n      AutocompleterEditorEvents.setup(autocompleterUiApi, editor);\n    };\n    const Autocompleter = { register: register$b };\n\n    const nonScrollingOverflows = [\n      'visible',\n      'hidden',\n      'clip'\n    ];\n    const isScrollingOverflowValue = value => trim$1(value).length > 0 && !contains$2(nonScrollingOverflows, value);\n    const isScroller = elem => {\n      if (isHTMLElement(elem)) {\n        const overflowX = get$e(elem, 'overflow-x');\n        const overflowY = get$e(elem, 'overflow-y');\n        return isScrollingOverflowValue(overflowX) || isScrollingOverflowValue(overflowY);\n      } else {\n        return false;\n      }\n    };\n    const detect = popupSinkElem => {\n      const ancestorsScrollers = ancestors(popupSinkElem, isScroller);\n      const scrollers = ancestorsScrollers.length === 0 ? getShadowRoot(popupSinkElem).map(getShadowHost).map(x => ancestors(x, isScroller)).getOr([]) : ancestorsScrollers;\n      return head(scrollers).map(element => ({\n        element,\n        others: scrollers.slice(1)\n      }));\n    };\n    const detectWhenSplitUiMode = (editor, popupSinkElem) => isSplitUiMode(editor) ? detect(popupSinkElem) : Optional.none();\n    const getBoundsFrom = sc => {\n      const scrollableBoxes = [\n        ...map$2(sc.others, box$1),\n        win()\n      ];\n      return constrainByMany(box$1(sc.element), scrollableBoxes);\n    };\n\n    const closest = (scope, selector, isRoot) => closest$1(scope, selector, isRoot).isSome();\n\n    const DelayedFunction = (fun, delay) => {\n      let ref = null;\n      const schedule = (...args) => {\n        ref = setTimeout(() => {\n          fun.apply(null, args);\n          ref = null;\n        }, delay);\n      };\n      const cancel = () => {\n        if (ref !== null) {\n          clearTimeout(ref);\n          ref = null;\n        }\n      };\n      return {\n        cancel,\n        schedule\n      };\n    };\n\n    const SIGNIFICANT_MOVE = 5;\n    const LONGPRESS_DELAY = 400;\n    const getTouch = event => {\n      const raw = event.raw;\n      if (raw.touches === undefined || raw.touches.length !== 1) {\n        return Optional.none();\n      }\n      return Optional.some(raw.touches[0]);\n    };\n    const isFarEnough = (touch, data) => {\n      const distX = Math.abs(touch.clientX - data.x);\n      const distY = Math.abs(touch.clientY - data.y);\n      return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE;\n    };\n    const monitor = settings => {\n      const startData = value$2();\n      const longpressFired = Cell(false);\n      const longpress$1 = DelayedFunction(event => {\n        settings.triggerEvent(longpress(), event);\n        longpressFired.set(true);\n      }, LONGPRESS_DELAY);\n      const handleTouchstart = event => {\n        getTouch(event).each(touch => {\n          longpress$1.cancel();\n          const data = {\n            x: touch.clientX,\n            y: touch.clientY,\n            target: event.target\n          };\n          longpress$1.schedule(event);\n          longpressFired.set(false);\n          startData.set(data);\n        });\n        return Optional.none();\n      };\n      const handleTouchmove = event => {\n        longpress$1.cancel();\n        getTouch(event).each(touch => {\n          startData.on(data => {\n            if (isFarEnough(touch, data)) {\n              startData.clear();\n            }\n          });\n        });\n        return Optional.none();\n      };\n      const handleTouchend = event => {\n        longpress$1.cancel();\n        const isSame = data => eq(data.target, event.target);\n        return startData.get().filter(isSame).map(_data => {\n          if (longpressFired.get()) {\n            event.prevent();\n            return false;\n          } else {\n            return settings.triggerEvent(tap(), event);\n          }\n        });\n      };\n      const handlers = wrapAll([\n        {\n          key: touchstart(),\n          value: handleTouchstart\n        },\n        {\n          key: touchmove(),\n          value: handleTouchmove\n        },\n        {\n          key: touchend(),\n          value: handleTouchend\n        }\n      ]);\n      const fireIfReady = (event, type) => get$g(handlers, type).bind(handler => handler(event));\n      return { fireIfReady };\n    };\n\n    const isDangerous = event => {\n      const keyEv = event.raw;\n      return keyEv.which === BACKSPACE[0] && !contains$2([\n        'input',\n        'textarea'\n      ], name$3(event.target)) && !closest(event.target, '[contenteditable=\"true\"]');\n    };\n    const setup$d = (container, rawSettings) => {\n      const settings = {\n        stopBackspace: true,\n        ...rawSettings\n      };\n      const pointerEvents = [\n        'touchstart',\n        'touchmove',\n        'touchend',\n        'touchcancel',\n        'gesturestart',\n        'mousedown',\n        'mouseup',\n        'mouseover',\n        'mousemove',\n        'mouseout',\n        'click'\n      ];\n      const tapEvent = monitor(settings);\n      const simpleEvents = map$2(pointerEvents.concat([\n        'selectstart',\n        'input',\n        'contextmenu',\n        'change',\n        'transitionend',\n        'transitioncancel',\n        'drag',\n        'dragstart',\n        'dragend',\n        'dragenter',\n        'dragleave',\n        'dragover',\n        'drop',\n        'keyup'\n      ]), type => bind(container, type, event => {\n        tapEvent.fireIfReady(event, type).each(tapStopped => {\n          if (tapStopped) {\n            event.kill();\n          }\n        });\n        const stopped = settings.triggerEvent(type, event);\n        if (stopped) {\n          event.kill();\n        }\n      }));\n      const pasteTimeout = value$2();\n      const onPaste = bind(container, 'paste', event => {\n        tapEvent.fireIfReady(event, 'paste').each(tapStopped => {\n          if (tapStopped) {\n            event.kill();\n          }\n        });\n        const stopped = settings.triggerEvent('paste', event);\n        if (stopped) {\n          event.kill();\n        }\n        pasteTimeout.set(setTimeout(() => {\n          settings.triggerEvent(postPaste(), event);\n        }, 0));\n      });\n      const onKeydown = bind(container, 'keydown', event => {\n        const stopped = settings.triggerEvent('keydown', event);\n        if (stopped) {\n          event.kill();\n        } else if (settings.stopBackspace && isDangerous(event)) {\n          event.prevent();\n        }\n      });\n      const onFocusIn = bind(container, 'focusin', event => {\n        const stopped = settings.triggerEvent('focusin', event);\n        if (stopped) {\n          event.kill();\n        }\n      });\n      const focusoutTimeout = value$2();\n      const onFocusOut = bind(container, 'focusout', event => {\n        const stopped = settings.triggerEvent('focusout', event);\n        if (stopped) {\n          event.kill();\n        }\n        focusoutTimeout.set(setTimeout(() => {\n          settings.triggerEvent(postBlur(), event);\n        }, 0));\n      });\n      const unbind = () => {\n        each$1(simpleEvents, e => {\n          e.unbind();\n        });\n        onKeydown.unbind();\n        onFocusIn.unbind();\n        onFocusOut.unbind();\n        onPaste.unbind();\n        pasteTimeout.on(clearTimeout);\n        focusoutTimeout.on(clearTimeout);\n      };\n      return { unbind };\n    };\n\n    const derive = (rawEvent, rawTarget) => {\n      const source = get$g(rawEvent, 'target').getOr(rawTarget);\n      return Cell(source);\n    };\n\n    const fromSource = (event, source) => {\n      const stopper = Cell(false);\n      const cutter = Cell(false);\n      const stop = () => {\n        stopper.set(true);\n      };\n      const cut = () => {\n        cutter.set(true);\n      };\n      return {\n        stop,\n        cut,\n        isStopped: stopper.get,\n        isCut: cutter.get,\n        event,\n        setSource: source.set,\n        getSource: source.get\n      };\n    };\n    const fromExternal = event => {\n      const stopper = Cell(false);\n      const stop = () => {\n        stopper.set(true);\n      };\n      return {\n        stop,\n        cut: noop,\n        isStopped: stopper.get,\n        isCut: never,\n        event,\n        setSource: die('Cannot set source of a broadcasted event'),\n        getSource: die('Cannot get source of a broadcasted event')\n      };\n    };\n\n    const adt$1 = Adt.generate([\n      { stopped: [] },\n      { resume: ['element'] },\n      { complete: [] }\n    ]);\n    const doTriggerHandler = (lookup, eventType, rawEvent, target, source, logger) => {\n      const handler = lookup(eventType, target);\n      const simulatedEvent = fromSource(rawEvent, source);\n      return handler.fold(() => {\n        logger.logEventNoHandlers(eventType, target);\n        return adt$1.complete();\n      }, handlerInfo => {\n        const descHandler = handlerInfo.descHandler;\n        const eventHandler = getCurried(descHandler);\n        eventHandler(simulatedEvent);\n        if (simulatedEvent.isStopped()) {\n          logger.logEventStopped(eventType, handlerInfo.element, descHandler.purpose);\n          return adt$1.stopped();\n        } else if (simulatedEvent.isCut()) {\n          logger.logEventCut(eventType, handlerInfo.element, descHandler.purpose);\n          return adt$1.complete();\n        } else {\n          return parent(handlerInfo.element).fold(() => {\n            logger.logNoParent(eventType, handlerInfo.element, descHandler.purpose);\n            return adt$1.complete();\n          }, parent => {\n            logger.logEventResponse(eventType, handlerInfo.element, descHandler.purpose);\n            return adt$1.resume(parent);\n          });\n        }\n      });\n    };\n    const doTriggerOnUntilStopped = (lookup, eventType, rawEvent, rawTarget, source, logger) => doTriggerHandler(lookup, eventType, rawEvent, rawTarget, source, logger).fold(always, parent => doTriggerOnUntilStopped(lookup, eventType, rawEvent, parent, source, logger), never);\n    const triggerHandler = (lookup, eventType, rawEvent, target, logger) => {\n      const source = derive(rawEvent, target);\n      return doTriggerHandler(lookup, eventType, rawEvent, target, source, logger);\n    };\n    const broadcast = (listeners, rawEvent, _logger) => {\n      const simulatedEvent = fromExternal(rawEvent);\n      each$1(listeners, listener => {\n        const descHandler = listener.descHandler;\n        const handler = getCurried(descHandler);\n        handler(simulatedEvent);\n      });\n      return simulatedEvent.isStopped();\n    };\n    const triggerUntilStopped = (lookup, eventType, rawEvent, logger) => triggerOnUntilStopped(lookup, eventType, rawEvent, rawEvent.target, logger);\n    const triggerOnUntilStopped = (lookup, eventType, rawEvent, rawTarget, logger) => {\n      const source = derive(rawEvent, rawTarget);\n      return doTriggerOnUntilStopped(lookup, eventType, rawEvent, rawTarget, source, logger);\n    };\n\n    const eventHandler = (element, descHandler) => ({\n      element,\n      descHandler\n    });\n    const broadcastHandler = (id, handler) => ({\n      id,\n      descHandler: handler\n    });\n    const EventRegistry = () => {\n      const registry = {};\n      const registerId = (extraArgs, id, events) => {\n        each(events, (v, k) => {\n          const handlers = registry[k] !== undefined ? registry[k] : {};\n          handlers[id] = curryArgs(v, extraArgs);\n          registry[k] = handlers;\n        });\n      };\n      const findHandler = (handlers, elem) => read$1(elem).bind(id => get$g(handlers, id)).map(descHandler => eventHandler(elem, descHandler));\n      const filterByType = type => get$g(registry, type).map(handlers => mapToArray(handlers, (f, id) => broadcastHandler(id, f))).getOr([]);\n      const find = (isAboveRoot, type, target) => get$g(registry, type).bind(handlers => closest$4(target, elem => findHandler(handlers, elem), isAboveRoot));\n      const unregisterId = id => {\n        each(registry, (handlersById, _eventName) => {\n          if (has$2(handlersById, id)) {\n            delete handlersById[id];\n          }\n        });\n      };\n      return {\n        registerId,\n        unregisterId,\n        filterByType,\n        find\n      };\n    };\n\n    const Registry = () => {\n      const events = EventRegistry();\n      const components = {};\n      const readOrTag = component => {\n        const elem = component.element;\n        return read$1(elem).getOrThunk(() => write('uid-', component.element));\n      };\n      const failOnDuplicate = (component, tagId) => {\n        const conflict = components[tagId];\n        if (conflict === component) {\n          unregister(component);\n        } else {\n          throw new Error('The tagId \"' + tagId + '\" is already used by: ' + element(conflict.element) + '\\nCannot use it for: ' + element(component.element) + '\\n' + 'The conflicting element is' + (inBody(conflict.element) ? ' ' : ' not ') + 'already in the DOM');\n        }\n      };\n      const register = component => {\n        const tagId = readOrTag(component);\n        if (hasNonNullableKey(components, tagId)) {\n          failOnDuplicate(component, tagId);\n        }\n        const extraArgs = [component];\n        events.registerId(extraArgs, tagId, component.events);\n        components[tagId] = component;\n      };\n      const unregister = component => {\n        read$1(component.element).each(tagId => {\n          delete components[tagId];\n          events.unregisterId(tagId);\n        });\n      };\n      const filter = type => events.filterByType(type);\n      const find = (isAboveRoot, type, target) => events.find(isAboveRoot, type, target);\n      const getById = id => get$g(components, id);\n      return {\n        find,\n        filter,\n        register,\n        unregister,\n        getById\n      };\n    };\n\n    const factory$j = detail => {\n      const {attributes, ...domWithoutAttributes} = detail.dom;\n      return {\n        uid: detail.uid,\n        dom: {\n          tag: 'div',\n          attributes: {\n            role: 'presentation',\n            ...attributes\n          },\n          ...domWithoutAttributes\n        },\n        components: detail.components,\n        behaviours: get$3(detail.containerBehaviours),\n        events: detail.events,\n        domModification: detail.domModification,\n        eventOrder: detail.eventOrder\n      };\n    };\n    const Container = single({\n      name: 'Container',\n      factory: factory$j,\n      configFields: [\n        defaulted('components', []),\n        field('containerBehaviours', []),\n        defaulted('events', {}),\n        defaulted('domModification', {}),\n        defaulted('eventOrder', {})\n      ]\n    });\n\n    const takeover = root => {\n      const isAboveRoot = el => parent(root.element).fold(always, parent => eq(el, parent));\n      const registry = Registry();\n      const lookup = (eventName, target) => registry.find(isAboveRoot, eventName, target);\n      const domEvents = setup$d(root.element, {\n        triggerEvent: (eventName, event) => {\n          return monitorEvent(eventName, event.target, logger => triggerUntilStopped(lookup, eventName, event, logger));\n        }\n      });\n      const systemApi = {\n        debugInfo: constant$1('real'),\n        triggerEvent: (eventName, target, data) => {\n          monitorEvent(eventName, target, logger => triggerOnUntilStopped(lookup, eventName, data, target, logger));\n        },\n        triggerFocus: (target, originator) => {\n          read$1(target).fold(() => {\n            focus$3(target);\n          }, _alloyId => {\n            monitorEvent(focus$4(), target, logger => {\n              triggerHandler(lookup, focus$4(), {\n                originator,\n                kill: noop,\n                prevent: noop,\n                target\n              }, target, logger);\n              return false;\n            });\n          });\n        },\n        triggerEscape: (comp, simulatedEvent) => {\n          systemApi.triggerEvent('keydown', comp.element, simulatedEvent.event);\n        },\n        getByUid: uid => {\n          return getByUid(uid);\n        },\n        getByDom: elem => {\n          return getByDom(elem);\n        },\n        build: build$1,\n        buildOrPatch: buildOrPatch,\n        addToGui: c => {\n          add(c);\n        },\n        removeFromGui: c => {\n          remove(c);\n        },\n        addToWorld: c => {\n          addToWorld(c);\n        },\n        removeFromWorld: c => {\n          removeFromWorld(c);\n        },\n        broadcast: message => {\n          broadcast$1(message);\n        },\n        broadcastOn: (channels, message) => {\n          broadcastOn(channels, message);\n        },\n        broadcastEvent: (eventName, event) => {\n          broadcastEvent(eventName, event);\n        },\n        isConnected: always\n      };\n      const addToWorld = component => {\n        component.connect(systemApi);\n        if (!isText(component.element)) {\n          registry.register(component);\n          each$1(component.components(), addToWorld);\n          systemApi.triggerEvent(systemInit(), component.element, { target: component.element });\n        }\n      };\n      const removeFromWorld = component => {\n        if (!isText(component.element)) {\n          each$1(component.components(), removeFromWorld);\n          registry.unregister(component);\n        }\n        component.disconnect();\n      };\n      const add = component => {\n        attach(root, component);\n      };\n      const remove = component => {\n        detach(component);\n      };\n      const destroy = () => {\n        domEvents.unbind();\n        remove$5(root.element);\n      };\n      const broadcastData = data => {\n        const receivers = registry.filter(receive());\n        each$1(receivers, receiver => {\n          const descHandler = receiver.descHandler;\n          const handler = getCurried(descHandler);\n          handler(data);\n        });\n      };\n      const broadcast$1 = message => {\n        broadcastData({\n          universal: true,\n          data: message\n        });\n      };\n      const broadcastOn = (channels, message) => {\n        broadcastData({\n          universal: false,\n          channels,\n          data: message\n        });\n      };\n      const broadcastEvent = (eventName, event) => {\n        const listeners = registry.filter(eventName);\n        return broadcast(listeners, event);\n      };\n      const getByUid = uid => registry.getById(uid).fold(() => Result.error(new Error('Could not find component with uid: \"' + uid + '\" in system.')), Result.value);\n      const getByDom = elem => {\n        const uid = read$1(elem).getOr('not found');\n        return getByUid(uid);\n      };\n      addToWorld(root);\n      return {\n        root,\n        element: root.element,\n        destroy,\n        add,\n        remove,\n        getByUid,\n        getByDom,\n        addToWorld,\n        removeFromWorld,\n        broadcast: broadcast$1,\n        broadcastOn,\n        broadcastEvent\n      };\n    };\n\n    const renderBar = (spec, backstage) => ({\n      dom: {\n        tag: 'div',\n        classes: [\n          'tox-bar',\n          'tox-form__controls-h-stack'\n        ]\n      },\n      components: map$2(spec.items, backstage.interpreter)\n    });\n\n    const schema$j = constant$1([\n      defaulted('prefix', 'form-field'),\n      field('fieldBehaviours', [\n        Composing,\n        Representing\n      ])\n    ]);\n    const parts$d = constant$1([\n      optional({\n        schema: [required$1('dom')],\n        name: 'label'\n      }),\n      optional({\n        factory: {\n          sketch: spec => {\n            return {\n              uid: spec.uid,\n              dom: {\n                tag: 'span',\n                styles: { display: 'none' },\n                attributes: { 'aria-hidden': 'true' },\n                innerHtml: spec.text\n              }\n            };\n          }\n        },\n        schema: [required$1('text')],\n        name: 'aria-descriptor'\n      }),\n      required({\n        factory: {\n          sketch: spec => {\n            const excludeFactory = exclude(spec, ['factory']);\n            return spec.factory.sketch(excludeFactory);\n          }\n        },\n        schema: [required$1('factory')],\n        name: 'field'\n      })\n    ]);\n\n    const factory$i = (detail, components, _spec, _externals) => {\n      const behaviours = augment(detail.fieldBehaviours, [\n        Composing.config({\n          find: container => {\n            return getPart(container, detail, 'field');\n          }\n        }),\n        Representing.config({\n          store: {\n            mode: 'manual',\n            getValue: field => {\n              return Composing.getCurrent(field).bind(Representing.getValue);\n            },\n            setValue: (field, value) => {\n              Composing.getCurrent(field).each(current => {\n                Representing.setValue(current, value);\n              });\n            }\n          }\n        })\n      ]);\n      const events = derive$2([runOnAttached((component, _simulatedEvent) => {\n          const ps = getParts(component, detail, [\n            'label',\n            'field',\n            'aria-descriptor'\n          ]);\n          ps.field().each(field => {\n            const id = generate$6(detail.prefix);\n            ps.label().each(label => {\n              set$9(label.element, 'for', id);\n              set$9(field.element, 'id', id);\n            });\n            ps['aria-descriptor']().each(descriptor => {\n              const descriptorId = generate$6(detail.prefix);\n              set$9(descriptor.element, 'id', descriptorId);\n              set$9(field.element, 'aria-describedby', descriptorId);\n            });\n          });\n        })]);\n      const apis = {\n        getField: container => getPart(container, detail, 'field'),\n        getLabel: container => getPart(container, detail, 'label')\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components,\n        behaviours,\n        events,\n        apis\n      };\n    };\n    const FormField = composite({\n      name: 'FormField',\n      configFields: schema$j(),\n      partFields: parts$d(),\n      factory: factory$i,\n      apis: {\n        getField: (apis, comp) => apis.getField(comp),\n        getLabel: (apis, comp) => apis.getLabel(comp)\n      }\n    });\n\n    const exhibit$2 = (base, tabConfig) => nu$7({\n      attributes: wrapAll([{\n          key: tabConfig.tabAttr,\n          value: 'true'\n        }])\n    });\n\n    var ActiveTabstopping = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        exhibit: exhibit$2\n    });\n\n    var TabstopSchema = [defaulted('tabAttr', 'data-alloy-tabstop')];\n\n    const Tabstopping = create$4({\n      fields: TabstopSchema,\n      name: 'tabstopping',\n      active: ActiveTabstopping\n    });\n\n    var global$3 = hugerte.util.Tools.resolve('hugerte.html.Entities');\n\n    const renderFormFieldWith = (pLabel, pField, extraClasses, extraBehaviours) => {\n      const spec = renderFormFieldSpecWith(pLabel, pField, extraClasses, extraBehaviours);\n      return FormField.sketch(spec);\n    };\n    const renderFormField = (pLabel, pField) => renderFormFieldWith(pLabel, pField, [], []);\n    const renderFormFieldSpecWith = (pLabel, pField, extraClasses, extraBehaviours) => ({\n      dom: renderFormFieldDomWith(extraClasses),\n      components: pLabel.toArray().concat([pField]),\n      fieldBehaviours: derive$1(extraBehaviours)\n    });\n    const renderFormFieldDom = () => renderFormFieldDomWith([]);\n    const renderFormFieldDomWith = extraClasses => ({\n      tag: 'div',\n      classes: ['tox-form__group'].concat(extraClasses)\n    });\n    const renderLabel$3 = (label, providersBackstage) => FormField.parts.label({\n      dom: {\n        tag: 'label',\n        classes: ['tox-label']\n      },\n      components: [text$2(providersBackstage.translate(label))]\n    });\n\n    const formChangeEvent = generate$6('form-component-change');\n    const formCloseEvent = generate$6('form-close');\n    const formCancelEvent = generate$6('form-cancel');\n    const formActionEvent = generate$6('form-action');\n    const formSubmitEvent = generate$6('form-submit');\n    const formBlockEvent = generate$6('form-block');\n    const formUnblockEvent = generate$6('form-unblock');\n    const formTabChangeEvent = generate$6('form-tabchange');\n    const formResizeEvent = generate$6('form-resize');\n\n    const renderCollection = (spec, providersBackstage, initialData) => {\n      const pLabel = spec.label.map(label => renderLabel$3(label, providersBackstage));\n      const icons = providersBackstage.icons();\n      const getIcon = icon => {\n        var _a;\n        return (_a = icons[icon]) !== null && _a !== void 0 ? _a : icon;\n      };\n      const runOnItem = f => (comp, se) => {\n        closest$1(se.event.target, '[data-collection-item-value]').each(target => {\n          f(comp, se, target, get$f(target, 'data-collection-item-value'));\n        });\n      };\n      const setContents = (comp, items) => {\n        const htmlLines = map$2(items, item => {\n          const itemText = global$8.translate(item.text);\n          const textContent = spec.columns === 1 ? `<div class=\"tox-collection__item-label\">${ itemText }</div>` : '';\n          const iconContent = `<div class=\"tox-collection__item-icon\">${ getIcon(item.icon) }</div>`;\n          const mapItemName = {\n            '_': ' ',\n            ' - ': ' ',\n            '-': ' '\n          };\n          const ariaLabel = itemText.replace(/\\_| \\- |\\-/g, match => mapItemName[match]);\n          const disabledClass = providersBackstage.isDisabled() ? ' tox-collection__item--state-disabled' : '';\n          return `<div data-mce-tooltip=\"${ ariaLabel }\" class=\"tox-collection__item${ disabledClass }\" tabindex=\"-1\" data-collection-item-value=\"${ global$3.encodeAllRaw(item.value) }\" aria-label=\"${ ariaLabel }\">${ iconContent }${ textContent }</div>`;\n        });\n        const chunks = spec.columns !== 'auto' && spec.columns > 1 ? chunk$1(htmlLines, spec.columns) : [htmlLines];\n        const html = map$2(chunks, ch => `<div class=\"tox-collection__group\">${ ch.join('') }</div>`);\n        set$6(comp.element, html.join(''));\n      };\n      const onClick = runOnItem((comp, se, tgt, itemValue) => {\n        se.stop();\n        if (!providersBackstage.isDisabled()) {\n          emitWith(comp, formActionEvent, {\n            name: spec.name,\n            value: itemValue\n          });\n        }\n      });\n      const collectionEvents = [\n        run$1(mouseover(), runOnItem((comp, se, tgt) => {\n          focus$3(tgt);\n        })),\n        run$1(click(), onClick),\n        run$1(tap(), onClick),\n        run$1(focusin(), runOnItem((comp, se, tgt) => {\n          descendant(comp.element, '.' + activeClass).each(currentActive => {\n            remove$2(currentActive, activeClass);\n          });\n          add$2(tgt, activeClass);\n        })),\n        run$1(focusout(), runOnItem(comp => {\n          descendant(comp.element, '.' + activeClass).each(currentActive => {\n            remove$2(currentActive, activeClass);\n            blur$1(currentActive);\n          });\n        })),\n        runOnExecute$1(runOnItem((comp, se, tgt, itemValue) => {\n          emitWith(comp, formActionEvent, {\n            name: spec.name,\n            value: itemValue\n          });\n        }))\n      ];\n      const iterCollectionItems = (comp, applyAttributes) => map$2(descendants(comp.element, '.tox-collection__item'), applyAttributes);\n      const pField = FormField.parts.field({\n        dom: {\n          tag: 'div',\n          classes: ['tox-collection'].concat(spec.columns !== 1 ? ['tox-collection--grid'] : ['tox-collection--list'])\n        },\n        components: [],\n        factory: { sketch: identity },\n        behaviours: derive$1([\n          Disabling.config({\n            disabled: providersBackstage.isDisabled,\n            onDisabled: comp => {\n              iterCollectionItems(comp, childElm => {\n                add$2(childElm, 'tox-collection__item--state-disabled');\n                set$9(childElm, 'aria-disabled', true);\n              });\n            },\n            onEnabled: comp => {\n              iterCollectionItems(comp, childElm => {\n                remove$2(childElm, 'tox-collection__item--state-disabled');\n                remove$7(childElm, 'aria-disabled');\n              });\n            }\n          }),\n          receivingConfig(),\n          Replacing.config({}),\n          Tooltipping.config({\n            ...providersBackstage.tooltips.getConfig({\n              tooltipText: '',\n              onShow: comp => {\n                descendant(comp.element, '.' + activeClass + '[data-mce-tooltip]').each(current => {\n                  getOpt(current, 'data-mce-tooltip').each(text => {\n                    Tooltipping.setComponents(comp, providersBackstage.tooltips.getComponents({ tooltipText: text }));\n                  });\n                });\n              }\n            }),\n            mode: 'children-keyboard-focus',\n            anchor: comp => ({\n              type: 'node',\n              node: descendant(comp.element, '.' + activeClass).orThunk(() => first$1('.tox-collection__item')),\n              root: comp.element,\n              layouts: {\n                onLtr: constant$1([\n                  south$2,\n                  north$2,\n                  southeast$2,\n                  northeast$2,\n                  southwest$2,\n                  northwest$2\n                ]),\n                onRtl: constant$1([\n                  south$2,\n                  north$2,\n                  southeast$2,\n                  northeast$2,\n                  southwest$2,\n                  northwest$2\n                ])\n              },\n              bubble: nu$5(0, -2, {})\n            })\n          }),\n          Representing.config({\n            store: {\n              mode: 'memory',\n              initialValue: initialData.getOr([])\n            },\n            onSetValue: (comp, items) => {\n              setContents(comp, items);\n              if (spec.columns === 'auto') {\n                detectSize(comp, 5, 'tox-collection__item').each(({numRows, numColumns}) => {\n                  Keying.setGridSize(comp, numRows, numColumns);\n                });\n              }\n              emit(comp, formResizeEvent);\n            }\n          }),\n          Tabstopping.config({}),\n          Keying.config(deriveCollectionMovement(spec.columns, 'normal')),\n          config('collection-events', collectionEvents)\n        ]),\n        eventOrder: {\n          [execute$5()]: [\n            'disabling',\n            'alloy.base.behaviour',\n            'collection-events'\n          ],\n          [focusin()]: [\n            'collection-events',\n            'tooltipping'\n          ]\n        }\n      });\n      const extraClasses = ['tox-form__group--collection'];\n      return renderFormFieldWith(pLabel, pField, extraClasses, []);\n    };\n\n    const ariaElements = [\n      'input',\n      'textarea'\n    ];\n    const isAriaElement = elem => {\n      const name = name$3(elem);\n      return contains$2(ariaElements, name);\n    };\n    const markValid = (component, invalidConfig) => {\n      const elem = invalidConfig.getRoot(component).getOr(component.element);\n      remove$2(elem, invalidConfig.invalidClass);\n      invalidConfig.notify.each(notifyInfo => {\n        if (isAriaElement(component.element)) {\n          set$9(component.element, 'aria-invalid', false);\n        }\n        notifyInfo.getContainer(component).each(container => {\n          set$6(container, notifyInfo.validHtml);\n        });\n        notifyInfo.onValid(component);\n      });\n    };\n    const markInvalid = (component, invalidConfig, invalidState, text) => {\n      const elem = invalidConfig.getRoot(component).getOr(component.element);\n      add$2(elem, invalidConfig.invalidClass);\n      invalidConfig.notify.each(notifyInfo => {\n        if (isAriaElement(component.element)) {\n          set$9(component.element, 'aria-invalid', true);\n        }\n        notifyInfo.getContainer(component).each(container => {\n          set$6(container, text);\n        });\n        notifyInfo.onInvalid(component, text);\n      });\n    };\n    const query = (component, invalidConfig, _invalidState) => invalidConfig.validator.fold(() => Future.pure(Result.value(true)), validatorInfo => validatorInfo.validate(component));\n    const run = (component, invalidConfig, invalidState) => {\n      invalidConfig.notify.each(notifyInfo => {\n        notifyInfo.onValidate(component);\n      });\n      return query(component, invalidConfig).map(valid => {\n        if (component.getSystem().isConnected()) {\n          return valid.fold(err => {\n            markInvalid(component, invalidConfig, invalidState, err);\n            return Result.error(err);\n          }, v => {\n            markValid(component, invalidConfig);\n            return Result.value(v);\n          });\n        } else {\n          return Result.error('No longer in system');\n        }\n      });\n    };\n    const isInvalid = (component, invalidConfig) => {\n      const elem = invalidConfig.getRoot(component).getOr(component.element);\n      return has(elem, invalidConfig.invalidClass);\n    };\n\n    var InvalidateApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        markValid: markValid,\n        markInvalid: markInvalid,\n        query: query,\n        run: run,\n        isInvalid: isInvalid\n    });\n\n    const events$8 = (invalidConfig, invalidState) => invalidConfig.validator.map(validatorInfo => derive$2([run$1(validatorInfo.onEvent, component => {\n        run(component, invalidConfig, invalidState).get(identity);\n      })].concat(validatorInfo.validateOnLoad ? [runOnAttached(component => {\n        run(component, invalidConfig, invalidState).get(noop);\n      })] : []))).getOr({});\n\n    var ActiveInvalidate = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$8\n    });\n\n    var InvalidateSchema = [\n      required$1('invalidClass'),\n      defaulted('getRoot', Optional.none),\n      optionObjOf('notify', [\n        defaulted('aria', 'alert'),\n        defaulted('getContainer', Optional.none),\n        defaulted('validHtml', ''),\n        onHandler('onValid'),\n        onHandler('onInvalid'),\n        onHandler('onValidate')\n      ]),\n      optionObjOf('validator', [\n        required$1('validate'),\n        defaulted('onEvent', 'input'),\n        defaulted('validateOnLoad', true)\n      ])\n    ];\n\n    const Invalidating = create$4({\n      fields: InvalidateSchema,\n      name: 'invalidating',\n      active: ActiveInvalidate,\n      apis: InvalidateApis,\n      extra: {\n        validation: validator => {\n          return component => {\n            const v = Representing.getValue(component);\n            return Future.pure(validator(v));\n          };\n        }\n      }\n    });\n\n    const exhibit$1 = () => nu$7({\n      styles: {\n        '-webkit-user-select': 'none',\n        'user-select': 'none',\n        '-ms-user-select': 'none',\n        '-moz-user-select': '-moz-none'\n      },\n      attributes: { unselectable: 'on' }\n    });\n    const events$7 = () => derive$2([abort(selectstart(), always)]);\n\n    var ActiveUnselecting = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$7,\n        exhibit: exhibit$1\n    });\n\n    const Unselecting = create$4({\n      fields: [],\n      name: 'unselecting',\n      active: ActiveUnselecting\n    });\n\n    const renderPanelButton = (spec, sharedBackstage) => Dropdown.sketch({\n      dom: spec.dom,\n      components: spec.components,\n      toggleClass: 'mce-active',\n      dropdownBehaviours: derive$1([\n        DisablingConfigs.button(sharedBackstage.providers.isDisabled),\n        receivingConfig(),\n        Unselecting.config({}),\n        Tabstopping.config({})\n      ]),\n      layouts: spec.layouts,\n      sandboxClasses: ['tox-dialog__popups'],\n      lazySink: sharedBackstage.getSink,\n      fetch: comp => Future.nu(callback => spec.fetch(callback)).map(items => Optional.from(createTieredDataFrom(deepMerge(createPartialChoiceMenu(generate$6('menu-value'), items, value => {\n        spec.onItemAction(comp, value);\n      }, spec.columns, spec.presets, ItemResponse$1.CLOSE_ON_EXECUTE, never, sharedBackstage.providers), { movement: deriveMenuMovement(spec.columns, spec.presets) })))),\n      parts: { menu: part(false, 1, spec.presets) }\n    });\n\n    const colorInputChangeEvent = generate$6('color-input-change');\n    const colorSwatchChangeEvent = generate$6('color-swatch-change');\n    const colorPickerCancelEvent = generate$6('color-picker-cancel');\n    const renderColorInput = (spec, sharedBackstage, colorInputBackstage, initialData) => {\n      const pField = FormField.parts.field({\n        factory: Input,\n        inputClasses: ['tox-textfield'],\n        data: initialData,\n        onSetValue: c => Invalidating.run(c).get(noop),\n        inputBehaviours: derive$1([\n          Disabling.config({ disabled: sharedBackstage.providers.isDisabled }),\n          receivingConfig(),\n          Tabstopping.config({}),\n          Invalidating.config({\n            invalidClass: 'tox-textbox-field-invalid',\n            getRoot: comp => parentElement(comp.element),\n            notify: {\n              onValid: comp => {\n                const val = Representing.getValue(comp);\n                emitWith(comp, colorInputChangeEvent, { color: val });\n              }\n            },\n            validator: {\n              validateOnLoad: false,\n              validate: input => {\n                const inputValue = Representing.getValue(input);\n                if (inputValue.length === 0) {\n                  return Future.pure(Result.value(true));\n                } else {\n                  const span = SugarElement.fromTag('span');\n                  set$8(span, 'background-color', inputValue);\n                  const res = getRaw(span, 'background-color').fold(() => Result.error('blah'), _ => Result.value(inputValue));\n                  return Future.pure(res);\n                }\n              }\n            }\n          })\n        ]),\n        selectOnFocus: false\n      });\n      const pLabel = spec.label.map(label => renderLabel$3(label, sharedBackstage.providers));\n      const emitSwatchChange = (colorBit, value) => {\n        emitWith(colorBit, colorSwatchChangeEvent, { value });\n      };\n      const onItemAction = (comp, value) => {\n        memColorButton.getOpt(comp).each(colorBit => {\n          if (value === 'custom') {\n            colorInputBackstage.colorPicker(valueOpt => {\n              valueOpt.fold(() => emit(colorBit, colorPickerCancelEvent), value => {\n                emitSwatchChange(colorBit, value);\n                addColor(spec.storageKey, value);\n              });\n            }, '#ffffff');\n          } else if (value === 'remove') {\n            emitSwatchChange(colorBit, '');\n          } else {\n            emitSwatchChange(colorBit, value);\n          }\n        });\n      };\n      const memColorButton = record(renderPanelButton({\n        dom: {\n          tag: 'span',\n          attributes: { 'aria-label': sharedBackstage.providers.translate('Color swatch') }\n        },\n        layouts: {\n          onRtl: () => [\n            southwest$2,\n            southeast$2,\n            south$2\n          ],\n          onLtr: () => [\n            southeast$2,\n            southwest$2,\n            south$2\n          ]\n        },\n        components: [],\n        fetch: getFetch$1(colorInputBackstage.getColors(spec.storageKey), spec.storageKey, colorInputBackstage.hasCustomColors()),\n        columns: colorInputBackstage.getColorCols(spec.storageKey),\n        presets: 'color',\n        onItemAction\n      }, sharedBackstage));\n      return FormField.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-form__group']\n        },\n        components: pLabel.toArray().concat([{\n            dom: {\n              tag: 'div',\n              classes: ['tox-color-input']\n            },\n            components: [\n              pField,\n              memColorButton.asSpec()\n            ]\n          }]),\n        fieldBehaviours: derive$1([config('form-field-events', [\n            run$1(colorInputChangeEvent, (comp, se) => {\n              memColorButton.getOpt(comp).each(colorButton => {\n                set$8(colorButton.element, 'background-color', se.event.color);\n              });\n              emitWith(comp, formChangeEvent, { name: spec.name });\n            }),\n            run$1(colorSwatchChangeEvent, (comp, se) => {\n              FormField.getField(comp).each(field => {\n                Representing.setValue(field, se.event.value);\n                Composing.getCurrent(comp).each(Focusing.focus);\n              });\n            }),\n            run$1(colorPickerCancelEvent, (comp, _se) => {\n              FormField.getField(comp).each(_field => {\n                Composing.getCurrent(comp).each(Focusing.focus);\n              });\n            })\n          ])])\n      });\n    };\n\n    const labelPart = optional({\n      schema: [required$1('dom')],\n      name: 'label'\n    });\n    const edgePart = name => optional({\n      name: '' + name + '-edge',\n      overrides: detail => {\n        const action = detail.model.manager.edgeActions[name];\n        return action.fold(() => ({}), a => ({\n          events: derive$2([\n            runActionExtra(touchstart(), (comp, se, d) => a(comp, d), [detail]),\n            runActionExtra(mousedown(), (comp, se, d) => a(comp, d), [detail]),\n            runActionExtra(mousemove(), (comp, se, det) => {\n              if (det.mouseIsDown.get()) {\n                a(comp, det);\n              }\n            }, [detail])\n          ])\n        }));\n      }\n    });\n    const tlEdgePart = edgePart('top-left');\n    const tedgePart = edgePart('top');\n    const trEdgePart = edgePart('top-right');\n    const redgePart = edgePart('right');\n    const brEdgePart = edgePart('bottom-right');\n    const bedgePart = edgePart('bottom');\n    const blEdgePart = edgePart('bottom-left');\n    const ledgePart = edgePart('left');\n    const thumbPart = required({\n      name: 'thumb',\n      defaults: constant$1({ dom: { styles: { position: 'absolute' } } }),\n      overrides: detail => {\n        return {\n          events: derive$2([\n            redirectToPart(touchstart(), detail, 'spectrum'),\n            redirectToPart(touchmove(), detail, 'spectrum'),\n            redirectToPart(touchend(), detail, 'spectrum'),\n            redirectToPart(mousedown(), detail, 'spectrum'),\n            redirectToPart(mousemove(), detail, 'spectrum'),\n            redirectToPart(mouseup(), detail, 'spectrum')\n          ])\n        };\n      }\n    });\n    const isShift = event => isShift$1(event.event);\n    const spectrumPart = required({\n      schema: [customField('mouseIsDown', () => Cell(false))],\n      name: 'spectrum',\n      overrides: detail => {\n        const modelDetail = detail.model;\n        const model = modelDetail.manager;\n        const setValueFrom = (component, simulatedEvent) => model.getValueFromEvent(simulatedEvent).map(value => model.setValueFrom(component, detail, value));\n        return {\n          behaviours: derive$1([\n            Keying.config({\n              mode: 'special',\n              onLeft: (spectrum, event) => model.onLeft(spectrum, detail, isShift(event)),\n              onRight: (spectrum, event) => model.onRight(spectrum, detail, isShift(event)),\n              onUp: (spectrum, event) => model.onUp(spectrum, detail, isShift(event)),\n              onDown: (spectrum, event) => model.onDown(spectrum, detail, isShift(event))\n            }),\n            Tabstopping.config({}),\n            Focusing.config({})\n          ]),\n          events: derive$2([\n            run$1(touchstart(), setValueFrom),\n            run$1(touchmove(), setValueFrom),\n            run$1(mousedown(), setValueFrom),\n            run$1(mousemove(), (spectrum, se) => {\n              if (detail.mouseIsDown.get()) {\n                setValueFrom(spectrum, se);\n              }\n            })\n          ])\n        };\n      }\n    });\n    var SliderParts = [\n      labelPart,\n      ledgePart,\n      redgePart,\n      tedgePart,\n      bedgePart,\n      tlEdgePart,\n      trEdgePart,\n      blEdgePart,\n      brEdgePart,\n      thumbPart,\n      spectrumPart\n    ];\n\n    const _sliderChangeEvent = 'slider.change.value';\n    const sliderChangeEvent = constant$1(_sliderChangeEvent);\n    const isTouchEvent$2 = evt => evt.type.indexOf('touch') !== -1;\n    const getEventSource = simulatedEvent => {\n      const evt = simulatedEvent.event.raw;\n      if (isTouchEvent$2(evt)) {\n        const touchEvent = evt;\n        return touchEvent.touches !== undefined && touchEvent.touches.length === 1 ? Optional.some(touchEvent.touches[0]).map(t => SugarPosition(t.clientX, t.clientY)) : Optional.none();\n      } else {\n        const mouseEvent = evt;\n        return mouseEvent.clientX !== undefined ? Optional.some(mouseEvent).map(me => SugarPosition(me.clientX, me.clientY)) : Optional.none();\n      }\n    };\n\n    const t = 'top', r = 'right', b = 'bottom', l = 'left';\n    const minX = detail => detail.model.minX;\n    const minY = detail => detail.model.minY;\n    const min1X = detail => detail.model.minX - 1;\n    const min1Y = detail => detail.model.minY - 1;\n    const maxX = detail => detail.model.maxX;\n    const maxY = detail => detail.model.maxY;\n    const max1X = detail => detail.model.maxX + 1;\n    const max1Y = detail => detail.model.maxY + 1;\n    const range = (detail, max, min) => max(detail) - min(detail);\n    const xRange = detail => range(detail, maxX, minX);\n    const yRange = detail => range(detail, maxY, minY);\n    const halfX = detail => xRange(detail) / 2;\n    const halfY = detail => yRange(detail) / 2;\n    const step = (detail, useMultiplier) => useMultiplier ? detail.stepSize * detail.speedMultiplier : detail.stepSize;\n    const snap = detail => detail.snapToGrid;\n    const snapStart = detail => detail.snapStart;\n    const rounded = detail => detail.rounded;\n    const hasEdge = (detail, edgeName) => detail[edgeName + '-edge'] !== undefined;\n    const hasLEdge = detail => hasEdge(detail, l);\n    const hasREdge = detail => hasEdge(detail, r);\n    const hasTEdge = detail => hasEdge(detail, t);\n    const hasBEdge = detail => hasEdge(detail, b);\n    const currentValue = detail => detail.model.value.get();\n\n    const xyValue = (x, y) => ({\n      x,\n      y\n    });\n    const fireSliderChange$3 = (component, value) => {\n      emitWith(component, sliderChangeEvent(), { value });\n    };\n    const setToTLEdgeXY = (edge, detail) => {\n      fireSliderChange$3(edge, xyValue(min1X(detail), min1Y(detail)));\n    };\n    const setToTEdge = (edge, detail) => {\n      fireSliderChange$3(edge, min1Y(detail));\n    };\n    const setToTEdgeXY = (edge, detail) => {\n      fireSliderChange$3(edge, xyValue(halfX(detail), min1Y(detail)));\n    };\n    const setToTREdgeXY = (edge, detail) => {\n      fireSliderChange$3(edge, xyValue(max1X(detail), min1Y(detail)));\n    };\n    const setToREdge = (edge, detail) => {\n      fireSliderChange$3(edge, max1X(detail));\n    };\n    const setToREdgeXY = (edge, detail) => {\n      fireSliderChange$3(edge, xyValue(max1X(detail), halfY(detail)));\n    };\n    const setToBREdgeXY = (edge, detail) => {\n      fireSliderChange$3(edge, xyValue(max1X(detail), max1Y(detail)));\n    };\n    const setToBEdge = (edge, detail) => {\n      fireSliderChange$3(edge, max1Y(detail));\n    };\n    const setToBEdgeXY = (edge, detail) => {\n      fireSliderChange$3(edge, xyValue(halfX(detail), max1Y(detail)));\n    };\n    const setToBLEdgeXY = (edge, detail) => {\n      fireSliderChange$3(edge, xyValue(min1X(detail), max1Y(detail)));\n    };\n    const setToLEdge = (edge, detail) => {\n      fireSliderChange$3(edge, min1X(detail));\n    };\n    const setToLEdgeXY = (edge, detail) => {\n      fireSliderChange$3(edge, xyValue(min1X(detail), halfY(detail)));\n    };\n\n    const reduceBy = (value, min, max, step) => {\n      if (value < min) {\n        return value;\n      } else if (value > max) {\n        return max;\n      } else if (value === min) {\n        return min - 1;\n      } else {\n        return Math.max(min, value - step);\n      }\n    };\n    const increaseBy = (value, min, max, step) => {\n      if (value > max) {\n        return value;\n      } else if (value < min) {\n        return min;\n      } else if (value === max) {\n        return max + 1;\n      } else {\n        return Math.min(max, value + step);\n      }\n    };\n    const capValue = (value, min, max) => Math.max(min, Math.min(max, value));\n    const snapValueOf = (value, min, max, step, snapStart) => snapStart.fold(() => {\n      const initValue = value - min;\n      const extraValue = Math.round(initValue / step) * step;\n      return capValue(min + extraValue, min - 1, max + 1);\n    }, start => {\n      const remainder = (value - start) % step;\n      const adjustment = Math.round(remainder / step);\n      const rawSteps = Math.floor((value - start) / step);\n      const maxSteps = Math.floor((max - start) / step);\n      const numSteps = Math.min(maxSteps, rawSteps + adjustment);\n      const r = start + numSteps * step;\n      return Math.max(start, r);\n    });\n    const findOffsetOf = (value, min, max) => Math.min(max, Math.max(value, min)) - min;\n    const findValueOf = args => {\n      const {min, max, range, value, step, snap, snapStart, rounded, hasMinEdge, hasMaxEdge, minBound, maxBound, screenRange} = args;\n      const capMin = hasMinEdge ? min - 1 : min;\n      const capMax = hasMaxEdge ? max + 1 : max;\n      if (value < minBound) {\n        return capMin;\n      } else if (value > maxBound) {\n        return capMax;\n      } else {\n        const offset = findOffsetOf(value, minBound, maxBound);\n        const newValue = capValue(offset / screenRange * range + min, capMin, capMax);\n        if (snap && newValue >= min && newValue <= max) {\n          return snapValueOf(newValue, min, max, step, snapStart);\n        } else if (rounded) {\n          return Math.round(newValue);\n        } else {\n          return newValue;\n        }\n      }\n    };\n    const findOffsetOfValue$2 = args => {\n      const {min, max, range, value, hasMinEdge, hasMaxEdge, maxBound, maxOffset, centerMinEdge, centerMaxEdge} = args;\n      if (value < min) {\n        return hasMinEdge ? 0 : centerMinEdge;\n      } else if (value > max) {\n        return hasMaxEdge ? maxBound : centerMaxEdge;\n      } else {\n        return (value - min) / range * maxOffset;\n      }\n    };\n\n    const top = 'top', right = 'right', bottom = 'bottom', left = 'left', width = 'width', height = 'height';\n    const getBounds = component => component.element.dom.getBoundingClientRect();\n    const getBoundsProperty = (bounds, property) => bounds[property];\n    const getMinXBounds = component => {\n      const bounds = getBounds(component);\n      return getBoundsProperty(bounds, left);\n    };\n    const getMaxXBounds = component => {\n      const bounds = getBounds(component);\n      return getBoundsProperty(bounds, right);\n    };\n    const getMinYBounds = component => {\n      const bounds = getBounds(component);\n      return getBoundsProperty(bounds, top);\n    };\n    const getMaxYBounds = component => {\n      const bounds = getBounds(component);\n      return getBoundsProperty(bounds, bottom);\n    };\n    const getXScreenRange = component => {\n      const bounds = getBounds(component);\n      return getBoundsProperty(bounds, width);\n    };\n    const getYScreenRange = component => {\n      const bounds = getBounds(component);\n      return getBoundsProperty(bounds, height);\n    };\n    const getCenterOffsetOf = (componentMinEdge, componentMaxEdge, spectrumMinEdge) => (componentMinEdge + componentMaxEdge) / 2 - spectrumMinEdge;\n    const getXCenterOffSetOf = (component, spectrum) => {\n      const componentBounds = getBounds(component);\n      const spectrumBounds = getBounds(spectrum);\n      const componentMinEdge = getBoundsProperty(componentBounds, left);\n      const componentMaxEdge = getBoundsProperty(componentBounds, right);\n      const spectrumMinEdge = getBoundsProperty(spectrumBounds, left);\n      return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge);\n    };\n    const getYCenterOffSetOf = (component, spectrum) => {\n      const componentBounds = getBounds(component);\n      const spectrumBounds = getBounds(spectrum);\n      const componentMinEdge = getBoundsProperty(componentBounds, top);\n      const componentMaxEdge = getBoundsProperty(componentBounds, bottom);\n      const spectrumMinEdge = getBoundsProperty(spectrumBounds, top);\n      return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge);\n    };\n\n    const fireSliderChange$2 = (spectrum, value) => {\n      emitWith(spectrum, sliderChangeEvent(), { value });\n    };\n    const findValueOfOffset$1 = (spectrum, detail, left) => {\n      const args = {\n        min: minX(detail),\n        max: maxX(detail),\n        range: xRange(detail),\n        value: left,\n        step: step(detail),\n        snap: snap(detail),\n        snapStart: snapStart(detail),\n        rounded: rounded(detail),\n        hasMinEdge: hasLEdge(detail),\n        hasMaxEdge: hasREdge(detail),\n        minBound: getMinXBounds(spectrum),\n        maxBound: getMaxXBounds(spectrum),\n        screenRange: getXScreenRange(spectrum)\n      };\n      return findValueOf(args);\n    };\n    const setValueFrom$2 = (spectrum, detail, value) => {\n      const xValue = findValueOfOffset$1(spectrum, detail, value);\n      const sliderVal = xValue;\n      fireSliderChange$2(spectrum, sliderVal);\n      return xValue;\n    };\n    const setToMin$2 = (spectrum, detail) => {\n      const min = minX(detail);\n      fireSliderChange$2(spectrum, min);\n    };\n    const setToMax$2 = (spectrum, detail) => {\n      const max = maxX(detail);\n      fireSliderChange$2(spectrum, max);\n    };\n    const moveBy$2 = (direction, spectrum, detail, useMultiplier) => {\n      const f = direction > 0 ? increaseBy : reduceBy;\n      const xValue = f(currentValue(detail), minX(detail), maxX(detail), step(detail, useMultiplier));\n      fireSliderChange$2(spectrum, xValue);\n      return Optional.some(xValue);\n    };\n    const handleMovement$2 = direction => (spectrum, detail, useMultiplier) => moveBy$2(direction, spectrum, detail, useMultiplier).map(always);\n    const getValueFromEvent$2 = simulatedEvent => {\n      const pos = getEventSource(simulatedEvent);\n      return pos.map(p => p.left);\n    };\n    const findOffsetOfValue$1 = (spectrum, detail, value, minEdge, maxEdge) => {\n      const minOffset = 0;\n      const maxOffset = getXScreenRange(spectrum);\n      const centerMinEdge = minEdge.bind(edge => Optional.some(getXCenterOffSetOf(edge, spectrum))).getOr(minOffset);\n      const centerMaxEdge = maxEdge.bind(edge => Optional.some(getXCenterOffSetOf(edge, spectrum))).getOr(maxOffset);\n      const args = {\n        min: minX(detail),\n        max: maxX(detail),\n        range: xRange(detail),\n        value,\n        hasMinEdge: hasLEdge(detail),\n        hasMaxEdge: hasREdge(detail),\n        minBound: getMinXBounds(spectrum),\n        minOffset,\n        maxBound: getMaxXBounds(spectrum),\n        maxOffset,\n        centerMinEdge,\n        centerMaxEdge\n      };\n      return findOffsetOfValue$2(args);\n    };\n    const findPositionOfValue$1 = (slider, spectrum, value, minEdge, maxEdge, detail) => {\n      const offset = findOffsetOfValue$1(spectrum, detail, value, minEdge, maxEdge);\n      return getMinXBounds(spectrum) - getMinXBounds(slider) + offset;\n    };\n    const setPositionFromValue$2 = (slider, thumb, detail, edges) => {\n      const value = currentValue(detail);\n      const pos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail);\n      const thumbRadius = get$c(thumb.element) / 2;\n      set$8(thumb.element, 'left', pos - thumbRadius + 'px');\n    };\n    const onLeft$2 = handleMovement$2(-1);\n    const onRight$2 = handleMovement$2(1);\n    const onUp$2 = Optional.none;\n    const onDown$2 = Optional.none;\n    const edgeActions$2 = {\n      'top-left': Optional.none(),\n      'top': Optional.none(),\n      'top-right': Optional.none(),\n      'right': Optional.some(setToREdge),\n      'bottom-right': Optional.none(),\n      'bottom': Optional.none(),\n      'bottom-left': Optional.none(),\n      'left': Optional.some(setToLEdge)\n    };\n\n    var HorizontalModel = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        setValueFrom: setValueFrom$2,\n        setToMin: setToMin$2,\n        setToMax: setToMax$2,\n        findValueOfOffset: findValueOfOffset$1,\n        getValueFromEvent: getValueFromEvent$2,\n        findPositionOfValue: findPositionOfValue$1,\n        setPositionFromValue: setPositionFromValue$2,\n        onLeft: onLeft$2,\n        onRight: onRight$2,\n        onUp: onUp$2,\n        onDown: onDown$2,\n        edgeActions: edgeActions$2\n    });\n\n    const fireSliderChange$1 = (spectrum, value) => {\n      emitWith(spectrum, sliderChangeEvent(), { value });\n    };\n    const findValueOfOffset = (spectrum, detail, top) => {\n      const args = {\n        min: minY(detail),\n        max: maxY(detail),\n        range: yRange(detail),\n        value: top,\n        step: step(detail),\n        snap: snap(detail),\n        snapStart: snapStart(detail),\n        rounded: rounded(detail),\n        hasMinEdge: hasTEdge(detail),\n        hasMaxEdge: hasBEdge(detail),\n        minBound: getMinYBounds(spectrum),\n        maxBound: getMaxYBounds(spectrum),\n        screenRange: getYScreenRange(spectrum)\n      };\n      return findValueOf(args);\n    };\n    const setValueFrom$1 = (spectrum, detail, value) => {\n      const yValue = findValueOfOffset(spectrum, detail, value);\n      const sliderVal = yValue;\n      fireSliderChange$1(spectrum, sliderVal);\n      return yValue;\n    };\n    const setToMin$1 = (spectrum, detail) => {\n      const min = minY(detail);\n      fireSliderChange$1(spectrum, min);\n    };\n    const setToMax$1 = (spectrum, detail) => {\n      const max = maxY(detail);\n      fireSliderChange$1(spectrum, max);\n    };\n    const moveBy$1 = (direction, spectrum, detail, useMultiplier) => {\n      const f = direction > 0 ? increaseBy : reduceBy;\n      const yValue = f(currentValue(detail), minY(detail), maxY(detail), step(detail, useMultiplier));\n      fireSliderChange$1(spectrum, yValue);\n      return Optional.some(yValue);\n    };\n    const handleMovement$1 = direction => (spectrum, detail, useMultiplier) => moveBy$1(direction, spectrum, detail, useMultiplier).map(always);\n    const getValueFromEvent$1 = simulatedEvent => {\n      const pos = getEventSource(simulatedEvent);\n      return pos.map(p => {\n        return p.top;\n      });\n    };\n    const findOffsetOfValue = (spectrum, detail, value, minEdge, maxEdge) => {\n      const minOffset = 0;\n      const maxOffset = getYScreenRange(spectrum);\n      const centerMinEdge = minEdge.bind(edge => Optional.some(getYCenterOffSetOf(edge, spectrum))).getOr(minOffset);\n      const centerMaxEdge = maxEdge.bind(edge => Optional.some(getYCenterOffSetOf(edge, spectrum))).getOr(maxOffset);\n      const args = {\n        min: minY(detail),\n        max: maxY(detail),\n        range: yRange(detail),\n        value,\n        hasMinEdge: hasTEdge(detail),\n        hasMaxEdge: hasBEdge(detail),\n        minBound: getMinYBounds(spectrum),\n        minOffset,\n        maxBound: getMaxYBounds(spectrum),\n        maxOffset,\n        centerMinEdge,\n        centerMaxEdge\n      };\n      return findOffsetOfValue$2(args);\n    };\n    const findPositionOfValue = (slider, spectrum, value, minEdge, maxEdge, detail) => {\n      const offset = findOffsetOfValue(spectrum, detail, value, minEdge, maxEdge);\n      return getMinYBounds(spectrum) - getMinYBounds(slider) + offset;\n    };\n    const setPositionFromValue$1 = (slider, thumb, detail, edges) => {\n      const value = currentValue(detail);\n      const pos = findPositionOfValue(slider, edges.getSpectrum(slider), value, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail);\n      const thumbRadius = get$d(thumb.element) / 2;\n      set$8(thumb.element, 'top', pos - thumbRadius + 'px');\n    };\n    const onLeft$1 = Optional.none;\n    const onRight$1 = Optional.none;\n    const onUp$1 = handleMovement$1(-1);\n    const onDown$1 = handleMovement$1(1);\n    const edgeActions$1 = {\n      'top-left': Optional.none(),\n      'top': Optional.some(setToTEdge),\n      'top-right': Optional.none(),\n      'right': Optional.none(),\n      'bottom-right': Optional.none(),\n      'bottom': Optional.some(setToBEdge),\n      'bottom-left': Optional.none(),\n      'left': Optional.none()\n    };\n\n    var VerticalModel = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        setValueFrom: setValueFrom$1,\n        setToMin: setToMin$1,\n        setToMax: setToMax$1,\n        findValueOfOffset: findValueOfOffset,\n        getValueFromEvent: getValueFromEvent$1,\n        findPositionOfValue: findPositionOfValue,\n        setPositionFromValue: setPositionFromValue$1,\n        onLeft: onLeft$1,\n        onRight: onRight$1,\n        onUp: onUp$1,\n        onDown: onDown$1,\n        edgeActions: edgeActions$1\n    });\n\n    const fireSliderChange = (spectrum, value) => {\n      emitWith(spectrum, sliderChangeEvent(), { value });\n    };\n    const sliderValue = (x, y) => ({\n      x,\n      y\n    });\n    const setValueFrom = (spectrum, detail, value) => {\n      const xValue = findValueOfOffset$1(spectrum, detail, value.left);\n      const yValue = findValueOfOffset(spectrum, detail, value.top);\n      const val = sliderValue(xValue, yValue);\n      fireSliderChange(spectrum, val);\n      return val;\n    };\n    const moveBy = (direction, isVerticalMovement, spectrum, detail, useMultiplier) => {\n      const f = direction > 0 ? increaseBy : reduceBy;\n      const xValue = isVerticalMovement ? currentValue(detail).x : f(currentValue(detail).x, minX(detail), maxX(detail), step(detail, useMultiplier));\n      const yValue = !isVerticalMovement ? currentValue(detail).y : f(currentValue(detail).y, minY(detail), maxY(detail), step(detail, useMultiplier));\n      fireSliderChange(spectrum, sliderValue(xValue, yValue));\n      return Optional.some(xValue);\n    };\n    const handleMovement = (direction, isVerticalMovement) => (spectrum, detail, useMultiplier) => moveBy(direction, isVerticalMovement, spectrum, detail, useMultiplier).map(always);\n    const setToMin = (spectrum, detail) => {\n      const mX = minX(detail);\n      const mY = minY(detail);\n      fireSliderChange(spectrum, sliderValue(mX, mY));\n    };\n    const setToMax = (spectrum, detail) => {\n      const mX = maxX(detail);\n      const mY = maxY(detail);\n      fireSliderChange(spectrum, sliderValue(mX, mY));\n    };\n    const getValueFromEvent = simulatedEvent => getEventSource(simulatedEvent);\n    const setPositionFromValue = (slider, thumb, detail, edges) => {\n      const value = currentValue(detail);\n      const xPos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.x, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail);\n      const yPos = findPositionOfValue(slider, edges.getSpectrum(slider), value.y, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail);\n      const thumbXRadius = get$c(thumb.element) / 2;\n      const thumbYRadius = get$d(thumb.element) / 2;\n      set$8(thumb.element, 'left', xPos - thumbXRadius + 'px');\n      set$8(thumb.element, 'top', yPos - thumbYRadius + 'px');\n    };\n    const onLeft = handleMovement(-1, false);\n    const onRight = handleMovement(1, false);\n    const onUp = handleMovement(-1, true);\n    const onDown = handleMovement(1, true);\n    const edgeActions = {\n      'top-left': Optional.some(setToTLEdgeXY),\n      'top': Optional.some(setToTEdgeXY),\n      'top-right': Optional.some(setToTREdgeXY),\n      'right': Optional.some(setToREdgeXY),\n      'bottom-right': Optional.some(setToBREdgeXY),\n      'bottom': Optional.some(setToBEdgeXY),\n      'bottom-left': Optional.some(setToBLEdgeXY),\n      'left': Optional.some(setToLEdgeXY)\n    };\n\n    var TwoDModel = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        setValueFrom: setValueFrom,\n        setToMin: setToMin,\n        setToMax: setToMax,\n        getValueFromEvent: getValueFromEvent,\n        setPositionFromValue: setPositionFromValue,\n        onLeft: onLeft,\n        onRight: onRight,\n        onUp: onUp,\n        onDown: onDown,\n        edgeActions: edgeActions\n    });\n\n    const SliderSchema = [\n      defaulted('stepSize', 1),\n      defaulted('speedMultiplier', 10),\n      defaulted('onChange', noop),\n      defaulted('onChoose', noop),\n      defaulted('onInit', noop),\n      defaulted('onDragStart', noop),\n      defaulted('onDragEnd', noop),\n      defaulted('snapToGrid', false),\n      defaulted('rounded', true),\n      option$3('snapStart'),\n      requiredOf('model', choose$1('mode', {\n        x: [\n          defaulted('minX', 0),\n          defaulted('maxX', 100),\n          customField('value', spec => Cell(spec.mode.minX)),\n          required$1('getInitialValue'),\n          output$1('manager', HorizontalModel)\n        ],\n        y: [\n          defaulted('minY', 0),\n          defaulted('maxY', 100),\n          customField('value', spec => Cell(spec.mode.minY)),\n          required$1('getInitialValue'),\n          output$1('manager', VerticalModel)\n        ],\n        xy: [\n          defaulted('minX', 0),\n          defaulted('maxX', 100),\n          defaulted('minY', 0),\n          defaulted('maxY', 100),\n          customField('value', spec => Cell({\n            x: spec.mode.minX,\n            y: spec.mode.minY\n          })),\n          required$1('getInitialValue'),\n          output$1('manager', TwoDModel)\n        ]\n      })),\n      field('sliderBehaviours', [\n        Keying,\n        Representing\n      ]),\n      customField('mouseIsDown', () => Cell(false))\n    ];\n\n    const sketch$2 = (detail, components, _spec, _externals) => {\n      const getThumb = component => getPartOrDie(component, detail, 'thumb');\n      const getSpectrum = component => getPartOrDie(component, detail, 'spectrum');\n      const getLeftEdge = component => getPart(component, detail, 'left-edge');\n      const getRightEdge = component => getPart(component, detail, 'right-edge');\n      const getTopEdge = component => getPart(component, detail, 'top-edge');\n      const getBottomEdge = component => getPart(component, detail, 'bottom-edge');\n      const modelDetail = detail.model;\n      const model = modelDetail.manager;\n      const refresh = (slider, thumb) => {\n        model.setPositionFromValue(slider, thumb, detail, {\n          getLeftEdge,\n          getRightEdge,\n          getTopEdge,\n          getBottomEdge,\n          getSpectrum\n        });\n      };\n      const setValue = (slider, newValue) => {\n        modelDetail.value.set(newValue);\n        const thumb = getThumb(slider);\n        refresh(slider, thumb);\n      };\n      const changeValue = (slider, newValue) => {\n        setValue(slider, newValue);\n        const thumb = getThumb(slider);\n        detail.onChange(slider, thumb, newValue);\n        return Optional.some(true);\n      };\n      const resetToMin = slider => {\n        model.setToMin(slider, detail);\n      };\n      const resetToMax = slider => {\n        model.setToMax(slider, detail);\n      };\n      const choose = slider => {\n        const fireOnChoose = () => {\n          getPart(slider, detail, 'thumb').each(thumb => {\n            const value = modelDetail.value.get();\n            detail.onChoose(slider, thumb, value);\n          });\n        };\n        const wasDown = detail.mouseIsDown.get();\n        detail.mouseIsDown.set(false);\n        if (wasDown) {\n          fireOnChoose();\n        }\n      };\n      const onDragStart = (slider, simulatedEvent) => {\n        simulatedEvent.stop();\n        detail.mouseIsDown.set(true);\n        detail.onDragStart(slider, getThumb(slider));\n      };\n      const onDragEnd = (slider, simulatedEvent) => {\n        simulatedEvent.stop();\n        detail.onDragEnd(slider, getThumb(slider));\n        choose(slider);\n      };\n      const focusWidget = component => {\n        getPart(component, detail, 'spectrum').map(Keying.focusIn);\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components,\n        behaviours: augment(detail.sliderBehaviours, [\n          Keying.config({\n            mode: 'special',\n            focusIn: focusWidget\n          }),\n          Representing.config({\n            store: {\n              mode: 'manual',\n              getValue: _ => {\n                return modelDetail.value.get();\n              },\n              setValue\n            }\n          }),\n          Receiving.config({ channels: { [mouseReleased()]: { onReceive: choose } } })\n        ]),\n        events: derive$2([\n          run$1(sliderChangeEvent(), (slider, simulatedEvent) => {\n            changeValue(slider, simulatedEvent.event.value);\n          }),\n          runOnAttached((slider, _simulatedEvent) => {\n            const getInitial = modelDetail.getInitialValue();\n            modelDetail.value.set(getInitial);\n            const thumb = getThumb(slider);\n            refresh(slider, thumb);\n            const spectrum = getSpectrum(slider);\n            detail.onInit(slider, thumb, spectrum, modelDetail.value.get());\n          }),\n          run$1(touchstart(), onDragStart),\n          run$1(touchend(), onDragEnd),\n          run$1(mousedown(), (component, event) => {\n            focusWidget(component);\n            onDragStart(component, event);\n          }),\n          run$1(mouseup(), onDragEnd)\n        ]),\n        apis: {\n          resetToMin,\n          resetToMax,\n          setValue,\n          refresh\n        },\n        domModification: { styles: { position: 'relative' } }\n      };\n    };\n\n    const Slider = composite({\n      name: 'Slider',\n      configFields: SliderSchema,\n      partFields: SliderParts,\n      factory: sketch$2,\n      apis: {\n        setValue: (apis, slider, value) => {\n          apis.setValue(slider, value);\n        },\n        resetToMin: (apis, slider) => {\n          apis.resetToMin(slider);\n        },\n        resetToMax: (apis, slider) => {\n          apis.resetToMax(slider);\n        },\n        refresh: (apis, slider) => {\n          apis.refresh(slider);\n        }\n      }\n    });\n\n    const fieldsUpdate = generate$6('rgb-hex-update');\n    const sliderUpdate = generate$6('slider-update');\n    const paletteUpdate = generate$6('palette-update');\n\n    const sliderFactory = (translate, getClass) => {\n      const spectrum = Slider.parts.spectrum({\n        dom: {\n          tag: 'div',\n          classes: [getClass('hue-slider-spectrum')],\n          attributes: { role: 'presentation' }\n        }\n      });\n      const thumb = Slider.parts.thumb({\n        dom: {\n          tag: 'div',\n          classes: [getClass('hue-slider-thumb')],\n          attributes: { role: 'presentation' }\n        }\n      });\n      return Slider.sketch({\n        dom: {\n          tag: 'div',\n          classes: [getClass('hue-slider')],\n          attributes: {\n            'role': 'slider',\n            'aria-valuemin': 0,\n            'aria-valuemax': 360,\n            'aria-valuenow': 120\n          }\n        },\n        rounded: false,\n        model: {\n          mode: 'y',\n          getInitialValue: constant$1(0)\n        },\n        components: [\n          spectrum,\n          thumb\n        ],\n        sliderBehaviours: derive$1([Focusing.config({})]),\n        onChange: (slider, _thumb, value) => {\n          set$9(slider.element, 'aria-valuenow', Math.floor(360 - value * 3.6));\n          emitWith(slider, sliderUpdate, { value });\n        }\n      });\n    };\n\n    const owner$1 = 'form';\n    const schema$i = [field('formBehaviours', [Representing])];\n    const getPartName$1 = name => '<alloy.field.' + name + '>';\n    const sketch$1 = fSpec => {\n      const parts = (() => {\n        const record = [];\n        const field = (name, config) => {\n          record.push(name);\n          return generateOne$1(owner$1, getPartName$1(name), config);\n        };\n        return {\n          field,\n          record: constant$1(record)\n        };\n      })();\n      const spec = fSpec(parts);\n      const partNames = parts.record();\n      const fieldParts = map$2(partNames, n => required({\n        name: n,\n        pname: getPartName$1(n)\n      }));\n      return composite$1(owner$1, schema$i, fieldParts, make$4, spec);\n    };\n    const toResult = (o, e) => o.fold(() => Result.error(e), Result.value);\n    const make$4 = (detail, components) => ({\n      uid: detail.uid,\n      dom: detail.dom,\n      components,\n      behaviours: augment(detail.formBehaviours, [Representing.config({\n          store: {\n            mode: 'manual',\n            getValue: form => {\n              const resPs = getAllParts(form, detail);\n              return map$1(resPs, (resPThunk, pName) => resPThunk().bind(v => {\n                const opt = Composing.getCurrent(v);\n                return toResult(opt, new Error(`Cannot find a current component to extract the value from for form part '${ pName }': ` + element(v.element)));\n              }).map(Representing.getValue));\n            },\n            setValue: (form, values) => {\n              each(values, (newValue, key) => {\n                getPart(form, detail, key).each(wrapper => {\n                  Composing.getCurrent(wrapper).each(field => {\n                    Representing.setValue(field, newValue);\n                  });\n                });\n              });\n            }\n          }\n        })]),\n      apis: {\n        getField: (form, key) => {\n          return getPart(form, detail, key).bind(Composing.getCurrent);\n        }\n      }\n    });\n    const Form = {\n      getField: makeApi((apis, component, key) => apis.getField(component, key)),\n      sketch: sketch$1\n    };\n\n    const validInput = generate$6('valid-input');\n    const invalidInput = generate$6('invalid-input');\n    const validatingInput = generate$6('validating-input');\n    const translatePrefix = 'colorcustom.rgb.';\n    const rgbFormFactory = (translate, getClass, onValidHexx, onInvalidHexx) => {\n      const invalidation = (label, isValid) => Invalidating.config({\n        invalidClass: getClass('invalid'),\n        notify: {\n          onValidate: comp => {\n            emitWith(comp, validatingInput, { type: label });\n          },\n          onValid: comp => {\n            emitWith(comp, validInput, {\n              type: label,\n              value: Representing.getValue(comp)\n            });\n          },\n          onInvalid: comp => {\n            emitWith(comp, invalidInput, {\n              type: label,\n              value: Representing.getValue(comp)\n            });\n          }\n        },\n        validator: {\n          validate: comp => {\n            const value = Representing.getValue(comp);\n            const res = isValid(value) ? Result.value(true) : Result.error(translate('aria.input.invalid'));\n            return Future.pure(res);\n          },\n          validateOnLoad: false\n        }\n      });\n      const renderTextField = (isValid, name, label, description, data) => {\n        const helptext = translate(translatePrefix + 'range');\n        const pLabel = FormField.parts.label({\n          dom: {\n            tag: 'label',\n            attributes: { 'aria-label': description }\n          },\n          components: [text$2(label)]\n        });\n        const pField = FormField.parts.field({\n          data,\n          factory: Input,\n          inputAttributes: {\n            type: 'text',\n            ...name === 'hex' ? { 'aria-live': 'polite' } : {}\n          },\n          inputClasses: [getClass('textfield')],\n          inputBehaviours: derive$1([\n            invalidation(name, isValid),\n            Tabstopping.config({})\n          ]),\n          onSetValue: input => {\n            if (Invalidating.isInvalid(input)) {\n              const run = Invalidating.run(input);\n              run.get(noop);\n            }\n          }\n        });\n        const comps = [\n          pLabel,\n          pField\n        ];\n        const concats = name !== 'hex' ? [FormField.parts['aria-descriptor']({ text: helptext })] : [];\n        const components = comps.concat(concats);\n        return {\n          dom: {\n            tag: 'div',\n            attributes: { role: 'presentation' }\n          },\n          components\n        };\n      };\n      const copyRgbToHex = (form, rgba) => {\n        const hex = fromRgba(rgba);\n        Form.getField(form, 'hex').each(hexField => {\n          if (!Focusing.isFocused(hexField)) {\n            Representing.setValue(form, { hex: hex.value });\n          }\n        });\n        return hex;\n      };\n      const copyRgbToForm = (form, rgb) => {\n        const red = rgb.red;\n        const green = rgb.green;\n        const blue = rgb.blue;\n        Representing.setValue(form, {\n          red,\n          green,\n          blue\n        });\n      };\n      const memPreview = record({\n        dom: {\n          tag: 'div',\n          classes: [getClass('rgba-preview')],\n          styles: { 'background-color': 'white' },\n          attributes: { role: 'presentation' }\n        }\n      });\n      const updatePreview = (anyInSystem, hex) => {\n        memPreview.getOpt(anyInSystem).each(preview => {\n          set$8(preview.element, 'background-color', '#' + hex.value);\n        });\n      };\n      const factory = () => {\n        const state = {\n          red: Cell(Optional.some(255)),\n          green: Cell(Optional.some(255)),\n          blue: Cell(Optional.some(255)),\n          hex: Cell(Optional.some('ffffff'))\n        };\n        const copyHexToRgb = (form, hex) => {\n          const rgb = fromHex(hex);\n          copyRgbToForm(form, rgb);\n          setValueRgb(rgb);\n        };\n        const get = prop => state[prop].get();\n        const set = (prop, value) => {\n          state[prop].set(value);\n        };\n        const getValueRgb = () => get('red').bind(red => get('green').bind(green => get('blue').map(blue => rgbaColour(red, green, blue, 1))));\n        const setValueRgb = rgb => {\n          const red = rgb.red;\n          const green = rgb.green;\n          const blue = rgb.blue;\n          set('red', Optional.some(red));\n          set('green', Optional.some(green));\n          set('blue', Optional.some(blue));\n        };\n        const onInvalidInput = (form, simulatedEvent) => {\n          const data = simulatedEvent.event;\n          if (data.type !== 'hex') {\n            set(data.type, Optional.none());\n          } else {\n            onInvalidHexx(form);\n          }\n        };\n        const onValidHex = (form, value) => {\n          onValidHexx(form);\n          const hex = hexColour(value);\n          set('hex', Optional.some(hex.value));\n          const rgb = fromHex(hex);\n          copyRgbToForm(form, rgb);\n          setValueRgb(rgb);\n          emitWith(form, fieldsUpdate, { hex });\n          updatePreview(form, hex);\n        };\n        const onValidRgb = (form, prop, value) => {\n          const val = parseInt(value, 10);\n          set(prop, Optional.some(val));\n          getValueRgb().each(rgb => {\n            const hex = copyRgbToHex(form, rgb);\n            emitWith(form, fieldsUpdate, { hex });\n            updatePreview(form, hex);\n          });\n        };\n        const isHexInputEvent = data => data.type === 'hex';\n        const onValidInput = (form, simulatedEvent) => {\n          const data = simulatedEvent.event;\n          if (isHexInputEvent(data)) {\n            onValidHex(form, data.value);\n          } else {\n            onValidRgb(form, data.type, data.value);\n          }\n        };\n        const formPartStrings = key => ({\n          label: translate(translatePrefix + key + '.label'),\n          description: translate(translatePrefix + key + '.description')\n        });\n        const redStrings = formPartStrings('red');\n        const greenStrings = formPartStrings('green');\n        const blueStrings = formPartStrings('blue');\n        const hexStrings = formPartStrings('hex');\n        return deepMerge(Form.sketch(parts => ({\n          dom: {\n            tag: 'form',\n            classes: [getClass('rgb-form')],\n            attributes: { 'aria-label': translate('aria.color.picker') }\n          },\n          components: [\n            parts.field('red', FormField.sketch(renderTextField(isRgbaComponent, 'red', redStrings.label, redStrings.description, 255))),\n            parts.field('green', FormField.sketch(renderTextField(isRgbaComponent, 'green', greenStrings.label, greenStrings.description, 255))),\n            parts.field('blue', FormField.sketch(renderTextField(isRgbaComponent, 'blue', blueStrings.label, blueStrings.description, 255))),\n            parts.field('hex', FormField.sketch(renderTextField(isHexString, 'hex', hexStrings.label, hexStrings.description, 'ffffff'))),\n            memPreview.asSpec()\n          ],\n          formBehaviours: derive$1([\n            Invalidating.config({ invalidClass: getClass('form-invalid') }),\n            config('rgb-form-events', [\n              run$1(validInput, onValidInput),\n              run$1(invalidInput, onInvalidInput),\n              run$1(validatingInput, onInvalidInput)\n            ])\n          ])\n        })), {\n          apis: {\n            updateHex: (form, hex) => {\n              Representing.setValue(form, { hex: hex.value });\n              copyHexToRgb(form, hex);\n              updatePreview(form, hex);\n            }\n          }\n        });\n      };\n      const rgbFormSketcher = single({\n        factory,\n        name: 'RgbForm',\n        configFields: [],\n        apis: {\n          updateHex: (apis, form, hex) => {\n            apis.updateHex(form, hex);\n          }\n        },\n        extraApis: {}\n      });\n      return rgbFormSketcher;\n    };\n\n    const paletteFactory = (translate, getClass) => {\n      const spectrumPart = Slider.parts.spectrum({\n        dom: {\n          tag: 'canvas',\n          attributes: { role: 'presentation' },\n          classes: [getClass('sv-palette-spectrum')]\n        }\n      });\n      const thumbPart = Slider.parts.thumb({\n        dom: {\n          tag: 'div',\n          attributes: { role: 'presentation' },\n          classes: [getClass('sv-palette-thumb')],\n          innerHtml: `<div class=${ getClass('sv-palette-inner-thumb') } role=\"presentation\"></div>`\n        }\n      });\n      const setColour = (canvas, rgba) => {\n        const {width, height} = canvas;\n        const ctx = canvas.getContext('2d');\n        if (ctx === null) {\n          return;\n        }\n        ctx.fillStyle = rgba;\n        ctx.fillRect(0, 0, width, height);\n        const grdWhite = ctx.createLinearGradient(0, 0, width, 0);\n        grdWhite.addColorStop(0, 'rgba(255,255,255,1)');\n        grdWhite.addColorStop(1, 'rgba(255,255,255,0)');\n        ctx.fillStyle = grdWhite;\n        ctx.fillRect(0, 0, width, height);\n        const grdBlack = ctx.createLinearGradient(0, 0, 0, height);\n        grdBlack.addColorStop(0, 'rgba(0,0,0,0)');\n        grdBlack.addColorStop(1, 'rgba(0,0,0,1)');\n        ctx.fillStyle = grdBlack;\n        ctx.fillRect(0, 0, width, height);\n      };\n      const setPaletteHue = (slider, hue) => {\n        const canvas = slider.components()[0].element.dom;\n        const hsv = hsvColour(hue, 100, 100);\n        const rgba = fromHsv(hsv);\n        setColour(canvas, toString(rgba));\n      };\n      const setPaletteThumb = (slider, hex) => {\n        const hsv = fromRgb(fromHex(hex));\n        Slider.setValue(slider, {\n          x: hsv.saturation,\n          y: 100 - hsv.value\n        });\n        set$9(slider.element, 'aria-valuetext', translate([\n          'Saturation {0}%, Brightness {1}%',\n          hsv.saturation,\n          hsv.value\n        ]));\n      };\n      const factory = _detail => {\n        const getInitialValue = constant$1({\n          x: 0,\n          y: 0\n        });\n        const onChange = (slider, _thumb, value) => {\n          if (!isNumber(value)) {\n            set$9(slider.element, 'aria-valuetext', translate([\n              'Saturation {0}%, Brightness {1}%',\n              Math.floor(value.x),\n              Math.floor(100 - value.y)\n            ]));\n          }\n          emitWith(slider, paletteUpdate, { value });\n        };\n        const onInit = (_slider, _thumb, spectrum, _value) => {\n          setColour(spectrum.element.dom, toString(red));\n        };\n        const sliderBehaviours = derive$1([\n          Composing.config({ find: Optional.some }),\n          Focusing.config({})\n        ]);\n        return Slider.sketch({\n          dom: {\n            tag: 'div',\n            attributes: {\n              'role': 'slider',\n              'aria-valuetext': translate([\n                'Saturation {0}%, Brightness {1}%',\n                0,\n                0\n              ])\n            },\n            classes: [getClass('sv-palette')]\n          },\n          model: {\n            mode: 'xy',\n            getInitialValue\n          },\n          rounded: false,\n          components: [\n            spectrumPart,\n            thumbPart\n          ],\n          onChange,\n          onInit,\n          sliderBehaviours\n        });\n      };\n      const saturationBrightnessPaletteSketcher = single({\n        factory,\n        name: 'SaturationBrightnessPalette',\n        configFields: [],\n        apis: {\n          setHue: (_apis, slider, hue) => {\n            setPaletteHue(slider, hue);\n          },\n          setThumb: (_apis, slider, hex) => {\n            setPaletteThumb(slider, hex);\n          }\n        },\n        extraApis: {}\n      });\n      return saturationBrightnessPaletteSketcher;\n    };\n\n    const makeFactory = (translate, getClass) => {\n      const factory = detail => {\n        const rgbForm = rgbFormFactory(translate, getClass, detail.onValidHex, detail.onInvalidHex);\n        const sbPalette = paletteFactory(translate, getClass);\n        const hueSliderToDegrees = hue => (100 - hue) / 100 * 360;\n        const hueDegreesToSlider = hue => 100 - hue / 360 * 100;\n        const state = {\n          paletteRgba: Cell(red),\n          paletteHue: Cell(0)\n        };\n        const memSlider = record(sliderFactory(translate, getClass));\n        const memPalette = record(sbPalette.sketch({}));\n        const memRgb = record(rgbForm.sketch({}));\n        const updatePalette = (anyInSystem, _hex, hue) => {\n          memPalette.getOpt(anyInSystem).each(palette => {\n            sbPalette.setHue(palette, hue);\n          });\n        };\n        const updateFields = (anyInSystem, hex) => {\n          memRgb.getOpt(anyInSystem).each(form => {\n            rgbForm.updateHex(form, hex);\n          });\n        };\n        const updateSlider = (anyInSystem, _hex, hue) => {\n          memSlider.getOpt(anyInSystem).each(slider => {\n            Slider.setValue(slider, hueDegreesToSlider(hue));\n          });\n        };\n        const updatePaletteThumb = (anyInSystem, hex) => {\n          memPalette.getOpt(anyInSystem).each(palette => {\n            sbPalette.setThumb(palette, hex);\n          });\n        };\n        const updateState = (hex, hue) => {\n          const rgba = fromHex(hex);\n          state.paletteRgba.set(rgba);\n          state.paletteHue.set(hue);\n        };\n        const runUpdates = (anyInSystem, hex, hue, updates) => {\n          updateState(hex, hue);\n          each$1(updates, update => {\n            update(anyInSystem, hex, hue);\n          });\n        };\n        const onPaletteUpdate = () => {\n          const updates = [updateFields];\n          return (form, simulatedEvent) => {\n            const value = simulatedEvent.event.value;\n            const oldHue = state.paletteHue.get();\n            const newHsv = hsvColour(oldHue, value.x, 100 - value.y);\n            const newHex = hsvToHex(newHsv);\n            runUpdates(form, newHex, oldHue, updates);\n          };\n        };\n        const onSliderUpdate = () => {\n          const updates = [\n            updatePalette,\n            updateFields\n          ];\n          return (form, simulatedEvent) => {\n            const hue = hueSliderToDegrees(simulatedEvent.event.value);\n            const oldRgb = state.paletteRgba.get();\n            const oldHsv = fromRgb(oldRgb);\n            const newHsv = hsvColour(hue, oldHsv.saturation, oldHsv.value);\n            const newHex = hsvToHex(newHsv);\n            runUpdates(form, newHex, hue, updates);\n          };\n        };\n        const onFieldsUpdate = () => {\n          const updates = [\n            updatePalette,\n            updateSlider,\n            updatePaletteThumb\n          ];\n          return (form, simulatedEvent) => {\n            const hex = simulatedEvent.event.hex;\n            const hsv = hexToHsv(hex);\n            runUpdates(form, hex, hsv.hue, updates);\n          };\n        };\n        return {\n          uid: detail.uid,\n          dom: detail.dom,\n          components: [\n            memPalette.asSpec(),\n            memSlider.asSpec(),\n            memRgb.asSpec()\n          ],\n          behaviours: derive$1([\n            config('colour-picker-events', [\n              run$1(fieldsUpdate, onFieldsUpdate()),\n              run$1(paletteUpdate, onPaletteUpdate()),\n              run$1(sliderUpdate, onSliderUpdate())\n            ]),\n            Composing.config({ find: comp => memRgb.getOpt(comp) }),\n            Keying.config({ mode: 'acyclic' })\n          ])\n        };\n      };\n      const colourPickerSketcher = single({\n        name: 'ColourPicker',\n        configFields: [\n          required$1('dom'),\n          defaulted('onValidHex', noop),\n          defaulted('onInvalidHex', noop)\n        ],\n        factory\n      });\n      return colourPickerSketcher;\n    };\n\n    const self = () => Composing.config({ find: Optional.some });\n    const memento$1 = mem => Composing.config({ find: mem.getOpt });\n    const childAt = index => Composing.config({ find: comp => child$2(comp.element, index).bind(element => comp.getSystem().getByDom(element).toOptional()) });\n    const ComposingConfigs = {\n      self,\n      memento: memento$1,\n      childAt\n    };\n\n    const processors = objOf([\n      defaulted('preprocess', identity),\n      defaulted('postprocess', identity)\n    ]);\n    const memento = (mem, rawProcessors) => {\n      const ps = asRawOrDie$1('RepresentingConfigs.memento processors', processors, rawProcessors);\n      return Representing.config({\n        store: {\n          mode: 'manual',\n          getValue: comp => {\n            const other = mem.get(comp);\n            const rawValue = Representing.getValue(other);\n            return ps.postprocess(rawValue);\n          },\n          setValue: (comp, rawValue) => {\n            const newValue = ps.preprocess(rawValue);\n            const other = mem.get(comp);\n            Representing.setValue(other, newValue);\n          }\n        }\n      });\n    };\n    const withComp = (optInitialValue, getter, setter) => Representing.config({\n      store: {\n        mode: 'manual',\n        ...optInitialValue.map(initialValue => ({ initialValue })).getOr({}),\n        getValue: getter,\n        setValue: setter\n      }\n    });\n    const withElement = (initialValue, getter, setter) => withComp(initialValue, c => getter(c.element), (c, v) => setter(c.element, v));\n    const domHtml = optInitialValue => withElement(optInitialValue, get$9, set$6);\n    const memory = initialValue => Representing.config({\n      store: {\n        mode: 'memory',\n        initialValue\n      }\n    });\n\n    const english = {\n      'colorcustom.rgb.red.label': 'R',\n      'colorcustom.rgb.red.description': 'Red component',\n      'colorcustom.rgb.green.label': 'G',\n      'colorcustom.rgb.green.description': 'Green component',\n      'colorcustom.rgb.blue.label': 'B',\n      'colorcustom.rgb.blue.description': 'Blue component',\n      'colorcustom.rgb.hex.label': '#',\n      'colorcustom.rgb.hex.description': 'Hex color code',\n      'colorcustom.rgb.range': 'Range 0 to 255',\n      'aria.color.picker': 'Color Picker',\n      'aria.input.invalid': 'Invalid input'\n    };\n    const translate$1 = providerBackstage => key => {\n      if (isString(key)) {\n        return providerBackstage.translate(english[key]);\n      } else {\n        return providerBackstage.translate(key);\n      }\n    };\n    const renderColorPicker = (_spec, providerBackstage, initialData) => {\n      const getClass = key => 'tox-' + key;\n      const colourPickerFactory = makeFactory(translate$1(providerBackstage), getClass);\n      const onValidHex = form => {\n        emitWith(form, formActionEvent, {\n          name: 'hex-valid',\n          value: true\n        });\n      };\n      const onInvalidHex = form => {\n        emitWith(form, formActionEvent, {\n          name: 'hex-valid',\n          value: false\n        });\n      };\n      const memPicker = record(colourPickerFactory.sketch({\n        dom: {\n          tag: 'div',\n          classes: [getClass('color-picker-container')],\n          attributes: { role: 'presentation' }\n        },\n        onValidHex,\n        onInvalidHex\n      }));\n      return {\n        dom: { tag: 'div' },\n        components: [memPicker.asSpec()],\n        behaviours: derive$1([\n          withComp(initialData, comp => {\n            const picker = memPicker.get(comp);\n            const optRgbForm = Composing.getCurrent(picker);\n            const optHex = optRgbForm.bind(rgbForm => {\n              const formValues = Representing.getValue(rgbForm);\n              return formValues.hex;\n            });\n            return optHex.map(hex => '#' + removeLeading(hex, '#')).getOr('');\n          }, (comp, newValue) => {\n            const pattern = /^#([a-fA-F0-9]{3}(?:[a-fA-F0-9]{3})?)/;\n            const valOpt = Optional.from(pattern.exec(newValue)).bind(matches => get$h(matches, 1));\n            const picker = memPicker.get(comp);\n            const optRgbForm = Composing.getCurrent(picker);\n            optRgbForm.fold(() => {\n              console.log('Can not find form');\n            }, rgbForm => {\n              Representing.setValue(rgbForm, { hex: valOpt.getOr('') });\n              Form.getField(rgbForm, 'hex').each(hexField => {\n                emit(hexField, input());\n              });\n            });\n          }),\n          ComposingConfigs.self()\n        ])\n      };\n    };\n\n    var global$2 = hugerte.util.Tools.resolve('hugerte.Resource');\n\n    const isOldCustomEditor = spec => has$2(spec, 'init');\n    const renderCustomEditor = spec => {\n      const editorApi = value$2();\n      const memReplaced = record({ dom: { tag: spec.tag } });\n      const initialValue = value$2();\n      const focusBehaviour = !isOldCustomEditor(spec) && spec.onFocus.isSome() ? [\n        Focusing.config({\n          onFocus: comp => {\n            spec.onFocus.each(onFocusFn => {\n              onFocusFn(comp.element.dom);\n            });\n          }\n        }),\n        Tabstopping.config({})\n      ] : [];\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-custom-editor']\n        },\n        behaviours: derive$1([\n          config('custom-editor-events', [runOnAttached(component => {\n              memReplaced.getOpt(component).each(ta => {\n                (isOldCustomEditor(spec) ? spec.init(ta.element.dom) : global$2.load(spec.scriptId, spec.scriptUrl).then(init => init(ta.element.dom, spec.settings))).then(ea => {\n                  initialValue.on(cvalue => {\n                    ea.setValue(cvalue);\n                  });\n                  initialValue.clear();\n                  editorApi.set(ea);\n                });\n              });\n            })]),\n          withComp(Optional.none(), () => editorApi.get().fold(() => initialValue.get().getOr(''), ed => ed.getValue()), (_component, value) => {\n            editorApi.get().fold(() => initialValue.set(value), ed => ed.setValue(value));\n          }),\n          ComposingConfigs.self()\n        ].concat(focusBehaviour)),\n        components: [memReplaced.asSpec()]\n      };\n    };\n\n    var global$1 = hugerte.util.Tools.resolve('hugerte.util.Tools');\n\n    const filterByExtension = (files, providersBackstage) => {\n      const allowedImageFileTypes = global$1.explode(providersBackstage.getOption('images_file_types'));\n      const isFileInAllowedTypes = file => exists(allowedImageFileTypes, type => endsWith(file.name.toLowerCase(), `.${ type.toLowerCase() }`));\n      return filter$2(from(files), isFileInAllowedTypes);\n    };\n    const renderDropZone = (spec, providersBackstage, initialData) => {\n      const stopper = (_, se) => {\n        se.stop();\n      };\n      const sequence = actions => (comp, se) => {\n        each$1(actions, a => {\n          a(comp, se);\n        });\n      };\n      const onDrop = (comp, se) => {\n        var _a;\n        if (!Disabling.isDisabled(comp)) {\n          const transferEvent = se.event.raw;\n          handleFiles(comp, (_a = transferEvent.dataTransfer) === null || _a === void 0 ? void 0 : _a.files);\n        }\n      };\n      const onSelect = (component, simulatedEvent) => {\n        const input = simulatedEvent.event.raw.target;\n        handleFiles(component, input.files);\n      };\n      const handleFiles = (component, files) => {\n        if (files) {\n          Representing.setValue(component, filterByExtension(files, providersBackstage));\n          emitWith(component, formChangeEvent, { name: spec.name });\n        }\n      };\n      const memInput = record({\n        dom: {\n          tag: 'input',\n          attributes: {\n            type: 'file',\n            accept: 'image/*'\n          },\n          styles: { display: 'none' }\n        },\n        behaviours: derive$1([config('input-file-events', [\n            cutter(click()),\n            cutter(tap())\n          ])])\n      });\n      const renderField = s => ({\n        uid: s.uid,\n        dom: {\n          tag: 'div',\n          classes: ['tox-dropzone-container']\n        },\n        behaviours: derive$1([\n          memory(initialData.getOr([])),\n          ComposingConfigs.self(),\n          Disabling.config({}),\n          Toggling.config({\n            toggleClass: 'dragenter',\n            toggleOnExecute: false\n          }),\n          config('dropzone-events', [\n            run$1('dragenter', sequence([\n              stopper,\n              Toggling.toggle\n            ])),\n            run$1('dragleave', sequence([\n              stopper,\n              Toggling.toggle\n            ])),\n            run$1('dragover', stopper),\n            run$1('drop', sequence([\n              stopper,\n              onDrop\n            ])),\n            run$1(change(), onSelect)\n          ])\n        ]),\n        components: [{\n            dom: {\n              tag: 'div',\n              classes: ['tox-dropzone'],\n              styles: {}\n            },\n            components: [\n              {\n                dom: { tag: 'p' },\n                components: [text$2(providersBackstage.translate('Drop an image here'))]\n              },\n              Button.sketch({\n                dom: {\n                  tag: 'button',\n                  styles: { position: 'relative' },\n                  classes: [\n                    'tox-button',\n                    'tox-button--secondary'\n                  ]\n                },\n                components: [\n                  text$2(providersBackstage.translate('Browse for an image')),\n                  memInput.asSpec()\n                ],\n                action: comp => {\n                  const inputComp = memInput.get(comp);\n                  inputComp.element.dom.click();\n                },\n                buttonBehaviours: derive$1([\n                  Tabstopping.config({}),\n                  DisablingConfigs.button(providersBackstage.isDisabled),\n                  receivingConfig()\n                ])\n              })\n            ]\n          }]\n      });\n      const pLabel = spec.label.map(label => renderLabel$3(label, providersBackstage));\n      const pField = FormField.parts.field({ factory: { sketch: renderField } });\n      return renderFormFieldWith(pLabel, pField, ['tox-form__group--stretched'], []);\n    };\n\n    const renderGrid = (spec, backstage) => ({\n      dom: {\n        tag: 'div',\n        classes: [\n          'tox-form__grid',\n          `tox-form__grid--${ spec.columns }col`\n        ]\n      },\n      components: map$2(spec.items, backstage.interpreter)\n    });\n\n    const adaptable = (fn, rate) => {\n      let timer = null;\n      let args = null;\n      const cancel = () => {\n        if (!isNull(timer)) {\n          clearTimeout(timer);\n          timer = null;\n          args = null;\n        }\n      };\n      const throttle = (...newArgs) => {\n        args = newArgs;\n        if (isNull(timer)) {\n          timer = setTimeout(() => {\n            const tempArgs = args;\n            timer = null;\n            args = null;\n            fn.apply(null, tempArgs);\n          }, rate);\n        }\n      };\n      return {\n        cancel,\n        throttle\n      };\n    };\n    const first = (fn, rate) => {\n      let timer = null;\n      const cancel = () => {\n        if (!isNull(timer)) {\n          clearTimeout(timer);\n          timer = null;\n        }\n      };\n      const throttle = (...args) => {\n        if (isNull(timer)) {\n          timer = setTimeout(() => {\n            timer = null;\n            fn.apply(null, args);\n          }, rate);\n        }\n      };\n      return {\n        cancel,\n        throttle\n      };\n    };\n    const last = (fn, rate) => {\n      let timer = null;\n      const cancel = () => {\n        if (!isNull(timer)) {\n          clearTimeout(timer);\n          timer = null;\n        }\n      };\n      const throttle = (...args) => {\n        cancel();\n        timer = setTimeout(() => {\n          timer = null;\n          fn.apply(null, args);\n        }, rate);\n      };\n      return {\n        cancel,\n        throttle\n      };\n    };\n\n    const beforeObject = generate$6('alloy-fake-before-tabstop');\n    const afterObject = generate$6('alloy-fake-after-tabstop');\n    const craftWithClasses = classes => {\n      return {\n        dom: {\n          tag: 'div',\n          styles: {\n            width: '1px',\n            height: '1px',\n            outline: 'none'\n          },\n          attributes: { tabindex: '0' },\n          classes\n        },\n        behaviours: derive$1([\n          Focusing.config({ ignore: true }),\n          Tabstopping.config({})\n        ])\n      };\n    };\n    const craft = (containerClasses, spec) => {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-navobj',\n            ...containerClasses.getOr([])\n          ]\n        },\n        components: [\n          craftWithClasses([beforeObject]),\n          spec,\n          craftWithClasses([afterObject])\n        ],\n        behaviours: derive$1([ComposingConfigs.childAt(1)])\n      };\n    };\n    const triggerTab = (placeholder, shiftKey) => {\n      emitWith(placeholder, keydown(), {\n        raw: {\n          which: 9,\n          shiftKey\n        }\n      });\n    };\n    const onFocus = (container, targetComp) => {\n      const target = targetComp.element;\n      if (has(target, beforeObject)) {\n        triggerTab(container, true);\n      } else if (has(target, afterObject)) {\n        triggerTab(container, false);\n      }\n    };\n    const isPseudoStop = element => {\n      return closest(element, [\n        '.' + beforeObject,\n        '.' + afterObject\n      ].join(','), never);\n    };\n\n    const dialogChannel = generate$6('update-dialog');\n    const titleChannel = generate$6('update-title');\n    const bodyChannel = generate$6('update-body');\n    const footerChannel = generate$6('update-footer');\n    const bodySendMessageChannel = generate$6('body-send-message');\n    const dialogFocusShiftedChannel = generate$6('dialog-focus-shifted');\n\n    const browser = detect$1().browser;\n    const isSafari = browser.isSafari();\n    const isFirefox = browser.isFirefox();\n    const isSafariOrFirefox = isSafari || isFirefox;\n    const isChromium = browser.isChromium();\n    const isElementScrollAtBottom = ({scrollTop, scrollHeight, clientHeight}) => Math.ceil(scrollTop) + clientHeight >= scrollHeight;\n    const scrollToY = (win, y) => win.scrollTo(0, y === 'bottom' ? 99999999 : y);\n    const getScrollingElement = (doc, html) => {\n      const body = doc.body;\n      return Optional.from(!/^<!DOCTYPE (html|HTML)/.test(html) && (!isChromium && !isSafari || isNonNullable(body) && (body.scrollTop !== 0 || Math.abs(body.scrollHeight - body.clientHeight) > 1)) ? body : doc.documentElement);\n    };\n    const writeValue = (iframeElement, html, fallbackFn) => {\n      const iframe = iframeElement.dom;\n      Optional.from(iframe.contentDocument).fold(fallbackFn, doc => {\n        let lastScrollTop = 0;\n        const isScrollAtBottom = getScrollingElement(doc, html).map(el => {\n          lastScrollTop = el.scrollTop;\n          return el;\n        }).forall(isElementScrollAtBottom);\n        const scrollAfterWrite = () => {\n          const win = iframe.contentWindow;\n          if (isNonNullable(win)) {\n            if (isScrollAtBottom) {\n              scrollToY(win, 'bottom');\n            } else if (!isScrollAtBottom && isSafariOrFirefox && lastScrollTop !== 0) {\n              scrollToY(win, lastScrollTop);\n            }\n          }\n        };\n        if (isSafari) {\n          iframe.addEventListener('load', scrollAfterWrite, { once: true });\n        }\n        doc.open();\n        doc.write(html);\n        doc.close();\n        if (!isSafari) {\n          scrollAfterWrite();\n        }\n      });\n    };\n    const throttleInterval = someIf(isSafariOrFirefox, isSafari ? 500 : 200);\n    const writeValueThrottler = throttleInterval.map(interval => adaptable(writeValue, interval));\n    const getDynamicSource = (initialData, stream) => {\n      const cachedValue = Cell(initialData.getOr(''));\n      return {\n        getValue: _frameComponent => cachedValue.get(),\n        setValue: (frameComponent, html) => {\n          if (cachedValue.get() !== html) {\n            const iframeElement = frameComponent.element;\n            const setSrcdocValue = () => set$9(iframeElement, 'srcdoc', html);\n            if (stream) {\n              writeValueThrottler.fold(constant$1(writeValue), throttler => throttler.throttle)(iframeElement, html, setSrcdocValue);\n            } else {\n              setSrcdocValue();\n            }\n          }\n          cachedValue.set(html);\n        }\n      };\n    };\n    const renderIFrame = (spec, providersBackstage, initialData) => {\n      const baseClass = 'tox-dialog__iframe';\n      const opaqueClass = spec.transparent ? [] : [`${ baseClass }--opaque`];\n      const containerBorderedClass = spec.border ? [`tox-navobj-bordered`] : [];\n      const attributes = {\n        ...spec.label.map(title => ({ title })).getOr({}),\n        ...initialData.map(html => ({ srcdoc: html })).getOr({}),\n        ...spec.sandboxed ? { sandbox: 'allow-scripts allow-same-origin' } : {}\n      };\n      const sourcing = getDynamicSource(initialData, spec.streamContent);\n      const pLabel = spec.label.map(label => renderLabel$3(label, providersBackstage));\n      const factory = newSpec => craft(Optional.from(containerBorderedClass), {\n        uid: newSpec.uid,\n        dom: {\n          tag: 'iframe',\n          attributes,\n          classes: [\n            baseClass,\n            ...opaqueClass\n          ]\n        },\n        behaviours: derive$1([\n          Tabstopping.config({}),\n          Focusing.config({}),\n          withComp(initialData, sourcing.getValue, sourcing.setValue),\n          Receiving.config({\n            channels: {\n              [dialogFocusShiftedChannel]: {\n                onReceive: (comp, message) => {\n                  message.newFocus.each(newFocus => {\n                    parentElement(comp.element).each(parent => {\n                      const f = eq(comp.element, newFocus) ? add$2 : remove$2;\n                      f(parent, 'tox-navobj-bordered-focus');\n                    });\n                  });\n                }\n              }\n            }\n          })\n        ])\n      });\n      const pField = FormField.parts.field({ factory: { sketch: factory } });\n      return renderFormFieldWith(pLabel, pField, ['tox-form__group--stretched'], []);\n    };\n\n    const image = image => new Promise((resolve, reject) => {\n      const loaded = () => {\n        destroy();\n        resolve(image);\n      };\n      const listeners = [\n        bind(image, 'load', loaded),\n        bind(image, 'error', () => {\n          destroy();\n          reject('Unable to load data from image: ' + image.dom.src);\n        })\n      ];\n      const destroy = () => each$1(listeners, l => l.unbind());\n      if (image.dom.complete) {\n        loaded();\n      }\n    });\n\n    const calculateImagePosition = (panelWidth, panelHeight, imageWidth, imageHeight, zoom) => {\n      const width = imageWidth * zoom;\n      const height = imageHeight * zoom;\n      const left = Math.max(0, panelWidth / 2 - width / 2);\n      const top = Math.max(0, panelHeight / 2 - height / 2);\n      return {\n        left: left.toString() + 'px',\n        top: top.toString() + 'px',\n        width: width.toString() + 'px',\n        height: height.toString() + 'px'\n      };\n    };\n    const zoomToFit = (panel, width, height) => {\n      const panelW = get$c(panel);\n      const panelH = get$d(panel);\n      return Math.min(panelW / width, panelH / height, 1);\n    };\n    const renderImagePreview = (spec, initialData) => {\n      const cachedData = Cell(initialData.getOr({ url: '' }));\n      const memImage = record({\n        dom: {\n          tag: 'img',\n          classes: ['tox-imagepreview__image'],\n          attributes: initialData.map(data => ({ src: data.url })).getOr({})\n        }\n      });\n      const memContainer = record({\n        dom: {\n          tag: 'div',\n          classes: ['tox-imagepreview__container'],\n          attributes: { role: 'presentation' }\n        },\n        components: [memImage.asSpec()]\n      });\n      const setValue = (frameComponent, data) => {\n        const translatedData = { url: data.url };\n        data.zoom.each(z => translatedData.zoom = z);\n        data.cachedWidth.each(z => translatedData.cachedWidth = z);\n        data.cachedHeight.each(z => translatedData.cachedHeight = z);\n        cachedData.set(translatedData);\n        const applyFramePositioning = () => {\n          const {cachedWidth, cachedHeight, zoom} = translatedData;\n          if (!isUndefined(cachedWidth) && !isUndefined(cachedHeight)) {\n            if (isUndefined(zoom)) {\n              const z = zoomToFit(frameComponent.element, cachedWidth, cachedHeight);\n              translatedData.zoom = z;\n            }\n            const position = calculateImagePosition(get$c(frameComponent.element), get$d(frameComponent.element), cachedWidth, cachedHeight, translatedData.zoom);\n            memContainer.getOpt(frameComponent).each(container => {\n              setAll(container.element, position);\n            });\n          }\n        };\n        memImage.getOpt(frameComponent).each(imageComponent => {\n          const img = imageComponent.element;\n          if (data.url !== get$f(img, 'src')) {\n            set$9(img, 'src', data.url);\n            remove$2(frameComponent.element, 'tox-imagepreview__loaded');\n          }\n          applyFramePositioning();\n          image(img).then(img => {\n            if (frameComponent.getSystem().isConnected()) {\n              add$2(frameComponent.element, 'tox-imagepreview__loaded');\n              translatedData.cachedWidth = img.dom.naturalWidth;\n              translatedData.cachedHeight = img.dom.naturalHeight;\n              applyFramePositioning();\n            }\n          });\n        });\n      };\n      const styles = {};\n      spec.height.each(h => styles.height = h);\n      const fakeValidatedData = initialData.map(d => ({\n        url: d.url,\n        zoom: Optional.from(d.zoom),\n        cachedWidth: Optional.from(d.cachedWidth),\n        cachedHeight: Optional.from(d.cachedHeight)\n      }));\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-imagepreview'],\n          styles,\n          attributes: { role: 'presentation' }\n        },\n        components: [memContainer.asSpec()],\n        behaviours: derive$1([\n          ComposingConfigs.self(),\n          withComp(fakeValidatedData, () => cachedData.get(), setValue)\n        ])\n      };\n    };\n\n    const renderLabel$2 = (spec, backstageShared) => {\n      const baseClass = 'tox-label';\n      const centerClass = spec.align === 'center' ? [`${ baseClass }--center`] : [];\n      const endClass = spec.align === 'end' ? [`${ baseClass }--end`] : [];\n      const label = {\n        dom: {\n          tag: 'label',\n          classes: [\n            baseClass,\n            ...centerClass,\n            ...endClass\n          ]\n        },\n        components: [text$2(backstageShared.providers.translate(spec.label))]\n      };\n      const comps = map$2(spec.items, backstageShared.interpreter);\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-form__group']\n        },\n        components: [\n          label,\n          ...comps\n        ],\n        behaviours: derive$1([\n          ComposingConfigs.self(),\n          Replacing.config({}),\n          domHtml(Optional.none()),\n          Keying.config({ mode: 'acyclic' })\n        ])\n      };\n    };\n\n    const internalToolbarButtonExecute = generate$6('toolbar.button.execute');\n    const onToolbarButtonExecute = info => runOnExecute$1((comp, _simulatedEvent) => {\n      runWithApi(info, comp)(itemApi => {\n        emitWith(comp, internalToolbarButtonExecute, { buttonApi: itemApi });\n        info.onAction(itemApi);\n      });\n    });\n    const commonButtonDisplayEvent = generate$6('common-button-display-events');\n    const toolbarButtonEventOrder = {\n      [execute$5()]: [\n        'disabling',\n        'alloy.base.behaviour',\n        'toggling',\n        'toolbar-button-events',\n        'tooltipping'\n      ],\n      [attachedToDom()]: [\n        'toolbar-button-events',\n        commonButtonDisplayEvent\n      ],\n      [detachedFromDom()]: [\n        'toolbar-button-events',\n        'dropdown-events',\n        'tooltipping'\n      ],\n      [mousedown()]: [\n        'focusing',\n        'alloy.base.behaviour',\n        commonButtonDisplayEvent\n      ]\n    };\n\n    const forceInitialSize = comp => set$8(comp.element, 'width', get$e(comp.element, 'width'));\n\n    const renderIcon$1 = (iconName, iconsProvider, behaviours) => render$3(iconName, {\n      tag: 'span',\n      classes: [\n        'tox-icon',\n        'tox-tbtn__icon-wrap'\n      ],\n      behaviours\n    }, iconsProvider);\n    const renderIconFromPack$1 = (iconName, iconsProvider) => renderIcon$1(iconName, iconsProvider, []);\n    const renderReplaceableIconFromPack = (iconName, iconsProvider) => renderIcon$1(iconName, iconsProvider, [Replacing.config({})]);\n    const renderLabel$1 = (text, prefix, providersBackstage) => ({\n      dom: {\n        tag: 'span',\n        classes: [`${ prefix }__select-label`]\n      },\n      components: [text$2(providersBackstage.translate(text))],\n      behaviours: derive$1([Replacing.config({})])\n    });\n\n    const updateMenuText = generate$6('update-menu-text');\n    const updateMenuIcon = generate$6('update-menu-icon');\n    const renderCommonDropdown = (spec, prefix, sharedBackstage, btnName) => {\n      const editorOffCell = Cell(noop);\n      const optMemDisplayText = spec.text.map(text => record(renderLabel$1(text, prefix, sharedBackstage.providers)));\n      const optMemDisplayIcon = spec.icon.map(iconName => record(renderReplaceableIconFromPack(iconName, sharedBackstage.providers.icons)));\n      const onLeftOrRightInMenu = (comp, se) => {\n        const dropdown = Representing.getValue(comp);\n        Focusing.focus(dropdown);\n        emitWith(dropdown, 'keydown', { raw: se.event.raw });\n        Dropdown.close(dropdown);\n        return Optional.some(true);\n      };\n      const role = spec.role.fold(() => ({}), role => ({ role }));\n      const ariaLabelAttribute = spec.ariaLabel.fold(() => ({}), ariaLabel => {\n        const translatedAriaLabel = sharedBackstage.providers.translate(ariaLabel);\n        return { 'aria-label': translatedAriaLabel };\n      });\n      const iconSpec = render$3('chevron-down', {\n        tag: 'div',\n        classes: [`${ prefix }__select-chevron`]\n      }, sharedBackstage.providers.icons);\n      const fixWidthBehaviourName = generate$6('common-button-display-events');\n      const customEventsName = 'dropdown-events';\n      const memDropdown = record(Dropdown.sketch({\n        ...spec.uid ? { uid: spec.uid } : {},\n        ...role,\n        dom: {\n          tag: 'button',\n          classes: [\n            prefix,\n            `${ prefix }--select`\n          ].concat(map$2(spec.classes, c => `${ prefix }--${ c }`)),\n          attributes: {\n            ...ariaLabelAttribute,\n            ...isNonNullable(btnName) ? { 'data-mce-name': btnName } : {}\n          }\n        },\n        components: componentRenderPipeline([\n          optMemDisplayIcon.map(mem => mem.asSpec()),\n          optMemDisplayText.map(mem => mem.asSpec()),\n          Optional.some(iconSpec)\n        ]),\n        matchWidth: true,\n        useMinWidth: true,\n        onOpen: (anchor, dropdownComp, tmenuComp) => {\n          if (spec.searchable) {\n            focusSearchField(tmenuComp);\n          }\n        },\n        dropdownBehaviours: derive$1([\n          ...spec.dropdownBehaviours,\n          DisablingConfigs.button(() => spec.disabled || sharedBackstage.providers.isDisabled()),\n          receivingConfig(),\n          Unselecting.config({}),\n          Replacing.config({}),\n          ...spec.tooltip.map(t => Tooltipping.config(sharedBackstage.providers.tooltips.getConfig({ tooltipText: sharedBackstage.providers.translate(t) }))).toArray(),\n          config(customEventsName, [\n            onControlAttached(spec, editorOffCell),\n            onControlDetached(spec, editorOffCell)\n          ]),\n          config(fixWidthBehaviourName, [runOnAttached((comp, _se) => forceInitialSize(comp))]),\n          config('menubutton-update-display-text', [\n            run$1(updateMenuText, (comp, se) => {\n              optMemDisplayText.bind(mem => mem.getOpt(comp)).each(displayText => {\n                Replacing.set(displayText, [text$2(sharedBackstage.providers.translate(se.event.text))]);\n              });\n            }),\n            run$1(updateMenuIcon, (comp, se) => {\n              optMemDisplayIcon.bind(mem => mem.getOpt(comp)).each(displayIcon => {\n                Replacing.set(displayIcon, [renderReplaceableIconFromPack(se.event.icon, sharedBackstage.providers.icons)]);\n              });\n            })\n          ])\n        ]),\n        eventOrder: deepMerge(toolbarButtonEventOrder, {\n          [mousedown()]: [\n            'focusing',\n            'alloy.base.behaviour',\n            'item-type-events',\n            'normal-dropdown-events'\n          ],\n          [attachedToDom()]: [\n            'toolbar-button-events',\n            Tooltipping.name(),\n            customEventsName,\n            fixWidthBehaviourName\n          ]\n        }),\n        sandboxBehaviours: derive$1([\n          Keying.config({\n            mode: 'special',\n            onLeft: onLeftOrRightInMenu,\n            onRight: onLeftOrRightInMenu\n          }),\n          config('dropdown-sandbox-events', [\n            run$1(refetchTriggerEvent, (originalSandboxComp, se) => {\n              handleRefetchTrigger(originalSandboxComp);\n              se.stop();\n            }),\n            run$1(redirectMenuItemInteractionEvent, (sandboxComp, se) => {\n              handleRedirectToMenuItem(sandboxComp, se);\n              se.stop();\n            })\n          ])\n        ]),\n        lazySink: sharedBackstage.getSink,\n        toggleClass: `${ prefix }--active`,\n        parts: {\n          menu: {\n            ...part(false, spec.columns, spec.presets),\n            fakeFocus: spec.searchable,\n            onHighlightItem: updateAriaOnHighlight,\n            onCollapseMenu: (tmenuComp, itemCompCausingCollapse, nowActiveMenuComp) => {\n              Highlighting.getHighlighted(nowActiveMenuComp).each(itemComp => {\n                updateAriaOnHighlight(tmenuComp, nowActiveMenuComp, itemComp);\n              });\n            },\n            onDehighlightItem: updateAriaOnDehighlight\n          }\n        },\n        getAnchorOverrides: () => {\n          return {\n            maxHeightFunction: (element, available) => {\n              anchored()(element, available - 10);\n            }\n          };\n        },\n        fetch: comp => Future.nu(curry(spec.fetch, comp))\n      }));\n      return memDropdown.asSpec();\n    };\n\n    const isMenuItemReference = item => isString(item);\n    const isSeparator$2 = item => item.type === 'separator';\n    const isExpandingMenuItem = item => has$2(item, 'getSubmenuItems');\n    const separator$2 = { type: 'separator' };\n    const unwrapReferences = (items, menuItems) => {\n      const realItems = foldl(items, (acc, item) => {\n        if (isMenuItemReference(item)) {\n          if (item === '') {\n            return acc;\n          } else if (item === '|') {\n            return acc.length > 0 && !isSeparator$2(acc[acc.length - 1]) ? acc.concat([separator$2]) : acc;\n          } else if (has$2(menuItems, item.toLowerCase())) {\n            return acc.concat([menuItems[item.toLowerCase()]]);\n          } else {\n            return acc;\n          }\n        } else {\n          return acc.concat([item]);\n        }\n      }, []);\n      if (realItems.length > 0 && isSeparator$2(realItems[realItems.length - 1])) {\n        realItems.pop();\n      }\n      return realItems;\n    };\n    const getFromExpandingItem = (item, menuItems) => {\n      const submenuItems = item.getSubmenuItems();\n      const rest = expand(submenuItems, menuItems);\n      const newMenus = deepMerge(rest.menus, { [item.value]: rest.items });\n      const newExpansions = deepMerge(rest.expansions, { [item.value]: item.value });\n      return {\n        item,\n        menus: newMenus,\n        expansions: newExpansions\n      };\n    };\n    const generateValueIfRequired = item => {\n      const itemValue = get$g(item, 'value').getOrThunk(() => generate$6('generated-menu-item'));\n      return deepMerge({ value: itemValue }, item);\n    };\n    const expand = (items, menuItems) => {\n      const realItems = unwrapReferences(isString(items) ? items.split(' ') : items, menuItems);\n      return foldr(realItems, (acc, item) => {\n        if (isExpandingMenuItem(item)) {\n          const itemWithValue = generateValueIfRequired(item);\n          const newData = getFromExpandingItem(itemWithValue, menuItems);\n          return {\n            menus: deepMerge(acc.menus, newData.menus),\n            items: [\n              newData.item,\n              ...acc.items\n            ],\n            expansions: deepMerge(acc.expansions, newData.expansions)\n          };\n        } else {\n          return {\n            ...acc,\n            items: [\n              item,\n              ...acc.items\n            ]\n          };\n        }\n      }, {\n        menus: {},\n        expansions: {},\n        items: []\n      });\n    };\n\n    const getSearchModeForField = settings => {\n      return settings.search.fold(() => ({ searchMode: 'no-search' }), searchSettings => ({\n        searchMode: 'search-with-field',\n        placeholder: searchSettings.placeholder\n      }));\n    };\n    const getSearchModeForResults = settings => {\n      return settings.search.fold(() => ({ searchMode: 'no-search' }), _ => ({ searchMode: 'search-with-results' }));\n    };\n    const build = (items, itemResponse, backstage, settings) => {\n      const primary = generate$6('primary-menu');\n      const data = expand(items, backstage.shared.providers.menuItems());\n      if (data.items.length === 0) {\n        return Optional.none();\n      }\n      const mainMenuSearchMode = getSearchModeForField(settings);\n      const mainMenu = createPartialMenu(primary, data.items, itemResponse, backstage, settings.isHorizontalMenu, mainMenuSearchMode);\n      const submenuSearchMode = getSearchModeForResults(settings);\n      const submenus = map$1(data.menus, (menuItems, menuName) => createPartialMenu(menuName, menuItems, itemResponse, backstage, false, submenuSearchMode));\n      const menus = deepMerge(submenus, wrap$1(primary, mainMenu));\n      return Optional.from(tieredMenu.tieredData(primary, menus, data.expansions));\n    };\n\n    const isSingleListItem = item => !has$2(item, 'items');\n    const dataAttribute = 'data-value';\n    const fetchItems = (dropdownComp, name, items, selectedValue) => map$2(items, item => {\n      if (!isSingleListItem(item)) {\n        return {\n          type: 'nestedmenuitem',\n          text: item.text,\n          getSubmenuItems: () => fetchItems(dropdownComp, name, item.items, selectedValue)\n        };\n      } else {\n        return {\n          type: 'togglemenuitem',\n          text: item.text,\n          value: item.value,\n          active: item.value === selectedValue,\n          onAction: () => {\n            Representing.setValue(dropdownComp, item.value);\n            emitWith(dropdownComp, formChangeEvent, { name });\n            Focusing.focus(dropdownComp);\n          }\n        };\n      }\n    });\n    const findItemByValue = (items, value) => findMap(items, item => {\n      if (!isSingleListItem(item)) {\n        return findItemByValue(item.items, value);\n      } else {\n        return someIf(item.value === value, item);\n      }\n    });\n    const renderListBox = (spec, backstage, initialData) => {\n      const providersBackstage = backstage.shared.providers;\n      const initialItem = initialData.bind(value => findItemByValue(spec.items, value)).orThunk(() => head(spec.items).filter(isSingleListItem));\n      const pLabel = spec.label.map(label => renderLabel$3(label, providersBackstage));\n      const pField = FormField.parts.field({\n        dom: {},\n        factory: {\n          sketch: sketchSpec => renderCommonDropdown({\n            uid: sketchSpec.uid,\n            text: initialItem.map(item => item.text),\n            icon: Optional.none(),\n            tooltip: Optional.none(),\n            role: Optional.none(),\n            ariaLabel: spec.label,\n            fetch: (comp, callback) => {\n              const items = fetchItems(comp, spec.name, spec.items, Representing.getValue(comp));\n              callback(build(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, {\n                isHorizontalMenu: false,\n                search: Optional.none()\n              }));\n            },\n            onSetup: constant$1(noop),\n            getApi: constant$1({}),\n            columns: 1,\n            presets: 'normal',\n            classes: [],\n            dropdownBehaviours: [\n              Tabstopping.config({}),\n              withComp(initialItem.map(item => item.value), comp => get$f(comp.element, dataAttribute), (comp, data) => {\n                findItemByValue(spec.items, data).each(item => {\n                  set$9(comp.element, dataAttribute, item.value);\n                  emitWith(comp, updateMenuText, { text: item.text });\n                });\n              })\n            ]\n          }, 'tox-listbox', backstage.shared)\n        }\n      });\n      const listBoxWrap = {\n        dom: {\n          tag: 'div',\n          classes: ['tox-listboxfield']\n        },\n        components: [pField]\n      };\n      return FormField.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-form__group']\n        },\n        components: flatten([\n          pLabel.toArray(),\n          [listBoxWrap]\n        ]),\n        fieldBehaviours: derive$1([Disabling.config({\n            disabled: constant$1(!spec.enabled),\n            onDisabled: comp => {\n              FormField.getField(comp).each(Disabling.disable);\n            },\n            onEnabled: comp => {\n              FormField.getField(comp).each(Disabling.enable);\n            }\n          })])\n      });\n    };\n\n    const renderPanel = (spec, backstage) => ({\n      dom: {\n        tag: 'div',\n        classes: spec.classes\n      },\n      components: map$2(spec.items, backstage.shared.interpreter)\n    });\n\n    const factory$h = (detail, _spec) => {\n      const options = map$2(detail.options, option => ({\n        dom: {\n          tag: 'option',\n          value: option.value,\n          innerHtml: option.text\n        }\n      }));\n      const initialValues = detail.data.map(v => wrap$1('initialValue', v)).getOr({});\n      return {\n        uid: detail.uid,\n        dom: {\n          tag: 'select',\n          classes: detail.selectClasses,\n          attributes: detail.selectAttributes\n        },\n        components: options,\n        behaviours: augment(detail.selectBehaviours, [\n          Focusing.config({}),\n          Representing.config({\n            store: {\n              mode: 'manual',\n              getValue: select => {\n                return get$6(select.element);\n              },\n              setValue: (select, newValue) => {\n                const firstOption = head(detail.options);\n                const found = find$5(detail.options, opt => opt.value === newValue);\n                if (found.isSome()) {\n                  set$5(select.element, newValue);\n                } else if (select.element.dom.selectedIndex === -1 && newValue === '') {\n                  firstOption.each(value => set$5(select.element, value.value));\n                }\n              },\n              ...initialValues\n            }\n          })\n        ])\n      };\n    };\n    const HtmlSelect = single({\n      name: 'HtmlSelect',\n      configFields: [\n        required$1('options'),\n        field('selectBehaviours', [\n          Focusing,\n          Representing\n        ]),\n        defaulted('selectClasses', []),\n        defaulted('selectAttributes', {}),\n        option$3('data')\n      ],\n      factory: factory$h\n    });\n\n    const renderSelectBox = (spec, providersBackstage, initialData) => {\n      const translatedOptions = map$2(spec.items, item => ({\n        text: providersBackstage.translate(item.text),\n        value: item.value\n      }));\n      const pLabel = spec.label.map(label => renderLabel$3(label, providersBackstage));\n      const pField = FormField.parts.field({\n        dom: {},\n        ...initialData.map(data => ({ data })).getOr({}),\n        selectAttributes: { size: spec.size },\n        options: translatedOptions,\n        factory: HtmlSelect,\n        selectBehaviours: derive$1([\n          Disabling.config({ disabled: () => !spec.enabled || providersBackstage.isDisabled() }),\n          Tabstopping.config({}),\n          config('selectbox-change', [run$1(change(), (component, _) => {\n              emitWith(component, formChangeEvent, { name: spec.name });\n            })])\n        ])\n      });\n      const chevron = spec.size > 1 ? Optional.none() : Optional.some(render$3('chevron-down', {\n        tag: 'div',\n        classes: ['tox-selectfield__icon-js']\n      }, providersBackstage.icons));\n      const selectWrap = {\n        dom: {\n          tag: 'div',\n          classes: ['tox-selectfield']\n        },\n        components: flatten([\n          [pField],\n          chevron.toArray()\n        ])\n      };\n      return FormField.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-form__group']\n        },\n        components: flatten([\n          pLabel.toArray(),\n          [selectWrap]\n        ]),\n        fieldBehaviours: derive$1([\n          Disabling.config({\n            disabled: () => !spec.enabled || providersBackstage.isDisabled(),\n            onDisabled: comp => {\n              FormField.getField(comp).each(Disabling.disable);\n            },\n            onEnabled: comp => {\n              FormField.getField(comp).each(Disabling.enable);\n            }\n          }),\n          receivingConfig()\n        ])\n      });\n    };\n\n    const schema$h = constant$1([\n      defaulted('field1Name', 'field1'),\n      defaulted('field2Name', 'field2'),\n      onStrictHandler('onLockedChange'),\n      markers$1(['lockClass']),\n      defaulted('locked', false),\n      SketchBehaviours.field('coupledFieldBehaviours', [\n        Composing,\n        Representing\n      ])\n    ]);\n    const getField = (comp, detail, partName) => getPart(comp, detail, partName).bind(Composing.getCurrent);\n    const coupledPart = (selfName, otherName) => required({\n      factory: FormField,\n      name: selfName,\n      overrides: detail => {\n        return {\n          fieldBehaviours: derive$1([config('coupled-input-behaviour', [run$1(input(), me => {\n                getField(me, detail, otherName).each(other => {\n                  getPart(me, detail, 'lock').each(lock => {\n                    if (Toggling.isOn(lock)) {\n                      detail.onLockedChange(me, other, lock);\n                    }\n                  });\n                });\n              })])])\n        };\n      }\n    });\n    const parts$c = constant$1([\n      coupledPart('field1', 'field2'),\n      coupledPart('field2', 'field1'),\n      required({\n        factory: Button,\n        schema: [required$1('dom')],\n        name: 'lock',\n        overrides: detail => {\n          return {\n            buttonBehaviours: derive$1([Toggling.config({\n                selected: detail.locked,\n                toggleClass: detail.markers.lockClass,\n                aria: { mode: 'pressed' }\n              })])\n          };\n        }\n      })\n    ]);\n\n    const factory$g = (detail, components, _spec, _externals) => ({\n      uid: detail.uid,\n      dom: detail.dom,\n      components,\n      behaviours: SketchBehaviours.augment(detail.coupledFieldBehaviours, [\n        Composing.config({ find: Optional.some }),\n        Representing.config({\n          store: {\n            mode: 'manual',\n            getValue: comp => {\n              const parts = getPartsOrDie(comp, detail, [\n                'field1',\n                'field2'\n              ]);\n              return {\n                [detail.field1Name]: Representing.getValue(parts.field1()),\n                [detail.field2Name]: Representing.getValue(parts.field2())\n              };\n            },\n            setValue: (comp, value) => {\n              const parts = getPartsOrDie(comp, detail, [\n                'field1',\n                'field2'\n              ]);\n              if (hasNonNullableKey(value, detail.field1Name)) {\n                Representing.setValue(parts.field1(), value[detail.field1Name]);\n              }\n              if (hasNonNullableKey(value, detail.field2Name)) {\n                Representing.setValue(parts.field2(), value[detail.field2Name]);\n              }\n            }\n          }\n        })\n      ]),\n      apis: {\n        getField1: component => getPart(component, detail, 'field1'),\n        getField2: component => getPart(component, detail, 'field2'),\n        getLock: component => getPart(component, detail, 'lock')\n      }\n    });\n    const FormCoupledInputs = composite({\n      name: 'FormCoupledInputs',\n      configFields: schema$h(),\n      partFields: parts$c(),\n      factory: factory$g,\n      apis: {\n        getField1: (apis, component) => apis.getField1(component),\n        getField2: (apis, component) => apis.getField2(component),\n        getLock: (apis, component) => apis.getLock(component)\n      }\n    });\n\n    const formatSize = size => {\n      const unitDec = {\n        '': 0,\n        'px': 0,\n        'pt': 1,\n        'mm': 1,\n        'pc': 2,\n        'ex': 2,\n        'em': 2,\n        'ch': 2,\n        'rem': 2,\n        'cm': 3,\n        'in': 4,\n        '%': 4\n      };\n      const maxDecimal = unit => unit in unitDec ? unitDec[unit] : 1;\n      let numText = size.value.toFixed(maxDecimal(size.unit));\n      if (numText.indexOf('.') !== -1) {\n        numText = numText.replace(/\\.?0*$/, '');\n      }\n      return numText + size.unit;\n    };\n    const parseSize = sizeText => {\n      const numPattern = /^\\s*(\\d+(?:\\.\\d+)?)\\s*(|cm|mm|in|px|pt|pc|em|ex|ch|rem|vw|vh|vmin|vmax|%)\\s*$/;\n      const match = numPattern.exec(sizeText);\n      if (match !== null) {\n        const value = parseFloat(match[1]);\n        const unit = match[2];\n        return Result.value({\n          value,\n          unit\n        });\n      } else {\n        return Result.error(sizeText);\n      }\n    };\n    const convertUnit = (size, unit) => {\n      const inInch = {\n        '': 96,\n        'px': 96,\n        'pt': 72,\n        'cm': 2.54,\n        'pc': 12,\n        'mm': 25.4,\n        'in': 1\n      };\n      const supported = u => has$2(inInch, u);\n      if (size.unit === unit) {\n        return Optional.some(size.value);\n      } else if (supported(size.unit) && supported(unit)) {\n        if (inInch[size.unit] === inInch[unit]) {\n          return Optional.some(size.value);\n        } else {\n          return Optional.some(size.value / inInch[size.unit] * inInch[unit]);\n        }\n      } else {\n        return Optional.none();\n      }\n    };\n    const noSizeConversion = _input => Optional.none();\n    const ratioSizeConversion = (scale, unit) => size => convertUnit(size, unit).map(value => ({\n      value: value * scale,\n      unit\n    }));\n    const makeRatioConverter = (currentFieldText, otherFieldText) => {\n      const cValue = parseSize(currentFieldText).toOptional();\n      const oValue = parseSize(otherFieldText).toOptional();\n      return lift2(cValue, oValue, (cSize, oSize) => convertUnit(cSize, oSize.unit).map(val => oSize.value / val).map(r => ratioSizeConversion(r, oSize.unit)).getOr(noSizeConversion)).getOr(noSizeConversion);\n    };\n\n    const renderSizeInput = (spec, providersBackstage) => {\n      let converter = noSizeConversion;\n      const ratioEvent = generate$6('ratio-event');\n      const makeIcon = iconName => render$3(iconName, {\n        tag: 'span',\n        classes: [\n          'tox-icon',\n          'tox-lock-icon__' + iconName\n        ]\n      }, providersBackstage.icons);\n      const label = spec.label.getOr('Constrain proportions');\n      const translatedLabel = providersBackstage.translate(label);\n      const pLock = FormCoupledInputs.parts.lock({\n        dom: {\n          tag: 'button',\n          classes: [\n            'tox-lock',\n            'tox-button',\n            'tox-button--naked',\n            'tox-button--icon'\n          ],\n          attributes: {\n            'aria-label': translatedLabel,\n            'data-mce-name': label\n          }\n        },\n        components: [\n          makeIcon('lock'),\n          makeIcon('unlock')\n        ],\n        buttonBehaviours: derive$1([\n          Disabling.config({ disabled: () => !spec.enabled || providersBackstage.isDisabled() }),\n          receivingConfig(),\n          Tabstopping.config({}),\n          Tooltipping.config(providersBackstage.tooltips.getConfig({ tooltipText: translatedLabel }))\n        ])\n      });\n      const formGroup = components => ({\n        dom: {\n          tag: 'div',\n          classes: ['tox-form__group']\n        },\n        components\n      });\n      const getFieldPart = isField1 => FormField.parts.field({\n        factory: Input,\n        inputClasses: ['tox-textfield'],\n        inputBehaviours: derive$1([\n          Disabling.config({ disabled: () => !spec.enabled || providersBackstage.isDisabled() }),\n          receivingConfig(),\n          Tabstopping.config({}),\n          config('size-input-events', [\n            run$1(focusin(), (component, _simulatedEvent) => {\n              emitWith(component, ratioEvent, { isField1 });\n            }),\n            run$1(change(), (component, _simulatedEvent) => {\n              emitWith(component, formChangeEvent, { name: spec.name });\n            })\n          ])\n        ]),\n        selectOnFocus: false\n      });\n      const getLabel = label => ({\n        dom: {\n          tag: 'label',\n          classes: ['tox-label']\n        },\n        components: [text$2(providersBackstage.translate(label))]\n      });\n      const widthField = FormCoupledInputs.parts.field1(formGroup([\n        FormField.parts.label(getLabel('Width')),\n        getFieldPart(true)\n      ]));\n      const heightField = FormCoupledInputs.parts.field2(formGroup([\n        FormField.parts.label(getLabel('Height')),\n        getFieldPart(false)\n      ]));\n      return FormCoupledInputs.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-form__group']\n        },\n        components: [{\n            dom: {\n              tag: 'div',\n              classes: ['tox-form__controls-h-stack']\n            },\n            components: [\n              widthField,\n              heightField,\n              formGroup([\n                getLabel(nbsp),\n                pLock\n              ])\n            ]\n          }],\n        field1Name: 'width',\n        field2Name: 'height',\n        locked: true,\n        markers: { lockClass: 'tox-locked' },\n        onLockedChange: (current, other, _lock) => {\n          parseSize(Representing.getValue(current)).each(size => {\n            converter(size).each(newSize => {\n              Representing.setValue(other, formatSize(newSize));\n            });\n          });\n        },\n        coupledFieldBehaviours: derive$1([\n          Disabling.config({\n            disabled: () => !spec.enabled || providersBackstage.isDisabled(),\n            onDisabled: comp => {\n              FormCoupledInputs.getField1(comp).bind(FormField.getField).each(Disabling.disable);\n              FormCoupledInputs.getField2(comp).bind(FormField.getField).each(Disabling.disable);\n              FormCoupledInputs.getLock(comp).each(Disabling.disable);\n            },\n            onEnabled: comp => {\n              FormCoupledInputs.getField1(comp).bind(FormField.getField).each(Disabling.enable);\n              FormCoupledInputs.getField2(comp).bind(FormField.getField).each(Disabling.enable);\n              FormCoupledInputs.getLock(comp).each(Disabling.enable);\n            }\n          }),\n          receivingConfig(),\n          config('size-input-events2', [run$1(ratioEvent, (component, simulatedEvent) => {\n              const isField1 = simulatedEvent.event.isField1;\n              const optCurrent = isField1 ? FormCoupledInputs.getField1(component) : FormCoupledInputs.getField2(component);\n              const optOther = isField1 ? FormCoupledInputs.getField2(component) : FormCoupledInputs.getField1(component);\n              const value1 = optCurrent.map(Representing.getValue).getOr('');\n              const value2 = optOther.map(Representing.getValue).getOr('');\n              converter = makeRatioConverter(value1, value2);\n            })])\n        ])\n      });\n    };\n\n    const renderSlider = (spec, providerBackstage, initialData) => {\n      const labelPart = Slider.parts.label({\n        dom: {\n          tag: 'label',\n          classes: ['tox-label']\n        },\n        components: [text$2(providerBackstage.translate(spec.label))]\n      });\n      const spectrum = Slider.parts.spectrum({\n        dom: {\n          tag: 'div',\n          classes: ['tox-slider__rail'],\n          attributes: { role: 'presentation' }\n        }\n      });\n      const thumb = Slider.parts.thumb({\n        dom: {\n          tag: 'div',\n          classes: ['tox-slider__handle'],\n          attributes: { role: 'presentation' }\n        }\n      });\n      return Slider.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-slider'],\n          attributes: { role: 'presentation' }\n        },\n        model: {\n          mode: 'x',\n          minX: spec.min,\n          maxX: spec.max,\n          getInitialValue: constant$1(initialData.getOrThunk(() => (Math.abs(spec.max) - Math.abs(spec.min)) / 2))\n        },\n        components: [\n          labelPart,\n          spectrum,\n          thumb\n        ],\n        sliderBehaviours: derive$1([\n          ComposingConfigs.self(),\n          Focusing.config({})\n        ]),\n        onChoose: (component, thumb, value) => {\n          emitWith(component, formChangeEvent, {\n            name: spec.name,\n            value\n          });\n        }\n      });\n    };\n\n    const renderTable = (spec, providersBackstage) => {\n      const renderTh = text => ({\n        dom: {\n          tag: 'th',\n          innerHtml: providersBackstage.translate(text)\n        }\n      });\n      const renderHeader = header => ({\n        dom: { tag: 'thead' },\n        components: [{\n            dom: { tag: 'tr' },\n            components: map$2(header, renderTh)\n          }]\n      });\n      const renderTd = text => ({\n        dom: {\n          tag: 'td',\n          innerHtml: providersBackstage.translate(text)\n        }\n      });\n      const renderTr = row => ({\n        dom: { tag: 'tr' },\n        components: map$2(row, renderTd)\n      });\n      const renderRows = rows => ({\n        dom: { tag: 'tbody' },\n        components: map$2(rows, renderTr)\n      });\n      return {\n        dom: {\n          tag: 'table',\n          classes: ['tox-dialog__table']\n        },\n        components: [\n          renderHeader(spec.header),\n          renderRows(spec.cells)\n        ],\n        behaviours: derive$1([\n          Tabstopping.config({}),\n          Focusing.config({})\n        ])\n      };\n    };\n\n    const renderTextField = (spec, providersBackstage) => {\n      const pLabel = spec.label.map(label => renderLabel$3(label, providersBackstage));\n      const baseInputBehaviours = [\n        Disabling.config({ disabled: () => spec.disabled || providersBackstage.isDisabled() }),\n        receivingConfig(),\n        Keying.config({\n          mode: 'execution',\n          useEnter: spec.multiline !== true,\n          useControlEnter: spec.multiline === true,\n          execute: comp => {\n            emit(comp, formSubmitEvent);\n            return Optional.some(true);\n          }\n        }),\n        config('textfield-change', [\n          run$1(input(), (component, _) => {\n            emitWith(component, formChangeEvent, { name: spec.name });\n          }),\n          run$1(postPaste(), (component, _) => {\n            emitWith(component, formChangeEvent, { name: spec.name });\n          })\n        ]),\n        Tabstopping.config({})\n      ];\n      const validatingBehaviours = spec.validation.map(vl => Invalidating.config({\n        getRoot: input => {\n          return parentElement(input.element);\n        },\n        invalidClass: 'tox-invalid',\n        validator: {\n          validate: input => {\n            const v = Representing.getValue(input);\n            const result = vl.validator(v);\n            return Future.pure(result === true ? Result.value(v) : Result.error(result));\n          },\n          validateOnLoad: vl.validateOnLoad\n        }\n      })).toArray();\n      const placeholder = spec.placeholder.fold(constant$1({}), p => ({ placeholder: providersBackstage.translate(p) }));\n      const inputMode = spec.inputMode.fold(constant$1({}), mode => ({ inputmode: mode }));\n      const inputAttributes = {\n        ...placeholder,\n        ...inputMode\n      };\n      const pField = FormField.parts.field({\n        tag: spec.multiline === true ? 'textarea' : 'input',\n        ...spec.data.map(data => ({ data })).getOr({}),\n        inputAttributes,\n        inputClasses: [spec.classname],\n        inputBehaviours: derive$1(flatten([\n          baseInputBehaviours,\n          validatingBehaviours\n        ])),\n        selectOnFocus: false,\n        factory: Input\n      });\n      const pTextField = spec.multiline ? {\n        dom: {\n          tag: 'div',\n          classes: ['tox-textarea-wrap']\n        },\n        components: [pField]\n      } : pField;\n      const extraClasses = spec.flex ? ['tox-form__group--stretched'] : [];\n      const extraClasses2 = extraClasses.concat(spec.maximized ? ['tox-form-group--maximize'] : []);\n      const extraBehaviours = [\n        Disabling.config({\n          disabled: () => spec.disabled || providersBackstage.isDisabled(),\n          onDisabled: comp => {\n            FormField.getField(comp).each(Disabling.disable);\n          },\n          onEnabled: comp => {\n            FormField.getField(comp).each(Disabling.enable);\n          }\n        }),\n        receivingConfig()\n      ];\n      return renderFormFieldWith(pLabel, pTextField, extraClasses2, extraBehaviours);\n    };\n    const renderInput = (spec, providersBackstage, initialData) => renderTextField({\n      name: spec.name,\n      multiline: false,\n      label: spec.label,\n      inputMode: spec.inputMode,\n      placeholder: spec.placeholder,\n      flex: false,\n      disabled: !spec.enabled,\n      classname: 'tox-textfield',\n      validation: Optional.none(),\n      maximized: spec.maximized,\n      data: initialData\n    }, providersBackstage);\n    const renderTextarea = (spec, providersBackstage, initialData) => renderTextField({\n      name: spec.name,\n      multiline: true,\n      label: spec.label,\n      inputMode: Optional.none(),\n      placeholder: spec.placeholder,\n      flex: true,\n      disabled: !spec.enabled,\n      classname: 'tox-textarea',\n      validation: Optional.none(),\n      maximized: spec.maximized,\n      data: initialData\n    }, providersBackstage);\n\n    const getAnimationRoot = (component, slideConfig) => slideConfig.getAnimationRoot.fold(() => component.element, get => get(component));\n\n    const getDimensionProperty = slideConfig => slideConfig.dimension.property;\n    const getDimension = (slideConfig, elem) => slideConfig.dimension.getDimension(elem);\n    const disableTransitions = (component, slideConfig) => {\n      const root = getAnimationRoot(component, slideConfig);\n      remove$1(root, [\n        slideConfig.shrinkingClass,\n        slideConfig.growingClass\n      ]);\n    };\n    const setShrunk = (component, slideConfig) => {\n      remove$2(component.element, slideConfig.openClass);\n      add$2(component.element, slideConfig.closedClass);\n      set$8(component.element, getDimensionProperty(slideConfig), '0px');\n      reflow(component.element);\n    };\n    const setGrown = (component, slideConfig) => {\n      remove$2(component.element, slideConfig.closedClass);\n      add$2(component.element, slideConfig.openClass);\n      remove$6(component.element, getDimensionProperty(slideConfig));\n    };\n    const doImmediateShrink = (component, slideConfig, slideState, _calculatedSize) => {\n      slideState.setCollapsed();\n      set$8(component.element, getDimensionProperty(slideConfig), getDimension(slideConfig, component.element));\n      disableTransitions(component, slideConfig);\n      setShrunk(component, slideConfig);\n      slideConfig.onStartShrink(component);\n      slideConfig.onShrunk(component);\n    };\n    const doStartShrink = (component, slideConfig, slideState, calculatedSize) => {\n      const size = calculatedSize.getOrThunk(() => getDimension(slideConfig, component.element));\n      slideState.setCollapsed();\n      set$8(component.element, getDimensionProperty(slideConfig), size);\n      reflow(component.element);\n      const root = getAnimationRoot(component, slideConfig);\n      remove$2(root, slideConfig.growingClass);\n      add$2(root, slideConfig.shrinkingClass);\n      setShrunk(component, slideConfig);\n      slideConfig.onStartShrink(component);\n    };\n    const doStartSmartShrink = (component, slideConfig, slideState) => {\n      const size = getDimension(slideConfig, component.element);\n      const shrinker = size === '0px' ? doImmediateShrink : doStartShrink;\n      shrinker(component, slideConfig, slideState, Optional.some(size));\n    };\n    const doStartGrow = (component, slideConfig, slideState) => {\n      const root = getAnimationRoot(component, slideConfig);\n      const wasShrinking = has(root, slideConfig.shrinkingClass);\n      const beforeSize = getDimension(slideConfig, component.element);\n      setGrown(component, slideConfig);\n      const fullSize = getDimension(slideConfig, component.element);\n      const startPartialGrow = () => {\n        set$8(component.element, getDimensionProperty(slideConfig), beforeSize);\n        reflow(component.element);\n      };\n      const startCompleteGrow = () => {\n        setShrunk(component, slideConfig);\n      };\n      const setStartSize = wasShrinking ? startPartialGrow : startCompleteGrow;\n      setStartSize();\n      remove$2(root, slideConfig.shrinkingClass);\n      add$2(root, slideConfig.growingClass);\n      setGrown(component, slideConfig);\n      set$8(component.element, getDimensionProperty(slideConfig), fullSize);\n      slideState.setExpanded();\n      slideConfig.onStartGrow(component);\n    };\n    const refresh$4 = (component, slideConfig, slideState) => {\n      if (slideState.isExpanded()) {\n        remove$6(component.element, getDimensionProperty(slideConfig));\n        const fullSize = getDimension(slideConfig, component.element);\n        set$8(component.element, getDimensionProperty(slideConfig), fullSize);\n      }\n    };\n    const grow = (component, slideConfig, slideState) => {\n      if (!slideState.isExpanded()) {\n        doStartGrow(component, slideConfig, slideState);\n      }\n    };\n    const shrink = (component, slideConfig, slideState) => {\n      if (slideState.isExpanded()) {\n        doStartSmartShrink(component, slideConfig, slideState);\n      }\n    };\n    const immediateShrink = (component, slideConfig, slideState) => {\n      if (slideState.isExpanded()) {\n        doImmediateShrink(component, slideConfig, slideState);\n      }\n    };\n    const hasGrown = (component, slideConfig, slideState) => slideState.isExpanded();\n    const hasShrunk = (component, slideConfig, slideState) => slideState.isCollapsed();\n    const isGrowing = (component, slideConfig, _slideState) => {\n      const root = getAnimationRoot(component, slideConfig);\n      return has(root, slideConfig.growingClass) === true;\n    };\n    const isShrinking = (component, slideConfig, _slideState) => {\n      const root = getAnimationRoot(component, slideConfig);\n      return has(root, slideConfig.shrinkingClass) === true;\n    };\n    const isTransitioning = (component, slideConfig, slideState) => isGrowing(component, slideConfig) || isShrinking(component, slideConfig);\n    const toggleGrow = (component, slideConfig, slideState) => {\n      const f = slideState.isExpanded() ? doStartSmartShrink : doStartGrow;\n      f(component, slideConfig, slideState);\n    };\n    const immediateGrow = (component, slideConfig, slideState) => {\n      if (!slideState.isExpanded()) {\n        setGrown(component, slideConfig);\n        set$8(component.element, getDimensionProperty(slideConfig), getDimension(slideConfig, component.element));\n        disableTransitions(component, slideConfig);\n        slideState.setExpanded();\n        slideConfig.onStartGrow(component);\n        slideConfig.onGrown(component);\n      }\n    };\n\n    var SlidingApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        refresh: refresh$4,\n        grow: grow,\n        shrink: shrink,\n        immediateShrink: immediateShrink,\n        hasGrown: hasGrown,\n        hasShrunk: hasShrunk,\n        isGrowing: isGrowing,\n        isShrinking: isShrinking,\n        isTransitioning: isTransitioning,\n        toggleGrow: toggleGrow,\n        disableTransitions: disableTransitions,\n        immediateGrow: immediateGrow\n    });\n\n    const exhibit = (base, slideConfig, _slideState) => {\n      const expanded = slideConfig.expanded;\n      return expanded ? nu$7({\n        classes: [slideConfig.openClass],\n        styles: {}\n      }) : nu$7({\n        classes: [slideConfig.closedClass],\n        styles: wrap$1(slideConfig.dimension.property, '0px')\n      });\n    };\n    const events$6 = (slideConfig, slideState) => derive$2([runOnSource(transitionend(), (component, simulatedEvent) => {\n        const raw = simulatedEvent.event.raw;\n        if (raw.propertyName === slideConfig.dimension.property) {\n          disableTransitions(component, slideConfig);\n          if (slideState.isExpanded()) {\n            remove$6(component.element, slideConfig.dimension.property);\n          }\n          const notify = slideState.isExpanded() ? slideConfig.onGrown : slideConfig.onShrunk;\n          notify(component);\n        }\n      })]);\n\n    var ActiveSliding = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        exhibit: exhibit,\n        events: events$6\n    });\n\n    var SlidingSchema = [\n      required$1('closedClass'),\n      required$1('openClass'),\n      required$1('shrinkingClass'),\n      required$1('growingClass'),\n      option$3('getAnimationRoot'),\n      onHandler('onShrunk'),\n      onHandler('onStartShrink'),\n      onHandler('onGrown'),\n      onHandler('onStartGrow'),\n      defaulted('expanded', false),\n      requiredOf('dimension', choose$1('property', {\n        width: [\n          output$1('property', 'width'),\n          output$1('getDimension', elem => get$c(elem) + 'px')\n        ],\n        height: [\n          output$1('property', 'height'),\n          output$1('getDimension', elem => get$d(elem) + 'px')\n        ]\n      }))\n    ];\n\n    const init$9 = spec => {\n      const state = Cell(spec.expanded);\n      const readState = () => 'expanded: ' + state.get();\n      return nu$8({\n        isExpanded: () => state.get() === true,\n        isCollapsed: () => state.get() === false,\n        setCollapsed: curry(state.set, false),\n        setExpanded: curry(state.set, true),\n        readState\n      });\n    };\n\n    var SlidingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$9\n    });\n\n    const Sliding = create$4({\n      fields: SlidingSchema,\n      name: 'sliding',\n      active: ActiveSliding,\n      apis: SlidingApis,\n      state: SlidingState\n    });\n\n    const getMenuButtonApi = component => ({\n      isEnabled: () => !Disabling.isDisabled(component),\n      setEnabled: state => Disabling.set(component, !state),\n      setActive: state => {\n        const elm = component.element;\n        if (state) {\n          add$2(elm, 'tox-tbtn--enabled');\n          set$9(elm, 'aria-pressed', true);\n        } else {\n          remove$2(elm, 'tox-tbtn--enabled');\n          remove$7(elm, 'aria-pressed');\n        }\n      },\n      isActive: () => has(component.element, 'tox-tbtn--enabled'),\n      setText: text => {\n        emitWith(component, updateMenuText, { text });\n      },\n      setIcon: icon => emitWith(component, updateMenuIcon, { icon })\n    });\n    const renderMenuButton = (spec, prefix, backstage, role, tabstopping = true, btnName) => {\n      return renderCommonDropdown({\n        text: spec.text,\n        icon: spec.icon,\n        tooltip: spec.tooltip,\n        ariaLabel: spec.tooltip,\n        searchable: spec.search.isSome(),\n        role,\n        fetch: (dropdownComp, callback) => {\n          const fetchContext = { pattern: spec.search.isSome() ? getSearchPattern(dropdownComp) : '' };\n          spec.fetch(items => {\n            callback(build(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, {\n              isHorizontalMenu: false,\n              search: spec.search\n            }));\n          }, fetchContext, getMenuButtonApi(dropdownComp));\n        },\n        onSetup: spec.onSetup,\n        getApi: getMenuButtonApi,\n        columns: 1,\n        presets: 'normal',\n        classes: [],\n        dropdownBehaviours: [...tabstopping ? [Tabstopping.config({})] : []]\n      }, prefix, backstage.shared, btnName);\n    };\n    const getFetch = (items, getButton, backstage) => {\n      const getMenuItemAction = item => api => {\n        const newValue = !api.isActive();\n        api.setActive(newValue);\n        item.storage.set(newValue);\n        backstage.shared.getSink().each(sink => {\n          getButton().getOpt(sink).each(orig => {\n            focus$3(orig.element);\n            emitWith(orig, formActionEvent, {\n              name: item.name,\n              value: item.storage.get()\n            });\n          });\n        });\n      };\n      const getMenuItemSetup = item => api => {\n        api.setActive(item.storage.get());\n      };\n      return success => {\n        success(map$2(items, item => {\n          const text = item.text.fold(() => ({}), text => ({ text }));\n          return {\n            type: item.type,\n            active: false,\n            ...text,\n            onAction: getMenuItemAction(item),\n            onSetup: getMenuItemSetup(item)\n          };\n        }));\n      };\n    };\n\n    const renderLabel = text => ({\n      dom: {\n        tag: 'span',\n        classes: ['tox-tree__label'],\n        attributes: { 'aria-label': text }\n      },\n      components: [text$2(text)]\n    });\n    const leafLabelEventsId = generate$6('leaf-label-event-id');\n    const renderLeafLabel = ({leaf, onLeafAction, visible, treeId, selectedId, backstage}) => {\n      const internalMenuButton = leaf.menu.map(btn => renderMenuButton(btn, 'tox-mbtn', backstage, Optional.none(), visible));\n      const components = [renderLabel(leaf.title)];\n      internalMenuButton.each(btn => components.push(btn));\n      return Button.sketch({\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-tree--leaf__label',\n            'tox-trbtn'\n          ].concat(visible ? ['tox-tree--leaf__label--visible'] : [])\n        },\n        components,\n        role: 'treeitem',\n        action: button => {\n          onLeafAction(leaf.id);\n          button.getSystem().broadcastOn([`update-active-item-${ treeId }`], { value: leaf.id });\n        },\n        eventOrder: {\n          [keydown()]: [\n            leafLabelEventsId,\n            'keying'\n          ]\n        },\n        buttonBehaviours: derive$1([\n          ...visible ? [Tabstopping.config({})] : [],\n          Toggling.config({\n            toggleClass: 'tox-trbtn--enabled',\n            toggleOnExecute: false,\n            aria: { mode: 'selected' }\n          }),\n          Receiving.config({\n            channels: {\n              [`update-active-item-${ treeId }`]: {\n                onReceive: (comp, message) => {\n                  (message.value === leaf.id ? Toggling.on : Toggling.off)(comp);\n                }\n              }\n            }\n          }),\n          config(leafLabelEventsId, [\n            runOnAttached((comp, _se) => {\n              selectedId.each(id => {\n                const toggle = id === leaf.id ? Toggling.on : Toggling.off;\n                toggle(comp);\n              });\n            }),\n            run$1(keydown(), (comp, se) => {\n              const isLeftArrowKey = se.event.raw.code === 'ArrowLeft';\n              const isRightArrowKey = se.event.raw.code === 'ArrowRight';\n              if (isLeftArrowKey) {\n                ancestor(comp.element, '.tox-tree--directory').each(dirElement => {\n                  comp.getSystem().getByDom(dirElement).each(dirComp => {\n                    child(dirElement, '.tox-tree--directory__label').each(dirLabelElement => {\n                      dirComp.getSystem().getByDom(dirLabelElement).each(Focusing.focus);\n                    });\n                  });\n                });\n                se.stop();\n              } else if (isRightArrowKey) {\n                se.stop();\n              }\n            })\n          ])\n        ])\n      });\n    };\n    const renderIcon = (iconName, iconsProvider, behaviours) => render$3(iconName, {\n      tag: 'span',\n      classes: [\n        'tox-tree__icon-wrap',\n        'tox-icon'\n      ],\n      behaviours\n    }, iconsProvider);\n    const renderIconFromPack = (iconName, iconsProvider) => renderIcon(iconName, iconsProvider, []);\n    const directoryLabelEventsId = generate$6('directory-label-event-id');\n    const renderDirectoryLabel = ({directory, visible, noChildren, backstage}) => {\n      const internalMenuButton = directory.menu.map(btn => renderMenuButton(btn, 'tox-mbtn', backstage, Optional.none()));\n      const components = [\n        {\n          dom: {\n            tag: 'div',\n            classes: ['tox-chevron']\n          },\n          components: [renderIconFromPack('chevron-right', backstage.shared.providers.icons)]\n        },\n        renderLabel(directory.title)\n      ];\n      internalMenuButton.each(btn => {\n        components.push(btn);\n      });\n      const toggleExpandChildren = button => {\n        ancestor(button.element, '.tox-tree--directory').each(directoryEle => {\n          button.getSystem().getByDom(directoryEle).each(directoryComp => {\n            const willExpand = !Toggling.isOn(directoryComp);\n            Toggling.toggle(directoryComp);\n            emitWith(button, 'expand-tree-node', {\n              expanded: willExpand,\n              node: directory.id\n            });\n          });\n        });\n      };\n      return Button.sketch({\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-tree--directory__label',\n            'tox-trbtn'\n          ].concat(visible ? ['tox-tree--directory__label--visible'] : [])\n        },\n        components,\n        action: toggleExpandChildren,\n        eventOrder: {\n          [keydown()]: [\n            directoryLabelEventsId,\n            'keying'\n          ]\n        },\n        buttonBehaviours: derive$1([\n          ...visible ? [Tabstopping.config({})] : [],\n          config(directoryLabelEventsId, [run$1(keydown(), (comp, se) => {\n              const isRightArrowKey = se.event.raw.code === 'ArrowRight';\n              const isLeftArrowKey = se.event.raw.code === 'ArrowLeft';\n              if (isRightArrowKey && noChildren) {\n                se.stop();\n              }\n              if (isRightArrowKey || isLeftArrowKey) {\n                ancestor(comp.element, '.tox-tree--directory').each(directoryEle => {\n                  comp.getSystem().getByDom(directoryEle).each(directoryComp => {\n                    if (!Toggling.isOn(directoryComp) && isRightArrowKey || Toggling.isOn(directoryComp) && isLeftArrowKey) {\n                      toggleExpandChildren(comp);\n                      se.stop();\n                    } else if (isLeftArrowKey && !Toggling.isOn(directoryComp)) {\n                      ancestor(directoryComp.element, '.tox-tree--directory').each(parentDirElement => {\n                        child(parentDirElement, '.tox-tree--directory__label').each(parentDirLabelElement => {\n                          directoryComp.getSystem().getByDom(parentDirLabelElement).each(Focusing.focus);\n                        });\n                      });\n                      se.stop();\n                    }\n                  });\n                });\n              }\n            })])\n        ])\n      });\n    };\n    const renderDirectoryChildren = ({children, onLeafAction, visible, treeId, expandedIds, selectedId, backstage}) => {\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-tree--directory__children']\n        },\n        components: children.map(item => {\n          return item.type === 'leaf' ? renderLeafLabel({\n            leaf: item,\n            selectedId,\n            onLeafAction,\n            visible,\n            treeId,\n            backstage\n          }) : renderDirectory({\n            directory: item,\n            expandedIds,\n            selectedId,\n            onLeafAction,\n            labelTabstopping: visible,\n            treeId,\n            backstage\n          });\n        }),\n        behaviours: derive$1([\n          Sliding.config({\n            dimension: { property: 'height' },\n            closedClass: 'tox-tree--directory__children--closed',\n            openClass: 'tox-tree--directory__children--open',\n            growingClass: 'tox-tree--directory__children--growing',\n            shrinkingClass: 'tox-tree--directory__children--shrinking',\n            expanded: visible\n          }),\n          Replacing.config({})\n        ])\n      };\n    };\n    const directoryEventsId = generate$6('directory-event-id');\n    const renderDirectory = ({directory, onLeafAction, labelTabstopping, treeId, backstage, expandedIds, selectedId}) => {\n      const {children} = directory;\n      const expandedIdsCell = Cell(expandedIds);\n      const computedChildrenComponents = visible => children.map(item => {\n        return item.type === 'leaf' ? renderLeafLabel({\n          leaf: item,\n          selectedId,\n          onLeafAction,\n          visible,\n          treeId,\n          backstage\n        }) : renderDirectory({\n          directory: item,\n          expandedIds: expandedIdsCell.get(),\n          selectedId,\n          onLeafAction,\n          labelTabstopping: visible,\n          treeId,\n          backstage\n        });\n      });\n      const childrenVisible = expandedIds.includes(directory.id);\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-tree--directory'],\n          attributes: { role: 'treeitem' }\n        },\n        components: [\n          renderDirectoryLabel({\n            directory,\n            visible: labelTabstopping,\n            noChildren: directory.children.length === 0,\n            backstage\n          }),\n          renderDirectoryChildren({\n            children,\n            expandedIds,\n            selectedId,\n            onLeafAction,\n            visible: childrenVisible,\n            treeId,\n            backstage\n          })\n        ],\n        behaviours: derive$1([\n          config(directoryEventsId, [\n            runOnAttached((comp, _se) => {\n              Toggling.set(comp, childrenVisible);\n            }),\n            run$1('expand-tree-node', (_cmp, se) => {\n              const {expanded, node} = se.event;\n              expandedIdsCell.set(expanded ? [\n                ...expandedIdsCell.get(),\n                node\n              ] : expandedIdsCell.get().filter(id => id !== node));\n            })\n          ]),\n          Toggling.config({\n            ...directory.children.length > 0 ? { aria: { mode: 'expanded' } } : {},\n            toggleClass: 'tox-tree--directory--expanded',\n            onToggled: (comp, childrenVisible) => {\n              const childrenComp = comp.components()[1];\n              const newChildren = computedChildrenComponents(childrenVisible);\n              if (childrenVisible) {\n                Sliding.grow(childrenComp);\n              } else {\n                Sliding.shrink(childrenComp);\n              }\n              Replacing.set(childrenComp, newChildren);\n            }\n          })\n        ])\n      };\n    };\n    const treeEventsId = generate$6('tree-event-id');\n    const renderTree = (spec, backstage) => {\n      const onLeafAction = spec.onLeafAction.getOr(noop);\n      const onToggleExpand = spec.onToggleExpand.getOr(noop);\n      const defaultExpandedIds = spec.defaultExpandedIds;\n      const expandedIds = Cell(defaultExpandedIds);\n      const selectedIdCell = Cell(spec.defaultSelectedId);\n      const treeId = generate$6('tree-id');\n      const children = (selectedId, expandedIds) => spec.items.map(item => {\n        return item.type === 'leaf' ? renderLeafLabel({\n          leaf: item,\n          selectedId,\n          onLeafAction,\n          visible: true,\n          treeId,\n          backstage\n        }) : renderDirectory({\n          directory: item,\n          selectedId,\n          onLeafAction,\n          expandedIds,\n          labelTabstopping: true,\n          treeId,\n          backstage\n        });\n      });\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-tree'],\n          attributes: { role: 'tree' }\n        },\n        components: children(selectedIdCell.get(), expandedIds.get()),\n        behaviours: derive$1([\n          Keying.config({\n            mode: 'flow',\n            selector: '.tox-tree--leaf__label--visible, .tox-tree--directory__label--visible',\n            cycles: false\n          }),\n          config(treeEventsId, [run$1('expand-tree-node', (_cmp, se) => {\n              const {expanded, node} = se.event;\n              expandedIds.set(expanded ? [\n                ...expandedIds.get(),\n                node\n              ] : expandedIds.get().filter(id => id !== node));\n              onToggleExpand(expandedIds.get(), {\n                expanded,\n                node\n              });\n            })]),\n          Receiving.config({\n            channels: {\n              [`update-active-item-${ treeId }`]: {\n                onReceive: (comp, message) => {\n                  selectedIdCell.set(Optional.some(message.value));\n                  Replacing.set(comp, children(Optional.some(message.value), expandedIds.get()));\n                }\n              }\n            }\n          }),\n          Replacing.config({})\n        ])\n      };\n    };\n\n    const events$5 = (streamConfig, streamState) => {\n      const streams = streamConfig.stream.streams;\n      const processor = streams.setup(streamConfig, streamState);\n      return derive$2([\n        run$1(streamConfig.event, processor),\n        runOnDetached(() => streamState.cancel())\n      ].concat(streamConfig.cancelEvent.map(e => [run$1(e, () => streamState.cancel())]).getOr([])));\n    };\n\n    var ActiveStreaming = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$5\n    });\n\n    const throttle = _config => {\n      const state = Cell(null);\n      const readState = () => ({ timer: state.get() !== null ? 'set' : 'unset' });\n      const setTimer = t => {\n        state.set(t);\n      };\n      const cancel = () => {\n        const t = state.get();\n        if (t !== null) {\n          t.cancel();\n        }\n      };\n      return nu$8({\n        readState,\n        setTimer,\n        cancel\n      });\n    };\n    const init$8 = spec => spec.stream.streams.state(spec);\n\n    var StreamingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        throttle: throttle,\n        init: init$8\n    });\n\n    const setup$c = (streamInfo, streamState) => {\n      const sInfo = streamInfo.stream;\n      const throttler = last(streamInfo.onStream, sInfo.delay);\n      streamState.setTimer(throttler);\n      return (component, simulatedEvent) => {\n        throttler.throttle(component, simulatedEvent);\n        if (sInfo.stopEvent) {\n          simulatedEvent.stop();\n        }\n      };\n    };\n    var StreamingSchema = [\n      requiredOf('stream', choose$1('mode', {\n        throttle: [\n          required$1('delay'),\n          defaulted('stopEvent', true),\n          output$1('streams', {\n            setup: setup$c,\n            state: throttle\n          })\n        ]\n      })),\n      defaulted('event', 'input'),\n      option$3('cancelEvent'),\n      onStrictHandler('onStream')\n    ];\n\n    const Streaming = create$4({\n      fields: StreamingSchema,\n      name: 'streaming',\n      active: ActiveStreaming,\n      state: StreamingState\n    });\n\n    const setValueFromItem = (model, input, item) => {\n      const itemData = Representing.getValue(item);\n      Representing.setValue(input, itemData);\n      setCursorAtEnd(input);\n    };\n    const setSelectionOn = (input, f) => {\n      const el = input.element;\n      const value = get$6(el);\n      const node = el.dom;\n      if (get$f(el, 'type') !== 'number') {\n        f(node, value);\n      }\n    };\n    const setCursorAtEnd = input => {\n      setSelectionOn(input, (node, value) => node.setSelectionRange(value.length, value.length));\n    };\n    const setSelectionToEnd = (input, startOffset) => {\n      setSelectionOn(input, (node, value) => node.setSelectionRange(startOffset, value.length));\n    };\n    const attemptSelectOver = (model, input, item) => {\n      if (!model.selectsOver) {\n        return Optional.none();\n      } else {\n        const currentValue = Representing.getValue(input);\n        const inputDisplay = model.getDisplayText(currentValue);\n        const itemValue = Representing.getValue(item);\n        const itemDisplay = model.getDisplayText(itemValue);\n        return itemDisplay.indexOf(inputDisplay) === 0 ? Optional.some(() => {\n          setValueFromItem(model, input, item);\n          setSelectionToEnd(input, inputDisplay.length);\n        }) : Optional.none();\n      }\n    };\n\n    const itemExecute = constant$1('alloy.typeahead.itemexecute');\n\n    const make$3 = (detail, components, spec, externals) => {\n      const navigateList = (comp, simulatedEvent, highlighter) => {\n        detail.previewing.set(false);\n        const sandbox = Coupling.getCoupled(comp, 'sandbox');\n        if (Sandboxing.isOpen(sandbox)) {\n          Composing.getCurrent(sandbox).each(menu => {\n            Highlighting.getHighlighted(menu).fold(() => {\n              highlighter(menu);\n            }, () => {\n              dispatchEvent(sandbox, menu.element, 'keydown', simulatedEvent);\n            });\n          });\n        } else {\n          const onOpenSync = sandbox => {\n            Composing.getCurrent(sandbox).each(highlighter);\n          };\n          open(detail, mapFetch(comp), comp, sandbox, externals, onOpenSync, HighlightOnOpen.HighlightMenuAndItem).get(noop);\n        }\n      };\n      const focusBehaviours$1 = focusBehaviours(detail);\n      const mapFetch = comp => tdata => tdata.map(data => {\n        const menus = values(data.menus);\n        const items = bind$3(menus, menu => filter$2(menu.items, item => item.type === 'item'));\n        const repState = Representing.getState(comp);\n        repState.update(map$2(items, item => item.data));\n        return data;\n      });\n      const getActiveMenu = sandboxComp => Composing.getCurrent(sandboxComp);\n      const typeaheadCustomEvents = 'typeaheadevents';\n      const behaviours = [\n        Focusing.config({}),\n        Representing.config({\n          onSetValue: detail.onSetValue,\n          store: {\n            mode: 'dataset',\n            getDataKey: comp => get$6(comp.element),\n            getFallbackEntry: itemString => ({\n              value: itemString,\n              meta: {}\n            }),\n            setValue: (comp, data) => {\n              set$5(comp.element, detail.model.getDisplayText(data));\n            },\n            ...detail.initialData.map(d => wrap$1('initialValue', d)).getOr({})\n          }\n        }),\n        Streaming.config({\n          stream: {\n            mode: 'throttle',\n            delay: detail.responseTime,\n            stopEvent: false\n          },\n          onStream: (component, _simulatedEvent) => {\n            const sandbox = Coupling.getCoupled(component, 'sandbox');\n            const focusInInput = Focusing.isFocused(component);\n            if (focusInInput) {\n              if (get$6(component.element).length >= detail.minChars) {\n                const previousValue = getActiveMenu(sandbox).bind(activeMenu => Highlighting.getHighlighted(activeMenu).map(Representing.getValue));\n                detail.previewing.set(true);\n                const onOpenSync = _sandbox => {\n                  getActiveMenu(sandbox).each(activeMenu => {\n                    previousValue.fold(() => {\n                      if (detail.model.selectsOver) {\n                        Highlighting.highlightFirst(activeMenu);\n                      }\n                    }, pv => {\n                      Highlighting.highlightBy(activeMenu, item => {\n                        const itemData = Representing.getValue(item);\n                        return itemData.value === pv.value;\n                      });\n                      Highlighting.getHighlighted(activeMenu).orThunk(() => {\n                        Highlighting.highlightFirst(activeMenu);\n                        return Optional.none();\n                      });\n                    });\n                  });\n                };\n                open(detail, mapFetch(component), component, sandbox, externals, onOpenSync, HighlightOnOpen.HighlightJustMenu).get(noop);\n              }\n            }\n          },\n          cancelEvent: typeaheadCancel()\n        }),\n        Keying.config({\n          mode: 'special',\n          onDown: (comp, simulatedEvent) => {\n            navigateList(comp, simulatedEvent, Highlighting.highlightFirst);\n            return Optional.some(true);\n          },\n          onEscape: comp => {\n            const sandbox = Coupling.getCoupled(comp, 'sandbox');\n            if (Sandboxing.isOpen(sandbox)) {\n              Sandboxing.close(sandbox);\n              return Optional.some(true);\n            }\n            return Optional.none();\n          },\n          onUp: (comp, simulatedEvent) => {\n            navigateList(comp, simulatedEvent, Highlighting.highlightLast);\n            return Optional.some(true);\n          },\n          onEnter: comp => {\n            const sandbox = Coupling.getCoupled(comp, 'sandbox');\n            const sandboxIsOpen = Sandboxing.isOpen(sandbox);\n            if (sandboxIsOpen && !detail.previewing.get()) {\n              return getActiveMenu(sandbox).bind(activeMenu => Highlighting.getHighlighted(activeMenu)).map(item => {\n                emitWith(comp, itemExecute(), { item });\n                return true;\n              });\n            } else {\n              const currentValue = Representing.getValue(comp);\n              emit(comp, typeaheadCancel());\n              detail.onExecute(sandbox, comp, currentValue);\n              if (sandboxIsOpen) {\n                Sandboxing.close(sandbox);\n              }\n              return Optional.some(true);\n            }\n          }\n        }),\n        Toggling.config({\n          toggleClass: detail.markers.openClass,\n          aria: { mode: 'expanded' }\n        }),\n        Coupling.config({\n          others: {\n            sandbox: hotspot => {\n              return makeSandbox$1(detail, hotspot, {\n                onOpen: () => Toggling.on(hotspot),\n                onClose: () => {\n                  detail.lazyTypeaheadComp.get().each(input => remove$7(input.element, 'aria-activedescendant'));\n                  Toggling.off(hotspot);\n                }\n              });\n            }\n          }\n        }),\n        config(typeaheadCustomEvents, [\n          runOnAttached(typeaheadComp => {\n            detail.lazyTypeaheadComp.set(Optional.some(typeaheadComp));\n          }),\n          runOnDetached(_typeaheadComp => {\n            detail.lazyTypeaheadComp.set(Optional.none());\n          }),\n          runOnExecute$1(comp => {\n            const onOpenSync = noop;\n            togglePopup(detail, mapFetch(comp), comp, externals, onOpenSync, HighlightOnOpen.HighlightMenuAndItem).get(noop);\n          }),\n          run$1(itemExecute(), (comp, se) => {\n            const sandbox = Coupling.getCoupled(comp, 'sandbox');\n            setValueFromItem(detail.model, comp, se.event.item);\n            emit(comp, typeaheadCancel());\n            detail.onItemExecute(comp, sandbox, se.event.item, Representing.getValue(comp));\n            Sandboxing.close(sandbox);\n            setCursorAtEnd(comp);\n          })\n        ].concat(detail.dismissOnBlur ? [run$1(postBlur(), typeahead => {\n            const sandbox = Coupling.getCoupled(typeahead, 'sandbox');\n            if (search(sandbox.element).isNone()) {\n              Sandboxing.close(sandbox);\n            }\n          })] : []))\n      ];\n      const eventOrder = {\n        [detachedFromDom()]: [\n          Representing.name(),\n          Streaming.name(),\n          typeaheadCustomEvents\n        ],\n        ...detail.eventOrder\n      };\n      return {\n        uid: detail.uid,\n        dom: dom(deepMerge(detail, {\n          inputAttributes: {\n            'role': 'combobox',\n            'aria-autocomplete': 'list',\n            'aria-haspopup': 'true'\n          }\n        })),\n        behaviours: {\n          ...focusBehaviours$1,\n          ...augment(detail.typeaheadBehaviours, behaviours)\n        },\n        eventOrder\n      };\n    };\n\n    const schema$g = constant$1([\n      option$3('lazySink'),\n      required$1('fetch'),\n      defaulted('minChars', 5),\n      defaulted('responseTime', 1000),\n      onHandler('onOpen'),\n      defaulted('getHotspot', Optional.some),\n      defaulted('getAnchorOverrides', constant$1({})),\n      defaulted('layouts', Optional.none()),\n      defaulted('eventOrder', {}),\n      defaultedObjOf('model', {}, [\n        defaulted('getDisplayText', itemData => itemData.meta !== undefined && itemData.meta.text !== undefined ? itemData.meta.text : itemData.value),\n        defaulted('selectsOver', true),\n        defaulted('populateFromBrowse', true)\n      ]),\n      onHandler('onSetValue'),\n      onKeyboardHandler('onExecute'),\n      onHandler('onItemExecute'),\n      defaulted('inputClasses', []),\n      defaulted('inputAttributes', {}),\n      defaulted('inputStyles', {}),\n      defaulted('matchWidth', true),\n      defaulted('useMinWidth', false),\n      defaulted('dismissOnBlur', true),\n      markers$1(['openClass']),\n      option$3('initialData'),\n      field('typeaheadBehaviours', [\n        Focusing,\n        Representing,\n        Streaming,\n        Keying,\n        Toggling,\n        Coupling\n      ]),\n      customField('lazyTypeaheadComp', () => Cell(Optional.none)),\n      customField('previewing', () => Cell(true))\n    ].concat(schema$l()).concat(sandboxFields()));\n    const parts$b = constant$1([external({\n        schema: [tieredMenuMarkers()],\n        name: 'menu',\n        overrides: detail => {\n          return {\n            fakeFocus: true,\n            onHighlightItem: (_tmenu, menu, item) => {\n              if (!detail.previewing.get()) {\n                detail.lazyTypeaheadComp.get().each(input => {\n                  if (detail.model.populateFromBrowse) {\n                    setValueFromItem(detail.model, input, item);\n                  }\n                  getOpt(item.element, 'id').each(id => set$9(input.element, 'aria-activedescendant', id));\n                });\n              } else {\n                detail.lazyTypeaheadComp.get().each(input => {\n                  attemptSelectOver(detail.model, input, item).fold(() => {\n                    if (detail.model.selectsOver) {\n                      Highlighting.dehighlight(menu, item);\n                      detail.previewing.set(true);\n                    } else {\n                      detail.previewing.set(false);\n                    }\n                  }, selectOverTextInInput => {\n                    selectOverTextInInput();\n                    detail.previewing.set(false);\n                  });\n                });\n              }\n            },\n            onExecute: (_menu, item) => {\n              return detail.lazyTypeaheadComp.get().map(typeahead => {\n                emitWith(typeahead, itemExecute(), { item });\n                return true;\n              });\n            },\n            onHover: (menu, item) => {\n              detail.previewing.set(false);\n              detail.lazyTypeaheadComp.get().each(input => {\n                if (detail.model.populateFromBrowse) {\n                  setValueFromItem(detail.model, input, item);\n                }\n              });\n            }\n          };\n        }\n      })]);\n\n    const Typeahead = composite({\n      name: 'Typeahead',\n      configFields: schema$g(),\n      partFields: parts$b(),\n      factory: make$3\n    });\n\n    const wrap = delegate => {\n      const toCached = () => {\n        return wrap(delegate.toCached());\n      };\n      const bindFuture = f => {\n        return wrap(delegate.bind(resA => resA.fold(err => Future.pure(Result.error(err)), a => f(a))));\n      };\n      const bindResult = f => {\n        return wrap(delegate.map(resA => resA.bind(f)));\n      };\n      const mapResult = f => {\n        return wrap(delegate.map(resA => resA.map(f)));\n      };\n      const mapError = f => {\n        return wrap(delegate.map(resA => resA.mapError(f)));\n      };\n      const foldResult = (whenError, whenValue) => {\n        return delegate.map(res => res.fold(whenError, whenValue));\n      };\n      const withTimeout = (timeout, errorThunk) => {\n        return wrap(Future.nu(callback => {\n          let timedOut = false;\n          const timer = setTimeout(() => {\n            timedOut = true;\n            callback(Result.error(errorThunk()));\n          }, timeout);\n          delegate.get(result => {\n            if (!timedOut) {\n              clearTimeout(timer);\n              callback(result);\n            }\n          });\n        }));\n      };\n      return {\n        ...delegate,\n        toCached,\n        bindFuture,\n        bindResult,\n        mapResult,\n        mapError,\n        foldResult,\n        withTimeout\n      };\n    };\n    const nu$1 = worker => {\n      return wrap(Future.nu(worker));\n    };\n    const value = value => {\n      return wrap(Future.pure(Result.value(value)));\n    };\n    const error = error => {\n      return wrap(Future.pure(Result.error(error)));\n    };\n    const fromResult = result => {\n      return wrap(Future.pure(result));\n    };\n    const fromFuture = future => {\n      return wrap(future.map(Result.value));\n    };\n    const fromPromise = promise => {\n      return nu$1(completer => {\n        promise.then(value => {\n          completer(Result.value(value));\n        }, error => {\n          completer(Result.error(error));\n        });\n      });\n    };\n    const FutureResult = {\n      nu: nu$1,\n      wrap,\n      pure: value,\n      value,\n      error,\n      fromResult,\n      fromFuture,\n      fromPromise\n    };\n\n    const renderCommonSpec = (spec, actionOpt, extraBehaviours = [], dom, components, tooltip, providersBackstage) => {\n      const action = actionOpt.fold(() => ({}), action => ({ action }));\n      const common = {\n        buttonBehaviours: derive$1([\n          DisablingConfigs.button(() => !spec.enabled || providersBackstage.isDisabled()),\n          receivingConfig(),\n          Tabstopping.config({}),\n          ...tooltip.map(t => Tooltipping.config(providersBackstage.tooltips.getConfig({ tooltipText: providersBackstage.translate(t) }))).toArray(),\n          config('button press', [\n            preventDefault('click'),\n            preventDefault('mousedown')\n          ])\n        ].concat(extraBehaviours)),\n        eventOrder: {\n          click: [\n            'button press',\n            'alloy.base.behaviour'\n          ],\n          mousedown: [\n            'button press',\n            'alloy.base.behaviour'\n          ]\n        },\n        ...action\n      };\n      const domFinal = deepMerge(common, { dom });\n      return deepMerge(domFinal, { components });\n    };\n    const renderIconButtonSpec = (spec, action, providersBackstage, extraBehaviours = [], btnName) => {\n      const tooltipAttributes = spec.tooltip.map(tooltip => ({ 'aria-label': providersBackstage.translate(tooltip) })).getOr({});\n      const dom = {\n        tag: 'button',\n        classes: ['tox-tbtn'],\n        attributes: {\n          ...tooltipAttributes,\n          'data-mce-name': btnName\n        }\n      };\n      const icon = spec.icon.map(iconName => renderIconFromPack$1(iconName, providersBackstage.icons));\n      const components = componentRenderPipeline([icon]);\n      return renderCommonSpec(spec, action, extraBehaviours, dom, components, spec.tooltip, providersBackstage);\n    };\n    const calculateClassesFromButtonType = buttonType => {\n      switch (buttonType) {\n      case 'primary':\n        return ['tox-button'];\n      case 'toolbar':\n        return ['tox-tbtn'];\n      case 'secondary':\n      default:\n        return [\n          'tox-button',\n          'tox-button--secondary'\n        ];\n      }\n    };\n    const renderButtonSpec = (spec, action, providersBackstage, extraBehaviours = [], extraClasses = []) => {\n      const translatedText = providersBackstage.translate(spec.text);\n      const icon = spec.icon.map(iconName => renderIconFromPack$1(iconName, providersBackstage.icons));\n      const components = [icon.getOrThunk(() => text$2(translatedText))];\n      const buttonType = spec.buttonType.getOr(!spec.primary && !spec.borderless ? 'secondary' : 'primary');\n      const baseClasses = calculateClassesFromButtonType(buttonType);\n      const classes = [\n        ...baseClasses,\n        ...icon.isSome() ? ['tox-button--icon'] : [],\n        ...spec.borderless ? ['tox-button--naked'] : [],\n        ...extraClasses\n      ];\n      const dom = {\n        tag: 'button',\n        classes,\n        attributes: {\n          'aria-label': translatedText,\n          'data-mce-name': spec.text\n        }\n      };\n      const optTooltip = spec.icon.map(constant$1(translatedText));\n      return renderCommonSpec(spec, action, extraBehaviours, dom, components, optTooltip, providersBackstage);\n    };\n    const renderButton$1 = (spec, action, providersBackstage, extraBehaviours = [], extraClasses = []) => {\n      const buttonSpec = renderButtonSpec(spec, Optional.some(action), providersBackstage, extraBehaviours, extraClasses);\n      return Button.sketch(buttonSpec);\n    };\n    const getAction = (name, buttonType) => comp => {\n      if (buttonType === 'custom') {\n        emitWith(comp, formActionEvent, {\n          name,\n          value: {}\n        });\n      } else if (buttonType === 'submit') {\n        emit(comp, formSubmitEvent);\n      } else if (buttonType === 'cancel') {\n        emit(comp, formCancelEvent);\n      } else {\n        console.error('Unknown button type: ', buttonType);\n      }\n    };\n    const isMenuFooterButtonSpec = (spec, buttonType) => buttonType === 'menu';\n    const isNormalFooterButtonSpec = (spec, buttonType) => buttonType === 'custom' || buttonType === 'cancel' || buttonType === 'submit';\n    const isToggleButtonSpec = (spec, buttonType) => buttonType === 'togglebutton';\n    const renderToggleButton = (spec, providers, btnName) => {\n      var _a, _b;\n      const optMemIcon = spec.icon.map(memIcon => renderReplaceableIconFromPack(memIcon, providers.icons)).map(record);\n      const action = comp => {\n        emitWith(comp, formActionEvent, {\n          name: spec.name,\n          value: {\n            setIcon: newIcon => {\n              optMemIcon.map(memIcon => memIcon.getOpt(comp).each(displayIcon => {\n                Replacing.set(displayIcon, [renderReplaceableIconFromPack(newIcon, providers.icons)]);\n              }));\n            }\n          }\n        });\n      };\n      const buttonType = spec.buttonType.getOr(!spec.primary ? 'secondary' : 'primary');\n      const buttonSpec = {\n        ...spec,\n        name: (_a = spec.name) !== null && _a !== void 0 ? _a : '',\n        primary: buttonType === 'primary',\n        tooltip: spec.tooltip,\n        enabled: (_b = spec.enabled) !== null && _b !== void 0 ? _b : false,\n        borderless: false\n      };\n      const tooltipAttributes = buttonSpec.tooltip.map(tooltip => ({ 'aria-label': providers.translate(tooltip) })).getOr({});\n      const buttonTypeClasses = calculateClassesFromButtonType(buttonType !== null && buttonType !== void 0 ? buttonType : 'secondary');\n      const showIconAndText = spec.icon.isSome() && spec.text.isSome();\n      const dom = {\n        tag: 'button',\n        classes: [\n          ...buttonTypeClasses.concat(spec.icon.isSome() ? ['tox-button--icon'] : []),\n          ...spec.active ? ['tox-button--enabled'] : [],\n          ...showIconAndText ? ['tox-button--icon-and-text'] : []\n        ],\n        attributes: {\n          ...tooltipAttributes,\n          ...isNonNullable(btnName) ? { 'data-mce-name': btnName } : {}\n        }\n      };\n      const extraBehaviours = [];\n      const translatedText = providers.translate(spec.text.getOr(''));\n      const translatedTextComponed = text$2(translatedText);\n      const iconComp = componentRenderPipeline([optMemIcon.map(memIcon => memIcon.asSpec())]);\n      const components = [\n        ...iconComp,\n        ...spec.text.isSome() ? [translatedTextComponed] : []\n      ];\n      const iconButtonSpec = renderCommonSpec(buttonSpec, Optional.some(action), extraBehaviours, dom, components, spec.tooltip, providers);\n      return Button.sketch(iconButtonSpec);\n    };\n    const renderFooterButton = (spec, buttonType, backstage) => {\n      if (isMenuFooterButtonSpec(spec, buttonType)) {\n        const getButton = () => memButton;\n        const menuButtonSpec = spec;\n        const fixedSpec = {\n          ...spec,\n          type: 'menubutton',\n          search: Optional.none(),\n          onSetup: api => {\n            api.setEnabled(spec.enabled);\n            return noop;\n          },\n          fetch: getFetch(menuButtonSpec.items, getButton, backstage)\n        };\n        const memButton = record(renderMenuButton(fixedSpec, 'tox-tbtn', backstage, Optional.none(), true, spec.text.or(spec.tooltip).getOrUndefined()));\n        return memButton.asSpec();\n      } else if (isNormalFooterButtonSpec(spec, buttonType)) {\n        const action = getAction(spec.name, buttonType);\n        const buttonSpec = {\n          ...spec,\n          borderless: false\n        };\n        return renderButton$1(buttonSpec, action, backstage.shared.providers, []);\n      } else if (isToggleButtonSpec(spec, buttonType)) {\n        return renderToggleButton(spec, backstage.shared.providers, spec.text.or(spec.tooltip).getOrUndefined());\n      } else {\n        console.error('Unknown footer button type: ', buttonType);\n        throw new Error('Unknown footer button type');\n      }\n    };\n    const renderDialogButton = (spec, providersBackstage) => {\n      const action = getAction(spec.name, 'custom');\n      return renderFormField(Optional.none(), FormField.parts.field({\n        factory: Button,\n        ...renderButtonSpec(spec, Optional.some(action), providersBackstage, [\n          memory(''),\n          ComposingConfigs.self()\n        ])\n      }));\n    };\n\n    const separator$1 = { type: 'separator' };\n    const toMenuItem = target => ({\n      type: 'menuitem',\n      value: target.url,\n      text: target.title,\n      meta: { attach: target.attach },\n      onAction: noop\n    });\n    const staticMenuItem = (title, url) => ({\n      type: 'menuitem',\n      value: url,\n      text: title,\n      meta: { attach: undefined },\n      onAction: noop\n    });\n    const toMenuItems = targets => map$2(targets, toMenuItem);\n    const filterLinkTargets = (type, targets) => filter$2(targets, target => target.type === type);\n    const filteredTargets = (type, targets) => toMenuItems(filterLinkTargets(type, targets));\n    const headerTargets = linkInfo => filteredTargets('header', linkInfo.targets);\n    const anchorTargets = linkInfo => filteredTargets('anchor', linkInfo.targets);\n    const anchorTargetTop = linkInfo => Optional.from(linkInfo.anchorTop).map(url => staticMenuItem('<top>', url)).toArray();\n    const anchorTargetBottom = linkInfo => Optional.from(linkInfo.anchorBottom).map(url => staticMenuItem('<bottom>', url)).toArray();\n    const historyTargets = history => map$2(history, url => staticMenuItem(url, url));\n    const joinMenuLists = items => {\n      return foldl(items, (a, b) => {\n        const bothEmpty = a.length === 0 || b.length === 0;\n        return bothEmpty ? a.concat(b) : a.concat(separator$1, b);\n      }, []);\n    };\n    const filterByQuery = (term, menuItems) => {\n      const lowerCaseTerm = term.toLowerCase();\n      return filter$2(menuItems, item => {\n        var _a;\n        const text = item.meta !== undefined && item.meta.text !== undefined ? item.meta.text : item.text;\n        const value = (_a = item.value) !== null && _a !== void 0 ? _a : '';\n        return contains$1(text.toLowerCase(), lowerCaseTerm) || contains$1(value.toLowerCase(), lowerCaseTerm);\n      });\n    };\n\n    const getItems = (fileType, input, urlBackstage) => {\n      var _a, _b;\n      const urlInputValue = Representing.getValue(input);\n      const term = (_b = (_a = urlInputValue === null || urlInputValue === void 0 ? void 0 : urlInputValue.meta) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : urlInputValue.value;\n      const info = urlBackstage.getLinkInformation();\n      return info.fold(() => [], linkInfo => {\n        const history = filterByQuery(term, historyTargets(urlBackstage.getHistory(fileType)));\n        return fileType === 'file' ? joinMenuLists([\n          history,\n          filterByQuery(term, headerTargets(linkInfo)),\n          filterByQuery(term, flatten([\n            anchorTargetTop(linkInfo),\n            anchorTargets(linkInfo),\n            anchorTargetBottom(linkInfo)\n          ]))\n        ]) : history;\n      });\n    };\n    const errorId = generate$6('aria-invalid');\n    const renderUrlInput = (spec, backstage, urlBackstage, initialData) => {\n      const providersBackstage = backstage.shared.providers;\n      const updateHistory = component => {\n        const urlEntry = Representing.getValue(component);\n        urlBackstage.addToHistory(urlEntry.value, spec.filetype);\n      };\n      const typeaheadSpec = {\n        ...initialData.map(initialData => ({ initialData })).getOr({}),\n        dismissOnBlur: true,\n        inputClasses: ['tox-textfield'],\n        sandboxClasses: ['tox-dialog__popups'],\n        inputAttributes: {\n          'aria-errormessage': errorId,\n          'type': 'url'\n        },\n        minChars: 0,\n        responseTime: 0,\n        fetch: input => {\n          const items = getItems(spec.filetype, input, urlBackstage);\n          const tdata = build(items, ItemResponse$1.BUBBLE_TO_SANDBOX, backstage, {\n            isHorizontalMenu: false,\n            search: Optional.none()\n          });\n          return Future.pure(tdata);\n        },\n        getHotspot: comp => memUrlBox.getOpt(comp),\n        onSetValue: (comp, _newValue) => {\n          if (comp.hasConfigured(Invalidating)) {\n            Invalidating.run(comp).get(noop);\n          }\n        },\n        typeaheadBehaviours: derive$1([\n          ...urlBackstage.getValidationHandler().map(handler => Invalidating.config({\n            getRoot: comp => parentElement(comp.element),\n            invalidClass: 'tox-control-wrap--status-invalid',\n            notify: {\n              onInvalid: (comp, err) => {\n                memInvalidIcon.getOpt(comp).each(invalidComp => {\n                  set$9(invalidComp.element, 'title', providersBackstage.translate(err));\n                });\n              }\n            },\n            validator: {\n              validate: input => {\n                const urlEntry = Representing.getValue(input);\n                return FutureResult.nu(completer => {\n                  handler({\n                    type: spec.filetype,\n                    url: urlEntry.value\n                  }, validation => {\n                    if (validation.status === 'invalid') {\n                      const err = Result.error(validation.message);\n                      completer(err);\n                    } else {\n                      const val = Result.value(validation.message);\n                      completer(val);\n                    }\n                  });\n                });\n              },\n              validateOnLoad: false\n            }\n          })).toArray(),\n          Disabling.config({ disabled: () => !spec.enabled || providersBackstage.isDisabled() }),\n          Tabstopping.config({}),\n          config('urlinput-events', [\n            run$1(input(), comp => {\n              const currentValue = get$6(comp.element);\n              const trimmedValue = currentValue.trim();\n              if (trimmedValue !== currentValue) {\n                set$5(comp.element, trimmedValue);\n              }\n              if (spec.filetype === 'file') {\n                emitWith(comp, formChangeEvent, { name: spec.name });\n              }\n            }),\n            run$1(change(), comp => {\n              emitWith(comp, formChangeEvent, { name: spec.name });\n              updateHistory(comp);\n            }),\n            run$1(postPaste(), comp => {\n              emitWith(comp, formChangeEvent, { name: spec.name });\n              updateHistory(comp);\n            })\n          ])\n        ]),\n        eventOrder: {\n          [input()]: [\n            'streaming',\n            'urlinput-events',\n            'invalidating'\n          ]\n        },\n        model: {\n          getDisplayText: itemData => itemData.value,\n          selectsOver: false,\n          populateFromBrowse: false\n        },\n        markers: { openClass: 'tox-textfield--popup-open' },\n        lazySink: backstage.shared.getSink,\n        parts: { menu: part(false, 1, 'normal') },\n        onExecute: (_menu, component, _entry) => {\n          emitWith(component, formSubmitEvent, {});\n        },\n        onItemExecute: (typeahead, _sandbox, _item, _value) => {\n          updateHistory(typeahead);\n          emitWith(typeahead, formChangeEvent, { name: spec.name });\n        }\n      };\n      const pField = FormField.parts.field({\n        ...typeaheadSpec,\n        factory: Typeahead\n      });\n      const pLabel = spec.label.map(label => renderLabel$3(label, providersBackstage));\n      const makeIcon = (name, errId, icon = name, label = name) => render$3(icon, {\n        tag: 'div',\n        classes: [\n          'tox-icon',\n          'tox-control-wrap__status-icon-' + name\n        ],\n        attributes: {\n          'title': providersBackstage.translate(label),\n          'aria-live': 'polite',\n          ...errId.fold(() => ({}), id => ({ id }))\n        }\n      }, providersBackstage.icons);\n      const memInvalidIcon = record(makeIcon('invalid', Optional.some(errorId), 'warning'));\n      const memStatus = record({\n        dom: {\n          tag: 'div',\n          classes: ['tox-control-wrap__status-icon-wrap']\n        },\n        components: [memInvalidIcon.asSpec()]\n      });\n      const optUrlPicker = urlBackstage.getUrlPicker(spec.filetype);\n      const browseUrlEvent = generate$6('browser.url.event');\n      const memUrlBox = record({\n        dom: {\n          tag: 'div',\n          classes: ['tox-control-wrap']\n        },\n        components: [\n          pField,\n          memStatus.asSpec()\n        ],\n        behaviours: derive$1([Disabling.config({ disabled: () => !spec.enabled || providersBackstage.isDisabled() })])\n      });\n      const memUrlPickerButton = record(renderButton$1({\n        name: spec.name,\n        icon: Optional.some('browse'),\n        text: spec.picker_text.or(spec.label).getOr(''),\n        enabled: spec.enabled,\n        primary: false,\n        buttonType: Optional.none(),\n        borderless: true\n      }, component => emit(component, browseUrlEvent), providersBackstage, [], ['tox-browse-url']));\n      const controlHWrapper = () => ({\n        dom: {\n          tag: 'div',\n          classes: ['tox-form__controls-h-stack']\n        },\n        components: flatten([\n          [memUrlBox.asSpec()],\n          optUrlPicker.map(() => memUrlPickerButton.asSpec()).toArray()\n        ])\n      });\n      const openUrlPicker = comp => {\n        Composing.getCurrent(comp).each(field => {\n          const componentData = Representing.getValue(field);\n          const urlData = {\n            fieldname: spec.name,\n            ...componentData\n          };\n          optUrlPicker.each(picker => {\n            picker(urlData).get(chosenData => {\n              Representing.setValue(field, chosenData);\n              emitWith(comp, formChangeEvent, { name: spec.name });\n            });\n          });\n        });\n      };\n      return FormField.sketch({\n        dom: renderFormFieldDom(),\n        components: pLabel.toArray().concat([controlHWrapper()]),\n        fieldBehaviours: derive$1([\n          Disabling.config({\n            disabled: () => !spec.enabled || providersBackstage.isDisabled(),\n            onDisabled: comp => {\n              FormField.getField(comp).each(Disabling.disable);\n              memUrlPickerButton.getOpt(comp).each(Disabling.disable);\n            },\n            onEnabled: comp => {\n              FormField.getField(comp).each(Disabling.enable);\n              memUrlPickerButton.getOpt(comp).each(Disabling.enable);\n            }\n          }),\n          receivingConfig(),\n          config('url-input-events', [run$1(browseUrlEvent, openUrlPicker)])\n        ])\n      });\n    };\n\n    const renderAlertBanner = (spec, providersBackstage) => {\n      const icon = get$2(spec.icon, providersBackstage.icons);\n      return Container.sketch({\n        dom: {\n          tag: 'div',\n          attributes: { role: 'alert' },\n          classes: [\n            'tox-notification',\n            'tox-notification--in',\n            `tox-notification--${ spec.level }`\n          ]\n        },\n        components: [\n          {\n            dom: {\n              tag: 'div',\n              classes: ['tox-notification__icon'],\n              innerHtml: !spec.url ? icon : undefined\n            },\n            components: spec.url ? [Button.sketch({\n                dom: {\n                  tag: 'button',\n                  classes: [\n                    'tox-button',\n                    'tox-button--naked',\n                    'tox-button--icon'\n                  ],\n                  innerHtml: icon,\n                  attributes: { title: providersBackstage.translate(spec.iconTooltip) }\n                },\n                action: comp => emitWith(comp, formActionEvent, {\n                  name: 'alert-banner',\n                  value: spec.url\n                }),\n                buttonBehaviours: derive$1([addFocusableBehaviour()])\n              })] : undefined\n          },\n          {\n            dom: {\n              tag: 'div',\n              classes: ['tox-notification__body'],\n              innerHtml: providersBackstage.translate(spec.text)\n            }\n          }\n        ]\n      });\n    };\n\n    const set$1 = (element, status) => {\n      element.dom.checked = status;\n    };\n    const get$1 = element => element.dom.checked;\n\n    const renderCheckbox = (spec, providerBackstage, initialData) => {\n      const toggleCheckboxHandler = comp => {\n        comp.element.dom.click();\n        return Optional.some(true);\n      };\n      const pField = FormField.parts.field({\n        factory: { sketch: identity },\n        dom: {\n          tag: 'input',\n          classes: ['tox-checkbox__input'],\n          attributes: { type: 'checkbox' }\n        },\n        behaviours: derive$1([\n          ComposingConfigs.self(),\n          Disabling.config({\n            disabled: () => !spec.enabled || providerBackstage.isDisabled(),\n            onDisabled: component => {\n              parentElement(component.element).each(element => add$2(element, 'tox-checkbox--disabled'));\n            },\n            onEnabled: component => {\n              parentElement(component.element).each(element => remove$2(element, 'tox-checkbox--disabled'));\n            }\n          }),\n          Tabstopping.config({}),\n          Focusing.config({}),\n          withElement(initialData, get$1, set$1),\n          Keying.config({\n            mode: 'special',\n            onEnter: toggleCheckboxHandler,\n            onSpace: toggleCheckboxHandler,\n            stopSpaceKeyup: true\n          }),\n          config('checkbox-events', [run$1(change(), (component, _) => {\n              emitWith(component, formChangeEvent, { name: spec.name });\n            })])\n        ])\n      });\n      const pLabel = FormField.parts.label({\n        dom: {\n          tag: 'span',\n          classes: ['tox-checkbox__label']\n        },\n        components: [text$2(providerBackstage.translate(spec.label))],\n        behaviours: derive$1([Unselecting.config({})])\n      });\n      const makeIcon = className => {\n        const iconName = className === 'checked' ? 'selected' : 'unselected';\n        return render$3(iconName, {\n          tag: 'span',\n          classes: [\n            'tox-icon',\n            'tox-checkbox-icon__' + className\n          ]\n        }, providerBackstage.icons);\n      };\n      const memIcons = record({\n        dom: {\n          tag: 'div',\n          classes: ['tox-checkbox__icons']\n        },\n        components: [\n          makeIcon('checked'),\n          makeIcon('unchecked')\n        ]\n      });\n      return FormField.sketch({\n        dom: {\n          tag: 'label',\n          classes: ['tox-checkbox']\n        },\n        components: [\n          pField,\n          memIcons.asSpec(),\n          pLabel\n        ],\n        fieldBehaviours: derive$1([\n          Disabling.config({ disabled: () => !spec.enabled || providerBackstage.isDisabled() }),\n          receivingConfig()\n        ])\n      });\n    };\n\n    const renderHtmlPanel = (spec, providersBackstage) => {\n      if (spec.presets === 'presentation') {\n        return Container.sketch({\n          dom: {\n            tag: 'div',\n            classes: ['tox-form__group'],\n            innerHtml: spec.html\n          },\n          containerBehaviours: derive$1([Tooltipping.config({\n              ...providersBackstage.tooltips.getConfig({\n                tooltipText: '',\n                onShow: comp => {\n                  descendant(comp.element, '[data-mce-tooltip]:hover').orThunk(() => search(comp.element)).each(current => {\n                    getOpt(current, 'data-mce-tooltip').each(text => {\n                      Tooltipping.setComponents(comp, providersBackstage.tooltips.getComponents({ tooltipText: text }));\n                    });\n                  });\n                }\n              }),\n              mode: 'children-normal',\n              anchor: comp => ({\n                type: 'node',\n                node: descendant(comp.element, '[data-mce-tooltip]:hover').orThunk(() => search(comp.element).filter(current => getOpt(current, 'data-mce-tooltip').isSome())),\n                root: comp.element,\n                layouts: {\n                  onLtr: constant$1([\n                    south$2,\n                    north$2,\n                    southeast$2,\n                    northeast$2,\n                    southwest$2,\n                    northwest$2\n                  ]),\n                  onRtl: constant$1([\n                    south$2,\n                    north$2,\n                    southeast$2,\n                    northeast$2,\n                    southwest$2,\n                    northwest$2\n                  ])\n                },\n                bubble: nu$5(0, -2, {})\n              })\n            })])\n        });\n      } else {\n        return Container.sketch({\n          dom: {\n            tag: 'div',\n            classes: ['tox-form__group'],\n            innerHtml: spec.html,\n            attributes: { role: 'document' }\n          },\n          containerBehaviours: derive$1([\n            Tabstopping.config({}),\n            Focusing.config({})\n          ])\n        });\n      }\n    };\n\n    const make$2 = render => {\n      return (parts, spec, dialogData, backstage) => get$g(spec, 'name').fold(() => render(spec, backstage, Optional.none()), fieldName => parts.field(fieldName, render(spec, backstage, get$g(dialogData, fieldName))));\n    };\n    const makeIframe = render => (parts, spec, dialogData, backstage) => {\n      const iframeSpec = deepMerge(spec, { source: 'dynamic' });\n      return make$2(render)(parts, iframeSpec, dialogData, backstage);\n    };\n    const factories = {\n      bar: make$2((spec, backstage) => renderBar(spec, backstage.shared)),\n      collection: make$2((spec, backstage, data) => renderCollection(spec, backstage.shared.providers, data)),\n      alertbanner: make$2((spec, backstage) => renderAlertBanner(spec, backstage.shared.providers)),\n      input: make$2((spec, backstage, data) => renderInput(spec, backstage.shared.providers, data)),\n      textarea: make$2((spec, backstage, data) => renderTextarea(spec, backstage.shared.providers, data)),\n      label: make$2((spec, backstage) => renderLabel$2(spec, backstage.shared)),\n      iframe: makeIframe((spec, backstage, data) => renderIFrame(spec, backstage.shared.providers, data)),\n      button: make$2((spec, backstage) => renderDialogButton(spec, backstage.shared.providers)),\n      checkbox: make$2((spec, backstage, data) => renderCheckbox(spec, backstage.shared.providers, data)),\n      colorinput: make$2((spec, backstage, data) => renderColorInput(spec, backstage.shared, backstage.colorinput, data)),\n      colorpicker: make$2((spec, backstage, data) => renderColorPicker(spec, backstage.shared.providers, data)),\n      dropzone: make$2((spec, backstage, data) => renderDropZone(spec, backstage.shared.providers, data)),\n      grid: make$2((spec, backstage) => renderGrid(spec, backstage.shared)),\n      listbox: make$2((spec, backstage, data) => renderListBox(spec, backstage, data)),\n      selectbox: make$2((spec, backstage, data) => renderSelectBox(spec, backstage.shared.providers, data)),\n      sizeinput: make$2((spec, backstage) => renderSizeInput(spec, backstage.shared.providers)),\n      slider: make$2((spec, backstage, data) => renderSlider(spec, backstage.shared.providers, data)),\n      urlinput: make$2((spec, backstage, data) => renderUrlInput(spec, backstage, backstage.urlinput, data)),\n      customeditor: make$2(renderCustomEditor),\n      htmlpanel: make$2((spec, backstage) => renderHtmlPanel(spec, backstage.shared.providers)),\n      imagepreview: make$2((spec, _, data) => renderImagePreview(spec, data)),\n      table: make$2((spec, backstage) => renderTable(spec, backstage.shared.providers)),\n      tree: make$2((spec, backstage) => renderTree(spec, backstage)),\n      panel: make$2((spec, backstage) => renderPanel(spec, backstage))\n    };\n    const noFormParts = {\n      field: (_name, spec) => spec,\n      record: constant$1([])\n    };\n    const interpretInForm = (parts, spec, dialogData, oldBackstage) => {\n      const newBackstage = deepMerge(oldBackstage, { shared: { interpreter: childSpec => interpretParts(parts, childSpec, dialogData, newBackstage) } });\n      return interpretParts(parts, spec, dialogData, newBackstage);\n    };\n    const interpretParts = (parts, spec, dialogData, backstage) => get$g(factories, spec.type).fold(() => {\n      console.error(`Unknown factory type \"${ spec.type }\", defaulting to container: `, spec);\n      return spec;\n    }, factory => factory(parts, spec, dialogData, backstage));\n    const interpretWithoutForm = (spec, dialogData, backstage) => interpretParts(noFormParts, spec, dialogData, backstage);\n\n    const labelPrefix = 'layout-inset';\n    const westEdgeX = anchor => anchor.x;\n    const middleX = (anchor, element) => anchor.x + anchor.width / 2 - element.width / 2;\n    const eastEdgeX = (anchor, element) => anchor.x + anchor.width - element.width;\n    const northY = anchor => anchor.y;\n    const southY = (anchor, element) => anchor.y + anchor.height - element.height;\n    const centreY = (anchor, element) => anchor.y + anchor.height / 2 - element.height / 2;\n    const southwest = (anchor, element, bubbles) => nu$6(eastEdgeX(anchor, element), southY(anchor, element), bubbles.insetSouthwest(), northwest$3(), 'southwest', boundsRestriction(anchor, {\n      right: 0,\n      bottom: 3\n    }), labelPrefix);\n    const southeast = (anchor, element, bubbles) => nu$6(westEdgeX(anchor), southY(anchor, element), bubbles.insetSoutheast(), northeast$3(), 'southeast', boundsRestriction(anchor, {\n      left: 1,\n      bottom: 3\n    }), labelPrefix);\n    const northwest = (anchor, element, bubbles) => nu$6(eastEdgeX(anchor, element), northY(anchor), bubbles.insetNorthwest(), southwest$3(), 'northwest', boundsRestriction(anchor, {\n      right: 0,\n      top: 2\n    }), labelPrefix);\n    const northeast = (anchor, element, bubbles) => nu$6(westEdgeX(anchor), northY(anchor), bubbles.insetNortheast(), southeast$3(), 'northeast', boundsRestriction(anchor, {\n      left: 1,\n      top: 2\n    }), labelPrefix);\n    const north = (anchor, element, bubbles) => nu$6(middleX(anchor, element), northY(anchor), bubbles.insetNorth(), south$3(), 'north', boundsRestriction(anchor, { top: 2 }), labelPrefix);\n    const south = (anchor, element, bubbles) => nu$6(middleX(anchor, element), southY(anchor, element), bubbles.insetSouth(), north$3(), 'south', boundsRestriction(anchor, { bottom: 3 }), labelPrefix);\n    const east = (anchor, element, bubbles) => nu$6(eastEdgeX(anchor, element), centreY(anchor, element), bubbles.insetEast(), west$3(), 'east', boundsRestriction(anchor, { right: 0 }), labelPrefix);\n    const west = (anchor, element, bubbles) => nu$6(westEdgeX(anchor), centreY(anchor, element), bubbles.insetWest(), east$3(), 'west', boundsRestriction(anchor, { left: 1 }), labelPrefix);\n    const lookupPreserveLayout = lastPlacement => {\n      switch (lastPlacement) {\n      case 'north':\n        return north;\n      case 'northeast':\n        return northeast;\n      case 'northwest':\n        return northwest;\n      case 'south':\n        return south;\n      case 'southeast':\n        return southeast;\n      case 'southwest':\n        return southwest;\n      case 'east':\n        return east;\n      case 'west':\n        return west;\n      }\n    };\n    const preserve = (anchor, element, bubbles, placee, bounds) => {\n      const layout = getPlacement(placee).map(lookupPreserveLayout).getOr(north);\n      return layout(anchor, element, bubbles, placee, bounds);\n    };\n    const lookupFlippedLayout = lastPlacement => {\n      switch (lastPlacement) {\n      case 'north':\n        return south;\n      case 'northeast':\n        return southeast;\n      case 'northwest':\n        return southwest;\n      case 'south':\n        return north;\n      case 'southeast':\n        return northeast;\n      case 'southwest':\n        return northwest;\n      case 'east':\n        return west;\n      case 'west':\n        return east;\n      }\n    };\n    const flip = (anchor, element, bubbles, placee, bounds) => {\n      const layout = getPlacement(placee).map(lookupFlippedLayout).getOr(north);\n      return layout(anchor, element, bubbles, placee, bounds);\n    };\n\n    const bubbleAlignments$2 = {\n      valignCentre: [],\n      alignCentre: [],\n      alignLeft: [],\n      alignRight: [],\n      right: [],\n      left: [],\n      bottom: [],\n      top: []\n    };\n    const getInlineDialogAnchor = (contentAreaElement, lazyAnchorbar, lazyUseEditableAreaAnchor) => {\n      const bubbleSize = 12;\n      const overrides = { maxHeightFunction: expandable$1() };\n      const editableAreaAnchor = () => ({\n        type: 'node',\n        root: getContentContainer(getRootNode(contentAreaElement())),\n        node: Optional.from(contentAreaElement()),\n        bubble: nu$5(bubbleSize, bubbleSize, bubbleAlignments$2),\n        layouts: {\n          onRtl: () => [northeast],\n          onLtr: () => [northwest]\n        },\n        overrides\n      });\n      const standardAnchor = () => ({\n        type: 'hotspot',\n        hotspot: lazyAnchorbar(),\n        bubble: nu$5(-bubbleSize, bubbleSize, bubbleAlignments$2),\n        layouts: {\n          onRtl: () => [\n            southeast$2,\n            southwest$2,\n            south$2\n          ],\n          onLtr: () => [\n            southwest$2,\n            southeast$2,\n            south$2\n          ]\n        },\n        overrides\n      });\n      return () => lazyUseEditableAreaAnchor() ? editableAreaAnchor() : standardAnchor();\n    };\n    const getInlineBottomDialogAnchor = (inline, contentAreaElement, lazyBottomAnchorBar, lazyUseEditableAreaAnchor) => {\n      const bubbleSize = 12;\n      const overrides = { maxHeightFunction: expandable$1() };\n      const editableAreaAnchor = () => ({\n        type: 'node',\n        root: getContentContainer(getRootNode(contentAreaElement())),\n        node: Optional.from(contentAreaElement()),\n        bubble: nu$5(bubbleSize, bubbleSize, bubbleAlignments$2),\n        layouts: {\n          onRtl: () => [north],\n          onLtr: () => [north]\n        },\n        overrides\n      });\n      const standardAnchor = () => inline ? {\n        type: 'node',\n        root: getContentContainer(getRootNode(contentAreaElement())),\n        node: Optional.from(contentAreaElement()),\n        bubble: nu$5(0, -getOuter$2(contentAreaElement()), bubbleAlignments$2),\n        layouts: {\n          onRtl: () => [north$2],\n          onLtr: () => [north$2]\n        },\n        overrides\n      } : {\n        type: 'hotspot',\n        hotspot: lazyBottomAnchorBar(),\n        bubble: nu$5(0, 0, bubbleAlignments$2),\n        layouts: {\n          onRtl: () => [north$2],\n          onLtr: () => [north$2]\n        },\n        overrides\n      };\n      return () => lazyUseEditableAreaAnchor() ? editableAreaAnchor() : standardAnchor();\n    };\n    const getBannerAnchor = (contentAreaElement, lazyAnchorbar, lazyUseEditableAreaAnchor) => {\n      const editableAreaAnchor = () => ({\n        type: 'node',\n        root: getContentContainer(getRootNode(contentAreaElement())),\n        node: Optional.from(contentAreaElement()),\n        layouts: {\n          onRtl: () => [north],\n          onLtr: () => [north]\n        }\n      });\n      const standardAnchor = () => ({\n        type: 'hotspot',\n        hotspot: lazyAnchorbar(),\n        layouts: {\n          onRtl: () => [south$2],\n          onLtr: () => [south$2]\n        }\n      });\n      return () => lazyUseEditableAreaAnchor() ? editableAreaAnchor() : standardAnchor();\n    };\n    const getCursorAnchor = (editor, bodyElement) => () => ({\n      type: 'selection',\n      root: bodyElement(),\n      getSelection: () => {\n        const rng = editor.selection.getRng();\n        const selectedCells = editor.model.table.getSelectedCells();\n        if (selectedCells.length > 1) {\n          const firstCell = selectedCells[0];\n          const lastCell = selectedCells[selectedCells.length - 1];\n          const selectionTableCellRange = {\n            firstCell: SugarElement.fromDom(firstCell),\n            lastCell: SugarElement.fromDom(lastCell)\n          };\n          return Optional.some(selectionTableCellRange);\n        }\n        return Optional.some(SimSelection.range(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset));\n      }\n    });\n    const getNodeAnchor$1 = bodyElement => element => ({\n      type: 'node',\n      root: bodyElement(),\n      node: element\n    });\n    const getAnchors = (editor, lazyAnchorbar, lazyBottomAnchorBar, isToolbarTop) => {\n      const useFixedToolbarContainer = useFixedContainer(editor);\n      const bodyElement = () => SugarElement.fromDom(editor.getBody());\n      const contentAreaElement = () => SugarElement.fromDom(editor.getContentAreaContainer());\n      const lazyUseEditableAreaAnchor = () => useFixedToolbarContainer || !isToolbarTop();\n      return {\n        inlineDialog: getInlineDialogAnchor(contentAreaElement, lazyAnchorbar, lazyUseEditableAreaAnchor),\n        inlineBottomDialog: getInlineBottomDialogAnchor(editor.inline, contentAreaElement, lazyBottomAnchorBar, lazyUseEditableAreaAnchor),\n        banner: getBannerAnchor(contentAreaElement, lazyAnchorbar, lazyUseEditableAreaAnchor),\n        cursor: getCursorAnchor(editor, bodyElement),\n        node: getNodeAnchor$1(bodyElement)\n      };\n    };\n\n    const colorPicker = editor => (callback, value) => {\n      const dialog = colorPickerDialog(editor);\n      dialog(callback, value);\n    };\n    const hasCustomColors = editor => () => hasCustomColors$1(editor);\n    const getColors = editor => id => getColors$2(editor, id);\n    const getColorCols = editor => id => getColorCols$1(editor, id);\n    const ColorInputBackstage = editor => ({\n      colorPicker: colorPicker(editor),\n      hasCustomColors: hasCustomColors(editor),\n      getColors: getColors(editor),\n      getColorCols: getColorCols(editor)\n    });\n\n    const isDraggableModal = editor => () => isDraggableModal$1(editor);\n    const DialogBackstage = editor => ({ isDraggableModal: isDraggableModal(editor) });\n\n    const HeaderBackstage = editor => {\n      const mode = Cell(isToolbarLocationBottom(editor) ? 'bottom' : 'top');\n      return {\n        isPositionedAtTop: () => mode.get() === 'top',\n        getDockingMode: mode.get,\n        setDockingMode: mode.set\n      };\n    };\n\n    const isNestedFormat = format => hasNonNullableKey(format, 'items');\n    const isFormatReference = format => hasNonNullableKey(format, 'format');\n    const defaultStyleFormats = [\n      {\n        title: 'Headings',\n        items: [\n          {\n            title: 'Heading 1',\n            format: 'h1'\n          },\n          {\n            title: 'Heading 2',\n            format: 'h2'\n          },\n          {\n            title: 'Heading 3',\n            format: 'h3'\n          },\n          {\n            title: 'Heading 4',\n            format: 'h4'\n          },\n          {\n            title: 'Heading 5',\n            format: 'h5'\n          },\n          {\n            title: 'Heading 6',\n            format: 'h6'\n          }\n        ]\n      },\n      {\n        title: 'Inline',\n        items: [\n          {\n            title: 'Bold',\n            format: 'bold'\n          },\n          {\n            title: 'Italic',\n            format: 'italic'\n          },\n          {\n            title: 'Underline',\n            format: 'underline'\n          },\n          {\n            title: 'Strikethrough',\n            format: 'strikethrough'\n          },\n          {\n            title: 'Superscript',\n            format: 'superscript'\n          },\n          {\n            title: 'Subscript',\n            format: 'subscript'\n          },\n          {\n            title: 'Code',\n            format: 'code'\n          }\n        ]\n      },\n      {\n        title: 'Blocks',\n        items: [\n          {\n            title: 'Paragraph',\n            format: 'p'\n          },\n          {\n            title: 'Blockquote',\n            format: 'blockquote'\n          },\n          {\n            title: 'Div',\n            format: 'div'\n          },\n          {\n            title: 'Pre',\n            format: 'pre'\n          }\n        ]\n      },\n      {\n        title: 'Align',\n        items: [\n          {\n            title: 'Left',\n            format: 'alignleft'\n          },\n          {\n            title: 'Center',\n            format: 'aligncenter'\n          },\n          {\n            title: 'Right',\n            format: 'alignright'\n          },\n          {\n            title: 'Justify',\n            format: 'alignjustify'\n          }\n        ]\n      }\n    ];\n    const isNestedFormats = format => has$2(format, 'items');\n    const isBlockFormat = format => has$2(format, 'block');\n    const isInlineFormat = format => has$2(format, 'inline');\n    const isSelectorFormat = format => has$2(format, 'selector');\n    const mapFormats = userFormats => foldl(userFormats, (acc, fmt) => {\n      if (isNestedFormats(fmt)) {\n        const result = mapFormats(fmt.items);\n        return {\n          customFormats: acc.customFormats.concat(result.customFormats),\n          formats: acc.formats.concat([{\n              title: fmt.title,\n              items: result.formats\n            }])\n        };\n      } else if (isInlineFormat(fmt) || isBlockFormat(fmt) || isSelectorFormat(fmt)) {\n        const formatName = isString(fmt.name) ? fmt.name : fmt.title.toLowerCase();\n        const formatNameWithPrefix = `custom-${ formatName }`;\n        return {\n          customFormats: acc.customFormats.concat([{\n              name: formatNameWithPrefix,\n              format: fmt\n            }]),\n          formats: acc.formats.concat([{\n              title: fmt.title,\n              format: formatNameWithPrefix,\n              icon: fmt.icon\n            }])\n        };\n      } else {\n        return {\n          ...acc,\n          formats: acc.formats.concat(fmt)\n        };\n      }\n    }, {\n      customFormats: [],\n      formats: []\n    });\n    const registerCustomFormats = (editor, userFormats) => {\n      const result = mapFormats(userFormats);\n      const registerFormats = customFormats => {\n        each$1(customFormats, fmt => {\n          if (!editor.formatter.has(fmt.name)) {\n            editor.formatter.register(fmt.name, fmt.format);\n          }\n        });\n      };\n      if (editor.formatter) {\n        registerFormats(result.customFormats);\n      } else {\n        editor.on('init', () => {\n          registerFormats(result.customFormats);\n        });\n      }\n      return result.formats;\n    };\n    const getStyleFormats = editor => getUserStyleFormats(editor).map(userFormats => {\n      const registeredUserFormats = registerCustomFormats(editor, userFormats);\n      return shouldMergeStyleFormats(editor) ? defaultStyleFormats.concat(registeredUserFormats) : registeredUserFormats;\n    }).getOr(defaultStyleFormats);\n\n    const isSeparator$1 = format => {\n      const keys$1 = keys(format);\n      return keys$1.length === 1 && contains$2(keys$1, 'title');\n    };\n    const processBasic = (item, isSelectedFor, getPreviewFor) => ({\n      ...item,\n      type: 'formatter',\n      isSelected: isSelectedFor(item.format),\n      getStylePreview: getPreviewFor(item.format)\n    });\n    const register$a = (editor, formats, isSelectedFor, getPreviewFor) => {\n      const enrichSupported = item => processBasic(item, isSelectedFor, getPreviewFor);\n      const enrichMenu = item => {\n        const newItems = doEnrich(item.items);\n        return {\n          ...item,\n          type: 'submenu',\n          getStyleItems: constant$1(newItems)\n        };\n      };\n      const enrichCustom = item => {\n        const formatName = isString(item.name) ? item.name : generate$6(item.title);\n        const formatNameWithPrefix = `custom-${ formatName }`;\n        const newItem = {\n          ...item,\n          type: 'formatter',\n          format: formatNameWithPrefix,\n          isSelected: isSelectedFor(formatNameWithPrefix),\n          getStylePreview: getPreviewFor(formatNameWithPrefix)\n        };\n        editor.formatter.register(formatName, newItem);\n        return newItem;\n      };\n      const doEnrich = items => map$2(items, item => {\n        if (isNestedFormat(item)) {\n          return enrichMenu(item);\n        } else if (isFormatReference(item)) {\n          return enrichSupported(item);\n        } else if (isSeparator$1(item)) {\n          return {\n            ...item,\n            type: 'separator'\n          };\n        } else {\n          return enrichCustom(item);\n        }\n      });\n      return doEnrich(formats);\n    };\n\n    const init$7 = editor => {\n      const isSelectedFor = format => () => editor.formatter.match(format);\n      const getPreviewFor = format => () => {\n        const fmt = editor.formatter.get(format);\n        return fmt !== undefined ? Optional.some({\n          tag: fmt.length > 0 ? fmt[0].inline || fmt[0].block || 'div' : 'div',\n          styles: editor.dom.parseStyle(editor.formatter.getCssText(format))\n        }) : Optional.none();\n      };\n      const settingsFormats = Cell([]);\n      const eventsFormats = Cell([]);\n      const replaceSettings = Cell(false);\n      editor.on('PreInit', _e => {\n        const formats = getStyleFormats(editor);\n        const enriched = register$a(editor, formats, isSelectedFor, getPreviewFor);\n        settingsFormats.set(enriched);\n      });\n      editor.on('addStyleModifications', e => {\n        const modifications = register$a(editor, e.items, isSelectedFor, getPreviewFor);\n        eventsFormats.set(modifications);\n        replaceSettings.set(e.replace);\n      });\n      const getData = () => {\n        const fromSettings = replaceSettings.get() ? [] : settingsFormats.get();\n        const fromEvents = eventsFormats.get();\n        return fromSettings.concat(fromEvents);\n      };\n      return { getData };\n    };\n\n    const TooltipsBackstage = getSink => {\n      const tooltipDelay = 300;\n      const intervalDelay = tooltipDelay * 0.2;\n      let numActiveTooltips = 0;\n      const alreadyShowingTooltips = () => numActiveTooltips > 0;\n      const getComponents = spec => {\n        return [{\n            dom: {\n              tag: 'div',\n              classes: ['tox-tooltip__body']\n            },\n            components: [text$2(spec.tooltipText)]\n          }];\n      };\n      const getConfig = spec => {\n        return {\n          delayForShow: () => alreadyShowingTooltips() ? intervalDelay : tooltipDelay,\n          delayForHide: constant$1(tooltipDelay),\n          exclusive: true,\n          lazySink: getSink,\n          tooltipDom: {\n            tag: 'div',\n            classes: [\n              'tox-tooltip',\n              'tox-tooltip--up'\n            ]\n          },\n          tooltipComponents: getComponents(spec),\n          onShow: (comp, tooltip) => {\n            numActiveTooltips++;\n            if (spec.onShow) {\n              spec.onShow(comp, tooltip);\n            }\n          },\n          onHide: () => {\n            numActiveTooltips--;\n          }\n        };\n      };\n      return {\n        getConfig,\n        getComponents\n      };\n    };\n\n    const isElement = node => isNonNullable(node) && node.nodeType === 1;\n    const trim = global$1.trim;\n    const hasContentEditableState = value => {\n      return node => {\n        if (isElement(node)) {\n          if (node.contentEditable === value) {\n            return true;\n          }\n          if (node.getAttribute('data-mce-contenteditable') === value) {\n            return true;\n          }\n        }\n        return false;\n      };\n    };\n    const isContentEditableTrue = hasContentEditableState('true');\n    const isContentEditableFalse = hasContentEditableState('false');\n    const create = (type, title, url, level, attach) => ({\n      type,\n      title,\n      url,\n      level,\n      attach\n    });\n    const isChildOfContentEditableTrue = node => {\n      let tempNode = node;\n      while (tempNode = tempNode.parentNode) {\n        const value = tempNode.contentEditable;\n        if (value && value !== 'inherit') {\n          return isContentEditableTrue(tempNode);\n        }\n      }\n      return false;\n    };\n    const select = (selector, root) => {\n      return map$2(descendants(SugarElement.fromDom(root), selector), element => {\n        return element.dom;\n      });\n    };\n    const getElementText = elm => {\n      return elm.innerText || elm.textContent;\n    };\n    const getOrGenerateId = elm => {\n      return elm.id ? elm.id : generate$6('h');\n    };\n    const isAnchor = elm => {\n      return elm && elm.nodeName === 'A' && (elm.id || elm.name) !== undefined;\n    };\n    const isValidAnchor = elm => {\n      return isAnchor(elm) && isEditable(elm);\n    };\n    const isHeader = elm => {\n      return elm && /^(H[1-6])$/.test(elm.nodeName);\n    };\n    const isEditable = elm => {\n      return isChildOfContentEditableTrue(elm) && !isContentEditableFalse(elm);\n    };\n    const isValidHeader = elm => {\n      return isHeader(elm) && isEditable(elm);\n    };\n    const getLevel = elm => {\n      return isHeader(elm) ? parseInt(elm.nodeName.substr(1), 10) : 0;\n    };\n    const headerTarget = elm => {\n      var _a;\n      const headerId = getOrGenerateId(elm);\n      const attach = () => {\n        elm.id = headerId;\n      };\n      return create('header', (_a = getElementText(elm)) !== null && _a !== void 0 ? _a : '', '#' + headerId, getLevel(elm), attach);\n    };\n    const anchorTarget = elm => {\n      const anchorId = elm.id || elm.name;\n      const anchorText = getElementText(elm);\n      return create('anchor', anchorText ? anchorText : '#' + anchorId, '#' + anchorId, 0, noop);\n    };\n    const getHeaderTargets = elms => {\n      return map$2(filter$2(elms, isValidHeader), headerTarget);\n    };\n    const getAnchorTargets = elms => {\n      return map$2(filter$2(elms, isValidAnchor), anchorTarget);\n    };\n    const getTargetElements = elm => {\n      const elms = select('h1,h2,h3,h4,h5,h6,a:not([href])', elm);\n      return elms;\n    };\n    const hasTitle = target => {\n      return trim(target.title).length > 0;\n    };\n    const find = elm => {\n      const elms = getTargetElements(elm);\n      return filter$2(getHeaderTargets(elms).concat(getAnchorTargets(elms)), hasTitle);\n    };\n    const LinkTargets = { find };\n\n    const STORAGE_KEY = 'hugerte-url-history';\n    const HISTORY_LENGTH = 5;\n    const isHttpUrl = url => isString(url) && /^https?/.test(url);\n    const isArrayOfUrl = a => isArray(a) && a.length <= HISTORY_LENGTH && forall(a, isHttpUrl);\n    const isRecordOfUrlArray = r => isObject(r) && find$4(r, value => !isArrayOfUrl(value)).isNone();\n    const getAllHistory = () => {\n      const unparsedHistory = global$4.getItem(STORAGE_KEY);\n      if (unparsedHistory === null) {\n        return {};\n      }\n      let history;\n      try {\n        history = JSON.parse(unparsedHistory);\n      } catch (e) {\n        if (e instanceof SyntaxError) {\n          console.log('Local storage ' + STORAGE_KEY + ' was not valid JSON', e);\n          return {};\n        }\n        throw e;\n      }\n      if (!isRecordOfUrlArray(history)) {\n        console.log('Local storage ' + STORAGE_KEY + ' was not valid format', history);\n        return {};\n      }\n      return history;\n    };\n    const setAllHistory = history => {\n      if (!isRecordOfUrlArray(history)) {\n        throw new Error('Bad format for history:\\n' + JSON.stringify(history));\n      }\n      global$4.setItem(STORAGE_KEY, JSON.stringify(history));\n    };\n    const getHistory = fileType => {\n      const history = getAllHistory();\n      return get$g(history, fileType).getOr([]);\n    };\n    const addToHistory = (url, fileType) => {\n      if (!isHttpUrl(url)) {\n        return;\n      }\n      const history = getAllHistory();\n      const items = get$g(history, fileType).getOr([]);\n      const itemsWithoutUrl = filter$2(items, item => item !== url);\n      history[fileType] = [url].concat(itemsWithoutUrl).slice(0, HISTORY_LENGTH);\n      setAllHistory(history);\n    };\n\n    const isTruthy = value => !!value;\n    const makeMap = value => map$1(global$1.makeMap(value, /[, ]/), isTruthy);\n    const getPicker = editor => Optional.from(getFilePickerCallback(editor));\n    const getPickerTypes = editor => {\n      const optFileTypes = Optional.from(getFilePickerTypes(editor)).filter(isTruthy).map(makeMap);\n      return getPicker(editor).fold(never, _picker => optFileTypes.fold(always, types => keys(types).length > 0 ? types : false));\n    };\n    const getPickerSetting = (editor, filetype) => {\n      const pickerTypes = getPickerTypes(editor);\n      if (isBoolean(pickerTypes)) {\n        return pickerTypes ? getPicker(editor) : Optional.none();\n      } else {\n        return pickerTypes[filetype] ? getPicker(editor) : Optional.none();\n      }\n    };\n    const getUrlPicker = (editor, filetype) => getPickerSetting(editor, filetype).map(picker => entry => Future.nu(completer => {\n      const handler = (value, meta) => {\n        if (!isString(value)) {\n          throw new Error('Expected value to be string');\n        }\n        if (meta !== undefined && !isObject(meta)) {\n          throw new Error('Expected meta to be a object');\n        }\n        const r = {\n          value,\n          meta\n        };\n        completer(r);\n      };\n      const meta = {\n        filetype,\n        fieldname: entry.fieldname,\n        ...Optional.from(entry.meta).getOr({})\n      };\n      picker.call(editor, handler, entry.value, meta);\n    }));\n    const getTextSetting = value => Optional.from(value).filter(isString).getOrUndefined();\n    const getLinkInformation = editor => {\n      if (!useTypeaheadUrls(editor)) {\n        return Optional.none();\n      }\n      return Optional.some({\n        targets: LinkTargets.find(editor.getBody()),\n        anchorTop: getTextSetting(getAnchorTop(editor)),\n        anchorBottom: getTextSetting(getAnchorBottom(editor))\n      });\n    };\n    const getValidationHandler = editor => Optional.from(getFilePickerValidatorHandler(editor));\n    const UrlInputBackstage = editor => ({\n      getHistory,\n      addToHistory,\n      getLinkInformation: () => getLinkInformation(editor),\n      getValidationHandler: () => getValidationHandler(editor),\n      getUrlPicker: filetype => getUrlPicker(editor, filetype)\n    });\n\n    const init$6 = (lazySinks, editor, lazyAnchorbar, lazyBottomAnchorBar) => {\n      const contextMenuState = Cell(false);\n      const toolbar = HeaderBackstage(editor);\n      const providers = {\n        icons: () => editor.ui.registry.getAll().icons,\n        menuItems: () => editor.ui.registry.getAll().menuItems,\n        translate: global$8.translate,\n        isDisabled: () => editor.mode.isReadOnly() || !editor.ui.isEnabled(),\n        getOption: editor.options.get,\n        tooltips: TooltipsBackstage(lazySinks.popup)\n      };\n      const urlinput = UrlInputBackstage(editor);\n      const styles = init$7(editor);\n      const colorinput = ColorInputBackstage(editor);\n      const dialogSettings = DialogBackstage(editor);\n      const isContextMenuOpen = () => contextMenuState.get();\n      const setContextMenuState = state => contextMenuState.set(state);\n      const commonBackstage = {\n        shared: {\n          providers,\n          anchors: getAnchors(editor, lazyAnchorbar, lazyBottomAnchorBar, toolbar.isPositionedAtTop),\n          header: toolbar\n        },\n        urlinput,\n        styles,\n        colorinput,\n        dialog: dialogSettings,\n        isContextMenuOpen,\n        setContextMenuState\n      };\n      const popupBackstage = {\n        ...commonBackstage,\n        shared: {\n          ...commonBackstage.shared,\n          interpreter: s => interpretWithoutForm(s, {}, popupBackstage),\n          getSink: lazySinks.popup\n        }\n      };\n      const dialogBackstage = {\n        ...commonBackstage,\n        shared: {\n          ...commonBackstage.shared,\n          interpreter: s => interpretWithoutForm(s, {}, dialogBackstage),\n          getSink: lazySinks.dialog\n        }\n      };\n      return {\n        popup: popupBackstage,\n        dialog: dialogBackstage\n      };\n    };\n\n    const setup$b = (editor, mothership, uiMotherships) => {\n      const broadcastEvent = (name, evt) => {\n        each$1([\n          mothership,\n          ...uiMotherships\n        ], m => {\n          m.broadcastEvent(name, evt);\n        });\n      };\n      const broadcastOn = (channel, message) => {\n        each$1([\n          mothership,\n          ...uiMotherships\n        ], m => {\n          m.broadcastOn([channel], message);\n        });\n      };\n      const fireDismissPopups = evt => broadcastOn(dismissPopups(), { target: evt.target });\n      const doc = getDocument();\n      const onTouchstart = bind(doc, 'touchstart', fireDismissPopups);\n      const onTouchmove = bind(doc, 'touchmove', evt => broadcastEvent(documentTouchmove(), evt));\n      const onTouchend = bind(doc, 'touchend', evt => broadcastEvent(documentTouchend(), evt));\n      const onMousedown = bind(doc, 'mousedown', fireDismissPopups);\n      const onMouseup = bind(doc, 'mouseup', evt => {\n        if (evt.raw.button === 0) {\n          broadcastOn(mouseReleased(), { target: evt.target });\n        }\n      });\n      const onContentClick = raw => broadcastOn(dismissPopups(), { target: SugarElement.fromDom(raw.target) });\n      const onContentMouseup = raw => {\n        if (raw.button === 0) {\n          broadcastOn(mouseReleased(), { target: SugarElement.fromDom(raw.target) });\n        }\n      };\n      const onContentMousedown = () => {\n        each$1(editor.editorManager.get(), loopEditor => {\n          if (editor !== loopEditor) {\n            loopEditor.dispatch('DismissPopups', { relatedTarget: editor });\n          }\n        });\n      };\n      const onWindowScroll = evt => broadcastEvent(windowScroll(), fromRawEvent(evt));\n      const onWindowResize = evt => {\n        broadcastOn(repositionPopups(), {});\n        broadcastEvent(windowResize(), fromRawEvent(evt));\n      };\n      const dos = getRootNode(SugarElement.fromDom(editor.getElement()));\n      const onElementScroll = capture(dos, 'scroll', evt => {\n        requestAnimationFrame(() => {\n          const c = editor.getContainer();\n          if (c !== undefined && c !== null) {\n            const optScrollingContext = detectWhenSplitUiMode(editor, mothership.element);\n            const scrollers = optScrollingContext.map(sc => [\n              sc.element,\n              ...sc.others\n            ]).getOr([]);\n            if (exists(scrollers, s => eq(s, evt.target))) {\n              editor.dispatch('ElementScroll', { target: evt.target.dom });\n              broadcastEvent(externalElementScroll(), evt);\n            }\n          }\n        });\n      });\n      const onEditorResize = () => broadcastOn(repositionPopups(), {});\n      const onEditorProgress = evt => {\n        if (evt.state) {\n          broadcastOn(dismissPopups(), { target: SugarElement.fromDom(editor.getContainer()) });\n        }\n      };\n      const onDismissPopups = event => {\n        broadcastOn(dismissPopups(), { target: SugarElement.fromDom(event.relatedTarget.getContainer()) });\n      };\n      const onFocusIn = event => editor.dispatch('focusin', event);\n      const onFocusOut = event => editor.dispatch('focusout', event);\n      editor.on('PostRender', () => {\n        editor.on('click', onContentClick);\n        editor.on('tap', onContentClick);\n        editor.on('mouseup', onContentMouseup);\n        editor.on('mousedown', onContentMousedown);\n        editor.on('ScrollWindow', onWindowScroll);\n        editor.on('ResizeWindow', onWindowResize);\n        editor.on('ResizeEditor', onEditorResize);\n        editor.on('AfterProgressState', onEditorProgress);\n        editor.on('DismissPopups', onDismissPopups);\n        each$1([\n          mothership,\n          ...uiMotherships\n        ], gui => {\n          gui.element.dom.addEventListener('focusin', onFocusIn);\n          gui.element.dom.addEventListener('focusout', onFocusOut);\n        });\n      });\n      editor.on('remove', () => {\n        editor.off('click', onContentClick);\n        editor.off('tap', onContentClick);\n        editor.off('mouseup', onContentMouseup);\n        editor.off('mousedown', onContentMousedown);\n        editor.off('ScrollWindow', onWindowScroll);\n        editor.off('ResizeWindow', onWindowResize);\n        editor.off('ResizeEditor', onEditorResize);\n        editor.off('AfterProgressState', onEditorProgress);\n        editor.off('DismissPopups', onDismissPopups);\n        each$1([\n          mothership,\n          ...uiMotherships\n        ], gui => {\n          gui.element.dom.removeEventListener('focusin', onFocusIn);\n          gui.element.dom.removeEventListener('focusout', onFocusOut);\n        });\n        onMousedown.unbind();\n        onTouchstart.unbind();\n        onTouchmove.unbind();\n        onTouchend.unbind();\n        onMouseup.unbind();\n        onElementScroll.unbind();\n      });\n      editor.on('detach', () => {\n        each$1([\n          mothership,\n          ...uiMotherships\n        ], detachSystem);\n        each$1([\n          mothership,\n          ...uiMotherships\n        ], m => m.destroy());\n      });\n    };\n\n    const parts$a = AlloyParts;\n    const partType = PartType;\n\n    const schema$f = constant$1([\n      defaulted('shell', false),\n      required$1('makeItem'),\n      defaulted('setupItem', noop),\n      SketchBehaviours.field('listBehaviours', [Replacing])\n    ]);\n    const customListDetail = () => ({ behaviours: derive$1([Replacing.config({})]) });\n    const itemsPart = optional({\n      name: 'items',\n      overrides: customListDetail\n    });\n    const parts$9 = constant$1([itemsPart]);\n    const name = constant$1('CustomList');\n\n    const factory$f = (detail, components, _spec, _external) => {\n      const setItems = (list, items) => {\n        getListContainer(list).fold(() => {\n          console.error('Custom List was defined to not be a shell, but no item container was specified in components');\n          throw new Error('Custom List was defined to not be a shell, but no item container was specified in components');\n        }, container => {\n          const itemComps = Replacing.contents(container);\n          const numListsRequired = items.length;\n          const numListsToAdd = numListsRequired - itemComps.length;\n          const itemsToAdd = numListsToAdd > 0 ? range$2(numListsToAdd, () => detail.makeItem()) : [];\n          const itemsToRemove = itemComps.slice(numListsRequired);\n          each$1(itemsToRemove, item => Replacing.remove(container, item));\n          each$1(itemsToAdd, item => Replacing.append(container, item));\n          const builtLists = Replacing.contents(container);\n          each$1(builtLists, (item, i) => {\n            detail.setupItem(list, item, items[i], i);\n          });\n        });\n      };\n      const extra = detail.shell ? {\n        behaviours: [Replacing.config({})],\n        components: []\n      } : {\n        behaviours: [],\n        components\n      };\n      const getListContainer = component => detail.shell ? Optional.some(component) : getPart(component, detail, 'items');\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: extra.components,\n        behaviours: augment(detail.listBehaviours, extra.behaviours),\n        apis: { setItems }\n      };\n    };\n    const CustomList = composite({\n      name: name(),\n      configFields: schema$f(),\n      partFields: parts$9(),\n      factory: factory$f,\n      apis: {\n        setItems: (apis, list, items) => {\n          apis.setItems(list, items);\n        }\n      }\n    });\n\n    const schema$e = constant$1([\n      required$1('dom'),\n      defaulted('shell', true),\n      field('toolbarBehaviours', [Replacing])\n    ]);\n    const enhanceGroups = () => ({ behaviours: derive$1([Replacing.config({})]) });\n    const parts$8 = constant$1([optional({\n        name: 'groups',\n        overrides: enhanceGroups\n      })]);\n\n    const factory$e = (detail, components, _spec, _externals) => {\n      const setGroups = (toolbar, groups) => {\n        getGroupContainer(toolbar).fold(() => {\n          console.error('Toolbar was defined to not be a shell, but no groups container was specified in components');\n          throw new Error('Toolbar was defined to not be a shell, but no groups container was specified in components');\n        }, container => {\n          Replacing.set(container, groups);\n        });\n      };\n      const getGroupContainer = component => detail.shell ? Optional.some(component) : getPart(component, detail, 'groups');\n      const extra = detail.shell ? {\n        behaviours: [Replacing.config({})],\n        components: []\n      } : {\n        behaviours: [],\n        components\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: extra.components,\n        behaviours: augment(detail.toolbarBehaviours, extra.behaviours),\n        apis: {\n          setGroups,\n          refresh: noop\n        },\n        domModification: { attributes: { role: 'group' } }\n      };\n    };\n    const Toolbar = composite({\n      name: 'Toolbar',\n      configFields: schema$e(),\n      partFields: parts$8(),\n      factory: factory$e,\n      apis: {\n        setGroups: (apis, toolbar, groups) => {\n          apis.setGroups(toolbar, groups);\n        }\n      }\n    });\n\n    const setup$a = noop;\n    const isDocked$2 = never;\n    const getBehaviours$1 = constant$1([]);\n\n    var StaticHeader = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        setup: setup$a,\n        isDocked: isDocked$2,\n        getBehaviours: getBehaviours$1\n    });\n\n    const getOffsetParent = element => {\n      const isFixed = is$1(getRaw(element, 'position'), 'fixed');\n      const offsetParent$1 = isFixed ? Optional.none() : offsetParent(element);\n      return offsetParent$1.orThunk(() => {\n        const marker = SugarElement.fromTag('span');\n        return parent(element).bind(parent => {\n          append$2(parent, marker);\n          const offsetParent$1 = offsetParent(marker);\n          remove$5(marker);\n          return offsetParent$1;\n        });\n      });\n    };\n    const getOrigin = element => getOffsetParent(element).map(absolute$3).getOrThunk(() => SugarPosition(0, 0));\n\n    const appear = (component, contextualInfo) => {\n      const elem = component.element;\n      add$2(elem, contextualInfo.transitionClass);\n      remove$2(elem, contextualInfo.fadeOutClass);\n      add$2(elem, contextualInfo.fadeInClass);\n      contextualInfo.onShow(component);\n    };\n    const disappear = (component, contextualInfo) => {\n      const elem = component.element;\n      add$2(elem, contextualInfo.transitionClass);\n      remove$2(elem, contextualInfo.fadeInClass);\n      add$2(elem, contextualInfo.fadeOutClass);\n      contextualInfo.onHide(component);\n    };\n    const isPartiallyVisible = (box, bounds) => box.y < bounds.bottom && box.bottom > bounds.y;\n    const isTopCompletelyVisible = (box, bounds) => box.y >= bounds.y;\n    const isBottomCompletelyVisible = (box, bounds) => box.bottom <= bounds.bottom;\n    const forceTopPosition = (winBox, leftX, viewport) => ({\n      location: 'top',\n      leftX,\n      topY: viewport.bounds.y - winBox.y\n    });\n    const forceBottomPosition = (winBox, leftX, viewport) => ({\n      location: 'bottom',\n      leftX,\n      bottomY: winBox.bottom - viewport.bounds.bottom\n    });\n    const getDockedLeftPosition = bounds => {\n      return bounds.box.x - bounds.win.x;\n    };\n    const tryDockingPosition = (modes, bounds, viewport) => {\n      const winBox = bounds.win;\n      const box = bounds.box;\n      const leftX = getDockedLeftPosition(bounds);\n      return findMap(modes, mode => {\n        switch (mode) {\n        case 'bottom':\n          return !isBottomCompletelyVisible(box, viewport.bounds) ? Optional.some(forceBottomPosition(winBox, leftX, viewport)) : Optional.none();\n        case 'top':\n          return !isTopCompletelyVisible(box, viewport.bounds) ? Optional.some(forceTopPosition(winBox, leftX, viewport)) : Optional.none();\n        default:\n          return Optional.none();\n        }\n      }).getOr({ location: 'no-dock' });\n    };\n    const isVisibleForModes = (modes, box, viewport) => forall(modes, mode => {\n      switch (mode) {\n      case 'bottom':\n        return isBottomCompletelyVisible(box, viewport.bounds);\n      case 'top':\n        return isTopCompletelyVisible(box, viewport.bounds);\n      }\n    });\n    const getXYForRestoring = (pos, viewport) => {\n      const priorY = viewport.optScrollEnv.fold(constant$1(pos.bounds.y), scrollEnv => scrollEnv.scrollElmTop + (pos.bounds.y - scrollEnv.currentScrollTop));\n      return SugarPosition(pos.bounds.x, priorY);\n    };\n    const getXYForSaving = (box, viewport) => {\n      const priorY = viewport.optScrollEnv.fold(constant$1(box.y), scrollEnv => box.y + scrollEnv.currentScrollTop - scrollEnv.scrollElmTop);\n      return SugarPosition(box.x, priorY);\n    };\n    const getPrior = (elem, viewport, state) => state.getInitialPos().map(pos => {\n      const xy = getXYForRestoring(pos, viewport);\n      return {\n        box: bounds(xy.left, xy.top, get$c(elem), get$d(elem)),\n        location: pos.location\n      };\n    });\n    const storePrior = (elem, box, viewport, state, decision) => {\n      const xy = getXYForSaving(box, viewport);\n      const bounds$1 = bounds(xy.left, xy.top, box.width, box.height);\n      state.setInitialPos({\n        style: getAllRaw(elem),\n        position: get$e(elem, 'position') || 'static',\n        bounds: bounds$1,\n        location: decision.location\n      });\n    };\n    const storePriorIfNone = (elem, box, viewport, state, decision) => {\n      state.getInitialPos().fold(() => storePrior(elem, box, viewport, state, decision), () => noop);\n    };\n    const revertToOriginal = (elem, box, state) => state.getInitialPos().bind(position => {\n      var _a;\n      state.clearInitialPos();\n      switch (position.position) {\n      case 'static':\n        return Optional.some({ morph: 'static' });\n      case 'absolute':\n        const offsetParent = getOffsetParent(elem).getOr(body());\n        const offsetBox = box$1(offsetParent);\n        const scrollDelta = (_a = offsetParent.dom.scrollTop) !== null && _a !== void 0 ? _a : 0;\n        return Optional.some({\n          morph: 'absolute',\n          positionCss: NuPositionCss('absolute', get$g(position.style, 'left').map(_left => box.x - offsetBox.x), get$g(position.style, 'top').map(_top => box.y - offsetBox.y + scrollDelta), get$g(position.style, 'right').map(_right => offsetBox.right - box.right), get$g(position.style, 'bottom').map(_bottom => offsetBox.bottom - box.bottom))\n        });\n      default:\n        return Optional.none();\n      }\n    });\n    const tryMorphToOriginal = (elem, viewport, state) => getPrior(elem, viewport, state).filter(({box}) => isVisibleForModes(state.getModes(), box, viewport)).bind(({box}) => revertToOriginal(elem, box, state));\n    const tryDecisionToFixedMorph = decision => {\n      switch (decision.location) {\n      case 'top': {\n          return Optional.some({\n            morph: 'fixed',\n            positionCss: NuPositionCss('fixed', Optional.some(decision.leftX), Optional.some(decision.topY), Optional.none(), Optional.none())\n          });\n        }\n      case 'bottom': {\n          return Optional.some({\n            morph: 'fixed',\n            positionCss: NuPositionCss('fixed', Optional.some(decision.leftX), Optional.none(), Optional.none(), Optional.some(decision.bottomY))\n          });\n        }\n      default:\n        return Optional.none();\n      }\n    };\n    const tryMorphToFixed = (elem, viewport, state) => {\n      const box = box$1(elem);\n      const winBox = win();\n      const decision = tryDockingPosition(state.getModes(), {\n        win: winBox,\n        box\n      }, viewport);\n      if (decision.location === 'top' || decision.location === 'bottom') {\n        storePrior(elem, box, viewport, state, decision);\n        return tryDecisionToFixedMorph(decision);\n      } else {\n        return Optional.none();\n      }\n    };\n    const tryMorphToOriginalOrUpdateFixed = (elem, viewport, state) => {\n      return tryMorphToOriginal(elem, viewport, state).orThunk(() => {\n        return viewport.optScrollEnv.bind(_ => getPrior(elem, viewport, state)).bind(({box, location}) => {\n          const winBox = win();\n          const leftX = getDockedLeftPosition({\n            win: winBox,\n            box\n          });\n          const decision = location === 'top' ? forceTopPosition(winBox, leftX, viewport) : forceBottomPosition(winBox, leftX, viewport);\n          return tryDecisionToFixedMorph(decision);\n        });\n      });\n    };\n    const tryMorph = (component, viewport, state) => {\n      const elem = component.element;\n      const isDocked = is$1(getRaw(elem, 'position'), 'fixed');\n      return isDocked ? tryMorphToOriginalOrUpdateFixed(elem, viewport, state) : tryMorphToFixed(elem, viewport, state);\n    };\n    const calculateMorphToOriginal = (component, viewport, state) => {\n      const elem = component.element;\n      return getPrior(elem, viewport, state).bind(({box}) => revertToOriginal(elem, box, state));\n    };\n    const forceDockWith = (elem, viewport, state, getDecision) => {\n      const box = box$1(elem);\n      const winBox = win();\n      const leftX = getDockedLeftPosition({\n        win: winBox,\n        box\n      });\n      const decision = getDecision(winBox, leftX, viewport);\n      if (decision.location === 'bottom' || decision.location === 'top') {\n        storePriorIfNone(elem, box, viewport, state, decision);\n        return tryDecisionToFixedMorph(decision);\n      } else {\n        return Optional.none();\n      }\n    };\n\n    const morphToStatic = (component, config, state) => {\n      state.setDocked(false);\n      each$1([\n        'left',\n        'right',\n        'top',\n        'bottom',\n        'position'\n      ], prop => remove$6(component.element, prop));\n      config.onUndocked(component);\n    };\n    const morphToCoord = (component, config, state, position) => {\n      const isDocked = position.position === 'fixed';\n      state.setDocked(isDocked);\n      applyPositionCss(component.element, position);\n      const method = isDocked ? config.onDocked : config.onUndocked;\n      method(component);\n    };\n    const updateVisibility = (component, config, state, viewport, morphToDocked = false) => {\n      config.contextual.each(contextInfo => {\n        contextInfo.lazyContext(component).each(box => {\n          const isVisible = isPartiallyVisible(box, viewport.bounds);\n          if (isVisible !== state.isVisible()) {\n            state.setVisible(isVisible);\n            if (morphToDocked && !isVisible) {\n              add$1(component.element, [contextInfo.fadeOutClass]);\n              contextInfo.onHide(component);\n            } else {\n              const method = isVisible ? appear : disappear;\n              method(component, contextInfo);\n            }\n          }\n        });\n      });\n    };\n    const applyFixedMorph = (component, config, state, viewport, morph) => {\n      updateVisibility(component, config, state, viewport, true);\n      morphToCoord(component, config, state, morph.positionCss);\n    };\n    const applyMorph = (component, config, state, viewport, morph) => {\n      switch (morph.morph) {\n      case 'static': {\n          return morphToStatic(component, config, state);\n        }\n      case 'absolute': {\n          return morphToCoord(component, config, state, morph.positionCss);\n        }\n      case 'fixed': {\n          return applyFixedMorph(component, config, state, viewport, morph);\n        }\n      }\n    };\n    const refreshInternal = (component, config, state) => {\n      const viewport = config.lazyViewport(component);\n      updateVisibility(component, config, state, viewport);\n      tryMorph(component, viewport, state).each(morph => {\n        applyMorph(component, config, state, viewport, morph);\n      });\n    };\n    const resetInternal = (component, config, state) => {\n      const elem = component.element;\n      state.setDocked(false);\n      const viewport = config.lazyViewport(component);\n      calculateMorphToOriginal(component, viewport, state).each(staticOrAbsoluteMorph => {\n        switch (staticOrAbsoluteMorph.morph) {\n        case 'static': {\n            morphToStatic(component, config, state);\n            break;\n          }\n        case 'absolute': {\n            morphToCoord(component, config, state, staticOrAbsoluteMorph.positionCss);\n            break;\n          }\n        }\n      });\n      state.setVisible(true);\n      config.contextual.each(contextInfo => {\n        remove$1(elem, [\n          contextInfo.fadeInClass,\n          contextInfo.fadeOutClass,\n          contextInfo.transitionClass\n        ]);\n        contextInfo.onShow(component);\n      });\n      refresh$3(component, config, state);\n    };\n    const refresh$3 = (component, config, state) => {\n      if (component.getSystem().isConnected()) {\n        refreshInternal(component, config, state);\n      }\n    };\n    const reset = (component, config, state) => {\n      if (state.isDocked()) {\n        resetInternal(component, config, state);\n      }\n    };\n    const forceDockWithDecision = getDecision => (component, config, state) => {\n      const viewport = config.lazyViewport(component);\n      const optMorph = forceDockWith(component.element, viewport, state, getDecision);\n      optMorph.each(morph => {\n        applyFixedMorph(component, config, state, viewport, morph);\n      });\n    };\n    const forceDockToTop = forceDockWithDecision(forceTopPosition);\n    const forceDockToBottom = forceDockWithDecision(forceBottomPosition);\n    const isDocked$1 = (component, config, state) => state.isDocked();\n    const setModes = (component, config, state, modes) => state.setModes(modes);\n    const getModes = (component, config, state) => state.getModes();\n\n    var DockingApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        refresh: refresh$3,\n        reset: reset,\n        isDocked: isDocked$1,\n        getModes: getModes,\n        setModes: setModes,\n        forceDockToTop: forceDockToTop,\n        forceDockToBottom: forceDockToBottom\n    });\n\n    const events$4 = (dockInfo, dockState) => derive$2([\n      runOnSource(transitionend(), (component, simulatedEvent) => {\n        dockInfo.contextual.each(contextInfo => {\n          if (has(component.element, contextInfo.transitionClass)) {\n            remove$1(component.element, [\n              contextInfo.transitionClass,\n              contextInfo.fadeInClass\n            ]);\n            const notify = dockState.isVisible() ? contextInfo.onShown : contextInfo.onHidden;\n            notify(component);\n          }\n          simulatedEvent.stop();\n        });\n      }),\n      run$1(windowScroll(), (component, _) => {\n        refresh$3(component, dockInfo, dockState);\n      }),\n      run$1(externalElementScroll(), (component, _) => {\n        refresh$3(component, dockInfo, dockState);\n      }),\n      run$1(windowResize(), (component, _) => {\n        reset(component, dockInfo, dockState);\n      })\n    ]);\n\n    var ActiveDocking = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$4\n    });\n\n    var DockingSchema = [\n      optionObjOf('contextual', [\n        requiredString('fadeInClass'),\n        requiredString('fadeOutClass'),\n        requiredString('transitionClass'),\n        requiredFunction('lazyContext'),\n        onHandler('onShow'),\n        onHandler('onShown'),\n        onHandler('onHide'),\n        onHandler('onHidden')\n      ]),\n      defaultedFunction('lazyViewport', () => ({\n        bounds: win(),\n        optScrollEnv: Optional.none()\n      })),\n      defaultedArrayOf('modes', [\n        'top',\n        'bottom'\n      ], string),\n      onHandler('onDocked'),\n      onHandler('onUndocked')\n    ];\n\n    const init$5 = spec => {\n      const docked = Cell(false);\n      const visible = Cell(true);\n      const initialBounds = value$2();\n      const modes = Cell(spec.modes);\n      const readState = () => `docked:  ${ docked.get() }, visible: ${ visible.get() }, modes: ${ modes.get().join(',') }`;\n      return nu$8({\n        isDocked: docked.get,\n        setDocked: docked.set,\n        getInitialPos: initialBounds.get,\n        setInitialPos: initialBounds.set,\n        clearInitialPos: initialBounds.clear,\n        isVisible: visible.get,\n        setVisible: visible.set,\n        getModes: modes.get,\n        setModes: modes.set,\n        readState\n      });\n    };\n\n    var DockingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$5\n    });\n\n    const Docking = create$4({\n      fields: DockingSchema,\n      name: 'docking',\n      active: ActiveDocking,\n      apis: DockingApis,\n      state: DockingState\n    });\n\n    const toolbarHeightChange = constant$1(generate$6('toolbar-height-change'));\n\n    const visibility = {\n      fadeInClass: 'tox-editor-dock-fadein',\n      fadeOutClass: 'tox-editor-dock-fadeout',\n      transitionClass: 'tox-editor-dock-transition'\n    };\n    const editorStickyOnClass = 'tox-hugerte--toolbar-sticky-on';\n    const editorStickyOffClass = 'tox-hugerte--toolbar-sticky-off';\n    const scrollFromBehindHeader = (e, containerHeader) => {\n      const doc = owner$4(containerHeader);\n      const win = defaultView(containerHeader);\n      const viewHeight = win.dom.innerHeight;\n      const scrollPos = get$b(doc);\n      const markerElement = SugarElement.fromDom(e.elm);\n      const markerPos = absolute$2(markerElement);\n      const markerHeight = get$d(markerElement);\n      const markerTop = markerPos.y;\n      const markerBottom = markerTop + markerHeight;\n      const editorHeaderPos = absolute$3(containerHeader);\n      const editorHeaderHeight = get$d(containerHeader);\n      const editorHeaderTop = editorHeaderPos.top;\n      const editorHeaderBottom = editorHeaderTop + editorHeaderHeight;\n      const editorHeaderDockedAtTop = Math.abs(editorHeaderTop - scrollPos.top) < 2;\n      const editorHeaderDockedAtBottom = Math.abs(editorHeaderBottom - (scrollPos.top + viewHeight)) < 2;\n      if (editorHeaderDockedAtTop && markerTop < editorHeaderBottom) {\n        to(scrollPos.left, markerTop - editorHeaderHeight, doc);\n      } else if (editorHeaderDockedAtBottom && markerBottom > editorHeaderTop) {\n        const y = markerTop - viewHeight + markerHeight + editorHeaderHeight;\n        to(scrollPos.left, y, doc);\n      }\n    };\n    const isDockedMode = (header, mode) => contains$2(Docking.getModes(header), mode);\n    const updateIframeContentFlow = header => {\n      const getOccupiedHeight = elm => getOuter$2(elm) + (parseInt(get$e(elm, 'margin-top'), 10) || 0) + (parseInt(get$e(elm, 'margin-bottom'), 10) || 0);\n      const elm = header.element;\n      parentElement(elm).each(parentElem => {\n        const padding = 'padding-' + Docking.getModes(header)[0];\n        if (Docking.isDocked(header)) {\n          const parentWidth = get$c(parentElem);\n          set$8(elm, 'width', parentWidth + 'px');\n          set$8(parentElem, padding, getOccupiedHeight(elm) + 'px');\n        } else {\n          remove$6(elm, 'width');\n          remove$6(parentElem, padding);\n        }\n      });\n    };\n    const updateSinkVisibility = (sinkElem, visible) => {\n      if (visible) {\n        remove$2(sinkElem, visibility.fadeOutClass);\n        add$1(sinkElem, [\n          visibility.transitionClass,\n          visibility.fadeInClass\n        ]);\n      } else {\n        remove$2(sinkElem, visibility.fadeInClass);\n        add$1(sinkElem, [\n          visibility.fadeOutClass,\n          visibility.transitionClass\n        ]);\n      }\n    };\n    const updateEditorClasses = (editor, docked) => {\n      const editorContainer = SugarElement.fromDom(editor.getContainer());\n      if (docked) {\n        add$2(editorContainer, editorStickyOnClass);\n        remove$2(editorContainer, editorStickyOffClass);\n      } else {\n        add$2(editorContainer, editorStickyOffClass);\n        remove$2(editorContainer, editorStickyOnClass);\n      }\n    };\n    const restoreFocus = (headerElem, focusedElem) => {\n      const ownerDoc = owner$4(focusedElem);\n      active$1(ownerDoc).filter(activeElm => !eq(focusedElem, activeElm)).filter(activeElm => eq(activeElm, SugarElement.fromDom(ownerDoc.dom.body)) || contains(headerElem, activeElm)).each(() => focus$3(focusedElem));\n    };\n    const findFocusedElem = (rootElm, lazySink) => search(rootElm).orThunk(() => lazySink().toOptional().bind(sink => search(sink.element)));\n    const setup$9 = (editor, sharedBackstage, lazyHeader) => {\n      if (!editor.inline) {\n        if (!sharedBackstage.header.isPositionedAtTop()) {\n          editor.on('ResizeEditor', () => {\n            lazyHeader().each(Docking.reset);\n          });\n        }\n        editor.on('ResizeWindow ResizeEditor', () => {\n          lazyHeader().each(updateIframeContentFlow);\n        });\n        editor.on('SkinLoaded', () => {\n          lazyHeader().each(comp => {\n            Docking.isDocked(comp) ? Docking.reset(comp) : Docking.refresh(comp);\n          });\n        });\n        editor.on('FullscreenStateChanged', () => {\n          lazyHeader().each(Docking.reset);\n        });\n      }\n      editor.on('AfterScrollIntoView', e => {\n        lazyHeader().each(header => {\n          Docking.refresh(header);\n          const headerElem = header.element;\n          if (isVisible(headerElem)) {\n            scrollFromBehindHeader(e, headerElem);\n          }\n        });\n      });\n      editor.on('PostRender', () => {\n        updateEditorClasses(editor, false);\n      });\n    };\n    const isDocked = lazyHeader => lazyHeader().map(Docking.isDocked).getOr(false);\n    const getIframeBehaviours = () => [Receiving.config({ channels: { [toolbarHeightChange()]: { onReceive: updateIframeContentFlow } } })];\n    const getBehaviours = (editor, sharedBackstage) => {\n      const focusedElm = value$2();\n      const lazySink = sharedBackstage.getSink;\n      const runOnSinkElement = f => {\n        lazySink().each(sink => f(sink.element));\n      };\n      const onDockingSwitch = comp => {\n        if (!editor.inline) {\n          updateIframeContentFlow(comp);\n        }\n        updateEditorClasses(editor, Docking.isDocked(comp));\n        comp.getSystem().broadcastOn([repositionPopups()], {});\n        lazySink().each(sink => sink.getSystem().broadcastOn([repositionPopups()], {}));\n      };\n      const additionalBehaviours = editor.inline ? [] : getIframeBehaviours();\n      return [\n        Focusing.config({}),\n        Docking.config({\n          contextual: {\n            lazyContext: comp => {\n              const headerHeight = getOuter$2(comp.element);\n              const container = editor.inline ? editor.getContentAreaContainer() : editor.getContainer();\n              return Optional.from(container).map(c => {\n                const box = box$1(SugarElement.fromDom(c));\n                const optScrollingContext = detectWhenSplitUiMode(editor, comp.element);\n                return optScrollingContext.fold(() => {\n                  const boxHeight = box.height - headerHeight;\n                  const topBound = box.y + (isDockedMode(comp, 'top') ? 0 : headerHeight);\n                  return bounds(box.x, topBound, box.width, boxHeight);\n                }, scrollEnv => {\n                  const constrainedBounds = constrain(box, getBoundsFrom(scrollEnv));\n                  const constrainedBoundsY = isDockedMode(comp, 'top') ? constrainedBounds.y : constrainedBounds.y + headerHeight;\n                  return bounds(constrainedBounds.x, constrainedBoundsY, constrainedBounds.width, constrainedBounds.height - headerHeight);\n                });\n              });\n            },\n            onShow: () => {\n              runOnSinkElement(elem => updateSinkVisibility(elem, true));\n            },\n            onShown: comp => {\n              runOnSinkElement(elem => remove$1(elem, [\n                visibility.transitionClass,\n                visibility.fadeInClass\n              ]));\n              focusedElm.get().each(elem => {\n                restoreFocus(comp.element, elem);\n                focusedElm.clear();\n              });\n            },\n            onHide: comp => {\n              findFocusedElem(comp.element, lazySink).fold(focusedElm.clear, focusedElm.set);\n              runOnSinkElement(elem => updateSinkVisibility(elem, false));\n            },\n            onHidden: () => {\n              runOnSinkElement(elem => remove$1(elem, [visibility.transitionClass]));\n            },\n            ...visibility\n          },\n          lazyViewport: comp => {\n            const optScrollingContext = detectWhenSplitUiMode(editor, comp.element);\n            return optScrollingContext.fold(() => {\n              const boundsWithoutOffset = win();\n              const offset = getStickyToolbarOffset(editor);\n              const top = boundsWithoutOffset.y + (isDockedMode(comp, 'top') ? offset : 0);\n              const height = boundsWithoutOffset.height - (isDockedMode(comp, 'bottom') ? offset : 0);\n              return {\n                bounds: bounds(boundsWithoutOffset.x, top, boundsWithoutOffset.width, height),\n                optScrollEnv: Optional.none()\n              };\n            }, sc => {\n              const combinedBounds = getBoundsFrom(sc);\n              return {\n                bounds: combinedBounds,\n                optScrollEnv: Optional.some({\n                  currentScrollTop: sc.element.dom.scrollTop,\n                  scrollElmTop: absolute$3(sc.element).top\n                })\n              };\n            });\n          },\n          modes: [sharedBackstage.header.getDockingMode()],\n          onDocked: onDockingSwitch,\n          onUndocked: onDockingSwitch\n        }),\n        ...additionalBehaviours\n      ];\n    };\n\n    var StickyHeader = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        setup: setup$9,\n        isDocked: isDocked,\n        getBehaviours: getBehaviours\n    });\n\n    const renderHeader = spec => {\n      const editor = spec.editor;\n      const getBehaviours$2 = spec.sticky ? getBehaviours : getBehaviours$1;\n      return {\n        uid: spec.uid,\n        dom: spec.dom,\n        components: spec.components,\n        behaviours: derive$1(getBehaviours$2(editor, spec.sharedBackstage))\n      };\n    };\n\n    const groupToolbarButtonSchema = objOf([\n      type,\n      requiredOf('items', oneOf([\n        arrOfObj([\n          name$1,\n          requiredArrayOf('items', string)\n        ]),\n        string\n      ]))\n    ].concat(baseToolbarButtonFields));\n    const createGroupToolbarButton = spec => asRaw('GroupToolbarButton', groupToolbarButtonSchema, spec);\n\n    const baseMenuButtonFields = [\n      optionString('text'),\n      optionString('tooltip'),\n      optionString('icon'),\n      defaultedOf('search', false, oneOf([\n        boolean,\n        objOf([optionString('placeholder')])\n      ], x => {\n        if (isBoolean(x)) {\n          return x ? Optional.some({ placeholder: Optional.none() }) : Optional.none();\n        } else {\n          return Optional.some(x);\n        }\n      })),\n      requiredFunction('fetch'),\n      defaultedFunction('onSetup', () => noop)\n    ];\n\n    const MenuButtonSchema = objOf([\n      type,\n      ...baseMenuButtonFields\n    ]);\n    const createMenuButton = spec => asRaw('menubutton', MenuButtonSchema, spec);\n\n    const splitButtonSchema = objOf([\n      type,\n      optionalTooltip,\n      optionalIcon,\n      optionalText,\n      optionalSelect,\n      fetch$1,\n      onSetup,\n      defaultedStringEnum('presets', 'normal', [\n        'normal',\n        'color',\n        'listpreview'\n      ]),\n      defaultedColumns(1),\n      onAction,\n      onItemAction\n    ]);\n    const createSplitButton = spec => asRaw('SplitButton', splitButtonSchema, spec);\n\n    const factory$d = (detail, spec) => {\n      const setMenus = (comp, menus) => {\n        const newMenus = map$2(menus, m => {\n          const buttonSpec = {\n            type: 'menubutton',\n            text: m.text,\n            fetch: callback => {\n              callback(m.getItems());\n            }\n          };\n          const internal = createMenuButton(buttonSpec).mapError(errInfo => formatError(errInfo)).getOrDie();\n          return renderMenuButton(internal, 'tox-mbtn', spec.backstage, Optional.some('menuitem'));\n        });\n        Replacing.set(comp, newMenus);\n      };\n      const apis = {\n        focus: Keying.focusIn,\n        setMenus\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: [],\n        behaviours: derive$1([\n          Replacing.config({}),\n          config('menubar-events', [\n            runOnAttached(component => {\n              detail.onSetup(component);\n            }),\n            run$1(mouseover(), (comp, se) => {\n              descendant(comp.element, '.' + 'tox-mbtn--active').each(activeButton => {\n                closest$1(se.event.target, '.' + 'tox-mbtn').each(hoveredButton => {\n                  if (!eq(activeButton, hoveredButton)) {\n                    comp.getSystem().getByDom(activeButton).each(activeComp => {\n                      comp.getSystem().getByDom(hoveredButton).each(hoveredComp => {\n                        Dropdown.expand(hoveredComp);\n                        Dropdown.close(activeComp);\n                        Focusing.focus(hoveredComp);\n                      });\n                    });\n                  }\n                });\n              });\n            }),\n            run$1(focusShifted(), (comp, se) => {\n              se.event.prevFocus.bind(prev => comp.getSystem().getByDom(prev).toOptional()).each(prev => {\n                se.event.newFocus.bind(nu => comp.getSystem().getByDom(nu).toOptional()).each(nu => {\n                  if (Dropdown.isOpen(prev)) {\n                    Dropdown.expand(nu);\n                    Dropdown.close(prev);\n                  }\n                });\n              });\n            })\n          ]),\n          Keying.config({\n            mode: 'flow',\n            selector: '.' + 'tox-mbtn',\n            onEscape: comp => {\n              detail.onEscape(comp);\n              return Optional.some(true);\n            }\n          }),\n          Tabstopping.config({})\n        ]),\n        apis,\n        domModification: { attributes: { role: 'menubar' } }\n      };\n    };\n    var SilverMenubar = single({\n      factory: factory$d,\n      name: 'silver.Menubar',\n      configFields: [\n        required$1('dom'),\n        required$1('uid'),\n        required$1('onEscape'),\n        required$1('backstage'),\n        defaulted('onSetup', noop)\n      ],\n      apis: {\n        focus: (apis, comp) => {\n          apis.focus(comp);\n        },\n        setMenus: (apis, comp, menus) => {\n          apis.setMenus(comp, menus);\n        }\n      }\n    });\n\n    const owner = 'container';\n    const schema$d = [field('slotBehaviours', [])];\n    const getPartName = name => '<alloy.field.' + name + '>';\n    const sketch = sSpec => {\n      const parts = (() => {\n        const record = [];\n        const slot = (name, config) => {\n          record.push(name);\n          return generateOne$1(owner, getPartName(name), config);\n        };\n        return {\n          slot,\n          record: constant$1(record)\n        };\n      })();\n      const spec = sSpec(parts);\n      const partNames = parts.record();\n      const fieldParts = map$2(partNames, n => required({\n        name: n,\n        pname: getPartName(n)\n      }));\n      return composite$1(owner, schema$d, fieldParts, make$1, spec);\n    };\n    const make$1 = (detail, components) => {\n      const getSlotNames = _ => getAllPartNames(detail);\n      const getSlot = (container, key) => getPart(container, detail, key);\n      const onSlot = (f, def) => (container, key) => getPart(container, detail, key).map(slot => f(slot, key)).getOr(def);\n      const onSlots = f => (container, keys) => {\n        each$1(keys, key => f(container, key));\n      };\n      const doShowing = (comp, _key) => get$f(comp.element, 'aria-hidden') !== 'true';\n      const doShow = (comp, key) => {\n        if (!doShowing(comp)) {\n          const element = comp.element;\n          remove$6(element, 'display');\n          remove$7(element, 'aria-hidden');\n          emitWith(comp, slotVisibility(), {\n            name: key,\n            visible: true\n          });\n        }\n      };\n      const doHide = (comp, key) => {\n        if (doShowing(comp)) {\n          const element = comp.element;\n          set$8(element, 'display', 'none');\n          set$9(element, 'aria-hidden', 'true');\n          emitWith(comp, slotVisibility(), {\n            name: key,\n            visible: false\n          });\n        }\n      };\n      const isShowing = onSlot(doShowing, false);\n      const hideSlot = onSlot(doHide);\n      const hideSlots = onSlots(hideSlot);\n      const hideAllSlots = container => hideSlots(container, getSlotNames());\n      const showSlot = onSlot(doShow);\n      const apis = {\n        getSlotNames,\n        getSlot,\n        isShowing,\n        hideSlot,\n        hideAllSlots,\n        showSlot\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components,\n        behaviours: get$3(detail.slotBehaviours),\n        apis\n      };\n    };\n    const slotApis = map$1({\n      getSlotNames: (apis, c) => apis.getSlotNames(c),\n      getSlot: (apis, c, key) => apis.getSlot(c, key),\n      isShowing: (apis, c, key) => apis.isShowing(c, key),\n      hideSlot: (apis, c, key) => apis.hideSlot(c, key),\n      hideAllSlots: (apis, c) => apis.hideAllSlots(c),\n      showSlot: (apis, c, key) => apis.showSlot(c, key)\n    }, value => makeApi(value));\n    const SlotContainer = {\n      ...slotApis,\n      ...{ sketch }\n    };\n\n    const sidebarSchema = objOf([\n      optionalIcon,\n      optionalTooltip,\n      defaultedFunction('onShow', noop),\n      defaultedFunction('onHide', noop),\n      onSetup\n    ]);\n    const createSidebar = spec => asRaw('sidebar', sidebarSchema, spec);\n\n    const setup$8 = editor => {\n      const {sidebars} = editor.ui.registry.getAll();\n      each$1(keys(sidebars), name => {\n        const spec = sidebars[name];\n        const isActive = () => is$1(Optional.from(editor.queryCommandValue('ToggleSidebar')), name);\n        editor.ui.registry.addToggleButton(name, {\n          icon: spec.icon,\n          tooltip: spec.tooltip,\n          onAction: buttonApi => {\n            editor.execCommand('ToggleSidebar', false, name);\n            buttonApi.setActive(isActive());\n          },\n          onSetup: buttonApi => {\n            buttonApi.setActive(isActive());\n            const handleToggle = () => buttonApi.setActive(isActive());\n            editor.on('ToggleSidebar', handleToggle);\n            return () => {\n              editor.off('ToggleSidebar', handleToggle);\n            };\n          }\n        });\n      });\n    };\n    const getApi = comp => ({ element: () => comp.element.dom });\n    const makePanels = (parts, panelConfigs) => {\n      const specs = map$2(keys(panelConfigs), name => {\n        const spec = panelConfigs[name];\n        const bridged = getOrDie(createSidebar(spec));\n        return {\n          name,\n          getApi,\n          onSetup: bridged.onSetup,\n          onShow: bridged.onShow,\n          onHide: bridged.onHide\n        };\n      });\n      return map$2(specs, spec => {\n        const editorOffCell = Cell(noop);\n        return parts.slot(spec.name, {\n          dom: {\n            tag: 'div',\n            classes: ['tox-sidebar__pane']\n          },\n          behaviours: SimpleBehaviours.unnamedEvents([\n            onControlAttached(spec, editorOffCell),\n            onControlDetached(spec, editorOffCell),\n            run$1(slotVisibility(), (sidepanel, se) => {\n              const data = se.event;\n              const optSidePanelSpec = find$5(specs, config => config.name === data.name);\n              optSidePanelSpec.each(sidePanelSpec => {\n                const handler = data.visible ? sidePanelSpec.onShow : sidePanelSpec.onHide;\n                handler(sidePanelSpec.getApi(sidepanel));\n              });\n            })\n          ])\n        });\n      });\n    };\n    const makeSidebar = panelConfigs => SlotContainer.sketch(parts => ({\n      dom: {\n        tag: 'div',\n        classes: ['tox-sidebar__pane-container']\n      },\n      components: makePanels(parts, panelConfigs),\n      slotBehaviours: SimpleBehaviours.unnamedEvents([runOnAttached(slotContainer => SlotContainer.hideAllSlots(slotContainer))])\n    }));\n    const setSidebar = (sidebar, panelConfigs, showSidebar) => {\n      const optSlider = Composing.getCurrent(sidebar);\n      optSlider.each(slider => {\n        Replacing.set(slider, [makeSidebar(panelConfigs)]);\n        const configKey = showSidebar === null || showSidebar === void 0 ? void 0 : showSidebar.toLowerCase();\n        if (isString(configKey) && has$2(panelConfigs, configKey)) {\n          Composing.getCurrent(slider).each(slotContainer => {\n            SlotContainer.showSlot(slotContainer, configKey);\n            Sliding.immediateGrow(slider);\n            remove$6(slider.element, 'width');\n            updateSidebarRoleOnToggle(sidebar.element, 'region');\n          });\n        }\n      });\n    };\n    const updateSidebarRoleOnToggle = (sidebar, sidebarState) => {\n      set$9(sidebar, 'role', sidebarState);\n    };\n    const toggleSidebar = (sidebar, name) => {\n      const optSlider = Composing.getCurrent(sidebar);\n      optSlider.each(slider => {\n        const optSlotContainer = Composing.getCurrent(slider);\n        optSlotContainer.each(slotContainer => {\n          if (Sliding.hasGrown(slider)) {\n            if (SlotContainer.isShowing(slotContainer, name)) {\n              Sliding.shrink(slider);\n              updateSidebarRoleOnToggle(sidebar.element, 'presentation');\n            } else {\n              SlotContainer.hideAllSlots(slotContainer);\n              SlotContainer.showSlot(slotContainer, name);\n              updateSidebarRoleOnToggle(sidebar.element, 'region');\n            }\n          } else {\n            SlotContainer.hideAllSlots(slotContainer);\n            SlotContainer.showSlot(slotContainer, name);\n            Sliding.grow(slider);\n            updateSidebarRoleOnToggle(sidebar.element, 'region');\n          }\n        });\n      });\n    };\n    const whichSidebar = sidebar => {\n      const optSlider = Composing.getCurrent(sidebar);\n      return optSlider.bind(slider => {\n        const sidebarOpen = Sliding.isGrowing(slider) || Sliding.hasGrown(slider);\n        if (sidebarOpen) {\n          const optSlotContainer = Composing.getCurrent(slider);\n          return optSlotContainer.bind(slotContainer => find$5(SlotContainer.getSlotNames(slotContainer), name => SlotContainer.isShowing(slotContainer, name)));\n        } else {\n          return Optional.none();\n        }\n      });\n    };\n    const fixSize = generate$6('FixSizeEvent');\n    const autoSize = generate$6('AutoSizeEvent');\n    const renderSidebar = spec => ({\n      uid: spec.uid,\n      dom: {\n        tag: 'div',\n        classes: ['tox-sidebar'],\n        attributes: { role: 'presentation' }\n      },\n      components: [{\n          dom: {\n            tag: 'div',\n            classes: ['tox-sidebar__slider']\n          },\n          components: [],\n          behaviours: derive$1([\n            Tabstopping.config({}),\n            Focusing.config({}),\n            Sliding.config({\n              dimension: { property: 'width' },\n              closedClass: 'tox-sidebar--sliding-closed',\n              openClass: 'tox-sidebar--sliding-open',\n              shrinkingClass: 'tox-sidebar--sliding-shrinking',\n              growingClass: 'tox-sidebar--sliding-growing',\n              onShrunk: slider => {\n                const optSlotContainer = Composing.getCurrent(slider);\n                optSlotContainer.each(SlotContainer.hideAllSlots);\n                emit(slider, autoSize);\n              },\n              onGrown: slider => {\n                emit(slider, autoSize);\n              },\n              onStartGrow: slider => {\n                emitWith(slider, fixSize, { width: getRaw(slider.element, 'width').getOr('') });\n              },\n              onStartShrink: slider => {\n                emitWith(slider, fixSize, { width: get$c(slider.element) + 'px' });\n              }\n            }),\n            Replacing.config({}),\n            Composing.config({\n              find: comp => {\n                const children = Replacing.contents(comp);\n                return head(children);\n              }\n            })\n          ])\n        }],\n      behaviours: derive$1([\n        ComposingConfigs.childAt(0),\n        config('sidebar-sliding-events', [\n          run$1(fixSize, (comp, se) => {\n            set$8(comp.element, 'width', se.event.width);\n          }),\n          run$1(autoSize, (comp, _se) => {\n            remove$6(comp.element, 'width');\n          })\n        ])\n      ])\n    });\n\n    const block = (component, config, state, getBusySpec) => {\n      set$9(component.element, 'aria-busy', true);\n      const root = config.getRoot(component).getOr(component);\n      const blockerBehaviours = derive$1([\n        Keying.config({\n          mode: 'special',\n          onTab: () => Optional.some(true),\n          onShiftTab: () => Optional.some(true)\n        }),\n        Focusing.config({})\n      ]);\n      const blockSpec = getBusySpec(root, blockerBehaviours);\n      const blocker = root.getSystem().build(blockSpec);\n      Replacing.append(root, premade(blocker));\n      if (blocker.hasConfigured(Keying) && config.focus) {\n        Keying.focusIn(blocker);\n      }\n      if (!state.isBlocked()) {\n        config.onBlock(component);\n      }\n      state.blockWith(() => Replacing.remove(root, blocker));\n    };\n    const unblock = (component, config, state) => {\n      remove$7(component.element, 'aria-busy');\n      if (state.isBlocked()) {\n        config.onUnblock(component);\n      }\n      state.clear();\n    };\n    const isBlocked = (component, blockingConfig, blockingState) => blockingState.isBlocked();\n\n    var BlockingApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        block: block,\n        unblock: unblock,\n        isBlocked: isBlocked\n    });\n\n    var BlockingSchema = [\n      defaultedFunction('getRoot', Optional.none),\n      defaultedBoolean('focus', true),\n      onHandler('onBlock'),\n      onHandler('onUnblock')\n    ];\n\n    const init$4 = () => {\n      const blocker = destroyable();\n      const blockWith = destroy => {\n        blocker.set({ destroy });\n      };\n      return nu$8({\n        readState: blocker.isSet,\n        blockWith,\n        clear: blocker.clear,\n        isBlocked: blocker.isSet\n      });\n    };\n\n    var BlockingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$4\n    });\n\n    const Blocking = create$4({\n      fields: BlockingSchema,\n      name: 'blocking',\n      apis: BlockingApis,\n      state: BlockingState\n    });\n\n    const getBusySpec$1 = providerBackstage => (_root, _behaviours) => ({\n      dom: {\n        tag: 'div',\n        attributes: {\n          'aria-label': providerBackstage.translate('Loading...'),\n          'tabindex': '0'\n        },\n        classes: ['tox-throbber__busy-spinner']\n      },\n      components: [{ dom: fromHtml('<div class=\"tox-spinner\"><div></div><div></div><div></div></div>') }]\n    });\n    const focusBusyComponent = throbber => Composing.getCurrent(throbber).each(comp => focus$3(comp.element, true));\n    const toggleEditorTabIndex = (editor, state) => {\n      const tabIndexAttr = 'tabindex';\n      const dataTabIndexAttr = `data-mce-${ tabIndexAttr }`;\n      Optional.from(editor.iframeElement).map(SugarElement.fromDom).each(iframe => {\n        if (state) {\n          getOpt(iframe, tabIndexAttr).each(tabIndex => set$9(iframe, dataTabIndexAttr, tabIndex));\n          set$9(iframe, tabIndexAttr, -1);\n        } else {\n          remove$7(iframe, tabIndexAttr);\n          getOpt(iframe, dataTabIndexAttr).each(tabIndex => {\n            set$9(iframe, tabIndexAttr, tabIndex);\n            remove$7(iframe, dataTabIndexAttr);\n          });\n        }\n      });\n    };\n    const toggleThrobber = (editor, comp, state, providerBackstage) => {\n      const element = comp.element;\n      toggleEditorTabIndex(editor, state);\n      if (state) {\n        Blocking.block(comp, getBusySpec$1(providerBackstage));\n        remove$6(element, 'display');\n        remove$7(element, 'aria-hidden');\n        if (editor.hasFocus()) {\n          focusBusyComponent(comp);\n        }\n      } else {\n        const throbberFocus = Composing.getCurrent(comp).exists(busyComp => hasFocus(busyComp.element));\n        Blocking.unblock(comp);\n        set$8(element, 'display', 'none');\n        set$9(element, 'aria-hidden', 'true');\n        if (throbberFocus) {\n          editor.focus();\n        }\n      }\n    };\n    const renderThrobber = spec => ({\n      uid: spec.uid,\n      dom: {\n        tag: 'div',\n        attributes: { 'aria-hidden': 'true' },\n        classes: ['tox-throbber'],\n        styles: { display: 'none' }\n      },\n      behaviours: derive$1([\n        Replacing.config({}),\n        Blocking.config({ focus: false }),\n        Composing.config({ find: comp => head(comp.components()) })\n      ]),\n      components: []\n    });\n    const isFocusEvent = event => event.type === 'focusin';\n    const isPasteBinTarget = event => {\n      if (isFocusEvent(event)) {\n        const node = event.composed ? head(event.composedPath()) : Optional.from(event.target);\n        return node.map(SugarElement.fromDom).filter(isElement$1).exists(targetElm => has(targetElm, 'mce-pastebin'));\n      } else {\n        return false;\n      }\n    };\n    const setup$7 = (editor, lazyThrobber, sharedBackstage) => {\n      const throbberState = Cell(false);\n      const timer = value$2();\n      const stealFocus = e => {\n        if (throbberState.get() && !isPasteBinTarget(e)) {\n          e.preventDefault();\n          focusBusyComponent(lazyThrobber());\n          editor.editorManager.setActive(editor);\n        }\n      };\n      if (!editor.inline) {\n        editor.on('PreInit', () => {\n          editor.dom.bind(editor.getWin(), 'focusin', stealFocus);\n          editor.on('BeforeExecCommand', e => {\n            if (e.command.toLowerCase() === 'mcefocus' && e.value !== true) {\n              stealFocus(e);\n            }\n          });\n        });\n      }\n      const toggle = state => {\n        if (state !== throbberState.get()) {\n          throbberState.set(state);\n          toggleThrobber(editor, lazyThrobber(), state, sharedBackstage.providers);\n          fireAfterProgressState(editor, state);\n        }\n      };\n      editor.on('ProgressState', e => {\n        timer.on(clearTimeout);\n        if (isNumber(e.time)) {\n          const timerId = global$9.setEditorTimeout(editor, () => toggle(e.state), e.time);\n          timer.set(timerId);\n        } else {\n          toggle(e.state);\n          timer.clear();\n        }\n      });\n    };\n\n    const generate$1 = (xs, f) => {\n      const init = {\n        len: 0,\n        list: []\n      };\n      const r = foldl(xs, (b, a) => {\n        const value = f(a, b.len);\n        return value.fold(constant$1(b), v => ({\n          len: v.finish,\n          list: b.list.concat([v])\n        }));\n      }, init);\n      return r.list;\n    };\n\n    const output = (within, extra, withinWidth) => ({\n      within,\n      extra,\n      withinWidth\n    });\n    const apportion = (units, total, len) => {\n      const parray = generate$1(units, (unit, current) => {\n        const width = len(unit);\n        return Optional.some({\n          element: unit,\n          start: current,\n          finish: current + width,\n          width\n        });\n      });\n      const within = filter$2(parray, unit => unit.finish <= total);\n      const withinWidth = foldr(within, (acc, el) => acc + el.width, 0);\n      const extra = parray.slice(within.length);\n      return {\n        within,\n        extra,\n        withinWidth\n      };\n    };\n    const toUnit = parray => map$2(parray, unit => unit.element);\n    const fitLast = (within, extra, withinWidth) => {\n      const fits = toUnit(within.concat(extra));\n      return output(fits, [], withinWidth);\n    };\n    const overflow = (within, extra, overflower, withinWidth) => {\n      const fits = toUnit(within).concat([overflower]);\n      return output(fits, toUnit(extra), withinWidth);\n    };\n    const fitAll = (within, extra, withinWidth) => output(toUnit(within), [], withinWidth);\n    const tryFit = (total, units, len) => {\n      const divide = apportion(units, total, len);\n      return divide.extra.length === 0 ? Optional.some(divide) : Optional.none();\n    };\n    const partition = (total, units, len, overflower) => {\n      const divide = tryFit(total, units, len).getOrThunk(() => apportion(units, total - len(overflower), len));\n      const within = divide.within;\n      const extra = divide.extra;\n      const withinWidth = divide.withinWidth;\n      if (extra.length === 1 && extra[0].width <= len(overflower)) {\n        return fitLast(within, extra, withinWidth);\n      } else if (extra.length >= 1) {\n        return overflow(within, extra, overflower, withinWidth);\n      } else {\n        return fitAll(within, extra, withinWidth);\n      }\n    };\n\n    const setGroups$1 = (toolbar, storedGroups) => {\n      const bGroups = map$2(storedGroups, g => premade(g));\n      Toolbar.setGroups(toolbar, bGroups);\n    };\n    const findFocusedComp = comps => findMap(comps, comp => search(comp.element).bind(focusedElm => comp.getSystem().getByDom(focusedElm).toOptional()));\n    const refresh$2 = (toolbar, detail, setOverflow) => {\n      const builtGroups = detail.builtGroups.get();\n      if (builtGroups.length === 0) {\n        return;\n      }\n      const primary = getPartOrDie(toolbar, detail, 'primary');\n      const overflowGroup = Coupling.getCoupled(toolbar, 'overflowGroup');\n      set$8(primary.element, 'visibility', 'hidden');\n      const groups = builtGroups.concat([overflowGroup]);\n      const focusedComp = findFocusedComp(groups);\n      setOverflow([]);\n      setGroups$1(primary, groups);\n      const availableWidth = get$c(primary.element);\n      const overflows = partition(availableWidth, detail.builtGroups.get(), comp => Math.ceil(comp.element.dom.getBoundingClientRect().width), overflowGroup);\n      if (overflows.extra.length === 0) {\n        Replacing.remove(primary, overflowGroup);\n        setOverflow([]);\n      } else {\n        setGroups$1(primary, overflows.within);\n        setOverflow(overflows.extra);\n      }\n      remove$6(primary.element, 'visibility');\n      reflow(primary.element);\n      focusedComp.each(Focusing.focus);\n    };\n\n    const schema$c = constant$1([\n      field('splitToolbarBehaviours', [Coupling]),\n      customField('builtGroups', () => Cell([]))\n    ]);\n\n    const schema$b = constant$1([\n      markers$1(['overflowToggledClass']),\n      optionFunction('getOverflowBounds'),\n      required$1('lazySink'),\n      customField('overflowGroups', () => Cell([])),\n      onHandler('onOpened'),\n      onHandler('onClosed')\n    ].concat(schema$c()));\n    const parts$7 = constant$1([\n      required({\n        factory: Toolbar,\n        schema: schema$e(),\n        name: 'primary'\n      }),\n      external({\n        schema: schema$e(),\n        name: 'overflow'\n      }),\n      external({ name: 'overflow-button' }),\n      external({ name: 'overflow-group' })\n    ]);\n\n    const expandable = constant$1((element, available) => {\n      setMax(element, Math.floor(available));\n    });\n\n    const schema$a = constant$1([\n      markers$1(['toggledClass']),\n      required$1('lazySink'),\n      requiredFunction('fetch'),\n      optionFunction('getBounds'),\n      optionObjOf('fireDismissalEventInstead', [defaulted('event', dismissRequested())]),\n      schema$y(),\n      onHandler('onToggled')\n    ]);\n    const parts$6 = constant$1([\n      external({\n        name: 'button',\n        overrides: detail => ({\n          dom: { attributes: { 'aria-haspopup': 'true' } },\n          buttonBehaviours: derive$1([Toggling.config({\n              toggleClass: detail.markers.toggledClass,\n              aria: { mode: 'expanded' },\n              toggleOnExecute: false,\n              onToggled: detail.onToggled\n            })])\n        })\n      }),\n      external({\n        factory: Toolbar,\n        schema: schema$e(),\n        name: 'toolbar',\n        overrides: detail => {\n          return {\n            toolbarBehaviours: derive$1([Keying.config({\n                mode: 'cyclic',\n                onEscape: comp => {\n                  getPart(comp, detail, 'button').each(Focusing.focus);\n                  return Optional.none();\n                }\n              })])\n          };\n        }\n      })\n    ]);\n\n    const shouldSkipFocus = value$2();\n    const toggleWithoutFocusing = (button, externals) => {\n      shouldSkipFocus.set(true);\n      toggle(button, externals);\n      shouldSkipFocus.clear();\n    };\n    const toggle = (button, externals) => {\n      const toolbarSandbox = Coupling.getCoupled(button, 'toolbarSandbox');\n      if (Sandboxing.isOpen(toolbarSandbox)) {\n        Sandboxing.close(toolbarSandbox);\n      } else {\n        Sandboxing.open(toolbarSandbox, externals.toolbar());\n      }\n    };\n    const position = (button, toolbar, detail, layouts) => {\n      const bounds = detail.getBounds.map(bounder => bounder());\n      const sink = detail.lazySink(button).getOrDie();\n      Positioning.positionWithinBounds(sink, toolbar, {\n        anchor: {\n          type: 'hotspot',\n          hotspot: button,\n          layouts,\n          overrides: { maxWidthFunction: expandable() }\n        }\n      }, bounds);\n    };\n    const setGroups = (button, toolbar, detail, layouts, groups) => {\n      Toolbar.setGroups(toolbar, groups);\n      position(button, toolbar, detail, layouts);\n      Toggling.on(button);\n    };\n    const makeSandbox = (button, spec, detail) => {\n      const ariaControls = manager();\n      const onOpen = (sandbox, toolbar) => {\n        const skipFocus = shouldSkipFocus.get().getOr(false);\n        detail.fetch().get(groups => {\n          setGroups(button, toolbar, detail, spec.layouts, groups);\n          ariaControls.link(button.element);\n          if (!skipFocus) {\n            Keying.focusIn(toolbar);\n          }\n        });\n      };\n      const onClose = () => {\n        Toggling.off(button);\n        if (!shouldSkipFocus.get().getOr(false)) {\n          Focusing.focus(button);\n        }\n        ariaControls.unlink(button.element);\n      };\n      return {\n        dom: {\n          tag: 'div',\n          attributes: { id: ariaControls.id }\n        },\n        behaviours: derive$1([\n          Keying.config({\n            mode: 'special',\n            onEscape: comp => {\n              Sandboxing.close(comp);\n              return Optional.some(true);\n            }\n          }),\n          Sandboxing.config({\n            onOpen,\n            onClose,\n            isPartOf: (container, data, queryElem) => {\n              return isPartOf$1(data, queryElem) || isPartOf$1(button, queryElem);\n            },\n            getAttachPoint: () => {\n              return detail.lazySink(button).getOrDie();\n            }\n          }),\n          Receiving.config({\n            channels: {\n              ...receivingChannel$1({\n                isExtraPart: never,\n                ...detail.fireDismissalEventInstead.map(fe => ({ fireEventInstead: { event: fe.event } })).getOr({})\n              }),\n              ...receivingChannel({\n                doReposition: () => {\n                  Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox')).each(toolbar => {\n                    position(button, toolbar, detail, spec.layouts);\n                  });\n                }\n              })\n            }\n          })\n        ])\n      };\n    };\n    const factory$c = (detail, components, spec, externals) => ({\n      ...Button.sketch({\n        ...externals.button(),\n        action: button => {\n          toggle(button, externals);\n        },\n        buttonBehaviours: SketchBehaviours.augment({ dump: externals.button().buttonBehaviours }, [Coupling.config({\n            others: {\n              toolbarSandbox: button => {\n                return makeSandbox(button, spec, detail);\n              }\n            }\n          })])\n      }),\n      apis: {\n        setGroups: (button, groups) => {\n          Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox')).each(toolbar => {\n            setGroups(button, toolbar, detail, spec.layouts, groups);\n          });\n        },\n        reposition: button => {\n          Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox')).each(toolbar => {\n            position(button, toolbar, detail, spec.layouts);\n          });\n        },\n        toggle: button => {\n          toggle(button, externals);\n        },\n        toggleWithoutFocusing: button => {\n          toggleWithoutFocusing(button, externals);\n        },\n        getToolbar: button => {\n          return Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox'));\n        },\n        isOpen: button => {\n          return Sandboxing.isOpen(Coupling.getCoupled(button, 'toolbarSandbox'));\n        }\n      }\n    });\n    const FloatingToolbarButton = composite({\n      name: 'FloatingToolbarButton',\n      factory: factory$c,\n      configFields: schema$a(),\n      partFields: parts$6(),\n      apis: {\n        setGroups: (apis, button, groups) => {\n          apis.setGroups(button, groups);\n        },\n        reposition: (apis, button) => {\n          apis.reposition(button);\n        },\n        toggle: (apis, button) => {\n          apis.toggle(button);\n        },\n        toggleWithoutFocusing: (apis, button) => {\n          apis.toggleWithoutFocusing(button);\n        },\n        getToolbar: (apis, button) => apis.getToolbar(button),\n        isOpen: (apis, button) => apis.isOpen(button)\n      }\n    });\n\n    const schema$9 = constant$1([\n      required$1('items'),\n      markers$1(['itemSelector']),\n      field('tgroupBehaviours', [Keying])\n    ]);\n    const parts$5 = constant$1([group({\n        name: 'items',\n        unit: 'item'\n      })]);\n\n    const factory$b = (detail, components, _spec, _externals) => ({\n      uid: detail.uid,\n      dom: detail.dom,\n      components,\n      behaviours: augment(detail.tgroupBehaviours, [Keying.config({\n          mode: 'flow',\n          selector: detail.markers.itemSelector\n        })]),\n      domModification: { attributes: { role: 'toolbar' } }\n    });\n    const ToolbarGroup = composite({\n      name: 'ToolbarGroup',\n      configFields: schema$9(),\n      partFields: parts$5(),\n      factory: factory$b\n    });\n\n    const buildGroups = comps => map$2(comps, g => premade(g));\n    const refresh$1 = (toolbar, memFloatingToolbarButton, detail) => {\n      refresh$2(toolbar, detail, overflowGroups => {\n        detail.overflowGroups.set(overflowGroups);\n        memFloatingToolbarButton.getOpt(toolbar).each(floatingToolbarButton => {\n          FloatingToolbarButton.setGroups(floatingToolbarButton, buildGroups(overflowGroups));\n        });\n      });\n    };\n    const factory$a = (detail, components, spec, externals) => {\n      const memFloatingToolbarButton = record(FloatingToolbarButton.sketch({\n        fetch: () => Future.nu(resolve => {\n          resolve(buildGroups(detail.overflowGroups.get()));\n        }),\n        layouts: {\n          onLtr: () => [\n            southwest$2,\n            southeast$2\n          ],\n          onRtl: () => [\n            southeast$2,\n            southwest$2\n          ],\n          onBottomLtr: () => [\n            northwest$2,\n            northeast$2\n          ],\n          onBottomRtl: () => [\n            northeast$2,\n            northwest$2\n          ]\n        },\n        getBounds: spec.getOverflowBounds,\n        lazySink: detail.lazySink,\n        fireDismissalEventInstead: {},\n        markers: { toggledClass: detail.markers.overflowToggledClass },\n        parts: {\n          button: externals['overflow-button'](),\n          toolbar: externals.overflow()\n        },\n        onToggled: (comp, state) => detail[state ? 'onOpened' : 'onClosed'](comp)\n      }));\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components,\n        behaviours: augment(detail.splitToolbarBehaviours, [Coupling.config({\n            others: {\n              overflowGroup: () => {\n                return ToolbarGroup.sketch({\n                  ...externals['overflow-group'](),\n                  items: [memFloatingToolbarButton.asSpec()]\n                });\n              }\n            }\n          })]),\n        apis: {\n          setGroups: (toolbar, groups) => {\n            detail.builtGroups.set(map$2(groups, toolbar.getSystem().build));\n            refresh$1(toolbar, memFloatingToolbarButton, detail);\n          },\n          refresh: toolbar => refresh$1(toolbar, memFloatingToolbarButton, detail),\n          toggle: toolbar => {\n            memFloatingToolbarButton.getOpt(toolbar).each(floatingToolbarButton => {\n              FloatingToolbarButton.toggle(floatingToolbarButton);\n            });\n          },\n          toggleWithoutFocusing: toolbar => {\n            memFloatingToolbarButton.getOpt(toolbar).each(FloatingToolbarButton.toggleWithoutFocusing);\n          },\n          isOpen: toolbar => memFloatingToolbarButton.getOpt(toolbar).map(FloatingToolbarButton.isOpen).getOr(false),\n          reposition: toolbar => {\n            memFloatingToolbarButton.getOpt(toolbar).each(floatingToolbarButton => {\n              FloatingToolbarButton.reposition(floatingToolbarButton);\n            });\n          },\n          getOverflow: toolbar => memFloatingToolbarButton.getOpt(toolbar).bind(FloatingToolbarButton.getToolbar)\n        },\n        domModification: { attributes: { role: 'group' } }\n      };\n    };\n    const SplitFloatingToolbar = composite({\n      name: 'SplitFloatingToolbar',\n      configFields: schema$b(),\n      partFields: parts$7(),\n      factory: factory$a,\n      apis: {\n        setGroups: (apis, toolbar, groups) => {\n          apis.setGroups(toolbar, groups);\n        },\n        refresh: (apis, toolbar) => {\n          apis.refresh(toolbar);\n        },\n        reposition: (apis, toolbar) => {\n          apis.reposition(toolbar);\n        },\n        toggle: (apis, toolbar) => {\n          apis.toggle(toolbar);\n        },\n        toggleWithoutFocusing: (apis, toolbar) => {\n          apis.toggle(toolbar);\n        },\n        isOpen: (apis, toolbar) => apis.isOpen(toolbar),\n        getOverflow: (apis, toolbar) => apis.getOverflow(toolbar)\n      }\n    });\n\n    const schema$8 = constant$1([\n      markers$1([\n        'closedClass',\n        'openClass',\n        'shrinkingClass',\n        'growingClass',\n        'overflowToggledClass'\n      ]),\n      onHandler('onOpened'),\n      onHandler('onClosed')\n    ].concat(schema$c()));\n    const parts$4 = constant$1([\n      required({\n        factory: Toolbar,\n        schema: schema$e(),\n        name: 'primary'\n      }),\n      required({\n        factory: Toolbar,\n        schema: schema$e(),\n        name: 'overflow',\n        overrides: detail => {\n          return {\n            toolbarBehaviours: derive$1([\n              Sliding.config({\n                dimension: { property: 'height' },\n                closedClass: detail.markers.closedClass,\n                openClass: detail.markers.openClass,\n                shrinkingClass: detail.markers.shrinkingClass,\n                growingClass: detail.markers.growingClass,\n                onShrunk: comp => {\n                  getPart(comp, detail, 'overflow-button').each(button => {\n                    Toggling.off(button);\n                    Focusing.focus(button);\n                  });\n                  detail.onClosed(comp);\n                },\n                onGrown: comp => {\n                  Keying.focusIn(comp);\n                  detail.onOpened(comp);\n                },\n                onStartGrow: comp => {\n                  getPart(comp, detail, 'overflow-button').each(Toggling.on);\n                }\n              }),\n              Keying.config({\n                mode: 'acyclic',\n                onEscape: comp => {\n                  getPart(comp, detail, 'overflow-button').each(Focusing.focus);\n                  return Optional.some(true);\n                }\n              })\n            ])\n          };\n        }\n      }),\n      external({\n        name: 'overflow-button',\n        overrides: detail => ({\n          buttonBehaviours: derive$1([Toggling.config({\n              toggleClass: detail.markers.overflowToggledClass,\n              aria: { mode: 'pressed' },\n              toggleOnExecute: false\n            })])\n        })\n      }),\n      external({ name: 'overflow-group' })\n    ]);\n\n    const isOpen = (toolbar, detail) => getPart(toolbar, detail, 'overflow').map(Sliding.hasGrown).getOr(false);\n    const toggleToolbar = (toolbar, detail) => {\n      getPart(toolbar, detail, 'overflow-button').bind(() => getPart(toolbar, detail, 'overflow')).each(overf => {\n        refresh(toolbar, detail);\n        Sliding.toggleGrow(overf);\n      });\n    };\n    const refresh = (toolbar, detail) => {\n      getPart(toolbar, detail, 'overflow').each(overflow => {\n        refresh$2(toolbar, detail, groups => {\n          const builtGroups = map$2(groups, g => premade(g));\n          Toolbar.setGroups(overflow, builtGroups);\n        });\n        getPart(toolbar, detail, 'overflow-button').each(button => {\n          if (Sliding.hasGrown(overflow)) {\n            Toggling.on(button);\n          }\n        });\n        Sliding.refresh(overflow);\n      });\n    };\n    const factory$9 = (detail, components, spec, externals) => {\n      const toolbarToggleEvent = 'alloy.toolbar.toggle';\n      const doSetGroups = (toolbar, groups) => {\n        const built = map$2(groups, toolbar.getSystem().build);\n        detail.builtGroups.set(built);\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components,\n        behaviours: augment(detail.splitToolbarBehaviours, [\n          Coupling.config({\n            others: {\n              overflowGroup: toolbar => {\n                return ToolbarGroup.sketch({\n                  ...externals['overflow-group'](),\n                  items: [Button.sketch({\n                      ...externals['overflow-button'](),\n                      action: _button => {\n                        emit(toolbar, toolbarToggleEvent);\n                      }\n                    })]\n                });\n              }\n            }\n          }),\n          config('toolbar-toggle-events', [run$1(toolbarToggleEvent, toolbar => {\n              toggleToolbar(toolbar, detail);\n            })])\n        ]),\n        apis: {\n          setGroups: (toolbar, groups) => {\n            doSetGroups(toolbar, groups);\n            refresh(toolbar, detail);\n          },\n          refresh: toolbar => refresh(toolbar, detail),\n          toggle: toolbar => toggleToolbar(toolbar, detail),\n          isOpen: toolbar => isOpen(toolbar, detail)\n        },\n        domModification: { attributes: { role: 'group' } }\n      };\n    };\n    const SplitSlidingToolbar = composite({\n      name: 'SplitSlidingToolbar',\n      configFields: schema$8(),\n      partFields: parts$4(),\n      factory: factory$9,\n      apis: {\n        setGroups: (apis, toolbar, groups) => {\n          apis.setGroups(toolbar, groups);\n        },\n        refresh: (apis, toolbar) => {\n          apis.refresh(toolbar);\n        },\n        toggle: (apis, toolbar) => {\n          apis.toggle(toolbar);\n        },\n        isOpen: (apis, toolbar) => apis.isOpen(toolbar)\n      }\n    });\n\n    const renderToolbarGroupCommon = toolbarGroup => {\n      const attributes = toolbarGroup.title.fold(() => ({}), title => ({ attributes: { title } }));\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-toolbar__group'],\n          ...attributes\n        },\n        components: [ToolbarGroup.parts.items({})],\n        items: toolbarGroup.items,\n        markers: { itemSelector: '*:not(.tox-split-button) > .tox-tbtn:not([disabled]), ' + '.tox-split-button:not([disabled]), ' + '.tox-toolbar-nav-js:not([disabled]), ' + '.tox-number-input:not([disabled])' },\n        tgroupBehaviours: derive$1([\n          Tabstopping.config({}),\n          Focusing.config({})\n        ])\n      };\n    };\n    const renderToolbarGroup = toolbarGroup => ToolbarGroup.sketch(renderToolbarGroupCommon(toolbarGroup));\n    const getToolbarBehaviours = (toolbarSpec, modeName) => {\n      const onAttached = runOnAttached(component => {\n        const groups = map$2(toolbarSpec.initGroups, renderToolbarGroup);\n        Toolbar.setGroups(component, groups);\n      });\n      return derive$1([\n        DisablingConfigs.toolbarButton(toolbarSpec.providers.isDisabled),\n        receivingConfig(),\n        Keying.config({\n          mode: modeName,\n          onEscape: toolbarSpec.onEscape,\n          selector: '.tox-toolbar__group'\n        }),\n        config('toolbar-events', [onAttached])\n      ]);\n    };\n    const renderMoreToolbarCommon = toolbarSpec => {\n      const modeName = toolbarSpec.cyclicKeying ? 'cyclic' : 'acyclic';\n      return {\n        uid: toolbarSpec.uid,\n        dom: {\n          tag: 'div',\n          classes: ['tox-toolbar-overlord']\n        },\n        parts: {\n          'overflow-group': renderToolbarGroupCommon({\n            title: Optional.none(),\n            items: []\n          }),\n          'overflow-button': renderIconButtonSpec({\n            name: 'more',\n            icon: Optional.some('more-drawer'),\n            enabled: true,\n            tooltip: Optional.some('Reveal or hide additional toolbar items'),\n            primary: false,\n            buttonType: Optional.none(),\n            borderless: false\n          }, Optional.none(), toolbarSpec.providers, [], 'overflow-button')\n        },\n        splitToolbarBehaviours: getToolbarBehaviours(toolbarSpec, modeName)\n      };\n    };\n    const renderFloatingMoreToolbar = toolbarSpec => {\n      const baseSpec = renderMoreToolbarCommon(toolbarSpec);\n      const overflowXOffset = 4;\n      const primary = SplitFloatingToolbar.parts.primary({\n        dom: {\n          tag: 'div',\n          classes: ['tox-toolbar__primary']\n        }\n      });\n      return SplitFloatingToolbar.sketch({\n        ...baseSpec,\n        lazySink: toolbarSpec.getSink,\n        getOverflowBounds: () => {\n          const headerElem = toolbarSpec.moreDrawerData.lazyHeader().element;\n          const headerBounds = absolute$2(headerElem);\n          const docElem = documentElement(headerElem);\n          const docBounds = absolute$2(docElem);\n          const height = Math.max(docElem.dom.scrollHeight, docBounds.height);\n          return bounds(headerBounds.x + overflowXOffset, docBounds.y, headerBounds.width - overflowXOffset * 2, height);\n        },\n        parts: {\n          ...baseSpec.parts,\n          overflow: {\n            dom: {\n              tag: 'div',\n              classes: ['tox-toolbar__overflow'],\n              attributes: toolbarSpec.attributes\n            }\n          }\n        },\n        components: [primary],\n        markers: { overflowToggledClass: 'tox-tbtn--enabled' },\n        onOpened: comp => toolbarSpec.onToggled(comp, true),\n        onClosed: comp => toolbarSpec.onToggled(comp, false)\n      });\n    };\n    const renderSlidingMoreToolbar = toolbarSpec => {\n      const primary = SplitSlidingToolbar.parts.primary({\n        dom: {\n          tag: 'div',\n          classes: ['tox-toolbar__primary']\n        }\n      });\n      const overflow = SplitSlidingToolbar.parts.overflow({\n        dom: {\n          tag: 'div',\n          classes: ['tox-toolbar__overflow']\n        }\n      });\n      const baseSpec = renderMoreToolbarCommon(toolbarSpec);\n      return SplitSlidingToolbar.sketch({\n        ...baseSpec,\n        components: [\n          primary,\n          overflow\n        ],\n        markers: {\n          openClass: 'tox-toolbar__overflow--open',\n          closedClass: 'tox-toolbar__overflow--closed',\n          growingClass: 'tox-toolbar__overflow--growing',\n          shrinkingClass: 'tox-toolbar__overflow--shrinking',\n          overflowToggledClass: 'tox-tbtn--enabled'\n        },\n        onOpened: comp => {\n          comp.getSystem().broadcastOn([toolbarHeightChange()], { type: 'opened' });\n          toolbarSpec.onToggled(comp, true);\n        },\n        onClosed: comp => {\n          comp.getSystem().broadcastOn([toolbarHeightChange()], { type: 'closed' });\n          toolbarSpec.onToggled(comp, false);\n        }\n      });\n    };\n    const renderToolbar = toolbarSpec => {\n      const modeName = toolbarSpec.cyclicKeying ? 'cyclic' : 'acyclic';\n      return Toolbar.sketch({\n        uid: toolbarSpec.uid,\n        dom: {\n          tag: 'div',\n          classes: ['tox-toolbar'].concat(toolbarSpec.type === ToolbarMode$1.scrolling ? ['tox-toolbar--scrolling'] : [])\n        },\n        components: [Toolbar.parts.groups({})],\n        toolbarBehaviours: getToolbarBehaviours(toolbarSpec, modeName)\n      });\n    };\n\n    const baseButtonFields = [\n      optionalText,\n      optionalIcon,\n      optionString('tooltip'),\n      defaultedStringEnum('buttonType', 'secondary', [\n        'primary',\n        'secondary'\n      ]),\n      defaultedBoolean('borderless', false),\n      requiredFunction('onAction')\n    ];\n    const normalButtonFields = [\n      ...baseButtonFields,\n      text,\n      requiredStringEnum('type', ['button'])\n    ];\n    const toggleButtonFields = [\n      ...baseButtonFields,\n      defaultedBoolean('active', false),\n      requiredStringEnum('type', ['togglebutton'])\n    ];\n    const schemaWithoutGroupButton = {\n      button: normalButtonFields,\n      togglebutton: toggleButtonFields\n    };\n    const groupFields = [\n      requiredStringEnum('type', ['group']),\n      defaultedArrayOf('buttons', [], choose$1('type', schemaWithoutGroupButton))\n    ];\n    const viewButtonSchema = choose$1('type', {\n      ...schemaWithoutGroupButton,\n      group: groupFields\n    });\n\n    const viewSchema = objOf([\n      defaultedArrayOf('buttons', [], viewButtonSchema),\n      requiredFunction('onShow'),\n      requiredFunction('onHide')\n    ]);\n    const createView = spec => asRaw('view', viewSchema, spec);\n\n    const renderButton = (spec, providers) => {\n      var _a, _b;\n      const isToggleButton = spec.type === 'togglebutton';\n      const optMemIcon = spec.icon.map(memIcon => renderReplaceableIconFromPack(memIcon, providers.icons)).map(record);\n      const getAction = () => comp => {\n        const setIcon = newIcon => {\n          optMemIcon.map(memIcon => memIcon.getOpt(comp).each(displayIcon => {\n            Replacing.set(displayIcon, [renderReplaceableIconFromPack(newIcon, providers.icons)]);\n          }));\n        };\n        const setActive = state => {\n          const elm = comp.element;\n          if (state) {\n            add$2(elm, 'tox-button--enabled');\n            set$9(elm, 'aria-pressed', true);\n          } else {\n            remove$2(elm, 'tox-button--enabled');\n            remove$7(elm, 'aria-pressed');\n          }\n        };\n        const isActive = () => has(comp.element, 'tox-button--enabled');\n        if (isToggleButton) {\n          return spec.onAction({\n            setIcon,\n            setActive,\n            isActive\n          });\n        }\n        if (spec.type === 'button') {\n          return spec.onAction({ setIcon });\n        }\n      };\n      const action = getAction();\n      const buttonSpec = {\n        ...spec,\n        name: isToggleButton ? spec.text.getOr(spec.icon.getOr('')) : (_a = spec.text) !== null && _a !== void 0 ? _a : spec.icon.getOr(''),\n        primary: spec.buttonType === 'primary',\n        buttonType: Optional.from(spec.buttonType),\n        tooltip: spec.tooltip,\n        icon: spec.icon,\n        enabled: true,\n        borderless: spec.borderless\n      };\n      const buttonTypeClasses = calculateClassesFromButtonType((_b = spec.buttonType) !== null && _b !== void 0 ? _b : 'secondary');\n      const optTranslatedText = isToggleButton ? spec.text.map(providers.translate) : Optional.some(providers.translate(spec.text));\n      const optTranslatedTextComponed = optTranslatedText.map(text$2);\n      const ariaLabelAttributes = buttonSpec.tooltip.or(optTranslatedText).map(al => ({ 'aria-label': providers.translate(al) })).getOr({});\n      const optIconSpec = optMemIcon.map(memIcon => memIcon.asSpec());\n      const components = componentRenderPipeline([\n        optIconSpec,\n        optTranslatedTextComponed\n      ]);\n      const hasIconAndText = spec.icon.isSome() && optTranslatedTextComponed.isSome();\n      const dom = {\n        tag: 'button',\n        classes: buttonTypeClasses.concat(...spec.icon.isSome() && !hasIconAndText ? ['tox-button--icon'] : []).concat(...hasIconAndText ? ['tox-button--icon-and-text'] : []).concat(...spec.borderless ? ['tox-button--naked'] : []).concat(...spec.type === 'togglebutton' && spec.active ? ['tox-button--enabled'] : []),\n        attributes: ariaLabelAttributes\n      };\n      const extraBehaviours = [];\n      const iconButtonSpec = renderCommonSpec(buttonSpec, Optional.some(action), extraBehaviours, dom, components, spec.tooltip, providers);\n      return Button.sketch(iconButtonSpec);\n    };\n\n    const renderViewButton = (spec, providers) => renderButton(spec, providers);\n    const renderButtonsGroup = (spec, providers) => {\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-view__toolbar__group']\n        },\n        components: map$2(spec.buttons, button => renderViewButton(button, providers))\n      };\n    };\n    const deviceDetection = detect$1().deviceType;\n    const isPhone = deviceDetection.isPhone();\n    const isTablet = deviceDetection.isTablet();\n    const renderViewHeader = spec => {\n      let hasGroups = false;\n      const endButtons = map$2(spec.buttons, btnspec => {\n        if (btnspec.type === 'group') {\n          hasGroups = true;\n          return renderButtonsGroup(btnspec, spec.providers);\n        } else {\n          return renderViewButton(btnspec, spec.providers);\n        }\n      });\n      return {\n        uid: spec.uid,\n        dom: {\n          tag: 'div',\n          classes: [\n            !hasGroups ? 'tox-view__header' : 'tox-view__toolbar',\n            ...isPhone || isTablet ? [\n              'tox-view--mobile',\n              'tox-view--scrolling'\n            ] : []\n          ]\n        },\n        behaviours: derive$1([\n          Focusing.config({}),\n          Keying.config({\n            mode: 'flow',\n            selector: 'button, .tox-button',\n            focusInside: FocusInsideModes.OnEnterOrSpaceMode\n          })\n        ]),\n        components: hasGroups ? endButtons : [\n          Container.sketch({\n            dom: {\n              tag: 'div',\n              classes: ['tox-view__header-start']\n            },\n            components: []\n          }),\n          Container.sketch({\n            dom: {\n              tag: 'div',\n              classes: ['tox-view__header-end']\n            },\n            components: endButtons\n          })\n        ]\n      };\n    };\n    const renderViewPane = spec => {\n      return {\n        uid: spec.uid,\n        dom: {\n          tag: 'div',\n          classes: ['tox-view__pane']\n        }\n      };\n    };\n    const factory$8 = (detail, components, _spec, _externals) => {\n      const apis = {\n        getPane: comp => parts$a.getPart(comp, detail, 'pane'),\n        getOnShow: _comp => detail.viewConfig.onShow,\n        getOnHide: _comp => detail.viewConfig.onHide\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components,\n        apis\n      };\n    };\n    var View = composite({\n      name: 'silver.View',\n      configFields: [required$1('viewConfig')],\n      partFields: [\n        optional({\n          factory: { sketch: renderViewHeader },\n          schema: [\n            required$1('buttons'),\n            required$1('providers')\n          ],\n          name: 'header'\n        }),\n        optional({\n          factory: { sketch: renderViewPane },\n          schema: [],\n          name: 'pane'\n        })\n      ],\n      factory: factory$8,\n      apis: {\n        getPane: (apis, comp) => apis.getPane(comp),\n        getOnShow: (apis, comp) => apis.getOnShow(comp),\n        getOnHide: (apis, comp) => apis.getOnHide(comp)\n      }\n    });\n\n    const makeViews = (parts, viewConfigs, providers) => {\n      return mapToArray(viewConfigs, (config, name) => {\n        const internalViewConfig = getOrDie(createView(config));\n        return parts.slot(name, View.sketch({\n          dom: {\n            tag: 'div',\n            classes: ['tox-view']\n          },\n          viewConfig: internalViewConfig,\n          components: [\n            ...internalViewConfig.buttons.length > 0 ? [View.parts.header({\n                buttons: internalViewConfig.buttons,\n                providers\n              })] : [],\n            View.parts.pane({})\n          ]\n        }));\n      });\n    };\n    const makeSlotContainer = (viewConfigs, providers) => SlotContainer.sketch(parts => ({\n      dom: {\n        tag: 'div',\n        classes: ['tox-view-wrap__slot-container']\n      },\n      components: makeViews(parts, viewConfigs, providers),\n      slotBehaviours: SimpleBehaviours.unnamedEvents([runOnAttached(slotContainer => SlotContainer.hideAllSlots(slotContainer))])\n    }));\n    const getCurrentName = slotContainer => {\n      return find$5(SlotContainer.getSlotNames(slotContainer), name => SlotContainer.isShowing(slotContainer, name));\n    };\n    const hideContainer = comp => {\n      const element = comp.element;\n      set$8(element, 'display', 'none');\n      set$9(element, 'aria-hidden', 'true');\n    };\n    const showContainer = comp => {\n      const element = comp.element;\n      remove$6(element, 'display');\n      remove$7(element, 'aria-hidden');\n    };\n    const makeViewInstanceApi = slot => ({ getContainer: constant$1(slot) });\n    const runOnPaneWithInstanceApi = (slotContainer, name, get) => {\n      SlotContainer.getSlot(slotContainer, name).each(view => {\n        View.getPane(view).each(pane => {\n          const onCallback = get(view);\n          onCallback(makeViewInstanceApi(pane.element.dom));\n        });\n      });\n    };\n    const runOnShow = (slotContainer, name) => runOnPaneWithInstanceApi(slotContainer, name, View.getOnShow);\n    const runOnHide = (slotContainer, name) => runOnPaneWithInstanceApi(slotContainer, name, View.getOnHide);\n    const factory$7 = (detail, spec) => {\n      const setViews = (comp, viewConfigs) => {\n        Replacing.set(comp, [makeSlotContainer(viewConfigs, spec.backstage.shared.providers)]);\n      };\n      const whichView = comp => {\n        return Composing.getCurrent(comp).bind(getCurrentName);\n      };\n      const toggleView = (comp, showMainView, hideMainView, name) => {\n        return Composing.getCurrent(comp).exists(slotContainer => {\n          const optCurrentSlotName = getCurrentName(slotContainer);\n          const isTogglingCurrentView = optCurrentSlotName.exists(current => name === current);\n          const exists = SlotContainer.getSlot(slotContainer, name).isSome();\n          if (exists) {\n            SlotContainer.hideAllSlots(slotContainer);\n            if (!isTogglingCurrentView) {\n              hideMainView();\n              showContainer(comp);\n              SlotContainer.showSlot(slotContainer, name);\n              runOnShow(slotContainer, name);\n            } else {\n              hideContainer(comp);\n              showMainView();\n            }\n            optCurrentSlotName.each(prevName => runOnHide(slotContainer, prevName));\n          }\n          return exists;\n        });\n      };\n      const apis = {\n        setViews,\n        whichView,\n        toggleView\n      };\n      return {\n        uid: detail.uid,\n        dom: {\n          tag: 'div',\n          classes: ['tox-view-wrap'],\n          attributes: { 'aria-hidden': 'true' },\n          styles: { display: 'none' }\n        },\n        components: [],\n        behaviours: derive$1([\n          Replacing.config({}),\n          Composing.config({\n            find: comp => {\n              const children = Replacing.contents(comp);\n              return head(children);\n            }\n          })\n        ]),\n        apis\n      };\n    };\n    var ViewWrapper = single({\n      factory: factory$7,\n      name: 'silver.ViewWrapper',\n      configFields: [required$1('backstage')],\n      apis: {\n        setViews: (apis, comp, views) => apis.setViews(comp, views),\n        toggleView: (apis, comp, outerContainer, editorCont, name) => apis.toggleView(comp, outerContainer, editorCont, name),\n        whichView: (apis, comp) => apis.whichView(comp)\n      }\n    });\n\n    const factory$6 = (detail, components, _spec) => {\n      let toolbarDrawerOpenState = false;\n      const apis = {\n        getSocket: comp => {\n          return parts$a.getPart(comp, detail, 'socket');\n        },\n        setSidebar: (comp, panelConfigs, showSidebar) => {\n          parts$a.getPart(comp, detail, 'sidebar').each(sidebar => setSidebar(sidebar, panelConfigs, showSidebar));\n        },\n        toggleSidebar: (comp, name) => {\n          parts$a.getPart(comp, detail, 'sidebar').each(sidebar => toggleSidebar(sidebar, name));\n        },\n        whichSidebar: comp => {\n          return parts$a.getPart(comp, detail, 'sidebar').bind(whichSidebar).getOrNull();\n        },\n        getHeader: comp => {\n          return parts$a.getPart(comp, detail, 'header');\n        },\n        getToolbar: comp => {\n          return parts$a.getPart(comp, detail, 'toolbar');\n        },\n        setToolbar: (comp, groups) => {\n          parts$a.getPart(comp, detail, 'toolbar').each(toolbar => {\n            const renderedGroups = map$2(groups, renderToolbarGroup);\n            toolbar.getApis().setGroups(toolbar, renderedGroups);\n          });\n        },\n        setToolbars: (comp, toolbars) => {\n          parts$a.getPart(comp, detail, 'multiple-toolbar').each(mToolbar => {\n            const renderedToolbars = map$2(toolbars, g => map$2(g, renderToolbarGroup));\n            CustomList.setItems(mToolbar, renderedToolbars);\n          });\n        },\n        refreshToolbar: comp => {\n          const toolbar = parts$a.getPart(comp, detail, 'toolbar');\n          toolbar.each(toolbar => toolbar.getApis().refresh(toolbar));\n        },\n        toggleToolbarDrawer: comp => {\n          parts$a.getPart(comp, detail, 'toolbar').each(toolbar => {\n            mapFrom(toolbar.getApis().toggle, toggle => toggle(toolbar));\n          });\n        },\n        toggleToolbarDrawerWithoutFocusing: comp => {\n          parts$a.getPart(comp, detail, 'toolbar').each(toolbar => {\n            mapFrom(toolbar.getApis().toggleWithoutFocusing, toggleWithoutFocusing => toggleWithoutFocusing(toolbar));\n          });\n        },\n        isToolbarDrawerToggled: comp => {\n          return parts$a.getPart(comp, detail, 'toolbar').bind(toolbar => Optional.from(toolbar.getApis().isOpen).map(isOpen => isOpen(toolbar))).getOr(false);\n        },\n        getThrobber: comp => {\n          return parts$a.getPart(comp, detail, 'throbber');\n        },\n        focusToolbar: comp => {\n          const optToolbar = parts$a.getPart(comp, detail, 'toolbar').orThunk(() => parts$a.getPart(comp, detail, 'multiple-toolbar'));\n          optToolbar.each(toolbar => {\n            Keying.focusIn(toolbar);\n          });\n        },\n        setMenubar: (comp, menus) => {\n          parts$a.getPart(comp, detail, 'menubar').each(menubar => {\n            SilverMenubar.setMenus(menubar, menus);\n          });\n        },\n        focusMenubar: comp => {\n          parts$a.getPart(comp, detail, 'menubar').each(menubar => {\n            SilverMenubar.focus(menubar);\n          });\n        },\n        setViews: (comp, viewConfigs) => {\n          parts$a.getPart(comp, detail, 'viewWrapper').each(wrapper => {\n            ViewWrapper.setViews(wrapper, viewConfigs);\n          });\n        },\n        toggleView: (comp, name) => {\n          return parts$a.getPart(comp, detail, 'viewWrapper').exists(wrapper => ViewWrapper.toggleView(wrapper, () => apis.showMainView(comp), () => apis.hideMainView(comp), name));\n        },\n        whichView: comp => {\n          return parts$a.getPart(comp, detail, 'viewWrapper').bind(ViewWrapper.whichView).getOrNull();\n        },\n        hideMainView: comp => {\n          toolbarDrawerOpenState = apis.isToolbarDrawerToggled(comp);\n          if (toolbarDrawerOpenState) {\n            apis.toggleToolbarDrawer(comp);\n          }\n          parts$a.getPart(comp, detail, 'editorContainer').each(editorContainer => {\n            const element = editorContainer.element;\n            set$8(element, 'display', 'none');\n            set$9(element, 'aria-hidden', 'true');\n          });\n        },\n        showMainView: comp => {\n          if (toolbarDrawerOpenState) {\n            apis.toggleToolbarDrawer(comp);\n          }\n          parts$a.getPart(comp, detail, 'editorContainer').each(editorContainer => {\n            const element = editorContainer.element;\n            remove$6(element, 'display');\n            remove$7(element, 'aria-hidden');\n          });\n        }\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components,\n        apis,\n        behaviours: detail.behaviours\n      };\n    };\n    const partMenubar = partType.optional({\n      factory: SilverMenubar,\n      name: 'menubar',\n      schema: [required$1('backstage')]\n    });\n    const toolbarFactory = spec => {\n      if (spec.type === ToolbarMode$1.sliding) {\n        return renderSlidingMoreToolbar;\n      } else if (spec.type === ToolbarMode$1.floating) {\n        return renderFloatingMoreToolbar;\n      } else {\n        return renderToolbar;\n      }\n    };\n    const partMultipleToolbar = partType.optional({\n      factory: {\n        sketch: spec => CustomList.sketch({\n          uid: spec.uid,\n          dom: spec.dom,\n          listBehaviours: derive$1([Keying.config({\n              mode: 'acyclic',\n              selector: '.tox-toolbar'\n            })]),\n          makeItem: () => renderToolbar({\n            type: spec.type,\n            uid: generate$6('multiple-toolbar-item'),\n            cyclicKeying: false,\n            initGroups: [],\n            providers: spec.providers,\n            onEscape: () => {\n              spec.onEscape();\n              return Optional.some(true);\n            }\n          }),\n          setupItem: (_mToolbar, tc, data, _index) => {\n            Toolbar.setGroups(tc, data);\n          },\n          shell: true\n        })\n      },\n      name: 'multiple-toolbar',\n      schema: [\n        required$1('dom'),\n        required$1('onEscape')\n      ]\n    });\n    const partToolbar = partType.optional({\n      factory: {\n        sketch: spec => {\n          const renderer = toolbarFactory(spec);\n          const toolbarSpec = {\n            type: spec.type,\n            uid: spec.uid,\n            onEscape: () => {\n              spec.onEscape();\n              return Optional.some(true);\n            },\n            onToggled: (_comp, state) => spec.onToolbarToggled(state),\n            cyclicKeying: false,\n            initGroups: [],\n            getSink: spec.getSink,\n            providers: spec.providers,\n            moreDrawerData: {\n              lazyToolbar: spec.lazyToolbar,\n              lazyMoreButton: spec.lazyMoreButton,\n              lazyHeader: spec.lazyHeader\n            },\n            attributes: spec.attributes\n          };\n          return renderer(toolbarSpec);\n        }\n      },\n      name: 'toolbar',\n      schema: [\n        required$1('dom'),\n        required$1('onEscape'),\n        required$1('getSink')\n      ]\n    });\n    const partHeader = partType.optional({\n      factory: { sketch: renderHeader },\n      name: 'header',\n      schema: [required$1('dom')]\n    });\n    const partSocket = partType.optional({\n      name: 'socket',\n      schema: [required$1('dom')]\n    });\n    const partSidebar = partType.optional({\n      factory: { sketch: renderSidebar },\n      name: 'sidebar',\n      schema: [required$1('dom')]\n    });\n    const partThrobber = partType.optional({\n      factory: { sketch: renderThrobber },\n      name: 'throbber',\n      schema: [required$1('dom')]\n    });\n    const partViewWrapper = partType.optional({\n      factory: ViewWrapper,\n      name: 'viewWrapper',\n      schema: [required$1('backstage')]\n    });\n    const renderEditorContainer = spec => ({\n      uid: spec.uid,\n      dom: {\n        tag: 'div',\n        classes: ['tox-editor-container']\n      },\n      components: spec.components\n    });\n    const partEditorContainer = partType.optional({\n      factory: { sketch: renderEditorContainer },\n      name: 'editorContainer',\n      schema: []\n    });\n    var OuterContainer = composite({\n      name: 'OuterContainer',\n      factory: factory$6,\n      configFields: [\n        required$1('dom'),\n        required$1('behaviours')\n      ],\n      partFields: [\n        partHeader,\n        partMenubar,\n        partToolbar,\n        partMultipleToolbar,\n        partSocket,\n        partSidebar,\n        partThrobber,\n        partViewWrapper,\n        partEditorContainer\n      ],\n      apis: {\n        getSocket: (apis, comp) => {\n          return apis.getSocket(comp);\n        },\n        setSidebar: (apis, comp, panelConfigs, showSidebar) => {\n          apis.setSidebar(comp, panelConfigs, showSidebar);\n        },\n        toggleSidebar: (apis, comp, name) => {\n          apis.toggleSidebar(comp, name);\n        },\n        whichSidebar: (apis, comp) => {\n          return apis.whichSidebar(comp);\n        },\n        getHeader: (apis, comp) => {\n          return apis.getHeader(comp);\n        },\n        getToolbar: (apis, comp) => {\n          return apis.getToolbar(comp);\n        },\n        setToolbar: (apis, comp, groups) => {\n          apis.setToolbar(comp, groups);\n        },\n        setToolbars: (apis, comp, toolbars) => {\n          apis.setToolbars(comp, toolbars);\n        },\n        refreshToolbar: (apis, comp) => {\n          return apis.refreshToolbar(comp);\n        },\n        toggleToolbarDrawer: (apis, comp) => {\n          apis.toggleToolbarDrawer(comp);\n        },\n        toggleToolbarDrawerWithoutFocusing: (apis, comp) => {\n          apis.toggleToolbarDrawerWithoutFocusing(comp);\n        },\n        isToolbarDrawerToggled: (apis, comp) => {\n          return apis.isToolbarDrawerToggled(comp);\n        },\n        getThrobber: (apis, comp) => {\n          return apis.getThrobber(comp);\n        },\n        setMenubar: (apis, comp, menus) => {\n          apis.setMenubar(comp, menus);\n        },\n        focusMenubar: (apis, comp) => {\n          apis.focusMenubar(comp);\n        },\n        focusToolbar: (apis, comp) => {\n          apis.focusToolbar(comp);\n        },\n        setViews: (apis, comp, views) => {\n          apis.setViews(comp, views);\n        },\n        toggleView: (apis, comp, name) => {\n          return apis.toggleView(comp, name);\n        },\n        whichView: (apis, comp) => {\n          return apis.whichView(comp);\n        }\n      }\n    });\n\n    const defaultMenubar = 'file edit view insert format tools table help';\n    const defaultMenus = {\n      file: {\n        title: 'File',\n        items: 'newdocument restoredraft | preview | importword exportpdf exportword | export print | deleteallconversations'\n      },\n      edit: {\n        title: 'Edit',\n        items: 'undo redo | cut copy paste pastetext | selectall | searchreplace'\n      },\n      view: {\n        title: 'View',\n        items: 'code revisionhistory | visualaid visualchars visualblocks | spellchecker | preview fullscreen | showcomments'\n      },\n      insert: {\n        title: 'Insert',\n        items: 'image link media addcomment pageembed template inserttemplate codesample inserttable accordion | charmap emoticons hr | pagebreak nonbreaking anchor tableofcontents footnotes | mergetags | insertdatetime'\n      },\n      format: {\n        title: 'Format',\n        items: 'bold italic underline strikethrough superscript subscript codeformat | styles blocks fontfamily fontsize align lineheight | forecolor backcolor | language | removeformat'\n      },\n      tools: {\n        title: 'Tools',\n        items: 'aidialog aishortcuts | spellchecker spellcheckerlanguage | autocorrect capitalization | a11ycheck code typography wordcount addtemplate'\n      },\n      table: {\n        title: 'Table',\n        items: 'inserttable | cell row column | advtablesort | tableprops deletetable'\n      },\n      help: {\n        title: 'Help',\n        items: 'help'\n      }\n    };\n    const make = (menu, registry, editor) => {\n      const removedMenuItems = getRemovedMenuItems(editor).split(/[ ,]/);\n      return {\n        text: menu.title,\n        getItems: () => bind$3(menu.items, i => {\n          const itemName = i.toLowerCase();\n          if (itemName.trim().length === 0) {\n            return [];\n          } else if (exists(removedMenuItems, removedMenuItem => removedMenuItem === itemName)) {\n            return [];\n          } else if (itemName === 'separator' || itemName === '|') {\n            return [{ type: 'separator' }];\n          } else if (registry.menuItems[itemName]) {\n            return [registry.menuItems[itemName]];\n          } else {\n            return [];\n          }\n        })\n      };\n    };\n    const parseItemsString = items => {\n      return items.split(' ');\n    };\n    const identifyMenus = (editor, registry) => {\n      const rawMenuData = {\n        ...defaultMenus,\n        ...registry.menus\n      };\n      const userDefinedMenus = keys(registry.menus).length > 0;\n      const menubar = registry.menubar === undefined || registry.menubar === true ? parseItemsString(defaultMenubar) : parseItemsString(registry.menubar === false ? '' : registry.menubar);\n      const validMenus = filter$2(menubar, menuName => {\n        const isDefaultMenu = has$2(defaultMenus, menuName);\n        if (userDefinedMenus) {\n          return isDefaultMenu || get$g(registry.menus, menuName).exists(menu => has$2(menu, 'items'));\n        } else {\n          return isDefaultMenu;\n        }\n      });\n      const menus = map$2(validMenus, menuName => {\n        const menuData = rawMenuData[menuName];\n        return make({\n          title: menuData.title,\n          items: parseItemsString(menuData.items)\n        }, registry, editor);\n      });\n      return filter$2(menus, menu => {\n        const isNotSeparator = item => isString(item) || item.type !== 'separator';\n        return menu.getItems().length > 0 && exists(menu.getItems(), isNotSeparator);\n      });\n    };\n\n    const fireSkinLoaded = editor => {\n      const done = () => {\n        editor._skinLoaded = true;\n        fireSkinLoaded$1(editor);\n      };\n      return () => {\n        if (editor.initialized) {\n          done();\n        } else {\n          editor.on('init', done);\n        }\n      };\n    };\n    const fireSkinLoadError = (editor, err) => () => fireSkinLoadError$1(editor, { message: err });\n\n    const loadStylesheet = (editor, stylesheetUrl, styleSheetLoader) => {\n      editor.on('remove', () => styleSheetLoader.unload(stylesheetUrl));\n      return styleSheetLoader.load(stylesheetUrl);\n    };\n    const loadRawCss = (editor, key, css, styleSheetLoader) => {\n      editor.on('remove', () => styleSheetLoader.unloadRawCss(key));\n      return styleSheetLoader.loadRawCss(key, css);\n    };\n    const loadUiSkins = async (editor, skinUrl) => {\n      const skinResourceIdentifier = getSkinUrlOption(editor).getOr('default');\n      const skinUiCss = 'ui/' + skinResourceIdentifier + '/skin.css';\n      const css = hugerte.Resource.get(skinUiCss);\n      if (isString(css)) {\n        return Promise.resolve(loadRawCss(editor, skinUiCss, css, editor.ui.styleSheetLoader));\n      } else {\n        const skinUiCss = skinUrl + '/skin.min.css';\n        return loadStylesheet(editor, skinUiCss, editor.ui.styleSheetLoader);\n      }\n    };\n    const loadShadowDomUiSkins = async (editor, skinUrl) => {\n      const isInShadowRoot$1 = isInShadowRoot(SugarElement.fromDom(editor.getElement()));\n      if (isInShadowRoot$1) {\n        const skinResourceIdentifier = getSkinUrlOption(editor).getOr('default');\n        const shadowDomSkinCss = 'ui/' + skinResourceIdentifier + '/skin.shadowdom.css';\n        const css = hugerte.Resource.get(shadowDomSkinCss);\n        if (isString(css)) {\n          loadRawCss(editor, shadowDomSkinCss, css, global$7.DOM.styleSheetLoader);\n          return Promise.resolve();\n        } else {\n          const shadowDomSkinCss = skinUrl + '/skin.shadowdom.min.css';\n          return loadStylesheet(editor, shadowDomSkinCss, global$7.DOM.styleSheetLoader);\n        }\n      }\n    };\n    const loadUrlSkin = async (isInline, editor) => {\n      getSkinUrlOption(editor).fold(() => {\n        const skinResourceIdentifier = getSkinUrl(editor);\n        if (skinResourceIdentifier) {\n          editor.contentCSS.push(skinResourceIdentifier + (isInline ? '/content.inline' : '/content') + '.min.css');\n        }\n      }, skinUrl => {\n        const skinContentCss = 'ui/' + skinUrl + (isInline ? '/content.inline' : '/content') + '.css';\n        if (hugerte.Resource.has(skinContentCss)) {\n          editor.contentCSS.push(skinContentCss);\n        } else {\n          const skinResourceIdentifier = getSkinUrl(editor);\n          if (skinResourceIdentifier) {\n            editor.contentCSS.push(skinResourceIdentifier + (isInline ? '/content.inline' : '/content') + '.min.css');\n          }\n        }\n      });\n      const skinUrl = getSkinUrl(editor);\n      if (!isSkinDisabled(editor) && isString(skinUrl)) {\n        return Promise.all([\n          loadUiSkins(editor, skinUrl),\n          loadShadowDomUiSkins(editor, skinUrl)\n        ]).then();\n      }\n    };\n    const loadSkin = (isInline, editor) => {\n      return loadUrlSkin(isInline, editor).then(fireSkinLoaded(editor), fireSkinLoadError(editor, 'Skin could not be loaded'));\n    };\n    const iframe = curry(loadSkin, false);\n    const inline = curry(loadSkin, true);\n\n    const makeTooltipText = (editor, labelWithPlaceholder, value) => editor.translate([\n      labelWithPlaceholder,\n      editor.translate(value)\n    ]);\n\n    const generateSelectItems = (backstage, spec) => {\n      const generateItem = (rawItem, response, invalid, value) => {\n        const translatedText = backstage.shared.providers.translate(rawItem.title);\n        if (rawItem.type === 'separator') {\n          return Optional.some({\n            type: 'separator',\n            text: translatedText\n          });\n        } else if (rawItem.type === 'submenu') {\n          const items = bind$3(rawItem.getStyleItems(), si => validate(si, response, value));\n          if (response === 0 && items.length <= 0) {\n            return Optional.none();\n          } else {\n            return Optional.some({\n              type: 'nestedmenuitem',\n              text: translatedText,\n              enabled: items.length > 0,\n              getSubmenuItems: () => bind$3(rawItem.getStyleItems(), si => validate(si, response, value))\n            });\n          }\n        } else {\n          return Optional.some({\n            type: 'togglemenuitem',\n            text: translatedText,\n            icon: rawItem.icon,\n            active: rawItem.isSelected(value),\n            enabled: !invalid,\n            onAction: spec.onAction(rawItem),\n            ...rawItem.getStylePreview().fold(() => ({}), preview => ({ meta: { style: preview } }))\n          });\n        }\n      };\n      const validate = (item, response, value) => {\n        const invalid = item.type === 'formatter' && spec.isInvalid(item);\n        if (response === 0) {\n          return invalid ? [] : generateItem(item, response, false, value).toArray();\n        } else {\n          return generateItem(item, response, invalid, value).toArray();\n        }\n      };\n      const validateItems = preItems => {\n        const value = spec.getCurrentValue();\n        const response = spec.shouldHide ? 0 : 1;\n        return bind$3(preItems, item => validate(item, response, value));\n      };\n      const getFetch = (backstage, getStyleItems) => (comp, callback) => {\n        const preItems = getStyleItems();\n        const items = validateItems(preItems);\n        const menu = build(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, {\n          isHorizontalMenu: false,\n          search: Optional.none()\n        });\n        callback(menu);\n      };\n      return {\n        validateItems,\n        getFetch\n      };\n    };\n    const createMenuItems = (backstage, spec) => {\n      const dataset = spec.dataset;\n      const getStyleItems = dataset.type === 'basic' ? () => map$2(dataset.data, d => processBasic(d, spec.isSelectedFor, spec.getPreviewFor)) : dataset.getData;\n      return {\n        items: generateSelectItems(backstage, spec),\n        getStyleItems\n      };\n    };\n    const createSelectButton = (editor, backstage, spec, tooltipWithPlaceholder, textUpdateEventName, btnName) => {\n      const {items, getStyleItems} = createMenuItems(backstage, spec);\n      const tooltipString = Cell(spec.tooltip);\n      const getApi = comp => ({\n        getComponent: constant$1(comp),\n        setTooltip: tooltip => {\n          const translatedTooltip = backstage.shared.providers.translate(tooltip);\n          set$9(comp.element, 'aria-label', translatedTooltip);\n          tooltipString.set(tooltip);\n        }\n      });\n      const onSetup = api => {\n        const handler = e => api.setTooltip(makeTooltipText(editor, tooltipWithPlaceholder, e.value));\n        editor.on(textUpdateEventName, handler);\n        return composeUnbinders(onSetupEvent(editor, 'NodeChange', api => {\n          const comp = api.getComponent();\n          spec.updateText(comp);\n          Disabling.set(api.getComponent(), !editor.selection.isEditable());\n        })(api), () => editor.off(textUpdateEventName, handler));\n      };\n      return renderCommonDropdown({\n        text: spec.icon.isSome() ? Optional.none() : spec.text,\n        icon: spec.icon,\n        ariaLabel: Optional.some(spec.tooltip),\n        tooltip: Optional.none(),\n        role: Optional.none(),\n        fetch: items.getFetch(backstage, getStyleItems),\n        onSetup,\n        getApi,\n        columns: 1,\n        presets: 'normal',\n        classes: spec.icon.isSome() ? [] : ['bespoke'],\n        dropdownBehaviours: [Tooltipping.config({\n            ...backstage.shared.providers.tooltips.getConfig({\n              tooltipText: backstage.shared.providers.translate(spec.tooltip),\n              onShow: comp => {\n                if (spec.tooltip !== tooltipString.get()) {\n                  const translatedTooltip = backstage.shared.providers.translate(tooltipString.get());\n                  Tooltipping.setComponents(comp, backstage.shared.providers.tooltips.getComponents({ tooltipText: translatedTooltip }));\n                }\n              }\n            })\n          })]\n      }, 'tox-tbtn', backstage.shared, btnName);\n    };\n\n    const process = rawFormats => map$2(rawFormats, item => {\n      let title = item, format = item;\n      const values = item.split('=');\n      if (values.length > 1) {\n        title = values[0];\n        format = values[1];\n      }\n      return {\n        title,\n        format\n      };\n    });\n    const buildBasicStaticDataset = data => ({\n      type: 'basic',\n      data\n    });\n    var Delimiter;\n    (function (Delimiter) {\n      Delimiter[Delimiter['SemiColon'] = 0] = 'SemiColon';\n      Delimiter[Delimiter['Space'] = 1] = 'Space';\n    }(Delimiter || (Delimiter = {})));\n    const split = (rawFormats, delimiter) => {\n      if (delimiter === Delimiter.SemiColon) {\n        return rawFormats.replace(/;$/, '').split(';');\n      } else {\n        return rawFormats.split(' ');\n      }\n    };\n    const buildBasicSettingsDataset = (editor, settingName, delimiter) => {\n      const rawFormats = editor.options.get(settingName);\n      const data = process(split(rawFormats, delimiter));\n      return {\n        type: 'basic',\n        data\n      };\n    };\n\n    const menuTitle$4 = 'Align';\n    const btnTooltip$4 = 'Alignment {0}';\n    const fallbackAlignment = 'left';\n    const alignMenuItems = [\n      {\n        title: 'Left',\n        icon: 'align-left',\n        format: 'alignleft',\n        command: 'JustifyLeft'\n      },\n      {\n        title: 'Center',\n        icon: 'align-center',\n        format: 'aligncenter',\n        command: 'JustifyCenter'\n      },\n      {\n        title: 'Right',\n        icon: 'align-right',\n        format: 'alignright',\n        command: 'JustifyRight'\n      },\n      {\n        title: 'Justify',\n        icon: 'align-justify',\n        format: 'alignjustify',\n        command: 'JustifyFull'\n      }\n    ];\n    const getSpec$4 = editor => {\n      const getMatchingValue = () => find$5(alignMenuItems, item => editor.formatter.match(item.format));\n      const isSelectedFor = format => () => editor.formatter.match(format);\n      const getPreviewFor = _format => Optional.none;\n      const updateSelectMenuIcon = comp => {\n        const match = getMatchingValue();\n        const alignment = match.fold(constant$1(fallbackAlignment), item => item.title.toLowerCase());\n        emitWith(comp, updateMenuIcon, { icon: `align-${ alignment }` });\n        fireAlignTextUpdate(editor, { value: alignment });\n      };\n      const dataset = buildBasicStaticDataset(alignMenuItems);\n      const onAction = rawItem => () => find$5(alignMenuItems, item => item.format === rawItem.format).each(item => editor.execCommand(item.command));\n      return {\n        tooltip: makeTooltipText(editor, btnTooltip$4, fallbackAlignment),\n        text: Optional.none(),\n        icon: Optional.some('align-left'),\n        isSelectedFor,\n        getCurrentValue: Optional.none,\n        getPreviewFor,\n        onAction,\n        updateText: updateSelectMenuIcon,\n        dataset,\n        shouldHide: false,\n        isInvalid: item => !editor.formatter.canApply(item.format)\n      };\n    };\n    const createAlignButton = (editor, backstage) => createSelectButton(editor, backstage, getSpec$4(editor), btnTooltip$4, 'AlignTextUpdate', 'align');\n    const createAlignMenu = (editor, backstage) => {\n      const menuItems = createMenuItems(backstage, getSpec$4(editor));\n      editor.ui.registry.addNestedMenuItem('align', {\n        text: backstage.shared.providers.translate(menuTitle$4),\n        onSetup: onSetupEditableToggle(editor),\n        getSubmenuItems: () => menuItems.items.validateItems(menuItems.getStyleItems())\n      });\n    };\n\n    const findNearest = (editor, getStyles) => {\n      const styles = getStyles();\n      const formats = map$2(styles, style => style.format);\n      return Optional.from(editor.formatter.closest(formats)).bind(fmt => find$5(styles, data => data.format === fmt)).orThunk(() => someIf(editor.formatter.match('p'), {\n        title: 'Paragraph',\n        format: 'p'\n      }));\n    };\n\n    const menuTitle$3 = 'Blocks';\n    const btnTooltip$3 = 'Block {0}';\n    const fallbackFormat = 'Paragraph';\n    const getSpec$3 = editor => {\n      const isSelectedFor = format => () => editor.formatter.match(format);\n      const getPreviewFor = format => () => {\n        const fmt = editor.formatter.get(format);\n        if (fmt) {\n          return Optional.some({\n            tag: fmt.length > 0 ? fmt[0].inline || fmt[0].block || 'div' : 'div',\n            styles: editor.dom.parseStyle(editor.formatter.getCssText(format))\n          });\n        } else {\n          return Optional.none();\n        }\n      };\n      const updateSelectMenuText = comp => {\n        const detectedFormat = findNearest(editor, () => dataset.data);\n        const text = detectedFormat.fold(constant$1(fallbackFormat), fmt => fmt.title);\n        emitWith(comp, updateMenuText, { text });\n        fireBlocksTextUpdate(editor, { value: text });\n      };\n      const dataset = buildBasicSettingsDataset(editor, 'block_formats', Delimiter.SemiColon);\n      return {\n        tooltip: makeTooltipText(editor, btnTooltip$3, fallbackFormat),\n        text: Optional.some(fallbackFormat),\n        icon: Optional.none(),\n        isSelectedFor,\n        getCurrentValue: Optional.none,\n        getPreviewFor,\n        onAction: onActionToggleFormat$1(editor),\n        updateText: updateSelectMenuText,\n        dataset,\n        shouldHide: false,\n        isInvalid: item => !editor.formatter.canApply(item.format)\n      };\n    };\n    const createBlocksButton = (editor, backstage) => createSelectButton(editor, backstage, getSpec$3(editor), btnTooltip$3, 'BlocksTextUpdate', 'blocks');\n    const createBlocksMenu = (editor, backstage) => {\n      const menuItems = createMenuItems(backstage, getSpec$3(editor));\n      editor.ui.registry.addNestedMenuItem('blocks', {\n        text: menuTitle$3,\n        onSetup: onSetupEditableToggle(editor),\n        getSubmenuItems: () => menuItems.items.validateItems(menuItems.getStyleItems())\n      });\n    };\n\n    const menuTitle$2 = 'Fonts';\n    const btnTooltip$2 = 'Font {0}';\n    const systemFont = 'System Font';\n    const systemStackFonts = [\n      '-apple-system',\n      'Segoe UI',\n      'Roboto',\n      'Helvetica Neue',\n      'sans-serif'\n    ];\n    const splitFonts = fontFamily => {\n      const fonts = fontFamily.split(/\\s*,\\s*/);\n      return map$2(fonts, font => font.replace(/^['\"]+|['\"]+$/g, ''));\n    };\n    const matchesStack = (fonts, stack) => stack.length > 0 && forall(stack, font => fonts.indexOf(font.toLowerCase()) > -1);\n    const isSystemFontStack = (fontFamily, userStack) => {\n      if (fontFamily.indexOf('-apple-system') === 0 || userStack.length > 0) {\n        const fonts = splitFonts(fontFamily.toLowerCase());\n        return matchesStack(fonts, systemStackFonts) || matchesStack(fonts, userStack);\n      } else {\n        return false;\n      }\n    };\n    const getSpec$2 = editor => {\n      const getMatchingValue = () => {\n        const getFirstFont = fontFamily => fontFamily ? splitFonts(fontFamily)[0] : '';\n        const fontFamily = editor.queryCommandValue('FontName');\n        const items = dataset.data;\n        const font = fontFamily ? fontFamily.toLowerCase() : '';\n        const userStack = getDefaultFontStack(editor);\n        const matchOpt = find$5(items, item => {\n          const format = item.format;\n          return format.toLowerCase() === font || getFirstFont(format).toLowerCase() === getFirstFont(font).toLowerCase();\n        }).orThunk(() => {\n          return someIf(isSystemFontStack(font, userStack), {\n            title: systemFont,\n            format: font\n          });\n        });\n        return {\n          matchOpt,\n          font: fontFamily\n        };\n      };\n      const isSelectedFor = item => valueOpt => valueOpt.exists(value => value.format === item);\n      const getCurrentValue = () => {\n        const {matchOpt} = getMatchingValue();\n        return matchOpt;\n      };\n      const getPreviewFor = item => () => Optional.some({\n        tag: 'div',\n        styles: item.indexOf('dings') === -1 ? { 'font-family': item } : {}\n      });\n      const onAction = rawItem => () => {\n        editor.undoManager.transact(() => {\n          editor.focus();\n          editor.execCommand('FontName', false, rawItem.format);\n        });\n      };\n      const updateSelectMenuText = comp => {\n        const {matchOpt, font} = getMatchingValue();\n        const text = matchOpt.fold(constant$1(font), item => item.title);\n        emitWith(comp, updateMenuText, { text });\n        fireFontFamilyTextUpdate(editor, { value: text });\n      };\n      const dataset = buildBasicSettingsDataset(editor, 'font_family_formats', Delimiter.SemiColon);\n      return {\n        tooltip: makeTooltipText(editor, btnTooltip$2, systemFont),\n        text: Optional.some(systemFont),\n        icon: Optional.none(),\n        isSelectedFor,\n        getCurrentValue,\n        getPreviewFor,\n        onAction,\n        updateText: updateSelectMenuText,\n        dataset,\n        shouldHide: false,\n        isInvalid: never\n      };\n    };\n    const createFontFamilyButton = (editor, backstage) => createSelectButton(editor, backstage, getSpec$2(editor), btnTooltip$2, 'FontFamilyTextUpdate', 'fontfamily');\n    const createFontFamilyMenu = (editor, backstage) => {\n      const menuItems = createMenuItems(backstage, getSpec$2(editor));\n      editor.ui.registry.addNestedMenuItem('fontfamily', {\n        text: backstage.shared.providers.translate(menuTitle$2),\n        onSetup: onSetupEditableToggle(editor),\n        getSubmenuItems: () => menuItems.items.validateItems(menuItems.getStyleItems())\n      });\n    };\n\n    const units = {\n      unsupportedLength: [\n        'em',\n        'ex',\n        'cap',\n        'ch',\n        'ic',\n        'rem',\n        'lh',\n        'rlh',\n        'vw',\n        'vh',\n        'vi',\n        'vb',\n        'vmin',\n        'vmax',\n        'cm',\n        'mm',\n        'Q',\n        'in',\n        'pc',\n        'pt',\n        'px'\n      ],\n      fixed: [\n        'px',\n        'pt'\n      ],\n      relative: ['%'],\n      empty: ['']\n    };\n    const pattern = (() => {\n      const decimalDigits = '[0-9]+';\n      const signedInteger = '[+-]?' + decimalDigits;\n      const exponentPart = '[eE]' + signedInteger;\n      const dot = '\\\\.';\n      const opt = input => `(?:${ input })?`;\n      const unsignedDecimalLiteral = [\n        'Infinity',\n        decimalDigits + dot + opt(decimalDigits) + opt(exponentPart),\n        dot + decimalDigits + opt(exponentPart),\n        decimalDigits + opt(exponentPart)\n      ].join('|');\n      const float = `[+-]?(?:${ unsignedDecimalLiteral })`;\n      return new RegExp(`^(${ float })(.*)$`);\n    })();\n    const isUnit = (unit, accepted) => exists(accepted, acc => exists(units[acc], check => unit === check));\n    const parse = (input, accepted) => {\n      const match = Optional.from(pattern.exec(input));\n      return match.bind(array => {\n        const value = Number(array[1]);\n        const unitRaw = array[2];\n        if (isUnit(unitRaw, accepted)) {\n          return Optional.some({\n            value,\n            unit: unitRaw\n          });\n        } else {\n          return Optional.none();\n        }\n      });\n    };\n    const normalise = (input, accepted) => parse(input, accepted).map(({value, unit}) => value + unit);\n\n    const Keys = {\n      tab: constant$1(9),\n      escape: constant$1(27),\n      enter: constant$1(13),\n      backspace: constant$1(8),\n      delete: constant$1(46),\n      left: constant$1(37),\n      up: constant$1(38),\n      right: constant$1(39),\n      down: constant$1(40),\n      space: constant$1(32),\n      home: constant$1(36),\n      end: constant$1(35),\n      pageUp: constant$1(33),\n      pageDown: constant$1(34)\n    };\n\n    const createBespokeNumberInput = (editor, backstage, spec, btnName) => {\n      let currentComp = Optional.none();\n      const getValueFromCurrentComp = comp => comp.map(alloyComp => Representing.getValue(alloyComp)).getOr('');\n      const onSetup = onSetupEvent(editor, 'NodeChange SwitchMode', api => {\n        const comp = api.getComponent();\n        currentComp = Optional.some(comp);\n        spec.updateInputValue(comp);\n        Disabling.set(comp, !editor.selection.isEditable());\n      });\n      const getApi = comp => ({ getComponent: constant$1(comp) });\n      const editorOffCell = Cell(noop);\n      const customEvents = generate$6('custom-number-input-events');\n      const changeValue = (f, fromInput, focusBack) => {\n        const text = getValueFromCurrentComp(currentComp);\n        const newValue = spec.getNewValue(text, f);\n        const lenghtDelta = text.length - `${ newValue }`.length;\n        const oldStart = currentComp.map(comp => comp.element.dom.selectionStart - lenghtDelta);\n        const oldEnd = currentComp.map(comp => comp.element.dom.selectionEnd - lenghtDelta);\n        spec.onAction(newValue, focusBack);\n        currentComp.each(comp => {\n          Representing.setValue(comp, newValue);\n          if (fromInput) {\n            oldStart.each(oldStart => comp.element.dom.selectionStart = oldStart);\n            oldEnd.each(oldEnd => comp.element.dom.selectionEnd = oldEnd);\n          }\n        });\n      };\n      const decrease = (fromInput, focusBack) => changeValue((n, s) => n - s, fromInput, focusBack);\n      const increase = (fromInput, focusBack) => changeValue((n, s) => n + s, fromInput, focusBack);\n      const goToParent = comp => parentElement(comp.element).fold(Optional.none, parent => {\n        focus$3(parent);\n        return Optional.some(true);\n      });\n      const focusInput = comp => {\n        if (hasFocus(comp.element)) {\n          firstChild(comp.element).each(input => focus$3(input));\n          return Optional.some(true);\n        } else {\n          return Optional.none();\n        }\n      };\n      const makeStepperButton = (action, title, tooltip, classes) => {\n        const editorOffCellStepButton = Cell(noop);\n        const translatedTooltip = backstage.shared.providers.translate(tooltip);\n        const altExecuting = generate$6('altExecuting');\n        const onSetup = onSetupEvent(editor, 'NodeChange SwitchMode', api => {\n          Disabling.set(api.getComponent(), !editor.selection.isEditable());\n        });\n        const onClick = comp => {\n          if (!Disabling.isDisabled(comp)) {\n            action(true);\n          }\n        };\n        return Button.sketch({\n          dom: {\n            tag: 'button',\n            attributes: {\n              'aria-label': translatedTooltip,\n              'data-mce-name': title\n            },\n            classes: classes.concat(title)\n          },\n          components: [renderIconFromPack$1(title, backstage.shared.providers.icons)],\n          buttonBehaviours: derive$1([\n            Disabling.config({}),\n            Tooltipping.config(backstage.shared.providers.tooltips.getConfig({ tooltipText: translatedTooltip })),\n            config(altExecuting, [\n              onControlAttached({\n                onSetup,\n                getApi\n              }, editorOffCellStepButton),\n              onControlDetached({ getApi }, editorOffCellStepButton),\n              run$1(keydown(), (comp, se) => {\n                if (se.event.raw.keyCode === Keys.space() || se.event.raw.keyCode === Keys.enter()) {\n                  if (!Disabling.isDisabled(comp)) {\n                    action(false);\n                  }\n                }\n              }),\n              run$1(click(), onClick),\n              run$1(touchend(), onClick)\n            ])\n          ]),\n          eventOrder: {\n            [keydown()]: [\n              altExecuting,\n              'keying'\n            ],\n            [click()]: [\n              altExecuting,\n              'alloy.base.behaviour'\n            ],\n            [touchend()]: [\n              altExecuting,\n              'alloy.base.behaviour'\n            ],\n            [attachedToDom()]: [\n              'alloy.base.behaviour',\n              altExecuting,\n              'tooltipping'\n            ],\n            [detachedFromDom()]: [\n              altExecuting,\n              'tooltipping'\n            ]\n          }\n        });\n      };\n      const memMinus = record(makeStepperButton(focusBack => decrease(false, focusBack), 'minus', 'Decrease font size', []));\n      const memPlus = record(makeStepperButton(focusBack => increase(false, focusBack), 'plus', 'Increase font size', []));\n      const memInput = record({\n        dom: {\n          tag: 'div',\n          classes: ['tox-input-wrapper']\n        },\n        components: [Input.sketch({\n            inputBehaviours: derive$1([\n              Disabling.config({}),\n              config(customEvents, [\n                onControlAttached({\n                  onSetup,\n                  getApi\n                }, editorOffCell),\n                onControlDetached({ getApi }, editorOffCell)\n              ]),\n              config('input-update-display-text', [\n                run$1(updateMenuText, (comp, se) => {\n                  Representing.setValue(comp, se.event.text);\n                }),\n                run$1(focusout(), comp => {\n                  spec.onAction(Representing.getValue(comp));\n                }),\n                run$1(change(), comp => {\n                  spec.onAction(Representing.getValue(comp));\n                })\n              ]),\n              Keying.config({\n                mode: 'special',\n                onEnter: _comp => {\n                  changeValue(identity, true, true);\n                  return Optional.some(true);\n                },\n                onEscape: goToParent,\n                onUp: _comp => {\n                  increase(true, false);\n                  return Optional.some(true);\n                },\n                onDown: _comp => {\n                  decrease(true, false);\n                  return Optional.some(true);\n                },\n                onLeft: (_comp, se) => {\n                  se.cut();\n                  return Optional.none();\n                },\n                onRight: (_comp, se) => {\n                  se.cut();\n                  return Optional.none();\n                }\n              })\n            ])\n          })],\n        behaviours: derive$1([\n          Focusing.config({}),\n          Keying.config({\n            mode: 'special',\n            onEnter: focusInput,\n            onSpace: focusInput,\n            onEscape: goToParent\n          }),\n          config('input-wrapper-events', [run$1(mouseover(), comp => {\n              each$1([\n                memMinus,\n                memPlus\n              ], button => {\n                const buttonNode = SugarElement.fromDom(button.get(comp).element.dom);\n                if (hasFocus(buttonNode)) {\n                  blur$1(buttonNode);\n                }\n              });\n            })])\n        ])\n      });\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-number-input'],\n          attributes: { ...isNonNullable(btnName) ? { 'data-mce-name': btnName } : {} }\n        },\n        components: [\n          memMinus.asSpec(),\n          memInput.asSpec(),\n          memPlus.asSpec()\n        ],\n        behaviours: derive$1([\n          Focusing.config({}),\n          Keying.config({\n            mode: 'flow',\n            focusInside: FocusInsideModes.OnEnterOrSpaceMode,\n            cycles: false,\n            selector: 'button, .tox-input-wrapper',\n            onEscape: wrapperComp => {\n              if (hasFocus(wrapperComp.element)) {\n                return Optional.none();\n              } else {\n                focus$3(wrapperComp.element);\n                return Optional.some(true);\n              }\n            }\n          })\n        ])\n      };\n    };\n\n    const menuTitle$1 = 'Font sizes';\n    const btnTooltip$1 = 'Font size {0}';\n    const fallbackFontSize = '12pt';\n    const legacyFontSizes = {\n      '8pt': '1',\n      '10pt': '2',\n      '12pt': '3',\n      '14pt': '4',\n      '18pt': '5',\n      '24pt': '6',\n      '36pt': '7'\n    };\n    const keywordFontSizes = {\n      'xx-small': '7pt',\n      'x-small': '8pt',\n      'small': '10pt',\n      'medium': '12pt',\n      'large': '14pt',\n      'x-large': '18pt',\n      'xx-large': '24pt'\n    };\n    const round = (number, precision) => {\n      const factor = Math.pow(10, precision);\n      return Math.round(number * factor) / factor;\n    };\n    const toPt = (fontSize, precision) => {\n      if (/[0-9.]+px$/.test(fontSize)) {\n        return round(parseInt(fontSize, 10) * 72 / 96, precision || 0) + 'pt';\n      } else {\n        return get$g(keywordFontSizes, fontSize).getOr(fontSize);\n      }\n    };\n    const toLegacy = fontSize => get$g(legacyFontSizes, fontSize).getOr('');\n    const getSpec$1 = editor => {\n      const getMatchingValue = () => {\n        let matchOpt = Optional.none();\n        const items = dataset.data;\n        const fontSize = editor.queryCommandValue('FontSize');\n        if (fontSize) {\n          for (let precision = 3; matchOpt.isNone() && precision >= 0; precision--) {\n            const pt = toPt(fontSize, precision);\n            const legacy = toLegacy(pt);\n            matchOpt = find$5(items, item => item.format === fontSize || item.format === pt || item.format === legacy);\n          }\n        }\n        return {\n          matchOpt,\n          size: fontSize\n        };\n      };\n      const isSelectedFor = item => valueOpt => valueOpt.exists(value => value.format === item);\n      const getCurrentValue = () => {\n        const {matchOpt} = getMatchingValue();\n        return matchOpt;\n      };\n      const getPreviewFor = constant$1(Optional.none);\n      const onAction = rawItem => () => {\n        editor.undoManager.transact(() => {\n          editor.focus();\n          editor.execCommand('FontSize', false, rawItem.format);\n        });\n      };\n      const updateSelectMenuText = comp => {\n        const {matchOpt, size} = getMatchingValue();\n        const text = matchOpt.fold(constant$1(size), match => match.title);\n        emitWith(comp, updateMenuText, { text });\n        fireFontSizeTextUpdate(editor, { value: text });\n      };\n      const dataset = buildBasicSettingsDataset(editor, 'font_size_formats', Delimiter.Space);\n      return {\n        tooltip: makeTooltipText(editor, btnTooltip$1, fallbackFontSize),\n        text: Optional.some(fallbackFontSize),\n        icon: Optional.none(),\n        isSelectedFor,\n        getPreviewFor,\n        getCurrentValue,\n        onAction,\n        updateText: updateSelectMenuText,\n        dataset,\n        shouldHide: false,\n        isInvalid: never\n      };\n    };\n    const createFontSizeButton = (editor, backstage) => createSelectButton(editor, backstage, getSpec$1(editor), btnTooltip$1, 'FontSizeTextUpdate', 'fontsize');\n    const getConfigFromUnit = unit => {\n      var _a;\n      const baseConfig = { step: 1 };\n      const configs = {\n        em: { step: 0.1 },\n        cm: { step: 0.1 },\n        in: { step: 0.1 },\n        pc: { step: 0.1 },\n        ch: { step: 0.1 },\n        rem: { step: 0.1 }\n      };\n      return (_a = configs[unit]) !== null && _a !== void 0 ? _a : baseConfig;\n    };\n    const defaultValue = 16;\n    const isValidValue = value => value >= 0;\n    const getNumberInputSpec = editor => {\n      const getCurrentValue = () => editor.queryCommandValue('FontSize');\n      const updateInputValue = comp => emitWith(comp, updateMenuText, { text: getCurrentValue() });\n      return {\n        updateInputValue,\n        onAction: (format, focusBack) => editor.execCommand('FontSize', false, format, { skip_focus: !focusBack }),\n        getNewValue: (text, updateFunction) => {\n          parse(text, [\n            'unsupportedLength',\n            'empty'\n          ]);\n          const currentValue = getCurrentValue();\n          const parsedText = parse(text, [\n            'unsupportedLength',\n            'empty'\n          ]).or(parse(currentValue, [\n            'unsupportedLength',\n            'empty'\n          ]));\n          const value = parsedText.map(res => res.value).getOr(defaultValue);\n          const defaultUnit = getFontSizeInputDefaultUnit(editor);\n          const unit = parsedText.map(res => res.unit).filter(u => u !== '').getOr(defaultUnit);\n          const newValue = updateFunction(value, getConfigFromUnit(unit).step);\n          const res = `${ isValidValue(newValue) ? newValue : value }${ unit }`;\n          if (res !== currentValue) {\n            fireFontSizeInputTextUpdate(editor, { value: res });\n          }\n          return res;\n        }\n      };\n    };\n    const createFontSizeInputButton = (editor, backstage) => createBespokeNumberInput(editor, backstage, getNumberInputSpec(editor), 'fontsizeinput');\n    const createFontSizeMenu = (editor, backstage) => {\n      const menuItems = createMenuItems(backstage, getSpec$1(editor));\n      editor.ui.registry.addNestedMenuItem('fontsize', {\n        text: menuTitle$1,\n        onSetup: onSetupEditableToggle(editor),\n        getSubmenuItems: () => menuItems.items.validateItems(menuItems.getStyleItems())\n      });\n    };\n\n    const menuTitle = 'Formats';\n    const btnTooltip = 'Format {0}';\n    const getSpec = (editor, dataset) => {\n      const fallbackFormat = 'Paragraph';\n      const isSelectedFor = format => () => editor.formatter.match(format);\n      const getPreviewFor = format => () => {\n        const fmt = editor.formatter.get(format);\n        return fmt !== undefined ? Optional.some({\n          tag: fmt.length > 0 ? fmt[0].inline || fmt[0].block || 'div' : 'div',\n          styles: editor.dom.parseStyle(editor.formatter.getCssText(format))\n        }) : Optional.none();\n      };\n      const updateSelectMenuText = comp => {\n        const getFormatItems = fmt => {\n          if (isNestedFormat(fmt)) {\n            return bind$3(fmt.items, getFormatItems);\n          } else if (isFormatReference(fmt)) {\n            return [{\n                title: fmt.title,\n                format: fmt.format\n              }];\n          } else {\n            return [];\n          }\n        };\n        const flattenedItems = bind$3(getStyleFormats(editor), getFormatItems);\n        const detectedFormat = findNearest(editor, constant$1(flattenedItems));\n        const text = detectedFormat.fold(constant$1(fallbackFormat), fmt => fmt.title);\n        emitWith(comp, updateMenuText, { text });\n        fireStylesTextUpdate(editor, { value: text });\n      };\n      return {\n        tooltip: makeTooltipText(editor, btnTooltip, fallbackFormat),\n        text: Optional.some(fallbackFormat),\n        icon: Optional.none(),\n        isSelectedFor,\n        getCurrentValue: Optional.none,\n        getPreviewFor,\n        onAction: onActionToggleFormat$1(editor),\n        updateText: updateSelectMenuText,\n        shouldHide: shouldAutoHideStyleFormats(editor),\n        isInvalid: item => !editor.formatter.canApply(item.format),\n        dataset\n      };\n    };\n    const createStylesButton = (editor, backstage) => {\n      const dataset = {\n        type: 'advanced',\n        ...backstage.styles\n      };\n      return createSelectButton(editor, backstage, getSpec(editor, dataset), btnTooltip, 'StylesTextUpdate', 'styles');\n    };\n    const createStylesMenu = (editor, backstage) => {\n      const dataset = {\n        type: 'advanced',\n        ...backstage.styles\n      };\n      const menuItems = createMenuItems(backstage, getSpec(editor, dataset));\n      editor.ui.registry.addNestedMenuItem('styles', {\n        text: menuTitle,\n        onSetup: onSetupEditableToggle(editor),\n        getSubmenuItems: () => menuItems.items.validateItems(menuItems.getStyleItems())\n      });\n    };\n\n    const schema$7 = constant$1([\n      required$1('toggleClass'),\n      required$1('fetch'),\n      onStrictHandler('onExecute'),\n      defaulted('getHotspot', Optional.some),\n      defaulted('getAnchorOverrides', constant$1({})),\n      schema$y(),\n      onStrictHandler('onItemExecute'),\n      option$3('lazySink'),\n      required$1('dom'),\n      onHandler('onOpen'),\n      field('splitDropdownBehaviours', [\n        Coupling,\n        Keying,\n        Focusing\n      ]),\n      defaulted('matchWidth', false),\n      defaulted('useMinWidth', false),\n      defaulted('eventOrder', {}),\n      option$3('role')\n    ].concat(sandboxFields()));\n    const arrowPart = required({\n      factory: Button,\n      schema: [required$1('dom')],\n      name: 'arrow',\n      defaults: () => {\n        return { buttonBehaviours: derive$1([Focusing.revoke()]) };\n      },\n      overrides: detail => {\n        return {\n          dom: {\n            tag: 'span',\n            attributes: { role: 'presentation' }\n          },\n          action: arrow => {\n            arrow.getSystem().getByUid(detail.uid).each(emitExecute);\n          },\n          buttonBehaviours: derive$1([Toggling.config({\n              toggleOnExecute: false,\n              toggleClass: detail.toggleClass\n            })])\n        };\n      }\n    });\n    const buttonPart = required({\n      factory: Button,\n      schema: [required$1('dom')],\n      name: 'button',\n      defaults: () => {\n        return { buttonBehaviours: derive$1([Focusing.revoke()]) };\n      },\n      overrides: detail => {\n        return {\n          dom: {\n            tag: 'span',\n            attributes: { role: 'presentation' }\n          },\n          action: btn => {\n            btn.getSystem().getByUid(detail.uid).each(splitDropdown => {\n              detail.onExecute(splitDropdown, btn);\n            });\n          }\n        };\n      }\n    });\n    const parts$3 = constant$1([\n      arrowPart,\n      buttonPart,\n      optional({\n        factory: {\n          sketch: spec => {\n            return {\n              uid: spec.uid,\n              dom: {\n                tag: 'span',\n                styles: { display: 'none' },\n                attributes: { 'aria-hidden': 'true' },\n                innerHtml: spec.text\n              }\n            };\n          }\n        },\n        schema: [required$1('text')],\n        name: 'aria-descriptor'\n      }),\n      external({\n        schema: [tieredMenuMarkers()],\n        name: 'menu',\n        defaults: detail => {\n          return {\n            onExecute: (tmenu, item) => {\n              tmenu.getSystem().getByUid(detail.uid).each(splitDropdown => {\n                detail.onItemExecute(splitDropdown, tmenu, item);\n              });\n            }\n          };\n        }\n      }),\n      partType$1()\n    ]);\n\n    const factory$5 = (detail, components, spec, externals) => {\n      const switchToMenu = sandbox => {\n        Composing.getCurrent(sandbox).each(current => {\n          Highlighting.highlightFirst(current);\n          Keying.focusIn(current);\n        });\n      };\n      const action = component => {\n        const onOpenSync = switchToMenu;\n        togglePopup(detail, identity, component, externals, onOpenSync, HighlightOnOpen.HighlightMenuAndItem).get(noop);\n      };\n      const openMenu = comp => {\n        action(comp);\n        return Optional.some(true);\n      };\n      const executeOnButton = comp => {\n        const button = getPartOrDie(comp, detail, 'button');\n        emitExecute(button);\n        return Optional.some(true);\n      };\n      const buttonEvents = {\n        ...derive$2([runOnAttached((component, _simulatedEvent) => {\n            const ariaDescriptor = getPart(component, detail, 'aria-descriptor');\n            ariaDescriptor.each(descriptor => {\n              const descriptorId = generate$6('aria');\n              set$9(descriptor.element, 'id', descriptorId);\n              set$9(component.element, 'aria-describedby', descriptorId);\n            });\n          })]),\n        ...events$a(Optional.some(action))\n      };\n      const apis = {\n        repositionMenus: comp => {\n          if (Toggling.isOn(comp)) {\n            repositionMenus(comp);\n          }\n        }\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components,\n        apis,\n        eventOrder: {\n          ...detail.eventOrder,\n          [execute$5()]: [\n            'disabling',\n            'toggling',\n            'alloy.base.behaviour'\n          ]\n        },\n        events: buttonEvents,\n        behaviours: augment(detail.splitDropdownBehaviours, [\n          Coupling.config({\n            others: {\n              sandbox: hotspot => {\n                const arrow = getPartOrDie(hotspot, detail, 'arrow');\n                const extras = {\n                  onOpen: () => {\n                    Toggling.on(arrow);\n                    Toggling.on(hotspot);\n                  },\n                  onClose: () => {\n                    Toggling.off(arrow);\n                    Toggling.off(hotspot);\n                  }\n                };\n                return makeSandbox$1(detail, hotspot, extras);\n              }\n            }\n          }),\n          Keying.config({\n            mode: 'special',\n            onSpace: executeOnButton,\n            onEnter: executeOnButton,\n            onDown: openMenu\n          }),\n          Focusing.config({}),\n          Toggling.config({\n            toggleOnExecute: false,\n            aria: { mode: 'expanded' }\n          })\n        ]),\n        domModification: {\n          attributes: {\n            'role': detail.role.getOr('button'),\n            'aria-haspopup': true\n          }\n        }\n      };\n    };\n    const SplitDropdown = composite({\n      name: 'SplitDropdown',\n      configFields: schema$7(),\n      partFields: parts$3(),\n      factory: factory$5,\n      apis: { repositionMenus: (apis, comp) => apis.repositionMenus(comp) }\n    });\n\n    const getButtonApi = component => ({\n      isEnabled: () => !Disabling.isDisabled(component),\n      setEnabled: state => Disabling.set(component, !state),\n      setText: text => emitWith(component, updateMenuText, { text }),\n      setIcon: icon => emitWith(component, updateMenuIcon, { icon })\n    });\n    const getToggleApi = component => ({\n      setActive: state => {\n        Toggling.set(component, state);\n      },\n      isActive: () => Toggling.isOn(component),\n      isEnabled: () => !Disabling.isDisabled(component),\n      setEnabled: state => Disabling.set(component, !state),\n      setText: text => emitWith(component, updateMenuText, { text }),\n      setIcon: icon => emitWith(component, updateMenuIcon, { icon })\n    });\n    const getTooltipAttributes = (tooltip, providersBackstage) => tooltip.map(tooltip => ({ 'aria-label': providersBackstage.translate(tooltip) })).getOr({});\n    const focusButtonEvent = generate$6('focus-button');\n    const renderCommonStructure = (optIcon, optText, tooltip, behaviours, providersBackstage, btnName) => {\n      const optMemDisplayText = optText.map(text => record(renderLabel$1(text, 'tox-tbtn', providersBackstage)));\n      const optMemDisplayIcon = optIcon.map(icon => record(renderReplaceableIconFromPack(icon, providersBackstage.icons)));\n      return {\n        dom: {\n          tag: 'button',\n          classes: ['tox-tbtn'].concat(optText.isSome() ? ['tox-tbtn--select'] : []),\n          attributes: {\n            ...getTooltipAttributes(tooltip, providersBackstage),\n            ...isNonNullable(btnName) ? { 'data-mce-name': btnName } : {}\n          }\n        },\n        components: componentRenderPipeline([\n          optMemDisplayIcon.map(mem => mem.asSpec()),\n          optMemDisplayText.map(mem => mem.asSpec())\n        ]),\n        eventOrder: {\n          [mousedown()]: [\n            'focusing',\n            'alloy.base.behaviour',\n            commonButtonDisplayEvent\n          ],\n          [attachedToDom()]: [\n            commonButtonDisplayEvent,\n            'toolbar-group-button-events'\n          ]\n        },\n        buttonBehaviours: derive$1([\n          DisablingConfigs.toolbarButton(providersBackstage.isDisabled),\n          receivingConfig(),\n          config(commonButtonDisplayEvent, [\n            runOnAttached((comp, _se) => forceInitialSize(comp)),\n            run$1(updateMenuText, (comp, se) => {\n              optMemDisplayText.bind(mem => mem.getOpt(comp)).each(displayText => {\n                Replacing.set(displayText, [text$2(providersBackstage.translate(se.event.text))]);\n              });\n            }),\n            run$1(updateMenuIcon, (comp, se) => {\n              optMemDisplayIcon.bind(mem => mem.getOpt(comp)).each(displayIcon => {\n                Replacing.set(displayIcon, [renderReplaceableIconFromPack(se.event.icon, providersBackstage.icons)]);\n              });\n            }),\n            run$1(mousedown(), (button, se) => {\n              se.event.prevent();\n              emit(button, focusButtonEvent);\n            })\n          ])\n        ].concat(behaviours.getOr([])))\n      };\n    };\n    const renderFloatingToolbarButton = (spec, backstage, identifyButtons, attributes, btnName) => {\n      const sharedBackstage = backstage.shared;\n      const editorOffCell = Cell(noop);\n      const specialisation = {\n        toolbarButtonBehaviours: [],\n        getApi: getButtonApi,\n        onSetup: spec.onSetup\n      };\n      const behaviours = [config('toolbar-group-button-events', [\n          onControlAttached(specialisation, editorOffCell),\n          onControlDetached(specialisation, editorOffCell)\n        ])];\n      return FloatingToolbarButton.sketch({\n        lazySink: sharedBackstage.getSink,\n        fetch: () => Future.nu(resolve => {\n          resolve(map$2(identifyButtons(spec.items), renderToolbarGroup));\n        }),\n        markers: { toggledClass: 'tox-tbtn--enabled' },\n        parts: {\n          button: renderCommonStructure(spec.icon, spec.text, spec.tooltip, Optional.some(behaviours), sharedBackstage.providers, btnName),\n          toolbar: {\n            dom: {\n              tag: 'div',\n              classes: ['tox-toolbar__overflow'],\n              attributes\n            }\n          }\n        }\n      });\n    };\n    const renderCommonToolbarButton = (spec, specialisation, providersBackstage, btnName) => {\n      var _d;\n      const editorOffCell = Cell(noop);\n      const structure = renderCommonStructure(spec.icon, spec.text, spec.tooltip, Optional.none(), providersBackstage, btnName);\n      return Button.sketch({\n        dom: structure.dom,\n        components: structure.components,\n        eventOrder: toolbarButtonEventOrder,\n        buttonBehaviours: {\n          ...derive$1([\n            config('toolbar-button-events', [\n              onToolbarButtonExecute({\n                onAction: spec.onAction,\n                getApi: specialisation.getApi\n              }),\n              onControlAttached(specialisation, editorOffCell),\n              onControlDetached(specialisation, editorOffCell)\n            ]),\n            ...spec.tooltip.map(t => Tooltipping.config(providersBackstage.tooltips.getConfig({ tooltipText: providersBackstage.translate(t) + spec.shortcut.map(shortcut => ` (${ convertText(shortcut) })`).getOr('') }))).toArray(),\n            DisablingConfigs.toolbarButton(() => !spec.enabled || providersBackstage.isDisabled()),\n            receivingConfig()\n          ].concat(specialisation.toolbarButtonBehaviours)),\n          [commonButtonDisplayEvent]: (_d = structure.buttonBehaviours) === null || _d === void 0 ? void 0 : _d[commonButtonDisplayEvent]\n        }\n      });\n    };\n    const renderToolbarButton = (spec, providersBackstage, btnName) => renderToolbarButtonWith(spec, providersBackstage, [], btnName);\n    const renderToolbarButtonWith = (spec, providersBackstage, bonusEvents, btnName) => renderCommonToolbarButton(spec, {\n      toolbarButtonBehaviours: bonusEvents.length > 0 ? [config('toolbarButtonWith', bonusEvents)] : [],\n      getApi: getButtonApi,\n      onSetup: spec.onSetup\n    }, providersBackstage, btnName);\n    const renderToolbarToggleButton = (spec, providersBackstage, btnName) => renderToolbarToggleButtonWith(spec, providersBackstage, [], btnName);\n    const renderToolbarToggleButtonWith = (spec, providersBackstage, bonusEvents, btnName) => renderCommonToolbarButton(spec, {\n      toolbarButtonBehaviours: [\n        Replacing.config({}),\n        Toggling.config({\n          toggleClass: 'tox-tbtn--enabled',\n          aria: { mode: 'pressed' },\n          toggleOnExecute: false\n        })\n      ].concat(bonusEvents.length > 0 ? [config('toolbarToggleButtonWith', bonusEvents)] : []),\n      getApi: getToggleApi,\n      onSetup: spec.onSetup\n    }, providersBackstage, btnName);\n    const fetchChoices = (getApi, spec, providersBackstage) => comp => Future.nu(callback => spec.fetch(callback)).map(items => Optional.from(createTieredDataFrom(deepMerge(createPartialChoiceMenu(generate$6('menu-value'), items, value => {\n      spec.onItemAction(getApi(comp), value);\n    }, spec.columns, spec.presets, ItemResponse$1.CLOSE_ON_EXECUTE, spec.select.getOr(never), providersBackstage), {\n      movement: deriveMenuMovement(spec.columns, spec.presets),\n      menuBehaviours: SimpleBehaviours.unnamedEvents(spec.columns !== 'auto' ? [] : [runOnAttached((comp, _se) => {\n          detectSize(comp, 4, classForPreset(spec.presets)).each(({numRows, numColumns}) => {\n            Keying.setGridSize(comp, numRows, numColumns);\n          });\n        })])\n    }))));\n    const renderSplitButton = (spec, sharedBackstage, btnName) => {\n      const tooltipString = Cell(spec.tooltip.getOr(''));\n      const getApi = comp => ({\n        isEnabled: () => !Disabling.isDisabled(comp),\n        setEnabled: state => Disabling.set(comp, !state),\n        setIconFill: (id, value) => {\n          descendant(comp.element, `svg path[class=\"${ id }\"], rect[class=\"${ id }\"]`).each(underlinePath => {\n            set$9(underlinePath, 'fill', value);\n          });\n        },\n        setActive: state => {\n          set$9(comp.element, 'aria-pressed', state);\n          descendant(comp.element, 'span').each(button => {\n            comp.getSystem().getByDom(button).each(buttonComp => Toggling.set(buttonComp, state));\n          });\n        },\n        isActive: () => descendant(comp.element, 'span').exists(button => comp.getSystem().getByDom(button).exists(Toggling.isOn)),\n        setText: text => descendant(comp.element, 'span').each(button => comp.getSystem().getByDom(button).each(buttonComp => emitWith(buttonComp, updateMenuText, { text }))),\n        setIcon: icon => descendant(comp.element, 'span').each(button => comp.getSystem().getByDom(button).each(buttonComp => emitWith(buttonComp, updateMenuIcon, { icon }))),\n        setTooltip: tooltip => {\n          const translatedTooltip = sharedBackstage.providers.translate(tooltip);\n          set$9(comp.element, 'aria-label', translatedTooltip);\n          tooltipString.set(tooltip);\n        }\n      });\n      const editorOffCell = Cell(noop);\n      const specialisation = {\n        getApi,\n        onSetup: spec.onSetup\n      };\n      return SplitDropdown.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-split-button'],\n          attributes: {\n            'aria-pressed': false,\n            ...getTooltipAttributes(spec.tooltip, sharedBackstage.providers),\n            ...isNonNullable(btnName) ? { 'data-mce-name': btnName } : {}\n          }\n        },\n        onExecute: button => {\n          const api = getApi(button);\n          if (api.isEnabled()) {\n            spec.onAction(api);\n          }\n        },\n        onItemExecute: (_a, _b, _c) => {\n        },\n        splitDropdownBehaviours: derive$1([\n          DisablingConfigs.splitButton(sharedBackstage.providers.isDisabled),\n          receivingConfig(),\n          config('split-dropdown-events', [\n            runOnAttached((comp, _se) => forceInitialSize(comp)),\n            run$1(focusButtonEvent, Focusing.focus),\n            onControlAttached(specialisation, editorOffCell),\n            onControlDetached(specialisation, editorOffCell)\n          ]),\n          Unselecting.config({}),\n          ...spec.tooltip.map(tooltip => {\n            return Tooltipping.config({\n              ...sharedBackstage.providers.tooltips.getConfig({\n                tooltipText: sharedBackstage.providers.translate(tooltip),\n                onShow: comp => {\n                  if (tooltipString.get() !== tooltip) {\n                    const translatedTooltip = sharedBackstage.providers.translate(tooltipString.get());\n                    Tooltipping.setComponents(comp, sharedBackstage.providers.tooltips.getComponents({ tooltipText: translatedTooltip }));\n                  }\n                }\n              })\n            });\n          }).toArray()\n        ]),\n        eventOrder: {\n          [attachedToDom()]: [\n            'alloy.base.behaviour',\n            'split-dropdown-events',\n            'tooltipping'\n          ],\n          [detachedFromDom()]: [\n            'split-dropdown-events',\n            'tooltipping'\n          ]\n        },\n        toggleClass: 'tox-tbtn--enabled',\n        lazySink: sharedBackstage.getSink,\n        fetch: fetchChoices(getApi, spec, sharedBackstage.providers),\n        parts: { menu: part(false, spec.columns, spec.presets) },\n        components: [\n          SplitDropdown.parts.button(renderCommonStructure(spec.icon, spec.text, Optional.none(), Optional.some([Toggling.config({\n              toggleClass: 'tox-tbtn--enabled',\n              toggleOnExecute: false\n            })]), sharedBackstage.providers)),\n          SplitDropdown.parts.arrow({\n            dom: {\n              tag: 'button',\n              classes: [\n                'tox-tbtn',\n                'tox-split-button__chevron'\n              ],\n              innerHtml: get$2('chevron-down', sharedBackstage.providers.icons)\n            },\n            buttonBehaviours: derive$1([\n              DisablingConfigs.splitButton(sharedBackstage.providers.isDisabled),\n              receivingConfig(),\n              addFocusableBehaviour()\n            ])\n          }),\n          SplitDropdown.parts['aria-descriptor']({ text: sharedBackstage.providers.translate('To open the popup, press Shift+Enter') })\n        ]\n      });\n    };\n\n    const defaultToolbar = [\n      {\n        name: 'history',\n        items: [\n          'undo',\n          'redo'\n        ]\n      },\n      {\n        name: 'ai',\n        items: [\n          'aidialog',\n          'aishortcuts'\n        ]\n      },\n      {\n        name: 'styles',\n        items: ['styles']\n      },\n      {\n        name: 'formatting',\n        items: [\n          'bold',\n          'italic'\n        ]\n      },\n      {\n        name: 'alignment',\n        items: [\n          'alignleft',\n          'aligncenter',\n          'alignright',\n          'alignjustify'\n        ]\n      },\n      {\n        name: 'indentation',\n        items: [\n          'outdent',\n          'indent'\n        ]\n      },\n      {\n        name: 'permanent pen',\n        items: ['permanentpen']\n      },\n      {\n        name: 'comments',\n        items: ['addcomment']\n      }\n    ];\n    const renderFromBridge = (bridgeBuilder, render) => (spec, backstage, editor, btnName) => {\n      const internal = bridgeBuilder(spec).mapError(errInfo => formatError(errInfo)).getOrDie();\n      return render(internal, backstage, editor, btnName);\n    };\n    const types = {\n      button: renderFromBridge(createToolbarButton, (s, backstage, _, btnName) => renderToolbarButton(s, backstage.shared.providers, btnName)),\n      togglebutton: renderFromBridge(createToggleButton, (s, backstage, _, btnName) => renderToolbarToggleButton(s, backstage.shared.providers, btnName)),\n      menubutton: renderFromBridge(createMenuButton, (s, backstage, _, btnName) => renderMenuButton(s, 'tox-tbtn', backstage, Optional.none(), false, btnName)),\n      splitbutton: renderFromBridge(createSplitButton, (s, backstage, _, btnName) => renderSplitButton(s, backstage.shared, btnName)),\n      grouptoolbarbutton: renderFromBridge(createGroupToolbarButton, (s, backstage, editor, btnName) => {\n        const buttons = editor.ui.registry.getAll().buttons;\n        const identify = toolbar => identifyButtons(editor, {\n          buttons,\n          toolbar,\n          allowToolbarGroups: false\n        }, backstage, Optional.none());\n        const attributes = { [Attribute]: backstage.shared.header.isPositionedAtTop() ? AttributeValue.TopToBottom : AttributeValue.BottomToTop };\n        switch (getToolbarMode(editor)) {\n        case ToolbarMode$1.floating:\n          return renderFloatingToolbarButton(s, backstage, identify, attributes, btnName);\n        default:\n          throw new Error('Toolbar groups are only supported when using floating toolbar mode');\n        }\n      })\n    };\n    const extractFrom = (spec, backstage, editor, btnName) => get$g(types, spec.type).fold(() => {\n      console.error('skipping button defined by', spec);\n      return Optional.none();\n    }, render => Optional.some(render(spec, backstage, editor, btnName)));\n    const bespokeButtons = {\n      styles: createStylesButton,\n      fontsize: createFontSizeButton,\n      fontsizeinput: createFontSizeInputButton,\n      fontfamily: createFontFamilyButton,\n      blocks: createBlocksButton,\n      align: createAlignButton\n    };\n    const removeUnusedDefaults = buttons => {\n      const filteredItemGroups = map$2(defaultToolbar, group => {\n        const items = filter$2(group.items, subItem => has$2(buttons, subItem) || has$2(bespokeButtons, subItem));\n        return {\n          name: group.name,\n          items\n        };\n      });\n      return filter$2(filteredItemGroups, group => group.items.length > 0);\n    };\n    const convertStringToolbar = strToolbar => {\n      const groupsStrings = strToolbar.split('|');\n      return map$2(groupsStrings, g => ({ items: g.trim().split(' ') }));\n    };\n    const isToolbarGroupSettingArray = toolbar => isArrayOf(toolbar, t => has$2(t, 'name') && has$2(t, 'items'));\n    const createToolbar = toolbarConfig => {\n      const toolbar = toolbarConfig.toolbar;\n      const buttons = toolbarConfig.buttons;\n      if (toolbar === false) {\n        return [];\n      } else if (toolbar === undefined || toolbar === true) {\n        return removeUnusedDefaults(buttons);\n      } else if (isString(toolbar)) {\n        return convertStringToolbar(toolbar);\n      } else if (isToolbarGroupSettingArray(toolbar)) {\n        return toolbar;\n      } else {\n        console.error('Toolbar type should be string, string[], boolean or ToolbarGroup[]');\n        return [];\n      }\n    };\n    const lookupButton = (editor, buttons, toolbarItem, allowToolbarGroups, backstage, prefixes) => get$g(buttons, toolbarItem.toLowerCase()).orThunk(() => prefixes.bind(ps => findMap(ps, prefix => get$g(buttons, prefix + toolbarItem.toLowerCase())))).fold(() => get$g(bespokeButtons, toolbarItem.toLowerCase()).map(r => r(editor, backstage)), spec => {\n      if (spec.type === 'grouptoolbarbutton' && !allowToolbarGroups) {\n        console.warn(`Ignoring the '${ toolbarItem }' toolbar button. Group toolbar buttons are only supported when using floating toolbar mode and cannot be nested.`);\n        return Optional.none();\n      } else {\n        return extractFrom(spec, backstage, editor, toolbarItem.toLowerCase());\n      }\n    });\n    const identifyButtons = (editor, toolbarConfig, backstage, prefixes) => {\n      const toolbarGroups = createToolbar(toolbarConfig);\n      const groups = map$2(toolbarGroups, group => {\n        const items = bind$3(group.items, toolbarItem => {\n          return toolbarItem.trim().length === 0 ? [] : lookupButton(editor, toolbarConfig.buttons, toolbarItem, toolbarConfig.allowToolbarGroups, backstage, prefixes).toArray();\n        });\n        return {\n          title: Optional.from(editor.translate(group.name)),\n          items\n        };\n      });\n      return filter$2(groups, group => group.items.length > 0);\n    };\n\n    const setToolbar = (editor, uiRefs, rawUiConfig, backstage) => {\n      const outerContainer = uiRefs.mainUi.outerContainer;\n      const toolbarConfig = rawUiConfig.toolbar;\n      const toolbarButtonsConfig = rawUiConfig.buttons;\n      if (isArrayOf(toolbarConfig, isString)) {\n        const toolbars = toolbarConfig.map(t => {\n          const config = {\n            toolbar: t,\n            buttons: toolbarButtonsConfig,\n            allowToolbarGroups: rawUiConfig.allowToolbarGroups\n          };\n          return identifyButtons(editor, config, backstage, Optional.none());\n        });\n        OuterContainer.setToolbars(outerContainer, toolbars);\n      } else {\n        OuterContainer.setToolbar(outerContainer, identifyButtons(editor, rawUiConfig, backstage, Optional.none()));\n      }\n    };\n\n    const detection = detect$1();\n    const isiOS12 = detection.os.isiOS() && detection.os.version.major <= 12;\n    const setupEvents$1 = (editor, uiRefs) => {\n      const {uiMotherships} = uiRefs;\n      const dom = editor.dom;\n      let contentWindow = editor.getWin();\n      const initialDocEle = editor.getDoc().documentElement;\n      const lastWindowDimensions = Cell(SugarPosition(contentWindow.innerWidth, contentWindow.innerHeight));\n      const lastDocumentDimensions = Cell(SugarPosition(initialDocEle.offsetWidth, initialDocEle.offsetHeight));\n      const resizeWindow = () => {\n        const outer = lastWindowDimensions.get();\n        if (outer.left !== contentWindow.innerWidth || outer.top !== contentWindow.innerHeight) {\n          lastWindowDimensions.set(SugarPosition(contentWindow.innerWidth, contentWindow.innerHeight));\n          fireResizeContent(editor);\n        }\n      };\n      const resizeDocument = () => {\n        const docEle = editor.getDoc().documentElement;\n        const inner = lastDocumentDimensions.get();\n        if (inner.left !== docEle.offsetWidth || inner.top !== docEle.offsetHeight) {\n          lastDocumentDimensions.set(SugarPosition(docEle.offsetWidth, docEle.offsetHeight));\n          fireResizeContent(editor);\n        }\n      };\n      const scroll = e => {\n        fireScrollContent(editor, e);\n      };\n      dom.bind(contentWindow, 'resize', resizeWindow);\n      dom.bind(contentWindow, 'scroll', scroll);\n      const elementLoad = capture(SugarElement.fromDom(editor.getBody()), 'load', resizeDocument);\n      editor.on('hide', () => {\n        each$1(uiMotherships, m => {\n          set$8(m.element, 'display', 'none');\n        });\n      });\n      editor.on('show', () => {\n        each$1(uiMotherships, m => {\n          remove$6(m.element, 'display');\n        });\n      });\n      editor.on('NodeChange', resizeDocument);\n      editor.on('remove', () => {\n        elementLoad.unbind();\n        dom.unbind(contentWindow, 'resize', resizeWindow);\n        dom.unbind(contentWindow, 'scroll', scroll);\n        contentWindow = null;\n      });\n    };\n    const attachUiMotherships = (editor, uiRoot, uiRefs) => {\n      if (isSplitUiMode(editor)) {\n        attachSystemAfter(uiRefs.mainUi.mothership.element, uiRefs.popupUi.mothership);\n      }\n      attachSystem(uiRoot, uiRefs.dialogUi.mothership);\n    };\n    const render$1 = (editor, uiRefs, rawUiConfig, backstage, args) => {\n      const {mainUi, uiMotherships} = uiRefs;\n      const lastToolbarWidth = Cell(0);\n      const outerContainer = mainUi.outerContainer;\n      iframe(editor);\n      const eTargetNode = SugarElement.fromDom(args.targetNode);\n      const uiRoot = getContentContainer(getRootNode(eTargetNode));\n      attachSystemAfter(eTargetNode, mainUi.mothership);\n      attachUiMotherships(editor, uiRoot, uiRefs);\n      editor.on('SkinLoaded', () => {\n        OuterContainer.setSidebar(outerContainer, rawUiConfig.sidebar, getSidebarShow(editor));\n        setToolbar(editor, uiRefs, rawUiConfig, backstage);\n        lastToolbarWidth.set(editor.getWin().innerWidth);\n        OuterContainer.setMenubar(outerContainer, identifyMenus(editor, rawUiConfig));\n        OuterContainer.setViews(outerContainer, rawUiConfig.views);\n        setupEvents$1(editor, uiRefs);\n      });\n      const socket = OuterContainer.getSocket(outerContainer).getOrDie('Could not find expected socket element');\n      if (isiOS12) {\n        setAll(socket.element, {\n          'overflow': 'scroll',\n          '-webkit-overflow-scrolling': 'touch'\n        });\n        const limit = first(() => {\n          editor.dispatch('ScrollContent');\n        }, 20);\n        const unbinder = bind(socket.element, 'scroll', limit.throttle);\n        editor.on('remove', unbinder.unbind);\n      }\n      setupReadonlyModeSwitch(editor, uiRefs);\n      editor.addCommand('ToggleSidebar', (_ui, value) => {\n        OuterContainer.toggleSidebar(outerContainer, value);\n        editor.dispatch('ToggleSidebar');\n      });\n      editor.addQueryValueHandler('ToggleSidebar', () => {\n        var _a;\n        return (_a = OuterContainer.whichSidebar(outerContainer)) !== null && _a !== void 0 ? _a : '';\n      });\n      editor.addCommand('ToggleView', (_ui, value) => {\n        if (OuterContainer.toggleView(outerContainer, value)) {\n          const target = outerContainer.element;\n          mainUi.mothership.broadcastOn([dismissPopups()], { target });\n          each$1(uiMotherships, m => {\n            m.broadcastOn([dismissPopups()], { target });\n          });\n          if (isNull(OuterContainer.whichView(outerContainer))) {\n            editor.focus();\n            editor.nodeChanged();\n            OuterContainer.refreshToolbar(outerContainer);\n          }\n        }\n      });\n      editor.addQueryValueHandler('ToggleView', () => {\n        var _a;\n        return (_a = OuterContainer.whichView(outerContainer)) !== null && _a !== void 0 ? _a : '';\n      });\n      const toolbarMode = getToolbarMode(editor);\n      const refreshDrawer = () => {\n        OuterContainer.refreshToolbar(uiRefs.mainUi.outerContainer);\n      };\n      if (toolbarMode === ToolbarMode$1.sliding || toolbarMode === ToolbarMode$1.floating) {\n        editor.on('ResizeWindow ResizeEditor ResizeContent', () => {\n          const width = editor.getWin().innerWidth;\n          if (width !== lastToolbarWidth.get()) {\n            refreshDrawer();\n            lastToolbarWidth.set(width);\n          }\n        });\n      }\n      const api = {\n        setEnabled: state => {\n          broadcastReadonly(uiRefs, !state);\n        },\n        isEnabled: () => !Disabling.isDisabled(outerContainer)\n      };\n      return {\n        iframeContainer: socket.element.dom,\n        editorContainer: outerContainer.element.dom,\n        api\n      };\n    };\n\n    var Iframe = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        render: render$1\n    });\n\n    const parseToInt = val => {\n      const re = /^[0-9\\.]+(|px)$/i;\n      if (re.test('' + val)) {\n        return Optional.some(parseInt('' + val, 10));\n      }\n      return Optional.none();\n    };\n    const numToPx = val => isNumber(val) ? val + 'px' : val;\n    const calcCappedSize = (size, minSize, maxSize) => {\n      const minOverride = minSize.filter(min => size < min);\n      const maxOverride = maxSize.filter(max => size > max);\n      return minOverride.or(maxOverride).getOr(size);\n    };\n\n    const getHeight = editor => {\n      const baseHeight = getHeightOption(editor);\n      const minHeight = getMinHeightOption(editor);\n      const maxHeight = getMaxHeightOption(editor);\n      return parseToInt(baseHeight).map(height => calcCappedSize(height, minHeight, maxHeight));\n    };\n    const getHeightWithFallback = editor => {\n      const height = getHeight(editor);\n      return height.getOr(getHeightOption(editor));\n    };\n    const getWidth = editor => {\n      const baseWidth = getWidthOption(editor);\n      const minWidth = getMinWidthOption(editor);\n      const maxWidth = getMaxWidthOption(editor);\n      return parseToInt(baseWidth).map(width => calcCappedSize(width, minWidth, maxWidth));\n    };\n    const getWidthWithFallback = editor => {\n      const width = getWidth(editor);\n      return width.getOr(getWidthOption(editor));\n    };\n\n    const {ToolbarLocation, ToolbarMode} = Options;\n    const maximumDistanceToEdge = 40;\n    const InlineHeader = (editor, targetElm, uiRefs, backstage, floatContainer) => {\n      const {mainUi, uiMotherships} = uiRefs;\n      const DOM = global$7.DOM;\n      const useFixedToolbarContainer = useFixedContainer(editor);\n      const isSticky = isStickyToolbar(editor);\n      const editorMaxWidthOpt = getMaxWidthOption(editor).or(getWidth(editor));\n      const headerBackstage = backstage.shared.header;\n      const isPositionedAtTop = headerBackstage.isPositionedAtTop;\n      const minimumToolbarWidth = 150;\n      const toolbarMode = getToolbarMode(editor);\n      const isSplitToolbar = toolbarMode === ToolbarMode.sliding || toolbarMode === ToolbarMode.floating;\n      const visible = Cell(false);\n      const isVisible = () => visible.get() && !editor.removed;\n      const calcToolbarOffset = toolbar => isSplitToolbar ? toolbar.fold(constant$1(0), tbar => tbar.components().length > 1 ? get$d(tbar.components()[1].element) : 0) : 0;\n      const calcMode = container => {\n        switch (getToolbarLocation(editor)) {\n        case ToolbarLocation.auto:\n          const toolbar = OuterContainer.getToolbar(mainUi.outerContainer);\n          const offset = calcToolbarOffset(toolbar);\n          const toolbarHeight = get$d(container.element) - offset;\n          const targetBounds = box$1(targetElm);\n          const roomAtTop = targetBounds.y > toolbarHeight;\n          if (roomAtTop) {\n            return 'top';\n          } else {\n            const doc = documentElement(targetElm);\n            const docHeight = Math.max(doc.dom.scrollHeight, get$d(doc));\n            const roomAtBottom = targetBounds.bottom < docHeight - toolbarHeight;\n            if (roomAtBottom) {\n              return 'bottom';\n            } else {\n              const winBounds = win();\n              const isRoomAtBottomViewport = winBounds.bottom < targetBounds.bottom - toolbarHeight;\n              return isRoomAtBottomViewport ? 'bottom' : 'top';\n            }\n          }\n        case ToolbarLocation.bottom:\n          return 'bottom';\n        case ToolbarLocation.top:\n        default:\n          return 'top';\n        }\n      };\n      const setupMode = mode => {\n        floatContainer.on(container => {\n          Docking.setModes(container, [mode]);\n          headerBackstage.setDockingMode(mode);\n          const verticalDir = isPositionedAtTop() ? AttributeValue.TopToBottom : AttributeValue.BottomToTop;\n          set$9(container.element, Attribute, verticalDir);\n        });\n      };\n      const updateChromeWidth = () => {\n        floatContainer.on(container => {\n          const maxWidth = editorMaxWidthOpt.getOrThunk(() => {\n            const bodyMargin = parseToInt(get$e(body(), 'margin-left')).getOr(0);\n            return get$c(body()) - absolute$3(targetElm).left + bodyMargin;\n          });\n          set$8(container.element, 'max-width', maxWidth + 'px');\n        });\n      };\n      const updateChromePosition = isOuterContainerWidthRestored => {\n        floatContainer.on(container => {\n          const toolbar = OuterContainer.getToolbar(mainUi.outerContainer);\n          const offset = calcToolbarOffset(toolbar);\n          const targetBounds = box$1(targetElm);\n          const offsetParent = getOffsetParent$1(editor, mainUi.outerContainer.element);\n          const getLeft = () => offsetParent.fold(() => targetBounds.x, offsetParent => {\n            const offsetBox = box$1(offsetParent);\n            const isOffsetParentBody = eq(offsetParent, body());\n            return isOffsetParentBody ? targetBounds.x : targetBounds.x - offsetBox.x;\n          });\n          const getTop = () => offsetParent.fold(() => isPositionedAtTop() ? Math.max(targetBounds.y - get$d(container.element) + offset, 0) : targetBounds.bottom, offsetParent => {\n            var _a;\n            const offsetBox = box$1(offsetParent);\n            const scrollDelta = (_a = offsetParent.dom.scrollTop) !== null && _a !== void 0 ? _a : 0;\n            const isOffsetParentBody = eq(offsetParent, body());\n            const topValue = isOffsetParentBody ? Math.max(targetBounds.y - get$d(container.element) + offset, 0) : targetBounds.y - offsetBox.y + scrollDelta - get$d(container.element) + offset;\n            return isPositionedAtTop() ? topValue : targetBounds.bottom;\n          });\n          const left = getLeft();\n          const widthProperties = someIf(isOuterContainerWidthRestored, Math.ceil(mainUi.outerContainer.element.dom.getBoundingClientRect().width)).filter(w => w > minimumToolbarWidth).map(toolbarWidth => {\n            const scroll = get$b();\n            const availableWidth = window.innerWidth - (left - scroll.left);\n            const width = Math.max(Math.min(toolbarWidth, availableWidth), minimumToolbarWidth);\n            if (availableWidth < toolbarWidth) {\n              set$8(mainUi.outerContainer.element, 'width', width + 'px');\n            }\n            return { width: width + 'px' };\n          }).getOr({});\n          const baseProperties = {\n            position: 'absolute',\n            left: Math.round(left) + 'px',\n            top: getTop() + 'px'\n          };\n          setAll(mainUi.outerContainer.element, {\n            ...baseProperties,\n            ...widthProperties\n          });\n        });\n      };\n      const getOffsetParent$1 = (editor, element) => isSplitUiMode(editor) ? getOffsetParent(element) : Optional.none();\n      const repositionPopups$1 = () => {\n        each$1(uiMotherships, m => {\n          m.broadcastOn([repositionPopups()], {});\n        });\n      };\n      const restoreOuterContainerWidth = () => {\n        if (!useFixedToolbarContainer) {\n          const toolbarCurrentRightsidePosition = absolute$3(mainUi.outerContainer.element).left + getOuter$1(mainUi.outerContainer.element);\n          if (toolbarCurrentRightsidePosition >= window.innerWidth - maximumDistanceToEdge || getRaw(mainUi.outerContainer.element, 'width').isSome()) {\n            set$8(mainUi.outerContainer.element, 'position', 'absolute');\n            set$8(mainUi.outerContainer.element, 'left', '0px');\n            remove$6(mainUi.outerContainer.element, 'width');\n            return true;\n          }\n        }\n        return false;\n      };\n      const update = stickyAction => {\n        if (!isVisible()) {\n          return;\n        }\n        if (!useFixedToolbarContainer) {\n          updateChromeWidth();\n        }\n        const isOuterContainerWidthRestored = useFixedToolbarContainer ? false : restoreOuterContainerWidth();\n        if (isSplitToolbar) {\n          OuterContainer.refreshToolbar(mainUi.outerContainer);\n        }\n        if (!useFixedToolbarContainer) {\n          updateChromePosition(isOuterContainerWidthRestored);\n        }\n        if (isSticky) {\n          floatContainer.on(stickyAction);\n        }\n        repositionPopups$1();\n      };\n      const doUpdateMode = () => {\n        if (useFixedToolbarContainer || !isSticky || !isVisible()) {\n          return false;\n        }\n        return floatContainer.get().exists(fc => {\n          const currentMode = headerBackstage.getDockingMode();\n          const newMode = calcMode(fc);\n          if (newMode !== currentMode) {\n            setupMode(newMode);\n            return true;\n          } else {\n            return false;\n          }\n        });\n      };\n      const show = () => {\n        visible.set(true);\n        set$8(mainUi.outerContainer.element, 'display', 'flex');\n        DOM.addClass(editor.getBody(), 'mce-edit-focus');\n        each$1(uiMotherships, m => {\n          remove$6(m.element, 'display');\n        });\n        doUpdateMode();\n        if (isSplitUiMode(editor)) {\n          update(elem => Docking.isDocked(elem) ? Docking.reset(elem) : Docking.refresh(elem));\n        } else {\n          update(Docking.refresh);\n        }\n      };\n      const hide = () => {\n        visible.set(false);\n        set$8(mainUi.outerContainer.element, 'display', 'none');\n        DOM.removeClass(editor.getBody(), 'mce-edit-focus');\n        each$1(uiMotherships, m => {\n          set$8(m.element, 'display', 'none');\n        });\n      };\n      const updateMode = () => {\n        const changedMode = doUpdateMode();\n        if (changedMode) {\n          update(Docking.reset);\n        }\n      };\n      return {\n        isVisible,\n        isPositionedAtTop,\n        show,\n        hide,\n        update,\n        updateMode,\n        repositionPopups: repositionPopups$1\n      };\n    };\n\n    const getTargetPosAndBounds = (targetElm, isToolbarTop) => {\n      const bounds = box$1(targetElm);\n      return {\n        pos: isToolbarTop ? bounds.y : bounds.bottom,\n        bounds\n      };\n    };\n    const setupEvents = (editor, targetElm, ui, toolbarPersist) => {\n      const prevPosAndBounds = Cell(getTargetPosAndBounds(targetElm, ui.isPositionedAtTop()));\n      const resizeContent = e => {\n        const {pos, bounds} = getTargetPosAndBounds(targetElm, ui.isPositionedAtTop());\n        const {\n          pos: prevPos,\n          bounds: prevBounds\n        } = prevPosAndBounds.get();\n        const hasResized = bounds.height !== prevBounds.height || bounds.width !== prevBounds.width;\n        prevPosAndBounds.set({\n          pos,\n          bounds\n        });\n        if (hasResized) {\n          fireResizeContent(editor, e);\n        }\n        if (ui.isVisible()) {\n          if (prevPos !== pos) {\n            ui.update(Docking.reset);\n          } else if (hasResized) {\n            ui.updateMode();\n            ui.repositionPopups();\n          }\n        }\n      };\n      if (!toolbarPersist) {\n        editor.on('activate', ui.show);\n        editor.on('deactivate', ui.hide);\n      }\n      editor.on('SkinLoaded ResizeWindow', () => ui.update(Docking.reset));\n      editor.on('NodeChange keydown', e => {\n        requestAnimationFrame(() => resizeContent(e));\n      });\n      let lastScrollX = 0;\n      const updateUi = last(() => ui.update(Docking.refresh), 33);\n      editor.on('ScrollWindow', () => {\n        const newScrollX = get$b().left;\n        if (newScrollX !== lastScrollX) {\n          lastScrollX = newScrollX;\n          updateUi.throttle();\n        }\n        ui.updateMode();\n      });\n      if (isSplitUiMode(editor)) {\n        editor.on('ElementScroll', _args => {\n          ui.update(Docking.refresh);\n        });\n      }\n      const elementLoad = unbindable();\n      elementLoad.set(capture(SugarElement.fromDom(editor.getBody()), 'load', e => resizeContent(e.raw)));\n      editor.on('remove', () => {\n        elementLoad.clear();\n      });\n    };\n    const render = (editor, uiRefs, rawUiConfig, backstage, args) => {\n      const {mainUi} = uiRefs;\n      const floatContainer = value$2();\n      const targetElm = SugarElement.fromDom(args.targetNode);\n      const ui = InlineHeader(editor, targetElm, uiRefs, backstage, floatContainer);\n      const toolbarPersist = isToolbarPersist(editor);\n      inline(editor);\n      const render = () => {\n        if (floatContainer.isSet()) {\n          ui.show();\n          return;\n        }\n        floatContainer.set(OuterContainer.getHeader(mainUi.outerContainer).getOrDie());\n        const uiContainer = getUiContainer(editor);\n        if (isSplitUiMode(editor)) {\n          attachSystemAfter(targetElm, mainUi.mothership);\n          attachSystemAfter(targetElm, uiRefs.popupUi.mothership);\n        } else {\n          attachSystem(uiContainer, mainUi.mothership);\n        }\n        attachSystem(uiContainer, uiRefs.dialogUi.mothership);\n        const setup = () => {\n          setToolbar(editor, uiRefs, rawUiConfig, backstage);\n          OuterContainer.setMenubar(mainUi.outerContainer, identifyMenus(editor, rawUiConfig));\n          ui.show();\n          setupEvents(editor, targetElm, ui, toolbarPersist);\n          editor.nodeChanged();\n        };\n        if (toolbarPersist) {\n          editor.once('SkinLoaded', setup);\n        } else {\n          setup();\n        }\n      };\n      editor.on('show', render);\n      editor.on('hide', ui.hide);\n      if (!toolbarPersist) {\n        editor.on('focus', render);\n        editor.on('blur', ui.hide);\n      }\n      editor.on('init', () => {\n        if (editor.hasFocus() || toolbarPersist) {\n          render();\n        }\n      });\n      setupReadonlyModeSwitch(editor, uiRefs);\n      const api = {\n        show: render,\n        hide: ui.hide,\n        setEnabled: state => {\n          broadcastReadonly(uiRefs, !state);\n        },\n        isEnabled: () => !Disabling.isDisabled(mainUi.outerContainer)\n      };\n      return {\n        editorContainer: mainUi.outerContainer.element.dom,\n        api\n      };\n    };\n\n    var Inline = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        render: render\n    });\n\n    const LazyUiReferences = () => {\n      const dialogUi = value$2();\n      const popupUi = value$2();\n      const mainUi = value$2();\n      const lazyGetInOuterOrDie = (label, f) => () => mainUi.get().bind(oc => f(oc.outerContainer)).getOrDie(`Could not find ${ label } element in OuterContainer`);\n      const getUiMotherships = () => {\n        const optDialogMothership = dialogUi.get().map(ui => ui.mothership);\n        const optPopupMothership = popupUi.get().map(ui => ui.mothership);\n        return optDialogMothership.fold(() => optPopupMothership.toArray(), dm => optPopupMothership.fold(() => [dm], pm => eq(dm.element, pm.element) ? [dm] : [\n          dm,\n          pm\n        ]));\n      };\n      return {\n        dialogUi,\n        popupUi,\n        mainUi,\n        getUiMotherships,\n        lazyGetInOuterOrDie\n      };\n    };\n\n    const showContextToolbarEvent = 'contexttoolbar-show';\n    const hideContextToolbarEvent = 'contexttoolbar-hide';\n\n    const getFormApi = input => ({\n      hide: () => emit(input, sandboxClose()),\n      getValue: () => Representing.getValue(input)\n    });\n    const runOnExecute = (memInput, original) => run$1(internalToolbarButtonExecute, (comp, se) => {\n      const input = memInput.get(comp);\n      const formApi = getFormApi(input);\n      original.onAction(formApi, se.event.buttonApi);\n    });\n    const renderContextButton = (memInput, button, providers) => {\n      const {primary, ...rest} = button.original;\n      const bridged = getOrDie(createToolbarButton({\n        ...rest,\n        type: 'button',\n        onAction: noop\n      }));\n      return renderToolbarButtonWith(bridged, providers, [runOnExecute(memInput, button)]);\n    };\n    const renderContextToggleButton = (memInput, button, providers) => {\n      const {primary, ...rest} = button.original;\n      const bridged = getOrDie(createToggleButton({\n        ...rest,\n        type: 'togglebutton',\n        onAction: noop\n      }));\n      return renderToolbarToggleButtonWith(bridged, providers, [runOnExecute(memInput, button)]);\n    };\n    const isToggleButton = button => button.type === 'contextformtogglebutton';\n    const generateOne = (memInput, button, providersBackstage) => {\n      if (isToggleButton(button)) {\n        return renderContextToggleButton(memInput, button, providersBackstage);\n      } else {\n        return renderContextButton(memInput, button, providersBackstage);\n      }\n    };\n    const generate = (memInput, buttons, providersBackstage) => {\n      const mementos = map$2(buttons, button => record(generateOne(memInput, button, providersBackstage)));\n      const asSpecs = () => map$2(mementos, mem => mem.asSpec());\n      const findPrimary = compInSystem => findMap(buttons, (button, i) => {\n        if (button.primary) {\n          return Optional.from(mementos[i]).bind(mem => mem.getOpt(compInSystem)).filter(not(Disabling.isDisabled));\n        } else {\n          return Optional.none();\n        }\n      });\n      return {\n        asSpecs,\n        findPrimary\n      };\n    };\n\n    const buildInitGroups = (ctx, providers) => {\n      const inputAttributes = ctx.label.fold(() => ({}), label => ({ 'aria-label': label }));\n      const memInput = record(Input.sketch({\n        inputClasses: [\n          'tox-toolbar-textfield',\n          'tox-toolbar-nav-js'\n        ],\n        data: ctx.initValue(),\n        inputAttributes,\n        selectOnFocus: true,\n        inputBehaviours: derive$1([Keying.config({\n            mode: 'special',\n            onEnter: input => commands.findPrimary(input).map(primary => {\n              emitExecute(primary);\n              return true;\n            }),\n            onLeft: (comp, se) => {\n              se.cut();\n              return Optional.none();\n            },\n            onRight: (comp, se) => {\n              se.cut();\n              return Optional.none();\n            }\n          })])\n      }));\n      const commands = generate(memInput, ctx.commands, providers);\n      return [\n        {\n          title: Optional.none(),\n          items: [memInput.asSpec()]\n        },\n        {\n          title: Optional.none(),\n          items: commands.asSpecs()\n        }\n      ];\n    };\n    const renderContextForm = (toolbarType, ctx, providers) => renderToolbar({\n      type: toolbarType,\n      uid: generate$6('context-toolbar'),\n      initGroups: buildInitGroups(ctx, providers),\n      onEscape: Optional.none,\n      cyclicKeying: true,\n      providers\n    });\n    const ContextForm = {\n      renderContextForm,\n      buildInitGroups\n    };\n\n    const isVerticalOverlap = (a, b, threshold) => b.bottom - a.y >= threshold && a.bottom - b.y >= threshold;\n    const getRangeRect = rng => {\n      const rect = rng.getBoundingClientRect();\n      if (rect.height <= 0 && rect.width <= 0) {\n        const leaf$1 = leaf(SugarElement.fromDom(rng.startContainer), rng.startOffset).element;\n        const elm = isText(leaf$1) ? parent(leaf$1) : Optional.some(leaf$1);\n        return elm.filter(isElement$1).map(e => e.dom.getBoundingClientRect()).getOr(rect);\n      } else {\n        return rect;\n      }\n    };\n    const getSelectionBounds = editor => {\n      const rng = editor.selection.getRng();\n      const rect = getRangeRect(rng);\n      if (editor.inline) {\n        const scroll = get$b();\n        return bounds(scroll.left + rect.left, scroll.top + rect.top, rect.width, rect.height);\n      } else {\n        const bodyPos = absolute$2(SugarElement.fromDom(editor.getBody()));\n        return bounds(bodyPos.x + rect.left, bodyPos.y + rect.top, rect.width, rect.height);\n      }\n    };\n    const getAnchorElementBounds = (editor, lastElement) => lastElement.filter(elem => inBody(elem) && isHTMLElement(elem)).map(absolute$2).getOrThunk(() => getSelectionBounds(editor));\n    const getHorizontalBounds = (contentAreaBox, viewportBounds, margin) => {\n      const x = Math.max(contentAreaBox.x + margin, viewportBounds.x);\n      const right = Math.min(contentAreaBox.right - margin, viewportBounds.right);\n      return {\n        x,\n        width: right - x\n      };\n    };\n    const getVerticalBounds = (editor, contentAreaBox, viewportBounds, isToolbarLocationTop, toolbarType, margin) => {\n      const container = SugarElement.fromDom(editor.getContainer());\n      const header = descendant(container, '.tox-editor-header').getOr(container);\n      const headerBox = box$1(header);\n      const isToolbarBelowContentArea = headerBox.y >= contentAreaBox.bottom;\n      const isToolbarAbove = isToolbarLocationTop && !isToolbarBelowContentArea;\n      if (editor.inline && isToolbarAbove) {\n        return {\n          y: Math.max(headerBox.bottom + margin, viewportBounds.y),\n          bottom: viewportBounds.bottom\n        };\n      }\n      if (editor.inline && !isToolbarAbove) {\n        return {\n          y: viewportBounds.y,\n          bottom: Math.min(headerBox.y - margin, viewportBounds.bottom)\n        };\n      }\n      const containerBounds = toolbarType === 'line' ? box$1(container) : contentAreaBox;\n      if (isToolbarAbove) {\n        return {\n          y: Math.max(headerBox.bottom + margin, viewportBounds.y),\n          bottom: Math.min(containerBounds.bottom - margin, viewportBounds.bottom)\n        };\n      }\n      return {\n        y: Math.max(containerBounds.y + margin, viewportBounds.y),\n        bottom: Math.min(headerBox.y - margin, viewportBounds.bottom)\n      };\n    };\n    const getContextToolbarBounds = (editor, sharedBackstage, toolbarType, margin = 0) => {\n      const viewportBounds = getBounds$3(window);\n      const contentAreaBox = box$1(SugarElement.fromDom(editor.getContentAreaContainer()));\n      const toolbarOrMenubarEnabled = isMenubarEnabled(editor) || isToolbarEnabled(editor) || isMultipleToolbars(editor);\n      const {x, width} = getHorizontalBounds(contentAreaBox, viewportBounds, margin);\n      if (editor.inline && !toolbarOrMenubarEnabled) {\n        return bounds(x, viewportBounds.y, width, viewportBounds.height);\n      } else {\n        const isToolbarTop = sharedBackstage.header.isPositionedAtTop();\n        const {y, bottom} = getVerticalBounds(editor, contentAreaBox, viewportBounds, isToolbarTop, toolbarType, margin);\n        return bounds(x, y, width, bottom - y);\n      }\n    };\n\n    const bubbleSize$1 = 12;\n    const bubbleAlignments$1 = {\n      valignCentre: [],\n      alignCentre: [],\n      alignLeft: ['tox-pop--align-left'],\n      alignRight: ['tox-pop--align-right'],\n      right: ['tox-pop--right'],\n      left: ['tox-pop--left'],\n      bottom: ['tox-pop--bottom'],\n      top: ['tox-pop--top'],\n      inset: ['tox-pop--inset']\n    };\n    const anchorOverrides = {\n      maxHeightFunction: expandable$1(),\n      maxWidthFunction: expandable()\n    };\n    const isEntireElementSelected = (editor, elem) => {\n      const rng = editor.selection.getRng();\n      const leaf$1 = leaf(SugarElement.fromDom(rng.startContainer), rng.startOffset);\n      return rng.startContainer === rng.endContainer && rng.startOffset === rng.endOffset - 1 && eq(leaf$1.element, elem);\n    };\n    const preservePosition = (elem, position, f) => {\n      const currentPosition = getRaw(elem, 'position');\n      set$8(elem, 'position', position);\n      const result = f(elem);\n      currentPosition.each(pos => set$8(elem, 'position', pos));\n      return result;\n    };\n    const shouldUseInsetLayouts = position => position === 'node';\n    const determineInsetLayout = (editor, contextbar, elem, data, bounds) => {\n      const selectionBounds = getSelectionBounds(editor);\n      const isSameAnchorElement = data.lastElement().exists(prev => eq(elem, prev));\n      if (isEntireElementSelected(editor, elem)) {\n        return isSameAnchorElement ? preserve : north;\n      } else if (isSameAnchorElement) {\n        return preservePosition(contextbar, data.getMode(), () => {\n          const isOverlapping = isVerticalOverlap(selectionBounds, box$1(contextbar), -20);\n          return isOverlapping && !data.isReposition() ? flip : preserve;\n        });\n      } else {\n        const yBounds = data.getMode() === 'fixed' ? bounds.y + get$b().top : bounds.y;\n        const contextbarHeight = get$d(contextbar) + bubbleSize$1;\n        return yBounds + contextbarHeight <= selectionBounds.y ? north : south;\n      }\n    };\n    const getAnchorSpec$2 = (editor, mobile, data, position) => {\n      const smartInsetLayout = elem => (anchor, element, bubbles, placee, bounds) => {\n        const layout = determineInsetLayout(editor, placee, elem, data, bounds);\n        const newAnchor = {\n          ...anchor,\n          y: bounds.y,\n          height: bounds.height\n        };\n        return {\n          ...layout(newAnchor, element, bubbles, placee, bounds),\n          alwaysFit: true\n        };\n      };\n      const getInsetLayouts = elem => shouldUseInsetLayouts(position) ? [smartInsetLayout(elem)] : [];\n      const desktopAnchorSpecLayouts = {\n        onLtr: elem => [\n          north$2,\n          south$2,\n          northeast$2,\n          southeast$2,\n          northwest$2,\n          southwest$2\n        ].concat(getInsetLayouts(elem)),\n        onRtl: elem => [\n          north$2,\n          south$2,\n          northwest$2,\n          southwest$2,\n          northeast$2,\n          southeast$2\n        ].concat(getInsetLayouts(elem))\n      };\n      const mobileAnchorSpecLayouts = {\n        onLtr: elem => [\n          south$2,\n          southeast$2,\n          southwest$2,\n          northeast$2,\n          northwest$2,\n          north$2\n        ].concat(getInsetLayouts(elem)),\n        onRtl: elem => [\n          south$2,\n          southwest$2,\n          southeast$2,\n          northwest$2,\n          northeast$2,\n          north$2\n        ].concat(getInsetLayouts(elem))\n      };\n      return mobile ? mobileAnchorSpecLayouts : desktopAnchorSpecLayouts;\n    };\n    const getAnchorLayout = (editor, position, isTouch, data) => {\n      if (position === 'line') {\n        return {\n          bubble: nu$5(bubbleSize$1, 0, bubbleAlignments$1),\n          layouts: {\n            onLtr: () => [east$2],\n            onRtl: () => [west$2]\n          },\n          overrides: anchorOverrides\n        };\n      } else {\n        return {\n          bubble: nu$5(0, bubbleSize$1, bubbleAlignments$1, 1 / bubbleSize$1),\n          layouts: getAnchorSpec$2(editor, isTouch, data, position),\n          overrides: anchorOverrides\n        };\n      }\n    };\n\n    const matchTargetWith = (elem, candidates) => {\n      const ctxs = filter$2(candidates, toolbarApi => toolbarApi.predicate(elem.dom));\n      const {pass, fail} = partition$3(ctxs, t => t.type === 'contexttoolbar');\n      return {\n        contextToolbars: pass,\n        contextForms: fail\n      };\n    };\n    const filterByPositionForStartNode = toolbars => {\n      if (toolbars.length <= 1) {\n        return toolbars;\n      } else {\n        const doesPositionExist = value => exists(toolbars, t => t.position === value);\n        const filterToolbarsByPosition = value => filter$2(toolbars, t => t.position === value);\n        const hasSelectionToolbars = doesPositionExist('selection');\n        const hasNodeToolbars = doesPositionExist('node');\n        if (hasSelectionToolbars || hasNodeToolbars) {\n          if (hasNodeToolbars && hasSelectionToolbars) {\n            const nodeToolbars = filterToolbarsByPosition('node');\n            const selectionToolbars = map$2(filterToolbarsByPosition('selection'), t => ({\n              ...t,\n              position: 'node'\n            }));\n            return nodeToolbars.concat(selectionToolbars);\n          } else {\n            return hasSelectionToolbars ? filterToolbarsByPosition('selection') : filterToolbarsByPosition('node');\n          }\n        } else {\n          return filterToolbarsByPosition('line');\n        }\n      }\n    };\n    const filterByPositionForAncestorNode = toolbars => {\n      if (toolbars.length <= 1) {\n        return toolbars;\n      } else {\n        const findPosition = value => find$5(toolbars, t => t.position === value);\n        const basePosition = findPosition('selection').orThunk(() => findPosition('node')).orThunk(() => findPosition('line')).map(t => t.position);\n        return basePosition.fold(() => [], pos => filter$2(toolbars, t => t.position === pos));\n      }\n    };\n    const matchStartNode = (elem, nodeCandidates, editorCandidates) => {\n      const nodeMatches = matchTargetWith(elem, nodeCandidates);\n      if (nodeMatches.contextForms.length > 0) {\n        return Optional.some({\n          elem,\n          toolbars: [nodeMatches.contextForms[0]]\n        });\n      } else {\n        const editorMatches = matchTargetWith(elem, editorCandidates);\n        if (editorMatches.contextForms.length > 0) {\n          return Optional.some({\n            elem,\n            toolbars: [editorMatches.contextForms[0]]\n          });\n        } else if (nodeMatches.contextToolbars.length > 0 || editorMatches.contextToolbars.length > 0) {\n          const toolbars = filterByPositionForStartNode(nodeMatches.contextToolbars.concat(editorMatches.contextToolbars));\n          return Optional.some({\n            elem,\n            toolbars\n          });\n        } else {\n          return Optional.none();\n        }\n      }\n    };\n    const matchAncestor = (isRoot, startNode, scopes) => {\n      if (isRoot(startNode)) {\n        return Optional.none();\n      } else {\n        return ancestor$2(startNode, ancestorElem => {\n          if (isElement$1(ancestorElem)) {\n            const {contextToolbars, contextForms} = matchTargetWith(ancestorElem, scopes.inNodeScope);\n            const toolbars = contextForms.length > 0 ? contextForms : filterByPositionForAncestorNode(contextToolbars);\n            return toolbars.length > 0 ? Optional.some({\n              elem: ancestorElem,\n              toolbars\n            }) : Optional.none();\n          } else {\n            return Optional.none();\n          }\n        }, isRoot);\n      }\n    };\n    const lookup$1 = (scopes, editor) => {\n      const rootElem = SugarElement.fromDom(editor.getBody());\n      const isRoot = elem => eq(elem, rootElem);\n      const isOutsideRoot = startNode => !isRoot(startNode) && !contains(rootElem, startNode);\n      const startNode = SugarElement.fromDom(editor.selection.getNode());\n      if (isOutsideRoot(startNode)) {\n        return Optional.none();\n      }\n      return matchStartNode(startNode, scopes.inNodeScope, scopes.inEditorScope).orThunk(() => matchAncestor(isRoot, startNode, scopes));\n    };\n\n    const categorise = (contextToolbars, navigate) => {\n      const forms = {};\n      const inNodeScope = [];\n      const inEditorScope = [];\n      const formNavigators = {};\n      const lookupTable = {};\n      const registerForm = (key, toolbarSpec) => {\n        const contextForm = getOrDie(createContextForm(toolbarSpec));\n        forms[key] = contextForm;\n        contextForm.launch.map(launch => {\n          formNavigators['form:' + key + ''] = {\n            ...toolbarSpec.launch,\n            type: launch.type === 'contextformtogglebutton' ? 'togglebutton' : 'button',\n            onAction: () => {\n              navigate(contextForm);\n            }\n          };\n        });\n        if (contextForm.scope === 'editor') {\n          inEditorScope.push(contextForm);\n        } else {\n          inNodeScope.push(contextForm);\n        }\n        lookupTable[key] = contextForm;\n      };\n      const registerToolbar = (key, toolbarSpec) => {\n        createContextToolbar(toolbarSpec).each(contextToolbar => {\n          if (toolbarSpec.scope === 'editor') {\n            inEditorScope.push(contextToolbar);\n          } else {\n            inNodeScope.push(contextToolbar);\n          }\n          lookupTable[key] = contextToolbar;\n        });\n      };\n      const keys$1 = keys(contextToolbars);\n      each$1(keys$1, key => {\n        const toolbarApi = contextToolbars[key];\n        if (toolbarApi.type === 'contextform') {\n          registerForm(key, toolbarApi);\n        } else if (toolbarApi.type === 'contexttoolbar') {\n          registerToolbar(key, toolbarApi);\n        }\n      });\n      return {\n        forms,\n        inNodeScope,\n        inEditorScope,\n        lookupTable,\n        formNavigators\n      };\n    };\n\n    const forwardSlideEvent = generate$6('forward-slide');\n    const backSlideEvent = generate$6('backward-slide');\n    const changeSlideEvent = generate$6('change-slide-event');\n    const resizingClass = 'tox-pop--resizing';\n    const renderContextToolbar = spec => {\n      const stack = Cell([]);\n      return InlineView.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-pop']\n        },\n        fireDismissalEventInstead: { event: 'doNotDismissYet' },\n        onShow: comp => {\n          stack.set([]);\n          InlineView.getContent(comp).each(c => {\n            remove$6(c.element, 'visibility');\n          });\n          remove$2(comp.element, resizingClass);\n          remove$6(comp.element, 'width');\n        },\n        inlineBehaviours: derive$1([\n          config('context-toolbar-events', [\n            runOnSource(transitionend(), (comp, se) => {\n              if (se.event.raw.propertyName === 'width') {\n                remove$2(comp.element, resizingClass);\n                remove$6(comp.element, 'width');\n              }\n            }),\n            run$1(changeSlideEvent, (comp, se) => {\n              const elem = comp.element;\n              remove$6(elem, 'width');\n              const currentWidth = get$c(elem);\n              InlineView.setContent(comp, se.event.contents);\n              add$2(elem, resizingClass);\n              const newWidth = get$c(elem);\n              set$8(elem, 'width', currentWidth + 'px');\n              InlineView.getContent(comp).each(newContents => {\n                se.event.focus.bind(f => {\n                  focus$3(f);\n                  return search(elem);\n                }).orThunk(() => {\n                  Keying.focusIn(newContents);\n                  return active$1(getRootNode(elem));\n                });\n              });\n              setTimeout(() => {\n                set$8(comp.element, 'width', newWidth + 'px');\n              }, 0);\n            }),\n            run$1(forwardSlideEvent, (comp, se) => {\n              InlineView.getContent(comp).each(oldContents => {\n                stack.set(stack.get().concat([{\n                    bar: oldContents,\n                    focus: active$1(getRootNode(comp.element))\n                  }]));\n              });\n              emitWith(comp, changeSlideEvent, {\n                contents: se.event.forwardContents,\n                focus: Optional.none()\n              });\n            }),\n            run$1(backSlideEvent, (comp, _se) => {\n              last$1(stack.get()).each(last => {\n                stack.set(stack.get().slice(0, stack.get().length - 1));\n                emitWith(comp, changeSlideEvent, {\n                  contents: premade(last.bar),\n                  focus: last.focus\n                });\n              });\n            })\n          ]),\n          Keying.config({\n            mode: 'special',\n            onEscape: comp => last$1(stack.get()).fold(() => spec.onEscape(), _ => {\n              emit(comp, backSlideEvent);\n              return Optional.some(true);\n            })\n          })\n        ]),\n        lazySink: () => Result.value(spec.sink)\n      });\n    };\n\n    const transitionClass = 'tox-pop--transition';\n    const register$9 = (editor, registryContextToolbars, sink, extras) => {\n      const backstage = extras.backstage;\n      const sharedBackstage = backstage.shared;\n      const isTouch = detect$1().deviceType.isTouch;\n      const lastElement = value$2();\n      const lastTrigger = value$2();\n      const lastContextPosition = value$2();\n      const contextbar = build$1(renderContextToolbar({\n        sink,\n        onEscape: () => {\n          editor.focus();\n          return Optional.some(true);\n        }\n      }));\n      const getBounds = () => {\n        const position = lastContextPosition.get().getOr('node');\n        const margin = shouldUseInsetLayouts(position) ? 1 : 0;\n        return getContextToolbarBounds(editor, sharedBackstage, position, margin);\n      };\n      const canLaunchToolbar = () => {\n        return !editor.removed && !(isTouch() && backstage.isContextMenuOpen());\n      };\n      const isSameLaunchElement = elem => is$1(lift2(elem, lastElement.get(), eq), true);\n      const shouldContextToolbarHide = () => {\n        if (!canLaunchToolbar()) {\n          return true;\n        } else {\n          const contextToolbarBounds = getBounds();\n          const anchorBounds = is$1(lastContextPosition.get(), 'node') ? getAnchorElementBounds(editor, lastElement.get()) : getSelectionBounds(editor);\n          return contextToolbarBounds.height <= 0 || !isVerticalOverlap(anchorBounds, contextToolbarBounds, 0.01);\n        }\n      };\n      const close = () => {\n        lastElement.clear();\n        lastTrigger.clear();\n        lastContextPosition.clear();\n        InlineView.hide(contextbar);\n      };\n      const hideOrRepositionIfNecessary = () => {\n        if (InlineView.isOpen(contextbar)) {\n          const contextBarEle = contextbar.element;\n          remove$6(contextBarEle, 'display');\n          if (shouldContextToolbarHide()) {\n            set$8(contextBarEle, 'display', 'none');\n          } else {\n            lastTrigger.set(0);\n            InlineView.reposition(contextbar);\n          }\n        }\n      };\n      const wrapInPopDialog = toolbarSpec => ({\n        dom: {\n          tag: 'div',\n          classes: ['tox-pop__dialog']\n        },\n        components: [toolbarSpec],\n        behaviours: derive$1([\n          Keying.config({ mode: 'acyclic' }),\n          config('pop-dialog-wrap-events', [\n            runOnAttached(comp => {\n              editor.shortcuts.add('ctrl+F9', 'focus statusbar', () => Keying.focusIn(comp));\n            }),\n            runOnDetached(_comp => {\n              editor.shortcuts.remove('ctrl+F9');\n            })\n          ])\n        ])\n      });\n      const getScopes = cached(() => categorise(registryContextToolbars, toolbarApi => {\n        const alloySpec = buildToolbar([toolbarApi]);\n        emitWith(contextbar, forwardSlideEvent, { forwardContents: wrapInPopDialog(alloySpec) });\n      }));\n      const buildContextToolbarGroups = (allButtons, ctx) => identifyButtons(editor, {\n        buttons: allButtons,\n        toolbar: ctx.items,\n        allowToolbarGroups: false\n      }, extras.backstage, Optional.some(['form:']));\n      const buildContextFormGroups = (ctx, providers) => ContextForm.buildInitGroups(ctx, providers);\n      const buildToolbar = toolbars => {\n        const {buttons} = editor.ui.registry.getAll();\n        const scopes = getScopes();\n        const allButtons = {\n          ...buttons,\n          ...scopes.formNavigators\n        };\n        const toolbarType = getToolbarMode(editor) === ToolbarMode$1.scrolling ? ToolbarMode$1.scrolling : ToolbarMode$1.default;\n        const initGroups = flatten(map$2(toolbars, ctx => ctx.type === 'contexttoolbar' ? buildContextToolbarGroups(allButtons, ctx) : buildContextFormGroups(ctx, sharedBackstage.providers)));\n        return renderToolbar({\n          type: toolbarType,\n          uid: generate$6('context-toolbar'),\n          initGroups,\n          onEscape: Optional.none,\n          cyclicKeying: true,\n          providers: sharedBackstage.providers\n        });\n      };\n      const getAnchor = (position, element) => {\n        const anchorage = position === 'node' ? sharedBackstage.anchors.node(element) : sharedBackstage.anchors.cursor();\n        const anchorLayout = getAnchorLayout(editor, position, isTouch(), {\n          lastElement: lastElement.get,\n          isReposition: () => is$1(lastTrigger.get(), 0),\n          getMode: () => Positioning.getMode(sink)\n        });\n        return deepMerge(anchorage, anchorLayout);\n      };\n      const launchContext = (toolbarApi, elem) => {\n        launchContextToolbar.cancel();\n        if (!canLaunchToolbar()) {\n          return;\n        }\n        const toolbarSpec = buildToolbar(toolbarApi);\n        const position = toolbarApi[0].position;\n        const anchor = getAnchor(position, elem);\n        lastContextPosition.set(position);\n        lastTrigger.set(1);\n        const contextBarEle = contextbar.element;\n        remove$6(contextBarEle, 'display');\n        if (!isSameLaunchElement(elem)) {\n          remove$2(contextBarEle, transitionClass);\n          Positioning.reset(sink, contextbar);\n        }\n        InlineView.showWithinBounds(contextbar, wrapInPopDialog(toolbarSpec), {\n          anchor,\n          transition: {\n            classes: [transitionClass],\n            mode: 'placement'\n          }\n        }, () => Optional.some(getBounds()));\n        elem.fold(lastElement.clear, lastElement.set);\n        if (shouldContextToolbarHide()) {\n          set$8(contextBarEle, 'display', 'none');\n        }\n      };\n      let isDragging = false;\n      const launchContextToolbar = last(() => {\n        if (!editor.hasFocus() || editor.removed || isDragging) {\n          return;\n        }\n        if (has(contextbar.element, transitionClass)) {\n          launchContextToolbar.throttle();\n        } else {\n          const scopes = getScopes();\n          lookup$1(scopes, editor).fold(close, info => {\n            launchContext(info.toolbars, Optional.some(info.elem));\n          });\n        }\n      }, 17);\n      editor.on('init', () => {\n        editor.on('remove', close);\n        editor.on('ScrollContent ScrollWindow ObjectResized ResizeEditor longpress', hideOrRepositionIfNecessary);\n        editor.on('click keyup focus SetContent', launchContextToolbar.throttle);\n        editor.on(hideContextToolbarEvent, close);\n        editor.on(showContextToolbarEvent, e => {\n          const scopes = getScopes();\n          get$g(scopes.lookupTable, e.toolbarKey).each(ctx => {\n            launchContext([ctx], someIf(e.target !== editor, e.target));\n            InlineView.getContent(contextbar).each(Keying.focusIn);\n          });\n        });\n        editor.on('focusout', _e => {\n          global$9.setEditorTimeout(editor, () => {\n            if (search(sink.element).isNone() && search(contextbar.element).isNone()) {\n              close();\n            }\n          }, 0);\n        });\n        editor.on('SwitchMode', () => {\n          if (editor.mode.isReadOnly()) {\n            close();\n          }\n        });\n        editor.on('ExecCommand', ({command}) => {\n          if (command.toLowerCase() === 'toggleview') {\n            close();\n          }\n        });\n        editor.on('AfterProgressState', event => {\n          if (event.state) {\n            close();\n          } else if (editor.hasFocus()) {\n            launchContextToolbar.throttle();\n          }\n        });\n        editor.on('dragstart', () => {\n          isDragging = true;\n        });\n        editor.on('dragend drop', () => {\n          isDragging = false;\n        });\n        editor.on('NodeChange', _e => {\n          search(contextbar.element).fold(launchContextToolbar.throttle, noop);\n        });\n      });\n    };\n\n    const register$8 = editor => {\n      const alignToolbarButtons = [\n        {\n          name: 'alignleft',\n          text: 'Align left',\n          cmd: 'JustifyLeft',\n          icon: 'align-left'\n        },\n        {\n          name: 'aligncenter',\n          text: 'Align center',\n          cmd: 'JustifyCenter',\n          icon: 'align-center'\n        },\n        {\n          name: 'alignright',\n          text: 'Align right',\n          cmd: 'JustifyRight',\n          icon: 'align-right'\n        },\n        {\n          name: 'alignjustify',\n          text: 'Justify',\n          cmd: 'JustifyFull',\n          icon: 'align-justify'\n        }\n      ];\n      each$1(alignToolbarButtons, item => {\n        editor.ui.registry.addToggleButton(item.name, {\n          tooltip: item.text,\n          icon: item.icon,\n          onAction: onActionExecCommand(editor, item.cmd),\n          onSetup: onSetupStateToggle(editor, item.name)\n        });\n      });\n      editor.ui.registry.addButton('alignnone', {\n        tooltip: 'No alignment',\n        icon: 'align-none',\n        onSetup: onSetupEditableToggle(editor),\n        onAction: onActionExecCommand(editor, 'JustifyNone')\n      });\n    };\n\n    const registerController = (editor, spec) => {\n      const getMenuItems = () => {\n        const options = spec.getOptions(editor);\n        const initial = spec.getCurrent(editor).map(spec.hash);\n        const current = value$2();\n        return map$2(options, value => ({\n          type: 'togglemenuitem',\n          text: spec.display(value),\n          onSetup: api => {\n            const setActive = active => {\n              if (active) {\n                current.on(oldApi => oldApi.setActive(false));\n                current.set(api);\n              }\n              api.setActive(active);\n            };\n            setActive(is$1(initial, spec.hash(value)));\n            const unbindWatcher = spec.watcher(editor, value, setActive);\n            return () => {\n              current.clear();\n              unbindWatcher();\n            };\n          },\n          onAction: () => spec.setCurrent(editor, value)\n        }));\n      };\n      editor.ui.registry.addMenuButton(spec.name, {\n        tooltip: spec.text,\n        icon: spec.icon,\n        fetch: callback => callback(getMenuItems()),\n        onSetup: spec.onToolbarSetup\n      });\n      editor.ui.registry.addNestedMenuItem(spec.name, {\n        type: 'nestedmenuitem',\n        text: spec.text,\n        getSubmenuItems: getMenuItems,\n        onSetup: spec.onMenuSetup\n      });\n    };\n    const lineHeightSpec = editor => ({\n      name: 'lineheight',\n      text: 'Line height',\n      icon: 'line-height',\n      getOptions: getLineHeightFormats,\n      hash: input => normalise(input, [\n        'fixed',\n        'relative',\n        'empty'\n      ]).getOr(input),\n      display: identity,\n      watcher: (editor, value, callback) => editor.formatter.formatChanged('lineheight', callback, false, { value }).unbind,\n      getCurrent: editor => Optional.from(editor.queryCommandValue('LineHeight')),\n      setCurrent: (editor, value) => editor.execCommand('LineHeight', false, value),\n      onToolbarSetup: onSetupEditableToggle(editor),\n      onMenuSetup: onSetupEditableToggle(editor)\n    });\n    const languageSpec = editor => {\n      const settingsOpt = Optional.from(getContentLanguages(editor));\n      return settingsOpt.map(settings => ({\n        name: 'language',\n        text: 'Language',\n        icon: 'language',\n        getOptions: constant$1(settings),\n        hash: input => isUndefined(input.customCode) ? input.code : `${ input.code }/${ input.customCode }`,\n        display: input => input.title,\n        watcher: (editor, value, callback) => {\n          var _a;\n          return editor.formatter.formatChanged('lang', callback, false, {\n            value: value.code,\n            customValue: (_a = value.customCode) !== null && _a !== void 0 ? _a : null\n          }).unbind;\n        },\n        getCurrent: editor => {\n          const node = SugarElement.fromDom(editor.selection.getNode());\n          return closest$4(node, n => Optional.some(n).filter(isElement$1).bind(ele => {\n            const codeOpt = getOpt(ele, 'lang');\n            return codeOpt.map(code => {\n              const customCode = getOpt(ele, 'data-mce-lang').getOrUndefined();\n              return {\n                code,\n                customCode,\n                title: ''\n              };\n            });\n          }));\n        },\n        setCurrent: (editor, lang) => editor.execCommand('Lang', false, lang),\n        onToolbarSetup: api => {\n          const unbinder = unbindable();\n          api.setActive(editor.formatter.match('lang', {}, undefined, true));\n          unbinder.set(editor.formatter.formatChanged('lang', api.setActive, true));\n          return composeUnbinders(unbinder.clear, onSetupEditableToggle(editor)(api));\n        },\n        onMenuSetup: onSetupEditableToggle(editor)\n      }));\n    };\n    const register$7 = editor => {\n      registerController(editor, lineHeightSpec(editor));\n      languageSpec(editor).each(spec => registerController(editor, spec));\n    };\n\n    const register$6 = (editor, backstage) => {\n      createAlignMenu(editor, backstage);\n      createFontFamilyMenu(editor, backstage);\n      createStylesMenu(editor, backstage);\n      createBlocksMenu(editor, backstage);\n      createFontSizeMenu(editor, backstage);\n    };\n\n    const onSetupOutdentState = editor => onSetupEvent(editor, 'NodeChange', api => {\n      api.setEnabled(editor.queryCommandState('outdent') && editor.selection.isEditable());\n    });\n    const registerButtons$2 = editor => {\n      editor.ui.registry.addButton('outdent', {\n        tooltip: 'Decrease indent',\n        icon: 'outdent',\n        onSetup: onSetupOutdentState(editor),\n        onAction: onActionExecCommand(editor, 'outdent')\n      });\n      editor.ui.registry.addButton('indent', {\n        tooltip: 'Increase indent',\n        icon: 'indent',\n        onSetup: onSetupEditableToggle(editor),\n        onAction: onActionExecCommand(editor, 'indent')\n      });\n    };\n    const register$5 = editor => {\n      registerButtons$2(editor);\n    };\n\n    const makeSetupHandler = (editor, pasteAsText) => api => {\n      api.setActive(pasteAsText.get());\n      const pastePlainTextToggleHandler = e => {\n        pasteAsText.set(e.state);\n        api.setActive(e.state);\n      };\n      editor.on('PastePlainTextToggle', pastePlainTextToggleHandler);\n      return composeUnbinders(() => editor.off('PastePlainTextToggle', pastePlainTextToggleHandler), onSetupEditableToggle(editor)(api));\n    };\n    const register$4 = editor => {\n      const pasteAsText = Cell(getPasteAsText(editor));\n      const onAction = () => editor.execCommand('mceTogglePlainTextPaste');\n      editor.ui.registry.addToggleButton('pastetext', {\n        active: false,\n        icon: 'paste-text',\n        tooltip: 'Paste as text',\n        onAction,\n        onSetup: makeSetupHandler(editor, pasteAsText)\n      });\n      editor.ui.registry.addToggleMenuItem('pastetext', {\n        text: 'Paste as text',\n        icon: 'paste-text',\n        onAction,\n        onSetup: makeSetupHandler(editor, pasteAsText)\n      });\n    };\n\n    const onActionToggleFormat = (editor, fmt) => () => {\n      editor.execCommand('mceToggleFormat', false, fmt);\n    };\n    const registerFormatButtons = editor => {\n      global$1.each([\n        {\n          name: 'bold',\n          text: 'Bold',\n          icon: 'bold',\n          shortcut: 'Meta+B'\n        },\n        {\n          name: 'italic',\n          text: 'Italic',\n          icon: 'italic',\n          shortcut: 'Meta+I'\n        },\n        {\n          name: 'underline',\n          text: 'Underline',\n          icon: 'underline',\n          shortcut: 'Meta+U'\n        },\n        {\n          name: 'strikethrough',\n          text: 'Strikethrough',\n          icon: 'strike-through'\n        },\n        {\n          name: 'subscript',\n          text: 'Subscript',\n          icon: 'subscript'\n        },\n        {\n          name: 'superscript',\n          text: 'Superscript',\n          icon: 'superscript'\n        }\n      ], (btn, _idx) => {\n        editor.ui.registry.addToggleButton(btn.name, {\n          tooltip: btn.text,\n          icon: btn.icon,\n          onSetup: onSetupStateToggle(editor, btn.name),\n          onAction: onActionToggleFormat(editor, btn.name),\n          shortcut: btn.shortcut\n        });\n      });\n      for (let i = 1; i <= 6; i++) {\n        const name = 'h' + i;\n        const shortcut = `Alt+Shift+${ i }`;\n        editor.ui.registry.addToggleButton(name, {\n          text: name.toUpperCase(),\n          tooltip: 'Heading ' + i,\n          onSetup: onSetupStateToggle(editor, name),\n          onAction: onActionToggleFormat(editor, name),\n          shortcut\n        });\n      }\n    };\n    const registerCommandButtons = editor => {\n      global$1.each([\n        {\n          name: 'copy',\n          text: 'Copy',\n          action: 'Copy',\n          icon: 'copy'\n        },\n        {\n          name: 'help',\n          text: 'Help',\n          action: 'mceHelp',\n          icon: 'help',\n          shortcut: 'Alt+0'\n        },\n        {\n          name: 'selectall',\n          text: 'Select all',\n          action: 'SelectAll',\n          icon: 'select-all',\n          shortcut: 'Meta+A'\n        },\n        {\n          name: 'newdocument',\n          text: 'New document',\n          action: 'mceNewDocument',\n          icon: 'new-document'\n        },\n        {\n          name: 'print',\n          text: 'Print',\n          action: 'mcePrint',\n          icon: 'print',\n          shortcut: 'Meta+P'\n        }\n      ], btn => {\n        editor.ui.registry.addButton(btn.name, {\n          tooltip: btn.text,\n          icon: btn.icon,\n          onAction: onActionExecCommand(editor, btn.action),\n          shortcut: btn.shortcut\n        });\n      });\n      global$1.each([\n        {\n          name: 'cut',\n          text: 'Cut',\n          action: 'Cut',\n          icon: 'cut'\n        },\n        {\n          name: 'paste',\n          text: 'Paste',\n          action: 'Paste',\n          icon: 'paste'\n        },\n        {\n          name: 'removeformat',\n          text: 'Clear formatting',\n          action: 'RemoveFormat',\n          icon: 'remove-formatting'\n        },\n        {\n          name: 'remove',\n          text: 'Remove',\n          action: 'Delete',\n          icon: 'remove'\n        },\n        {\n          name: 'hr',\n          text: 'Horizontal line',\n          action: 'InsertHorizontalRule',\n          icon: 'horizontal-rule'\n        }\n      ], btn => {\n        editor.ui.registry.addButton(btn.name, {\n          tooltip: btn.text,\n          icon: btn.icon,\n          onSetup: onSetupEditableToggle(editor),\n          onAction: onActionExecCommand(editor, btn.action)\n        });\n      });\n    };\n    const registerCommandToggleButtons = editor => {\n      global$1.each([{\n          name: 'blockquote',\n          text: 'Blockquote',\n          action: 'mceBlockQuote',\n          icon: 'quote'\n        }], btn => {\n        editor.ui.registry.addToggleButton(btn.name, {\n          tooltip: btn.text,\n          icon: btn.icon,\n          onAction: onActionExecCommand(editor, btn.action),\n          onSetup: onSetupStateToggle(editor, btn.name)\n        });\n      });\n    };\n    const registerButtons$1 = editor => {\n      registerFormatButtons(editor);\n      registerCommandButtons(editor);\n      registerCommandToggleButtons(editor);\n    };\n    const registerMenuItems$2 = editor => {\n      global$1.each([\n        {\n          name: 'newdocument',\n          text: 'New document',\n          action: 'mceNewDocument',\n          icon: 'new-document'\n        },\n        {\n          name: 'copy',\n          text: 'Copy',\n          action: 'Copy',\n          icon: 'copy',\n          shortcut: 'Meta+C'\n        },\n        {\n          name: 'selectall',\n          text: 'Select all',\n          action: 'SelectAll',\n          icon: 'select-all',\n          shortcut: 'Meta+A'\n        },\n        {\n          name: 'print',\n          text: 'Print...',\n          action: 'mcePrint',\n          icon: 'print',\n          shortcut: 'Meta+P'\n        }\n      ], menuitem => {\n        editor.ui.registry.addMenuItem(menuitem.name, {\n          text: menuitem.text,\n          icon: menuitem.icon,\n          shortcut: menuitem.shortcut,\n          onAction: onActionExecCommand(editor, menuitem.action)\n        });\n      });\n      global$1.each([\n        {\n          name: 'bold',\n          text: 'Bold',\n          action: 'Bold',\n          icon: 'bold',\n          shortcut: 'Meta+B'\n        },\n        {\n          name: 'italic',\n          text: 'Italic',\n          action: 'Italic',\n          icon: 'italic',\n          shortcut: 'Meta+I'\n        },\n        {\n          name: 'underline',\n          text: 'Underline',\n          action: 'Underline',\n          icon: 'underline',\n          shortcut: 'Meta+U'\n        },\n        {\n          name: 'strikethrough',\n          text: 'Strikethrough',\n          action: 'Strikethrough',\n          icon: 'strike-through'\n        },\n        {\n          name: 'subscript',\n          text: 'Subscript',\n          action: 'Subscript',\n          icon: 'subscript'\n        },\n        {\n          name: 'superscript',\n          text: 'Superscript',\n          action: 'Superscript',\n          icon: 'superscript'\n        },\n        {\n          name: 'removeformat',\n          text: 'Clear formatting',\n          action: 'RemoveFormat',\n          icon: 'remove-formatting'\n        },\n        {\n          name: 'cut',\n          text: 'Cut',\n          action: 'Cut',\n          icon: 'cut',\n          shortcut: 'Meta+X'\n        },\n        {\n          name: 'paste',\n          text: 'Paste',\n          action: 'Paste',\n          icon: 'paste',\n          shortcut: 'Meta+V'\n        },\n        {\n          name: 'hr',\n          text: 'Horizontal line',\n          action: 'InsertHorizontalRule',\n          icon: 'horizontal-rule'\n        }\n      ], menuitem => {\n        editor.ui.registry.addMenuItem(menuitem.name, {\n          text: menuitem.text,\n          icon: menuitem.icon,\n          shortcut: menuitem.shortcut,\n          onSetup: onSetupEditableToggle(editor),\n          onAction: onActionExecCommand(editor, menuitem.action)\n        });\n      });\n      editor.ui.registry.addMenuItem('codeformat', {\n        text: 'Code',\n        icon: 'sourcecode',\n        onSetup: onSetupEditableToggle(editor),\n        onAction: onActionToggleFormat(editor, 'code')\n      });\n    };\n    const register$3 = editor => {\n      registerButtons$1(editor);\n      registerMenuItems$2(editor);\n    };\n\n    const onSetupUndoRedoState = (editor, type) => onSetupEvent(editor, 'Undo Redo AddUndo TypingUndo ClearUndos SwitchMode', api => {\n      api.setEnabled(!editor.mode.isReadOnly() && editor.undoManager[type]());\n    });\n    const registerMenuItems$1 = editor => {\n      editor.ui.registry.addMenuItem('undo', {\n        text: 'Undo',\n        icon: 'undo',\n        shortcut: 'Meta+Z',\n        onSetup: onSetupUndoRedoState(editor, 'hasUndo'),\n        onAction: onActionExecCommand(editor, 'undo')\n      });\n      editor.ui.registry.addMenuItem('redo', {\n        text: 'Redo',\n        icon: 'redo',\n        shortcut: 'Meta+Y',\n        onSetup: onSetupUndoRedoState(editor, 'hasRedo'),\n        onAction: onActionExecCommand(editor, 'redo')\n      });\n    };\n    const registerButtons = editor => {\n      editor.ui.registry.addButton('undo', {\n        tooltip: 'Undo',\n        icon: 'undo',\n        enabled: false,\n        onSetup: onSetupUndoRedoState(editor, 'hasUndo'),\n        onAction: onActionExecCommand(editor, 'undo'),\n        shortcut: 'Meta+Z'\n      });\n      editor.ui.registry.addButton('redo', {\n        tooltip: 'Redo',\n        icon: 'redo',\n        enabled: false,\n        onSetup: onSetupUndoRedoState(editor, 'hasRedo'),\n        onAction: onActionExecCommand(editor, 'redo'),\n        shortcut: 'Meta+Y'\n      });\n    };\n    const register$2 = editor => {\n      registerMenuItems$1(editor);\n      registerButtons(editor);\n    };\n\n    const onSetupVisualAidState = editor => onSetupEvent(editor, 'VisualAid', api => {\n      api.setActive(editor.hasVisual);\n    });\n    const registerMenuItems = editor => {\n      editor.ui.registry.addToggleMenuItem('visualaid', {\n        text: 'Visual aids',\n        onSetup: onSetupVisualAidState(editor),\n        onAction: onActionExecCommand(editor, 'mceToggleVisualAid')\n      });\n    };\n    const registerToolbarButton = editor => {\n      editor.ui.registry.addButton('visualaid', {\n        tooltip: 'Visual aids',\n        text: 'Visual aids',\n        onAction: onActionExecCommand(editor, 'mceToggleVisualAid')\n      });\n    };\n    const register$1 = editor => {\n      registerToolbarButton(editor);\n      registerMenuItems(editor);\n    };\n\n    const setup$6 = (editor, backstage) => {\n      register$8(editor);\n      register$3(editor);\n      register$6(editor, backstage);\n      register$2(editor);\n      register$c(editor);\n      register$1(editor);\n      register$5(editor);\n      register$7(editor);\n      register$4(editor);\n    };\n\n    const patchPipeConfig = config => isString(config) ? config.split(/[ ,]/) : config;\n    const option = name => editor => editor.options.get(name);\n    const register = editor => {\n      const registerOption = editor.options.register;\n      registerOption('contextmenu_avoid_overlap', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('contextmenu_never_use_native', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('contextmenu', {\n        processor: value => {\n          if (value === false) {\n            return {\n              value: [],\n              valid: true\n            };\n          } else if (isString(value) || isArrayOf(value, isString)) {\n            return {\n              value: patchPipeConfig(value),\n              valid: true\n            };\n          } else {\n            return {\n              valid: false,\n              message: 'Must be false or a string.'\n            };\n          }\n        },\n        default: 'link linkchecker image editimage table spellchecker configurepermanentpen'\n      });\n    };\n    const shouldNeverUseNative = option('contextmenu_never_use_native');\n    const getAvoidOverlapSelector = option('contextmenu_avoid_overlap');\n    const isContextMenuDisabled = editor => getContextMenu(editor).length === 0;\n    const getContextMenu = editor => {\n      const contextMenus = editor.ui.registry.getAll().contextMenus;\n      const contextMenu = editor.options.get('contextmenu');\n      if (editor.options.isSet('contextmenu')) {\n        return contextMenu;\n      } else {\n        return filter$2(contextMenu, item => has$2(contextMenus, item));\n      }\n    };\n\n    const nu = (x, y) => ({\n      type: 'makeshift',\n      x,\n      y\n    });\n    const transpose = (pos, dx, dy) => {\n      return nu(pos.x + dx, pos.y + dy);\n    };\n    const isTouchEvent$1 = e => e.type === 'longpress' || e.type.indexOf('touch') === 0;\n    const fromPageXY = e => {\n      if (isTouchEvent$1(e)) {\n        const touch = e.touches[0];\n        return nu(touch.pageX, touch.pageY);\n      } else {\n        return nu(e.pageX, e.pageY);\n      }\n    };\n    const fromClientXY = e => {\n      if (isTouchEvent$1(e)) {\n        const touch = e.touches[0];\n        return nu(touch.clientX, touch.clientY);\n      } else {\n        return nu(e.clientX, e.clientY);\n      }\n    };\n    const transposeContentAreaContainer = (element, pos) => {\n      const containerPos = global$7.DOM.getPos(element);\n      return transpose(pos, containerPos.x, containerPos.y);\n    };\n    const getPointAnchor = (editor, e) => {\n      if (e.type === 'contextmenu' || e.type === 'longpress') {\n        if (editor.inline) {\n          return fromPageXY(e);\n        } else {\n          return transposeContentAreaContainer(editor.getContentAreaContainer(), fromClientXY(e));\n        }\n      } else {\n        return getSelectionAnchor(editor);\n      }\n    };\n    const getSelectionAnchor = editor => {\n      return {\n        type: 'selection',\n        root: SugarElement.fromDom(editor.selection.getNode())\n      };\n    };\n    const getNodeAnchor = editor => ({\n      type: 'node',\n      node: Optional.some(SugarElement.fromDom(editor.selection.getNode())),\n      root: SugarElement.fromDom(editor.getBody())\n    });\n    const getAnchorSpec$1 = (editor, e, anchorType) => {\n      switch (anchorType) {\n      case 'node':\n        return getNodeAnchor(editor);\n      case 'point':\n        return getPointAnchor(editor, e);\n      case 'selection':\n        return getSelectionAnchor(editor);\n      }\n    };\n\n    const initAndShow$1 = (editor, e, buildMenu, backstage, contextmenu, anchorType) => {\n      const items = buildMenu();\n      const anchorSpec = getAnchorSpec$1(editor, e, anchorType);\n      build(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, {\n        isHorizontalMenu: false,\n        search: Optional.none()\n      }).map(menuData => {\n        e.preventDefault();\n        InlineView.showMenuAt(contextmenu, { anchor: anchorSpec }, {\n          menu: { markers: markers('normal') },\n          data: menuData\n        });\n      });\n    };\n\n    const layouts = {\n      onLtr: () => [\n        south$2,\n        southeast$2,\n        southwest$2,\n        northeast$2,\n        northwest$2,\n        north$2,\n        north,\n        south,\n        northeast,\n        southeast,\n        northwest,\n        southwest\n      ],\n      onRtl: () => [\n        south$2,\n        southwest$2,\n        southeast$2,\n        northwest$2,\n        northeast$2,\n        north$2,\n        north,\n        south,\n        northwest,\n        southwest,\n        northeast,\n        southeast\n      ]\n    };\n    const bubbleSize = 12;\n    const bubbleAlignments = {\n      valignCentre: [],\n      alignCentre: [],\n      alignLeft: ['tox-pop--align-left'],\n      alignRight: ['tox-pop--align-right'],\n      right: ['tox-pop--right'],\n      left: ['tox-pop--left'],\n      bottom: ['tox-pop--bottom'],\n      top: ['tox-pop--top']\n    };\n    const isTouchWithinSelection = (editor, e) => {\n      const selection = editor.selection;\n      if (selection.isCollapsed() || e.touches.length < 1) {\n        return false;\n      } else {\n        const touch = e.touches[0];\n        const rng = selection.getRng();\n        const rngRectOpt = getFirstRect(editor.getWin(), SimSelection.domRange(rng));\n        return rngRectOpt.exists(rngRect => rngRect.left <= touch.clientX && rngRect.right >= touch.clientX && rngRect.top <= touch.clientY && rngRect.bottom >= touch.clientY);\n      }\n    };\n    const setupiOSOverrides = editor => {\n      const originalSelection = editor.selection.getRng();\n      const selectionReset = () => {\n        global$9.setEditorTimeout(editor, () => {\n          editor.selection.setRng(originalSelection);\n        }, 10);\n        unbindEventListeners();\n      };\n      editor.once('touchend', selectionReset);\n      const preventMousedown = e => {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n      };\n      editor.on('mousedown', preventMousedown, true);\n      const clearSelectionReset = () => unbindEventListeners();\n      editor.once('longpresscancel', clearSelectionReset);\n      const unbindEventListeners = () => {\n        editor.off('touchend', selectionReset);\n        editor.off('longpresscancel', clearSelectionReset);\n        editor.off('mousedown', preventMousedown);\n      };\n    };\n    const getAnchorSpec = (editor, e, anchorType) => {\n      const anchorSpec = getAnchorSpec$1(editor, e, anchorType);\n      const bubbleYOffset = anchorType === 'point' ? bubbleSize : 0;\n      return {\n        bubble: nu$5(0, bubbleYOffset, bubbleAlignments),\n        layouts,\n        overrides: {\n          maxWidthFunction: expandable(),\n          maxHeightFunction: expandable$1()\n        },\n        ...anchorSpec\n      };\n    };\n    const show = (editor, e, items, backstage, contextmenu, anchorType, highlightImmediately) => {\n      const anchorSpec = getAnchorSpec(editor, e, anchorType);\n      build(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, {\n        isHorizontalMenu: true,\n        search: Optional.none()\n      }).map(menuData => {\n        e.preventDefault();\n        const highlightOnOpen = highlightImmediately ? HighlightOnOpen.HighlightMenuAndItem : HighlightOnOpen.HighlightNone;\n        InlineView.showMenuWithinBounds(contextmenu, { anchor: anchorSpec }, {\n          menu: {\n            markers: markers('normal'),\n            highlightOnOpen\n          },\n          data: menuData,\n          type: 'horizontal'\n        }, () => Optional.some(getContextToolbarBounds(editor, backstage.shared, anchorType === 'node' ? 'node' : 'selection')));\n        editor.dispatch(hideContextToolbarEvent);\n      });\n    };\n    const initAndShow = (editor, e, buildMenu, backstage, contextmenu, anchorType) => {\n      const detection = detect$1();\n      const isiOS = detection.os.isiOS();\n      const isMacOS = detection.os.isMacOS();\n      const isAndroid = detection.os.isAndroid();\n      const isTouch = detection.deviceType.isTouch();\n      const shouldHighlightImmediately = () => !(isAndroid || isiOS || isMacOS && isTouch);\n      const open = () => {\n        const items = buildMenu();\n        show(editor, e, items, backstage, contextmenu, anchorType, shouldHighlightImmediately());\n      };\n      if ((isMacOS || isiOS) && anchorType !== 'node') {\n        const openiOS = () => {\n          setupiOSOverrides(editor);\n          open();\n        };\n        if (isTouchWithinSelection(editor, e)) {\n          openiOS();\n        } else {\n          editor.once('selectionchange', openiOS);\n          editor.once('touchend', () => editor.off('selectionchange', openiOS));\n        }\n      } else {\n        open();\n      }\n    };\n\n    const isSeparator = item => isString(item) ? item === '|' : item.type === 'separator';\n    const separator = { type: 'separator' };\n    const makeContextItem = item => {\n      const commonMenuItem = item => ({\n        text: item.text,\n        icon: item.icon,\n        enabled: item.enabled,\n        shortcut: item.shortcut\n      });\n      if (isString(item)) {\n        return item;\n      } else {\n        switch (item.type) {\n        case 'separator':\n          return separator;\n        case 'submenu':\n          return {\n            type: 'nestedmenuitem',\n            ...commonMenuItem(item),\n            getSubmenuItems: () => {\n              const items = item.getSubmenuItems();\n              if (isString(items)) {\n                return items;\n              } else {\n                return map$2(items, makeContextItem);\n              }\n            }\n          };\n        default:\n          const commonItem = item;\n          return {\n            type: 'menuitem',\n            ...commonMenuItem(commonItem),\n            onAction: noarg(commonItem.onAction)\n          };\n        }\n      }\n    };\n    const addContextMenuGroup = (xs, groupItems) => {\n      if (groupItems.length === 0) {\n        return xs;\n      }\n      const lastMenuItem = last$1(xs).filter(item => !isSeparator(item));\n      const before = lastMenuItem.fold(() => [], _ => [separator]);\n      return xs.concat(before).concat(groupItems).concat([separator]);\n    };\n    const generateContextMenu = (contextMenus, menuConfig, selectedElement) => {\n      const sections = foldl(menuConfig, (acc, name) => {\n        return get$g(contextMenus, name.toLowerCase()).map(menu => {\n          const items = menu.update(selectedElement);\n          if (isString(items) && isNotEmpty(trim$1(items))) {\n            return addContextMenuGroup(acc, items.split(' '));\n          } else if (isArray(items) && items.length > 0) {\n            const allItems = map$2(items, makeContextItem);\n            return addContextMenuGroup(acc, allItems);\n          } else {\n            return acc;\n          }\n        }).getOrThunk(() => acc.concat([name]));\n      }, []);\n      if (sections.length > 0 && isSeparator(sections[sections.length - 1])) {\n        sections.pop();\n      }\n      return sections;\n    };\n    const isNativeOverrideKeyEvent = (editor, e) => e.ctrlKey && !shouldNeverUseNative(editor);\n    const isTouchEvent = e => e.type === 'longpress' || has$2(e, 'touches');\n    const isTriggeredByKeyboard = (editor, e) => !isTouchEvent(e) && (e.button !== 2 || e.target === editor.getBody() && e.pointerType === '');\n    const getSelectedElement = (editor, e) => isTriggeredByKeyboard(editor, e) ? editor.selection.getStart(true) : e.target;\n    const getAnchorType = (editor, e) => {\n      const selector = getAvoidOverlapSelector(editor);\n      const anchorType = isTriggeredByKeyboard(editor, e) ? 'selection' : 'point';\n      if (isNotEmpty(selector)) {\n        const target = getSelectedElement(editor, e);\n        const selectorExists = closest(SugarElement.fromDom(target), selector);\n        return selectorExists ? 'node' : anchorType;\n      } else {\n        return anchorType;\n      }\n    };\n    const setup$5 = (editor, lazySink, backstage) => {\n      const detection = detect$1();\n      const isTouch = detection.deviceType.isTouch;\n      const contextmenu = build$1(InlineView.sketch({\n        dom: { tag: 'div' },\n        lazySink,\n        onEscape: () => editor.focus(),\n        onShow: () => backstage.setContextMenuState(true),\n        onHide: () => backstage.setContextMenuState(false),\n        fireDismissalEventInstead: {},\n        inlineBehaviours: derive$1([config('dismissContextMenu', [run$1(dismissRequested(), (comp, _se) => {\n              Sandboxing.close(comp);\n              editor.focus();\n            })])])\n      }));\n      const hideContextMenu = () => InlineView.hide(contextmenu);\n      const showContextMenu = e => {\n        if (shouldNeverUseNative(editor)) {\n          e.preventDefault();\n        }\n        if (isNativeOverrideKeyEvent(editor, e) || isContextMenuDisabled(editor)) {\n          return;\n        }\n        const anchorType = getAnchorType(editor, e);\n        const buildMenu = () => {\n          const selectedElement = getSelectedElement(editor, e);\n          const registry = editor.ui.registry.getAll();\n          const menuConfig = getContextMenu(editor);\n          return generateContextMenu(registry.contextMenus, menuConfig, selectedElement);\n        };\n        const initAndShow$2 = isTouch() ? initAndShow : initAndShow$1;\n        initAndShow$2(editor, e, buildMenu, backstage, contextmenu, anchorType);\n      };\n      editor.on('init', () => {\n        const hideEvents = 'ResizeEditor ScrollContent ScrollWindow longpresscancel' + (isTouch() ? '' : ' ResizeWindow');\n        editor.on(hideEvents, hideContextMenu);\n        editor.on('longpress contextmenu', showContextMenu);\n      });\n    };\n\n    const adt = Adt.generate([\n      {\n        offset: [\n          'x',\n          'y'\n        ]\n      },\n      {\n        absolute: [\n          'x',\n          'y'\n        ]\n      },\n      {\n        fixed: [\n          'x',\n          'y'\n        ]\n      }\n    ]);\n    const subtract = change => point => point.translate(-change.left, -change.top);\n    const add = change => point => point.translate(change.left, change.top);\n    const transform = changes => (x, y) => foldl(changes, (rest, f) => f(rest), SugarPosition(x, y));\n    const asFixed = (coord, scroll, origin) => coord.fold(transform([\n      add(origin),\n      subtract(scroll)\n    ]), transform([subtract(scroll)]), transform([]));\n    const asAbsolute = (coord, scroll, origin) => coord.fold(transform([add(origin)]), transform([]), transform([add(scroll)]));\n    const asOffset = (coord, scroll, origin) => coord.fold(transform([]), transform([subtract(origin)]), transform([\n      add(scroll),\n      subtract(origin)\n    ]));\n    const withinRange = (coord1, coord2, xRange, yRange, scroll, origin) => {\n      const a1 = asAbsolute(coord1, scroll, origin);\n      const a2 = asAbsolute(coord2, scroll, origin);\n      return Math.abs(a1.left - a2.left) <= xRange && Math.abs(a1.top - a2.top) <= yRange;\n    };\n    const getDeltas = (coord1, coord2, xRange, yRange, scroll, origin) => {\n      const a1 = asAbsolute(coord1, scroll, origin);\n      const a2 = asAbsolute(coord2, scroll, origin);\n      const left = Math.abs(a1.left - a2.left);\n      const top = Math.abs(a1.top - a2.top);\n      return SugarPosition(left, top);\n    };\n    const toStyles = (coord, scroll, origin) => {\n      const stylesOpt = coord.fold((x, y) => ({\n        position: Optional.some('absolute'),\n        left: Optional.some(x + 'px'),\n        top: Optional.some(y + 'px')\n      }), (x, y) => ({\n        position: Optional.some('absolute'),\n        left: Optional.some(x - origin.left + 'px'),\n        top: Optional.some(y - origin.top + 'px')\n      }), (x, y) => ({\n        position: Optional.some('fixed'),\n        left: Optional.some(x + 'px'),\n        top: Optional.some(y + 'px')\n      }));\n      return {\n        right: Optional.none(),\n        bottom: Optional.none(),\n        ...stylesOpt\n      };\n    };\n    const translate = (coord, deltaX, deltaY) => coord.fold((x, y) => offset(x + deltaX, y + deltaY), (x, y) => absolute(x + deltaX, y + deltaY), (x, y) => fixed(x + deltaX, y + deltaY));\n    const absorb = (partialCoord, originalCoord, scroll, origin) => {\n      const absorbOne = (stencil, nu) => (optX, optY) => {\n        const original = stencil(originalCoord, scroll, origin);\n        return nu(optX.getOr(original.left), optY.getOr(original.top));\n      };\n      return partialCoord.fold(absorbOne(asOffset, offset), absorbOne(asAbsolute, absolute), absorbOne(asFixed, fixed));\n    };\n    const offset = adt.offset;\n    const absolute = adt.absolute;\n    const fixed = adt.fixed;\n\n    const parseAttrToInt = (element, name) => {\n      const value = get$f(element, name);\n      return isUndefined(value) ? NaN : parseInt(value, 10);\n    };\n    const get = (component, snapsInfo) => {\n      const element = component.element;\n      const x = parseAttrToInt(element, snapsInfo.leftAttr);\n      const y = parseAttrToInt(element, snapsInfo.topAttr);\n      return isNaN(x) || isNaN(y) ? Optional.none() : Optional.some(SugarPosition(x, y));\n    };\n    const set = (component, snapsInfo, pt) => {\n      const element = component.element;\n      set$9(element, snapsInfo.leftAttr, pt.left + 'px');\n      set$9(element, snapsInfo.topAttr, pt.top + 'px');\n    };\n    const clear = (component, snapsInfo) => {\n      const element = component.element;\n      remove$7(element, snapsInfo.leftAttr);\n      remove$7(element, snapsInfo.topAttr);\n    };\n\n    const getCoords = (component, snapInfo, coord, delta) => get(component, snapInfo).fold(() => coord, fixed$1 => fixed(fixed$1.left + delta.left, fixed$1.top + delta.top));\n    const moveOrSnap = (component, snapInfo, coord, delta, scroll, origin) => {\n      const newCoord = getCoords(component, snapInfo, coord, delta);\n      const snap = snapInfo.mustSnap ? findClosestSnap(component, snapInfo, newCoord, scroll, origin) : findSnap(component, snapInfo, newCoord, scroll, origin);\n      const fixedCoord = asFixed(newCoord, scroll, origin);\n      set(component, snapInfo, fixedCoord);\n      return snap.fold(() => ({\n        coord: fixed(fixedCoord.left, fixedCoord.top),\n        extra: Optional.none()\n      }), spanned => ({\n        coord: spanned.output,\n        extra: spanned.extra\n      }));\n    };\n    const stopDrag = (component, snapInfo) => {\n      clear(component, snapInfo);\n    };\n    const findMatchingSnap = (snaps, newCoord, scroll, origin) => findMap(snaps, snap => {\n      const sensor = snap.sensor;\n      const inRange = withinRange(newCoord, sensor, snap.range.left, snap.range.top, scroll, origin);\n      return inRange ? Optional.some({\n        output: absorb(snap.output, newCoord, scroll, origin),\n        extra: snap.extra\n      }) : Optional.none();\n    });\n    const findClosestSnap = (component, snapInfo, newCoord, scroll, origin) => {\n      const snaps = snapInfo.getSnapPoints(component);\n      const matchSnap = findMatchingSnap(snaps, newCoord, scroll, origin);\n      return matchSnap.orThunk(() => {\n        const bestSnap = foldl(snaps, (acc, snap) => {\n          const sensor = snap.sensor;\n          const deltas = getDeltas(newCoord, sensor, snap.range.left, snap.range.top, scroll, origin);\n          return acc.deltas.fold(() => ({\n            deltas: Optional.some(deltas),\n            snap: Optional.some(snap)\n          }), bestDeltas => {\n            const currAvg = (deltas.left + deltas.top) / 2;\n            const bestAvg = (bestDeltas.left + bestDeltas.top) / 2;\n            if (currAvg <= bestAvg) {\n              return {\n                deltas: Optional.some(deltas),\n                snap: Optional.some(snap)\n              };\n            } else {\n              return acc;\n            }\n          });\n        }, {\n          deltas: Optional.none(),\n          snap: Optional.none()\n        });\n        return bestSnap.snap.map(snap => ({\n          output: absorb(snap.output, newCoord, scroll, origin),\n          extra: snap.extra\n        }));\n      });\n    };\n    const findSnap = (component, snapInfo, newCoord, scroll, origin) => {\n      const snaps = snapInfo.getSnapPoints(component);\n      return findMatchingSnap(snaps, newCoord, scroll, origin);\n    };\n    const snapTo$1 = (snap, scroll, origin) => ({\n      coord: absorb(snap.output, snap.output, scroll, origin),\n      extra: snap.extra\n    });\n\n    const snapTo = (component, dragConfig, _state, snap) => {\n      const target = dragConfig.getTarget(component.element);\n      if (dragConfig.repositionTarget) {\n        const doc = owner$4(component.element);\n        const scroll = get$b(doc);\n        const origin = getOrigin(target);\n        const snapPin = snapTo$1(snap, scroll, origin);\n        const styles = toStyles(snapPin.coord, scroll, origin);\n        setOptions(target, styles);\n      }\n    };\n\n    var DraggingApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        snapTo: snapTo\n    });\n\n    const initialAttribute = 'data-initial-z-index';\n    const resetZIndex = blocker => {\n      parent(blocker.element).filter(isElement$1).each(root => {\n        getOpt(root, initialAttribute).fold(() => remove$6(root, 'z-index'), zIndex => set$8(root, 'z-index', zIndex));\n        remove$7(root, initialAttribute);\n      });\n    };\n    const changeZIndex = blocker => {\n      parent(blocker.element).filter(isElement$1).each(root => {\n        getRaw(root, 'z-index').each(zindex => {\n          set$9(root, initialAttribute, zindex);\n        });\n        set$8(root, 'z-index', get$e(blocker.element, 'z-index'));\n      });\n    };\n    const instigate = (anyComponent, blocker) => {\n      anyComponent.getSystem().addToGui(blocker);\n      changeZIndex(blocker);\n    };\n    const discard = blocker => {\n      resetZIndex(blocker);\n      blocker.getSystem().removeFromGui(blocker);\n    };\n    const createComponent = (component, blockerClass, blockerEvents) => component.getSystem().build(Container.sketch({\n      dom: {\n        styles: {\n          'left': '0px',\n          'top': '0px',\n          'width': '100%',\n          'height': '100%',\n          'position': 'fixed',\n          'z-index': '1000000000000000'\n        },\n        classes: [blockerClass]\n      },\n      events: blockerEvents\n    }));\n\n    var SnapSchema = optionObjOf('snaps', [\n      required$1('getSnapPoints'),\n      onHandler('onSensor'),\n      required$1('leftAttr'),\n      required$1('topAttr'),\n      defaulted('lazyViewport', win),\n      defaulted('mustSnap', false)\n    ]);\n\n    const schema$6 = [\n      defaulted('useFixed', never),\n      required$1('blockerClass'),\n      defaulted('getTarget', identity),\n      defaulted('onDrag', noop),\n      defaulted('repositionTarget', true),\n      defaulted('onDrop', noop),\n      defaultedFunction('getBounds', win),\n      SnapSchema\n    ];\n\n    const getCurrentCoord = target => lift3(getRaw(target, 'left'), getRaw(target, 'top'), getRaw(target, 'position'), (left, top, position) => {\n      const nu = position === 'fixed' ? fixed : offset;\n      return nu(parseInt(left, 10), parseInt(top, 10));\n    }).getOrThunk(() => {\n      const location = absolute$3(target);\n      return absolute(location.left, location.top);\n    });\n    const clampCoords = (component, coords, scroll, origin, startData) => {\n      const bounds = startData.bounds;\n      const absoluteCoord = asAbsolute(coords, scroll, origin);\n      const newX = clamp(absoluteCoord.left, bounds.x, bounds.x + bounds.width - startData.width);\n      const newY = clamp(absoluteCoord.top, bounds.y, bounds.y + bounds.height - startData.height);\n      const newCoords = absolute(newX, newY);\n      return coords.fold(() => {\n        const offset$1 = asOffset(newCoords, scroll, origin);\n        return offset(offset$1.left, offset$1.top);\n      }, constant$1(newCoords), () => {\n        const fixed$1 = asFixed(newCoords, scroll, origin);\n        return fixed(fixed$1.left, fixed$1.top);\n      });\n    };\n    const calcNewCoord = (component, optSnaps, currentCoord, scroll, origin, delta, startData) => {\n      const newCoord = optSnaps.fold(() => {\n        const translated = translate(currentCoord, delta.left, delta.top);\n        const fixedCoord = asFixed(translated, scroll, origin);\n        return fixed(fixedCoord.left, fixedCoord.top);\n      }, snapInfo => {\n        const snapping = moveOrSnap(component, snapInfo, currentCoord, delta, scroll, origin);\n        snapping.extra.each(extra => {\n          snapInfo.onSensor(component, extra);\n        });\n        return snapping.coord;\n      });\n      return clampCoords(component, newCoord, scroll, origin, startData);\n    };\n    const dragBy = (component, dragConfig, startData, delta) => {\n      const target = dragConfig.getTarget(component.element);\n      if (dragConfig.repositionTarget) {\n        const doc = owner$4(component.element);\n        const scroll = get$b(doc);\n        const origin = getOrigin(target);\n        const currentCoord = getCurrentCoord(target);\n        const newCoord = calcNewCoord(component, dragConfig.snaps, currentCoord, scroll, origin, delta, startData);\n        const styles = toStyles(newCoord, scroll, origin);\n        setOptions(target, styles);\n      }\n      dragConfig.onDrag(component, target, delta);\n    };\n\n    const calcStartData = (dragConfig, comp) => ({\n      bounds: dragConfig.getBounds(),\n      height: getOuter$2(comp.element),\n      width: getOuter$1(comp.element)\n    });\n    const move = (component, dragConfig, dragState, dragMode, event) => {\n      const delta = dragState.update(dragMode, event);\n      const dragStartData = dragState.getStartData().getOrThunk(() => calcStartData(dragConfig, component));\n      delta.each(dlt => {\n        dragBy(component, dragConfig, dragStartData, dlt);\n      });\n    };\n    const stop = (component, blocker, dragConfig, dragState) => {\n      blocker.each(discard);\n      dragConfig.snaps.each(snapInfo => {\n        stopDrag(component, snapInfo);\n      });\n      const target = dragConfig.getTarget(component.element);\n      dragState.reset();\n      dragConfig.onDrop(component, target);\n    };\n    const handlers = events => (dragConfig, dragState) => {\n      const updateStartState = comp => {\n        dragState.setStartData(calcStartData(dragConfig, comp));\n      };\n      return derive$2([\n        run$1(windowScroll(), comp => {\n          dragState.getStartData().each(() => updateStartState(comp));\n        }),\n        ...events(dragConfig, dragState, updateStartState)\n      ]);\n    };\n\n    const init$3 = dragApi => derive$2([\n      run$1(mousedown(), dragApi.forceDrop),\n      run$1(mouseup(), dragApi.drop),\n      run$1(mousemove(), (comp, simulatedEvent) => {\n        dragApi.move(simulatedEvent.event);\n      }),\n      run$1(mouseout(), dragApi.delayDrop)\n    ]);\n\n    const getData$1 = event => Optional.from(SugarPosition(event.x, event.y));\n    const getDelta$1 = (old, nu) => SugarPosition(nu.left - old.left, nu.top - old.top);\n\n    var MouseData = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        getData: getData$1,\n        getDelta: getDelta$1\n    });\n\n    const events$3 = (dragConfig, dragState, updateStartState) => [run$1(mousedown(), (component, simulatedEvent) => {\n        const raw = simulatedEvent.event.raw;\n        if (raw.button !== 0) {\n          return;\n        }\n        simulatedEvent.stop();\n        const stop$1 = () => stop(component, Optional.some(blocker), dragConfig, dragState);\n        const delayDrop = DelayedFunction(stop$1, 200);\n        const dragApi = {\n          drop: stop$1,\n          delayDrop: delayDrop.schedule,\n          forceDrop: stop$1,\n          move: event => {\n            delayDrop.cancel();\n            move(component, dragConfig, dragState, MouseData, event);\n          }\n        };\n        const blocker = createComponent(component, dragConfig.blockerClass, init$3(dragApi));\n        const start = () => {\n          updateStartState(component);\n          instigate(component, blocker);\n        };\n        start();\n      })];\n    const schema$5 = [\n      ...schema$6,\n      output$1('dragger', { handlers: handlers(events$3) })\n    ];\n\n    const init$2 = dragApi => derive$2([\n      run$1(touchstart(), dragApi.forceDrop),\n      run$1(touchend(), dragApi.drop),\n      run$1(touchcancel(), dragApi.drop),\n      run$1(touchmove(), (comp, simulatedEvent) => {\n        dragApi.move(simulatedEvent.event);\n      })\n    ]);\n\n    const getDataFrom = touches => {\n      const touch = touches[0];\n      return Optional.some(SugarPosition(touch.clientX, touch.clientY));\n    };\n    const getData = event => {\n      const raw = event.raw;\n      const touches = raw.touches;\n      return touches.length === 1 ? getDataFrom(touches) : Optional.none();\n    };\n    const getDelta = (old, nu) => SugarPosition(nu.left - old.left, nu.top - old.top);\n\n    var TouchData = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        getData: getData,\n        getDelta: getDelta\n    });\n\n    const events$2 = (dragConfig, dragState, updateStartState) => {\n      const blockerSingleton = value$2();\n      const stopBlocking = component => {\n        stop(component, blockerSingleton.get(), dragConfig, dragState);\n        blockerSingleton.clear();\n      };\n      return [\n        run$1(touchstart(), (component, simulatedEvent) => {\n          simulatedEvent.stop();\n          const stop = () => stopBlocking(component);\n          const dragApi = {\n            drop: stop,\n            delayDrop: noop,\n            forceDrop: stop,\n            move: event => {\n              move(component, dragConfig, dragState, TouchData, event);\n            }\n          };\n          const blocker = createComponent(component, dragConfig.blockerClass, init$2(dragApi));\n          blockerSingleton.set(blocker);\n          const start = () => {\n            updateStartState(component);\n            instigate(component, blocker);\n          };\n          start();\n        }),\n        run$1(touchmove(), (component, simulatedEvent) => {\n          simulatedEvent.stop();\n          move(component, dragConfig, dragState, TouchData, simulatedEvent.event);\n        }),\n        run$1(touchend(), (component, simulatedEvent) => {\n          simulatedEvent.stop();\n          stopBlocking(component);\n        }),\n        run$1(touchcancel(), stopBlocking)\n      ];\n    };\n    const schema$4 = [\n      ...schema$6,\n      output$1('dragger', { handlers: handlers(events$2) })\n    ];\n\n    const events$1 = (dragConfig, dragState, updateStartState) => [\n      ...events$3(dragConfig, dragState, updateStartState),\n      ...events$2(dragConfig, dragState, updateStartState)\n    ];\n    const schema$3 = [\n      ...schema$6,\n      output$1('dragger', { handlers: handlers(events$1) })\n    ];\n\n    const mouse = schema$5;\n    const touch = schema$4;\n    const mouseOrTouch = schema$3;\n\n    var DraggingBranches = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        mouse: mouse,\n        touch: touch,\n        mouseOrTouch: mouseOrTouch\n    });\n\n    const init$1 = () => {\n      let previous = Optional.none();\n      let startData = Optional.none();\n      const reset = () => {\n        previous = Optional.none();\n        startData = Optional.none();\n      };\n      const calculateDelta = (mode, nu) => {\n        const result = previous.map(old => mode.getDelta(old, nu));\n        previous = Optional.some(nu);\n        return result;\n      };\n      const update = (mode, dragEvent) => mode.getData(dragEvent).bind(nuData => calculateDelta(mode, nuData));\n      const setStartData = data => {\n        startData = Optional.some(data);\n      };\n      const getStartData = () => startData;\n      const readState = constant$1({});\n      return nu$8({\n        readState,\n        reset,\n        update,\n        getStartData,\n        setStartData\n      });\n    };\n\n    var DragState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$1\n    });\n\n    const Dragging = createModes({\n      branchKey: 'mode',\n      branches: DraggingBranches,\n      name: 'dragging',\n      active: {\n        events: (dragConfig, dragState) => {\n          const dragger = dragConfig.dragger;\n          return dragger.handlers(dragConfig, dragState);\n        }\n      },\n      extra: {\n        snap: sConfig => ({\n          sensor: sConfig.sensor,\n          range: sConfig.range,\n          output: sConfig.output,\n          extra: Optional.from(sConfig.extra)\n        })\n      },\n      state: DragState,\n      apis: DraggingApis\n    });\n\n    const snapWidth = 40;\n    const snapOffset = snapWidth / 2;\n    const calcSnap = (selectorOpt, td, x, y, width, height) => selectorOpt.fold(() => Dragging.snap({\n      sensor: absolute(x - snapOffset, y - snapOffset),\n      range: SugarPosition(width, height),\n      output: absolute(Optional.some(x), Optional.some(y)),\n      extra: { td }\n    }), selectorHandle => {\n      const sensorLeft = x - snapOffset;\n      const sensorTop = y - snapOffset;\n      const sensorWidth = snapWidth;\n      const sensorHeight = snapWidth;\n      const rect = selectorHandle.element.dom.getBoundingClientRect();\n      return Dragging.snap({\n        sensor: absolute(sensorLeft, sensorTop),\n        range: SugarPosition(sensorWidth, sensorHeight),\n        output: absolute(Optional.some(x - rect.width / 2), Optional.some(y - rect.height / 2)),\n        extra: { td }\n      });\n    });\n    const getSnapsConfig = (getSnapPoints, cell, onChange) => {\n      const isSameCell = (cellOpt, td) => cellOpt.exists(currentTd => eq(currentTd, td));\n      return {\n        getSnapPoints,\n        leftAttr: 'data-drag-left',\n        topAttr: 'data-drag-top',\n        onSensor: (component, extra) => {\n          const td = extra.td;\n          if (!isSameCell(cell.get(), td)) {\n            cell.set(td);\n            onChange(td);\n          }\n        },\n        mustSnap: true\n      };\n    };\n    const createSelector = snaps => record(Button.sketch({\n      dom: {\n        tag: 'div',\n        classes: ['tox-selector']\n      },\n      buttonBehaviours: derive$1([\n        Dragging.config({\n          mode: 'mouseOrTouch',\n          blockerClass: 'blocker',\n          snaps\n        }),\n        Unselecting.config({})\n      ]),\n      eventOrder: {\n        mousedown: [\n          'dragging',\n          'alloy.base.behaviour'\n        ],\n        touchstart: [\n          'dragging',\n          'alloy.base.behaviour'\n        ]\n      }\n    }));\n    const setup$4 = (editor, sink) => {\n      const tlTds = Cell([]);\n      const brTds = Cell([]);\n      const isVisible = Cell(false);\n      const startCell = value$2();\n      const finishCell = value$2();\n      const getTopLeftSnap = td => {\n        const box = absolute$2(td);\n        return calcSnap(memTopLeft.getOpt(sink), td, box.x, box.y, box.width, box.height);\n      };\n      const getTopLeftSnaps = () => map$2(tlTds.get(), td => getTopLeftSnap(td));\n      const getBottomRightSnap = td => {\n        const box = absolute$2(td);\n        return calcSnap(memBottomRight.getOpt(sink), td, box.right, box.bottom, box.width, box.height);\n      };\n      const getBottomRightSnaps = () => map$2(brTds.get(), td => getBottomRightSnap(td));\n      const topLeftSnaps = getSnapsConfig(getTopLeftSnaps, startCell, start => {\n        finishCell.get().each(finish => {\n          editor.dispatch('TableSelectorChange', {\n            start,\n            finish\n          });\n        });\n      });\n      const bottomRightSnaps = getSnapsConfig(getBottomRightSnaps, finishCell, finish => {\n        startCell.get().each(start => {\n          editor.dispatch('TableSelectorChange', {\n            start,\n            finish\n          });\n        });\n      });\n      const memTopLeft = createSelector(topLeftSnaps);\n      const memBottomRight = createSelector(bottomRightSnaps);\n      const topLeft = build$1(memTopLeft.asSpec());\n      const bottomRight = build$1(memBottomRight.asSpec());\n      const showOrHideHandle = (selector, cell, isAbove, isBelow) => {\n        const cellRect = cell.dom.getBoundingClientRect();\n        remove$6(selector.element, 'display');\n        const viewportHeight = defaultView(SugarElement.fromDom(editor.getBody())).dom.innerHeight;\n        const aboveViewport = isAbove(cellRect);\n        const belowViewport = isBelow(cellRect, viewportHeight);\n        if (aboveViewport || belowViewport) {\n          set$8(selector.element, 'display', 'none');\n        }\n      };\n      const snapTo = (selector, cell, getSnapConfig, pos) => {\n        const snap = getSnapConfig(cell);\n        Dragging.snapTo(selector, snap);\n        const isAbove = rect => rect[pos] < 0;\n        const isBelow = (rect, viewportHeight) => rect[pos] > viewportHeight;\n        showOrHideHandle(selector, cell, isAbove, isBelow);\n      };\n      const snapTopLeft = cell => snapTo(topLeft, cell, getTopLeftSnap, 'top');\n      const snapLastTopLeft = () => startCell.get().each(snapTopLeft);\n      const snapBottomRight = cell => snapTo(bottomRight, cell, getBottomRightSnap, 'bottom');\n      const snapLastBottomRight = () => finishCell.get().each(snapBottomRight);\n      if (detect$1().deviceType.isTouch()) {\n        const domToSugar = arr => map$2(arr, SugarElement.fromDom);\n        editor.on('TableSelectionChange', e => {\n          if (!isVisible.get()) {\n            attach(sink, topLeft);\n            attach(sink, bottomRight);\n            isVisible.set(true);\n          }\n          const start = SugarElement.fromDom(e.start);\n          const finish = SugarElement.fromDom(e.finish);\n          startCell.set(start);\n          finishCell.set(finish);\n          Optional.from(e.otherCells).each(otherCells => {\n            tlTds.set(domToSugar(otherCells.upOrLeftCells));\n            brTds.set(domToSugar(otherCells.downOrRightCells));\n            snapTopLeft(start);\n            snapBottomRight(finish);\n          });\n        });\n        editor.on('ResizeEditor ResizeWindow ScrollContent', () => {\n          snapLastTopLeft();\n          snapLastBottomRight();\n        });\n        editor.on('TableSelectionClear', () => {\n          if (isVisible.get()) {\n            detach(topLeft);\n            detach(bottomRight);\n            isVisible.set(false);\n          }\n          startCell.clear();\n          finishCell.clear();\n        });\n      }\n    };\n\n    const isHidden = elm => elm.nodeName === 'BR' || !!elm.getAttribute('data-mce-bogus') || elm.getAttribute('data-mce-type') === 'bookmark';\n    const renderElementPath = (editor, settings, providersBackstage) => {\n      var _a;\n      const delimiter = (_a = settings.delimiter) !== null && _a !== void 0 ? _a : '\\u203A';\n      const renderElement = (name, element, index) => Button.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-statusbar__path-item'],\n          attributes: {\n            'data-index': index,\n            'aria-level': index + 1\n          }\n        },\n        components: [text$2(name)],\n        action: _btn => {\n          editor.focus();\n          editor.selection.select(element);\n          editor.nodeChanged();\n        },\n        buttonBehaviours: derive$1([\n          DisablingConfigs.button(providersBackstage.isDisabled),\n          receivingConfig()\n        ])\n      });\n      const renderDivider = () => ({\n        dom: {\n          tag: 'div',\n          classes: ['tox-statusbar__path-divider'],\n          attributes: { 'aria-hidden': true }\n        },\n        components: [text$2(` ${ delimiter } `)]\n      });\n      const renderPathData = data => foldl(data, (acc, path, index) => {\n        const element = renderElement(path.name, path.element, index);\n        if (index === 0) {\n          return acc.concat([element]);\n        } else {\n          return acc.concat([\n            renderDivider(),\n            element\n          ]);\n        }\n      }, []);\n      const updatePath = parents => {\n        const newPath = [];\n        let i = parents.length;\n        while (i-- > 0) {\n          const parent = parents[i];\n          if (parent.nodeType === 1 && !isHidden(parent)) {\n            const args = fireResolveName(editor, parent);\n            if (!args.isDefaultPrevented()) {\n              newPath.push({\n                name: args.name,\n                element: parent\n              });\n            }\n            if (args.isPropagationStopped()) {\n              break;\n            }\n          }\n        }\n        return newPath;\n      };\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-statusbar__path'],\n          attributes: { role: 'navigation' }\n        },\n        behaviours: derive$1([\n          Keying.config({\n            mode: 'flow',\n            selector: 'div[role=button]'\n          }),\n          Disabling.config({ disabled: providersBackstage.isDisabled }),\n          receivingConfig(),\n          Tabstopping.config({}),\n          Replacing.config({}),\n          config('elementPathEvents', [runOnAttached((comp, _e) => {\n              editor.shortcuts.add('alt+F11', 'focus statusbar elementpath', () => Keying.focusIn(comp));\n              editor.on('NodeChange', e => {\n                const newPath = updatePath(e.parents);\n                const newChildren = newPath.length > 0 ? renderPathData(newPath) : [];\n                Replacing.set(comp, newChildren);\n              });\n            })])\n        ]),\n        components: []\n      };\n    };\n\n    var ResizeTypes;\n    (function (ResizeTypes) {\n      ResizeTypes[ResizeTypes['None'] = 0] = 'None';\n      ResizeTypes[ResizeTypes['Both'] = 1] = 'Both';\n      ResizeTypes[ResizeTypes['Vertical'] = 2] = 'Vertical';\n    }(ResizeTypes || (ResizeTypes = {})));\n    const getDimensions = (editor, deltas, resizeType, originalHeight, originalWidth) => {\n      const dimensions = { height: calcCappedSize(originalHeight + deltas.top, getMinHeightOption(editor), getMaxHeightOption(editor)) };\n      if (resizeType === ResizeTypes.Both) {\n        dimensions.width = calcCappedSize(originalWidth + deltas.left, getMinWidthOption(editor), getMaxWidthOption(editor));\n      }\n      return dimensions;\n    };\n    const resize = (editor, deltas, resizeType) => {\n      const container = SugarElement.fromDom(editor.getContainer());\n      const dimensions = getDimensions(editor, deltas, resizeType, get$d(container), get$c(container));\n      each(dimensions, (val, dim) => {\n        if (isNumber(val)) {\n          set$8(container, dim, numToPx(val));\n        }\n      });\n      fireResizeEditor(editor);\n    };\n\n    const getResizeType = editor => {\n      const resize = getResize(editor);\n      if (resize === false) {\n        return ResizeTypes.None;\n      } else if (resize === 'both') {\n        return ResizeTypes.Both;\n      } else {\n        return ResizeTypes.Vertical;\n      }\n    };\n    const keyboardHandler = (editor, resizeType, x, y) => {\n      const scale = 20;\n      const delta = SugarPosition(x * scale, y * scale);\n      resize(editor, delta, resizeType);\n      return Optional.some(true);\n    };\n    const renderResizeHandler = (editor, providersBackstage) => {\n      const resizeType = getResizeType(editor);\n      if (resizeType === ResizeTypes.None) {\n        return Optional.none();\n      }\n      const resizeLabel = resizeType === ResizeTypes.Both ? 'Press the arrow keys to resize the editor.' : 'Press the Up and Down arrow keys to resize the editor.';\n      return Optional.some(render$3('resize-handle', {\n        tag: 'div',\n        classes: ['tox-statusbar__resize-handle'],\n        attributes: {\n          'aria-label': providersBackstage.translate(resizeLabel),\n          'data-mce-name': 'resize-handle'\n        },\n        behaviours: [\n          Dragging.config({\n            mode: 'mouse',\n            repositionTarget: false,\n            onDrag: (_comp, _target, delta) => resize(editor, delta, resizeType),\n            blockerClass: 'tox-blocker'\n          }),\n          Keying.config({\n            mode: 'special',\n            onLeft: () => keyboardHandler(editor, resizeType, -1, 0),\n            onRight: () => keyboardHandler(editor, resizeType, 1, 0),\n            onUp: () => keyboardHandler(editor, resizeType, 0, -1),\n            onDown: () => keyboardHandler(editor, resizeType, 0, 1)\n          }),\n          Tabstopping.config({}),\n          Focusing.config({}),\n          Tooltipping.config(providersBackstage.tooltips.getConfig({ tooltipText: providersBackstage.translate('Resize') }))\n        ]\n      }, providersBackstage.icons));\n    };\n\n    const renderWordCount = (editor, providersBackstage) => {\n      const replaceCountText = (comp, count, mode) => Replacing.set(comp, [text$2(providersBackstage.translate([\n          '{0} ' + mode,\n          count[mode]\n        ]))]);\n      return Button.sketch({\n        dom: {\n          tag: 'button',\n          classes: ['tox-statusbar__wordcount']\n        },\n        components: [],\n        buttonBehaviours: derive$1([\n          DisablingConfigs.button(providersBackstage.isDisabled),\n          receivingConfig(),\n          Tabstopping.config({}),\n          Replacing.config({}),\n          Representing.config({\n            store: {\n              mode: 'memory',\n              initialValue: {\n                mode: 'words',\n                count: {\n                  words: 0,\n                  characters: 0\n                }\n              }\n            }\n          }),\n          config('wordcount-events', [\n            runOnExecute$1(comp => {\n              const currentVal = Representing.getValue(comp);\n              const newMode = currentVal.mode === 'words' ? 'characters' : 'words';\n              Representing.setValue(comp, {\n                mode: newMode,\n                count: currentVal.count\n              });\n              replaceCountText(comp, currentVal.count, newMode);\n            }),\n            runOnAttached(comp => {\n              editor.on('wordCountUpdate', e => {\n                const {mode} = Representing.getValue(comp);\n                Representing.setValue(comp, {\n                  mode,\n                  count: e.wordCount\n                });\n                replaceCountText(comp, e.wordCount, mode);\n              });\n            })\n          ])\n        ]),\n        eventOrder: {\n          [execute$5()]: [\n            'disabling',\n            'alloy.base.behaviour',\n            'wordcount-events'\n          ]\n        }\n      });\n    };\n\n    const renderStatusbar = (editor, providersBackstage) => {\n      const renderBranding = () => {\n        return {\n          dom: {\n            tag: 'span',\n            classes: ['tox-statusbar__branding']\n          },\n          components: [{\n              dom: {\n                tag: 'a',\n                attributes: {\n                  href: 'https://hugerte.org/powered-by-hugerte?utm_campaign=poweredby&utm_source=editor&utm_medium=referral&utm_content=v1',\n                  rel: 'noopener',\n                  target: '_blank'\n                },\n                innerHtml: global$8.translate([\n                  'Powered by {0}',\n                  'HugeRTE'\n                ])\n              },\n              behaviours: derive$1([Focusing.config({})])\n            }]\n        };\n      };\n      const renderHelpAccessibility = () => {\n        const shortcutText = convertText('Alt+0');\n        const text = `Press {0} for help`;\n        return {\n          dom: {\n            tag: 'div',\n            classes: ['tox-statusbar__help-text']\n          },\n          components: [text$2(global$8.translate([\n              text,\n              shortcutText\n            ]))]\n        };\n      };\n      const renderRightContainer = () => {\n        const components = [];\n        if (editor.hasPlugin('wordcount')) {\n          components.push(renderWordCount(editor, providersBackstage));\n        }\n        if (useBranding(editor)) {\n          components.push(renderBranding());\n        }\n        return {\n          dom: {\n            tag: 'div',\n            classes: ['tox-statusbar__right-container']\n          },\n          components\n        };\n      };\n      const getTextComponents = () => {\n        const components = [];\n        const shouldRenderHelp = useHelpAccessibility(editor);\n        const shouldRenderElementPath = useElementPath(editor);\n        const shouldRenderRightContainer = useBranding(editor) || editor.hasPlugin('wordcount');\n        const getTextComponentClasses = () => {\n          const flexStart = 'tox-statusbar__text-container--flex-start';\n          const flexEnd = 'tox-statusbar__text-container--flex-end';\n          const spaceAround = 'tox-statusbar__text-container--space-around';\n          if (shouldRenderHelp) {\n            const container3Columns = 'tox-statusbar__text-container-3-cols';\n            if (!shouldRenderRightContainer && !shouldRenderElementPath) {\n              return [\n                container3Columns,\n                spaceAround\n              ];\n            }\n            if (shouldRenderRightContainer && !shouldRenderElementPath) {\n              return [\n                container3Columns,\n                flexEnd\n              ];\n            }\n            return [\n              container3Columns,\n              flexStart\n            ];\n          }\n          return [shouldRenderRightContainer && !shouldRenderElementPath ? flexEnd : flexStart];\n        };\n        if (shouldRenderElementPath) {\n          components.push(renderElementPath(editor, {}, providersBackstage));\n        }\n        if (shouldRenderHelp) {\n          components.push(renderHelpAccessibility());\n        }\n        if (shouldRenderRightContainer) {\n          components.push(renderRightContainer());\n        }\n        if (components.length > 0) {\n          return [{\n              dom: {\n                tag: 'div',\n                classes: [\n                  'tox-statusbar__text-container',\n                  ...getTextComponentClasses()\n                ]\n              },\n              components\n            }];\n        }\n        return [];\n      };\n      const getComponents = () => {\n        const components = getTextComponents();\n        const resizeHandler = renderResizeHandler(editor, providersBackstage);\n        return components.concat(resizeHandler.toArray());\n      };\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-statusbar']\n        },\n        components: getComponents()\n      };\n    };\n\n    const getLazyMothership = (label, singleton) => singleton.get().getOrDie(`UI for ${ label } has not been rendered`);\n    const setup$3 = (editor, setupForTheme) => {\n      const isInline = editor.inline;\n      const mode = isInline ? Inline : Iframe;\n      const header = isStickyToolbar(editor) ? StickyHeader : StaticHeader;\n      const lazyUiRefs = LazyUiReferences();\n      const lazyMothership = value$2();\n      const lazyDialogMothership = value$2();\n      const lazyPopupMothership = value$2();\n      const platform = detect$1();\n      const isTouch = platform.deviceType.isTouch();\n      const touchPlatformClass = 'tox-platform-touch';\n      const deviceClasses = isTouch ? [touchPlatformClass] : [];\n      const isToolbarBottom = isToolbarLocationBottom(editor);\n      const toolbarMode = getToolbarMode(editor);\n      const memAnchorBar = record({\n        dom: {\n          tag: 'div',\n          classes: ['tox-anchorbar']\n        }\n      });\n      const memBottomAnchorBar = record({\n        dom: {\n          tag: 'div',\n          classes: ['tox-bottom-anchorbar']\n        }\n      });\n      const lazyHeader = () => lazyUiRefs.mainUi.get().map(ui => ui.outerContainer).bind(OuterContainer.getHeader);\n      const lazyDialogSinkResult = () => Result.fromOption(lazyUiRefs.dialogUi.get().map(ui => ui.sink), 'UI has not been rendered');\n      const lazyPopupSinkResult = () => Result.fromOption(lazyUiRefs.popupUi.get().map(ui => ui.sink), '(popup) UI has not been rendered');\n      const lazyAnchorBar = lazyUiRefs.lazyGetInOuterOrDie('anchor bar', memAnchorBar.getOpt);\n      const lazyBottomAnchorBar = lazyUiRefs.lazyGetInOuterOrDie('bottom anchor bar', memBottomAnchorBar.getOpt);\n      const lazyToolbar = lazyUiRefs.lazyGetInOuterOrDie('toolbar', OuterContainer.getToolbar);\n      const lazyThrobber = lazyUiRefs.lazyGetInOuterOrDie('throbber', OuterContainer.getThrobber);\n      const backstages = init$6({\n        popup: lazyPopupSinkResult,\n        dialog: lazyDialogSinkResult\n      }, editor, lazyAnchorBar, lazyBottomAnchorBar);\n      const makeHeaderPart = () => {\n        const verticalDirAttributes = { attributes: { [Attribute]: isToolbarBottom ? AttributeValue.BottomToTop : AttributeValue.TopToBottom } };\n        const partMenubar = OuterContainer.parts.menubar({\n          dom: {\n            tag: 'div',\n            classes: ['tox-menubar']\n          },\n          backstage: backstages.popup,\n          onEscape: () => {\n            editor.focus();\n          }\n        });\n        const partToolbar = OuterContainer.parts.toolbar({\n          dom: {\n            tag: 'div',\n            classes: ['tox-toolbar']\n          },\n          getSink: backstages.popup.shared.getSink,\n          providers: backstages.popup.shared.providers,\n          onEscape: () => {\n            editor.focus();\n          },\n          onToolbarToggled: state => {\n            fireToggleToolbarDrawer(editor, state);\n          },\n          type: toolbarMode,\n          lazyToolbar,\n          lazyHeader: () => lazyHeader().getOrDie('Could not find header element'),\n          ...verticalDirAttributes\n        });\n        const partMultipleToolbar = OuterContainer.parts['multiple-toolbar']({\n          dom: {\n            tag: 'div',\n            classes: ['tox-toolbar-overlord']\n          },\n          providers: backstages.popup.shared.providers,\n          onEscape: () => {\n            editor.focus();\n          },\n          type: toolbarMode\n        });\n        const hasMultipleToolbar = isMultipleToolbars(editor);\n        const hasToolbar = isToolbarEnabled(editor);\n        const hasMenubar = isMenubarEnabled(editor);\n        const hasAnyContents = hasMultipleToolbar || hasToolbar || hasMenubar;\n        const getPartToolbar = () => {\n          if (hasMultipleToolbar) {\n            return [partMultipleToolbar];\n          } else if (hasToolbar) {\n            return [partToolbar];\n          } else {\n            return [];\n          }\n        };\n        return OuterContainer.parts.header({\n          dom: {\n            tag: 'div',\n            classes: ['tox-editor-header'].concat(hasAnyContents ? [] : ['tox-editor-header--empty']),\n            ...verticalDirAttributes\n          },\n          components: flatten([\n            hasMenubar ? [partMenubar] : [],\n            getPartToolbar(),\n            useFixedContainer(editor) ? [] : [memAnchorBar.asSpec()]\n          ]),\n          sticky: isStickyToolbar(editor),\n          editor,\n          sharedBackstage: backstages.popup.shared\n        });\n      };\n      const makeSidebarDefinition = () => {\n        const partSocket = OuterContainer.parts.socket({\n          dom: {\n            tag: 'div',\n            classes: ['tox-edit-area']\n          }\n        });\n        const partSidebar = OuterContainer.parts.sidebar({\n          dom: {\n            tag: 'div',\n            classes: ['tox-sidebar']\n          }\n        });\n        return {\n          dom: {\n            tag: 'div',\n            classes: ['tox-sidebar-wrap']\n          },\n          components: [\n            partSocket,\n            partSidebar\n          ]\n        };\n      };\n      const renderDialogUi = () => {\n        const uiContainer = getUiContainer(editor);\n        const isGridUiContainer = eq(body(), uiContainer) && get$e(uiContainer, 'display') === 'grid';\n        const sinkSpec = {\n          dom: {\n            tag: 'div',\n            classes: [\n              'tox',\n              'tox-silver-sink',\n              'tox-hugerte-aux'\n            ].concat(deviceClasses),\n            attributes: { ...global$8.isRtl() ? { dir: 'rtl' } : {} }\n          },\n          behaviours: derive$1([Positioning.config({ useFixed: () => header.isDocked(lazyHeader) })])\n        };\n        const reactiveWidthSpec = {\n          dom: { styles: { width: document.body.clientWidth + 'px' } },\n          events: derive$2([run$1(windowResize(), comp => {\n              set$8(comp.element, 'width', document.body.clientWidth + 'px');\n            })])\n        };\n        const sink = build$1(deepMerge(sinkSpec, isGridUiContainer ? reactiveWidthSpec : {}));\n        const uiMothership = takeover(sink);\n        lazyDialogMothership.set(uiMothership);\n        return {\n          sink,\n          mothership: uiMothership\n        };\n      };\n      const renderPopupUi = () => {\n        const sinkSpec = {\n          dom: {\n            tag: 'div',\n            classes: [\n              'tox',\n              'tox-silver-sink',\n              'tox-silver-popup-sink',\n              'tox-hugerte-aux'\n            ].concat(deviceClasses),\n            attributes: { ...global$8.isRtl() ? { dir: 'rtl' } : {} }\n          },\n          behaviours: derive$1([Positioning.config({\n              useFixed: () => header.isDocked(lazyHeader),\n              getBounds: () => setupForTheme.getPopupSinkBounds()\n            })])\n        };\n        const sink = build$1(sinkSpec);\n        const uiMothership = takeover(sink);\n        lazyPopupMothership.set(uiMothership);\n        return {\n          sink,\n          mothership: uiMothership\n        };\n      };\n      const renderMainUi = () => {\n        const partHeader = makeHeaderPart();\n        const sidebarContainer = makeSidebarDefinition();\n        const partThrobber = OuterContainer.parts.throbber({\n          dom: {\n            tag: 'div',\n            classes: ['tox-throbber']\n          },\n          backstage: backstages.popup\n        });\n        const partViewWrapper = OuterContainer.parts.viewWrapper({ backstage: backstages.popup });\n        const statusbar = useStatusBar(editor) && !isInline ? Optional.some(renderStatusbar(editor, backstages.popup.shared.providers)) : Optional.none();\n        const editorComponents = flatten([\n          isToolbarBottom ? [] : [partHeader],\n          isInline ? [] : [sidebarContainer],\n          isToolbarBottom ? [partHeader] : []\n        ]);\n        const editorContainer = OuterContainer.parts.editorContainer({\n          components: flatten([\n            editorComponents,\n            isInline ? [] : [\n              memBottomAnchorBar.asSpec(),\n              ...statusbar.toArray()\n            ]\n          ])\n        });\n        const isHidden = isDistractionFree(editor);\n        const attributes = {\n          role: 'application',\n          ...global$8.isRtl() ? { dir: 'rtl' } : {},\n          ...isHidden ? { 'aria-hidden': 'true' } : {}\n        };\n        const outerContainer = build$1(OuterContainer.sketch({\n          dom: {\n            tag: 'div',\n            classes: [\n              'tox',\n              'tox-hugerte'\n            ].concat(isInline ? ['tox-hugerte-inline'] : []).concat(isToolbarBottom ? ['tox-hugerte--toolbar-bottom'] : []).concat(deviceClasses),\n            styles: {\n              visibility: 'hidden',\n              ...isHidden ? {\n                opacity: '0',\n                border: '0'\n              } : {}\n            },\n            attributes\n          },\n          components: [\n            editorContainer,\n            ...isInline ? [] : [partViewWrapper],\n            partThrobber\n          ],\n          behaviours: derive$1([\n            receivingConfig(),\n            Disabling.config({ disableClass: 'tox-hugerte--disabled' }),\n            Keying.config({\n              mode: 'cyclic',\n              selector: '.tox-menubar, .tox-toolbar, .tox-toolbar__primary, .tox-toolbar__overflow--open, .tox-sidebar__overflow--open, .tox-statusbar__path, .tox-statusbar__wordcount, .tox-statusbar__branding a, .tox-statusbar__resize-handle'\n            })\n          ])\n        }));\n        const mothership = takeover(outerContainer);\n        lazyMothership.set(mothership);\n        return {\n          mothership,\n          outerContainer\n        };\n      };\n      const setEditorSize = outerContainer => {\n        const parsedHeight = numToPx(getHeightWithFallback(editor));\n        const parsedWidth = numToPx(getWidthWithFallback(editor));\n        if (!editor.inline) {\n          if (isValidValue$1('div', 'width', parsedWidth)) {\n            set$8(outerContainer.element, 'width', parsedWidth);\n          }\n          if (isValidValue$1('div', 'height', parsedHeight)) {\n            set$8(outerContainer.element, 'height', parsedHeight);\n          } else {\n            set$8(outerContainer.element, 'height', '400px');\n          }\n        }\n        return parsedHeight;\n      };\n      const setupShortcutsAndCommands = outerContainer => {\n        editor.addShortcut('alt+F9', 'focus menubar', () => {\n          OuterContainer.focusMenubar(outerContainer);\n        });\n        editor.addShortcut('alt+F10', 'focus toolbar', () => {\n          OuterContainer.focusToolbar(outerContainer);\n        });\n        editor.addCommand('ToggleToolbarDrawer', (_ui, options) => {\n          if (options === null || options === void 0 ? void 0 : options.skipFocus) {\n            OuterContainer.toggleToolbarDrawerWithoutFocusing(outerContainer);\n          } else {\n            OuterContainer.toggleToolbarDrawer(outerContainer);\n          }\n        });\n        editor.addQueryStateHandler('ToggleToolbarDrawer', () => OuterContainer.isToolbarDrawerToggled(outerContainer));\n      };\n      const renderUIWithRefs = uiRefs => {\n        const {mainUi, popupUi, uiMotherships} = uiRefs;\n        map$1(getToolbarGroups(editor), (toolbarGroupButtonConfig, name) => {\n          editor.ui.registry.addGroupToolbarButton(name, toolbarGroupButtonConfig);\n        });\n        const {buttons, menuItems, contextToolbars, sidebars, views} = editor.ui.registry.getAll();\n        const toolbarOpt = getMultipleToolbarsOption(editor);\n        const rawUiConfig = {\n          menuItems,\n          menus: getMenus(editor),\n          menubar: getMenubar(editor),\n          toolbar: toolbarOpt.getOrThunk(() => getToolbar(editor)),\n          allowToolbarGroups: toolbarMode === ToolbarMode$1.floating,\n          buttons,\n          sidebar: sidebars,\n          views\n        };\n        setupShortcutsAndCommands(mainUi.outerContainer);\n        setup$b(editor, mainUi.mothership, uiMotherships);\n        header.setup(editor, backstages.popup.shared, lazyHeader);\n        setup$6(editor, backstages.popup);\n        setup$5(editor, backstages.popup.shared.getSink, backstages.popup);\n        setup$8(editor);\n        setup$7(editor, lazyThrobber, backstages.popup.shared);\n        register$9(editor, contextToolbars, popupUi.sink, { backstage: backstages.popup });\n        setup$4(editor, popupUi.sink);\n        const elm = editor.getElement();\n        const height = setEditorSize(mainUi.outerContainer);\n        const args = {\n          targetNode: elm,\n          height\n        };\n        return mode.render(editor, uiRefs, rawUiConfig, backstages.popup, args);\n      };\n      const reuseDialogUiForPopuUi = dialogUi => {\n        lazyPopupMothership.set(dialogUi.mothership);\n        return dialogUi;\n      };\n      const renderUI = () => {\n        const mainUi = renderMainUi();\n        const dialogUi = renderDialogUi();\n        const popupUi = isSplitUiMode(editor) ? renderPopupUi() : reuseDialogUiForPopuUi(dialogUi);\n        lazyUiRefs.dialogUi.set(dialogUi);\n        lazyUiRefs.popupUi.set(popupUi);\n        lazyUiRefs.mainUi.set(mainUi);\n        const uiRefs = {\n          popupUi,\n          dialogUi,\n          mainUi,\n          uiMotherships: lazyUiRefs.getUiMotherships()\n        };\n        return renderUIWithRefs(uiRefs);\n      };\n      return {\n        popups: {\n          backstage: backstages.popup,\n          getMothership: () => getLazyMothership('popups', lazyPopupMothership)\n        },\n        dialogs: {\n          backstage: backstages.dialog,\n          getMothership: () => getLazyMothership('dialogs', lazyDialogMothership)\n        },\n        renderUI\n      };\n    };\n\n    const labelledBy = (labelledElement, labelElement) => {\n      const labelId = getOpt(labelledElement, 'id').fold(() => {\n        const id = generate$6('dialog-label');\n        set$9(labelElement, 'id', id);\n        return id;\n      }, identity);\n      set$9(labelledElement, 'aria-labelledby', labelId);\n    };\n\n    const schema$2 = constant$1([\n      required$1('lazySink'),\n      option$3('dragBlockClass'),\n      defaultedFunction('getBounds', win),\n      defaulted('useTabstopAt', always),\n      defaulted('firstTabstop', 0),\n      defaulted('eventOrder', {}),\n      field('modalBehaviours', [Keying]),\n      onKeyboardHandler('onExecute'),\n      onStrictKeyboardHandler('onEscape')\n    ]);\n    const basic = { sketch: identity };\n    const parts$2 = constant$1([\n      optional({\n        name: 'draghandle',\n        overrides: (detail, spec) => {\n          return {\n            behaviours: derive$1([Dragging.config({\n                mode: 'mouse',\n                getTarget: handle => {\n                  return ancestor(handle, '[role=\"dialog\"]').getOr(handle);\n                },\n                blockerClass: detail.dragBlockClass.getOrDie(new Error('The drag blocker class was not specified for a dialog with a drag handle: \\n' + JSON.stringify(spec, null, 2)).message),\n                getBounds: detail.getDragBounds\n              })])\n          };\n        }\n      }),\n      required({\n        schema: [required$1('dom')],\n        name: 'title'\n      }),\n      required({\n        factory: basic,\n        schema: [required$1('dom')],\n        name: 'close'\n      }),\n      required({\n        factory: basic,\n        schema: [required$1('dom')],\n        name: 'body'\n      }),\n      optional({\n        factory: basic,\n        schema: [required$1('dom')],\n        name: 'footer'\n      }),\n      external({\n        factory: {\n          sketch: (spec, detail) => ({\n            ...spec,\n            dom: detail.dom,\n            components: detail.components\n          })\n        },\n        schema: [\n          defaulted('dom', {\n            tag: 'div',\n            styles: {\n              position: 'fixed',\n              left: '0px',\n              top: '0px',\n              right: '0px',\n              bottom: '0px'\n            }\n          }),\n          defaulted('components', [])\n        ],\n        name: 'blocker'\n      })\n    ]);\n\n    const factory$4 = (detail, components, spec, externals) => {\n      const dialogComp = value$2();\n      const showDialog = dialog => {\n        dialogComp.set(dialog);\n        const sink = detail.lazySink(dialog).getOrDie();\n        const externalBlocker = externals.blocker();\n        const blocker = sink.getSystem().build({\n          ...externalBlocker,\n          components: externalBlocker.components.concat([premade(dialog)]),\n          behaviours: derive$1([\n            Focusing.config({}),\n            config('dialog-blocker-events', [runOnSource(focusin(), () => {\n                Blocking.isBlocked(dialog) ? noop() : Keying.focusIn(dialog);\n              })])\n          ])\n        });\n        attach(sink, blocker);\n        Keying.focusIn(dialog);\n      };\n      const hideDialog = dialog => {\n        dialogComp.clear();\n        parent(dialog.element).each(blockerDom => {\n          dialog.getSystem().getByDom(blockerDom).each(blocker => {\n            detach(blocker);\n          });\n        });\n      };\n      const getDialogBody = dialog => getPartOrDie(dialog, detail, 'body');\n      const getDialogFooter = dialog => getPart(dialog, detail, 'footer');\n      const setBusy = (dialog, getBusySpec) => {\n        Blocking.block(dialog, getBusySpec);\n      };\n      const setIdle = dialog => {\n        Blocking.unblock(dialog);\n      };\n      const modalEventsId = generate$6('modal-events');\n      const eventOrder = {\n        ...detail.eventOrder,\n        [attachedToDom()]: [modalEventsId].concat(detail.eventOrder['alloy.system.attached'] || [])\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components,\n        apis: {\n          show: showDialog,\n          hide: hideDialog,\n          getBody: getDialogBody,\n          getFooter: getDialogFooter,\n          setIdle,\n          setBusy\n        },\n        eventOrder,\n        domModification: {\n          attributes: {\n            'role': 'dialog',\n            'aria-modal': 'true'\n          }\n        },\n        behaviours: augment(detail.modalBehaviours, [\n          Replacing.config({}),\n          Keying.config({\n            mode: 'cyclic',\n            onEnter: detail.onExecute,\n            onEscape: detail.onEscape,\n            useTabstopAt: detail.useTabstopAt,\n            firstTabstop: detail.firstTabstop\n          }),\n          Blocking.config({ getRoot: dialogComp.get }),\n          config(modalEventsId, [runOnAttached(c => {\n              labelledBy(c.element, getPartOrDie(c, detail, 'title').element);\n            })])\n        ])\n      };\n    };\n    const ModalDialog = composite({\n      name: 'ModalDialog',\n      configFields: schema$2(),\n      partFields: parts$2(),\n      factory: factory$4,\n      apis: {\n        show: (apis, dialog) => {\n          apis.show(dialog);\n        },\n        hide: (apis, dialog) => {\n          apis.hide(dialog);\n        },\n        getBody: (apis, dialog) => apis.getBody(dialog),\n        getFooter: (apis, dialog) => apis.getFooter(dialog),\n        setBusy: (apis, dialog, getBusySpec) => {\n          apis.setBusy(dialog, getBusySpec);\n        },\n        setIdle: (apis, dialog) => {\n          apis.setIdle(dialog);\n        }\n      }\n    });\n\n    const dialogToggleMenuItemSchema = objOf([\n      type,\n      name$1\n    ].concat(commonMenuItemFields));\n    const dialogToggleMenuItemDataProcessor = boolean;\n\n    const baseFooterButtonFields = [\n      generatedName('button'),\n      optionalIcon,\n      defaultedStringEnum('align', 'end', [\n        'start',\n        'end'\n      ]),\n      primary,\n      enabled,\n      optionStringEnum('buttonType', [\n        'primary',\n        'secondary'\n      ])\n    ];\n    const dialogFooterButtonFields = [\n      ...baseFooterButtonFields,\n      text\n    ];\n    const normalFooterButtonFields = [\n      requiredStringEnum('type', [\n        'submit',\n        'cancel',\n        'custom'\n      ]),\n      ...dialogFooterButtonFields\n    ];\n    const menuFooterButtonFields = [\n      requiredStringEnum('type', ['menu']),\n      optionalText,\n      optionalTooltip,\n      optionalIcon,\n      requiredArrayOf('items', dialogToggleMenuItemSchema),\n      ...baseFooterButtonFields\n    ];\n    const toggleButtonSpecFields = [\n      ...baseFooterButtonFields,\n      requiredStringEnum('type', ['togglebutton']),\n      optionalTooltip,\n      optionalIcon,\n      optionalText,\n      defaultedBoolean('active', false)\n    ];\n    const dialogFooterButtonSchema = choose$1('type', {\n      submit: normalFooterButtonFields,\n      cancel: normalFooterButtonFields,\n      custom: normalFooterButtonFields,\n      menu: menuFooterButtonFields,\n      togglebutton: toggleButtonSpecFields\n    });\n\n    const alertBannerFields = [\n      type,\n      text,\n      requiredStringEnum('level', [\n        'info',\n        'warn',\n        'error',\n        'success'\n      ]),\n      icon,\n      defaulted('url', '')\n    ];\n    const alertBannerSchema = objOf(alertBannerFields);\n\n    const createBarFields = itemsField => [\n      type,\n      itemsField\n    ];\n\n    const buttonFields = [\n      type,\n      text,\n      enabled,\n      generatedName('button'),\n      optionalIcon,\n      borderless,\n      optionStringEnum('buttonType', [\n        'primary',\n        'secondary',\n        'toolbar'\n      ]),\n      primary\n    ];\n    const buttonSchema = objOf(buttonFields);\n\n    const formComponentFields = [\n      type,\n      name$1\n    ];\n    const formComponentWithLabelFields = formComponentFields.concat([optionalLabel]);\n\n    const checkboxFields = formComponentFields.concat([\n      label,\n      enabled\n    ]);\n    const checkboxSchema = objOf(checkboxFields);\n    const checkboxDataProcessor = boolean;\n\n    const collectionFields = formComponentWithLabelFields.concat([defaultedColumns('auto')]);\n    const collectionSchema = objOf(collectionFields);\n    const collectionDataProcessor = arrOfObj([\n      value$1,\n      text,\n      icon\n    ]);\n\n    const colorInputFields = formComponentWithLabelFields.concat([defaultedString('storageKey', 'default')]);\n    const colorInputSchema = objOf(colorInputFields);\n    const colorInputDataProcessor = string;\n\n    const colorPickerFields = formComponentWithLabelFields;\n    const colorPickerSchema = objOf(colorPickerFields);\n    const colorPickerDataProcessor = string;\n\n    const customEditorFields = formComponentFields.concat([\n      defaultedString('tag', 'textarea'),\n      requiredString('scriptId'),\n      requiredString('scriptUrl'),\n      optionFunction('onFocus'),\n      defaultedPostMsg('settings', undefined)\n    ]);\n    const customEditorFieldsOld = formComponentFields.concat([\n      defaultedString('tag', 'textarea'),\n      requiredFunction('init')\n    ]);\n    const customEditorSchema = valueOf(v => asRaw('customeditor.old', objOfOnly(customEditorFieldsOld), v).orThunk(() => asRaw('customeditor.new', objOfOnly(customEditorFields), v)));\n    const customEditorDataProcessor = string;\n\n    const dropZoneFields = formComponentWithLabelFields;\n    const dropZoneSchema = objOf(dropZoneFields);\n    const dropZoneDataProcessor = arrOfVal();\n\n    const createGridFields = itemsField => [\n      type,\n      requiredNumber('columns'),\n      itemsField\n    ];\n\n    const htmlPanelFields = [\n      type,\n      requiredString('html'),\n      defaultedStringEnum('presets', 'presentation', [\n        'presentation',\n        'document'\n      ])\n    ];\n    const htmlPanelSchema = objOf(htmlPanelFields);\n\n    const iframeFields = formComponentWithLabelFields.concat([\n      defaultedBoolean('border', false),\n      defaultedBoolean('sandboxed', true),\n      defaultedBoolean('streamContent', false),\n      defaultedBoolean('transparent', true)\n    ]);\n    const iframeSchema = objOf(iframeFields);\n    const iframeDataProcessor = string;\n\n    const imagePreviewSchema = objOf(formComponentFields.concat([optionString('height')]));\n    const imagePreviewDataProcessor = objOf([\n      requiredString('url'),\n      optionNumber('zoom'),\n      optionNumber('cachedWidth'),\n      optionNumber('cachedHeight')\n    ]);\n\n    const inputFields = formComponentWithLabelFields.concat([\n      optionString('inputMode'),\n      optionString('placeholder'),\n      defaultedBoolean('maximized', false),\n      enabled\n    ]);\n    const inputSchema = objOf(inputFields);\n    const inputDataProcessor = string;\n\n    const createLabelFields = itemsField => [\n      type,\n      label,\n      itemsField,\n      defaultedStringEnum('align', 'start', [\n        'start',\n        'center',\n        'end'\n      ])\n    ];\n\n    const listBoxSingleItemFields = [\n      text,\n      value$1\n    ];\n    const listBoxNestedItemFields = [\n      text,\n      requiredArrayOf('items', thunkOf('items', () => listBoxItemSchema))\n    ];\n    const listBoxItemSchema = oneOf([\n      objOf(listBoxSingleItemFields),\n      objOf(listBoxNestedItemFields)\n    ]);\n    const listBoxFields = formComponentWithLabelFields.concat([\n      requiredArrayOf('items', listBoxItemSchema),\n      enabled\n    ]);\n    const listBoxSchema = objOf(listBoxFields);\n    const listBoxDataProcessor = string;\n\n    const selectBoxFields = formComponentWithLabelFields.concat([\n      requiredArrayOfObj('items', [\n        text,\n        value$1\n      ]),\n      defaultedNumber('size', 1),\n      enabled\n    ]);\n    const selectBoxSchema = objOf(selectBoxFields);\n    const selectBoxDataProcessor = string;\n\n    const sizeInputFields = formComponentWithLabelFields.concat([\n      defaultedBoolean('constrain', true),\n      enabled\n    ]);\n    const sizeInputSchema = objOf(sizeInputFields);\n    const sizeInputDataProcessor = objOf([\n      requiredString('width'),\n      requiredString('height')\n    ]);\n\n    const sliderFields = formComponentFields.concat([\n      label,\n      defaultedNumber('min', 0),\n      defaultedNumber('max', 0)\n    ]);\n    const sliderSchema = objOf(sliderFields);\n    const sliderInputDataProcessor = number;\n\n    const tableFields = [\n      type,\n      requiredArrayOf('header', string),\n      requiredArrayOf('cells', arrOf(string))\n    ];\n    const tableSchema = objOf(tableFields);\n\n    const textAreaFields = formComponentWithLabelFields.concat([\n      optionString('placeholder'),\n      defaultedBoolean('maximized', false),\n      enabled\n    ]);\n    const textAreaSchema = objOf(textAreaFields);\n    const textAreaDataProcessor = string;\n\n    const baseTreeItemFields = [\n      requiredStringEnum('type', [\n        'directory',\n        'leaf'\n      ]),\n      title,\n      requiredString('id'),\n      optionOf('menu', MenuButtonSchema)\n    ];\n    const treeItemLeafFields = baseTreeItemFields;\n    const treeItemLeafSchema = objOf(treeItemLeafFields);\n    const treeItemDirectoryFields = baseTreeItemFields.concat([requiredArrayOf('children', thunkOf('children', () => {\n        return choose$2('type', {\n          directory: treeItemDirectorySchema,\n          leaf: treeItemLeafSchema\n        });\n      }))]);\n    const treeItemDirectorySchema = objOf(treeItemDirectoryFields);\n    const treeItemSchema = choose$2('type', {\n      directory: treeItemDirectorySchema,\n      leaf: treeItemLeafSchema\n    });\n    const treeFields = [\n      type,\n      requiredArrayOf('items', treeItemSchema),\n      optionFunction('onLeafAction'),\n      optionFunction('onToggleExpand'),\n      defaultedArrayOf('defaultExpandedIds', [], string),\n      optionString('defaultSelectedId')\n    ];\n    const treeSchema = objOf(treeFields);\n\n    const urlInputFields = formComponentWithLabelFields.concat([\n      defaultedStringEnum('filetype', 'file', [\n        'image',\n        'media',\n        'file'\n      ]),\n      enabled,\n      optionString('picker_text')\n    ]);\n    const urlInputSchema = objOf(urlInputFields);\n    const urlInputDataProcessor = objOf([\n      value$1,\n      defaultedMeta\n    ]);\n\n    const createItemsField = name => field$1('items', 'items', required$2(), arrOf(valueOf(v => asRaw(`Checking item of ${ name }`, itemSchema, v).fold(sErr => Result.error(formatError(sErr)), passValue => Result.value(passValue)))));\n    const itemSchema = valueThunk(() => choose$2('type', {\n      alertbanner: alertBannerSchema,\n      bar: objOf(createBarFields(createItemsField('bar'))),\n      button: buttonSchema,\n      checkbox: checkboxSchema,\n      colorinput: colorInputSchema,\n      colorpicker: colorPickerSchema,\n      dropzone: dropZoneSchema,\n      grid: objOf(createGridFields(createItemsField('grid'))),\n      iframe: iframeSchema,\n      input: inputSchema,\n      listbox: listBoxSchema,\n      selectbox: selectBoxSchema,\n      sizeinput: sizeInputSchema,\n      slider: sliderSchema,\n      textarea: textAreaSchema,\n      urlinput: urlInputSchema,\n      customeditor: customEditorSchema,\n      htmlpanel: htmlPanelSchema,\n      imagepreview: imagePreviewSchema,\n      collection: collectionSchema,\n      label: objOf(createLabelFields(createItemsField('label'))),\n      table: tableSchema,\n      tree: treeSchema,\n      panel: panelSchema\n    }));\n    const panelFields = [\n      type,\n      defaulted('classes', []),\n      requiredArrayOf('items', itemSchema)\n    ];\n    const panelSchema = objOf(panelFields);\n\n    const tabFields = [\n      generatedName('tab'),\n      title,\n      requiredArrayOf('items', itemSchema)\n    ];\n    const tabPanelFields = [\n      type,\n      requiredArrayOfObj('tabs', tabFields)\n    ];\n    const tabPanelSchema = objOf(tabPanelFields);\n\n    const dialogButtonFields = dialogFooterButtonFields;\n    const dialogButtonSchema = dialogFooterButtonSchema;\n    const dialogSchema = objOf([\n      requiredString('title'),\n      requiredOf('body', choose$2('type', {\n        panel: panelSchema,\n        tabpanel: tabPanelSchema\n      })),\n      defaultedString('size', 'normal'),\n      defaultedArrayOf('buttons', [], dialogButtonSchema),\n      defaulted('initialData', {}),\n      defaultedFunction('onAction', noop),\n      defaultedFunction('onChange', noop),\n      defaultedFunction('onSubmit', noop),\n      defaultedFunction('onClose', noop),\n      defaultedFunction('onCancel', noop),\n      defaultedFunction('onTabChange', noop)\n    ]);\n    const createDialog = spec => asRaw('dialog', dialogSchema, spec);\n\n    const urlDialogButtonSchema = objOf([\n      requiredStringEnum('type', [\n        'cancel',\n        'custom'\n      ]),\n      ...dialogButtonFields\n    ]);\n    const urlDialogSchema = objOf([\n      requiredString('title'),\n      requiredString('url'),\n      optionNumber('height'),\n      optionNumber('width'),\n      optionArrayOf('buttons', urlDialogButtonSchema),\n      defaultedFunction('onAction', noop),\n      defaultedFunction('onCancel', noop),\n      defaultedFunction('onClose', noop),\n      defaultedFunction('onMessage', noop)\n    ]);\n    const createUrlDialog = spec => asRaw('dialog', urlDialogSchema, spec);\n\n    const getAllObjects = obj => {\n      if (isObject(obj)) {\n        return [obj].concat(bind$3(values(obj), getAllObjects));\n      } else if (isArray(obj)) {\n        return bind$3(obj, getAllObjects);\n      } else {\n        return [];\n      }\n    };\n\n    const isNamedItem = obj => isString(obj.type) && isString(obj.name);\n    const dataProcessors = {\n      checkbox: checkboxDataProcessor,\n      colorinput: colorInputDataProcessor,\n      colorpicker: colorPickerDataProcessor,\n      dropzone: dropZoneDataProcessor,\n      input: inputDataProcessor,\n      iframe: iframeDataProcessor,\n      imagepreview: imagePreviewDataProcessor,\n      selectbox: selectBoxDataProcessor,\n      sizeinput: sizeInputDataProcessor,\n      slider: sliderInputDataProcessor,\n      listbox: listBoxDataProcessor,\n      size: sizeInputDataProcessor,\n      textarea: textAreaDataProcessor,\n      urlinput: urlInputDataProcessor,\n      customeditor: customEditorDataProcessor,\n      collection: collectionDataProcessor,\n      togglemenuitem: dialogToggleMenuItemDataProcessor\n    };\n    const getDataProcessor = item => Optional.from(dataProcessors[item.type]);\n    const getNamedItems = structure => filter$2(getAllObjects(structure), isNamedItem);\n\n    const createDataValidator = structure => {\n      const namedItems = getNamedItems(structure);\n      const fields = bind$3(namedItems, item => getDataProcessor(item).fold(() => [], schema => [requiredOf(item.name, schema)]));\n      return objOf(fields);\n    };\n\n    const extract = structure => {\n      var _a;\n      const internalDialog = getOrDie(createDialog(structure));\n      const dataValidator = createDataValidator(structure);\n      const initialData = (_a = structure.initialData) !== null && _a !== void 0 ? _a : {};\n      return {\n        internalDialog,\n        dataValidator,\n        initialData\n      };\n    };\n    const DialogManager = {\n      open: (factory, structure) => {\n        const extraction = extract(structure);\n        return factory(extraction.internalDialog, extraction.initialData, extraction.dataValidator);\n      },\n      openUrl: (factory, structure) => {\n        const internalDialog = getOrDie(createUrlDialog(structure));\n        return factory(internalDialog);\n      },\n      redial: structure => extract(structure)\n    };\n\n    const events = (reflectingConfig, reflectingState) => {\n      const update = (component, data) => {\n        reflectingConfig.updateState.each(updateState => {\n          const newState = updateState(component, data);\n          reflectingState.set(newState);\n        });\n        reflectingConfig.renderComponents.each(renderComponents => {\n          const newComponents = renderComponents(data, reflectingState.get());\n          const replacer = reflectingConfig.reuseDom ? withReuse : withoutReuse;\n          replacer(component, newComponents);\n        });\n      };\n      return derive$2([\n        run$1(receive(), (component, message) => {\n          const receivingData = message;\n          if (!receivingData.universal) {\n            const channel = reflectingConfig.channel;\n            if (contains$2(receivingData.channels, channel)) {\n              update(component, receivingData.data);\n            }\n          }\n        }),\n        runOnAttached((comp, _se) => {\n          reflectingConfig.initialData.each(rawData => {\n            update(comp, rawData);\n          });\n        })\n      ]);\n    };\n\n    var ActiveReflecting = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events\n    });\n\n    const getState = (component, replaceConfig, reflectState) => reflectState;\n\n    var ReflectingApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        getState: getState\n    });\n\n    var ReflectingSchema = [\n      required$1('channel'),\n      option$3('renderComponents'),\n      option$3('updateState'),\n      option$3('initialData'),\n      defaultedBoolean('reuseDom', true)\n    ];\n\n    const init = () => {\n      const cell = Cell(Optional.none());\n      const clear = () => cell.set(Optional.none());\n      const readState = () => cell.get().getOr('none');\n      return {\n        readState,\n        get: cell.get,\n        set: cell.set,\n        clear\n      };\n    };\n\n    var ReflectingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init\n    });\n\n    const Reflecting = create$4({\n      fields: ReflectingSchema,\n      name: 'reflecting',\n      active: ActiveReflecting,\n      apis: ReflectingApis,\n      state: ReflectingState\n    });\n\n    const toValidValues = values => {\n      const errors = [];\n      const result = {};\n      each(values, (value, name) => {\n        value.fold(() => {\n          errors.push(name);\n        }, v => {\n          result[name] = v;\n        });\n      });\n      return errors.length > 0 ? Result.error(errors) : Result.value(result);\n    };\n\n    const renderBodyPanel = (spec, dialogData, backstage) => {\n      const memForm = record(Form.sketch(parts => ({\n        dom: {\n          tag: 'div',\n          classes: ['tox-form'].concat(spec.classes)\n        },\n        components: map$2(spec.items, item => interpretInForm(parts, item, dialogData, backstage))\n      })));\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__body']\n        },\n        components: [{\n            dom: {\n              tag: 'div',\n              classes: ['tox-dialog__body-content']\n            },\n            components: [memForm.asSpec()]\n          }],\n        behaviours: derive$1([\n          Keying.config({\n            mode: 'acyclic',\n            useTabstopAt: not(isPseudoStop)\n          }),\n          ComposingConfigs.memento(memForm),\n          memento(memForm, {\n            postprocess: formValue => toValidValues(formValue).fold(err => {\n              console.error(err);\n              return {};\n            }, identity)\n          }),\n          config('dialog-body-panel', [run$1(focusin(), (comp, se) => {\n              comp.getSystem().broadcastOn([dialogFocusShiftedChannel], { newFocus: Optional.some(se.event.target) });\n            })])\n        ])\n      };\n    };\n\n    const factory$3 = (detail, _spec) => ({\n      uid: detail.uid,\n      dom: detail.dom,\n      components: detail.components,\n      events: events$a(detail.action),\n      behaviours: augment(detail.tabButtonBehaviours, [\n        Focusing.config({}),\n        Keying.config({\n          mode: 'execution',\n          useSpace: true,\n          useEnter: true\n        }),\n        Representing.config({\n          store: {\n            mode: 'memory',\n            initialValue: detail.value\n          }\n        })\n      ]),\n      domModification: detail.domModification\n    });\n    const TabButton = single({\n      name: 'TabButton',\n      configFields: [\n        defaulted('uid', undefined),\n        required$1('value'),\n        field$1('dom', 'dom', mergeWithThunk(() => ({\n          attributes: {\n            'role': 'tab',\n            'id': generate$6('aria'),\n            'aria-selected': 'false'\n          }\n        })), anyValue()),\n        option$3('action'),\n        defaulted('domModification', {}),\n        field('tabButtonBehaviours', [\n          Focusing,\n          Keying,\n          Representing\n        ]),\n        required$1('view')\n      ],\n      factory: factory$3\n    });\n\n    const schema$1 = constant$1([\n      required$1('tabs'),\n      required$1('dom'),\n      defaulted('clickToDismiss', false),\n      field('tabbarBehaviours', [\n        Highlighting,\n        Keying\n      ]),\n      markers$1([\n        'tabClass',\n        'selectedClass'\n      ])\n    ]);\n    const tabsPart = group({\n      factory: TabButton,\n      name: 'tabs',\n      unit: 'tab',\n      overrides: barDetail => {\n        const dismissTab$1 = (tabbar, button) => {\n          Highlighting.dehighlight(tabbar, button);\n          emitWith(tabbar, dismissTab(), {\n            tabbar,\n            button\n          });\n        };\n        const changeTab$1 = (tabbar, button) => {\n          Highlighting.highlight(tabbar, button);\n          emitWith(tabbar, changeTab(), {\n            tabbar,\n            button\n          });\n        };\n        return {\n          action: button => {\n            const tabbar = button.getSystem().getByUid(barDetail.uid).getOrDie();\n            const activeButton = Highlighting.isHighlighted(tabbar, button);\n            const response = (() => {\n              if (activeButton && barDetail.clickToDismiss) {\n                return dismissTab$1;\n              } else if (!activeButton) {\n                return changeTab$1;\n              } else {\n                return noop;\n              }\n            })();\n            response(tabbar, button);\n          },\n          domModification: { classes: [barDetail.markers.tabClass] }\n        };\n      }\n    });\n    const parts$1 = constant$1([tabsPart]);\n\n    const factory$2 = (detail, components, _spec, _externals) => ({\n      'uid': detail.uid,\n      'dom': detail.dom,\n      components,\n      'debug.sketcher': 'Tabbar',\n      'domModification': { attributes: { role: 'tablist' } },\n      'behaviours': augment(detail.tabbarBehaviours, [\n        Highlighting.config({\n          highlightClass: detail.markers.selectedClass,\n          itemClass: detail.markers.tabClass,\n          onHighlight: (tabbar, tab) => {\n            set$9(tab.element, 'aria-selected', 'true');\n          },\n          onDehighlight: (tabbar, tab) => {\n            set$9(tab.element, 'aria-selected', 'false');\n          }\n        }),\n        Keying.config({\n          mode: 'flow',\n          getInitial: tabbar => {\n            return Highlighting.getHighlighted(tabbar).map(tab => tab.element);\n          },\n          selector: '.' + detail.markers.tabClass,\n          executeOnMove: true\n        })\n      ])\n    });\n    const Tabbar = composite({\n      name: 'Tabbar',\n      configFields: schema$1(),\n      partFields: parts$1(),\n      factory: factory$2\n    });\n\n    const factory$1 = (detail, _spec) => ({\n      uid: detail.uid,\n      dom: detail.dom,\n      behaviours: augment(detail.tabviewBehaviours, [Replacing.config({})]),\n      domModification: { attributes: { role: 'tabpanel' } }\n    });\n    const Tabview = single({\n      name: 'Tabview',\n      configFields: [field('tabviewBehaviours', [Replacing])],\n      factory: factory$1\n    });\n\n    const schema = constant$1([\n      defaulted('selectFirst', true),\n      onHandler('onChangeTab'),\n      onHandler('onDismissTab'),\n      defaulted('tabs', []),\n      field('tabSectionBehaviours', [])\n    ]);\n    const barPart = required({\n      factory: Tabbar,\n      schema: [\n        required$1('dom'),\n        requiredObjOf('markers', [\n          required$1('tabClass'),\n          required$1('selectedClass')\n        ])\n      ],\n      name: 'tabbar',\n      defaults: detail => {\n        return { tabs: detail.tabs };\n      }\n    });\n    const viewPart = required({\n      factory: Tabview,\n      name: 'tabview'\n    });\n    const parts = constant$1([\n      barPart,\n      viewPart\n    ]);\n\n    const factory = (detail, components, _spec, _externals) => {\n      const changeTab$1 = button => {\n        const tabValue = Representing.getValue(button);\n        getPart(button, detail, 'tabview').each(tabview => {\n          const tabWithValue = find$5(detail.tabs, t => t.value === tabValue);\n          tabWithValue.each(tabData => {\n            const panel = tabData.view();\n            getOpt(button.element, 'id').each(id => {\n              set$9(tabview.element, 'aria-labelledby', id);\n            });\n            Replacing.set(tabview, panel);\n            detail.onChangeTab(tabview, button, panel);\n          });\n        });\n      };\n      const changeTabBy = (section, byPred) => {\n        getPart(section, detail, 'tabbar').each(tabbar => {\n          byPred(tabbar).each(emitExecute);\n        });\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components,\n        behaviours: get$3(detail.tabSectionBehaviours),\n        events: derive$2(flatten([\n          detail.selectFirst ? [runOnAttached((section, _simulatedEvent) => {\n              changeTabBy(section, Highlighting.getFirst);\n            })] : [],\n          [\n            run$1(changeTab(), (section, simulatedEvent) => {\n              const button = simulatedEvent.event.button;\n              changeTab$1(button);\n            }),\n            run$1(dismissTab(), (section, simulatedEvent) => {\n              const button = simulatedEvent.event.button;\n              detail.onDismissTab(section, button);\n            })\n          ]\n        ])),\n        apis: {\n          getViewItems: section => {\n            return getPart(section, detail, 'tabview').map(tabview => Replacing.contents(tabview)).getOr([]);\n          },\n          showTab: (section, tabKey) => {\n            const getTabIfNotActive = tabbar => {\n              const candidates = Highlighting.getCandidates(tabbar);\n              const optTab = find$5(candidates, c => Representing.getValue(c) === tabKey);\n              return optTab.filter(tab => !Highlighting.isHighlighted(tabbar, tab));\n            };\n            changeTabBy(section, getTabIfNotActive);\n          }\n        }\n      };\n    };\n    const TabSection = composite({\n      name: 'TabSection',\n      configFields: schema(),\n      partFields: parts(),\n      factory,\n      apis: {\n        getViewItems: (apis, component) => apis.getViewItems(component),\n        showTab: (apis, component, tabKey) => {\n          apis.showTab(component, tabKey);\n        }\n      }\n    });\n\n    const measureHeights = (allTabs, tabview, tabviewComp) => map$2(allTabs, (_tab, i) => {\n      Replacing.set(tabviewComp, allTabs[i].view());\n      const rect = tabview.dom.getBoundingClientRect();\n      Replacing.set(tabviewComp, []);\n      return rect.height;\n    });\n    const getMaxHeight = heights => head(sort(heights, (a, b) => {\n      if (a > b) {\n        return -1;\n      } else if (a < b) {\n        return +1;\n      } else {\n        return 0;\n      }\n    }));\n    const getMaxTabviewHeight = (dialog, tabview, tablist) => {\n      const documentElement$1 = documentElement(dialog).dom;\n      const rootElm = ancestor(dialog, '.tox-dialog-wrap').getOr(dialog);\n      const isFixed = get$e(rootElm, 'position') === 'fixed';\n      let maxHeight;\n      if (isFixed) {\n        maxHeight = Math.max(documentElement$1.clientHeight, window.innerHeight);\n      } else {\n        maxHeight = Math.max(documentElement$1.offsetHeight, documentElement$1.scrollHeight);\n      }\n      const tabviewHeight = get$d(tabview);\n      const isTabListBeside = tabview.dom.offsetLeft >= tablist.dom.offsetLeft + get$c(tablist);\n      const currentTabHeight = isTabListBeside ? Math.max(get$d(tablist), tabviewHeight) : tabviewHeight;\n      const dialogTopMargin = parseInt(get$e(dialog, 'margin-top'), 10) || 0;\n      const dialogBottomMargin = parseInt(get$e(dialog, 'margin-bottom'), 10) || 0;\n      const dialogHeight = get$d(dialog) + dialogTopMargin + dialogBottomMargin;\n      const chromeHeight = dialogHeight - currentTabHeight;\n      return maxHeight - chromeHeight;\n    };\n    const showTab = (allTabs, comp) => {\n      head(allTabs).each(tab => TabSection.showTab(comp, tab.value));\n    };\n    const setTabviewHeight = (tabview, height) => {\n      set$8(tabview, 'height', height + 'px');\n      set$8(tabview, 'flex-basis', height + 'px');\n    };\n    const updateTabviewHeight = (dialogBody, tabview, maxTabHeight) => {\n      ancestor(dialogBody, '[role=\"dialog\"]').each(dialog => {\n        descendant(dialog, '[role=\"tablist\"]').each(tablist => {\n          maxTabHeight.get().map(height => {\n            set$8(tabview, 'height', '0');\n            set$8(tabview, 'flex-basis', '0');\n            return Math.min(height, getMaxTabviewHeight(dialog, tabview, tablist));\n          }).each(height => {\n            setTabviewHeight(tabview, height);\n          });\n        });\n      });\n    };\n    const getTabview = dialog => descendant(dialog, '[role=\"tabpanel\"]');\n    const smartMode = allTabs => {\n      const maxTabHeight = value$2();\n      const extraEvents = [\n        runOnAttached(comp => {\n          const dialog = comp.element;\n          getTabview(dialog).each(tabview => {\n            set$8(tabview, 'visibility', 'hidden');\n            comp.getSystem().getByDom(tabview).toOptional().each(tabviewComp => {\n              const heights = measureHeights(allTabs, tabview, tabviewComp);\n              const maxTabHeightOpt = getMaxHeight(heights);\n              maxTabHeightOpt.fold(maxTabHeight.clear, maxTabHeight.set);\n            });\n            updateTabviewHeight(dialog, tabview, maxTabHeight);\n            remove$6(tabview, 'visibility');\n            showTab(allTabs, comp);\n            requestAnimationFrame(() => {\n              updateTabviewHeight(dialog, tabview, maxTabHeight);\n            });\n          });\n        }),\n        run$1(windowResize(), comp => {\n          const dialog = comp.element;\n          getTabview(dialog).each(tabview => {\n            updateTabviewHeight(dialog, tabview, maxTabHeight);\n          });\n        }),\n        run$1(formResizeEvent, (comp, _se) => {\n          const dialog = comp.element;\n          getTabview(dialog).each(tabview => {\n            const oldFocus = active$1(getRootNode(tabview));\n            set$8(tabview, 'visibility', 'hidden');\n            const oldHeight = getRaw(tabview, 'height').map(h => parseInt(h, 10));\n            remove$6(tabview, 'height');\n            remove$6(tabview, 'flex-basis');\n            const newHeight = tabview.dom.getBoundingClientRect().height;\n            const hasGrown = oldHeight.forall(h => newHeight > h);\n            if (hasGrown) {\n              maxTabHeight.set(newHeight);\n              updateTabviewHeight(dialog, tabview, maxTabHeight);\n            } else {\n              oldHeight.each(h => {\n                setTabviewHeight(tabview, h);\n              });\n            }\n            remove$6(tabview, 'visibility');\n            oldFocus.each(focus$3);\n          });\n        })\n      ];\n      const selectFirst = false;\n      return {\n        extraEvents,\n        selectFirst\n      };\n    };\n\n    const SendDataToSectionChannel = 'send-data-to-section';\n    const SendDataToViewChannel = 'send-data-to-view';\n    const renderTabPanel = (spec, dialogData, backstage) => {\n      const storedValue = Cell({});\n      const updateDataWithForm = form => {\n        const formData = Representing.getValue(form);\n        const validData = toValidValues(formData).getOr({});\n        const currentData = storedValue.get();\n        const newData = deepMerge(currentData, validData);\n        storedValue.set(newData);\n      };\n      const setDataOnForm = form => {\n        const tabData = storedValue.get();\n        Representing.setValue(form, tabData);\n      };\n      const oldTab = Cell(null);\n      const allTabs = map$2(spec.tabs, tab => {\n        return {\n          value: tab.name,\n          dom: {\n            tag: 'div',\n            classes: ['tox-dialog__body-nav-item']\n          },\n          components: [text$2(backstage.shared.providers.translate(tab.title))],\n          view: () => {\n            return [Form.sketch(parts => ({\n                dom: {\n                  tag: 'div',\n                  classes: ['tox-form']\n                },\n                components: map$2(tab.items, item => interpretInForm(parts, item, dialogData, backstage)),\n                formBehaviours: derive$1([\n                  Keying.config({\n                    mode: 'acyclic',\n                    useTabstopAt: not(isPseudoStop)\n                  }),\n                  config('TabView.form.events', [\n                    runOnAttached(setDataOnForm),\n                    runOnDetached(updateDataWithForm)\n                  ]),\n                  Receiving.config({\n                    channels: wrapAll([\n                      {\n                        key: SendDataToSectionChannel,\n                        value: { onReceive: updateDataWithForm }\n                      },\n                      {\n                        key: SendDataToViewChannel,\n                        value: { onReceive: setDataOnForm }\n                      }\n                    ])\n                  })\n                ])\n              }))];\n          }\n        };\n      });\n      const tabMode = smartMode(allTabs);\n      return TabSection.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__body']\n        },\n        onChangeTab: (section, button, _viewItems) => {\n          const name = Representing.getValue(button);\n          emitWith(section, formTabChangeEvent, {\n            name,\n            oldName: oldTab.get()\n          });\n          oldTab.set(name);\n        },\n        tabs: allTabs,\n        components: [\n          TabSection.parts.tabbar({\n            dom: {\n              tag: 'div',\n              classes: ['tox-dialog__body-nav']\n            },\n            components: [Tabbar.parts.tabs({})],\n            markers: {\n              tabClass: 'tox-tab',\n              selectedClass: 'tox-dialog__body-nav-item--active'\n            },\n            tabbarBehaviours: derive$1([Tabstopping.config({})])\n          }),\n          TabSection.parts.tabview({\n            dom: {\n              tag: 'div',\n              classes: ['tox-dialog__body-content']\n            }\n          })\n        ],\n        selectFirst: tabMode.selectFirst,\n        tabSectionBehaviours: derive$1([\n          config('tabpanel', tabMode.extraEvents),\n          Keying.config({ mode: 'acyclic' }),\n          Composing.config({ find: comp => head(TabSection.getViewItems(comp)) }),\n          withComp(Optional.none(), tsection => {\n            tsection.getSystem().broadcastOn([SendDataToSectionChannel], {});\n            return storedValue.get();\n          }, (tsection, value) => {\n            storedValue.set(value);\n            tsection.getSystem().broadcastOn([SendDataToViewChannel], {});\n          })\n        ])\n      });\n    };\n\n    const renderBody = (spec, dialogId, contentId, backstage, ariaAttrs) => {\n      const renderComponents = incoming => {\n        const body = incoming.body;\n        switch (body.type) {\n        case 'tabpanel': {\n            return [renderTabPanel(body, incoming.initialData, backstage)];\n          }\n        default: {\n            return [renderBodyPanel(body, incoming.initialData, backstage)];\n          }\n        }\n      };\n      const updateState = (_comp, incoming) => Optional.some({ isTabPanel: () => incoming.body.type === 'tabpanel' });\n      const ariaAttributes = { 'aria-live': 'polite' };\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__content-js'],\n          attributes: {\n            ...contentId.map(x => ({ id: x })).getOr({}),\n            ...ariaAttrs ? ariaAttributes : {}\n          }\n        },\n        components: [],\n        behaviours: derive$1([\n          ComposingConfigs.childAt(0),\n          Reflecting.config({\n            channel: `${ bodyChannel }-${ dialogId }`,\n            updateState,\n            renderComponents,\n            initialData: spec\n          })\n        ])\n      };\n    };\n    const renderInlineBody = (spec, dialogId, contentId, backstage, ariaAttrs) => renderBody(spec, dialogId, Optional.some(contentId), backstage, ariaAttrs);\n    const renderModalBody = (spec, dialogId, backstage) => {\n      const bodySpec = renderBody(spec, dialogId, Optional.none(), backstage, false);\n      return ModalDialog.parts.body(bodySpec);\n    };\n    const renderIframeBody = spec => {\n      const bodySpec = {\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__content-js']\n        },\n        components: [{\n            dom: {\n              tag: 'div',\n              classes: ['tox-dialog__body-iframe']\n            },\n            components: [craft(Optional.none(), {\n                dom: {\n                  tag: 'iframe',\n                  attributes: { src: spec.url }\n                },\n                behaviours: derive$1([\n                  Tabstopping.config({}),\n                  Focusing.config({})\n                ])\n              })]\n          }],\n        behaviours: derive$1([Keying.config({\n            mode: 'acyclic',\n            useTabstopAt: not(isPseudoStop)\n          })])\n      };\n      return ModalDialog.parts.body(bodySpec);\n    };\n\n    const isTouch = global$5.deviceType.isTouch();\n    const hiddenHeader = (title, close) => ({\n      dom: {\n        tag: 'div',\n        styles: { display: 'none' },\n        classes: ['tox-dialog__header']\n      },\n      components: [\n        title,\n        close\n      ]\n    });\n    const pClose = (onClose, providersBackstage) => ModalDialog.parts.close(Button.sketch({\n      dom: {\n        tag: 'button',\n        classes: [\n          'tox-button',\n          'tox-button--icon',\n          'tox-button--naked'\n        ],\n        attributes: {\n          'type': 'button',\n          'aria-label': providersBackstage.translate('Close')\n        }\n      },\n      action: onClose,\n      buttonBehaviours: derive$1([Tabstopping.config({})])\n    }));\n    const pUntitled = () => ModalDialog.parts.title({\n      dom: {\n        tag: 'div',\n        classes: ['tox-dialog__title'],\n        innerHtml: '',\n        styles: { display: 'none' }\n      }\n    });\n    const pBodyMessage = (message, providersBackstage) => ModalDialog.parts.body({\n      dom: {\n        tag: 'div',\n        classes: ['tox-dialog__body']\n      },\n      components: [{\n          dom: {\n            tag: 'div',\n            classes: ['tox-dialog__body-content']\n          },\n          components: [{ dom: fromHtml(`<p>${ sanitizeHtmlString(providersBackstage.translate(message)) }</p>`) }]\n        }]\n    });\n    const pFooter = buttons => ModalDialog.parts.footer({\n      dom: {\n        tag: 'div',\n        classes: ['tox-dialog__footer']\n      },\n      components: buttons\n    });\n    const pFooterGroup = (startButtons, endButtons) => [\n      Container.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__footer-start']\n        },\n        components: startButtons\n      }),\n      Container.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__footer-end']\n        },\n        components: endButtons\n      })\n    ];\n    const renderDialog$1 = spec => {\n      const dialogClass = 'tox-dialog';\n      const blockerClass = dialogClass + '-wrap';\n      const blockerBackdropClass = blockerClass + '__backdrop';\n      const scrollLockClass = dialogClass + '__disable-scroll';\n      return ModalDialog.sketch({\n        lazySink: spec.lazySink,\n        onEscape: comp => {\n          spec.onEscape(comp);\n          return Optional.some(true);\n        },\n        useTabstopAt: elem => !isPseudoStop(elem),\n        firstTabstop: spec.firstTabstop,\n        dom: {\n          tag: 'div',\n          classes: [dialogClass].concat(spec.extraClasses),\n          styles: {\n            position: 'relative',\n            ...spec.extraStyles\n          }\n        },\n        components: [\n          spec.header,\n          spec.body,\n          ...spec.footer.toArray()\n        ],\n        parts: {\n          blocker: {\n            dom: fromHtml(`<div class=\"${ blockerClass }\"></div>`),\n            components: [{\n                dom: {\n                  tag: 'div',\n                  classes: isTouch ? [\n                    blockerBackdropClass,\n                    blockerBackdropClass + '--opaque'\n                  ] : [blockerBackdropClass]\n                }\n              }]\n          }\n        },\n        dragBlockClass: blockerClass,\n        modalBehaviours: derive$1([\n          Focusing.config({}),\n          config('dialog-events', spec.dialogEvents.concat([\n            runOnSource(focusin(), (comp, _se) => {\n              Blocking.isBlocked(comp) ? noop() : Keying.focusIn(comp);\n            }),\n            run$1(focusShifted(), (comp, se) => {\n              comp.getSystem().broadcastOn([dialogFocusShiftedChannel], { newFocus: se.event.newFocus });\n            })\n          ])),\n          config('scroll-lock', [\n            runOnAttached(() => {\n              add$2(body(), scrollLockClass);\n            }),\n            runOnDetached(() => {\n              remove$2(body(), scrollLockClass);\n            })\n          ]),\n          ...spec.extraBehaviours\n        ]),\n        eventOrder: {\n          [execute$5()]: ['dialog-events'],\n          [attachedToDom()]: [\n            'scroll-lock',\n            'dialog-events',\n            'alloy.base.behaviour'\n          ],\n          [detachedFromDom()]: [\n            'alloy.base.behaviour',\n            'dialog-events',\n            'scroll-lock'\n          ],\n          ...spec.eventOrder\n        }\n      });\n    };\n\n    const renderClose = providersBackstage => Button.sketch({\n      dom: {\n        tag: 'button',\n        classes: [\n          'tox-button',\n          'tox-button--icon',\n          'tox-button--naked'\n        ],\n        attributes: {\n          'type': 'button',\n          'aria-label': providersBackstage.translate('Close'),\n          'data-mce-name': 'close'\n        }\n      },\n      buttonBehaviours: derive$1([\n        Tabstopping.config({}),\n        Tooltipping.config(providersBackstage.tooltips.getConfig({ tooltipText: providersBackstage.translate('Close') }))\n      ]),\n      components: [render$3('close', {\n          tag: 'span',\n          classes: ['tox-icon']\n        }, providersBackstage.icons)],\n      action: comp => {\n        emit(comp, formCancelEvent);\n      }\n    });\n    const renderTitle = (spec, dialogId, titleId, providersBackstage) => {\n      const renderComponents = data => [text$2(providersBackstage.translate(data.title))];\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__title'],\n          attributes: { ...titleId.map(x => ({ id: x })).getOr({}) }\n        },\n        components: [],\n        behaviours: derive$1([Reflecting.config({\n            channel: `${ titleChannel }-${ dialogId }`,\n            initialData: spec,\n            renderComponents\n          })])\n      };\n    };\n    const renderDragHandle = () => ({ dom: fromHtml('<div class=\"tox-dialog__draghandle\"></div>') });\n    const renderInlineHeader = (spec, dialogId, titleId, providersBackstage) => Container.sketch({\n      dom: fromHtml('<div class=\"tox-dialog__header\"></div>'),\n      components: [\n        renderTitle(spec, dialogId, Optional.some(titleId), providersBackstage),\n        renderDragHandle(),\n        renderClose(providersBackstage)\n      ],\n      containerBehaviours: derive$1([Dragging.config({\n          mode: 'mouse',\n          blockerClass: 'blocker',\n          getTarget: handle => {\n            return closest$1(handle, '[role=\"dialog\"]').getOrDie();\n          },\n          snaps: {\n            getSnapPoints: () => [],\n            leftAttr: 'data-drag-left',\n            topAttr: 'data-drag-top'\n          }\n        })])\n    });\n    const renderModalHeader = (spec, dialogId, providersBackstage) => {\n      const pTitle = ModalDialog.parts.title(renderTitle(spec, dialogId, Optional.none(), providersBackstage));\n      const pHandle = ModalDialog.parts.draghandle(renderDragHandle());\n      const pClose = ModalDialog.parts.close(renderClose(providersBackstage));\n      const components = [pTitle].concat(spec.draggable ? [pHandle] : []).concat([pClose]);\n      return Container.sketch({\n        dom: fromHtml('<div class=\"tox-dialog__header\"></div>'),\n        components\n      });\n    };\n\n    const getHeader = (title, dialogId, backstage) => renderModalHeader({\n      title: backstage.shared.providers.translate(title),\n      draggable: backstage.dialog.isDraggableModal()\n    }, dialogId, backstage.shared.providers);\n    const getBusySpec = (message, bs, providers, headerHeight) => ({\n      dom: {\n        tag: 'div',\n        classes: ['tox-dialog__busy-spinner'],\n        attributes: { 'aria-label': providers.translate(message) },\n        styles: {\n          left: '0px',\n          right: '0px',\n          bottom: '0px',\n          top: `${ headerHeight.getOr(0) }px`,\n          position: 'absolute'\n        }\n      },\n      behaviours: bs,\n      components: [{ dom: fromHtml('<div class=\"tox-spinner\"><div></div><div></div><div></div></div>') }]\n    });\n    const getEventExtras = (lazyDialog, providers, extra) => ({\n      onClose: () => extra.closeWindow(),\n      onBlock: blockEvent => {\n        const headerHeight = descendant(lazyDialog().element, '.tox-dialog__header').map(header => get$d(header));\n        ModalDialog.setBusy(lazyDialog(), (_comp, bs) => getBusySpec(blockEvent.message, bs, providers, headerHeight));\n      },\n      onUnblock: () => {\n        ModalDialog.setIdle(lazyDialog());\n      }\n    });\n    const fullscreenClass = 'tox-dialog--fullscreen';\n    const largeDialogClass = 'tox-dialog--width-lg';\n    const mediumDialogClass = 'tox-dialog--width-md';\n    const getDialogSizeClass = size => {\n      switch (size) {\n      case 'large':\n        return Optional.some(largeDialogClass);\n      case 'medium':\n        return Optional.some(mediumDialogClass);\n      default:\n        return Optional.none();\n      }\n    };\n    const updateDialogSizeClass = (size, component) => {\n      const dialogBody = SugarElement.fromDom(component.element.dom);\n      if (!has(dialogBody, fullscreenClass)) {\n        remove$1(dialogBody, [\n          largeDialogClass,\n          mediumDialogClass\n        ]);\n        getDialogSizeClass(size).each(dialogSizeClass => add$2(dialogBody, dialogSizeClass));\n      }\n    };\n    const toggleFullscreen = (comp, currentSize) => {\n      const dialogBody = SugarElement.fromDom(comp.element.dom);\n      const classes = get$7(dialogBody);\n      const currentSizeClass = find$5(classes, c => c === largeDialogClass || c === mediumDialogClass).or(getDialogSizeClass(currentSize));\n      toggle$3(dialogBody, [\n        fullscreenClass,\n        ...currentSizeClass.toArray()\n      ]);\n    };\n    const renderModalDialog = (spec, dialogEvents, backstage) => build$1(renderDialog$1({\n      ...spec,\n      firstTabstop: 1,\n      lazySink: backstage.shared.getSink,\n      extraBehaviours: [\n        memory({}),\n        ...spec.extraBehaviours\n      ],\n      onEscape: comp => {\n        emit(comp, formCancelEvent);\n      },\n      dialogEvents,\n      eventOrder: {\n        [receive()]: [\n          Reflecting.name(),\n          Receiving.name()\n        ],\n        [attachedToDom()]: [\n          'scroll-lock',\n          Reflecting.name(),\n          'messages',\n          'dialog-events',\n          'alloy.base.behaviour'\n        ],\n        [detachedFromDom()]: [\n          'alloy.base.behaviour',\n          'dialog-events',\n          'messages',\n          Reflecting.name(),\n          'scroll-lock'\n        ]\n      }\n    }));\n    const mapMenuButtons = (buttons, menuItemStates = {}) => {\n      const mapItems = button => {\n        const items = map$2(button.items, item => {\n          const cell = get$g(menuItemStates, item.name).getOr(Cell(false));\n          return {\n            ...item,\n            storage: cell\n          };\n        });\n        return {\n          ...button,\n          items\n        };\n      };\n      return map$2(buttons, button => {\n        return button.type === 'menu' ? mapItems(button) : button;\n      });\n    };\n    const extractCellsToObject = buttons => foldl(buttons, (acc, button) => {\n      if (button.type === 'menu') {\n        const menuButton = button;\n        return foldl(menuButton.items, (innerAcc, item) => {\n          innerAcc[item.name] = item.storage;\n          return innerAcc;\n        }, acc);\n      }\n      return acc;\n    }, {});\n\n    const initCommonEvents = (fireApiEvent, extras) => [\n      runWithTarget(focusin(), onFocus),\n      fireApiEvent(formCloseEvent, (_api, spec, _event, self) => {\n        active$1(getRootNode(self.element)).fold(noop, blur$1);\n        extras.onClose();\n        spec.onClose();\n      }),\n      fireApiEvent(formCancelEvent, (api, spec, _event, self) => {\n        spec.onCancel(api);\n        emit(self, formCloseEvent);\n      }),\n      run$1(formUnblockEvent, (_c, _se) => extras.onUnblock()),\n      run$1(formBlockEvent, (_c, se) => extras.onBlock(se.event))\n    ];\n    const initUrlDialog = (getInstanceApi, extras) => {\n      const fireApiEvent = (eventName, f) => run$1(eventName, (c, se) => {\n        withSpec(c, (spec, _c) => {\n          f(getInstanceApi(), spec, se.event, c);\n        });\n      });\n      const withSpec = (c, f) => {\n        Reflecting.getState(c).get().each(currentDialog => {\n          f(currentDialog, c);\n        });\n      };\n      return [\n        ...initCommonEvents(fireApiEvent, extras),\n        fireApiEvent(formActionEvent, (api, spec, event) => {\n          spec.onAction(api, { name: event.name });\n        })\n      ];\n    };\n    const initDialog = (getInstanceApi, extras, getSink) => {\n      const fireApiEvent = (eventName, f) => run$1(eventName, (c, se) => {\n        withSpec(c, (spec, _c) => {\n          f(getInstanceApi(), spec, se.event, c);\n        });\n      });\n      const withSpec = (c, f) => {\n        Reflecting.getState(c).get().each(currentDialogInit => {\n          f(currentDialogInit.internalDialog, c);\n        });\n      };\n      return [\n        ...initCommonEvents(fireApiEvent, extras),\n        fireApiEvent(formSubmitEvent, (api, spec) => spec.onSubmit(api)),\n        fireApiEvent(formChangeEvent, (api, spec, event) => {\n          spec.onChange(api, { name: event.name });\n        }),\n        fireApiEvent(formActionEvent, (api, spec, event, component) => {\n          const focusIn = () => component.getSystem().isConnected() ? Keying.focusIn(component) : undefined;\n          const isDisabled = focused => has$1(focused, 'disabled') || getOpt(focused, 'aria-disabled').exists(val => val === 'true');\n          const rootNode = getRootNode(component.element);\n          const current = active$1(rootNode);\n          spec.onAction(api, {\n            name: event.name,\n            value: event.value\n          });\n          active$1(rootNode).fold(focusIn, focused => {\n            if (isDisabled(focused)) {\n              focusIn();\n            } else if (current.exists(cur => contains(focused, cur) && isDisabled(cur))) {\n              focusIn();\n            } else {\n              getSink().toOptional().filter(sink => !contains(sink.element, focused)).each(focusIn);\n            }\n          });\n        }),\n        fireApiEvent(formTabChangeEvent, (api, spec, event) => {\n          spec.onTabChange(api, {\n            newTabName: event.name,\n            oldTabName: event.oldName\n          });\n        }),\n        runOnDetached(component => {\n          const api = getInstanceApi();\n          Representing.setValue(component, api.getData());\n        })\n      ];\n    };\n\n    const makeButton = (button, backstage) => renderFooterButton(button, button.type, backstage);\n    const lookup = (compInSystem, footerButtons, buttonName) => find$5(footerButtons, button => button.name === buttonName).bind(memButton => memButton.memento.getOpt(compInSystem));\n    const renderComponents = (_data, state) => {\n      const footerButtons = state.map(s => s.footerButtons).getOr([]);\n      const buttonGroups = partition$3(footerButtons, button => button.align === 'start');\n      const makeGroup = (edge, buttons) => Container.sketch({\n        dom: {\n          tag: 'div',\n          classes: [`tox-dialog__footer-${ edge }`]\n        },\n        components: map$2(buttons, button => button.memento.asSpec())\n      });\n      const startButtons = makeGroup('start', buttonGroups.pass);\n      const endButtons = makeGroup('end', buttonGroups.fail);\n      return [\n        startButtons,\n        endButtons\n      ];\n    };\n    const renderFooter = (initSpec, dialogId, backstage) => {\n      const updateState = (comp, data) => {\n        const footerButtons = map$2(data.buttons, button => {\n          const memButton = record(makeButton(button, backstage));\n          return {\n            name: button.name,\n            align: button.align,\n            memento: memButton\n          };\n        });\n        const lookupByName = buttonName => lookup(comp, footerButtons, buttonName);\n        return Optional.some({\n          lookupByName,\n          footerButtons\n        });\n      };\n      return {\n        dom: fromHtml('<div class=\"tox-dialog__footer\"></div>'),\n        components: [],\n        behaviours: derive$1([Reflecting.config({\n            channel: `${ footerChannel }-${ dialogId }`,\n            initialData: initSpec,\n            updateState,\n            renderComponents\n          })])\n      };\n    };\n    const renderInlineFooter = (initSpec, dialogId, backstage) => renderFooter(initSpec, dialogId, backstage);\n    const renderModalFooter = (initSpec, dialogId, backstage) => ModalDialog.parts.footer(renderFooter(initSpec, dialogId, backstage));\n\n    const getCompByName = (access, name) => {\n      const root = access.getRoot();\n      if (root.getSystem().isConnected()) {\n        const form = Composing.getCurrent(access.getFormWrapper()).getOr(access.getFormWrapper());\n        return Form.getField(form, name).orThunk(() => {\n          const footer = access.getFooter();\n          const footerState = footer.bind(f => Reflecting.getState(f).get());\n          return footerState.bind(f => f.lookupByName(name));\n        });\n      } else {\n        return Optional.none();\n      }\n    };\n    const validateData$1 = (access, data) => {\n      const root = access.getRoot();\n      return Reflecting.getState(root).get().map(dialogState => getOrDie(asRaw('data', dialogState.dataValidator, data))).getOr(data);\n    };\n    const getDialogApi = (access, doRedial, menuItemStates) => {\n      const withRoot = f => {\n        const root = access.getRoot();\n        if (root.getSystem().isConnected()) {\n          f(root);\n        }\n      };\n      const getData = () => {\n        const root = access.getRoot();\n        const valueComp = root.getSystem().isConnected() ? access.getFormWrapper() : root;\n        const representedValues = Representing.getValue(valueComp);\n        const menuItemCurrentState = map$1(menuItemStates, cell => cell.get());\n        return {\n          ...representedValues,\n          ...menuItemCurrentState\n        };\n      };\n      const setData = newData => {\n        withRoot(_ => {\n          const prevData = instanceApi.getData();\n          const mergedData = deepMerge(prevData, newData);\n          const newInternalData = validateData$1(access, mergedData);\n          const form = access.getFormWrapper();\n          Representing.setValue(form, newInternalData);\n          each(menuItemStates, (v, k) => {\n            if (has$2(mergedData, k)) {\n              v.set(mergedData[k]);\n            }\n          });\n        });\n      };\n      const setEnabled = (name, state) => {\n        getCompByName(access, name).each(state ? Disabling.enable : Disabling.disable);\n      };\n      const focus = name => {\n        getCompByName(access, name).each(Focusing.focus);\n      };\n      const block = message => {\n        if (!isString(message)) {\n          throw new Error('The dialogInstanceAPI.block function should be passed a blocking message of type string as an argument');\n        }\n        withRoot(root => {\n          emitWith(root, formBlockEvent, { message });\n        });\n      };\n      const unblock = () => {\n        withRoot(root => {\n          emit(root, formUnblockEvent);\n        });\n      };\n      const showTab = name => {\n        withRoot(_ => {\n          const body = access.getBody();\n          const bodyState = Reflecting.getState(body);\n          if (bodyState.get().exists(b => b.isTabPanel())) {\n            Composing.getCurrent(body).each(tabSection => {\n              TabSection.showTab(tabSection, name);\n            });\n          }\n        });\n      };\n      const redial = d => {\n        withRoot(root => {\n          const id = access.getId();\n          const dialogInit = doRedial(d);\n          const storedMenuButtons = mapMenuButtons(dialogInit.internalDialog.buttons, menuItemStates);\n          root.getSystem().broadcastOn([`${ dialogChannel }-${ id }`], dialogInit);\n          root.getSystem().broadcastOn([`${ titleChannel }-${ id }`], dialogInit.internalDialog);\n          root.getSystem().broadcastOn([`${ bodyChannel }-${ id }`], dialogInit.internalDialog);\n          root.getSystem().broadcastOn([`${ footerChannel }-${ id }`], {\n            ...dialogInit.internalDialog,\n            buttons: storedMenuButtons\n          });\n          instanceApi.setData(dialogInit.initialData);\n        });\n      };\n      const close = () => {\n        withRoot(root => {\n          emit(root, formCloseEvent);\n        });\n      };\n      const instanceApi = {\n        getData,\n        setData,\n        setEnabled,\n        focus,\n        block,\n        unblock,\n        showTab,\n        redial,\n        close,\n        toggleFullscreen: access.toggleFullscreen\n      };\n      return instanceApi;\n    };\n\n    const renderDialog = (dialogInit, extra, backstage) => {\n      const dialogId = generate$6('dialog');\n      const internalDialog = dialogInit.internalDialog;\n      const header = getHeader(internalDialog.title, dialogId, backstage);\n      const dialogSize = Cell(internalDialog.size);\n      const dialogSizeClasses = getDialogSizeClass(dialogSize.get()).toArray();\n      const updateState = (comp, incoming) => {\n        dialogSize.set(incoming.internalDialog.size);\n        updateDialogSizeClass(incoming.internalDialog.size, comp);\n        return Optional.some(incoming);\n      };\n      const body = renderModalBody({\n        body: internalDialog.body,\n        initialData: internalDialog.initialData\n      }, dialogId, backstage);\n      const storedMenuButtons = mapMenuButtons(internalDialog.buttons);\n      const objOfCells = extractCellsToObject(storedMenuButtons);\n      const footer = someIf(storedMenuButtons.length !== 0, renderModalFooter({ buttons: storedMenuButtons }, dialogId, backstage));\n      const dialogEvents = initDialog(() => instanceApi, getEventExtras(() => dialog, backstage.shared.providers, extra), backstage.shared.getSink);\n      const spec = {\n        id: dialogId,\n        header,\n        body,\n        footer,\n        extraClasses: dialogSizeClasses,\n        extraBehaviours: [Reflecting.config({\n            channel: `${ dialogChannel }-${ dialogId }`,\n            updateState,\n            initialData: dialogInit\n          })],\n        extraStyles: {}\n      };\n      const dialog = renderModalDialog(spec, dialogEvents, backstage);\n      const modalAccess = (() => {\n        const getForm = () => {\n          const outerForm = ModalDialog.getBody(dialog);\n          return Composing.getCurrent(outerForm).getOr(outerForm);\n        };\n        const toggleFullscreen$1 = () => {\n          toggleFullscreen(dialog, dialogSize.get());\n        };\n        return {\n          getId: constant$1(dialogId),\n          getRoot: constant$1(dialog),\n          getBody: () => ModalDialog.getBody(dialog),\n          getFooter: () => ModalDialog.getFooter(dialog),\n          getFormWrapper: getForm,\n          toggleFullscreen: toggleFullscreen$1\n        };\n      })();\n      const instanceApi = getDialogApi(modalAccess, extra.redial, objOfCells);\n      return {\n        dialog,\n        instanceApi\n      };\n    };\n\n    const renderInlineDialog = (dialogInit, extra, backstage, ariaAttrs = false, refreshDocking) => {\n      const dialogId = generate$6('dialog');\n      const dialogLabelId = generate$6('dialog-label');\n      const dialogContentId = generate$6('dialog-content');\n      const internalDialog = dialogInit.internalDialog;\n      const dialogSize = Cell(internalDialog.size);\n      const dialogSizeClass = getDialogSizeClass(dialogSize.get()).toArray();\n      const updateState = (comp, incoming) => {\n        dialogSize.set(incoming.internalDialog.size);\n        updateDialogSizeClass(incoming.internalDialog.size, comp);\n        refreshDocking();\n        return Optional.some(incoming);\n      };\n      const memHeader = record(renderInlineHeader({\n        title: internalDialog.title,\n        draggable: true\n      }, dialogId, dialogLabelId, backstage.shared.providers));\n      const memBody = record(renderInlineBody({\n        body: internalDialog.body,\n        initialData: internalDialog.initialData\n      }, dialogId, dialogContentId, backstage, ariaAttrs));\n      const storagedMenuButtons = mapMenuButtons(internalDialog.buttons);\n      const objOfCells = extractCellsToObject(storagedMenuButtons);\n      const optMemFooter = someIf(storagedMenuButtons.length !== 0, record(renderInlineFooter({ buttons: storagedMenuButtons }, dialogId, backstage)));\n      const dialogEvents = initDialog(() => instanceApi, {\n        onBlock: event => {\n          Blocking.block(dialog, (_comp, bs) => {\n            const headerHeight = memHeader.getOpt(dialog).map(dialog => get$d(dialog.element));\n            return getBusySpec(event.message, bs, backstage.shared.providers, headerHeight);\n          });\n        },\n        onUnblock: () => {\n          Blocking.unblock(dialog);\n        },\n        onClose: () => extra.closeWindow()\n      }, backstage.shared.getSink);\n      const inlineClass = 'tox-dialog-inline';\n      const dialog = build$1({\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-dialog',\n            inlineClass,\n            ...dialogSizeClass\n          ],\n          attributes: {\n            role: 'dialog',\n            ['aria-labelledby']: dialogLabelId\n          }\n        },\n        eventOrder: {\n          [receive()]: [\n            Reflecting.name(),\n            Receiving.name()\n          ],\n          [execute$5()]: ['execute-on-form'],\n          [attachedToDom()]: [\n            'reflecting',\n            'execute-on-form'\n          ]\n        },\n        behaviours: derive$1([\n          Keying.config({\n            mode: 'cyclic',\n            onEscape: c => {\n              emit(c, formCloseEvent);\n              return Optional.some(true);\n            },\n            useTabstopAt: elem => !isPseudoStop(elem) && (name$3(elem) !== 'button' || get$f(elem, 'disabled') !== 'disabled'),\n            firstTabstop: 1\n          }),\n          Reflecting.config({\n            channel: `${ dialogChannel }-${ dialogId }`,\n            updateState,\n            initialData: dialogInit\n          }),\n          Focusing.config({}),\n          config('execute-on-form', dialogEvents.concat([\n            runOnSource(focusin(), (comp, _se) => {\n              Keying.focusIn(comp);\n            }),\n            run$1(focusShifted(), (comp, se) => {\n              comp.getSystem().broadcastOn([dialogFocusShiftedChannel], { newFocus: se.event.newFocus });\n            })\n          ])),\n          Blocking.config({ getRoot: () => Optional.some(dialog) }),\n          Replacing.config({}),\n          memory({})\n        ]),\n        components: [\n          memHeader.asSpec(),\n          memBody.asSpec(),\n          ...optMemFooter.map(memFooter => memFooter.asSpec()).toArray()\n        ]\n      });\n      const toggleFullscreen$1 = () => {\n        toggleFullscreen(dialog, dialogSize.get());\n      };\n      const instanceApi = getDialogApi({\n        getId: constant$1(dialogId),\n        getRoot: constant$1(dialog),\n        getFooter: () => optMemFooter.map(memFooter => memFooter.get(dialog)),\n        getBody: () => memBody.get(dialog),\n        getFormWrapper: () => {\n          const body = memBody.get(dialog);\n          return Composing.getCurrent(body).getOr(body);\n        },\n        toggleFullscreen: toggleFullscreen$1\n      }, extra.redial, objOfCells);\n      return {\n        dialog,\n        instanceApi\n      };\n    };\n\n    var global = hugerte.util.Tools.resolve('hugerte.util.URI');\n\n    const getUrlDialogApi = root => {\n      const withRoot = f => {\n        if (root.getSystem().isConnected()) {\n          f(root);\n        }\n      };\n      const block = message => {\n        if (!isString(message)) {\n          throw new Error('The urlDialogInstanceAPI.block function should be passed a blocking message of type string as an argument');\n        }\n        withRoot(root => {\n          emitWith(root, formBlockEvent, { message });\n        });\n      };\n      const unblock = () => {\n        withRoot(root => {\n          emit(root, formUnblockEvent);\n        });\n      };\n      const close = () => {\n        withRoot(root => {\n          emit(root, formCloseEvent);\n        });\n      };\n      const sendMessage = data => {\n        withRoot(root => {\n          root.getSystem().broadcastOn([bodySendMessageChannel], data);\n        });\n      };\n      return {\n        block,\n        unblock,\n        close,\n        sendMessage\n      };\n    };\n\n    const SUPPORTED_MESSAGE_ACTIONS = [\n      'insertContent',\n      'setContent',\n      'execCommand',\n      'close',\n      'block',\n      'unblock'\n    ];\n    const isSupportedMessage = data => isObject(data) && SUPPORTED_MESSAGE_ACTIONS.indexOf(data.mceAction) !== -1;\n    const isCustomMessage = data => !isSupportedMessage(data) && isObject(data) && has$2(data, 'mceAction');\n    const handleMessage = (editor, api, data) => {\n      switch (data.mceAction) {\n      case 'insertContent':\n        editor.insertContent(data.content);\n        break;\n      case 'setContent':\n        editor.setContent(data.content);\n        break;\n      case 'execCommand':\n        const ui = isBoolean(data.ui) ? data.ui : false;\n        editor.execCommand(data.cmd, ui, data.value);\n        break;\n      case 'close':\n        api.close();\n        break;\n      case 'block':\n        api.block(data.message);\n        break;\n      case 'unblock':\n        api.unblock();\n        break;\n      }\n    };\n    const renderUrlDialog = (internalDialog, extra, editor, backstage) => {\n      const dialogId = generate$6('dialog');\n      const header = getHeader(internalDialog.title, dialogId, backstage);\n      const body = renderIframeBody(internalDialog);\n      const footer = internalDialog.buttons.bind(buttons => {\n        if (buttons.length === 0) {\n          return Optional.none();\n        } else {\n          return Optional.some(renderModalFooter({ buttons }, dialogId, backstage));\n        }\n      });\n      const dialogEvents = initUrlDialog(() => instanceApi, getEventExtras(() => dialog, backstage.shared.providers, extra));\n      const styles = {\n        ...internalDialog.height.fold(() => ({}), height => ({\n          'height': height + 'px',\n          'max-height': height + 'px'\n        })),\n        ...internalDialog.width.fold(() => ({}), width => ({\n          'width': width + 'px',\n          'max-width': width + 'px'\n        }))\n      };\n      const classes = internalDialog.width.isNone() && internalDialog.height.isNone() ? ['tox-dialog--width-lg'] : [];\n      const iframeUri = new global(internalDialog.url, { base_uri: new global(window.location.href) });\n      const iframeDomain = `${ iframeUri.protocol }://${ iframeUri.host }${ iframeUri.port ? ':' + iframeUri.port : '' }`;\n      const messageHandlerUnbinder = unbindable();\n      const updateState = (_comp, incoming) => Optional.some(incoming);\n      const extraBehaviours = [\n        Reflecting.config({\n          channel: `${ dialogChannel }-${ dialogId }`,\n          updateState,\n          initialData: internalDialog\n        }),\n        config('messages', [\n          runOnAttached(() => {\n            const unbind = bind(SugarElement.fromDom(window), 'message', e => {\n              if (iframeUri.isSameOrigin(new global(e.raw.origin))) {\n                const data = e.raw.data;\n                if (isSupportedMessage(data)) {\n                  handleMessage(editor, instanceApi, data);\n                } else if (isCustomMessage(data)) {\n                  internalDialog.onMessage(instanceApi, data);\n                }\n              }\n            });\n            messageHandlerUnbinder.set(unbind);\n          }),\n          runOnDetached(messageHandlerUnbinder.clear)\n        ]),\n        Receiving.config({\n          channels: {\n            [bodySendMessageChannel]: {\n              onReceive: (comp, data) => {\n                descendant(comp.element, 'iframe').each(iframeEle => {\n                  const iframeWin = iframeEle.dom.contentWindow;\n                  if (isNonNullable(iframeWin)) {\n                    iframeWin.postMessage(data, iframeDomain);\n                  }\n                });\n              }\n            }\n          }\n        })\n      ];\n      const spec = {\n        id: dialogId,\n        header,\n        body,\n        footer,\n        extraClasses: classes,\n        extraBehaviours,\n        extraStyles: styles\n      };\n      const dialog = renderModalDialog(spec, dialogEvents, backstage);\n      const instanceApi = getUrlDialogApi(dialog);\n      return {\n        dialog,\n        instanceApi\n      };\n    };\n\n    const setup$2 = backstage => {\n      const sharedBackstage = backstage.shared;\n      const open = (message, callback) => {\n        const closeDialog = () => {\n          ModalDialog.hide(alertDialog);\n          callback();\n        };\n        const memFooterClose = record(renderFooterButton({\n          name: 'close-alert',\n          text: 'OK',\n          primary: true,\n          buttonType: Optional.some('primary'),\n          align: 'end',\n          enabled: true,\n          icon: Optional.none()\n        }, 'cancel', backstage));\n        const titleSpec = pUntitled();\n        const closeSpec = pClose(closeDialog, sharedBackstage.providers);\n        const alertDialog = build$1(renderDialog$1({\n          lazySink: () => sharedBackstage.getSink(),\n          header: hiddenHeader(titleSpec, closeSpec),\n          body: pBodyMessage(message, sharedBackstage.providers),\n          footer: Optional.some(pFooter(pFooterGroup([], [memFooterClose.asSpec()]))),\n          onEscape: closeDialog,\n          extraClasses: ['tox-alert-dialog'],\n          extraBehaviours: [],\n          extraStyles: {},\n          dialogEvents: [run$1(formCancelEvent, closeDialog)],\n          eventOrder: {}\n        }));\n        ModalDialog.show(alertDialog);\n        const footerCloseButton = memFooterClose.get(alertDialog);\n        Focusing.focus(footerCloseButton);\n      };\n      return { open };\n    };\n\n    const setup$1 = backstage => {\n      const sharedBackstage = backstage.shared;\n      const open = (message, callback) => {\n        const closeDialog = state => {\n          ModalDialog.hide(confirmDialog);\n          callback(state);\n        };\n        const memFooterYes = record(renderFooterButton({\n          name: 'yes',\n          text: 'Yes',\n          primary: true,\n          buttonType: Optional.some('primary'),\n          align: 'end',\n          enabled: true,\n          icon: Optional.none()\n        }, 'submit', backstage));\n        const footerNo = renderFooterButton({\n          name: 'no',\n          text: 'No',\n          primary: false,\n          buttonType: Optional.some('secondary'),\n          align: 'end',\n          enabled: true,\n          icon: Optional.none()\n        }, 'cancel', backstage);\n        const titleSpec = pUntitled();\n        const closeSpec = pClose(() => closeDialog(false), sharedBackstage.providers);\n        const confirmDialog = build$1(renderDialog$1({\n          lazySink: () => sharedBackstage.getSink(),\n          header: hiddenHeader(titleSpec, closeSpec),\n          body: pBodyMessage(message, sharedBackstage.providers),\n          footer: Optional.some(pFooter(pFooterGroup([], [\n            footerNo,\n            memFooterYes.asSpec()\n          ]))),\n          onEscape: () => closeDialog(false),\n          extraClasses: ['tox-confirm-dialog'],\n          extraBehaviours: [],\n          extraStyles: {},\n          dialogEvents: [\n            run$1(formCancelEvent, () => closeDialog(false)),\n            run$1(formSubmitEvent, () => closeDialog(true))\n          ],\n          eventOrder: {}\n        }));\n        ModalDialog.show(confirmDialog);\n        const footerYesButton = memFooterYes.get(confirmDialog);\n        Focusing.focus(footerYesButton);\n      };\n      return { open };\n    };\n\n    const validateData = (data, validator) => getOrDie(asRaw('data', validator, data));\n    const isAlertOrConfirmDialog = target => closest(target, '.tox-alert-dialog') || closest(target, '.tox-confirm-dialog');\n    const inlineAdditionalBehaviours = (editor, isStickyToolbar, isToolbarLocationTop) => {\n      if (isStickyToolbar && isToolbarLocationTop) {\n        return [];\n      } else {\n        return [Docking.config({\n            contextual: {\n              lazyContext: () => Optional.some(box$1(SugarElement.fromDom(editor.getContentAreaContainer()))),\n              fadeInClass: 'tox-dialog-dock-fadein',\n              fadeOutClass: 'tox-dialog-dock-fadeout',\n              transitionClass: 'tox-dialog-dock-transition'\n            },\n            modes: ['top'],\n            lazyViewport: comp => {\n              const optScrollingContext = detectWhenSplitUiMode(editor, comp.element);\n              return optScrollingContext.map(sc => {\n                const combinedBounds = getBoundsFrom(sc);\n                return {\n                  bounds: combinedBounds,\n                  optScrollEnv: Optional.some({\n                    currentScrollTop: sc.element.dom.scrollTop,\n                    scrollElmTop: absolute$3(sc.element).top\n                  })\n                };\n              }).getOrThunk(() => ({\n                bounds: win(),\n                optScrollEnv: Optional.none()\n              }));\n            }\n          })];\n      }\n    };\n    const setup = extras => {\n      const editor = extras.editor;\n      const isStickyToolbar$1 = isStickyToolbar(editor);\n      const alertDialog = setup$2(extras.backstages.dialog);\n      const confirmDialog = setup$1(extras.backstages.dialog);\n      const open = (config, params, closeWindow) => {\n        if (!isUndefined(params)) {\n          if (params.inline === 'toolbar') {\n            return openInlineDialog(config, extras.backstages.popup.shared.anchors.inlineDialog(), closeWindow, params);\n          } else if (params.inline === 'bottom') {\n            return openBottomInlineDialog(config, extras.backstages.popup.shared.anchors.inlineBottomDialog(), closeWindow, params);\n          } else if (params.inline === 'cursor') {\n            return openInlineDialog(config, extras.backstages.popup.shared.anchors.cursor(), closeWindow, params);\n          }\n        }\n        return openModalDialog(config, closeWindow);\n      };\n      const openUrl = (config, closeWindow) => openModalUrlDialog(config, closeWindow);\n      const openModalUrlDialog = (config, closeWindow) => {\n        const factory = contents => {\n          const dialog = renderUrlDialog(contents, {\n            closeWindow: () => {\n              ModalDialog.hide(dialog.dialog);\n              closeWindow(dialog.instanceApi);\n            }\n          }, editor, extras.backstages.dialog);\n          ModalDialog.show(dialog.dialog);\n          return dialog.instanceApi;\n        };\n        return DialogManager.openUrl(factory, config);\n      };\n      const openModalDialog = (config, closeWindow) => {\n        const factory = (contents, internalInitialData, dataValidator) => {\n          const initialData = internalInitialData;\n          const dialogInit = {\n            dataValidator,\n            initialData,\n            internalDialog: contents\n          };\n          const dialog = renderDialog(dialogInit, {\n            redial: DialogManager.redial,\n            closeWindow: () => {\n              ModalDialog.hide(dialog.dialog);\n              closeWindow(dialog.instanceApi);\n            }\n          }, extras.backstages.dialog);\n          ModalDialog.show(dialog.dialog);\n          dialog.instanceApi.setData(initialData);\n          return dialog.instanceApi;\n        };\n        return DialogManager.open(factory, config);\n      };\n      const openInlineDialog = (config$1, anchor, closeWindow, windowParams) => {\n        const factory = (contents, internalInitialData, dataValidator) => {\n          const initialData = validateData(internalInitialData, dataValidator);\n          const inlineDialog = value$2();\n          const isToolbarLocationTop = extras.backstages.popup.shared.header.isPositionedAtTop();\n          const dialogInit = {\n            dataValidator,\n            initialData,\n            internalDialog: contents\n          };\n          const refreshDocking = () => inlineDialog.on(dialog => {\n            InlineView.reposition(dialog);\n            if (!isStickyToolbar$1 || !isToolbarLocationTop) {\n              Docking.refresh(dialog);\n            }\n          });\n          const dialogUi = renderInlineDialog(dialogInit, {\n            redial: DialogManager.redial,\n            closeWindow: () => {\n              inlineDialog.on(InlineView.hide);\n              editor.off('ResizeEditor', refreshDocking);\n              inlineDialog.clear();\n              closeWindow(dialogUi.instanceApi);\n            }\n          }, extras.backstages.popup, windowParams.ariaAttrs, refreshDocking);\n          const inlineDialogComp = build$1(InlineView.sketch({\n            lazySink: extras.backstages.popup.shared.getSink,\n            dom: {\n              tag: 'div',\n              classes: []\n            },\n            fireDismissalEventInstead: windowParams.persistent ? { event: 'doNotDismissYet' } : {},\n            ...isToolbarLocationTop ? {} : { fireRepositionEventInstead: {} },\n            inlineBehaviours: derive$1([\n              config('window-manager-inline-events', [run$1(dismissRequested(), (_comp, _se) => {\n                  emit(dialogUi.dialog, formCancelEvent);\n                })]),\n              ...inlineAdditionalBehaviours(editor, isStickyToolbar$1, isToolbarLocationTop)\n            ]),\n            isExtraPart: (_comp, target) => isAlertOrConfirmDialog(target)\n          }));\n          inlineDialog.set(inlineDialogComp);\n          const getInlineDialogBounds = () => {\n            const elem = editor.inline ? body() : SugarElement.fromDom(editor.getContainer());\n            const bounds = box$1(elem);\n            return Optional.some(bounds);\n          };\n          InlineView.showWithinBounds(inlineDialogComp, premade(dialogUi.dialog), { anchor }, getInlineDialogBounds);\n          if (!isStickyToolbar$1 || !isToolbarLocationTop) {\n            Docking.refresh(inlineDialogComp);\n            editor.on('ResizeEditor', refreshDocking);\n          }\n          dialogUi.instanceApi.setData(initialData);\n          Keying.focusIn(dialogUi.dialog);\n          return dialogUi.instanceApi;\n        };\n        return DialogManager.open(factory, config$1);\n      };\n      const openBottomInlineDialog = (config$1, anchor, closeWindow, windowParams) => {\n        const factory = (contents, internalInitialData, dataValidator) => {\n          const initialData = validateData(internalInitialData, dataValidator);\n          const inlineDialog = value$2();\n          const isToolbarLocationTop = extras.backstages.popup.shared.header.isPositionedAtTop();\n          const dialogInit = {\n            dataValidator,\n            initialData,\n            internalDialog: contents\n          };\n          const refreshDocking = () => inlineDialog.on(dialog => {\n            InlineView.reposition(dialog);\n            Docking.refresh(dialog);\n          });\n          const dialogUi = renderInlineDialog(dialogInit, {\n            redial: DialogManager.redial,\n            closeWindow: () => {\n              inlineDialog.on(InlineView.hide);\n              editor.off('ResizeEditor ScrollWindow ElementScroll', refreshDocking);\n              inlineDialog.clear();\n              closeWindow(dialogUi.instanceApi);\n            }\n          }, extras.backstages.popup, windowParams.ariaAttrs, refreshDocking);\n          const inlineDialogComp = build$1(InlineView.sketch({\n            lazySink: extras.backstages.popup.shared.getSink,\n            dom: {\n              tag: 'div',\n              classes: []\n            },\n            fireDismissalEventInstead: windowParams.persistent ? { event: 'doNotDismissYet' } : {},\n            ...isToolbarLocationTop ? {} : { fireRepositionEventInstead: {} },\n            inlineBehaviours: derive$1([\n              config('window-manager-inline-events', [run$1(dismissRequested(), (_comp, _se) => {\n                  emit(dialogUi.dialog, formCancelEvent);\n                })]),\n              Docking.config({\n                contextual: {\n                  lazyContext: () => Optional.some(box$1(SugarElement.fromDom(editor.getContentAreaContainer()))),\n                  fadeInClass: 'tox-dialog-dock-fadein',\n                  fadeOutClass: 'tox-dialog-dock-fadeout',\n                  transitionClass: 'tox-dialog-dock-transition'\n                },\n                modes: [\n                  'top',\n                  'bottom'\n                ],\n                lazyViewport: comp => {\n                  const optScrollingContext = detectWhenSplitUiMode(editor, comp.element);\n                  return optScrollingContext.map(sc => {\n                    const combinedBounds = getBoundsFrom(sc);\n                    return {\n                      bounds: combinedBounds,\n                      optScrollEnv: Optional.some({\n                        currentScrollTop: sc.element.dom.scrollTop,\n                        scrollElmTop: absolute$3(sc.element).top\n                      })\n                    };\n                  }).getOrThunk(() => ({\n                    bounds: win(),\n                    optScrollEnv: Optional.none()\n                  }));\n                }\n              })\n            ]),\n            isExtraPart: (_comp, target) => isAlertOrConfirmDialog(target)\n          }));\n          inlineDialog.set(inlineDialogComp);\n          const getInlineDialogBounds = () => {\n            return extras.backstages.popup.shared.getSink().toOptional().bind(s => {\n              const optScrollingContext = detectWhenSplitUiMode(editor, s.element);\n              const margin = 15;\n              const bounds$1 = optScrollingContext.map(sc => getBoundsFrom(sc)).getOr(win());\n              const contentAreaContainer = box$1(SugarElement.fromDom(editor.getContentAreaContainer()));\n              const constrainedBounds = constrain(contentAreaContainer, bounds$1);\n              return Optional.some(bounds(constrainedBounds.x, constrainedBounds.y, constrainedBounds.width, constrainedBounds.height - margin));\n            });\n          };\n          InlineView.showWithinBounds(inlineDialogComp, premade(dialogUi.dialog), { anchor }, getInlineDialogBounds);\n          Docking.refresh(inlineDialogComp);\n          editor.on('ResizeEditor ScrollWindow ElementScroll ResizeWindow', refreshDocking);\n          dialogUi.instanceApi.setData(initialData);\n          Keying.focusIn(dialogUi.dialog);\n          return dialogUi.instanceApi;\n        };\n        return DialogManager.open(factory, config$1);\n      };\n      const confirm = (message, callback) => {\n        confirmDialog.open(message, callback);\n      };\n      const alert = (message, callback) => {\n        alertDialog.open(message, callback);\n      };\n      const close = instanceApi => {\n        instanceApi.close();\n      };\n      return {\n        open,\n        openUrl,\n        alert,\n        close,\n        confirm\n      };\n    };\n\n    const registerOptions = editor => {\n      register$e(editor);\n      register$d(editor);\n      register(editor);\n    };\n    var Theme = () => {\n      global$a.add('silver', editor => {\n        registerOptions(editor);\n        let popupSinkBounds = () => win();\n        const {\n          dialogs,\n          popups,\n          renderUI: renderModeUI\n        } = setup$3(editor, { getPopupSinkBounds: () => popupSinkBounds() });\n        const renderUI = () => {\n          const renderResult = renderModeUI();\n          const optScrollingContext = detectWhenSplitUiMode(editor, popups.getMothership().element);\n          optScrollingContext.each(sc => {\n            popupSinkBounds = () => {\n              return getBoundsFrom(sc);\n            };\n          });\n          return renderResult;\n        };\n        Autocompleter.register(editor, popups.backstage.shared);\n        const windowMgr = setup({\n          editor,\n          backstages: {\n            popup: popups.backstage,\n            dialog: dialogs.backstage\n          }\n        });\n        const getNotificationManagerImpl = () => NotificationManagerImpl(editor, { backstage: popups.backstage }, popups.getMothership());\n        return {\n          renderUI,\n          getWindowManagerImpl: constant$1(windowMgr),\n          getNotificationManagerImpl\n        };\n      });\n    };\n\n    Theme();\n\n})();\n","// Exports the \"dom\" model for usage with module loaders\n// Usage:\n//   CommonJS:\n//     require('hugerte/models/dom')\n//   ES2015:\n//     import 'hugerte/models/dom'\nrequire('./model.js');","/**\n * HugeRTE version 1.0.8 (2025-03-11)\n * Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc.\n * Copyright (c) 2024 HugeRTE contributors\n * Licensed under the MIT license (https://github.com/hugerte/hugerte/blob/main/LICENSE.TXT)\n */\n\n(function () {\n    'use strict';\n\n    var global$5 = hugerte.util.Tools.resolve('hugerte.PluginManager');\n\n    const hasProto = (v, constructor, predicate) => {\n      var _a;\n      if (predicate(v, constructor.prototype)) {\n        return true;\n      } else {\n        return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;\n      }\n    };\n    const typeOf = x => {\n      const t = typeof x;\n      if (x === null) {\n        return 'null';\n      } else if (t === 'object' && Array.isArray(x)) {\n        return 'array';\n      } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {\n        return 'string';\n      } else {\n        return t;\n      }\n    };\n    const isType = type => value => typeOf(value) === type;\n    const isSimpleType = type => value => typeof value === type;\n    const eq = t => a => t === a;\n    const isString = isType('string');\n    const isObject = isType('object');\n    const isArray = isType('array');\n    const isNull = eq(null);\n    const isBoolean = isSimpleType('boolean');\n    const isNullable = a => a === null || a === undefined;\n    const isNonNullable = a => !isNullable(a);\n    const isFunction = isSimpleType('function');\n    const isArrayOf = (value, pred) => {\n      if (isArray(value)) {\n        for (let i = 0, len = value.length; i < len; ++i) {\n          if (!pred(value[i])) {\n            return false;\n          }\n        }\n        return true;\n      }\n      return false;\n    };\n\n    const noop = () => {\n    };\n    const constant = value => {\n      return () => {\n        return value;\n      };\n    };\n    const tripleEquals = (a, b) => {\n      return a === b;\n    };\n\n    class Optional {\n      constructor(tag, value) {\n        this.tag = tag;\n        this.value = value;\n      }\n      static some(value) {\n        return new Optional(true, value);\n      }\n      static none() {\n        return Optional.singletonNone;\n      }\n      fold(onNone, onSome) {\n        if (this.tag) {\n          return onSome(this.value);\n        } else {\n          return onNone();\n        }\n      }\n      isSome() {\n        return this.tag;\n      }\n      isNone() {\n        return !this.tag;\n      }\n      map(mapper) {\n        if (this.tag) {\n          return Optional.some(mapper(this.value));\n        } else {\n          return Optional.none();\n        }\n      }\n      bind(binder) {\n        if (this.tag) {\n          return binder(this.value);\n        } else {\n          return Optional.none();\n        }\n      }\n      exists(predicate) {\n        return this.tag && predicate(this.value);\n      }\n      forall(predicate) {\n        return !this.tag || predicate(this.value);\n      }\n      filter(predicate) {\n        if (!this.tag || predicate(this.value)) {\n          return this;\n        } else {\n          return Optional.none();\n        }\n      }\n      getOr(replacement) {\n        return this.tag ? this.value : replacement;\n      }\n      or(replacement) {\n        return this.tag ? this : replacement;\n      }\n      getOrThunk(thunk) {\n        return this.tag ? this.value : thunk();\n      }\n      orThunk(thunk) {\n        return this.tag ? this : thunk();\n      }\n      getOrDie(message) {\n        if (!this.tag) {\n          throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');\n        } else {\n          return this.value;\n        }\n      }\n      static from(value) {\n        return isNonNullable(value) ? Optional.some(value) : Optional.none();\n      }\n      getOrNull() {\n        return this.tag ? this.value : null;\n      }\n      getOrUndefined() {\n        return this.value;\n      }\n      each(worker) {\n        if (this.tag) {\n          worker(this.value);\n        }\n      }\n      toArray() {\n        return this.tag ? [this.value] : [];\n      }\n      toString() {\n        return this.tag ? `some(${ this.value })` : 'none()';\n      }\n    }\n    Optional.singletonNone = new Optional(false);\n\n    const nativeIndexOf = Array.prototype.indexOf;\n    const nativePush = Array.prototype.push;\n    const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t);\n    const contains = (xs, x) => rawIndexOf(xs, x) > -1;\n    const map = (xs, f) => {\n      const len = xs.length;\n      const r = new Array(len);\n      for (let i = 0; i < len; i++) {\n        const x = xs[i];\n        r[i] = f(x, i);\n      }\n      return r;\n    };\n    const each$1 = (xs, f) => {\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        f(x, i);\n      }\n    };\n    const foldl = (xs, f, acc) => {\n      each$1(xs, (x, i) => {\n        acc = f(acc, x, i);\n      });\n      return acc;\n    };\n    const flatten = xs => {\n      const r = [];\n      for (let i = 0, len = xs.length; i < len; ++i) {\n        if (!isArray(xs[i])) {\n          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);\n        }\n        nativePush.apply(r, xs[i]);\n      }\n      return r;\n    };\n    const bind = (xs, f) => flatten(map(xs, f));\n    const findMap = (arr, f) => {\n      for (let i = 0; i < arr.length; i++) {\n        const r = f(arr[i], i);\n        if (r.isSome()) {\n          return r;\n        }\n      }\n      return Optional.none();\n    };\n\n    const is = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs));\n    const cat = arr => {\n      const r = [];\n      const push = x => {\n        r.push(x);\n      };\n      for (let i = 0; i < arr.length; i++) {\n        arr[i].each(push);\n      }\n      return r;\n    };\n    const someIf = (b, a) => b ? Optional.some(a) : Optional.none();\n\n    const option = name => editor => editor.options.get(name);\n    const register$1 = editor => {\n      const registerOption = editor.options.register;\n      registerOption('link_assume_external_targets', {\n        processor: value => {\n          const valid = isString(value) || isBoolean(value);\n          if (valid) {\n            if (value === true) {\n              return {\n                value: 1,\n                valid\n              };\n            } else if (value === 'http' || value === 'https') {\n              return {\n                value,\n                valid\n              };\n            } else {\n              return {\n                value: 0,\n                valid\n              };\n            }\n          } else {\n            return {\n              valid: false,\n              message: 'Must be a string or a boolean.'\n            };\n          }\n        },\n        default: false\n      });\n      registerOption('link_context_toolbar', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('link_list', { processor: value => isString(value) || isFunction(value) || isArrayOf(value, isObject) });\n      registerOption('link_default_target', { processor: 'string' });\n      registerOption('link_default_protocol', {\n        processor: 'string',\n        default: 'https'\n      });\n      registerOption('link_target_list', {\n        processor: value => isBoolean(value) || isArrayOf(value, isObject),\n        default: true\n      });\n      registerOption('link_rel_list', {\n        processor: 'object[]',\n        default: []\n      });\n      registerOption('link_class_list', {\n        processor: 'object[]',\n        default: []\n      });\n      registerOption('link_title', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('allow_unsafe_link_target', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('link_quicklink', {\n        processor: 'boolean',\n        default: false\n      });\n    };\n    const assumeExternalTargets = option('link_assume_external_targets');\n    const hasContextToolbar = option('link_context_toolbar');\n    const getLinkList = option('link_list');\n    const getDefaultLinkTarget = option('link_default_target');\n    const getDefaultLinkProtocol = option('link_default_protocol');\n    const getTargetList = option('link_target_list');\n    const getRelList = option('link_rel_list');\n    const getLinkClassList = option('link_class_list');\n    const shouldShowLinkTitle = option('link_title');\n    const allowUnsafeLinkTarget = option('allow_unsafe_link_target');\n    const useQuickLink = option('link_quicklink');\n\n    var global$4 = hugerte.util.Tools.resolve('hugerte.util.Tools');\n\n    const getValue = item => isString(item.value) ? item.value : '';\n    const getText = item => {\n      if (isString(item.text)) {\n        return item.text;\n      } else if (isString(item.title)) {\n        return item.title;\n      } else {\n        return '';\n      }\n    };\n    const sanitizeList = (list, extractValue) => {\n      const out = [];\n      global$4.each(list, item => {\n        const text = getText(item);\n        if (item.menu !== undefined) {\n          const items = sanitizeList(item.menu, extractValue);\n          out.push({\n            text,\n            items\n          });\n        } else {\n          const value = extractValue(item);\n          out.push({\n            text,\n            value\n          });\n        }\n      });\n      return out;\n    };\n    const sanitizeWith = (extracter = getValue) => list => Optional.from(list).map(list => sanitizeList(list, extracter));\n    const sanitize = list => sanitizeWith(getValue)(list);\n    const createUi = (name, label) => items => ({\n      name,\n      type: 'listbox',\n      label,\n      items\n    });\n    const ListOptions = {\n      sanitize,\n      sanitizeWith,\n      createUi,\n      getValue\n    };\n\n    const keys = Object.keys;\n    const hasOwnProperty = Object.hasOwnProperty;\n    const each = (obj, f) => {\n      const props = keys(obj);\n      for (let k = 0, len = props.length; k < len; k++) {\n        const i = props[k];\n        const x = obj[i];\n        f(x, i);\n      }\n    };\n    const objAcc = r => (x, i) => {\n      r[i] = x;\n    };\n    const internalFilter = (obj, pred, onTrue, onFalse) => {\n      each(obj, (x, i) => {\n        (pred(x, i) ? onTrue : onFalse)(x, i);\n      });\n    };\n    const filter = (obj, pred) => {\n      const t = {};\n      internalFilter(obj, pred, objAcc(t), noop);\n      return t;\n    };\n    const has = (obj, key) => hasOwnProperty.call(obj, key);\n    const hasNonNullableKey = (obj, key) => has(obj, key) && obj[key] !== undefined && obj[key] !== null;\n\n    var global$3 = hugerte.util.Tools.resolve('hugerte.dom.TreeWalker');\n\n    var global$2 = hugerte.util.Tools.resolve('hugerte.util.URI');\n\n    const isAnchor = elm => isNonNullable(elm) && elm.nodeName.toLowerCase() === 'a';\n    const isLink = elm => isAnchor(elm) && !!getHref(elm);\n    const collectNodesInRange = (rng, predicate) => {\n      if (rng.collapsed) {\n        return [];\n      } else {\n        const contents = rng.cloneContents();\n        const firstChild = contents.firstChild;\n        const walker = new global$3(firstChild, contents);\n        const elements = [];\n        let current = firstChild;\n        do {\n          if (predicate(current)) {\n            elements.push(current);\n          }\n        } while (current = walker.next());\n        return elements;\n      }\n    };\n    const hasProtocol = url => /^\\w+:/i.test(url);\n    const getHref = elm => {\n      var _a, _b;\n      return (_b = (_a = elm.getAttribute('data-mce-href')) !== null && _a !== void 0 ? _a : elm.getAttribute('href')) !== null && _b !== void 0 ? _b : '';\n    };\n    const applyRelTargetRules = (rel, isUnsafe) => {\n      const rules = ['noopener'];\n      const rels = rel ? rel.split(/\\s+/) : [];\n      const toString = rels => global$4.trim(rels.sort().join(' '));\n      const addTargetRules = rels => {\n        rels = removeTargetRules(rels);\n        return rels.length > 0 ? rels.concat(rules) : rules;\n      };\n      const removeTargetRules = rels => rels.filter(val => global$4.inArray(rules, val) === -1);\n      const newRels = isUnsafe ? addTargetRules(rels) : removeTargetRules(rels);\n      return newRels.length > 0 ? toString(newRels) : '';\n    };\n    const trimCaretContainers = text => text.replace(/\\uFEFF/g, '');\n    const getAnchorElement = (editor, selectedElm) => {\n      selectedElm = selectedElm || getLinksInSelection(editor.selection.getRng())[0] || editor.selection.getNode();\n      if (isImageFigure(selectedElm)) {\n        return Optional.from(editor.dom.select('a[href]', selectedElm)[0]);\n      } else {\n        return Optional.from(editor.dom.getParent(selectedElm, 'a[href]'));\n      }\n    };\n    const isInAnchor = (editor, selectedElm) => getAnchorElement(editor, selectedElm).isSome();\n    const getAnchorText = (selection, anchorElm) => {\n      const text = anchorElm.fold(() => selection.getContent({ format: 'text' }), anchorElm => anchorElm.innerText || anchorElm.textContent || '');\n      return trimCaretContainers(text);\n    };\n    const getLinksInSelection = rng => collectNodesInRange(rng, isLink);\n    const getLinks$1 = elements => global$4.grep(elements, isLink);\n    const hasLinks = elements => getLinks$1(elements).length > 0;\n    const hasLinksInSelection = rng => getLinksInSelection(rng).length > 0;\n    const isOnlyTextSelected = editor => {\n      const inlineTextElements = editor.schema.getTextInlineElements();\n      const isElement = elm => elm.nodeType === 1 && !isAnchor(elm) && !has(inlineTextElements, elm.nodeName.toLowerCase());\n      const isInBlockAnchor = getAnchorElement(editor).exists(anchor => anchor.hasAttribute('data-mce-block'));\n      if (isInBlockAnchor) {\n        return false;\n      }\n      const rng = editor.selection.getRng();\n      if (!rng.collapsed) {\n        const elements = collectNodesInRange(rng, isElement);\n        return elements.length === 0;\n      } else {\n        return true;\n      }\n    };\n    const isImageFigure = elm => isNonNullable(elm) && elm.nodeName === 'FIGURE' && /\\bimage\\b/i.test(elm.className);\n    const getLinkAttrs = data => {\n      const attrs = [\n        'title',\n        'rel',\n        'class',\n        'target'\n      ];\n      return foldl(attrs, (acc, key) => {\n        data[key].each(value => {\n          acc[key] = value.length > 0 ? value : null;\n        });\n        return acc;\n      }, { href: data.href });\n    };\n    const handleExternalTargets = (href, assumeExternalTargets) => {\n      if ((assumeExternalTargets === 'http' || assumeExternalTargets === 'https') && !hasProtocol(href)) {\n        return assumeExternalTargets + '://' + href;\n      }\n      return href;\n    };\n    const applyLinkOverrides = (editor, linkAttrs) => {\n      const newLinkAttrs = { ...linkAttrs };\n      if (getRelList(editor).length === 0 && !allowUnsafeLinkTarget(editor)) {\n        const newRel = applyRelTargetRules(newLinkAttrs.rel, newLinkAttrs.target === '_blank');\n        newLinkAttrs.rel = newRel ? newRel : null;\n      }\n      if (Optional.from(newLinkAttrs.target).isNone() && getTargetList(editor) === false) {\n        newLinkAttrs.target = getDefaultLinkTarget(editor);\n      }\n      newLinkAttrs.href = handleExternalTargets(newLinkAttrs.href, assumeExternalTargets(editor));\n      return newLinkAttrs;\n    };\n    const updateLink = (editor, anchorElm, text, linkAttrs) => {\n      text.each(text => {\n        if (has(anchorElm, 'innerText')) {\n          anchorElm.innerText = text;\n        } else {\n          anchorElm.textContent = text;\n        }\n      });\n      editor.dom.setAttribs(anchorElm, linkAttrs);\n      editor.selection.select(anchorElm);\n    };\n    const createLink = (editor, selectedElm, text, linkAttrs) => {\n      const dom = editor.dom;\n      if (isImageFigure(selectedElm)) {\n        linkImageFigure(dom, selectedElm, linkAttrs);\n      } else {\n        text.fold(() => {\n          editor.execCommand('mceInsertLink', false, linkAttrs);\n        }, text => {\n          editor.insertContent(dom.createHTML('a', linkAttrs, dom.encode(text)));\n        });\n      }\n    };\n    const linkDomMutation = (editor, attachState, data) => {\n      const selectedElm = editor.selection.getNode();\n      const anchorElm = getAnchorElement(editor, selectedElm);\n      const linkAttrs = applyLinkOverrides(editor, getLinkAttrs(data));\n      editor.undoManager.transact(() => {\n        if (data.href === attachState.href) {\n          attachState.attach();\n        }\n        anchorElm.fold(() => {\n          createLink(editor, selectedElm, data.text, linkAttrs);\n        }, elm => {\n          editor.focus();\n          updateLink(editor, elm, data.text, linkAttrs);\n        });\n      });\n    };\n    const unlinkSelection = editor => {\n      const dom = editor.dom, selection = editor.selection;\n      const bookmark = selection.getBookmark();\n      const rng = selection.getRng().cloneRange();\n      const startAnchorElm = dom.getParent(rng.startContainer, 'a[href]', editor.getBody());\n      const endAnchorElm = dom.getParent(rng.endContainer, 'a[href]', editor.getBody());\n      if (startAnchorElm) {\n        rng.setStartBefore(startAnchorElm);\n      }\n      if (endAnchorElm) {\n        rng.setEndAfter(endAnchorElm);\n      }\n      selection.setRng(rng);\n      editor.execCommand('unlink');\n      selection.moveToBookmark(bookmark);\n    };\n    const unlinkDomMutation = editor => {\n      editor.undoManager.transact(() => {\n        const node = editor.selection.getNode();\n        if (isImageFigure(node)) {\n          unlinkImageFigure(editor, node);\n        } else {\n          unlinkSelection(editor);\n        }\n        editor.focus();\n      });\n    };\n    const unwrapOptions = data => {\n      const {\n        class: cls,\n        href,\n        rel,\n        target,\n        text,\n        title\n      } = data;\n      return filter({\n        class: cls.getOrNull(),\n        href,\n        rel: rel.getOrNull(),\n        target: target.getOrNull(),\n        text: text.getOrNull(),\n        title: title.getOrNull()\n      }, (v, _k) => isNull(v) === false);\n    };\n    const sanitizeData = (editor, data) => {\n      const getOption = editor.options.get;\n      const uriOptions = {\n        allow_html_data_urls: getOption('allow_html_data_urls'),\n        allow_script_urls: getOption('allow_script_urls'),\n        allow_svg_data_urls: getOption('allow_svg_data_urls')\n      };\n      const href = data.href;\n      return {\n        ...data,\n        href: global$2.isDomSafe(href, 'a', uriOptions) ? href : ''\n      };\n    };\n    const link = (editor, attachState, data) => {\n      const sanitizedData = sanitizeData(editor, data);\n      editor.hasPlugin('rtc', true) ? editor.execCommand('createlink', false, unwrapOptions(sanitizedData)) : linkDomMutation(editor, attachState, sanitizedData);\n    };\n    const unlink = editor => {\n      editor.hasPlugin('rtc', true) ? editor.execCommand('unlink') : unlinkDomMutation(editor);\n    };\n    const unlinkImageFigure = (editor, fig) => {\n      var _a;\n      const img = editor.dom.select('img', fig)[0];\n      if (img) {\n        const a = editor.dom.getParents(img, 'a[href]', fig)[0];\n        if (a) {\n          (_a = a.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(img, a);\n          editor.dom.remove(a);\n        }\n      }\n    };\n    const linkImageFigure = (dom, fig, attrs) => {\n      var _a;\n      const img = dom.select('img', fig)[0];\n      if (img) {\n        const a = dom.create('a', attrs);\n        (_a = img.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(a, img);\n        a.appendChild(img);\n      }\n    };\n\n    const isListGroup = item => hasNonNullableKey(item, 'items');\n    const findTextByValue = (value, catalog) => findMap(catalog, item => {\n      if (isListGroup(item)) {\n        return findTextByValue(value, item.items);\n      } else {\n        return someIf(item.value === value, item);\n      }\n    });\n    const getDelta = (persistentText, fieldName, catalog, data) => {\n      const value = data[fieldName];\n      const hasPersistentText = persistentText.length > 0;\n      return value !== undefined ? findTextByValue(value, catalog).map(i => ({\n        url: {\n          value: i.value,\n          meta: {\n            text: hasPersistentText ? persistentText : i.text,\n            attach: noop\n          }\n        },\n        text: hasPersistentText ? persistentText : i.text\n      })) : Optional.none();\n    };\n    const findCatalog = (catalogs, fieldName) => {\n      if (fieldName === 'link') {\n        return catalogs.link;\n      } else if (fieldName === 'anchor') {\n        return catalogs.anchor;\n      } else {\n        return Optional.none();\n      }\n    };\n    const init = (initialData, linkCatalog) => {\n      const persistentData = {\n        text: initialData.text,\n        title: initialData.title\n      };\n      const getTitleFromUrlChange = url => {\n        var _a;\n        return someIf(persistentData.title.length <= 0, Optional.from((_a = url.meta) === null || _a === void 0 ? void 0 : _a.title).getOr(''));\n      };\n      const getTextFromUrlChange = url => {\n        var _a;\n        return someIf(persistentData.text.length <= 0, Optional.from((_a = url.meta) === null || _a === void 0 ? void 0 : _a.text).getOr(url.value));\n      };\n      const onUrlChange = data => {\n        const text = getTextFromUrlChange(data.url);\n        const title = getTitleFromUrlChange(data.url);\n        if (text.isSome() || title.isSome()) {\n          return Optional.some({\n            ...text.map(text => ({ text })).getOr({}),\n            ...title.map(title => ({ title })).getOr({})\n          });\n        } else {\n          return Optional.none();\n        }\n      };\n      const onCatalogChange = (data, change) => {\n        const catalog = findCatalog(linkCatalog, change).getOr([]);\n        return getDelta(persistentData.text, change, catalog, data);\n      };\n      const onChange = (getData, change) => {\n        const name = change.name;\n        if (name === 'url') {\n          return onUrlChange(getData());\n        } else if (contains([\n            'anchor',\n            'link'\n          ], name)) {\n          return onCatalogChange(getData(), name);\n        } else if (name === 'text' || name === 'title') {\n          persistentData[name] = getData()[name];\n          return Optional.none();\n        } else {\n          return Optional.none();\n        }\n      };\n      return { onChange };\n    };\n    const DialogChanges = {\n      init,\n      getDelta\n    };\n\n    var global$1 = hugerte.util.Tools.resolve('hugerte.util.Delay');\n\n    const delayedConfirm = (editor, message, callback) => {\n      const rng = editor.selection.getRng();\n      global$1.setEditorTimeout(editor, () => {\n        editor.windowManager.confirm(message, state => {\n          editor.selection.setRng(rng);\n          callback(state);\n        });\n      });\n    };\n    const tryEmailTransform = data => {\n      const url = data.href;\n      const suggestMailTo = url.indexOf('@') > 0 && url.indexOf('/') === -1 && url.indexOf('mailto:') === -1;\n      return suggestMailTo ? Optional.some({\n        message: 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?',\n        preprocess: oldData => ({\n          ...oldData,\n          href: 'mailto:' + url\n        })\n      }) : Optional.none();\n    };\n    const tryProtocolTransform = (assumeExternalTargets, defaultLinkProtocol) => data => {\n      const url = data.href;\n      const suggestProtocol = assumeExternalTargets === 1 && !hasProtocol(url) || assumeExternalTargets === 0 && /^\\s*www(\\.|\\d\\.)/i.test(url);\n      return suggestProtocol ? Optional.some({\n        message: `The URL you entered seems to be an external link. Do you want to add the required ${ defaultLinkProtocol }:// prefix?`,\n        preprocess: oldData => ({\n          ...oldData,\n          href: defaultLinkProtocol + '://' + url\n        })\n      }) : Optional.none();\n    };\n    const preprocess = (editor, data) => findMap([\n      tryEmailTransform,\n      tryProtocolTransform(assumeExternalTargets(editor), getDefaultLinkProtocol(editor))\n    ], f => f(data)).fold(() => Promise.resolve(data), transform => new Promise(callback => {\n      delayedConfirm(editor, transform.message, state => {\n        callback(state ? transform.preprocess(data) : data);\n      });\n    }));\n    const DialogConfirms = { preprocess };\n\n    const getAnchors = editor => {\n      const anchorNodes = editor.dom.select('a:not([href])');\n      const anchors = bind(anchorNodes, anchor => {\n        const id = anchor.name || anchor.id;\n        return id ? [{\n            text: id,\n            value: '#' + id\n          }] : [];\n      });\n      return anchors.length > 0 ? Optional.some([{\n          text: 'None',\n          value: ''\n        }].concat(anchors)) : Optional.none();\n    };\n    const AnchorListOptions = { getAnchors };\n\n    const getClasses = editor => {\n      const list = getLinkClassList(editor);\n      if (list.length > 0) {\n        return ListOptions.sanitize(list);\n      }\n      return Optional.none();\n    };\n    const ClassListOptions = { getClasses };\n\n    const parseJson = text => {\n      try {\n        return Optional.some(JSON.parse(text));\n      } catch (err) {\n        return Optional.none();\n      }\n    };\n    const getLinks = editor => {\n      const extractor = item => editor.convertURL(item.value || item.url || '', 'href');\n      const linkList = getLinkList(editor);\n      return new Promise(resolve => {\n        if (isString(linkList)) {\n          fetch(linkList).then(res => res.ok ? res.text().then(parseJson) : Promise.reject()).then(resolve, () => resolve(Optional.none()));\n        } else if (isFunction(linkList)) {\n          linkList(output => resolve(Optional.some(output)));\n        } else {\n          resolve(Optional.from(linkList));\n        }\n      }).then(optItems => optItems.bind(ListOptions.sanitizeWith(extractor)).map(items => {\n        if (items.length > 0) {\n          const noneItem = [{\n              text: 'None',\n              value: ''\n            }];\n          return noneItem.concat(items);\n        } else {\n          return items;\n        }\n      }));\n    };\n    const LinkListOptions = { getLinks };\n\n    const getRels = (editor, initialTarget) => {\n      const list = getRelList(editor);\n      if (list.length > 0) {\n        const isTargetBlank = is(initialTarget, '_blank');\n        const enforceSafe = allowUnsafeLinkTarget(editor) === false;\n        const safeRelExtractor = item => applyRelTargetRules(ListOptions.getValue(item), isTargetBlank);\n        const sanitizer = enforceSafe ? ListOptions.sanitizeWith(safeRelExtractor) : ListOptions.sanitize;\n        return sanitizer(list);\n      }\n      return Optional.none();\n    };\n    const RelOptions = { getRels };\n\n    const fallbacks = [\n      {\n        text: 'Current window',\n        value: ''\n      },\n      {\n        text: 'New window',\n        value: '_blank'\n      }\n    ];\n    const getTargets = editor => {\n      const list = getTargetList(editor);\n      if (isArray(list)) {\n        return ListOptions.sanitize(list).orThunk(() => Optional.some(fallbacks));\n      } else if (list === false) {\n        return Optional.none();\n      }\n      return Optional.some(fallbacks);\n    };\n    const TargetOptions = { getTargets };\n\n    const nonEmptyAttr = (dom, elem, name) => {\n      const val = dom.getAttrib(elem, name);\n      return val !== null && val.length > 0 ? Optional.some(val) : Optional.none();\n    };\n    const extractFromAnchor = (editor, anchor) => {\n      const dom = editor.dom;\n      const onlyText = isOnlyTextSelected(editor);\n      const text = onlyText ? Optional.some(getAnchorText(editor.selection, anchor)) : Optional.none();\n      const url = anchor.bind(anchorElm => Optional.from(dom.getAttrib(anchorElm, 'href')));\n      const target = anchor.bind(anchorElm => Optional.from(dom.getAttrib(anchorElm, 'target')));\n      const rel = anchor.bind(anchorElm => nonEmptyAttr(dom, anchorElm, 'rel'));\n      const linkClass = anchor.bind(anchorElm => nonEmptyAttr(dom, anchorElm, 'class'));\n      const title = anchor.bind(anchorElm => nonEmptyAttr(dom, anchorElm, 'title'));\n      return {\n        url,\n        text,\n        title,\n        target,\n        rel,\n        linkClass\n      };\n    };\n    const collect = (editor, linkNode) => LinkListOptions.getLinks(editor).then(links => {\n      const anchor = extractFromAnchor(editor, linkNode);\n      return {\n        anchor,\n        catalogs: {\n          targets: TargetOptions.getTargets(editor),\n          rels: RelOptions.getRels(editor, anchor.target),\n          classes: ClassListOptions.getClasses(editor),\n          anchor: AnchorListOptions.getAnchors(editor),\n          link: links\n        },\n        optNode: linkNode,\n        flags: { titleEnabled: shouldShowLinkTitle(editor) }\n      };\n    });\n    const DialogInfo = { collect };\n\n    const handleSubmit = (editor, info) => api => {\n      const data = api.getData();\n      if (!data.url.value) {\n        unlink(editor);\n        api.close();\n        return;\n      }\n      const getChangedValue = key => Optional.from(data[key]).filter(value => !is(info.anchor[key], value));\n      const changedData = {\n        href: data.url.value,\n        text: getChangedValue('text'),\n        target: getChangedValue('target'),\n        rel: getChangedValue('rel'),\n        class: getChangedValue('linkClass'),\n        title: getChangedValue('title')\n      };\n      const attachState = {\n        href: data.url.value,\n        attach: data.url.meta !== undefined && data.url.meta.attach ? data.url.meta.attach : noop\n      };\n      DialogConfirms.preprocess(editor, changedData).then(pData => {\n        link(editor, attachState, pData);\n      });\n      api.close();\n    };\n    const collectData = editor => {\n      const anchorNode = getAnchorElement(editor);\n      return DialogInfo.collect(editor, anchorNode);\n    };\n    const getInitialData = (info, defaultTarget) => {\n      const anchor = info.anchor;\n      const url = anchor.url.getOr('');\n      return {\n        url: {\n          value: url,\n          meta: { original: { value: url } }\n        },\n        text: anchor.text.getOr(''),\n        title: anchor.title.getOr(''),\n        anchor: url,\n        link: url,\n        rel: anchor.rel.getOr(''),\n        target: anchor.target.or(defaultTarget).getOr(''),\n        linkClass: anchor.linkClass.getOr('')\n      };\n    };\n    const makeDialog = (settings, onSubmit, editor) => {\n      const urlInput = [{\n          name: 'url',\n          type: 'urlinput',\n          filetype: 'file',\n          label: 'URL',\n          picker_text: 'Browse links'\n        }];\n      const displayText = settings.anchor.text.map(() => ({\n        name: 'text',\n        type: 'input',\n        label: 'Text to display'\n      })).toArray();\n      const titleText = settings.flags.titleEnabled ? [{\n          name: 'title',\n          type: 'input',\n          label: 'Title'\n        }] : [];\n      const defaultTarget = Optional.from(getDefaultLinkTarget(editor));\n      const initialData = getInitialData(settings, defaultTarget);\n      const catalogs = settings.catalogs;\n      const dialogDelta = DialogChanges.init(initialData, catalogs);\n      const body = {\n        type: 'panel',\n        items: flatten([\n          urlInput,\n          displayText,\n          titleText,\n          cat([\n            catalogs.anchor.map(ListOptions.createUi('anchor', 'Anchors')),\n            catalogs.rels.map(ListOptions.createUi('rel', 'Rel')),\n            catalogs.targets.map(ListOptions.createUi('target', 'Open link in...')),\n            catalogs.link.map(ListOptions.createUi('link', 'Link list')),\n            catalogs.classes.map(ListOptions.createUi('linkClass', 'Class'))\n          ])\n        ])\n      };\n      return {\n        title: 'Insert/Edit Link',\n        size: 'normal',\n        body,\n        buttons: [\n          {\n            type: 'cancel',\n            name: 'cancel',\n            text: 'Cancel'\n          },\n          {\n            type: 'submit',\n            name: 'save',\n            text: 'Save',\n            primary: true\n          }\n        ],\n        initialData,\n        onChange: (api, {name}) => {\n          dialogDelta.onChange(api.getData, { name }).each(newData => {\n            api.setData(newData);\n          });\n        },\n        onSubmit\n      };\n    };\n    const open$1 = editor => {\n      const data = collectData(editor);\n      data.then(info => {\n        const onSubmit = handleSubmit(editor, info);\n        return makeDialog(info, onSubmit, editor);\n      }).then(spec => {\n        editor.windowManager.open(spec);\n      });\n    };\n\n    const register = editor => {\n      editor.addCommand('mceLink', (_ui, value) => {\n        if ((value === null || value === void 0 ? void 0 : value.dialog) === true || !useQuickLink(editor)) {\n          open$1(editor);\n        } else {\n          editor.dispatch('contexttoolbar-show', { toolbarKey: 'quicklink' });\n        }\n      });\n    };\n\n    var global = hugerte.util.Tools.resolve('hugerte.util.VK');\n\n    const appendClickRemove = (link, evt) => {\n      document.body.appendChild(link);\n      link.dispatchEvent(evt);\n      document.body.removeChild(link);\n    };\n    const open = url => {\n      const link = document.createElement('a');\n      link.target = '_blank';\n      link.href = url;\n      link.rel = 'noreferrer noopener';\n      const evt = document.createEvent('MouseEvents');\n      evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n      appendClickRemove(link, evt);\n    };\n\n    const getLink = (editor, elm) => editor.dom.getParent(elm, 'a[href]');\n    const getSelectedLink = editor => getLink(editor, editor.selection.getStart());\n    const hasOnlyAltModifier = e => {\n      return e.altKey === true && e.shiftKey === false && e.ctrlKey === false && e.metaKey === false;\n    };\n    const gotoLink = (editor, a) => {\n      if (a) {\n        const href = getHref(a);\n        if (/^#/.test(href)) {\n          const targetEl = editor.dom.select(href);\n          if (targetEl.length) {\n            editor.selection.scrollIntoView(targetEl[0], true);\n          }\n        } else {\n          open(a.href);\n        }\n      }\n    };\n    const openDialog = editor => () => {\n      editor.execCommand('mceLink', false, { dialog: true });\n    };\n    const gotoSelectedLink = editor => () => {\n      gotoLink(editor, getSelectedLink(editor));\n    };\n    const setupGotoLinks = editor => {\n      editor.on('click', e => {\n        const link = getLink(editor, e.target);\n        if (link && global.metaKeyPressed(e)) {\n          e.preventDefault();\n          gotoLink(editor, link);\n        }\n      });\n      editor.on('keydown', e => {\n        if (!e.isDefaultPrevented() && e.keyCode === 13 && hasOnlyAltModifier(e)) {\n          const link = getSelectedLink(editor);\n          if (link) {\n            e.preventDefault();\n            gotoLink(editor, link);\n          }\n        }\n      });\n    };\n    const toggleState = (editor, toggler) => {\n      editor.on('NodeChange', toggler);\n      return () => editor.off('NodeChange', toggler);\n    };\n    const toggleLinkState = editor => api => {\n      const updateState = () => {\n        api.setActive(!editor.mode.isReadOnly() && isInAnchor(editor, editor.selection.getNode()));\n        api.setEnabled(editor.selection.isEditable());\n      };\n      updateState();\n      return toggleState(editor, updateState);\n    };\n    const toggleLinkMenuState = editor => api => {\n      const updateState = () => {\n        api.setEnabled(editor.selection.isEditable());\n      };\n      updateState();\n      return toggleState(editor, updateState);\n    };\n    const hasExactlyOneLinkInSelection = editor => {\n      const links = editor.selection.isCollapsed() ? getLinks$1(editor.dom.getParents(editor.selection.getStart())) : getLinksInSelection(editor.selection.getRng());\n      return links.length === 1;\n    };\n    const toggleGotoLinkState = editor => api => {\n      const updateState = () => api.setEnabled(hasExactlyOneLinkInSelection(editor));\n      updateState();\n      return toggleState(editor, updateState);\n    };\n    const toggleUnlinkState = editor => api => {\n      const hasLinks$1 = parents => hasLinks(parents) || hasLinksInSelection(editor.selection.getRng());\n      const parents = editor.dom.getParents(editor.selection.getStart());\n      const updateEnabled = parents => {\n        api.setEnabled(hasLinks$1(parents) && editor.selection.isEditable());\n      };\n      updateEnabled(parents);\n      return toggleState(editor, e => updateEnabled(e.parents));\n    };\n\n    const setup = editor => {\n      editor.addShortcut('Meta+K', '', () => {\n        editor.execCommand('mceLink');\n      });\n    };\n\n    const setupButtons = editor => {\n      editor.ui.registry.addToggleButton('link', {\n        icon: 'link',\n        tooltip: 'Insert/edit link',\n        onAction: openDialog(editor),\n        onSetup: toggleLinkState(editor),\n        shortcut: 'Meta+K'\n      });\n      editor.ui.registry.addButton('openlink', {\n        icon: 'new-tab',\n        tooltip: 'Open link',\n        onAction: gotoSelectedLink(editor),\n        onSetup: toggleGotoLinkState(editor)\n      });\n      editor.ui.registry.addButton('unlink', {\n        icon: 'unlink',\n        tooltip: 'Remove link',\n        onAction: () => unlink(editor),\n        onSetup: toggleUnlinkState(editor)\n      });\n    };\n    const setupMenuItems = editor => {\n      editor.ui.registry.addMenuItem('openlink', {\n        text: 'Open link',\n        icon: 'new-tab',\n        onAction: gotoSelectedLink(editor),\n        onSetup: toggleGotoLinkState(editor)\n      });\n      editor.ui.registry.addMenuItem('link', {\n        icon: 'link',\n        text: 'Link...',\n        shortcut: 'Meta+K',\n        onSetup: toggleLinkMenuState(editor),\n        onAction: openDialog(editor)\n      });\n      editor.ui.registry.addMenuItem('unlink', {\n        icon: 'unlink',\n        text: 'Remove link',\n        onAction: () => unlink(editor),\n        onSetup: toggleUnlinkState(editor)\n      });\n    };\n    const setupContextMenu = editor => {\n      const inLink = 'link unlink openlink';\n      const noLink = 'link';\n      editor.ui.registry.addContextMenu('link', {\n        update: element => {\n          const isEditable = editor.dom.isEditable(element);\n          if (!isEditable) {\n            return '';\n          }\n          return hasLinks(editor.dom.getParents(element, 'a')) ? inLink : noLink;\n        }\n      });\n    };\n    const setupContextToolbars = editor => {\n      const collapseSelectionToEnd = editor => {\n        editor.selection.collapse(false);\n      };\n      const onSetupLink = buttonApi => {\n        const node = editor.selection.getNode();\n        buttonApi.setEnabled(isInAnchor(editor, node));\n        return noop;\n      };\n      const getLinkText = value => {\n        const anchor = getAnchorElement(editor);\n        const onlyText = isOnlyTextSelected(editor);\n        if (anchor.isNone() && onlyText) {\n          const text = getAnchorText(editor.selection, anchor);\n          return someIf(text.length === 0, value);\n        } else {\n          return Optional.none();\n        }\n      };\n      editor.ui.registry.addContextForm('quicklink', {\n        launch: {\n          type: 'contextformtogglebutton',\n          icon: 'link',\n          tooltip: 'Link',\n          onSetup: toggleLinkState(editor)\n        },\n        label: 'Link',\n        predicate: node => hasContextToolbar(editor) && isInAnchor(editor, node),\n        initValue: () => {\n          const elm = getAnchorElement(editor);\n          return elm.fold(constant(''), getHref);\n        },\n        commands: [\n          {\n            type: 'contextformtogglebutton',\n            icon: 'link',\n            tooltip: 'Link',\n            primary: true,\n            onSetup: buttonApi => {\n              const node = editor.selection.getNode();\n              buttonApi.setActive(isInAnchor(editor, node));\n              return toggleLinkState(editor)(buttonApi);\n            },\n            onAction: formApi => {\n              const value = formApi.getValue();\n              const text = getLinkText(value);\n              const attachState = {\n                href: value,\n                attach: noop\n              };\n              link(editor, attachState, {\n                href: value,\n                text,\n                title: Optional.none(),\n                rel: Optional.none(),\n                target: Optional.from(getDefaultLinkTarget(editor)),\n                class: Optional.none()\n              });\n              collapseSelectionToEnd(editor);\n              formApi.hide();\n            }\n          },\n          {\n            type: 'contextformbutton',\n            icon: 'unlink',\n            tooltip: 'Remove link',\n            onSetup: onSetupLink,\n            onAction: formApi => {\n              unlink(editor);\n              formApi.hide();\n            }\n          },\n          {\n            type: 'contextformbutton',\n            icon: 'new-tab',\n            tooltip: 'Open link',\n            onSetup: onSetupLink,\n            onAction: formApi => {\n              gotoSelectedLink(editor)();\n              formApi.hide();\n            }\n          }\n        ]\n      });\n    };\n\n    var Plugin = () => {\n      global$5.add('link', editor => {\n        register$1(editor);\n        setupButtons(editor);\n        setupMenuItems(editor);\n        setupContextMenu(editor);\n        setupContextToolbars(editor);\n        setupGotoLinks(editor);\n        register(editor);\n        setup(editor);\n      });\n    };\n\n    Plugin();\n\n})();\n","// Exports the \"silver\" theme for usage with module loaders\n// Usage:\n//   CommonJS:\n//     require('hugerte/themes/silver')\n//   ES2015:\n//     import 'hugerte/themes/silver'\nrequire('./theme.js');","/**\n * HugeRTE version 1.0.8 (2025-03-11)\n * Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc.\n * Copyright (c) 2024 HugeRTE contributors\n * Licensed under the MIT license (https://github.com/hugerte/hugerte/blob/main/LICENSE.TXT)\n */\n\n(function () {\n    'use strict';\n\n    var global$1 = hugerte.util.Tools.resolve('hugerte.ModelManager');\n\n    const hasProto = (v, constructor, predicate) => {\n      var _a;\n      if (predicate(v, constructor.prototype)) {\n        return true;\n      } else {\n        return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;\n      }\n    };\n    const typeOf = x => {\n      const t = typeof x;\n      if (x === null) {\n        return 'null';\n      } else if (t === 'object' && Array.isArray(x)) {\n        return 'array';\n      } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {\n        return 'string';\n      } else {\n        return t;\n      }\n    };\n    const isType$1 = type => value => typeOf(value) === type;\n    const isSimpleType = type => value => typeof value === type;\n    const eq$2 = t => a => t === a;\n    const isString = isType$1('string');\n    const isObject = isType$1('object');\n    const isArray = isType$1('array');\n    const isNull = eq$2(null);\n    const isBoolean = isSimpleType('boolean');\n    const isUndefined = eq$2(undefined);\n    const isNullable = a => a === null || a === undefined;\n    const isNonNullable = a => !isNullable(a);\n    const isFunction = isSimpleType('function');\n    const isNumber = isSimpleType('number');\n\n    const noop = () => {\n    };\n    const compose = (fa, fb) => {\n      return (...args) => {\n        return fa(fb.apply(null, args));\n      };\n    };\n    const compose1 = (fbc, fab) => a => fbc(fab(a));\n    const constant = value => {\n      return () => {\n        return value;\n      };\n    };\n    const identity = x => {\n      return x;\n    };\n    const tripleEquals = (a, b) => {\n      return a === b;\n    };\n    function curry(fn, ...initialArgs) {\n      return (...restArgs) => {\n        const all = initialArgs.concat(restArgs);\n        return fn.apply(null, all);\n      };\n    }\n    const not = f => t => !f(t);\n    const die = msg => {\n      return () => {\n        throw new Error(msg);\n      };\n    };\n    const apply = f => {\n      return f();\n    };\n    const never = constant(false);\n    const always = constant(true);\n\n    class Optional {\n      constructor(tag, value) {\n        this.tag = tag;\n        this.value = value;\n      }\n      static some(value) {\n        return new Optional(true, value);\n      }\n      static none() {\n        return Optional.singletonNone;\n      }\n      fold(onNone, onSome) {\n        if (this.tag) {\n          return onSome(this.value);\n        } else {\n          return onNone();\n        }\n      }\n      isSome() {\n        return this.tag;\n      }\n      isNone() {\n        return !this.tag;\n      }\n      map(mapper) {\n        if (this.tag) {\n          return Optional.some(mapper(this.value));\n        } else {\n          return Optional.none();\n        }\n      }\n      bind(binder) {\n        if (this.tag) {\n          return binder(this.value);\n        } else {\n          return Optional.none();\n        }\n      }\n      exists(predicate) {\n        return this.tag && predicate(this.value);\n      }\n      forall(predicate) {\n        return !this.tag || predicate(this.value);\n      }\n      filter(predicate) {\n        if (!this.tag || predicate(this.value)) {\n          return this;\n        } else {\n          return Optional.none();\n        }\n      }\n      getOr(replacement) {\n        return this.tag ? this.value : replacement;\n      }\n      or(replacement) {\n        return this.tag ? this : replacement;\n      }\n      getOrThunk(thunk) {\n        return this.tag ? this.value : thunk();\n      }\n      orThunk(thunk) {\n        return this.tag ? this : thunk();\n      }\n      getOrDie(message) {\n        if (!this.tag) {\n          throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');\n        } else {\n          return this.value;\n        }\n      }\n      static from(value) {\n        return isNonNullable(value) ? Optional.some(value) : Optional.none();\n      }\n      getOrNull() {\n        return this.tag ? this.value : null;\n      }\n      getOrUndefined() {\n        return this.value;\n      }\n      each(worker) {\n        if (this.tag) {\n          worker(this.value);\n        }\n      }\n      toArray() {\n        return this.tag ? [this.value] : [];\n      }\n      toString() {\n        return this.tag ? `some(${ this.value })` : 'none()';\n      }\n    }\n    Optional.singletonNone = new Optional(false);\n\n    const nativeSlice = Array.prototype.slice;\n    const nativeIndexOf = Array.prototype.indexOf;\n    const nativePush = Array.prototype.push;\n    const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t);\n    const contains$2 = (xs, x) => rawIndexOf(xs, x) > -1;\n    const exists = (xs, pred) => {\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        if (pred(x, i)) {\n          return true;\n        }\n      }\n      return false;\n    };\n    const range$1 = (num, f) => {\n      const r = [];\n      for (let i = 0; i < num; i++) {\n        r.push(f(i));\n      }\n      return r;\n    };\n    const map$1 = (xs, f) => {\n      const len = xs.length;\n      const r = new Array(len);\n      for (let i = 0; i < len; i++) {\n        const x = xs[i];\n        r[i] = f(x, i);\n      }\n      return r;\n    };\n    const each$2 = (xs, f) => {\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        f(x, i);\n      }\n    };\n    const eachr = (xs, f) => {\n      for (let i = xs.length - 1; i >= 0; i--) {\n        const x = xs[i];\n        f(x, i);\n      }\n    };\n    const partition = (xs, pred) => {\n      const pass = [];\n      const fail = [];\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        const arr = pred(x, i) ? pass : fail;\n        arr.push(x);\n      }\n      return {\n        pass,\n        fail\n      };\n    };\n    const filter$2 = (xs, pred) => {\n      const r = [];\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        if (pred(x, i)) {\n          r.push(x);\n        }\n      }\n      return r;\n    };\n    const foldr = (xs, f, acc) => {\n      eachr(xs, (x, i) => {\n        acc = f(acc, x, i);\n      });\n      return acc;\n    };\n    const foldl = (xs, f, acc) => {\n      each$2(xs, (x, i) => {\n        acc = f(acc, x, i);\n      });\n      return acc;\n    };\n    const findUntil = (xs, pred, until) => {\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        if (pred(x, i)) {\n          return Optional.some(x);\n        } else if (until(x, i)) {\n          break;\n        }\n      }\n      return Optional.none();\n    };\n    const find$1 = (xs, pred) => {\n      return findUntil(xs, pred, never);\n    };\n    const findIndex = (xs, pred) => {\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        if (pred(x, i)) {\n          return Optional.some(i);\n        }\n      }\n      return Optional.none();\n    };\n    const flatten = xs => {\n      const r = [];\n      for (let i = 0, len = xs.length; i < len; ++i) {\n        if (!isArray(xs[i])) {\n          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);\n        }\n        nativePush.apply(r, xs[i]);\n      }\n      return r;\n    };\n    const bind$2 = (xs, f) => flatten(map$1(xs, f));\n    const forall = (xs, pred) => {\n      for (let i = 0, len = xs.length; i < len; ++i) {\n        const x = xs[i];\n        if (pred(x, i) !== true) {\n          return false;\n        }\n      }\n      return true;\n    };\n    const reverse = xs => {\n      const r = nativeSlice.call(xs, 0);\n      r.reverse();\n      return r;\n    };\n    const mapToObject = (xs, f) => {\n      const r = {};\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        r[String(x)] = f(x, i);\n      }\n      return r;\n    };\n    const sort$1 = (xs, comparator) => {\n      const copy = nativeSlice.call(xs, 0);\n      copy.sort(comparator);\n      return copy;\n    };\n    const get$d = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();\n    const head = xs => get$d(xs, 0);\n    const last$2 = xs => get$d(xs, xs.length - 1);\n    const findMap = (arr, f) => {\n      for (let i = 0; i < arr.length; i++) {\n        const r = f(arr[i], i);\n        if (r.isSome()) {\n          return r;\n        }\n      }\n      return Optional.none();\n    };\n\n    const keys = Object.keys;\n    const hasOwnProperty = Object.hasOwnProperty;\n    const each$1 = (obj, f) => {\n      const props = keys(obj);\n      for (let k = 0, len = props.length; k < len; k++) {\n        const i = props[k];\n        const x = obj[i];\n        f(x, i);\n      }\n    };\n    const map = (obj, f) => {\n      return tupleMap(obj, (x, i) => ({\n        k: i,\n        v: f(x, i)\n      }));\n    };\n    const tupleMap = (obj, f) => {\n      const r = {};\n      each$1(obj, (x, i) => {\n        const tuple = f(x, i);\n        r[tuple.k] = tuple.v;\n      });\n      return r;\n    };\n    const objAcc = r => (x, i) => {\n      r[i] = x;\n    };\n    const internalFilter = (obj, pred, onTrue, onFalse) => {\n      each$1(obj, (x, i) => {\n        (pred(x, i) ? onTrue : onFalse)(x, i);\n      });\n    };\n    const filter$1 = (obj, pred) => {\n      const t = {};\n      internalFilter(obj, pred, objAcc(t), noop);\n      return t;\n    };\n    const mapToArray = (obj, f) => {\n      const r = [];\n      each$1(obj, (value, name) => {\n        r.push(f(value, name));\n      });\n      return r;\n    };\n    const values = obj => {\n      return mapToArray(obj, identity);\n    };\n    const get$c = (obj, key) => {\n      return has$1(obj, key) ? Optional.from(obj[key]) : Optional.none();\n    };\n    const has$1 = (obj, key) => hasOwnProperty.call(obj, key);\n    const hasNonNullableKey = (obj, key) => has$1(obj, key) && obj[key] !== undefined && obj[key] !== null;\n    const isEmpty = r => {\n      for (const x in r) {\n        if (hasOwnProperty.call(r, x)) {\n          return false;\n        }\n      }\n      return true;\n    };\n\n    const Global = typeof window !== 'undefined' ? window : Function('return this;')();\n\n    const path = (parts, scope) => {\n      let o = scope !== undefined && scope !== null ? scope : Global;\n      for (let i = 0; i < parts.length && o !== undefined && o !== null; ++i) {\n        o = o[parts[i]];\n      }\n      return o;\n    };\n    const resolve$2 = (p, scope) => {\n      const parts = p.split('.');\n      return path(parts, scope);\n    };\n\n    const unsafe = (name, scope) => {\n      return resolve$2(name, scope);\n    };\n    const getOrDie = (name, scope) => {\n      const actual = unsafe(name, scope);\n      if (actual === undefined || actual === null) {\n        throw new Error(name + ' not available on this browser');\n      }\n      return actual;\n    };\n\n    const getPrototypeOf = Object.getPrototypeOf;\n    const sandHTMLElement = scope => {\n      return getOrDie('HTMLElement', scope);\n    };\n    const isPrototypeOf = x => {\n      const scope = resolve$2('ownerDocument.defaultView', x);\n      return isObject(x) && (sandHTMLElement(scope).prototype.isPrototypeOf(x) || /^HTML\\w*Element$/.test(getPrototypeOf(x).constructor.name));\n    };\n\n    const COMMENT = 8;\n    const DOCUMENT = 9;\n    const DOCUMENT_FRAGMENT = 11;\n    const ELEMENT = 1;\n    const TEXT = 3;\n\n    const name = element => {\n      const r = element.dom.nodeName;\n      return r.toLowerCase();\n    };\n    const type = element => element.dom.nodeType;\n    const isType = t => element => type(element) === t;\n    const isComment = element => type(element) === COMMENT || name(element) === '#comment';\n    const isHTMLElement = element => isElement(element) && isPrototypeOf(element.dom);\n    const isElement = isType(ELEMENT);\n    const isText = isType(TEXT);\n    const isDocument = isType(DOCUMENT);\n    const isDocumentFragment = isType(DOCUMENT_FRAGMENT);\n    const isTag = tag => e => isElement(e) && name(e) === tag;\n\n    const rawSet = (dom, key, value) => {\n      if (isString(value) || isBoolean(value) || isNumber(value)) {\n        dom.setAttribute(key, value + '');\n      } else {\n        console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);\n        throw new Error('Attribute value was not simple');\n      }\n    };\n    const set$2 = (element, key, value) => {\n      rawSet(element.dom, key, value);\n    };\n    const setAll$1 = (element, attrs) => {\n      const dom = element.dom;\n      each$1(attrs, (v, k) => {\n        rawSet(dom, k, v);\n      });\n    };\n    const setOptions = (element, attrs) => {\n      each$1(attrs, (v, k) => {\n        v.fold(() => {\n          remove$7(element, k);\n        }, value => {\n          rawSet(element.dom, k, value);\n        });\n      });\n    };\n    const get$b = (element, key) => {\n      const v = element.dom.getAttribute(key);\n      return v === null ? undefined : v;\n    };\n    const getOpt = (element, key) => Optional.from(get$b(element, key));\n    const remove$7 = (element, key) => {\n      element.dom.removeAttribute(key);\n    };\n    const clone$2 = element => foldl(element.dom.attributes, (acc, attr) => {\n      acc[attr.name] = attr.value;\n      return acc;\n    }, {});\n\n    const fromHtml$1 = (html, scope) => {\n      const doc = scope || document;\n      const div = doc.createElement('div');\n      div.innerHTML = html;\n      if (!div.hasChildNodes() || div.childNodes.length > 1) {\n        const message = 'HTML does not have a single root node';\n        console.error(message, html);\n        throw new Error(message);\n      }\n      return fromDom$1(div.childNodes[0]);\n    };\n    const fromTag = (tag, scope) => {\n      const doc = scope || document;\n      const node = doc.createElement(tag);\n      return fromDom$1(node);\n    };\n    const fromText = (text, scope) => {\n      const doc = scope || document;\n      const node = doc.createTextNode(text);\n      return fromDom$1(node);\n    };\n    const fromDom$1 = node => {\n      if (node === null || node === undefined) {\n        throw new Error('Node cannot be null or undefined');\n      }\n      return { dom: node };\n    };\n    const fromPoint$1 = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom$1);\n    const SugarElement = {\n      fromHtml: fromHtml$1,\n      fromTag,\n      fromText,\n      fromDom: fromDom$1,\n      fromPoint: fromPoint$1\n    };\n\n    const is$2 = (element, selector) => {\n      const dom = element.dom;\n      if (dom.nodeType !== ELEMENT) {\n        return false;\n      } else {\n        const elem = dom;\n        if (elem.matches !== undefined) {\n          return elem.matches(selector);\n        } else if (elem.msMatchesSelector !== undefined) {\n          return elem.msMatchesSelector(selector);\n        } else if (elem.webkitMatchesSelector !== undefined) {\n          return elem.webkitMatchesSelector(selector);\n        } else if (elem.mozMatchesSelector !== undefined) {\n          return elem.mozMatchesSelector(selector);\n        } else {\n          throw new Error('Browser lacks native selectors');\n        }\n      }\n    };\n    const bypassSelector = dom => dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;\n    const all$1 = (selector, scope) => {\n      const base = scope === undefined ? document : scope.dom;\n      return bypassSelector(base) ? [] : map$1(base.querySelectorAll(selector), SugarElement.fromDom);\n    };\n    const one = (selector, scope) => {\n      const base = scope === undefined ? document : scope.dom;\n      return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom);\n    };\n\n    const eq$1 = (e1, e2) => e1.dom === e2.dom;\n    const contains$1 = (e1, e2) => {\n      const d1 = e1.dom;\n      const d2 = e2.dom;\n      return d1 === d2 ? false : d1.contains(d2);\n    };\n    const is$1 = is$2;\n\n    const owner = element => SugarElement.fromDom(element.dom.ownerDocument);\n    const documentOrOwner = dos => isDocument(dos) ? dos : owner(dos);\n    const documentElement = element => SugarElement.fromDom(documentOrOwner(element).dom.documentElement);\n    const defaultView = element => SugarElement.fromDom(documentOrOwner(element).dom.defaultView);\n    const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom);\n    const parentElement = element => Optional.from(element.dom.parentElement).map(SugarElement.fromDom);\n    const parents = (element, isRoot) => {\n      const stop = isFunction(isRoot) ? isRoot : never;\n      let dom = element.dom;\n      const ret = [];\n      while (dom.parentNode !== null && dom.parentNode !== undefined) {\n        const rawParent = dom.parentNode;\n        const p = SugarElement.fromDom(rawParent);\n        ret.push(p);\n        if (stop(p) === true) {\n          break;\n        } else {\n          dom = rawParent;\n        }\n      }\n      return ret;\n    };\n    const prevSibling = element => Optional.from(element.dom.previousSibling).map(SugarElement.fromDom);\n    const nextSibling = element => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);\n    const children$2 = element => map$1(element.dom.childNodes, SugarElement.fromDom);\n    const child$2 = (element, index) => {\n      const cs = element.dom.childNodes;\n      return Optional.from(cs[index]).map(SugarElement.fromDom);\n    };\n    const firstChild = element => child$2(element, 0);\n\n    const before$3 = (marker, element) => {\n      const parent$1 = parent(marker);\n      parent$1.each(v => {\n        v.dom.insertBefore(element.dom, marker.dom);\n      });\n    };\n    const after$5 = (marker, element) => {\n      const sibling = nextSibling(marker);\n      sibling.fold(() => {\n        const parent$1 = parent(marker);\n        parent$1.each(v => {\n          append$1(v, element);\n        });\n      }, v => {\n        before$3(v, element);\n      });\n    };\n    const prepend = (parent, element) => {\n      const firstChild$1 = firstChild(parent);\n      firstChild$1.fold(() => {\n        append$1(parent, element);\n      }, v => {\n        parent.dom.insertBefore(element.dom, v.dom);\n      });\n    };\n    const append$1 = (parent, element) => {\n      parent.dom.appendChild(element.dom);\n    };\n    const appendAt = (parent, element, index) => {\n      child$2(parent, index).fold(() => {\n        append$1(parent, element);\n      }, v => {\n        before$3(v, element);\n      });\n    };\n    const wrap = (element, wrapper) => {\n      before$3(element, wrapper);\n      append$1(wrapper, element);\n    };\n\n    const after$4 = (marker, elements) => {\n      each$2(elements, (x, i) => {\n        const e = i === 0 ? marker : elements[i - 1];\n        after$5(e, x);\n      });\n    };\n    const append = (parent, elements) => {\n      each$2(elements, x => {\n        append$1(parent, x);\n      });\n    };\n\n    const empty = element => {\n      element.dom.textContent = '';\n      each$2(children$2(element), rogue => {\n        remove$6(rogue);\n      });\n    };\n    const remove$6 = element => {\n      const dom = element.dom;\n      if (dom.parentNode !== null) {\n        dom.parentNode.removeChild(dom);\n      }\n    };\n    const unwrap = wrapper => {\n      const children = children$2(wrapper);\n      if (children.length > 0) {\n        after$4(wrapper, children);\n      }\n      remove$6(wrapper);\n    };\n\n    const clone$1 = (original, isDeep) => SugarElement.fromDom(original.dom.cloneNode(isDeep));\n    const shallow = original => clone$1(original, false);\n    const deep = original => clone$1(original, true);\n    const shallowAs = (original, tag) => {\n      const nu = SugarElement.fromTag(tag);\n      const attributes = clone$2(original);\n      setAll$1(nu, attributes);\n      return nu;\n    };\n    const copy$2 = (original, tag) => {\n      const nu = shallowAs(original, tag);\n      const cloneChildren = children$2(deep(original));\n      append(nu, cloneChildren);\n      return nu;\n    };\n    const mutate$1 = (original, tag) => {\n      const nu = shallowAs(original, tag);\n      after$5(original, nu);\n      const children = children$2(original);\n      append(nu, children);\n      remove$6(original);\n      return nu;\n    };\n\n    const validSectionList = [\n      'tfoot',\n      'thead',\n      'tbody',\n      'colgroup'\n    ];\n    const isValidSection = parentName => contains$2(validSectionList, parentName);\n    const grid = (rows, columns) => ({\n      rows,\n      columns\n    });\n    const address = (row, column) => ({\n      row,\n      column\n    });\n    const detail = (element, rowspan, colspan) => ({\n      element,\n      rowspan,\n      colspan\n    });\n    const detailnew = (element, rowspan, colspan, isNew) => ({\n      element,\n      rowspan,\n      colspan,\n      isNew\n    });\n    const extended = (element, rowspan, colspan, row, column, isLocked) => ({\n      element,\n      rowspan,\n      colspan,\n      row,\n      column,\n      isLocked\n    });\n    const rowdetail = (element, cells, section) => ({\n      element,\n      cells,\n      section\n    });\n    const rowdetailnew = (element, cells, section, isNew) => ({\n      element,\n      cells,\n      section,\n      isNew\n    });\n    const elementnew = (element, isNew, isLocked) => ({\n      element,\n      isNew,\n      isLocked\n    });\n    const rowcells = (element, cells, section, isNew) => ({\n      element,\n      cells,\n      section,\n      isNew\n    });\n    const bounds = (startRow, startCol, finishRow, finishCol) => ({\n      startRow,\n      startCol,\n      finishRow,\n      finishCol\n    });\n    const columnext = (element, colspan, column) => ({\n      element,\n      colspan,\n      column\n    });\n    const colgroup = (element, columns) => ({\n      element,\n      columns\n    });\n\n    const isShadowRoot = dos => isDocumentFragment(dos) && isNonNullable(dos.dom.host);\n    const supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);\n    const isSupported$1 = constant(supported);\n    const getRootNode = supported ? e => SugarElement.fromDom(e.dom.getRootNode()) : documentOrOwner;\n    const getShadowRoot = e => {\n      const r = getRootNode(e);\n      return isShadowRoot(r) ? Optional.some(r) : Optional.none();\n    };\n    const getShadowHost = e => SugarElement.fromDom(e.dom.host);\n    const getOriginalEventTarget = event => {\n      if (isSupported$1() && isNonNullable(event.target)) {\n        const el = SugarElement.fromDom(event.target);\n        if (isElement(el) && isOpenShadowHost(el)) {\n          if (event.composed && event.composedPath) {\n            const composedPath = event.composedPath();\n            if (composedPath) {\n              return head(composedPath);\n            }\n          }\n        }\n      }\n      return Optional.from(event.target);\n    };\n    const isOpenShadowHost = element => isNonNullable(element.dom.shadowRoot);\n\n    const inBody = element => {\n      const dom = isText(element) ? element.dom.parentNode : element.dom;\n      if (dom === undefined || dom === null || dom.ownerDocument === null) {\n        return false;\n      }\n      const doc = dom.ownerDocument;\n      return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost));\n    };\n    const body$1 = () => getBody$1(SugarElement.fromDom(document));\n    const getBody$1 = doc => {\n      const b = doc.dom.body;\n      if (b === null || b === undefined) {\n        throw new Error('Body is not available yet');\n      }\n      return SugarElement.fromDom(b);\n    };\n\n    const ancestors$4 = (scope, predicate, isRoot) => filter$2(parents(scope, isRoot), predicate);\n    const children$1 = (scope, predicate) => filter$2(children$2(scope), predicate);\n    const descendants$1 = (scope, predicate) => {\n      let result = [];\n      each$2(children$2(scope), x => {\n        if (predicate(x)) {\n          result = result.concat([x]);\n        }\n        result = result.concat(descendants$1(x, predicate));\n      });\n      return result;\n    };\n\n    const ancestors$3 = (scope, selector, isRoot) => ancestors$4(scope, e => is$2(e, selector), isRoot);\n    const children = (scope, selector) => children$1(scope, e => is$2(e, selector));\n    const descendants = (scope, selector) => all$1(selector, scope);\n\n    var ClosestOrAncestor = (is, ancestor, scope, a, isRoot) => {\n      if (is(scope, a)) {\n        return Optional.some(scope);\n      } else if (isFunction(isRoot) && isRoot(scope)) {\n        return Optional.none();\n      } else {\n        return ancestor(scope, a, isRoot);\n      }\n    };\n\n    const ancestor$2 = (scope, predicate, isRoot) => {\n      let element = scope.dom;\n      const stop = isFunction(isRoot) ? isRoot : never;\n      while (element.parentNode) {\n        element = element.parentNode;\n        const el = SugarElement.fromDom(element);\n        if (predicate(el)) {\n          return Optional.some(el);\n        } else if (stop(el)) {\n          break;\n        }\n      }\n      return Optional.none();\n    };\n    const closest$2 = (scope, predicate, isRoot) => {\n      const is = (s, test) => test(s);\n      return ClosestOrAncestor(is, ancestor$2, scope, predicate, isRoot);\n    };\n    const child$1 = (scope, predicate) => {\n      const pred = node => predicate(SugarElement.fromDom(node));\n      const result = find$1(scope.dom.childNodes, pred);\n      return result.map(SugarElement.fromDom);\n    };\n    const descendant$1 = (scope, predicate) => {\n      const descend = node => {\n        for (let i = 0; i < node.childNodes.length; i++) {\n          const child = SugarElement.fromDom(node.childNodes[i]);\n          if (predicate(child)) {\n            return Optional.some(child);\n          }\n          const res = descend(node.childNodes[i]);\n          if (res.isSome()) {\n            return res;\n          }\n        }\n        return Optional.none();\n      };\n      return descend(scope.dom);\n    };\n\n    const ancestor$1 = (scope, selector, isRoot) => ancestor$2(scope, e => is$2(e, selector), isRoot);\n    const child = (scope, selector) => child$1(scope, e => is$2(e, selector));\n    const descendant = (scope, selector) => one(selector, scope);\n    const closest$1 = (scope, selector, isRoot) => {\n      const is = (element, selector) => is$2(element, selector);\n      return ClosestOrAncestor(is, ancestor$1, scope, selector, isRoot);\n    };\n\n    const is = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs));\n    const cat = arr => {\n      const r = [];\n      const push = x => {\n        r.push(x);\n      };\n      for (let i = 0; i < arr.length; i++) {\n        arr[i].each(push);\n      }\n      return r;\n    };\n    const bindFrom = (a, f) => a !== undefined && a !== null ? f(a) : Optional.none();\n    const someIf = (b, a) => b ? Optional.some(a) : Optional.none();\n\n    const checkRange = (str, substr, start) => substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;\n    const contains = (str, substr, start = 0, end) => {\n      const idx = str.indexOf(substr, start);\n      if (idx !== -1) {\n        return isUndefined(end) ? true : idx + substr.length <= end;\n      } else {\n        return false;\n      }\n    };\n    const startsWith = (str, prefix) => {\n      return checkRange(str, prefix, 0);\n    };\n    const endsWith = (str, suffix) => {\n      return checkRange(str, suffix, str.length - suffix.length);\n    };\n    const blank = r => s => s.replace(r, '');\n    const trim = blank(/^\\s+|\\s+$/g);\n    const isNotEmpty = s => s.length > 0;\n    const toFloat = value => {\n      const num = parseFloat(value);\n      return isNaN(num) ? Optional.none() : Optional.some(num);\n    };\n\n    const isSupported = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue);\n\n    const internalSet = (dom, property, value) => {\n      if (!isString(value)) {\n        console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);\n        throw new Error('CSS value must be a string: ' + value);\n      }\n      if (isSupported(dom)) {\n        dom.style.setProperty(property, value);\n      }\n    };\n    const internalRemove = (dom, property) => {\n      if (isSupported(dom)) {\n        dom.style.removeProperty(property);\n      }\n    };\n    const set$1 = (element, property, value) => {\n      const dom = element.dom;\n      internalSet(dom, property, value);\n    };\n    const setAll = (element, css) => {\n      const dom = element.dom;\n      each$1(css, (v, k) => {\n        internalSet(dom, k, v);\n      });\n    };\n    const get$a = (element, property) => {\n      const dom = element.dom;\n      const styles = window.getComputedStyle(dom);\n      const r = styles.getPropertyValue(property);\n      return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;\n    };\n    const getUnsafeProperty = (dom, property) => isSupported(dom) ? dom.style.getPropertyValue(property) : '';\n    const getRaw$2 = (element, property) => {\n      const dom = element.dom;\n      const raw = getUnsafeProperty(dom, property);\n      return Optional.from(raw).filter(r => r.length > 0);\n    };\n    const remove$5 = (element, property) => {\n      const dom = element.dom;\n      internalRemove(dom, property);\n      if (is(getOpt(element, 'style').map(trim), '')) {\n        remove$7(element, 'style');\n      }\n    };\n    const copy$1 = (source, target) => {\n      const sourceDom = source.dom;\n      const targetDom = target.dom;\n      if (isSupported(sourceDom) && isSupported(targetDom)) {\n        targetDom.style.cssText = sourceDom.style.cssText;\n      }\n    };\n\n    const getAttrValue = (cell, name, fallback = 0) => getOpt(cell, name).map(value => parseInt(value, 10)).getOr(fallback);\n    const getSpan = (cell, type) => getAttrValue(cell, type, 1);\n    const hasColspan = cellOrCol => {\n      if (isTag('col')(cellOrCol)) {\n        return getAttrValue(cellOrCol, 'span', 1) > 1;\n      } else {\n        return getSpan(cellOrCol, 'colspan') > 1;\n      }\n    };\n    const hasRowspan = cell => getSpan(cell, 'rowspan') > 1;\n    const getCssValue = (element, property) => parseInt(get$a(element, property), 10);\n    const minWidth = constant(10);\n    const minHeight = constant(10);\n\n    const firstLayer = (scope, selector) => {\n      return filterFirstLayer(scope, selector, always);\n    };\n    const filterFirstLayer = (scope, selector, predicate) => {\n      return bind$2(children$2(scope), x => {\n        if (is$2(x, selector)) {\n          return predicate(x) ? [x] : [];\n        } else {\n          return filterFirstLayer(x, selector, predicate);\n        }\n      });\n    };\n\n    const lookup = (tags, element, isRoot = never) => {\n      if (isRoot(element)) {\n        return Optional.none();\n      }\n      if (contains$2(tags, name(element))) {\n        return Optional.some(element);\n      }\n      const isRootOrUpperTable = elm => is$2(elm, 'table') || isRoot(elm);\n      return ancestor$1(element, tags.join(','), isRootOrUpperTable);\n    };\n    const cell = (element, isRoot) => lookup([\n      'td',\n      'th'\n    ], element, isRoot);\n    const cells$1 = ancestor => firstLayer(ancestor, 'th,td');\n    const columns$1 = ancestor => {\n      if (is$2(ancestor, 'colgroup')) {\n        return children(ancestor, 'col');\n      } else {\n        return bind$2(columnGroups(ancestor), columnGroup => children(columnGroup, 'col'));\n      }\n    };\n    const table = (element, isRoot) => closest$1(element, 'table', isRoot);\n    const rows$1 = ancestor => firstLayer(ancestor, 'tr');\n    const columnGroups = ancestor => table(ancestor).fold(constant([]), table => children(table, 'colgroup'));\n\n    const fromRowsOrColGroups = (elems, getSection) => map$1(elems, row => {\n      if (name(row) === 'colgroup') {\n        const cells = map$1(columns$1(row), column => {\n          const colspan = getAttrValue(column, 'span', 1);\n          return detail(column, 1, colspan);\n        });\n        return rowdetail(row, cells, 'colgroup');\n      } else {\n        const cells = map$1(cells$1(row), cell => {\n          const rowspan = getAttrValue(cell, 'rowspan', 1);\n          const colspan = getAttrValue(cell, 'colspan', 1);\n          return detail(cell, rowspan, colspan);\n        });\n        return rowdetail(row, cells, getSection(row));\n      }\n    });\n    const getParentSection = group => parent(group).map(parent => {\n      const parentName = name(parent);\n      return isValidSection(parentName) ? parentName : 'tbody';\n    }).getOr('tbody');\n    const fromTable$1 = table => {\n      const rows = rows$1(table);\n      const columnGroups$1 = columnGroups(table);\n      const elems = [\n        ...columnGroups$1,\n        ...rows\n      ];\n      return fromRowsOrColGroups(elems, getParentSection);\n    };\n    const fromPastedRows = (elems, section) => fromRowsOrColGroups(elems, () => section);\n\n    const cached = f => {\n      let called = false;\n      let r;\n      return (...args) => {\n        if (!called) {\n          called = true;\n          r = f.apply(null, args);\n        }\n        return r;\n      };\n    };\n\n    const DeviceType = (os, browser, userAgent, mediaMatch) => {\n      const isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;\n      const isiPhone = os.isiOS() && !isiPad;\n      const isMobile = os.isiOS() || os.isAndroid();\n      const isTouch = isMobile || mediaMatch('(pointer:coarse)');\n      const isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');\n      const isPhone = isiPhone || isMobile && !isTablet;\n      const iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;\n      const isDesktop = !isPhone && !isTablet && !iOSwebview;\n      return {\n        isiPad: constant(isiPad),\n        isiPhone: constant(isiPhone),\n        isTablet: constant(isTablet),\n        isPhone: constant(isPhone),\n        isTouch: constant(isTouch),\n        isAndroid: os.isAndroid,\n        isiOS: os.isiOS,\n        isWebView: constant(iOSwebview),\n        isDesktop: constant(isDesktop)\n      };\n    };\n\n    const firstMatch = (regexes, s) => {\n      for (let i = 0; i < regexes.length; i++) {\n        const x = regexes[i];\n        if (x.test(s)) {\n          return x;\n        }\n      }\n      return undefined;\n    };\n    const find = (regexes, agent) => {\n      const r = firstMatch(regexes, agent);\n      if (!r) {\n        return {\n          major: 0,\n          minor: 0\n        };\n      }\n      const group = i => {\n        return Number(agent.replace(r, '$' + i));\n      };\n      return nu$2(group(1), group(2));\n    };\n    const detect$5 = (versionRegexes, agent) => {\n      const cleanedAgent = String(agent).toLowerCase();\n      if (versionRegexes.length === 0) {\n        return unknown$2();\n      }\n      return find(versionRegexes, cleanedAgent);\n    };\n    const unknown$2 = () => {\n      return nu$2(0, 0);\n    };\n    const nu$2 = (major, minor) => {\n      return {\n        major,\n        minor\n      };\n    };\n    const Version = {\n      nu: nu$2,\n      detect: detect$5,\n      unknown: unknown$2\n    };\n\n    const detectBrowser$1 = (browsers, userAgentData) => {\n      return findMap(userAgentData.brands, uaBrand => {\n        const lcBrand = uaBrand.brand.toLowerCase();\n        return find$1(browsers, browser => {\n          var _a;\n          return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());\n        }).map(info => ({\n          current: info.name,\n          version: Version.nu(parseInt(uaBrand.version, 10), 0)\n        }));\n      });\n    };\n\n    const detect$4 = (candidates, userAgent) => {\n      const agent = String(userAgent).toLowerCase();\n      return find$1(candidates, candidate => {\n        return candidate.search(agent);\n      });\n    };\n    const detectBrowser = (browsers, userAgent) => {\n      return detect$4(browsers, userAgent).map(browser => {\n        const version = Version.detect(browser.versionRegexes, userAgent);\n        return {\n          current: browser.name,\n          version\n        };\n      });\n    };\n    const detectOs = (oses, userAgent) => {\n      return detect$4(oses, userAgent).map(os => {\n        const version = Version.detect(os.versionRegexes, userAgent);\n        return {\n          current: os.name,\n          version\n        };\n      });\n    };\n\n    const normalVersionRegex = /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/;\n    const checkContains = target => {\n      return uastring => {\n        return contains(uastring, target);\n      };\n    };\n    const browsers = [\n      {\n        name: 'Edge',\n        versionRegexes: [/.*?edge\\/ ?([0-9]+)\\.([0-9]+)$/],\n        search: uastring => {\n          return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');\n        }\n      },\n      {\n        name: 'Chromium',\n        brand: 'Chromium',\n        versionRegexes: [\n          /.*?chrome\\/([0-9]+)\\.([0-9]+).*/,\n          normalVersionRegex\n        ],\n        search: uastring => {\n          return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');\n        }\n      },\n      {\n        name: 'IE',\n        versionRegexes: [\n          /.*?msie\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*?rv:([0-9]+)\\.([0-9]+).*/\n        ],\n        search: uastring => {\n          return contains(uastring, 'msie') || contains(uastring, 'trident');\n        }\n      },\n      {\n        name: 'Opera',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?opera\\/([0-9]+)\\.([0-9]+).*/\n        ],\n        search: checkContains('opera')\n      },\n      {\n        name: 'Firefox',\n        versionRegexes: [/.*?firefox\\/\\ ?([0-9]+)\\.([0-9]+).*/],\n        search: checkContains('firefox')\n      },\n      {\n        name: 'Safari',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?cpu os ([0-9]+)_([0-9]+).*/\n        ],\n        search: uastring => {\n          return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');\n        }\n      }\n    ];\n    const oses = [\n      {\n        name: 'Windows',\n        search: checkContains('win'),\n        versionRegexes: [/.*?windows\\ nt\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'iOS',\n        search: uastring => {\n          return contains(uastring, 'iphone') || contains(uastring, 'ipad');\n        },\n        versionRegexes: [\n          /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*cpu os ([0-9]+)_([0-9]+).*/,\n          /.*cpu iphone os ([0-9]+)_([0-9]+).*/\n        ]\n      },\n      {\n        name: 'Android',\n        search: checkContains('android'),\n        versionRegexes: [/.*?android\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'macOS',\n        search: checkContains('mac os x'),\n        versionRegexes: [/.*?mac\\ os\\ x\\ ?([0-9]+)_([0-9]+).*/]\n      },\n      {\n        name: 'Linux',\n        search: checkContains('linux'),\n        versionRegexes: []\n      },\n      {\n        name: 'Solaris',\n        search: checkContains('sunos'),\n        versionRegexes: []\n      },\n      {\n        name: 'FreeBSD',\n        search: checkContains('freebsd'),\n        versionRegexes: []\n      },\n      {\n        name: 'ChromeOS',\n        search: checkContains('cros'),\n        versionRegexes: [/.*?chrome\\/([0-9]+)\\.([0-9]+).*/]\n      }\n    ];\n    const PlatformInfo = {\n      browsers: constant(browsers),\n      oses: constant(oses)\n    };\n\n    const edge = 'Edge';\n    const chromium = 'Chromium';\n    const ie = 'IE';\n    const opera = 'Opera';\n    const firefox = 'Firefox';\n    const safari = 'Safari';\n    const unknown$1 = () => {\n      return nu$1({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    const nu$1 = info => {\n      const current = info.current;\n      const version = info.version;\n      const isBrowser = name => () => current === name;\n      return {\n        current,\n        version,\n        isEdge: isBrowser(edge),\n        isChromium: isBrowser(chromium),\n        isIE: isBrowser(ie),\n        isOpera: isBrowser(opera),\n        isFirefox: isBrowser(firefox),\n        isSafari: isBrowser(safari)\n      };\n    };\n    const Browser = {\n      unknown: unknown$1,\n      nu: nu$1,\n      edge: constant(edge),\n      chromium: constant(chromium),\n      ie: constant(ie),\n      opera: constant(opera),\n      firefox: constant(firefox),\n      safari: constant(safari)\n    };\n\n    const windows = 'Windows';\n    const ios = 'iOS';\n    const android = 'Android';\n    const linux = 'Linux';\n    const macos = 'macOS';\n    const solaris = 'Solaris';\n    const freebsd = 'FreeBSD';\n    const chromeos = 'ChromeOS';\n    const unknown = () => {\n      return nu({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    const nu = info => {\n      const current = info.current;\n      const version = info.version;\n      const isOS = name => () => current === name;\n      return {\n        current,\n        version,\n        isWindows: isOS(windows),\n        isiOS: isOS(ios),\n        isAndroid: isOS(android),\n        isMacOS: isOS(macos),\n        isLinux: isOS(linux),\n        isSolaris: isOS(solaris),\n        isFreeBSD: isOS(freebsd),\n        isChromeOS: isOS(chromeos)\n      };\n    };\n    const OperatingSystem = {\n      unknown,\n      nu,\n      windows: constant(windows),\n      ios: constant(ios),\n      android: constant(android),\n      linux: constant(linux),\n      macos: constant(macos),\n      solaris: constant(solaris),\n      freebsd: constant(freebsd),\n      chromeos: constant(chromeos)\n    };\n\n    const detect$3 = (userAgent, userAgentDataOpt, mediaMatch) => {\n      const browsers = PlatformInfo.browsers();\n      const oses = PlatformInfo.oses();\n      const browser = userAgentDataOpt.bind(userAgentData => detectBrowser$1(browsers, userAgentData)).orThunk(() => detectBrowser(browsers, userAgent)).fold(Browser.unknown, Browser.nu);\n      const os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);\n      const deviceType = DeviceType(os, browser, userAgent, mediaMatch);\n      return {\n        browser,\n        os,\n        deviceType\n      };\n    };\n    const PlatformDetection = { detect: detect$3 };\n\n    const mediaMatch = query => window.matchMedia(query).matches;\n    let platform = cached(() => PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch));\n    const detect$2 = () => platform();\n\n    const Dimension = (name, getOffset) => {\n      const set = (element, h) => {\n        if (!isNumber(h) && !h.match(/^[0-9]+$/)) {\n          throw new Error(name + '.set accepts only positive integer values. Value was ' + h);\n        }\n        const dom = element.dom;\n        if (isSupported(dom)) {\n          dom.style[name] = h + 'px';\n        }\n      };\n      const get = element => {\n        const r = getOffset(element);\n        if (r <= 0 || r === null) {\n          const css = get$a(element, name);\n          return parseFloat(css) || 0;\n        }\n        return r;\n      };\n      const getOuter = get;\n      const aggregate = (element, properties) => foldl(properties, (acc, property) => {\n        const val = get$a(element, property);\n        const value = val === undefined ? 0 : parseInt(val, 10);\n        return isNaN(value) ? acc : acc + value;\n      }, 0);\n      const max = (element, value, properties) => {\n        const cumulativeInclusions = aggregate(element, properties);\n        const absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0;\n        return absoluteMax;\n      };\n      return {\n        set,\n        get,\n        getOuter,\n        aggregate,\n        max\n      };\n    };\n\n    const toNumber = (px, fallback) => toFloat(px).getOr(fallback);\n    const getProp = (element, name, fallback) => toNumber(get$a(element, name), fallback);\n    const calcContentBoxSize = (element, size, upper, lower) => {\n      const paddingUpper = getProp(element, `padding-${ upper }`, 0);\n      const paddingLower = getProp(element, `padding-${ lower }`, 0);\n      const borderUpper = getProp(element, `border-${ upper }-width`, 0);\n      const borderLower = getProp(element, `border-${ lower }-width`, 0);\n      return size - paddingUpper - paddingLower - borderUpper - borderLower;\n    };\n    const getCalculatedWidth = (element, boxSizing) => {\n      const dom = element.dom;\n      const width = dom.getBoundingClientRect().width || dom.offsetWidth;\n      return boxSizing === 'border-box' ? width : calcContentBoxSize(element, width, 'left', 'right');\n    };\n    const getHeight$1 = element => getProp(element, 'height', element.dom.offsetHeight);\n    const getWidth = element => getProp(element, 'width', element.dom.offsetWidth);\n    const getInnerWidth = element => getCalculatedWidth(element, 'content-box');\n\n    const api$2 = Dimension('width', element => element.dom.offsetWidth);\n    const get$9 = element => api$2.get(element);\n    const getOuter$2 = element => api$2.getOuter(element);\n    const getInner = getInnerWidth;\n    const getRuntime$1 = getWidth;\n\n    const addCells = (gridRow, index, cells) => {\n      const existingCells = gridRow.cells;\n      const before = existingCells.slice(0, index);\n      const after = existingCells.slice(index);\n      const newCells = before.concat(cells).concat(after);\n      return setCells(gridRow, newCells);\n    };\n    const addCell = (gridRow, index, cell) => addCells(gridRow, index, [cell]);\n    const mutateCell = (gridRow, index, cell) => {\n      const cells = gridRow.cells;\n      cells[index] = cell;\n    };\n    const setCells = (gridRow, cells) => rowcells(gridRow.element, cells, gridRow.section, gridRow.isNew);\n    const mapCells = (gridRow, f) => {\n      const cells = gridRow.cells;\n      const r = map$1(cells, f);\n      return rowcells(gridRow.element, r, gridRow.section, gridRow.isNew);\n    };\n    const getCell = (gridRow, index) => gridRow.cells[index];\n    const getCellElement = (gridRow, index) => getCell(gridRow, index).element;\n    const cellLength = gridRow => gridRow.cells.length;\n    const extractGridDetails = grid => {\n      const result = partition(grid, row => row.section === 'colgroup');\n      return {\n        rows: result.fail,\n        cols: result.pass\n      };\n    };\n    const clone = (gridRow, cloneRow, cloneCell) => {\n      const newCells = map$1(gridRow.cells, cloneCell);\n      return rowcells(cloneRow(gridRow.element), newCells, gridRow.section, true);\n    };\n\n    const LOCKED_COL_ATTR = 'data-snooker-locked-cols';\n    const getLockedColumnsFromTable = table => getOpt(table, LOCKED_COL_ATTR).bind(lockedColStr => Optional.from(lockedColStr.match(/\\d+/g))).map(lockedCols => mapToObject(lockedCols, always));\n    const getLockedColumnsFromGrid = grid => {\n      const locked = foldl(extractGridDetails(grid).rows, (acc, row) => {\n        each$2(row.cells, (cell, idx) => {\n          if (cell.isLocked) {\n            acc[idx] = true;\n          }\n        });\n        return acc;\n      }, {});\n      const lockedArr = mapToArray(locked, (_val, key) => parseInt(key, 10));\n      return sort$1(lockedArr);\n    };\n\n    const key = (row, column) => {\n      return row + ',' + column;\n    };\n    const getAt = (warehouse, row, column) => Optional.from(warehouse.access[key(row, column)]);\n    const findItem = (warehouse, item, comparator) => {\n      const filtered = filterItems(warehouse, detail => {\n        return comparator(item, detail.element);\n      });\n      return filtered.length > 0 ? Optional.some(filtered[0]) : Optional.none();\n    };\n    const filterItems = (warehouse, predicate) => {\n      const all = bind$2(warehouse.all, r => {\n        return r.cells;\n      });\n      return filter$2(all, predicate);\n    };\n    const generateColumns = rowData => {\n      const columnsGroup = {};\n      let index = 0;\n      each$2(rowData.cells, column => {\n        const colspan = column.colspan;\n        range$1(colspan, columnIndex => {\n          const colIndex = index + columnIndex;\n          columnsGroup[colIndex] = columnext(column.element, colspan, colIndex);\n        });\n        index += colspan;\n      });\n      return columnsGroup;\n    };\n    const generate$1 = list => {\n      const access = {};\n      const cells = [];\n      const tableOpt = head(list).map(rowData => rowData.element).bind(table);\n      const lockedColumns = tableOpt.bind(getLockedColumnsFromTable).getOr({});\n      let maxRows = 0;\n      let maxColumns = 0;\n      let rowCount = 0;\n      const {\n        pass: colgroupRows,\n        fail: rows\n      } = partition(list, rowData => rowData.section === 'colgroup');\n      each$2(rows, rowData => {\n        const currentRow = [];\n        each$2(rowData.cells, rowCell => {\n          let start = 0;\n          while (access[key(rowCount, start)] !== undefined) {\n            start++;\n          }\n          const isLocked = hasNonNullableKey(lockedColumns, start.toString());\n          const current = extended(rowCell.element, rowCell.rowspan, rowCell.colspan, rowCount, start, isLocked);\n          for (let occupiedColumnPosition = 0; occupiedColumnPosition < rowCell.colspan; occupiedColumnPosition++) {\n            for (let occupiedRowPosition = 0; occupiedRowPosition < rowCell.rowspan; occupiedRowPosition++) {\n              const rowPosition = rowCount + occupiedRowPosition;\n              const columnPosition = start + occupiedColumnPosition;\n              const newpos = key(rowPosition, columnPosition);\n              access[newpos] = current;\n              maxColumns = Math.max(maxColumns, columnPosition + 1);\n            }\n          }\n          currentRow.push(current);\n        });\n        maxRows++;\n        cells.push(rowdetail(rowData.element, currentRow, rowData.section));\n        rowCount++;\n      });\n      const {columns, colgroups} = last$2(colgroupRows).map(rowData => {\n        const columns = generateColumns(rowData);\n        const colgroup$1 = colgroup(rowData.element, values(columns));\n        return {\n          colgroups: [colgroup$1],\n          columns\n        };\n      }).getOrThunk(() => ({\n        colgroups: [],\n        columns: {}\n      }));\n      const grid$1 = grid(maxRows, maxColumns);\n      return {\n        grid: grid$1,\n        access,\n        all: cells,\n        columns,\n        colgroups\n      };\n    };\n    const fromTable = table => {\n      const list = fromTable$1(table);\n      return generate$1(list);\n    };\n    const justCells = warehouse => bind$2(warehouse.all, w => w.cells);\n    const justColumns = warehouse => values(warehouse.columns);\n    const hasColumns = warehouse => keys(warehouse.columns).length > 0;\n    const getColumnAt = (warehouse, columnIndex) => Optional.from(warehouse.columns[columnIndex]);\n    const Warehouse = {\n      fromTable,\n      generate: generate$1,\n      getAt,\n      findItem,\n      filterItems,\n      justCells,\n      justColumns,\n      hasColumns,\n      getColumnAt\n    };\n\n    const columns = (warehouse, isValidCell = always) => {\n      const grid = warehouse.grid;\n      const cols = range$1(grid.columns, identity);\n      const rowsArr = range$1(grid.rows, identity);\n      return map$1(cols, col => {\n        const getBlock = () => bind$2(rowsArr, r => Warehouse.getAt(warehouse, r, col).filter(detail => detail.column === col).toArray());\n        const isValid = detail => detail.colspan === 1 && isValidCell(detail.element);\n        const getFallback = () => Warehouse.getAt(warehouse, 0, col);\n        return decide(getBlock, isValid, getFallback);\n      });\n    };\n    const decide = (getBlock, isValid, getFallback) => {\n      const inBlock = getBlock();\n      const validInBlock = find$1(inBlock, isValid);\n      const detailOption = validInBlock.orThunk(() => Optional.from(inBlock[0]).orThunk(getFallback));\n      return detailOption.map(detail => detail.element);\n    };\n    const rows = warehouse => {\n      const grid = warehouse.grid;\n      const rowsArr = range$1(grid.rows, identity);\n      const cols = range$1(grid.columns, identity);\n      return map$1(rowsArr, row => {\n        const getBlock = () => bind$2(cols, c => Warehouse.getAt(warehouse, row, c).filter(detail => detail.row === row).fold(constant([]), detail => [detail]));\n        const isSingle = detail => detail.rowspan === 1;\n        const getFallback = () => Warehouse.getAt(warehouse, row, 0);\n        return decide(getBlock, isSingle, getFallback);\n      });\n    };\n\n    const deduce = (xs, index) => {\n      if (index < 0 || index >= xs.length - 1) {\n        return Optional.none();\n      }\n      const current = xs[index].fold(() => {\n        const rest = reverse(xs.slice(0, index));\n        return findMap(rest, (a, i) => a.map(aa => ({\n          value: aa,\n          delta: i + 1\n        })));\n      }, c => Optional.some({\n        value: c,\n        delta: 0\n      }));\n      const next = xs[index + 1].fold(() => {\n        const rest = xs.slice(index + 1);\n        return findMap(rest, (a, i) => a.map(aa => ({\n          value: aa,\n          delta: i + 1\n        })));\n      }, n => Optional.some({\n        value: n,\n        delta: 1\n      }));\n      return current.bind(c => next.map(n => {\n        const extras = n.delta + c.delta;\n        return Math.abs(n.value - c.value) / extras;\n      }));\n    };\n\n    const onDirection = (isLtr, isRtl) => element => getDirection(element) === 'rtl' ? isRtl : isLtr;\n    const getDirection = element => get$a(element, 'direction') === 'rtl' ? 'rtl' : 'ltr';\n\n    const api$1 = Dimension('height', element => {\n      const dom = element.dom;\n      return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;\n    });\n    const get$8 = element => api$1.get(element);\n    const getOuter$1 = element => api$1.getOuter(element);\n    const getRuntime = getHeight$1;\n\n    const r = (left, top) => {\n      const translate = (x, y) => r(left + x, top + y);\n      return {\n        left,\n        top,\n        translate\n      };\n    };\n    const SugarPosition = r;\n\n    const boxPosition = dom => {\n      const box = dom.getBoundingClientRect();\n      return SugarPosition(box.left, box.top);\n    };\n    const firstDefinedOrZero = (a, b) => {\n      if (a !== undefined) {\n        return a;\n      } else {\n        return b !== undefined ? b : 0;\n      }\n    };\n    const absolute = element => {\n      const doc = element.dom.ownerDocument;\n      const body = doc.body;\n      const win = doc.defaultView;\n      const html = doc.documentElement;\n      if (body === element.dom) {\n        return SugarPosition(body.offsetLeft, body.offsetTop);\n      }\n      const scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop);\n      const scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageXOffset, html.scrollLeft);\n      const clientTop = firstDefinedOrZero(html.clientTop, body.clientTop);\n      const clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft);\n      return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop);\n    };\n    const viewport = element => {\n      const dom = element.dom;\n      const doc = dom.ownerDocument;\n      const body = doc.body;\n      if (body === dom) {\n        return SugarPosition(body.offsetLeft, body.offsetTop);\n      }\n      if (!inBody(element)) {\n        return SugarPosition(0, 0);\n      }\n      return boxPosition(dom);\n    };\n\n    const rowInfo = (row, y) => ({\n      row,\n      y\n    });\n    const colInfo = (col, x) => ({\n      col,\n      x\n    });\n    const rtlEdge = cell => {\n      const pos = absolute(cell);\n      return pos.left + getOuter$2(cell);\n    };\n    const ltrEdge = cell => {\n      return absolute(cell).left;\n    };\n    const getLeftEdge = (index, cell) => {\n      return colInfo(index, ltrEdge(cell));\n    };\n    const getRightEdge = (index, cell) => {\n      return colInfo(index, rtlEdge(cell));\n    };\n    const getTop$1 = cell => {\n      return absolute(cell).top;\n    };\n    const getTopEdge = (index, cell) => {\n      return rowInfo(index, getTop$1(cell));\n    };\n    const getBottomEdge = (index, cell) => {\n      return rowInfo(index, getTop$1(cell) + getOuter$1(cell));\n    };\n    const findPositions = (getInnerEdge, getOuterEdge, array) => {\n      if (array.length === 0) {\n        return [];\n      }\n      const lines = map$1(array.slice(1), (cellOption, index) => {\n        return cellOption.map(cell => {\n          return getInnerEdge(index, cell);\n        });\n      });\n      const lastLine = array[array.length - 1].map(cell => {\n        return getOuterEdge(array.length - 1, cell);\n      });\n      return lines.concat([lastLine]);\n    };\n    const negate = step => {\n      return -step;\n    };\n    const height = {\n      delta: identity,\n      positions: optElements => findPositions(getTopEdge, getBottomEdge, optElements),\n      edge: getTop$1\n    };\n    const ltr$1 = {\n      delta: identity,\n      edge: ltrEdge,\n      positions: optElements => findPositions(getLeftEdge, getRightEdge, optElements)\n    };\n    const rtl$1 = {\n      delta: negate,\n      edge: rtlEdge,\n      positions: optElements => findPositions(getRightEdge, getLeftEdge, optElements)\n    };\n    const detect$1 = onDirection(ltr$1, rtl$1);\n    const width = {\n      delta: (amount, table) => detect$1(table).delta(amount, table),\n      positions: (cols, table) => detect$1(table).positions(cols, table),\n      edge: cell => detect$1(cell).edge(cell)\n    };\n\n    const units = {\n      unsupportedLength: [\n        'em',\n        'ex',\n        'cap',\n        'ch',\n        'ic',\n        'rem',\n        'lh',\n        'rlh',\n        'vw',\n        'vh',\n        'vi',\n        'vb',\n        'vmin',\n        'vmax',\n        'cm',\n        'mm',\n        'Q',\n        'in',\n        'pc',\n        'pt',\n        'px'\n      ],\n      fixed: [\n        'px',\n        'pt'\n      ],\n      relative: ['%'],\n      empty: ['']\n    };\n    const pattern = (() => {\n      const decimalDigits = '[0-9]+';\n      const signedInteger = '[+-]?' + decimalDigits;\n      const exponentPart = '[eE]' + signedInteger;\n      const dot = '\\\\.';\n      const opt = input => `(?:${ input })?`;\n      const unsignedDecimalLiteral = [\n        'Infinity',\n        decimalDigits + dot + opt(decimalDigits) + opt(exponentPart),\n        dot + decimalDigits + opt(exponentPart),\n        decimalDigits + opt(exponentPart)\n      ].join('|');\n      const float = `[+-]?(?:${ unsignedDecimalLiteral })`;\n      return new RegExp(`^(${ float })(.*)$`);\n    })();\n    const isUnit = (unit, accepted) => exists(accepted, acc => exists(units[acc], check => unit === check));\n    const parse = (input, accepted) => {\n      const match = Optional.from(pattern.exec(input));\n      return match.bind(array => {\n        const value = Number(array[1]);\n        const unitRaw = array[2];\n        if (isUnit(unitRaw, accepted)) {\n          return Optional.some({\n            value,\n            unit: unitRaw\n          });\n        } else {\n          return Optional.none();\n        }\n      });\n    };\n\n    const rPercentageBasedSizeRegex = /(\\d+(\\.\\d+)?)%/;\n    const rPixelBasedSizeRegex = /(\\d+(\\.\\d+)?)px|em/;\n    const isCol$2 = isTag('col');\n    const isRow$2 = isTag('tr');\n    const getPercentSize = (elm, outerGetter, innerGetter) => {\n      const relativeParent = parentElement(elm).getOrThunk(() => getBody$1(owner(elm)));\n      return outerGetter(elm) / innerGetter(relativeParent) * 100;\n    };\n    const setPixelWidth = (cell, amount) => {\n      set$1(cell, 'width', amount + 'px');\n    };\n    const setPercentageWidth = (cell, amount) => {\n      set$1(cell, 'width', amount + '%');\n    };\n    const setHeight = (cell, amount) => {\n      set$1(cell, 'height', amount + 'px');\n    };\n    const removeHeight = cell => {\n      remove$5(cell, 'height');\n    };\n    const getHeightValue = cell => getRuntime(cell) + 'px';\n    const convert = (cell, number, getter, setter) => {\n      const newSize = table(cell).map(table => {\n        const total = getter(table);\n        return Math.floor(number / 100 * total);\n      }).getOr(number);\n      setter(cell, newSize);\n      return newSize;\n    };\n    const normalizePixelSize = (value, cell, getter, setter) => {\n      const number = parseFloat(value);\n      return endsWith(value, '%') && name(cell) !== 'table' ? convert(cell, number, getter, setter) : number;\n    };\n    const getTotalHeight = cell => {\n      const value = getHeightValue(cell);\n      if (!value) {\n        return get$8(cell);\n      }\n      return normalizePixelSize(value, cell, get$8, setHeight);\n    };\n    const get$7 = (cell, type, f) => {\n      const v = f(cell);\n      const span = getSpan(cell, type);\n      return v / span;\n    };\n    const getRaw$1 = (element, prop) => {\n      return getRaw$2(element, prop).orThunk(() => {\n        return getOpt(element, prop).map(val => val + 'px');\n      });\n    };\n    const getRawWidth$1 = element => getRaw$1(element, 'width');\n    const getRawHeight$1 = element => getRaw$1(element, 'height');\n    const getPercentageWidth = cell => getPercentSize(cell, get$9, getInner);\n    const getPixelWidth$1 = cell => isCol$2(cell) ? get$9(cell) : getRuntime$1(cell);\n    const getHeight = cell => {\n      return isRow$2(cell) ? get$8(cell) : get$7(cell, 'rowspan', getTotalHeight);\n    };\n    const getGenericWidth = cell => {\n      const width = getRawWidth$1(cell);\n      return width.bind(w => parse(w, [\n        'fixed',\n        'relative',\n        'empty'\n      ]));\n    };\n    const setGenericWidth = (cell, amount, unit) => {\n      set$1(cell, 'width', amount + unit);\n    };\n    const getPixelTableWidth = table => get$9(table) + 'px';\n    const getPixelTableHeight = table => get$8(table) + 'px';\n    const getPercentTableWidth = table => getPercentSize(table, get$9, getInner) + '%';\n    const isPercentSizing$1 = table => getRawWidth$1(table).exists(size => rPercentageBasedSizeRegex.test(size));\n    const isPixelSizing$1 = table => getRawWidth$1(table).exists(size => rPixelBasedSizeRegex.test(size));\n    const isNoneSizing$1 = table => getRawWidth$1(table).isNone();\n    const percentageBasedSizeRegex = constant(rPercentageBasedSizeRegex);\n\n    const isCol$1 = isTag('col');\n    const getRawW = cell => {\n      return getRawWidth$1(cell).getOrThunk(() => getPixelWidth$1(cell) + 'px');\n    };\n    const getRawH = cell => {\n      return getRawHeight$1(cell).getOrThunk(() => getHeight(cell) + 'px');\n    };\n    const justCols = warehouse => map$1(Warehouse.justColumns(warehouse), column => Optional.from(column.element));\n    const isValidColumn = cell => {\n      const browser = detect$2().browser;\n      const supportsColWidths = browser.isChromium() || browser.isFirefox();\n      return isCol$1(cell) ? supportsColWidths : true;\n    };\n    const getDimension = (cellOpt, index, backups, filter, getter, fallback) => cellOpt.filter(filter).fold(() => fallback(deduce(backups, index)), cell => getter(cell));\n    const getWidthFrom = (warehouse, table, getWidth, fallback) => {\n      const columnCells = columns(warehouse);\n      const columns$1 = Warehouse.hasColumns(warehouse) ? justCols(warehouse) : columnCells;\n      const backups = [Optional.some(width.edge(table))].concat(map$1(width.positions(columnCells, table), pos => pos.map(p => p.x)));\n      const colFilter = not(hasColspan);\n      return map$1(columns$1, (cellOption, c) => {\n        return getDimension(cellOption, c, backups, colFilter, column => {\n          if (isValidColumn(column)) {\n            return getWidth(column);\n          } else {\n            const cell = bindFrom(columnCells[c], identity);\n            return getDimension(cell, c, backups, colFilter, cell => fallback(Optional.some(get$9(cell))), fallback);\n          }\n        }, fallback);\n      });\n    };\n    const getDeduced = deduced => {\n      return deduced.map(d => {\n        return d + 'px';\n      }).getOr('');\n    };\n    const getRawWidths = (warehouse, table) => {\n      return getWidthFrom(warehouse, table, getRawW, getDeduced);\n    };\n    const getPercentageWidths = (warehouse, table, tableSize) => {\n      return getWidthFrom(warehouse, table, getPercentageWidth, deduced => {\n        return deduced.fold(() => {\n          return tableSize.minCellWidth();\n        }, cellWidth => {\n          return cellWidth / tableSize.pixelWidth() * 100;\n        });\n      });\n    };\n    const getPixelWidths = (warehouse, table, tableSize) => {\n      return getWidthFrom(warehouse, table, getPixelWidth$1, deduced => {\n        return deduced.getOrThunk(tableSize.minCellWidth);\n      });\n    };\n    const getHeightFrom = (warehouse, table, getHeight, fallback) => {\n      const rowCells = rows(warehouse);\n      const rows$1 = map$1(warehouse.all, r => Optional.some(r.element));\n      const backups = [Optional.some(height.edge(table))].concat(map$1(height.positions(rowCells, table), pos => pos.map(p => p.y)));\n      return map$1(rows$1, (row, i) => getDimension(row, i, backups, always, getHeight, fallback));\n    };\n    const getPixelHeights = (warehouse, table) => {\n      return getHeightFrom(warehouse, table, getHeight, deduced => {\n        return deduced.getOrThunk(minHeight);\n      });\n    };\n    const getRawHeights = (warehouse, table) => {\n      return getHeightFrom(warehouse, table, getRawH, getDeduced);\n    };\n\n    const widthLookup = (table, getter) => () => {\n      if (inBody(table)) {\n        return getter(table);\n      } else {\n        return parseFloat(getRaw$2(table, 'width').getOr('0'));\n      }\n    };\n    const noneSize = table => {\n      const getWidth = widthLookup(table, get$9);\n      const zero = constant(0);\n      const getWidths = (warehouse, tableSize) => getPixelWidths(warehouse, table, tableSize);\n      return {\n        width: getWidth,\n        pixelWidth: getWidth,\n        getWidths,\n        getCellDelta: zero,\n        singleColumnWidth: constant([0]),\n        minCellWidth: zero,\n        setElementWidth: noop,\n        adjustTableWidth: noop,\n        isRelative: true,\n        label: 'none'\n      };\n    };\n    const percentageSize = table => {\n      const getFloatWidth = widthLookup(table, elem => parseFloat(getPercentTableWidth(elem)));\n      const getWidth = widthLookup(table, get$9);\n      const getCellDelta = delta => delta / getWidth() * 100;\n      const singleColumnWidth = (w, _delta) => [100 - w];\n      const minCellWidth = () => minWidth() / getWidth() * 100;\n      const adjustTableWidth = delta => {\n        const currentWidth = getFloatWidth();\n        const change = delta / 100 * currentWidth;\n        const newWidth = currentWidth + change;\n        setPercentageWidth(table, newWidth);\n      };\n      const getWidths = (warehouse, tableSize) => getPercentageWidths(warehouse, table, tableSize);\n      return {\n        width: getFloatWidth,\n        pixelWidth: getWidth,\n        getWidths,\n        getCellDelta,\n        singleColumnWidth,\n        minCellWidth,\n        setElementWidth: setPercentageWidth,\n        adjustTableWidth,\n        isRelative: true,\n        label: 'percent'\n      };\n    };\n    const pixelSize = table => {\n      const getWidth = widthLookup(table, get$9);\n      const getCellDelta = identity;\n      const singleColumnWidth = (w, delta) => {\n        const newNext = Math.max(minWidth(), w + delta);\n        return [newNext - w];\n      };\n      const adjustTableWidth = delta => {\n        const newWidth = getWidth() + delta;\n        setPixelWidth(table, newWidth);\n      };\n      const getWidths = (warehouse, tableSize) => getPixelWidths(warehouse, table, tableSize);\n      return {\n        width: getWidth,\n        pixelWidth: getWidth,\n        getWidths,\n        getCellDelta,\n        singleColumnWidth,\n        minCellWidth: minWidth,\n        setElementWidth: setPixelWidth,\n        adjustTableWidth,\n        isRelative: false,\n        label: 'pixel'\n      };\n    };\n    const chooseSize = (element, width) => {\n      const percentMatch = percentageBasedSizeRegex().exec(width);\n      if (percentMatch !== null) {\n        return percentageSize(element);\n      } else {\n        return pixelSize(element);\n      }\n    };\n    const getTableSize = table => {\n      const width = getRawWidth$1(table);\n      return width.fold(() => noneSize(table), w => chooseSize(table, w));\n    };\n    const TableSize = {\n      getTableSize,\n      pixelSize,\n      percentageSize,\n      noneSize\n    };\n\n    const statsStruct = (minRow, minCol, maxRow, maxCol, allCells, selectedCells) => ({\n      minRow,\n      minCol,\n      maxRow,\n      maxCol,\n      allCells,\n      selectedCells\n    });\n    const findSelectedStats = (house, isSelected) => {\n      const totalColumns = house.grid.columns;\n      const totalRows = house.grid.rows;\n      let minRow = totalRows;\n      let minCol = totalColumns;\n      let maxRow = 0;\n      let maxCol = 0;\n      const allCells = [];\n      const selectedCells = [];\n      each$1(house.access, detail => {\n        allCells.push(detail);\n        if (isSelected(detail)) {\n          selectedCells.push(detail);\n          const startRow = detail.row;\n          const endRow = startRow + detail.rowspan - 1;\n          const startCol = detail.column;\n          const endCol = startCol + detail.colspan - 1;\n          if (startRow < minRow) {\n            minRow = startRow;\n          } else if (endRow > maxRow) {\n            maxRow = endRow;\n          }\n          if (startCol < minCol) {\n            minCol = startCol;\n          } else if (endCol > maxCol) {\n            maxCol = endCol;\n          }\n        }\n      });\n      return statsStruct(minRow, minCol, maxRow, maxCol, allCells, selectedCells);\n    };\n    const makeCell = (list, seenSelected, rowIndex) => {\n      const row = list[rowIndex].element;\n      const td = SugarElement.fromTag('td');\n      append$1(td, SugarElement.fromTag('br'));\n      const f = seenSelected ? append$1 : prepend;\n      f(row, td);\n    };\n    const fillInGaps = (list, house, stats, isSelected) => {\n      const rows = filter$2(list, row => row.section !== 'colgroup');\n      const totalColumns = house.grid.columns;\n      const totalRows = house.grid.rows;\n      for (let i = 0; i < totalRows; i++) {\n        let seenSelected = false;\n        for (let j = 0; j < totalColumns; j++) {\n          if (!(i < stats.minRow || i > stats.maxRow || j < stats.minCol || j > stats.maxCol)) {\n            const needCell = Warehouse.getAt(house, i, j).filter(isSelected).isNone();\n            if (needCell) {\n              makeCell(rows, seenSelected, i);\n            } else {\n              seenSelected = true;\n            }\n          }\n        }\n      }\n    };\n    const clean = (replica, stats, house, widthDelta) => {\n      each$1(house.columns, col => {\n        if (col.column < stats.minCol || col.column > stats.maxCol) {\n          remove$6(col.element);\n        }\n      });\n      const emptyRows = filter$2(firstLayer(replica, 'tr'), row => row.dom.childElementCount === 0);\n      each$2(emptyRows, remove$6);\n      if (stats.minCol === stats.maxCol || stats.minRow === stats.maxRow) {\n        each$2(firstLayer(replica, 'th,td'), cell => {\n          remove$7(cell, 'rowspan');\n          remove$7(cell, 'colspan');\n        });\n      }\n      remove$7(replica, LOCKED_COL_ATTR);\n      remove$7(replica, 'data-snooker-col-series');\n      const tableSize = TableSize.getTableSize(replica);\n      tableSize.adjustTableWidth(widthDelta);\n    };\n    const getTableWidthDelta = (table, warehouse, tableSize, stats) => {\n      if (stats.minCol === 0 && warehouse.grid.columns === stats.maxCol + 1) {\n        return 0;\n      }\n      const colWidths = getPixelWidths(warehouse, table, tableSize);\n      const allColsWidth = foldl(colWidths, (acc, width) => acc + width, 0);\n      const selectedColsWidth = foldl(colWidths.slice(stats.minCol, stats.maxCol + 1), (acc, width) => acc + width, 0);\n      const newWidth = selectedColsWidth / allColsWidth * tableSize.pixelWidth();\n      const delta = newWidth - tableSize.pixelWidth();\n      return tableSize.getCellDelta(delta);\n    };\n    const extract$1 = (table, selectedSelector) => {\n      const isSelected = detail => is$2(detail.element, selectedSelector);\n      const replica = deep(table);\n      const list = fromTable$1(replica);\n      const tableSize = TableSize.getTableSize(table);\n      const replicaHouse = Warehouse.generate(list);\n      const replicaStats = findSelectedStats(replicaHouse, isSelected);\n      const selector = 'th:not(' + selectedSelector + ')' + ',td:not(' + selectedSelector + ')';\n      const unselectedCells = filterFirstLayer(replica, 'th,td', cell => is$2(cell, selector));\n      each$2(unselectedCells, remove$6);\n      fillInGaps(list, replicaHouse, replicaStats, isSelected);\n      const house = Warehouse.fromTable(table);\n      const widthDelta = getTableWidthDelta(table, house, tableSize, replicaStats);\n      clean(replica, replicaStats, replicaHouse, widthDelta);\n      return replica;\n    };\n\n    const nbsp = '\\xA0';\n\n    const NodeValue = (is, name) => {\n      const get = element => {\n        if (!is(element)) {\n          throw new Error('Can only get ' + name + ' value of a ' + name + ' node');\n        }\n        return getOption(element).getOr('');\n      };\n      const getOption = element => is(element) ? Optional.from(element.dom.nodeValue) : Optional.none();\n      const set = (element, value) => {\n        if (!is(element)) {\n          throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');\n        }\n        element.dom.nodeValue = value;\n      };\n      return {\n        get,\n        getOption,\n        set\n      };\n    };\n\n    const api = NodeValue(isText, 'text');\n    const get$6 = element => api.get(element);\n    const getOption = element => api.getOption(element);\n    const set = (element, value) => api.set(element, value);\n\n    const getEnd = element => name(element) === 'img' ? 1 : getOption(element).fold(() => children$2(element).length, v => v.length);\n    const isTextNodeWithCursorPosition = el => getOption(el).filter(text => text.trim().length !== 0 || text.indexOf(nbsp) > -1).isSome();\n    const isContentEditableFalse = elem => isHTMLElement(elem) && get$b(elem, 'contenteditable') === 'false';\n    const elementsWithCursorPosition = [\n      'img',\n      'br'\n    ];\n    const isCursorPosition = elem => {\n      const hasCursorPosition = isTextNodeWithCursorPosition(elem);\n      return hasCursorPosition || contains$2(elementsWithCursorPosition, name(elem)) || isContentEditableFalse(elem);\n    };\n\n    const first = element => descendant$1(element, isCursorPosition);\n    const last$1 = element => descendantRtl(element, isCursorPosition);\n    const descendantRtl = (scope, predicate) => {\n      const descend = element => {\n        const children = children$2(element);\n        for (let i = children.length - 1; i >= 0; i--) {\n          const child = children[i];\n          if (predicate(child)) {\n            return Optional.some(child);\n          }\n          const res = descend(child);\n          if (res.isSome()) {\n            return res;\n          }\n        }\n        return Optional.none();\n      };\n      return descend(scope);\n    };\n\n    const transferableAttributes = {\n      scope: [\n        'row',\n        'col'\n      ]\n    };\n    const createCell = doc => () => {\n      const td = SugarElement.fromTag('td', doc.dom);\n      append$1(td, SugarElement.fromTag('br', doc.dom));\n      return td;\n    };\n    const createCol = doc => () => {\n      return SugarElement.fromTag('col', doc.dom);\n    };\n    const createColgroup = doc => () => {\n      return SugarElement.fromTag('colgroup', doc.dom);\n    };\n    const createRow$1 = doc => () => {\n      return SugarElement.fromTag('tr', doc.dom);\n    };\n    const replace$1 = (cell, tag, attrs) => {\n      const replica = copy$2(cell, tag);\n      each$1(attrs, (v, k) => {\n        if (v === null) {\n          remove$7(replica, k);\n        } else {\n          set$2(replica, k, v);\n        }\n      });\n      return replica;\n    };\n    const pasteReplace = cell => {\n      return cell;\n    };\n    const cloneFormats = (oldCell, newCell, formats) => {\n      const first$1 = first(oldCell);\n      return first$1.map(firstText => {\n        const formatSelector = formats.join(',');\n        const parents = ancestors$3(firstText, formatSelector, element => {\n          return eq$1(element, oldCell);\n        });\n        return foldr(parents, (last, parent) => {\n          const clonedFormat = shallow(parent);\n          append$1(last, clonedFormat);\n          return clonedFormat;\n        }, newCell);\n      }).getOr(newCell);\n    };\n    const cloneAppropriateAttributes = (original, clone) => {\n      each$1(transferableAttributes, (validAttributes, attributeName) => getOpt(original, attributeName).filter(attribute => contains$2(validAttributes, attribute)).each(attribute => set$2(clone, attributeName, attribute)));\n    };\n    const cellOperations = (mutate, doc, formatsToClone) => {\n      const cloneCss = (prev, clone) => {\n        copy$1(prev.element, clone);\n        remove$5(clone, 'height');\n        if (prev.colspan !== 1) {\n          remove$5(clone, 'width');\n        }\n      };\n      const newCell = prev => {\n        const td = SugarElement.fromTag(name(prev.element), doc.dom);\n        const formats = formatsToClone.getOr([\n          'strong',\n          'em',\n          'b',\n          'i',\n          'span',\n          'font',\n          'h1',\n          'h2',\n          'h3',\n          'h4',\n          'h5',\n          'h6',\n          'p',\n          'div'\n        ]);\n        const lastNode = formats.length > 0 ? cloneFormats(prev.element, td, formats) : td;\n        append$1(lastNode, SugarElement.fromTag('br'));\n        cloneCss(prev, td);\n        cloneAppropriateAttributes(prev.element, td);\n        mutate(prev.element, td);\n        return td;\n      };\n      const newCol = prev => {\n        const col = SugarElement.fromTag(name(prev.element), doc.dom);\n        cloneCss(prev, col);\n        mutate(prev.element, col);\n        return col;\n      };\n      return {\n        col: newCol,\n        colgroup: createColgroup(doc),\n        row: createRow$1(doc),\n        cell: newCell,\n        replace: replace$1,\n        colGap: createCol(doc),\n        gap: createCell(doc)\n      };\n    };\n    const paste$1 = doc => {\n      return {\n        col: createCol(doc),\n        colgroup: createColgroup(doc),\n        row: createRow$1(doc),\n        cell: createCell(doc),\n        replace: pasteReplace,\n        colGap: createCol(doc),\n        gap: createCell(doc)\n      };\n    };\n\n    const fromHtml = (html, scope) => {\n      const doc = scope || document;\n      const div = doc.createElement('div');\n      div.innerHTML = html;\n      return children$2(SugarElement.fromDom(div));\n    };\n    const fromDom = nodes => map$1(nodes, SugarElement.fromDom);\n\n    const option = name => editor => editor.options.get(name);\n    const defaultWidth = '100%';\n    const getPixelForcedWidth = editor => {\n      var _a;\n      const dom = editor.dom;\n      const parentBlock = (_a = dom.getParent(editor.selection.getStart(), dom.isBlock)) !== null && _a !== void 0 ? _a : editor.getBody();\n      return getInner(SugarElement.fromDom(parentBlock)) + 'px';\n    };\n    const determineDefaultTableStyles = (editor, defaultStyles) => {\n      if (isTableResponsiveForced(editor) || !shouldStyleWithCss(editor)) {\n        return defaultStyles;\n      } else if (isTablePixelsForced(editor)) {\n        return {\n          ...defaultStyles,\n          width: getPixelForcedWidth(editor)\n        };\n      } else {\n        return {\n          ...defaultStyles,\n          width: defaultWidth\n        };\n      }\n    };\n    const determineDefaultTableAttributes = (editor, defaultAttributes) => {\n      if (isTableResponsiveForced(editor) || shouldStyleWithCss(editor)) {\n        return defaultAttributes;\n      } else if (isTablePixelsForced(editor)) {\n        return {\n          ...defaultAttributes,\n          width: getPixelForcedWidth(editor)\n        };\n      } else {\n        return {\n          ...defaultAttributes,\n          width: defaultWidth\n        };\n      }\n    };\n    const register = editor => {\n      const registerOption = editor.options.register;\n      registerOption('table_clone_elements', { processor: 'string[]' });\n      registerOption('table_use_colgroups', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('table_header_type', {\n        processor: value => {\n          const valid = contains$2([\n            'section',\n            'cells',\n            'sectionCells',\n            'auto'\n          ], value);\n          return valid ? {\n            value,\n            valid\n          } : {\n            valid: false,\n            message: 'Must be one of: section, cells, sectionCells or auto.'\n          };\n        },\n        default: 'section'\n      });\n      registerOption('table_sizing_mode', {\n        processor: 'string',\n        default: 'auto'\n      });\n      registerOption('table_default_attributes', {\n        processor: 'object',\n        default: { border: '1' }\n      });\n      registerOption('table_default_styles', {\n        processor: 'object',\n        default: { 'border-collapse': 'collapse' }\n      });\n      registerOption('table_column_resizing', {\n        processor: value => {\n          const valid = contains$2([\n            'preservetable',\n            'resizetable'\n          ], value);\n          return valid ? {\n            value,\n            valid\n          } : {\n            valid: false,\n            message: 'Must be preservetable, or resizetable.'\n          };\n        },\n        default: 'preservetable'\n      });\n      registerOption('table_resize_bars', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('table_style_by_css', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('table_merge_content_on_paste', {\n        processor: 'boolean',\n        default: true\n      });\n    };\n    const getTableCloneElements = editor => {\n      return Optional.from(editor.options.get('table_clone_elements'));\n    };\n    const hasTableObjectResizing = editor => {\n      const objectResizing = editor.options.get('object_resizing');\n      return contains$2(objectResizing.split(','), 'table');\n    };\n    const getTableHeaderType = option('table_header_type');\n    const getTableColumnResizingBehaviour = option('table_column_resizing');\n    const isPreserveTableColumnResizing = editor => getTableColumnResizingBehaviour(editor) === 'preservetable';\n    const isResizeTableColumnResizing = editor => getTableColumnResizingBehaviour(editor) === 'resizetable';\n    const getTableSizingMode = option('table_sizing_mode');\n    const isTablePercentagesForced = editor => getTableSizingMode(editor) === 'relative';\n    const isTablePixelsForced = editor => getTableSizingMode(editor) === 'fixed';\n    const isTableResponsiveForced = editor => getTableSizingMode(editor) === 'responsive';\n    const hasTableResizeBars = option('table_resize_bars');\n    const shouldStyleWithCss = option('table_style_by_css');\n    const shouldMergeContentOnPaste = option('table_merge_content_on_paste');\n    const getTableDefaultAttributes = editor => {\n      const options = editor.options;\n      const defaultAttributes = options.get('table_default_attributes');\n      return options.isSet('table_default_attributes') ? defaultAttributes : determineDefaultTableAttributes(editor, defaultAttributes);\n    };\n    const getTableDefaultStyles = editor => {\n      const options = editor.options;\n      const defaultStyles = options.get('table_default_styles');\n      return options.isSet('table_default_styles') ? defaultStyles : determineDefaultTableStyles(editor, defaultStyles);\n    };\n    const tableUseColumnGroup = option('table_use_colgroups');\n\n    const closest = target => closest$1(target, '[contenteditable]');\n    const isEditable$1 = (element, assumeEditable = false) => {\n      if (inBody(element)) {\n        return element.dom.isContentEditable;\n      } else {\n        return closest(element).fold(constant(assumeEditable), editable => getRaw(editable) === 'true');\n      }\n    };\n    const getRaw = element => element.dom.contentEditable;\n\n    const getBody = editor => SugarElement.fromDom(editor.getBody());\n    const getIsRoot = editor => element => eq$1(element, getBody(editor));\n    const removeDataStyle = table => {\n      remove$7(table, 'data-mce-style');\n      const removeStyleAttribute = element => remove$7(element, 'data-mce-style');\n      each$2(cells$1(table), removeStyleAttribute);\n      each$2(columns$1(table), removeStyleAttribute);\n      each$2(rows$1(table), removeStyleAttribute);\n    };\n    const getSelectionStart = editor => SugarElement.fromDom(editor.selection.getStart());\n    const getPixelWidth = elm => elm.getBoundingClientRect().width;\n    const getPixelHeight = elm => elm.getBoundingClientRect().height;\n    const getRawValue = prop => (editor, elm) => {\n      const raw = editor.dom.getStyle(elm, prop) || editor.dom.getAttrib(elm, prop);\n      return Optional.from(raw).filter(isNotEmpty);\n    };\n    const getRawWidth = getRawValue('width');\n    const getRawHeight = getRawValue('height');\n    const isPercentage$1 = value => /^(\\d+(\\.\\d+)?)%$/.test(value);\n    const isPixel = value => /^(\\d+(\\.\\d+)?)px$/.test(value);\n    const isInEditableContext$1 = cell => closest$2(cell, isTag('table')).exists(isEditable$1);\n\n    const inSelection = (bounds, detail) => {\n      const leftEdge = detail.column;\n      const rightEdge = detail.column + detail.colspan - 1;\n      const topEdge = detail.row;\n      const bottomEdge = detail.row + detail.rowspan - 1;\n      return leftEdge <= bounds.finishCol && rightEdge >= bounds.startCol && (topEdge <= bounds.finishRow && bottomEdge >= bounds.startRow);\n    };\n    const isWithin = (bounds, detail) => {\n      return detail.column >= bounds.startCol && detail.column + detail.colspan - 1 <= bounds.finishCol && detail.row >= bounds.startRow && detail.row + detail.rowspan - 1 <= bounds.finishRow;\n    };\n    const isRectangular = (warehouse, bounds) => {\n      let isRect = true;\n      const detailIsWithin = curry(isWithin, bounds);\n      for (let i = bounds.startRow; i <= bounds.finishRow; i++) {\n        for (let j = bounds.startCol; j <= bounds.finishCol; j++) {\n          isRect = isRect && Warehouse.getAt(warehouse, i, j).exists(detailIsWithin);\n        }\n      }\n      return isRect ? Optional.some(bounds) : Optional.none();\n    };\n\n    const getBounds = (detailA, detailB) => {\n      return bounds(Math.min(detailA.row, detailB.row), Math.min(detailA.column, detailB.column), Math.max(detailA.row + detailA.rowspan - 1, detailB.row + detailB.rowspan - 1), Math.max(detailA.column + detailA.colspan - 1, detailB.column + detailB.colspan - 1));\n    };\n    const getAnyBox = (warehouse, startCell, finishCell) => {\n      const startCoords = Warehouse.findItem(warehouse, startCell, eq$1);\n      const finishCoords = Warehouse.findItem(warehouse, finishCell, eq$1);\n      return startCoords.bind(sc => {\n        return finishCoords.map(fc => {\n          return getBounds(sc, fc);\n        });\n      });\n    };\n    const getBox$1 = (warehouse, startCell, finishCell) => {\n      return getAnyBox(warehouse, startCell, finishCell).bind(bounds => {\n        return isRectangular(warehouse, bounds);\n      });\n    };\n\n    const moveBy$1 = (warehouse, cell, row, column) => {\n      return Warehouse.findItem(warehouse, cell, eq$1).bind(detail => {\n        const startRow = row > 0 ? detail.row + detail.rowspan - 1 : detail.row;\n        const startCol = column > 0 ? detail.column + detail.colspan - 1 : detail.column;\n        const dest = Warehouse.getAt(warehouse, startRow + row, startCol + column);\n        return dest.map(d => {\n          return d.element;\n        });\n      });\n    };\n    const intercepts$1 = (warehouse, start, finish) => {\n      return getAnyBox(warehouse, start, finish).map(bounds => {\n        const inside = Warehouse.filterItems(warehouse, curry(inSelection, bounds));\n        return map$1(inside, detail => {\n          return detail.element;\n        });\n      });\n    };\n    const parentCell = (warehouse, innerCell) => {\n      const isContainedBy = (c1, c2) => {\n        return contains$1(c2, c1);\n      };\n      return Warehouse.findItem(warehouse, innerCell, isContainedBy).map(detail => {\n        return detail.element;\n      });\n    };\n\n    const moveBy = (cell, deltaRow, deltaColumn) => {\n      return table(cell).bind(table => {\n        const warehouse = getWarehouse(table);\n        return moveBy$1(warehouse, cell, deltaRow, deltaColumn);\n      });\n    };\n    const intercepts = (table, first, last) => {\n      const warehouse = getWarehouse(table);\n      return intercepts$1(warehouse, first, last);\n    };\n    const nestedIntercepts = (table, first, firstTable, last, lastTable) => {\n      const warehouse = getWarehouse(table);\n      const optStartCell = eq$1(table, firstTable) ? Optional.some(first) : parentCell(warehouse, first);\n      const optLastCell = eq$1(table, lastTable) ? Optional.some(last) : parentCell(warehouse, last);\n      return optStartCell.bind(startCell => optLastCell.bind(lastCell => intercepts$1(warehouse, startCell, lastCell)));\n    };\n    const getBox = (table, first, last) => {\n      const warehouse = getWarehouse(table);\n      return getBox$1(warehouse, first, last);\n    };\n    const getWarehouse = Warehouse.fromTable;\n\n    var TagBoundaries = [\n      'body',\n      'p',\n      'div',\n      'article',\n      'aside',\n      'figcaption',\n      'figure',\n      'footer',\n      'header',\n      'nav',\n      'section',\n      'ol',\n      'ul',\n      'li',\n      'table',\n      'thead',\n      'tbody',\n      'tfoot',\n      'caption',\n      'tr',\n      'td',\n      'th',\n      'h1',\n      'h2',\n      'h3',\n      'h4',\n      'h5',\n      'h6',\n      'blockquote',\n      'pre',\n      'address'\n    ];\n\n    var DomUniverse = () => {\n      const clone = element => {\n        return SugarElement.fromDom(element.dom.cloneNode(false));\n      };\n      const document = element => documentOrOwner(element).dom;\n      const isBoundary = element => {\n        if (!isElement(element)) {\n          return false;\n        }\n        if (name(element) === 'body') {\n          return true;\n        }\n        return contains$2(TagBoundaries, name(element));\n      };\n      const isEmptyTag = element => {\n        if (!isElement(element)) {\n          return false;\n        }\n        return contains$2([\n          'br',\n          'img',\n          'hr',\n          'input'\n        ], name(element));\n      };\n      const isNonEditable = element => isElement(element) && get$b(element, 'contenteditable') === 'false';\n      const comparePosition = (element, other) => {\n        return element.dom.compareDocumentPosition(other.dom);\n      };\n      const copyAttributesTo = (source, destination) => {\n        const as = clone$2(source);\n        setAll$1(destination, as);\n      };\n      const isSpecial = element => {\n        const tag = name(element);\n        return contains$2([\n          'script',\n          'noscript',\n          'iframe',\n          'noframes',\n          'noembed',\n          'title',\n          'style',\n          'textarea',\n          'xmp'\n        ], tag);\n      };\n      const getLanguage = element => isElement(element) ? getOpt(element, 'lang') : Optional.none();\n      return {\n        up: constant({\n          selector: ancestor$1,\n          closest: closest$1,\n          predicate: ancestor$2,\n          all: parents\n        }),\n        down: constant({\n          selector: descendants,\n          predicate: descendants$1\n        }),\n        styles: constant({\n          get: get$a,\n          getRaw: getRaw$2,\n          set: set$1,\n          remove: remove$5\n        }),\n        attrs: constant({\n          get: get$b,\n          set: set$2,\n          remove: remove$7,\n          copyTo: copyAttributesTo\n        }),\n        insert: constant({\n          before: before$3,\n          after: after$5,\n          afterAll: after$4,\n          append: append$1,\n          appendAll: append,\n          prepend: prepend,\n          wrap: wrap\n        }),\n        remove: constant({\n          unwrap: unwrap,\n          remove: remove$6\n        }),\n        create: constant({\n          nu: SugarElement.fromTag,\n          clone,\n          text: SugarElement.fromText\n        }),\n        query: constant({\n          comparePosition,\n          prevSibling: prevSibling,\n          nextSibling: nextSibling\n        }),\n        property: constant({\n          children: children$2,\n          name: name,\n          parent: parent,\n          document,\n          isText: isText,\n          isComment: isComment,\n          isElement: isElement,\n          isSpecial,\n          getLanguage,\n          getText: get$6,\n          setText: set,\n          isBoundary,\n          isEmptyTag,\n          isNonEditable\n        }),\n        eq: eq$1,\n        is: is$1\n      };\n    };\n\n    const all = (universe, look, elements, f) => {\n      const head = elements[0];\n      const tail = elements.slice(1);\n      return f(universe, look, head, tail);\n    };\n    const oneAll = (universe, look, elements) => {\n      return elements.length > 0 ? all(universe, look, elements, unsafeOne) : Optional.none();\n    };\n    const unsafeOne = (universe, look, head, tail) => {\n      const start = look(universe, head);\n      return foldr(tail, (b, a) => {\n        const current = look(universe, a);\n        return commonElement(universe, b, current);\n      }, start);\n    };\n    const commonElement = (universe, start, end) => {\n      return start.bind(s => {\n        return end.filter(curry(universe.eq, s));\n      });\n    };\n\n    const eq = (universe, item) => {\n      return curry(universe.eq, item);\n    };\n    const ancestors$2 = (universe, start, end, isRoot = never) => {\n      const ps1 = [start].concat(universe.up().all(start));\n      const ps2 = [end].concat(universe.up().all(end));\n      const prune = path => {\n        const index = findIndex(path, isRoot);\n        return index.fold(() => {\n          return path;\n        }, ind => {\n          return path.slice(0, ind + 1);\n        });\n      };\n      const pruned1 = prune(ps1);\n      const pruned2 = prune(ps2);\n      const shared = find$1(pruned1, x => {\n        return exists(pruned2, eq(universe, x));\n      });\n      return {\n        firstpath: pruned1,\n        secondpath: pruned2,\n        shared\n      };\n    };\n\n    const sharedOne$1 = oneAll;\n    const ancestors$1 = ancestors$2;\n\n    const universe$3 = DomUniverse();\n    const sharedOne = (look, elements) => {\n      return sharedOne$1(universe$3, (_universe, element) => {\n        return look(element);\n      }, elements);\n    };\n    const ancestors = (start, finish, isRoot) => {\n      return ancestors$1(universe$3, start, finish, isRoot);\n    };\n\n    const lookupTable = container => {\n      return ancestor$1(container, 'table');\n    };\n    const identify = (start, finish, isRoot) => {\n      const getIsRoot = rootTable => {\n        return element => {\n          return isRoot !== undefined && isRoot(element) || eq$1(element, rootTable);\n        };\n      };\n      if (eq$1(start, finish)) {\n        return Optional.some({\n          boxes: Optional.some([start]),\n          start,\n          finish\n        });\n      } else {\n        return lookupTable(start).bind(startTable => {\n          return lookupTable(finish).bind(finishTable => {\n            if (eq$1(startTable, finishTable)) {\n              return Optional.some({\n                boxes: intercepts(startTable, start, finish),\n                start,\n                finish\n              });\n            } else if (contains$1(startTable, finishTable)) {\n              const ancestorCells = ancestors$3(finish, 'td,th', getIsRoot(startTable));\n              const finishCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : finish;\n              return Optional.some({\n                boxes: nestedIntercepts(startTable, start, startTable, finish, finishTable),\n                start,\n                finish: finishCell\n              });\n            } else if (contains$1(finishTable, startTable)) {\n              const ancestorCells = ancestors$3(start, 'td,th', getIsRoot(finishTable));\n              const startCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : start;\n              return Optional.some({\n                boxes: nestedIntercepts(finishTable, start, startTable, finish, finishTable),\n                start,\n                finish: startCell\n              });\n            } else {\n              return ancestors(start, finish).shared.bind(lca => {\n                return closest$1(lca, 'table', isRoot).bind(lcaTable => {\n                  const finishAncestorCells = ancestors$3(finish, 'td,th', getIsRoot(lcaTable));\n                  const finishCell = finishAncestorCells.length > 0 ? finishAncestorCells[finishAncestorCells.length - 1] : finish;\n                  const startAncestorCells = ancestors$3(start, 'td,th', getIsRoot(lcaTable));\n                  const startCell = startAncestorCells.length > 0 ? startAncestorCells[startAncestorCells.length - 1] : start;\n                  return Optional.some({\n                    boxes: nestedIntercepts(lcaTable, start, startTable, finish, finishTable),\n                    start: startCell,\n                    finish: finishCell\n                  });\n                });\n              });\n            }\n          });\n        });\n      }\n    };\n    const retrieve$1 = (container, selector) => {\n      const sels = descendants(container, selector);\n      return sels.length > 0 ? Optional.some(sels) : Optional.none();\n    };\n    const getLast = (boxes, lastSelectedSelector) => {\n      return find$1(boxes, box => {\n        return is$2(box, lastSelectedSelector);\n      });\n    };\n    const getEdges = (container, firstSelectedSelector, lastSelectedSelector) => {\n      return descendant(container, firstSelectedSelector).bind(first => {\n        return descendant(container, lastSelectedSelector).bind(last => {\n          return sharedOne(lookupTable, [\n            first,\n            last\n          ]).map(table => {\n            return {\n              first,\n              last,\n              table\n            };\n          });\n        });\n      });\n    };\n    const expandTo = (finish, firstSelectedSelector) => {\n      return ancestor$1(finish, 'table').bind(table => {\n        return descendant(table, firstSelectedSelector).bind(start => {\n          return identify(start, finish).bind(identified => {\n            return identified.boxes.map(boxes => {\n              return {\n                boxes,\n                start: identified.start,\n                finish: identified.finish\n              };\n            });\n          });\n        });\n      });\n    };\n    const shiftSelection = (boxes, deltaRow, deltaColumn, firstSelectedSelector, lastSelectedSelector) => {\n      return getLast(boxes, lastSelectedSelector).bind(last => {\n        return moveBy(last, deltaRow, deltaColumn).bind(finish => {\n          return expandTo(finish, firstSelectedSelector);\n        });\n      });\n    };\n\n    const retrieve = (container, selector) => {\n      return retrieve$1(container, selector);\n    };\n    const retrieveBox = (container, firstSelectedSelector, lastSelectedSelector) => {\n      return getEdges(container, firstSelectedSelector, lastSelectedSelector).bind(edges => {\n        const isRoot = ancestor => {\n          return eq$1(container, ancestor);\n        };\n        const sectionSelector = 'thead,tfoot,tbody,table';\n        const firstAncestor = ancestor$1(edges.first, sectionSelector, isRoot);\n        const lastAncestor = ancestor$1(edges.last, sectionSelector, isRoot);\n        return firstAncestor.bind(fA => {\n          return lastAncestor.bind(lA => {\n            return eq$1(fA, lA) ? getBox(edges.table, edges.first, edges.last) : Optional.none();\n          });\n        });\n      });\n    };\n\n    const selection = identity;\n    const unmergable = selectedCells => {\n      const hasSpan = (elem, type) => getOpt(elem, type).exists(span => parseInt(span, 10) > 1);\n      const hasRowOrColSpan = elem => hasSpan(elem, 'rowspan') || hasSpan(elem, 'colspan');\n      return selectedCells.length > 0 && forall(selectedCells, hasRowOrColSpan) ? Optional.some(selectedCells) : Optional.none();\n    };\n    const mergable = (table, selectedCells, ephemera) => {\n      if (selectedCells.length <= 1) {\n        return Optional.none();\n      } else {\n        return retrieveBox(table, ephemera.firstSelectedSelector, ephemera.lastSelectedSelector).map(bounds => ({\n          bounds,\n          cells: selectedCells\n        }));\n      }\n    };\n\n    const strSelected = 'data-mce-selected';\n    const strSelectedSelector = 'td[' + strSelected + '],th[' + strSelected + ']';\n    const strAttributeSelector = '[' + strSelected + ']';\n    const strFirstSelected = 'data-mce-first-selected';\n    const strFirstSelectedSelector = 'td[' + strFirstSelected + '],th[' + strFirstSelected + ']';\n    const strLastSelected = 'data-mce-last-selected';\n    const strLastSelectedSelector = 'td[' + strLastSelected + '],th[' + strLastSelected + ']';\n    const attributeSelector = strAttributeSelector;\n    const ephemera = {\n      selected: strSelected,\n      selectedSelector: strSelectedSelector,\n      firstSelected: strFirstSelected,\n      firstSelectedSelector: strFirstSelectedSelector,\n      lastSelected: strLastSelected,\n      lastSelectedSelector: strLastSelectedSelector\n    };\n\n    const forMenu = (selectedCells, table, cell) => ({\n      element: cell,\n      mergable: mergable(table, selectedCells, ephemera),\n      unmergable: unmergable(selectedCells),\n      selection: selection(selectedCells)\n    });\n    const paste = (element, clipboard, generators) => ({\n      element,\n      clipboard,\n      generators\n    });\n    const pasteRows = (selectedCells, _cell, clipboard, generators) => ({\n      selection: selection(selectedCells),\n      clipboard,\n      generators\n    });\n\n    const getSelectionCellFallback = element => table(element).bind(table => retrieve(table, ephemera.firstSelectedSelector)).fold(constant(element), cells => cells[0]);\n    const getSelectionFromSelector = selector => (initCell, isRoot) => {\n      const cellName = name(initCell);\n      const cell = cellName === 'col' || cellName === 'colgroup' ? getSelectionCellFallback(initCell) : initCell;\n      return closest$1(cell, selector, isRoot);\n    };\n    const getSelectionCellOrCaption = getSelectionFromSelector('th,td,caption');\n    const getSelectionCell = getSelectionFromSelector('th,td');\n    const getCellsFromSelection = editor => fromDom(editor.model.table.getSelectedCells());\n    const getCellsFromFakeSelection = editor => filter$2(getCellsFromSelection(editor), cell => is$2(cell, ephemera.selectedSelector));\n\n    const extractSelected = cells => {\n      return table(cells[0]).map(table => {\n        const replica = extract$1(table, attributeSelector);\n        removeDataStyle(replica);\n        return [replica];\n      });\n    };\n    const serializeElements = (editor, elements) => map$1(elements, elm => editor.selection.serializer.serialize(elm.dom, {})).join('');\n    const getTextContent = elements => map$1(elements, element => element.dom.innerText).join('');\n    const registerEvents = (editor, actions) => {\n      editor.on('BeforeGetContent', e => {\n        const multiCellContext = cells => {\n          e.preventDefault();\n          extractSelected(cells).each(elements => {\n            e.content = e.format === 'text' ? getTextContent(elements) : serializeElements(editor, elements);\n          });\n        };\n        if (e.selection === true) {\n          const cells = getCellsFromFakeSelection(editor);\n          if (cells.length >= 1) {\n            multiCellContext(cells);\n          }\n        }\n      });\n      editor.on('BeforeSetContent', e => {\n        if (e.selection === true && e.paste === true) {\n          const selectedCells = getCellsFromSelection(editor);\n          head(selectedCells).each(cell => {\n            table(cell).each(table => {\n              const elements = filter$2(fromHtml(e.content), content => {\n                return name(content) !== 'meta';\n              });\n              const isTable = isTag('table');\n              if (shouldMergeContentOnPaste(editor) && elements.length === 1 && isTable(elements[0])) {\n                e.preventDefault();\n                const doc = SugarElement.fromDom(editor.getDoc());\n                const generators = paste$1(doc);\n                const targets = paste(cell, elements[0], generators);\n                actions.pasteCells(table, targets).each(() => {\n                  editor.focus();\n                });\n              }\n            });\n          });\n        }\n      });\n    };\n\n    const point = (element, offset) => ({\n      element,\n      offset\n    });\n\n    const scan$1 = (universe, element, direction) => {\n      if (universe.property().isText(element) && universe.property().getText(element).trim().length === 0 || universe.property().isComment(element)) {\n        return direction(element).bind(elem => {\n          return scan$1(universe, elem, direction).orThunk(() => {\n            return Optional.some(elem);\n          });\n        });\n      } else {\n        return Optional.none();\n      }\n    };\n    const toEnd = (universe, element) => {\n      if (universe.property().isText(element)) {\n        return universe.property().getText(element).length;\n      }\n      const children = universe.property().children(element);\n      return children.length;\n    };\n    const freefallRtl$2 = (universe, element) => {\n      const candidate = scan$1(universe, element, universe.query().prevSibling).getOr(element);\n      if (universe.property().isText(candidate)) {\n        return point(candidate, toEnd(universe, candidate));\n      }\n      const children = universe.property().children(candidate);\n      return children.length > 0 ? freefallRtl$2(universe, children[children.length - 1]) : point(candidate, toEnd(universe, candidate));\n    };\n\n    const freefallRtl$1 = freefallRtl$2;\n\n    const universe$2 = DomUniverse();\n    const freefallRtl = element => {\n      return freefallRtl$1(universe$2, element);\n    };\n\n    const halve = (main, other) => {\n      if (!hasColspan(main)) {\n        const width = getGenericWidth(main);\n        width.each(w => {\n          const newWidth = w.value / 2;\n          setGenericWidth(main, newWidth, w.unit);\n          setGenericWidth(other, newWidth, w.unit);\n        });\n      }\n    };\n\n    const zero = array => map$1(array, constant(0));\n    const surround = (sizes, startIndex, endIndex, results, f) => f(sizes.slice(0, startIndex)).concat(results).concat(f(sizes.slice(endIndex)));\n    const clampDeltaHelper = predicate => (sizes, index, delta, minCellSize) => {\n      if (!predicate(delta)) {\n        return delta;\n      } else {\n        const newSize = Math.max(minCellSize, sizes[index] - Math.abs(delta));\n        const diff = Math.abs(newSize - sizes[index]);\n        return delta >= 0 ? diff : -diff;\n      }\n    };\n    const clampNegativeDelta = clampDeltaHelper(delta => delta < 0);\n    const clampDelta = clampDeltaHelper(always);\n    const resizeTable = () => {\n      const calcFixedDeltas = (sizes, index, next, delta, minCellSize) => {\n        const clampedDelta = clampNegativeDelta(sizes, index, delta, minCellSize);\n        return surround(sizes, index, next + 1, [\n          clampedDelta,\n          0\n        ], zero);\n      };\n      const calcRelativeDeltas = (sizes, index, delta, minCellSize) => {\n        const ratio = (100 + delta) / 100;\n        const newThis = Math.max(minCellSize, (sizes[index] + delta) / ratio);\n        return map$1(sizes, (size, idx) => {\n          const newSize = idx === index ? newThis : size / ratio;\n          return newSize - size;\n        });\n      };\n      const calcLeftEdgeDeltas = (sizes, index, next, delta, minCellSize, isRelative) => {\n        if (isRelative) {\n          return calcRelativeDeltas(sizes, index, delta, minCellSize);\n        } else {\n          return calcFixedDeltas(sizes, index, next, delta, minCellSize);\n        }\n      };\n      const calcMiddleDeltas = (sizes, _prev, index, next, delta, minCellSize, isRelative) => calcLeftEdgeDeltas(sizes, index, next, delta, minCellSize, isRelative);\n      const resizeTable = (resizer, delta) => resizer(delta);\n      const calcRightEdgeDeltas = (sizes, _prev, index, delta, minCellSize, isRelative) => {\n        if (isRelative) {\n          return calcRelativeDeltas(sizes, index, delta, minCellSize);\n        } else {\n          const clampedDelta = clampNegativeDelta(sizes, index, delta, minCellSize);\n          return zero(sizes.slice(0, index)).concat([clampedDelta]);\n        }\n      };\n      const calcRedestributedWidths = (sizes, totalWidth, pixelDelta, isRelative) => {\n        if (isRelative) {\n          const tableWidth = totalWidth + pixelDelta;\n          const ratio = tableWidth / totalWidth;\n          const newSizes = map$1(sizes, size => size / ratio);\n          return {\n            delta: ratio * 100 - 100,\n            newSizes\n          };\n        } else {\n          return {\n            delta: pixelDelta,\n            newSizes: sizes\n          };\n        }\n      };\n      return {\n        resizeTable,\n        clampTableDelta: clampNegativeDelta,\n        calcLeftEdgeDeltas,\n        calcMiddleDeltas,\n        calcRightEdgeDeltas,\n        calcRedestributedWidths\n      };\n    };\n    const preserveTable = () => {\n      const calcLeftEdgeDeltas = (sizes, index, next, delta, minCellSize) => {\n        const idx = delta >= 0 ? next : index;\n        const clampedDelta = clampDelta(sizes, idx, delta, minCellSize);\n        return surround(sizes, index, next + 1, [\n          clampedDelta,\n          -clampedDelta\n        ], zero);\n      };\n      const calcMiddleDeltas = (sizes, _prev, index, next, delta, minCellSize) => calcLeftEdgeDeltas(sizes, index, next, delta, minCellSize);\n      const resizeTable = (resizer, delta, isLastColumn) => {\n        if (isLastColumn) {\n          resizer(delta);\n        }\n      };\n      const calcRightEdgeDeltas = (sizes, _prev, _index, delta, _minCellSize, isRelative) => {\n        if (isRelative) {\n          return zero(sizes);\n        } else {\n          const diff = delta / sizes.length;\n          return map$1(sizes, constant(diff));\n        }\n      };\n      const clampTableDelta = (sizes, index, delta, minCellSize, isLastColumn) => {\n        if (isLastColumn) {\n          if (delta >= 0) {\n            return delta;\n          } else {\n            const maxDelta = foldl(sizes, (a, b) => a + b - minCellSize, 0);\n            return Math.max(-maxDelta, delta);\n          }\n        } else {\n          return clampNegativeDelta(sizes, index, delta, minCellSize);\n        }\n      };\n      const calcRedestributedWidths = (sizes, _totalWidth, _pixelDelta, _isRelative) => ({\n        delta: 0,\n        newSizes: sizes\n      });\n      return {\n        resizeTable,\n        clampTableDelta,\n        calcLeftEdgeDeltas,\n        calcMiddleDeltas,\n        calcRightEdgeDeltas,\n        calcRedestributedWidths\n      };\n    };\n\n    const getGridSize = table => {\n      const warehouse = Warehouse.fromTable(table);\n      return warehouse.grid;\n    };\n\n    const isHeaderCell = isTag('th');\n    const isHeaderCells = cells => forall(cells, cell => isHeaderCell(cell.element));\n    const getRowHeaderType = (isHeaderRow, isHeaderCells) => {\n      if (isHeaderRow && isHeaderCells) {\n        return 'sectionCells';\n      } else if (isHeaderRow) {\n        return 'section';\n      } else {\n        return 'cells';\n      }\n    };\n    const getRowType = row => {\n      const isHeaderRow = row.section === 'thead';\n      const isHeaderCells = is(findCommonCellType(row.cells), 'th');\n      if (row.section === 'tfoot') {\n        return { type: 'footer' };\n      } else if (isHeaderRow || isHeaderCells) {\n        return {\n          type: 'header',\n          subType: getRowHeaderType(isHeaderRow, isHeaderCells)\n        };\n      } else {\n        return { type: 'body' };\n      }\n    };\n    const findCommonCellType = cells => {\n      const headerCells = filter$2(cells, cell => isHeaderCell(cell.element));\n      if (headerCells.length === 0) {\n        return Optional.some('td');\n      } else if (headerCells.length === cells.length) {\n        return Optional.some('th');\n      } else {\n        return Optional.none();\n      }\n    };\n    const findCommonRowType = rows => {\n      const rowTypes = map$1(rows, row => getRowType(row).type);\n      const hasHeader = contains$2(rowTypes, 'header');\n      const hasFooter = contains$2(rowTypes, 'footer');\n      if (!hasHeader && !hasFooter) {\n        return Optional.some('body');\n      } else {\n        const hasBody = contains$2(rowTypes, 'body');\n        if (hasHeader && !hasBody && !hasFooter) {\n          return Optional.some('header');\n        } else if (!hasHeader && !hasBody && hasFooter) {\n          return Optional.some('footer');\n        } else {\n          return Optional.none();\n        }\n      }\n    };\n    const findTableRowHeaderType = warehouse => findMap(warehouse.all, row => {\n      const rowType = getRowType(row);\n      return rowType.type === 'header' ? Optional.from(rowType.subType) : Optional.none();\n    });\n\n    const transformCell = (cell, comparator, substitution) => elementnew(substitution(cell.element, comparator), true, cell.isLocked);\n    const transformRow = (row, section) => row.section !== section ? rowcells(row.element, row.cells, section, row.isNew) : row;\n    const section = () => ({\n      transformRow,\n      transformCell: (cell, comparator, substitution) => {\n        const newCell = substitution(cell.element, comparator);\n        const fixedCell = name(newCell) !== 'td' ? mutate$1(newCell, 'td') : newCell;\n        return elementnew(fixedCell, cell.isNew, cell.isLocked);\n      }\n    });\n    const sectionCells = () => ({\n      transformRow,\n      transformCell\n    });\n    const cells = () => ({\n      transformRow: (row, section) => {\n        const newSection = section === 'thead' ? 'tbody' : section;\n        return transformRow(row, newSection);\n      },\n      transformCell\n    });\n    const fallback = () => ({\n      transformRow: identity,\n      transformCell\n    });\n    const getTableSectionType = (table, fallback) => {\n      const warehouse = Warehouse.fromTable(table);\n      const type = findTableRowHeaderType(warehouse).getOr(fallback);\n      switch (type) {\n      case 'section':\n        return section();\n      case 'sectionCells':\n        return sectionCells();\n      case 'cells':\n        return cells();\n      }\n    };\n    const TableSection = {\n      getTableSectionType,\n      section,\n      sectionCells,\n      cells,\n      fallback\n    };\n\n    const setIfNot = (element, property, value, ignore) => {\n      if (value === ignore) {\n        remove$7(element, property);\n      } else {\n        set$2(element, property, value);\n      }\n    };\n    const insert$1 = (table, selector, element) => {\n      last$2(children(table, selector)).fold(() => prepend(table, element), child => after$5(child, element));\n    };\n    const generateSection = (table, sectionName) => {\n      const section = child(table, sectionName).getOrThunk(() => {\n        const newSection = SugarElement.fromTag(sectionName, owner(table).dom);\n        if (sectionName === 'thead') {\n          insert$1(table, 'caption,colgroup', newSection);\n        } else if (sectionName === 'colgroup') {\n          insert$1(table, 'caption', newSection);\n        } else {\n          append$1(table, newSection);\n        }\n        return newSection;\n      });\n      empty(section);\n      return section;\n    };\n    const render$1 = (table, grid) => {\n      const newRows = [];\n      const newCells = [];\n      const syncRows = gridSection => map$1(gridSection, row => {\n        if (row.isNew) {\n          newRows.push(row.element);\n        }\n        const tr = row.element;\n        empty(tr);\n        each$2(row.cells, cell => {\n          if (cell.isNew) {\n            newCells.push(cell.element);\n          }\n          setIfNot(cell.element, 'colspan', cell.colspan, 1);\n          setIfNot(cell.element, 'rowspan', cell.rowspan, 1);\n          append$1(tr, cell.element);\n        });\n        return tr;\n      });\n      const syncColGroup = gridSection => bind$2(gridSection, colGroup => map$1(colGroup.cells, col => {\n        setIfNot(col.element, 'span', col.colspan, 1);\n        return col.element;\n      }));\n      const renderSection = (gridSection, sectionName) => {\n        const section = generateSection(table, sectionName);\n        const sync = sectionName === 'colgroup' ? syncColGroup : syncRows;\n        const sectionElems = sync(gridSection);\n        append(section, sectionElems);\n      };\n      const removeSection = sectionName => {\n        child(table, sectionName).each(remove$6);\n      };\n      const renderOrRemoveSection = (gridSection, sectionName) => {\n        if (gridSection.length > 0) {\n          renderSection(gridSection, sectionName);\n        } else {\n          removeSection(sectionName);\n        }\n      };\n      const headSection = [];\n      const bodySection = [];\n      const footSection = [];\n      const columnGroupsSection = [];\n      each$2(grid, row => {\n        switch (row.section) {\n        case 'thead':\n          headSection.push(row);\n          break;\n        case 'tbody':\n          bodySection.push(row);\n          break;\n        case 'tfoot':\n          footSection.push(row);\n          break;\n        case 'colgroup':\n          columnGroupsSection.push(row);\n          break;\n        }\n      });\n      renderOrRemoveSection(columnGroupsSection, 'colgroup');\n      renderOrRemoveSection(headSection, 'thead');\n      renderOrRemoveSection(bodySection, 'tbody');\n      renderOrRemoveSection(footSection, 'tfoot');\n      return {\n        newRows,\n        newCells\n      };\n    };\n    const copy = grid => map$1(grid, row => {\n      const tr = shallow(row.element);\n      each$2(row.cells, cell => {\n        const clonedCell = deep(cell.element);\n        setIfNot(clonedCell, 'colspan', cell.colspan, 1);\n        setIfNot(clonedCell, 'rowspan', cell.rowspan, 1);\n        append$1(tr, clonedCell);\n      });\n      return tr;\n    });\n\n    const getColumn = (grid, index) => {\n      return map$1(grid, row => {\n        return getCell(row, index);\n      });\n    };\n    const getRow = (grid, index) => {\n      return grid[index];\n    };\n    const findDiff = (xs, comp) => {\n      if (xs.length === 0) {\n        return 0;\n      }\n      const first = xs[0];\n      const index = findIndex(xs, x => {\n        return !comp(first.element, x.element);\n      });\n      return index.getOr(xs.length);\n    };\n    const subgrid = (grid, row, column, comparator) => {\n      const gridRow = getRow(grid, row);\n      const isColRow = gridRow.section === 'colgroup';\n      const colspan = findDiff(gridRow.cells.slice(column), comparator);\n      const rowspan = isColRow ? 1 : findDiff(getColumn(grid.slice(row), column), comparator);\n      return {\n        colspan,\n        rowspan\n      };\n    };\n\n    const toDetails = (grid, comparator) => {\n      const seen = map$1(grid, row => map$1(row.cells, never));\n      const updateSeen = (rowIndex, columnIndex, rowspan, colspan) => {\n        for (let row = rowIndex; row < rowIndex + rowspan; row++) {\n          for (let column = columnIndex; column < columnIndex + colspan; column++) {\n            seen[row][column] = true;\n          }\n        }\n      };\n      return map$1(grid, (row, rowIndex) => {\n        const details = bind$2(row.cells, (cell, columnIndex) => {\n          if (seen[rowIndex][columnIndex] === false) {\n            const result = subgrid(grid, rowIndex, columnIndex, comparator);\n            updateSeen(rowIndex, columnIndex, result.rowspan, result.colspan);\n            return [detailnew(cell.element, result.rowspan, result.colspan, cell.isNew)];\n          } else {\n            return [];\n          }\n        });\n        return rowdetailnew(row.element, details, row.section, row.isNew);\n      });\n    };\n    const toGrid = (warehouse, generators, isNew) => {\n      const grid = [];\n      each$2(warehouse.colgroups, colgroup => {\n        const colgroupCols = [];\n        for (let columnIndex = 0; columnIndex < warehouse.grid.columns; columnIndex++) {\n          const element = Warehouse.getColumnAt(warehouse, columnIndex).map(column => elementnew(column.element, isNew, false)).getOrThunk(() => elementnew(generators.colGap(), true, false));\n          colgroupCols.push(element);\n        }\n        grid.push(rowcells(colgroup.element, colgroupCols, 'colgroup', isNew));\n      });\n      for (let rowIndex = 0; rowIndex < warehouse.grid.rows; rowIndex++) {\n        const rowCells = [];\n        for (let columnIndex = 0; columnIndex < warehouse.grid.columns; columnIndex++) {\n          const element = Warehouse.getAt(warehouse, rowIndex, columnIndex).map(item => elementnew(item.element, isNew, item.isLocked)).getOrThunk(() => elementnew(generators.gap(), true, false));\n          rowCells.push(element);\n        }\n        const rowDetail = warehouse.all[rowIndex];\n        const row = rowcells(rowDetail.element, rowCells, rowDetail.section, isNew);\n        grid.push(row);\n      }\n      return grid;\n    };\n\n    const fromWarehouse = (warehouse, generators) => toGrid(warehouse, generators, false);\n    const toDetailList = grid => toDetails(grid, eq$1);\n    const findInWarehouse = (warehouse, element) => findMap(warehouse.all, r => find$1(r.cells, e => eq$1(element, e.element)));\n    const extractCells = (warehouse, target, predicate) => {\n      const details = map$1(target.selection, cell$1 => {\n        return cell(cell$1).bind(lc => findInWarehouse(warehouse, lc)).filter(predicate);\n      });\n      const cells = cat(details);\n      return someIf(cells.length > 0, cells);\n    };\n    const run = (operation, extract, adjustment, postAction, genWrappers) => (table, target, generators, behaviours) => {\n      const warehouse = Warehouse.fromTable(table);\n      const tableSection = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.section).getOrThunk(TableSection.fallback);\n      const output = extract(warehouse, target).map(info => {\n        const model = fromWarehouse(warehouse, generators);\n        const result = operation(model, info, eq$1, genWrappers(generators), tableSection);\n        const lockedColumns = getLockedColumnsFromGrid(result.grid);\n        const grid = toDetailList(result.grid);\n        return {\n          info,\n          grid,\n          cursor: result.cursor,\n          lockedColumns\n        };\n      });\n      return output.bind(out => {\n        const newElements = render$1(table, out.grid);\n        const tableSizing = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.sizing).getOrThunk(() => TableSize.getTableSize(table));\n        const resizing = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.resize).getOrThunk(preserveTable);\n        adjustment(table, out.grid, out.info, {\n          sizing: tableSizing,\n          resize: resizing,\n          section: tableSection\n        });\n        postAction(table);\n        remove$7(table, LOCKED_COL_ATTR);\n        if (out.lockedColumns.length > 0) {\n          set$2(table, LOCKED_COL_ATTR, out.lockedColumns.join(','));\n        }\n        return Optional.some({\n          cursor: out.cursor,\n          newRows: newElements.newRows,\n          newCells: newElements.newCells\n        });\n      });\n    };\n    const onPaste = (warehouse, target) => cell(target.element).bind(cell => findInWarehouse(warehouse, cell).map(details => {\n      const value = {\n        ...details,\n        generators: target.generators,\n        clipboard: target.clipboard\n      };\n      return value;\n    }));\n    const onPasteByEditor = (warehouse, target) => extractCells(warehouse, target, always).map(cells => ({\n      cells,\n      generators: target.generators,\n      clipboard: target.clipboard\n    }));\n    const onMergable = (_warehouse, target) => target.mergable;\n    const onUnmergable = (_warehouse, target) => target.unmergable;\n    const onCells = (warehouse, target) => extractCells(warehouse, target, always);\n    const onUnlockedCells = (warehouse, target) => extractCells(warehouse, target, detail => !detail.isLocked);\n    const isUnlockedTableCell = (warehouse, cell) => findInWarehouse(warehouse, cell).exists(detail => !detail.isLocked);\n    const allUnlocked = (warehouse, cells) => forall(cells, cell => isUnlockedTableCell(warehouse, cell));\n    const onUnlockedMergable = (warehouse, target) => onMergable(warehouse, target).filter(mergeable => allUnlocked(warehouse, mergeable.cells));\n    const onUnlockedUnmergable = (warehouse, target) => onUnmergable(warehouse, target).filter(cells => allUnlocked(warehouse, cells));\n\n    const merge$2 = (grid, bounds, comparator, substitution) => {\n      const rows = extractGridDetails(grid).rows;\n      if (rows.length === 0) {\n        return grid;\n      }\n      for (let i = bounds.startRow; i <= bounds.finishRow; i++) {\n        for (let j = bounds.startCol; j <= bounds.finishCol; j++) {\n          const row = rows[i];\n          const isLocked = getCell(row, j).isLocked;\n          mutateCell(row, j, elementnew(substitution(), false, isLocked));\n        }\n      }\n      return grid;\n    };\n    const unmerge = (grid, target, comparator, substitution) => {\n      const rows = extractGridDetails(grid).rows;\n      let first = true;\n      for (let i = 0; i < rows.length; i++) {\n        for (let j = 0; j < cellLength(rows[0]); j++) {\n          const row = rows[i];\n          const currentCell = getCell(row, j);\n          const currentCellElm = currentCell.element;\n          const isToReplace = comparator(currentCellElm, target);\n          if (isToReplace && !first) {\n            mutateCell(row, j, elementnew(substitution(), true, currentCell.isLocked));\n          } else if (isToReplace) {\n            first = false;\n          }\n        }\n      }\n      return grid;\n    };\n    const uniqueCells = (row, comparator) => {\n      return foldl(row, (rest, cell) => {\n        return exists(rest, currentCell => {\n          return comparator(currentCell.element, cell.element);\n        }) ? rest : rest.concat([cell]);\n      }, []);\n    };\n    const splitCols = (grid, index, comparator, substitution) => {\n      if (index > 0 && index < grid[0].cells.length) {\n        each$2(grid, row => {\n          const prevCell = row.cells[index - 1];\n          let offset = 0;\n          const substitute = substitution();\n          while (row.cells.length > index + offset && comparator(prevCell.element, row.cells[index + offset].element)) {\n            mutateCell(row, index + offset, elementnew(substitute, true, row.cells[index + offset].isLocked));\n            offset++;\n          }\n        });\n      }\n      return grid;\n    };\n    const splitRows = (grid, index, comparator, substitution) => {\n      const rows = extractGridDetails(grid).rows;\n      if (index > 0 && index < rows.length) {\n        const rowPrevCells = rows[index - 1].cells;\n        const cells = uniqueCells(rowPrevCells, comparator);\n        each$2(cells, cell => {\n          let replacement = Optional.none();\n          for (let i = index; i < rows.length; i++) {\n            for (let j = 0; j < cellLength(rows[0]); j++) {\n              const row = rows[i];\n              const current = getCell(row, j);\n              const isToReplace = comparator(current.element, cell.element);\n              if (isToReplace) {\n                if (replacement.isNone()) {\n                  replacement = Optional.some(substitution());\n                }\n                replacement.each(sub => {\n                  mutateCell(row, j, elementnew(sub, true, current.isLocked));\n                });\n              }\n            }\n          }\n        });\n      }\n      return grid;\n    };\n\n    const value$1 = value => {\n      const applyHelper = fn => fn(value);\n      const constHelper = constant(value);\n      const outputHelper = () => output;\n      const output = {\n        tag: true,\n        inner: value,\n        fold: (_onError, onValue) => onValue(value),\n        isValue: always,\n        isError: never,\n        map: mapper => Result.value(mapper(value)),\n        mapError: outputHelper,\n        bind: applyHelper,\n        exists: applyHelper,\n        forall: applyHelper,\n        getOr: constHelper,\n        or: outputHelper,\n        getOrThunk: constHelper,\n        orThunk: outputHelper,\n        getOrDie: constHelper,\n        each: fn => {\n          fn(value);\n        },\n        toOptional: () => Optional.some(value)\n      };\n      return output;\n    };\n    const error = error => {\n      const outputHelper = () => output;\n      const output = {\n        tag: false,\n        inner: error,\n        fold: (onError, _onValue) => onError(error),\n        isValue: never,\n        isError: always,\n        map: outputHelper,\n        mapError: mapper => Result.error(mapper(error)),\n        bind: outputHelper,\n        exists: never,\n        forall: always,\n        getOr: identity,\n        or: identity,\n        getOrThunk: apply,\n        orThunk: apply,\n        getOrDie: die(String(error)),\n        each: noop,\n        toOptional: Optional.none\n      };\n      return output;\n    };\n    const fromOption = (optional, err) => optional.fold(() => error(err), value$1);\n    const Result = {\n      value: value$1,\n      error,\n      fromOption\n    };\n\n    const measure = (startAddress, gridA, gridB) => {\n      if (startAddress.row >= gridA.length || startAddress.column > cellLength(gridA[0])) {\n        return Result.error('invalid start address out of table bounds, row: ' + startAddress.row + ', column: ' + startAddress.column);\n      }\n      const rowRemainder = gridA.slice(startAddress.row);\n      const colRemainder = rowRemainder[0].cells.slice(startAddress.column);\n      const colRequired = cellLength(gridB[0]);\n      const rowRequired = gridB.length;\n      return Result.value({\n        rowDelta: rowRemainder.length - rowRequired,\n        colDelta: colRemainder.length - colRequired\n      });\n    };\n    const measureWidth = (gridA, gridB) => {\n      const colLengthA = cellLength(gridA[0]);\n      const colLengthB = cellLength(gridB[0]);\n      return {\n        rowDelta: 0,\n        colDelta: colLengthA - colLengthB\n      };\n    };\n    const measureHeight = (gridA, gridB) => {\n      const rowLengthA = gridA.length;\n      const rowLengthB = gridB.length;\n      return {\n        rowDelta: rowLengthA - rowLengthB,\n        colDelta: 0\n      };\n    };\n    const generateElements = (amount, row, generators, isLocked) => {\n      const generator = row.section === 'colgroup' ? generators.col : generators.cell;\n      return range$1(amount, idx => elementnew(generator(), true, isLocked(idx)));\n    };\n    const rowFill = (grid, amount, generators, lockedColumns) => {\n      const exampleRow = grid[grid.length - 1];\n      return grid.concat(range$1(amount, () => {\n        const generator = exampleRow.section === 'colgroup' ? generators.colgroup : generators.row;\n        const row = clone(exampleRow, generator, identity);\n        const elements = generateElements(row.cells.length, row, generators, idx => has$1(lockedColumns, idx.toString()));\n        return setCells(row, elements);\n      }));\n    };\n    const colFill = (grid, amount, generators, startIndex) => map$1(grid, row => {\n      const newChildren = generateElements(amount, row, generators, never);\n      return addCells(row, startIndex, newChildren);\n    });\n    const lockedColFill = (grid, generators, lockedColumns) => map$1(grid, row => {\n      return foldl(lockedColumns, (acc, colNum) => {\n        const newChild = generateElements(1, row, generators, always)[0];\n        return addCell(acc, colNum, newChild);\n      }, row);\n    });\n    const tailor = (gridA, delta, generators) => {\n      const fillCols = delta.colDelta < 0 ? colFill : identity;\n      const fillRows = delta.rowDelta < 0 ? rowFill : identity;\n      const lockedColumns = getLockedColumnsFromGrid(gridA);\n      const gridWidth = cellLength(gridA[0]);\n      const isLastColLocked = exists(lockedColumns, locked => locked === gridWidth - 1);\n      const modifiedCols = fillCols(gridA, Math.abs(delta.colDelta), generators, isLastColLocked ? gridWidth - 1 : gridWidth);\n      const newLockedColumns = getLockedColumnsFromGrid(modifiedCols);\n      return fillRows(modifiedCols, Math.abs(delta.rowDelta), generators, mapToObject(newLockedColumns, always));\n    };\n\n    const isSpanning = (grid, row, col, comparator) => {\n      const candidate = getCell(grid[row], col);\n      const matching = curry(comparator, candidate.element);\n      const currentRow = grid[row];\n      return grid.length > 1 && cellLength(currentRow) > 1 && (col > 0 && matching(getCellElement(currentRow, col - 1)) || col < currentRow.cells.length - 1 && matching(getCellElement(currentRow, col + 1)) || row > 0 && matching(getCellElement(grid[row - 1], col)) || row < grid.length - 1 && matching(getCellElement(grid[row + 1], col)));\n    };\n    const mergeTables = (startAddress, gridA, gridBRows, generator, comparator, lockedColumns) => {\n      const startRow = startAddress.row;\n      const startCol = startAddress.column;\n      const mergeHeight = gridBRows.length;\n      const mergeWidth = cellLength(gridBRows[0]);\n      const endRow = startRow + mergeHeight;\n      const endCol = startCol + mergeWidth + lockedColumns.length;\n      const lockedColumnObj = mapToObject(lockedColumns, always);\n      for (let r = startRow; r < endRow; r++) {\n        let skippedCol = 0;\n        for (let c = startCol; c < endCol; c++) {\n          if (lockedColumnObj[c]) {\n            skippedCol++;\n            continue;\n          }\n          if (isSpanning(gridA, r, c, comparator)) {\n            unmerge(gridA, getCellElement(gridA[r], c), comparator, generator.cell);\n          }\n          const gridBColIndex = c - startCol - skippedCol;\n          const newCell = getCell(gridBRows[r - startRow], gridBColIndex);\n          const newCellElm = newCell.element;\n          const replacement = generator.replace(newCellElm);\n          mutateCell(gridA[r], c, elementnew(replacement, true, newCell.isLocked));\n        }\n      }\n      return gridA;\n    };\n    const getValidStartAddress = (currentStartAddress, grid, lockedColumns) => {\n      const gridColLength = cellLength(grid[0]);\n      const adjustedRowAddress = extractGridDetails(grid).cols.length + currentStartAddress.row;\n      const possibleColAddresses = range$1(gridColLength - currentStartAddress.column, num => num + currentStartAddress.column);\n      const validColAddress = find$1(possibleColAddresses, num => forall(lockedColumns, col => col !== num)).getOr(gridColLength - 1);\n      return {\n        row: adjustedRowAddress,\n        column: validColAddress\n      };\n    };\n    const getLockedColumnsWithinBounds = (startAddress, rows, lockedColumns) => filter$2(lockedColumns, colNum => colNum >= startAddress.column && colNum <= cellLength(rows[0]) + startAddress.column);\n    const merge$1 = (startAddress, gridA, gridB, generator, comparator) => {\n      const lockedColumns = getLockedColumnsFromGrid(gridA);\n      const validStartAddress = getValidStartAddress(startAddress, gridA, lockedColumns);\n      const gridBRows = extractGridDetails(gridB).rows;\n      const lockedColumnsWithinBounds = getLockedColumnsWithinBounds(validStartAddress, gridBRows, lockedColumns);\n      const result = measure(validStartAddress, gridA, gridBRows);\n      return result.map(diff => {\n        const delta = {\n          ...diff,\n          colDelta: diff.colDelta - lockedColumnsWithinBounds.length\n        };\n        const fittedGrid = tailor(gridA, delta, generator);\n        const newLockedColumns = getLockedColumnsFromGrid(fittedGrid);\n        const newLockedColumnsWithinBounds = getLockedColumnsWithinBounds(validStartAddress, gridBRows, newLockedColumns);\n        return mergeTables(validStartAddress, fittedGrid, gridBRows, generator, comparator, newLockedColumnsWithinBounds);\n      });\n    };\n    const insertCols = (index, gridA, gridB, generator, comparator) => {\n      splitCols(gridA, index, comparator, generator.cell);\n      const delta = measureHeight(gridB, gridA);\n      const fittedNewGrid = tailor(gridB, delta, generator);\n      const secondDelta = measureHeight(gridA, fittedNewGrid);\n      const fittedOldGrid = tailor(gridA, secondDelta, generator);\n      return map$1(fittedOldGrid, (gridRow, i) => {\n        return addCells(gridRow, index, fittedNewGrid[i].cells);\n      });\n    };\n    const insertRows = (index, gridA, gridB, generator, comparator) => {\n      splitRows(gridA, index, comparator, generator.cell);\n      const locked = getLockedColumnsFromGrid(gridA);\n      const diff = measureWidth(gridA, gridB);\n      const delta = {\n        ...diff,\n        colDelta: diff.colDelta - locked.length\n      };\n      const fittedOldGrid = tailor(gridA, delta, generator);\n      const {\n        cols: oldCols,\n        rows: oldRows\n      } = extractGridDetails(fittedOldGrid);\n      const newLocked = getLockedColumnsFromGrid(fittedOldGrid);\n      const secondDiff = measureWidth(gridB, gridA);\n      const secondDelta = {\n        ...secondDiff,\n        colDelta: secondDiff.colDelta + newLocked.length\n      };\n      const fittedGridB = lockedColFill(gridB, generator, newLocked);\n      const fittedNewGrid = tailor(fittedGridB, secondDelta, generator);\n      return [\n        ...oldCols,\n        ...oldRows.slice(0, index),\n        ...fittedNewGrid,\n        ...oldRows.slice(index, oldRows.length)\n      ];\n    };\n\n    const cloneRow = (row, cloneCell, comparator, substitution) => clone(row, elem => substitution(elem, comparator), cloneCell);\n    const insertRowAt = (grid, index, example, comparator, substitution) => {\n      const {rows, cols} = extractGridDetails(grid);\n      const before = rows.slice(0, index);\n      const after = rows.slice(index);\n      const newRow = cloneRow(rows[example], (ex, c) => {\n        const withinSpan = index > 0 && index < rows.length && comparator(getCellElement(rows[index - 1], c), getCellElement(rows[index], c));\n        const ret = withinSpan ? getCell(rows[index], c) : elementnew(substitution(ex.element, comparator), true, ex.isLocked);\n        return ret;\n      }, comparator, substitution);\n      return [\n        ...cols,\n        ...before,\n        newRow,\n        ...after\n      ];\n    };\n    const getElementFor = (row, column, section, withinSpan, example, comparator, substitution) => {\n      if (section === 'colgroup' || !withinSpan) {\n        const cell = getCell(row, example);\n        return elementnew(substitution(cell.element, comparator), true, false);\n      } else {\n        return getCell(row, column);\n      }\n    };\n    const insertColumnAt = (grid, index, example, comparator, substitution) => map$1(grid, row => {\n      const withinSpan = index > 0 && index < cellLength(row) && comparator(getCellElement(row, index - 1), getCellElement(row, index));\n      const sub = getElementFor(row, index, row.section, withinSpan, example, comparator, substitution);\n      return addCell(row, index, sub);\n    });\n    const deleteColumnsAt = (grid, columns) => bind$2(grid, row => {\n      const existingCells = row.cells;\n      const cells = foldr(columns, (acc, column) => column >= 0 && column < acc.length ? acc.slice(0, column).concat(acc.slice(column + 1)) : acc, existingCells);\n      return cells.length > 0 ? [rowcells(row.element, cells, row.section, row.isNew)] : [];\n    });\n    const deleteRowsAt = (grid, start, finish) => {\n      const {rows, cols} = extractGridDetails(grid);\n      return [\n        ...cols,\n        ...rows.slice(0, start),\n        ...rows.slice(finish + 1)\n      ];\n    };\n\n    const notInStartRow = (grid, rowIndex, colIndex, comparator) => getCellElement(grid[rowIndex], colIndex) !== undefined && (rowIndex > 0 && comparator(getCellElement(grid[rowIndex - 1], colIndex), getCellElement(grid[rowIndex], colIndex)));\n    const notInStartColumn = (row, index, comparator) => index > 0 && comparator(getCellElement(row, index - 1), getCellElement(row, index));\n    const isDuplicatedCell = (grid, rowIndex, colIndex, comparator) => notInStartRow(grid, rowIndex, colIndex, comparator) || notInStartColumn(grid[rowIndex], colIndex, comparator);\n    const rowReplacerPredicate = (targetRow, columnHeaders) => {\n      const entireTableIsHeader = forall(columnHeaders, identity) && isHeaderCells(targetRow.cells);\n      return entireTableIsHeader ? always : (cell, _rowIndex, colIndex) => {\n        const type = name(cell.element);\n        return !(type === 'th' && columnHeaders[colIndex]);\n      };\n    };\n    const columnReplacePredicate = (targetColumn, rowHeaders) => {\n      const entireTableIsHeader = forall(rowHeaders, identity) && isHeaderCells(targetColumn);\n      return entireTableIsHeader ? always : (cell, rowIndex, _colIndex) => {\n        const type = name(cell.element);\n        return !(type === 'th' && rowHeaders[rowIndex]);\n      };\n    };\n    const determineScope = (applyScope, cell, newScope, isInHeader) => {\n      const hasSpan = scope => scope === 'row' ? hasRowspan(cell) : hasColspan(cell);\n      const getScope = scope => hasSpan(scope) ? `${ scope }group` : scope;\n      if (applyScope) {\n        return isHeaderCell(cell) ? getScope(newScope) : null;\n      } else if (isInHeader && isHeaderCell(cell)) {\n        const oppositeScope = newScope === 'row' ? 'col' : 'row';\n        return getScope(oppositeScope);\n      } else {\n        return null;\n      }\n    };\n    const rowScopeGenerator = (applyScope, columnHeaders) => (cell, rowIndex, columnIndex) => Optional.some(determineScope(applyScope, cell.element, 'col', columnHeaders[columnIndex]));\n    const columnScopeGenerator = (applyScope, rowHeaders) => (cell, rowIndex) => Optional.some(determineScope(applyScope, cell.element, 'row', rowHeaders[rowIndex]));\n    const replace = (cell, comparator, substitute) => elementnew(substitute(cell.element, comparator), true, cell.isLocked);\n    const replaceIn = (grid, targets, comparator, substitute, replacer, genScope, shouldReplace) => {\n      const isTarget = cell => {\n        return exists(targets, target => {\n          return comparator(cell.element, target.element);\n        });\n      };\n      return map$1(grid, (row, rowIndex) => {\n        return mapCells(row, (cell, colIndex) => {\n          if (isTarget(cell)) {\n            const newCell = shouldReplace(cell, rowIndex, colIndex) ? replacer(cell, comparator, substitute) : cell;\n            genScope(newCell, rowIndex, colIndex).each(scope => {\n              setOptions(newCell.element, { scope: Optional.from(scope) });\n            });\n            return newCell;\n          } else {\n            return cell;\n          }\n        });\n      });\n    };\n    const getColumnCells = (rows, columnIndex, comparator) => bind$2(rows, (row, i) => {\n      return isDuplicatedCell(rows, i, columnIndex, comparator) ? [] : [getCell(row, columnIndex)];\n    });\n    const getRowCells = (rows, rowIndex, comparator) => {\n      const targetRow = rows[rowIndex];\n      return bind$2(targetRow.cells, (item, i) => {\n        return isDuplicatedCell(rows, rowIndex, i, comparator) ? [] : [item];\n      });\n    };\n    const replaceColumns = (grid, indexes, applyScope, comparator, substitution) => {\n      const rows = extractGridDetails(grid).rows;\n      const targets = bind$2(indexes, index => getColumnCells(rows, index, comparator));\n      const rowHeaders = map$1(rows, row => isHeaderCells(row.cells));\n      const shouldReplaceCell = columnReplacePredicate(targets, rowHeaders);\n      const scopeGenerator = columnScopeGenerator(applyScope, rowHeaders);\n      return replaceIn(grid, targets, comparator, substitution, replace, scopeGenerator, shouldReplaceCell);\n    };\n    const replaceRows = (grid, indexes, section, applyScope, comparator, substitution, tableSection) => {\n      const {cols, rows} = extractGridDetails(grid);\n      const targetRow = rows[indexes[0]];\n      const targets = bind$2(indexes, index => getRowCells(rows, index, comparator));\n      const columnHeaders = map$1(targetRow.cells, (_cell, index) => isHeaderCells(getColumnCells(rows, index, comparator)));\n      const newRows = [...rows];\n      each$2(indexes, index => {\n        newRows[index] = tableSection.transformRow(rows[index], section);\n      });\n      const newGrid = [\n        ...cols,\n        ...newRows\n      ];\n      const shouldReplaceCell = rowReplacerPredicate(targetRow, columnHeaders);\n      const scopeGenerator = rowScopeGenerator(applyScope, columnHeaders);\n      return replaceIn(newGrid, targets, comparator, substitution, tableSection.transformCell, scopeGenerator, shouldReplaceCell);\n    };\n    const replaceCells = (grid, details, comparator, substitution) => {\n      const rows = extractGridDetails(grid).rows;\n      const targetCells = map$1(details, detail => getCell(rows[detail.row], detail.column));\n      return replaceIn(grid, targetCells, comparator, substitution, replace, Optional.none, always);\n    };\n\n    const generate = cases => {\n      if (!isArray(cases)) {\n        throw new Error('cases must be an array');\n      }\n      if (cases.length === 0) {\n        throw new Error('there must be at least one case');\n      }\n      const constructors = [];\n      const adt = {};\n      each$2(cases, (acase, count) => {\n        const keys$1 = keys(acase);\n        if (keys$1.length !== 1) {\n          throw new Error('one and only one name per case');\n        }\n        const key = keys$1[0];\n        const value = acase[key];\n        if (adt[key] !== undefined) {\n          throw new Error('duplicate key detected:' + key);\n        } else if (key === 'cata') {\n          throw new Error('cannot have a case named cata (sorry)');\n        } else if (!isArray(value)) {\n          throw new Error('case arguments must be an array');\n        }\n        constructors.push(key);\n        adt[key] = (...args) => {\n          const argLength = args.length;\n          if (argLength !== value.length) {\n            throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);\n          }\n          const match = branches => {\n            const branchKeys = keys(branches);\n            if (constructors.length !== branchKeys.length) {\n              throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\\nActual: ' + branchKeys.join(','));\n            }\n            const allReqd = forall(constructors, reqKey => {\n              return contains$2(branchKeys, reqKey);\n            });\n            if (!allReqd) {\n              throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\\nRequired: ' + constructors.join(', '));\n            }\n            return branches[key].apply(null, args);\n          };\n          return {\n            fold: (...foldArgs) => {\n              if (foldArgs.length !== cases.length) {\n                throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length);\n              }\n              const target = foldArgs[count];\n              return target.apply(null, args);\n            },\n            match,\n            log: label => {\n              console.log(label, {\n                constructors,\n                constructor: key,\n                params: args\n              });\n            }\n          };\n        };\n      });\n      return adt;\n    };\n    const Adt = { generate };\n\n    const adt$6 = Adt.generate([\n      { none: [] },\n      { only: ['index'] },\n      {\n        left: [\n          'index',\n          'next'\n        ]\n      },\n      {\n        middle: [\n          'prev',\n          'index',\n          'next'\n        ]\n      },\n      {\n        right: [\n          'prev',\n          'index'\n        ]\n      }\n    ]);\n    const ColumnContext = { ...adt$6 };\n\n    const neighbours = (input, index) => {\n      if (input.length === 0) {\n        return ColumnContext.none();\n      }\n      if (input.length === 1) {\n        return ColumnContext.only(0);\n      }\n      if (index === 0) {\n        return ColumnContext.left(0, 1);\n      }\n      if (index === input.length - 1) {\n        return ColumnContext.right(index - 1, index);\n      }\n      if (index > 0 && index < input.length - 1) {\n        return ColumnContext.middle(index - 1, index, index + 1);\n      }\n      return ColumnContext.none();\n    };\n    const determine = (input, column, step, tableSize, resize) => {\n      const result = input.slice(0);\n      const context = neighbours(input, column);\n      const onNone = constant(map$1(result, constant(0)));\n      const onOnly = index => tableSize.singleColumnWidth(result[index], step);\n      const onLeft = (index, next) => resize.calcLeftEdgeDeltas(result, index, next, step, tableSize.minCellWidth(), tableSize.isRelative);\n      const onMiddle = (prev, index, next) => resize.calcMiddleDeltas(result, prev, index, next, step, tableSize.minCellWidth(), tableSize.isRelative);\n      const onRight = (prev, index) => resize.calcRightEdgeDeltas(result, prev, index, step, tableSize.minCellWidth(), tableSize.isRelative);\n      return context.fold(onNone, onOnly, onLeft, onMiddle, onRight);\n    };\n\n    const total = (start, end, measures) => {\n      let r = 0;\n      for (let i = start; i < end; i++) {\n        r += measures[i] !== undefined ? measures[i] : 0;\n      }\n      return r;\n    };\n    const recalculateWidthForCells = (warehouse, widths) => {\n      const all = Warehouse.justCells(warehouse);\n      return map$1(all, cell => {\n        const width = total(cell.column, cell.column + cell.colspan, widths);\n        return {\n          element: cell.element,\n          width,\n          colspan: cell.colspan\n        };\n      });\n    };\n    const recalculateWidthForColumns = (warehouse, widths) => {\n      const groups = Warehouse.justColumns(warehouse);\n      return map$1(groups, (column, index) => ({\n        element: column.element,\n        width: widths[index],\n        colspan: column.colspan\n      }));\n    };\n    const matchRowHeight = (warehouse, heights) => {\n      return map$1(warehouse.all, (row, i) => {\n        return {\n          element: row.element,\n          height: heights[i]\n        };\n      });\n    };\n\n    const sumUp = newSize => foldr(newSize, (b, a) => b + a, 0);\n    const recalculate = (warehouse, widths) => {\n      if (Warehouse.hasColumns(warehouse)) {\n        return recalculateWidthForColumns(warehouse, widths);\n      } else {\n        return recalculateWidthForCells(warehouse, widths);\n      }\n    };\n    const recalculateAndApply = (warehouse, widths, tableSize) => {\n      const newSizes = recalculate(warehouse, widths);\n      each$2(newSizes, cell => {\n        tableSize.setElementWidth(cell.element, cell.width);\n      });\n    };\n    const adjustWidth = (table, delta, index, resizing, tableSize) => {\n      const warehouse = Warehouse.fromTable(table);\n      const step = tableSize.getCellDelta(delta);\n      const widths = tableSize.getWidths(warehouse, tableSize);\n      const isLastColumn = index === warehouse.grid.columns - 1;\n      const clampedStep = resizing.clampTableDelta(widths, index, step, tableSize.minCellWidth(), isLastColumn);\n      const deltas = determine(widths, index, clampedStep, tableSize, resizing);\n      const newWidths = map$1(deltas, (dx, i) => dx + widths[i]);\n      recalculateAndApply(warehouse, newWidths, tableSize);\n      resizing.resizeTable(tableSize.adjustTableWidth, clampedStep, isLastColumn);\n    };\n    const adjustHeight = (table, delta, index) => {\n      const warehouse = Warehouse.fromTable(table);\n      const heights = getPixelHeights(warehouse, table);\n      const newHeights = map$1(heights, (dy, i) => index === i ? Math.max(delta + dy, minHeight()) : dy);\n      const newRowSizes = matchRowHeight(warehouse, newHeights);\n      each$2(newRowSizes, row => {\n        setHeight(row.element, row.height);\n      });\n      each$2(Warehouse.justCells(warehouse), cell => {\n        removeHeight(cell.element);\n      });\n      const total = sumUp(newHeights);\n      setHeight(table, total);\n    };\n    const adjustAndRedistributeWidths$1 = (_table, list, details, tableSize, resizeBehaviour) => {\n      const warehouse = Warehouse.generate(list);\n      const sizes = tableSize.getWidths(warehouse, tableSize);\n      const tablePixelWidth = tableSize.pixelWidth();\n      const {newSizes, delta} = resizeBehaviour.calcRedestributedWidths(sizes, tablePixelWidth, details.pixelDelta, tableSize.isRelative);\n      recalculateAndApply(warehouse, newSizes, tableSize);\n      tableSize.adjustTableWidth(delta);\n    };\n    const adjustWidthTo = (_table, list, _info, tableSize) => {\n      const warehouse = Warehouse.generate(list);\n      const widths = tableSize.getWidths(warehouse, tableSize);\n      recalculateAndApply(warehouse, widths, tableSize);\n    };\n\n    const uniqueColumns = details => {\n      const uniqueCheck = (rest, detail) => {\n        const columnExists = exists(rest, currentDetail => currentDetail.column === detail.column);\n        return columnExists ? rest : rest.concat([detail]);\n      };\n      return foldl(details, uniqueCheck, []).sort((detailA, detailB) => detailA.column - detailB.column);\n    };\n\n    const isCol = isTag('col');\n    const isColgroup = isTag('colgroup');\n    const isRow$1 = element => name(element) === 'tr' || isColgroup(element);\n    const elementToData = element => {\n      const colspan = getAttrValue(element, 'colspan', 1);\n      const rowspan = getAttrValue(element, 'rowspan', 1);\n      return {\n        element,\n        colspan,\n        rowspan\n      };\n    };\n    const modification = (generators, toData = elementToData) => {\n      const nuCell = data => isCol(data.element) ? generators.col(data) : generators.cell(data);\n      const nuRow = data => isColgroup(data.element) ? generators.colgroup(data) : generators.row(data);\n      const add = element => {\n        if (isRow$1(element)) {\n          return nuRow({ element });\n        } else {\n          const cell = element;\n          const replacement = nuCell(toData(cell));\n          recent = Optional.some({\n            item: cell,\n            replacement\n          });\n          return replacement;\n        }\n      };\n      let recent = Optional.none();\n      const getOrInit = (element, comparator) => {\n        return recent.fold(() => {\n          return add(element);\n        }, p => {\n          return comparator(element, p.item) ? p.replacement : add(element);\n        });\n      };\n      return { getOrInit };\n    };\n    const transform$1 = tag => {\n      return generators => {\n        const list = [];\n        const find = (element, comparator) => {\n          return find$1(list, x => {\n            return comparator(x.item, element);\n          });\n        };\n        const makeNew = element => {\n          const attrs = tag === 'td' ? { scope: null } : {};\n          const cell = generators.replace(element, tag, attrs);\n          list.push({\n            item: element,\n            sub: cell\n          });\n          return cell;\n        };\n        const replaceOrInit = (element, comparator) => {\n          if (isRow$1(element) || isCol(element)) {\n            return element;\n          } else {\n            const cell = element;\n            return find(cell, comparator).fold(() => {\n              return makeNew(cell);\n            }, p => {\n              return comparator(element, p.item) ? p.sub : makeNew(cell);\n            });\n          }\n        };\n        return { replaceOrInit };\n      };\n    };\n    const getScopeAttribute = cell => getOpt(cell, 'scope').map(attribute => attribute.substr(0, 3));\n    const merging = generators => {\n      const unmerge = cell => {\n        const scope = getScopeAttribute(cell);\n        scope.each(attribute => set$2(cell, 'scope', attribute));\n        return () => {\n          const raw = generators.cell({\n            element: cell,\n            colspan: 1,\n            rowspan: 1\n          });\n          remove$5(raw, 'width');\n          remove$5(cell, 'width');\n          scope.each(attribute => set$2(raw, 'scope', attribute));\n          return raw;\n        };\n      };\n      const merge = cells => {\n        const getScopeProperty = () => {\n          const stringAttributes = cat(map$1(cells, getScopeAttribute));\n          if (stringAttributes.length === 0) {\n            return Optional.none();\n          } else {\n            const baseScope = stringAttributes[0];\n            const scopes = [\n              'row',\n              'col'\n            ];\n            const isMixed = exists(stringAttributes, attribute => {\n              return attribute !== baseScope && contains$2(scopes, attribute);\n            });\n            return isMixed ? Optional.none() : Optional.from(baseScope);\n          }\n        };\n        remove$5(cells[0], 'width');\n        getScopeProperty().fold(() => remove$7(cells[0], 'scope'), attribute => set$2(cells[0], 'scope', attribute + 'group'));\n        return constant(cells[0]);\n      };\n      return {\n        unmerge,\n        merge\n      };\n    };\n    const Generators = {\n      modification,\n      transform: transform$1,\n      merging\n    };\n\n    const blockList = [\n      'body',\n      'p',\n      'div',\n      'article',\n      'aside',\n      'figcaption',\n      'figure',\n      'footer',\n      'header',\n      'nav',\n      'section',\n      'ol',\n      'ul',\n      'table',\n      'thead',\n      'tfoot',\n      'tbody',\n      'caption',\n      'tr',\n      'td',\n      'th',\n      'h1',\n      'h2',\n      'h3',\n      'h4',\n      'h5',\n      'h6',\n      'blockquote',\n      'pre',\n      'address'\n    ];\n    const isList$1 = (universe, item) => {\n      const tagName = universe.property().name(item);\n      return contains$2([\n        'ol',\n        'ul'\n      ], tagName);\n    };\n    const isBlock$1 = (universe, item) => {\n      const tagName = universe.property().name(item);\n      return contains$2(blockList, tagName);\n    };\n    const isEmptyTag$1 = (universe, item) => {\n      return contains$2([\n        'br',\n        'img',\n        'hr',\n        'input'\n      ], universe.property().name(item));\n    };\n\n    const universe$1 = DomUniverse();\n    const isBlock = element => {\n      return isBlock$1(universe$1, element);\n    };\n    const isList = element => {\n      return isList$1(universe$1, element);\n    };\n    const isEmptyTag = element => {\n      return isEmptyTag$1(universe$1, element);\n    };\n\n    const merge = cells => {\n      const isBr = isTag('br');\n      const advancedBr = children => {\n        return forall(children, c => {\n          return isBr(c) || isText(c) && get$6(c).trim().length === 0;\n        });\n      };\n      const isListItem = el => {\n        return name(el) === 'li' || ancestor$2(el, isList).isSome();\n      };\n      const siblingIsBlock = el => {\n        return nextSibling(el).map(rightSibling => {\n          if (isBlock(rightSibling)) {\n            return true;\n          }\n          if (isEmptyTag(rightSibling)) {\n            return name(rightSibling) === 'img' ? false : true;\n          }\n          return false;\n        }).getOr(false);\n      };\n      const markCell = cell => {\n        return last$1(cell).bind(rightEdge => {\n          const rightSiblingIsBlock = siblingIsBlock(rightEdge);\n          return parent(rightEdge).map(parent => {\n            return rightSiblingIsBlock === true || isListItem(parent) || isBr(rightEdge) || isBlock(parent) && !eq$1(cell, parent) ? [] : [SugarElement.fromTag('br')];\n          });\n        }).getOr([]);\n      };\n      const markContent = () => {\n        const content = bind$2(cells, cell => {\n          const children = children$2(cell);\n          return advancedBr(children) ? [] : children.concat(markCell(cell));\n        });\n        return content.length === 0 ? [SugarElement.fromTag('br')] : content;\n      };\n      const contents = markContent();\n      empty(cells[0]);\n      append(cells[0], contents);\n    };\n\n    const isEditable = elem => isEditable$1(elem, true);\n    const prune = table => {\n      const cells = cells$1(table);\n      if (cells.length === 0) {\n        remove$6(table);\n      }\n    };\n    const outcome = (grid, cursor) => ({\n      grid,\n      cursor\n    });\n    const findEditableCursorPosition = rows => findMap(rows, row => findMap(row.cells, cell => {\n      const elem = cell.element;\n      return someIf(isEditable(elem), elem);\n    }));\n    const elementFromGrid = (grid, row, column) => {\n      var _a, _b;\n      const rows = extractGridDetails(grid).rows;\n      return Optional.from((_b = (_a = rows[row]) === null || _a === void 0 ? void 0 : _a.cells[column]) === null || _b === void 0 ? void 0 : _b.element).filter(isEditable).orThunk(() => findEditableCursorPosition(rows));\n    };\n    const bundle = (grid, row, column) => {\n      const cursorElement = elementFromGrid(grid, row, column);\n      return outcome(grid, cursorElement);\n    };\n    const uniqueRows = details => {\n      const rowCompilation = (rest, detail) => {\n        const rowExists = exists(rest, currentDetail => currentDetail.row === detail.row);\n        return rowExists ? rest : rest.concat([detail]);\n      };\n      return foldl(details, rowCompilation, []).sort((detailA, detailB) => detailA.row - detailB.row);\n    };\n    const opInsertRowsBefore = (grid, details, comparator, genWrappers) => {\n      const targetIndex = details[0].row;\n      const rows = uniqueRows(details);\n      const newGrid = foldr(rows, (acc, row) => {\n        const newG = insertRowAt(acc.grid, targetIndex, row.row + acc.delta, comparator, genWrappers.getOrInit);\n        return {\n          grid: newG,\n          delta: acc.delta + 1\n        };\n      }, {\n        grid,\n        delta: 0\n      }).grid;\n      return bundle(newGrid, targetIndex, details[0].column);\n    };\n    const opInsertRowsAfter = (grid, details, comparator, genWrappers) => {\n      const rows = uniqueRows(details);\n      const target = rows[rows.length - 1];\n      const targetIndex = target.row + target.rowspan;\n      const newGrid = foldr(rows, (newG, row) => {\n        return insertRowAt(newG, targetIndex, row.row, comparator, genWrappers.getOrInit);\n      }, grid);\n      return bundle(newGrid, targetIndex, details[0].column);\n    };\n    const opInsertColumnsBefore = (grid, extractDetail, comparator, genWrappers) => {\n      const details = extractDetail.details;\n      const columns = uniqueColumns(details);\n      const targetIndex = columns[0].column;\n      const newGrid = foldr(columns, (acc, col) => {\n        const newG = insertColumnAt(acc.grid, targetIndex, col.column + acc.delta, comparator, genWrappers.getOrInit);\n        return {\n          grid: newG,\n          delta: acc.delta + 1\n        };\n      }, {\n        grid,\n        delta: 0\n      }).grid;\n      return bundle(newGrid, details[0].row, targetIndex);\n    };\n    const opInsertColumnsAfter = (grid, extractDetail, comparator, genWrappers) => {\n      const details = extractDetail.details;\n      const target = details[details.length - 1];\n      const targetIndex = target.column + target.colspan;\n      const columns = uniqueColumns(details);\n      const newGrid = foldr(columns, (newG, col) => {\n        return insertColumnAt(newG, targetIndex, col.column, comparator, genWrappers.getOrInit);\n      }, grid);\n      return bundle(newGrid, details[0].row, targetIndex);\n    };\n    const opMakeColumnsHeader = (initialGrid, details, comparator, genWrappers) => {\n      const columns = uniqueColumns(details);\n      const columnIndexes = map$1(columns, detail => detail.column);\n      const newGrid = replaceColumns(initialGrid, columnIndexes, true, comparator, genWrappers.replaceOrInit);\n      return bundle(newGrid, details[0].row, details[0].column);\n    };\n    const opMakeCellsHeader = (initialGrid, details, comparator, genWrappers) => {\n      const newGrid = replaceCells(initialGrid, details, comparator, genWrappers.replaceOrInit);\n      return bundle(newGrid, details[0].row, details[0].column);\n    };\n    const opUnmakeColumnsHeader = (initialGrid, details, comparator, genWrappers) => {\n      const columns = uniqueColumns(details);\n      const columnIndexes = map$1(columns, detail => detail.column);\n      const newGrid = replaceColumns(initialGrid, columnIndexes, false, comparator, genWrappers.replaceOrInit);\n      return bundle(newGrid, details[0].row, details[0].column);\n    };\n    const opUnmakeCellsHeader = (initialGrid, details, comparator, genWrappers) => {\n      const newGrid = replaceCells(initialGrid, details, comparator, genWrappers.replaceOrInit);\n      return bundle(newGrid, details[0].row, details[0].column);\n    };\n    const makeRowsSection = (section, applyScope) => (initialGrid, details, comparator, genWrappers, tableSection) => {\n      const rows = uniqueRows(details);\n      const rowIndexes = map$1(rows, detail => detail.row);\n      const newGrid = replaceRows(initialGrid, rowIndexes, section, applyScope, comparator, genWrappers.replaceOrInit, tableSection);\n      return bundle(newGrid, details[0].row, details[0].column);\n    };\n    const opMakeRowsHeader = makeRowsSection('thead', true);\n    const opMakeRowsBody = makeRowsSection('tbody', false);\n    const opMakeRowsFooter = makeRowsSection('tfoot', false);\n    const opEraseColumns = (grid, extractDetail, _comparator, _genWrappers) => {\n      const columns = uniqueColumns(extractDetail.details);\n      const newGrid = deleteColumnsAt(grid, map$1(columns, column => column.column));\n      const maxColIndex = newGrid.length > 0 ? newGrid[0].cells.length - 1 : 0;\n      return bundle(newGrid, columns[0].row, Math.min(columns[0].column, maxColIndex));\n    };\n    const opEraseRows = (grid, details, _comparator, _genWrappers) => {\n      const rows = uniqueRows(details);\n      const newGrid = deleteRowsAt(grid, rows[0].row, rows[rows.length - 1].row);\n      const maxRowIndex = Math.max(extractGridDetails(newGrid).rows.length - 1, 0);\n      return bundle(newGrid, Math.min(details[0].row, maxRowIndex), details[0].column);\n    };\n    const opMergeCells = (grid, mergable, comparator, genWrappers) => {\n      const cells = mergable.cells;\n      merge(cells);\n      const newGrid = merge$2(grid, mergable.bounds, comparator, genWrappers.merge(cells));\n      return outcome(newGrid, Optional.from(cells[0]));\n    };\n    const opUnmergeCells = (grid, unmergable, comparator, genWrappers) => {\n      const unmerge$1 = (b, cell) => unmerge(b, cell, comparator, genWrappers.unmerge(cell));\n      const newGrid = foldr(unmergable, unmerge$1, grid);\n      return outcome(newGrid, Optional.from(unmergable[0]));\n    };\n    const opPasteCells = (grid, pasteDetails, comparator, _genWrappers) => {\n      const gridify = (table, generators) => {\n        const wh = Warehouse.fromTable(table);\n        return toGrid(wh, generators, true);\n      };\n      const gridB = gridify(pasteDetails.clipboard, pasteDetails.generators);\n      const startAddress = address(pasteDetails.row, pasteDetails.column);\n      const mergedGrid = merge$1(startAddress, grid, gridB, pasteDetails.generators, comparator);\n      return mergedGrid.fold(() => outcome(grid, Optional.some(pasteDetails.element)), newGrid => {\n        return bundle(newGrid, pasteDetails.row, pasteDetails.column);\n      });\n    };\n    const gridifyRows = (rows, generators, context) => {\n      const pasteDetails = fromPastedRows(rows, context.section);\n      const wh = Warehouse.generate(pasteDetails);\n      return toGrid(wh, generators, true);\n    };\n    const opPasteColsBefore = (grid, pasteDetails, comparator, _genWrappers) => {\n      const rows = extractGridDetails(grid).rows;\n      const index = pasteDetails.cells[0].column;\n      const context = rows[pasteDetails.cells[0].row];\n      const gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context);\n      const mergedGrid = insertCols(index, grid, gridB, pasteDetails.generators, comparator);\n      return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column);\n    };\n    const opPasteColsAfter = (grid, pasteDetails, comparator, _genWrappers) => {\n      const rows = extractGridDetails(grid).rows;\n      const index = pasteDetails.cells[pasteDetails.cells.length - 1].column + pasteDetails.cells[pasteDetails.cells.length - 1].colspan;\n      const context = rows[pasteDetails.cells[0].row];\n      const gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context);\n      const mergedGrid = insertCols(index, grid, gridB, pasteDetails.generators, comparator);\n      return bundle(mergedGrid, pasteDetails.cells[0].row, index);\n    };\n    const opPasteRowsBefore = (grid, pasteDetails, comparator, _genWrappers) => {\n      const rows = extractGridDetails(grid).rows;\n      const index = pasteDetails.cells[0].row;\n      const context = rows[index];\n      const gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context);\n      const mergedGrid = insertRows(index, grid, gridB, pasteDetails.generators, comparator);\n      return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column);\n    };\n    const opPasteRowsAfter = (grid, pasteDetails, comparator, _genWrappers) => {\n      const rows = extractGridDetails(grid).rows;\n      const index = pasteDetails.cells[pasteDetails.cells.length - 1].row + pasteDetails.cells[pasteDetails.cells.length - 1].rowspan;\n      const context = rows[pasteDetails.cells[0].row];\n      const gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context);\n      const mergedGrid = insertRows(index, grid, gridB, pasteDetails.generators, comparator);\n      return bundle(mergedGrid, index, pasteDetails.cells[0].column);\n    };\n    const opGetColumnsType = (table, target) => {\n      const house = Warehouse.fromTable(table);\n      const details = onCells(house, target);\n      return details.bind(selectedCells => {\n        const lastSelectedCell = selectedCells[selectedCells.length - 1];\n        const minColRange = selectedCells[0].column;\n        const maxColRange = lastSelectedCell.column + lastSelectedCell.colspan;\n        const selectedColumnCells = flatten(map$1(house.all, row => filter$2(row.cells, cell => cell.column >= minColRange && cell.column < maxColRange)));\n        return findCommonCellType(selectedColumnCells);\n      }).getOr('');\n    };\n    const opGetCellsType = (table, target) => {\n      const house = Warehouse.fromTable(table);\n      const details = onCells(house, target);\n      return details.bind(findCommonCellType).getOr('');\n    };\n    const opGetRowsType = (table, target) => {\n      const house = Warehouse.fromTable(table);\n      const details = onCells(house, target);\n      return details.bind(selectedCells => {\n        const lastSelectedCell = selectedCells[selectedCells.length - 1];\n        const minRowRange = selectedCells[0].row;\n        const maxRowRange = lastSelectedCell.row + lastSelectedCell.rowspan;\n        const selectedRows = house.all.slice(minRowRange, maxRowRange);\n        return findCommonRowType(selectedRows);\n      }).getOr('');\n    };\n    const resize = (table, list, details, behaviours) => adjustWidthTo(table, list, details, behaviours.sizing);\n    const adjustAndRedistributeWidths = (table, list, details, behaviours) => adjustAndRedistributeWidths$1(table, list, details, behaviours.sizing, behaviours.resize);\n    const firstColumnIsLocked = (_warehouse, details) => exists(details, detail => detail.column === 0 && detail.isLocked);\n    const lastColumnIsLocked = (warehouse, details) => exists(details, detail => detail.column + detail.colspan >= warehouse.grid.columns && detail.isLocked);\n    const getColumnsWidth = (warehouse, details) => {\n      const columns$1 = columns(warehouse);\n      const uniqueCols = uniqueColumns(details);\n      return foldl(uniqueCols, (acc, detail) => {\n        const column = columns$1[detail.column];\n        const colWidth = column.map(getOuter$2).getOr(0);\n        return acc + colWidth;\n      }, 0);\n    };\n    const insertColumnsExtractor = before => (warehouse, target) => onCells(warehouse, target).filter(details => {\n      const checkLocked = before ? firstColumnIsLocked : lastColumnIsLocked;\n      return !checkLocked(warehouse, details);\n    }).map(details => ({\n      details,\n      pixelDelta: getColumnsWidth(warehouse, details)\n    }));\n    const eraseColumnsExtractor = (warehouse, target) => onUnlockedCells(warehouse, target).map(details => ({\n      details,\n      pixelDelta: -getColumnsWidth(warehouse, details)\n    }));\n    const pasteColumnsExtractor = before => (warehouse, target) => onPasteByEditor(warehouse, target).filter(details => {\n      const checkLocked = before ? firstColumnIsLocked : lastColumnIsLocked;\n      return !checkLocked(warehouse, details.cells);\n    });\n    const headerCellGenerator = Generators.transform('th');\n    const bodyCellGenerator = Generators.transform('td');\n    const insertRowsBefore = run(opInsertRowsBefore, onCells, noop, noop, Generators.modification);\n    const insertRowsAfter = run(opInsertRowsAfter, onCells, noop, noop, Generators.modification);\n    const insertColumnsBefore = run(opInsertColumnsBefore, insertColumnsExtractor(true), adjustAndRedistributeWidths, noop, Generators.modification);\n    const insertColumnsAfter = run(opInsertColumnsAfter, insertColumnsExtractor(false), adjustAndRedistributeWidths, noop, Generators.modification);\n    const eraseColumns = run(opEraseColumns, eraseColumnsExtractor, adjustAndRedistributeWidths, prune, Generators.modification);\n    const eraseRows = run(opEraseRows, onCells, noop, prune, Generators.modification);\n    const makeColumnsHeader = run(opMakeColumnsHeader, onUnlockedCells, noop, noop, headerCellGenerator);\n    const unmakeColumnsHeader = run(opUnmakeColumnsHeader, onUnlockedCells, noop, noop, bodyCellGenerator);\n    const makeRowsHeader = run(opMakeRowsHeader, onUnlockedCells, noop, noop, headerCellGenerator);\n    const makeRowsBody = run(opMakeRowsBody, onUnlockedCells, noop, noop, bodyCellGenerator);\n    const makeRowsFooter = run(opMakeRowsFooter, onUnlockedCells, noop, noop, bodyCellGenerator);\n    const makeCellsHeader = run(opMakeCellsHeader, onUnlockedCells, noop, noop, headerCellGenerator);\n    const unmakeCellsHeader = run(opUnmakeCellsHeader, onUnlockedCells, noop, noop, bodyCellGenerator);\n    const mergeCells = run(opMergeCells, onUnlockedMergable, resize, noop, Generators.merging);\n    const unmergeCells = run(opUnmergeCells, onUnlockedUnmergable, resize, noop, Generators.merging);\n    const pasteCells = run(opPasteCells, onPaste, resize, noop, Generators.modification);\n    const pasteColsBefore = run(opPasteColsBefore, pasteColumnsExtractor(true), noop, noop, Generators.modification);\n    const pasteColsAfter = run(opPasteColsAfter, pasteColumnsExtractor(false), noop, noop, Generators.modification);\n    const pasteRowsBefore = run(opPasteRowsBefore, onPasteByEditor, noop, noop, Generators.modification);\n    const pasteRowsAfter = run(opPasteRowsAfter, onPasteByEditor, noop, noop, Generators.modification);\n    const getColumnsType = opGetColumnsType;\n    const getCellsType = opGetCellsType;\n    const getRowsType = opGetRowsType;\n\n    const fireNewRow = (editor, row) => editor.dispatch('NewRow', { node: row });\n    const fireNewCell = (editor, cell) => editor.dispatch('NewCell', { node: cell });\n    const fireTableModified = (editor, table, data) => {\n      editor.dispatch('TableModified', {\n        ...data,\n        table\n      });\n    };\n    const fireTableSelectionChange = (editor, cells, start, finish, otherCells) => {\n      editor.dispatch('TableSelectionChange', {\n        cells,\n        start,\n        finish,\n        otherCells\n      });\n    };\n    const fireTableSelectionClear = editor => {\n      editor.dispatch('TableSelectionClear');\n    };\n    const fireObjectResizeStart = (editor, target, width, height, origin) => {\n      editor.dispatch('ObjectResizeStart', {\n        target,\n        width,\n        height,\n        origin\n      });\n    };\n    const fireObjectResized = (editor, target, width, height, origin) => {\n      editor.dispatch('ObjectResized', {\n        target,\n        width,\n        height,\n        origin\n      });\n    };\n    const styleModified = {\n      structure: false,\n      style: true\n    };\n    const structureModified = {\n      structure: true,\n      style: false\n    };\n    const styleAndStructureModified = {\n      structure: true,\n      style: true\n    };\n\n    const get$5 = (editor, table) => {\n      if (isTablePercentagesForced(editor)) {\n        return TableSize.percentageSize(table);\n      } else if (isTablePixelsForced(editor)) {\n        return TableSize.pixelSize(table);\n      } else {\n        return TableSize.getTableSize(table);\n      }\n    };\n\n    const TableActions = (editor, resizeHandler, cellSelectionHandler) => {\n      const isTableBody = editor => name(getBody(editor)) === 'table';\n      const lastRowGuard = table => !isTableBody(editor) || getGridSize(table).rows > 1;\n      const lastColumnGuard = table => !isTableBody(editor) || getGridSize(table).columns > 1;\n      const cloneFormats = getTableCloneElements(editor);\n      const colMutationOp = isResizeTableColumnResizing(editor) ? noop : halve;\n      const getTableSectionType = table => {\n        switch (getTableHeaderType(editor)) {\n        case 'section':\n          return TableSection.section();\n        case 'sectionCells':\n          return TableSection.sectionCells();\n        case 'cells':\n          return TableSection.cells();\n        default:\n          return TableSection.getTableSectionType(table, 'section');\n        }\n      };\n      const setSelectionFromAction = (table, result) => result.cursor.fold(() => {\n        const cells = cells$1(table);\n        return head(cells).filter(inBody).map(firstCell => {\n          cellSelectionHandler.clearSelectedCells(table.dom);\n          const rng = editor.dom.createRng();\n          rng.selectNode(firstCell.dom);\n          editor.selection.setRng(rng);\n          set$2(firstCell, 'data-mce-selected', '1');\n          return rng;\n        });\n      }, cell => {\n        const des = freefallRtl(cell);\n        const rng = editor.dom.createRng();\n        rng.setStart(des.element.dom, des.offset);\n        rng.setEnd(des.element.dom, des.offset);\n        editor.selection.setRng(rng);\n        cellSelectionHandler.clearSelectedCells(table.dom);\n        return Optional.some(rng);\n      });\n      const execute = (operation, guard, mutate, effect) => (table, target, noEvents = false) => {\n        removeDataStyle(table);\n        const doc = SugarElement.fromDom(editor.getDoc());\n        const generators = cellOperations(mutate, doc, cloneFormats);\n        const behaviours = {\n          sizing: get$5(editor, table),\n          resize: isResizeTableColumnResizing(editor) ? resizeTable() : preserveTable(),\n          section: getTableSectionType(table)\n        };\n        return guard(table) ? operation(table, target, generators, behaviours).bind(result => {\n          resizeHandler.refresh(table.dom);\n          each$2(result.newRows, row => {\n            fireNewRow(editor, row.dom);\n          });\n          each$2(result.newCells, cell => {\n            fireNewCell(editor, cell.dom);\n          });\n          const range = setSelectionFromAction(table, result);\n          if (inBody(table)) {\n            removeDataStyle(table);\n            if (!noEvents) {\n              fireTableModified(editor, table.dom, effect);\n            }\n          }\n          return range.map(rng => ({\n            rng,\n            effect\n          }));\n        }) : Optional.none();\n      };\n      const deleteRow = execute(eraseRows, lastRowGuard, noop, structureModified);\n      const deleteColumn = execute(eraseColumns, lastColumnGuard, noop, structureModified);\n      const insertRowsBefore$1 = execute(insertRowsBefore, always, noop, structureModified);\n      const insertRowsAfter$1 = execute(insertRowsAfter, always, noop, structureModified);\n      const insertColumnsBefore$1 = execute(insertColumnsBefore, always, colMutationOp, structureModified);\n      const insertColumnsAfter$1 = execute(insertColumnsAfter, always, colMutationOp, structureModified);\n      const mergeCells$1 = execute(mergeCells, always, noop, structureModified);\n      const unmergeCells$1 = execute(unmergeCells, always, noop, structureModified);\n      const pasteColsBefore$1 = execute(pasteColsBefore, always, noop, structureModified);\n      const pasteColsAfter$1 = execute(pasteColsAfter, always, noop, structureModified);\n      const pasteRowsBefore$1 = execute(pasteRowsBefore, always, noop, structureModified);\n      const pasteRowsAfter$1 = execute(pasteRowsAfter, always, noop, structureModified);\n      const pasteCells$1 = execute(pasteCells, always, noop, styleAndStructureModified);\n      const makeCellsHeader$1 = execute(makeCellsHeader, always, noop, structureModified);\n      const unmakeCellsHeader$1 = execute(unmakeCellsHeader, always, noop, structureModified);\n      const makeColumnsHeader$1 = execute(makeColumnsHeader, always, noop, structureModified);\n      const unmakeColumnsHeader$1 = execute(unmakeColumnsHeader, always, noop, structureModified);\n      const makeRowsHeader$1 = execute(makeRowsHeader, always, noop, structureModified);\n      const makeRowsBody$1 = execute(makeRowsBody, always, noop, structureModified);\n      const makeRowsFooter$1 = execute(makeRowsFooter, always, noop, structureModified);\n      const getTableCellType = getCellsType;\n      const getTableColType = getColumnsType;\n      const getTableRowType = getRowsType;\n      return {\n        deleteRow,\n        deleteColumn,\n        insertRowsBefore: insertRowsBefore$1,\n        insertRowsAfter: insertRowsAfter$1,\n        insertColumnsBefore: insertColumnsBefore$1,\n        insertColumnsAfter: insertColumnsAfter$1,\n        mergeCells: mergeCells$1,\n        unmergeCells: unmergeCells$1,\n        pasteColsBefore: pasteColsBefore$1,\n        pasteColsAfter: pasteColsAfter$1,\n        pasteRowsBefore: pasteRowsBefore$1,\n        pasteRowsAfter: pasteRowsAfter$1,\n        pasteCells: pasteCells$1,\n        makeCellsHeader: makeCellsHeader$1,\n        unmakeCellsHeader: unmakeCellsHeader$1,\n        makeColumnsHeader: makeColumnsHeader$1,\n        unmakeColumnsHeader: unmakeColumnsHeader$1,\n        makeRowsHeader: makeRowsHeader$1,\n        makeRowsBody: makeRowsBody$1,\n        makeRowsFooter: makeRowsFooter$1,\n        getTableRowType,\n        getTableCellType,\n        getTableColType\n      };\n    };\n\n    const constrainSpan = (element, property, value) => {\n      const currentColspan = getAttrValue(element, property, 1);\n      if (value === 1 || currentColspan <= 1) {\n        remove$7(element, property);\n      } else {\n        set$2(element, property, Math.min(value, currentColspan));\n      }\n    };\n    const isColInRange = (minColRange, maxColRange) => cell => {\n      const endCol = cell.column + cell.colspan - 1;\n      const startCol = cell.column;\n      return endCol >= minColRange && startCol < maxColRange;\n    };\n    const generateColGroup = (house, minColRange, maxColRange) => {\n      if (Warehouse.hasColumns(house)) {\n        const colsToCopy = filter$2(Warehouse.justColumns(house), isColInRange(minColRange, maxColRange));\n        const copiedCols = map$1(colsToCopy, c => {\n          const clonedCol = deep(c.element);\n          constrainSpan(clonedCol, 'span', maxColRange - minColRange);\n          return clonedCol;\n        });\n        const fakeColgroup = SugarElement.fromTag('colgroup');\n        append(fakeColgroup, copiedCols);\n        return [fakeColgroup];\n      } else {\n        return [];\n      }\n    };\n    const generateRows = (house, minColRange, maxColRange) => map$1(house.all, row => {\n      const cellsToCopy = filter$2(row.cells, isColInRange(minColRange, maxColRange));\n      const copiedCells = map$1(cellsToCopy, cell => {\n        const clonedCell = deep(cell.element);\n        constrainSpan(clonedCell, 'colspan', maxColRange - minColRange);\n        return clonedCell;\n      });\n      const fakeTR = SugarElement.fromTag('tr');\n      append(fakeTR, copiedCells);\n      return fakeTR;\n    });\n    const copyCols = (table, target) => {\n      const house = Warehouse.fromTable(table);\n      const details = onUnlockedCells(house, target);\n      return details.map(selectedCells => {\n        const lastSelectedCell = selectedCells[selectedCells.length - 1];\n        const minColRange = selectedCells[0].column;\n        const maxColRange = lastSelectedCell.column + lastSelectedCell.colspan;\n        const fakeColGroups = generateColGroup(house, minColRange, maxColRange);\n        const fakeRows = generateRows(house, minColRange, maxColRange);\n        return [\n          ...fakeColGroups,\n          ...fakeRows\n        ];\n      });\n    };\n\n    const copyRows = (table, target, generators) => {\n      const warehouse = Warehouse.fromTable(table);\n      const details = onCells(warehouse, target);\n      return details.bind(selectedCells => {\n        const grid = toGrid(warehouse, generators, false);\n        const rows = extractGridDetails(grid).rows;\n        const slicedGrid = rows.slice(selectedCells[0].row, selectedCells[selectedCells.length - 1].row + selectedCells[selectedCells.length - 1].rowspan);\n        const filteredGrid = bind$2(slicedGrid, row => {\n          const newCells = filter$2(row.cells, cell => !cell.isLocked);\n          return newCells.length > 0 ? [{\n              ...row,\n              cells: newCells\n            }] : [];\n        });\n        const slicedDetails = toDetailList(filteredGrid);\n        return someIf(slicedDetails.length > 0, slicedDetails);\n      }).map(slicedDetails => copy(slicedDetails));\n    };\n\n    const adt$5 = Adt.generate([\n      { invalid: ['raw'] },\n      { pixels: ['value'] },\n      { percent: ['value'] }\n    ]);\n    const validateFor = (suffix, type, value) => {\n      const rawAmount = value.substring(0, value.length - suffix.length);\n      const amount = parseFloat(rawAmount);\n      return rawAmount === amount.toString() ? type(amount) : adt$5.invalid(value);\n    };\n    const from = value => {\n      if (endsWith(value, '%')) {\n        return validateFor('%', adt$5.percent, value);\n      }\n      if (endsWith(value, 'px')) {\n        return validateFor('px', adt$5.pixels, value);\n      }\n      return adt$5.invalid(value);\n    };\n    const Size = {\n      ...adt$5,\n      from\n    };\n\n    const redistributeToPercent = (widths, totalWidth) => {\n      return map$1(widths, w => {\n        const colType = Size.from(w);\n        return colType.fold(() => {\n          return w;\n        }, px => {\n          const ratio = px / totalWidth * 100;\n          return ratio + '%';\n        }, pc => {\n          return pc + '%';\n        });\n      });\n    };\n    const redistributeToPx = (widths, totalWidth, newTotalWidth) => {\n      const scale = newTotalWidth / totalWidth;\n      return map$1(widths, w => {\n        const colType = Size.from(w);\n        return colType.fold(() => {\n          return w;\n        }, px => {\n          return px * scale + 'px';\n        }, pc => {\n          return pc / 100 * newTotalWidth + 'px';\n        });\n      });\n    };\n    const redistributeEmpty = (newWidthType, columns) => {\n      const f = newWidthType.fold(() => constant(''), pixels => {\n        const num = pixels / columns;\n        return constant(num + 'px');\n      }, () => {\n        const num = 100 / columns;\n        return constant(num + '%');\n      });\n      return range$1(columns, f);\n    };\n    const redistributeValues = (newWidthType, widths, totalWidth) => {\n      return newWidthType.fold(() => {\n        return widths;\n      }, px => {\n        return redistributeToPx(widths, totalWidth, px);\n      }, _pc => {\n        return redistributeToPercent(widths, totalWidth);\n      });\n    };\n    const redistribute$1 = (widths, totalWidth, newWidth) => {\n      const newType = Size.from(newWidth);\n      const floats = forall(widths, s => {\n        return s === '0px';\n      }) ? redistributeEmpty(newType, widths.length) : redistributeValues(newType, widths, totalWidth);\n      return normalize(floats);\n    };\n    const sum = (values, fallback) => {\n      if (values.length === 0) {\n        return fallback;\n      }\n      return foldr(values, (rest, v) => {\n        return Size.from(v).fold(constant(0), identity, identity) + rest;\n      }, 0);\n    };\n    const roundDown = (num, unit) => {\n      const floored = Math.floor(num);\n      return {\n        value: floored + unit,\n        remainder: num - floored\n      };\n    };\n    const add$3 = (value, amount) => {\n      return Size.from(value).fold(constant(value), px => {\n        return px + amount + 'px';\n      }, pc => {\n        return pc + amount + '%';\n      });\n    };\n    const normalize = values => {\n      if (values.length === 0) {\n        return values;\n      }\n      const scan = foldr(values, (rest, value) => {\n        const info = Size.from(value).fold(() => ({\n          value,\n          remainder: 0\n        }), num => roundDown(num, 'px'), num => ({\n          value: num + '%',\n          remainder: 0\n        }));\n        return {\n          output: [info.value].concat(rest.output),\n          remainder: rest.remainder + info.remainder\n        };\n      }, {\n        output: [],\n        remainder: 0\n      });\n      const r = scan.output;\n      return r.slice(0, r.length - 1).concat([add$3(r[r.length - 1], Math.round(scan.remainder))]);\n    };\n    const validate = Size.from;\n\n    const redistributeToW = (newWidths, cells, unit) => {\n      each$2(cells, cell => {\n        const widths = newWidths.slice(cell.column, cell.colspan + cell.column);\n        const w = sum(widths, minWidth());\n        set$1(cell.element, 'width', w + unit);\n      });\n    };\n    const redistributeToColumns = (newWidths, columns, unit) => {\n      each$2(columns, (column, index) => {\n        const width = sum([newWidths[index]], minWidth());\n        set$1(column.element, 'width', width + unit);\n      });\n    };\n    const redistributeToH = (newHeights, rows, cells) => {\n      each$2(cells, cell => {\n        remove$5(cell.element, 'height');\n      });\n      each$2(rows, (row, i) => {\n        set$1(row.element, 'height', newHeights[i]);\n      });\n    };\n    const getUnit = newSize => {\n      return validate(newSize).fold(constant('px'), constant('px'), constant('%'));\n    };\n    const redistribute = (table, optWidth, optHeight) => {\n      const warehouse = Warehouse.fromTable(table);\n      const rows = warehouse.all;\n      const cells = Warehouse.justCells(warehouse);\n      const columns = Warehouse.justColumns(warehouse);\n      optWidth.each(newWidth => {\n        const widthUnit = getUnit(newWidth);\n        const totalWidth = get$9(table);\n        const oldWidths = getRawWidths(warehouse, table);\n        const nuWidths = redistribute$1(oldWidths, totalWidth, newWidth);\n        if (Warehouse.hasColumns(warehouse)) {\n          redistributeToColumns(nuWidths, columns, widthUnit);\n        } else {\n          redistributeToW(nuWidths, cells, widthUnit);\n        }\n        set$1(table, 'width', newWidth);\n      });\n      optHeight.each(newHeight => {\n        const totalHeight = get$8(table);\n        const oldHeights = getRawHeights(warehouse, table);\n        const nuHeights = redistribute$1(oldHeights, totalHeight, newHeight);\n        redistributeToH(nuHeights, rows, cells);\n        set$1(table, 'height', newHeight);\n      });\n    };\n    const isPercentSizing = isPercentSizing$1;\n    const isPixelSizing = isPixelSizing$1;\n    const isNoneSizing = isNoneSizing$1;\n\n    const cleanupLegacyAttributes = element => {\n      remove$7(element, 'width');\n      remove$7(element, 'height');\n    };\n    const convertToPercentSizeWidth = table => {\n      const newWidth = getPercentTableWidth(table);\n      redistribute(table, Optional.some(newWidth), Optional.none());\n      cleanupLegacyAttributes(table);\n    };\n    const convertToPixelSizeWidth = table => {\n      const newWidth = getPixelTableWidth(table);\n      redistribute(table, Optional.some(newWidth), Optional.none());\n      cleanupLegacyAttributes(table);\n    };\n    const convertToPixelSizeHeight = table => {\n      const newHeight = getPixelTableHeight(table);\n      redistribute(table, Optional.none(), Optional.some(newHeight));\n      cleanupLegacyAttributes(table);\n    };\n    const convertToNoneSizeWidth = table => {\n      remove$5(table, 'width');\n      const columns = columns$1(table);\n      const rowElements = columns.length > 0 ? columns : cells$1(table);\n      each$2(rowElements, cell => {\n        remove$5(cell, 'width');\n        cleanupLegacyAttributes(cell);\n      });\n      cleanupLegacyAttributes(table);\n    };\n\n    const DefaultRenderOptions = {\n      styles: {\n        'border-collapse': 'collapse',\n        'width': '100%'\n      },\n      attributes: { border: '1' },\n      colGroups: false\n    };\n    const tableHeaderCell = () => SugarElement.fromTag('th');\n    const tableCell = () => SugarElement.fromTag('td');\n    const tableColumn = () => SugarElement.fromTag('col');\n    const createRow = (columns, rowHeaders, columnHeaders, rowIndex) => {\n      const tr = SugarElement.fromTag('tr');\n      for (let j = 0; j < columns; j++) {\n        const td = rowIndex < rowHeaders || j < columnHeaders ? tableHeaderCell() : tableCell();\n        if (j < columnHeaders) {\n          set$2(td, 'scope', 'row');\n        }\n        if (rowIndex < rowHeaders) {\n          set$2(td, 'scope', 'col');\n        }\n        append$1(td, SugarElement.fromTag('br'));\n        append$1(tr, td);\n      }\n      return tr;\n    };\n    const createGroupRow = columns => {\n      const columnGroup = SugarElement.fromTag('colgroup');\n      range$1(columns, () => append$1(columnGroup, tableColumn()));\n      return columnGroup;\n    };\n    const createRows = (rows, columns, rowHeaders, columnHeaders) => range$1(rows, r => createRow(columns, rowHeaders, columnHeaders, r));\n    const render = (rows, columns, rowHeaders, columnHeaders, headerType, renderOpts = DefaultRenderOptions) => {\n      const table = SugarElement.fromTag('table');\n      const rowHeadersGoInThead = headerType !== 'cells';\n      setAll(table, renderOpts.styles);\n      setAll$1(table, renderOpts.attributes);\n      if (renderOpts.colGroups) {\n        append$1(table, createGroupRow(columns));\n      }\n      const actualRowHeaders = Math.min(rows, rowHeaders);\n      if (rowHeadersGoInThead && rowHeaders > 0) {\n        const thead = SugarElement.fromTag('thead');\n        append$1(table, thead);\n        const theadRowHeaders = headerType === 'sectionCells' ? actualRowHeaders : 0;\n        const theadRows = createRows(rowHeaders, columns, theadRowHeaders, columnHeaders);\n        append(thead, theadRows);\n      }\n      const tbody = SugarElement.fromTag('tbody');\n      append$1(table, tbody);\n      const numRows = rowHeadersGoInThead ? rows - actualRowHeaders : rows;\n      const numRowHeaders = rowHeadersGoInThead ? 0 : rowHeaders;\n      const tbodyRows = createRows(numRows, columns, numRowHeaders, columnHeaders);\n      append(tbody, tbodyRows);\n      return table;\n    };\n\n    const get$4 = element => element.dom.innerHTML;\n    const getOuter = element => {\n      const container = SugarElement.fromTag('div');\n      const clone = SugarElement.fromDom(element.dom.cloneNode(true));\n      append$1(container, clone);\n      return get$4(container);\n    };\n\n    const placeCaretInCell = (editor, cell) => {\n      editor.selection.select(cell.dom, true);\n      editor.selection.collapse(true);\n    };\n    const selectFirstCellInTable = (editor, tableElm) => {\n      descendant(tableElm, 'td,th').each(curry(placeCaretInCell, editor));\n    };\n    const fireEvents = (editor, table) => {\n      each$2(descendants(table, 'tr'), row => {\n        fireNewRow(editor, row.dom);\n        each$2(descendants(row, 'th,td'), cell => {\n          fireNewCell(editor, cell.dom);\n        });\n      });\n    };\n    const isPercentage = width => isString(width) && width.indexOf('%') !== -1;\n    const insert = (editor, columns, rows, colHeaders, rowHeaders) => {\n      const defaultStyles = getTableDefaultStyles(editor);\n      const options = {\n        styles: defaultStyles,\n        attributes: getTableDefaultAttributes(editor),\n        colGroups: tableUseColumnGroup(editor)\n      };\n      editor.undoManager.ignore(() => {\n        const table = render(rows, columns, rowHeaders, colHeaders, getTableHeaderType(editor), options);\n        set$2(table, 'data-mce-id', '__mce');\n        const html = getOuter(table);\n        editor.insertContent(html);\n        editor.addVisual();\n      });\n      return descendant(getBody(editor), 'table[data-mce-id=\"__mce\"]').map(table => {\n        if (isTablePixelsForced(editor)) {\n          convertToPixelSizeWidth(table);\n        } else if (isTableResponsiveForced(editor)) {\n          convertToNoneSizeWidth(table);\n        } else if (isTablePercentagesForced(editor) || isPercentage(defaultStyles.width)) {\n          convertToPercentSizeWidth(table);\n        }\n        removeDataStyle(table);\n        remove$7(table, 'data-mce-id');\n        fireEvents(editor, table);\n        selectFirstCellInTable(editor, table);\n        return table.dom;\n      }).getOrNull();\n    };\n    const insertTable = (editor, rows, columns, options = {}) => {\n      const checkInput = val => isNumber(val) && val > 0;\n      if (checkInput(rows) && checkInput(columns)) {\n        const headerRows = options.headerRows || 0;\n        const headerColumns = options.headerColumns || 0;\n        return insert(editor, columns, rows, headerColumns, headerRows);\n      } else {\n        console.error('Invalid values for mceInsertTable - rows and columns values are required to insert a table.');\n        return null;\n      }\n    };\n\n    var global = hugerte.util.Tools.resolve('hugerte.FakeClipboard');\n\n    const tableTypeBase = 'x-hugerte/dom-table-';\n    const tableTypeRow = tableTypeBase + 'rows';\n    const tableTypeColumn = tableTypeBase + 'columns';\n    const setData = items => {\n      const fakeClipboardItem = global.FakeClipboardItem(items);\n      global.write([fakeClipboardItem]);\n    };\n    const getData = type => {\n      var _a;\n      const items = (_a = global.read()) !== null && _a !== void 0 ? _a : [];\n      return findMap(items, item => Optional.from(item.getType(type)));\n    };\n    const clearData = type => {\n      if (getData(type).isSome()) {\n        global.clear();\n      }\n    };\n    const setRows = rowsOpt => {\n      rowsOpt.fold(clearRows, rows => setData({ [tableTypeRow]: rows }));\n    };\n    const getRows = () => getData(tableTypeRow);\n    const clearRows = () => clearData(tableTypeRow);\n    const setColumns = columnsOpt => {\n      columnsOpt.fold(clearColumns, columns => setData({ [tableTypeColumn]: columns }));\n    };\n    const getColumns = () => getData(tableTypeColumn);\n    const clearColumns = () => clearData(tableTypeColumn);\n\n    const getSelectionStartCellOrCaption = editor => getSelectionCellOrCaption(getSelectionStart(editor), getIsRoot(editor)).filter(isInEditableContext$1);\n    const getSelectionStartCell = editor => getSelectionCell(getSelectionStart(editor), getIsRoot(editor)).filter(isInEditableContext$1);\n    const registerCommands = (editor, actions) => {\n      const isRoot = getIsRoot(editor);\n      const eraseTable = () => getSelectionStartCellOrCaption(editor).each(cellOrCaption => {\n        table(cellOrCaption, isRoot).filter(not(isRoot)).each(table => {\n          const cursor = SugarElement.fromText('');\n          after$5(table, cursor);\n          remove$6(table);\n          if (editor.dom.isEmpty(editor.getBody())) {\n            editor.setContent('');\n            editor.selection.setCursorLocation();\n          } else {\n            const rng = editor.dom.createRng();\n            rng.setStart(cursor.dom, 0);\n            rng.setEnd(cursor.dom, 0);\n            editor.selection.setRng(rng);\n            editor.nodeChanged();\n          }\n        });\n      });\n      const setSizingMode = sizing => getSelectionStartCellOrCaption(editor).each(cellOrCaption => {\n        const isForcedSizing = isTableResponsiveForced(editor) || isTablePixelsForced(editor) || isTablePercentagesForced(editor);\n        if (!isForcedSizing) {\n          table(cellOrCaption, isRoot).each(table => {\n            if (sizing === 'relative' && !isPercentSizing(table)) {\n              convertToPercentSizeWidth(table);\n            } else if (sizing === 'fixed' && !isPixelSizing(table)) {\n              convertToPixelSizeWidth(table);\n            } else if (sizing === 'responsive' && !isNoneSizing(table)) {\n              convertToNoneSizeWidth(table);\n            }\n            removeDataStyle(table);\n            fireTableModified(editor, table.dom, structureModified);\n          });\n        }\n      });\n      const getTableFromCell = cell => table(cell, isRoot);\n      const performActionOnSelection = action => getSelectionStartCell(editor).bind(cell => getTableFromCell(cell).map(table => action(table, cell)));\n      const toggleTableClass = (_ui, clazz) => {\n        performActionOnSelection(table => {\n          editor.formatter.toggle('tableclass', { value: clazz }, table.dom);\n          fireTableModified(editor, table.dom, styleModified);\n        });\n      };\n      const toggleTableCellClass = (_ui, clazz) => {\n        performActionOnSelection(table => {\n          const selectedCells = getCellsFromSelection(editor);\n          const allHaveClass = forall(selectedCells, cell => editor.formatter.match('tablecellclass', { value: clazz }, cell.dom));\n          const formatterAction = allHaveClass ? editor.formatter.remove : editor.formatter.apply;\n          each$2(selectedCells, cell => formatterAction('tablecellclass', { value: clazz }, cell.dom));\n          fireTableModified(editor, table.dom, styleModified);\n        });\n      };\n      const toggleCaption = () => {\n        getSelectionStartCellOrCaption(editor).each(cellOrCaption => {\n          table(cellOrCaption, isRoot).each(table => {\n            child(table, 'caption').fold(() => {\n              const caption = SugarElement.fromTag('caption');\n              append$1(caption, SugarElement.fromText('Caption'));\n              appendAt(table, caption, 0);\n              editor.selection.setCursorLocation(caption.dom, 0);\n            }, caption => {\n              if (isTag('caption')(cellOrCaption)) {\n                one('td', table).each(td => editor.selection.setCursorLocation(td.dom, 0));\n              }\n              remove$6(caption);\n            });\n            fireTableModified(editor, table.dom, structureModified);\n          });\n        });\n      };\n      const postExecute = _data => {\n        editor.focus();\n      };\n      const actOnSelection = (execute, noEvents = false) => performActionOnSelection((table, startCell) => {\n        const targets = forMenu(getCellsFromSelection(editor), table, startCell);\n        execute(table, targets, noEvents).each(postExecute);\n      });\n      const copyRowSelection = () => performActionOnSelection((table, startCell) => {\n        const targets = forMenu(getCellsFromSelection(editor), table, startCell);\n        const generators = cellOperations(noop, SugarElement.fromDom(editor.getDoc()), Optional.none());\n        return copyRows(table, targets, generators);\n      });\n      const copyColSelection = () => performActionOnSelection((table, startCell) => {\n        const targets = forMenu(getCellsFromSelection(editor), table, startCell);\n        return copyCols(table, targets);\n      });\n      const pasteOnSelection = (execute, getRows) => getRows().each(rows => {\n        const clonedRows = map$1(rows, row => deep(row));\n        performActionOnSelection((table, startCell) => {\n          const generators = paste$1(SugarElement.fromDom(editor.getDoc()));\n          const targets = pasteRows(getCellsFromSelection(editor), startCell, clonedRows, generators);\n          execute(table, targets).each(postExecute);\n        });\n      });\n      const actOnType = getAction => (_ui, args) => get$c(args, 'type').each(type => {\n        actOnSelection(getAction(type), args.no_events);\n      });\n      each$1({\n        mceTableSplitCells: () => actOnSelection(actions.unmergeCells),\n        mceTableMergeCells: () => actOnSelection(actions.mergeCells),\n        mceTableInsertRowBefore: () => actOnSelection(actions.insertRowsBefore),\n        mceTableInsertRowAfter: () => actOnSelection(actions.insertRowsAfter),\n        mceTableInsertColBefore: () => actOnSelection(actions.insertColumnsBefore),\n        mceTableInsertColAfter: () => actOnSelection(actions.insertColumnsAfter),\n        mceTableDeleteCol: () => actOnSelection(actions.deleteColumn),\n        mceTableDeleteRow: () => actOnSelection(actions.deleteRow),\n        mceTableCutCol: () => copyColSelection().each(selection => {\n          setColumns(selection);\n          actOnSelection(actions.deleteColumn);\n        }),\n        mceTableCutRow: () => copyRowSelection().each(selection => {\n          setRows(selection);\n          actOnSelection(actions.deleteRow);\n        }),\n        mceTableCopyCol: () => copyColSelection().each(selection => setColumns(selection)),\n        mceTableCopyRow: () => copyRowSelection().each(selection => setRows(selection)),\n        mceTablePasteColBefore: () => pasteOnSelection(actions.pasteColsBefore, getColumns),\n        mceTablePasteColAfter: () => pasteOnSelection(actions.pasteColsAfter, getColumns),\n        mceTablePasteRowBefore: () => pasteOnSelection(actions.pasteRowsBefore, getRows),\n        mceTablePasteRowAfter: () => pasteOnSelection(actions.pasteRowsAfter, getRows),\n        mceTableDelete: eraseTable,\n        mceTableCellToggleClass: toggleTableCellClass,\n        mceTableToggleClass: toggleTableClass,\n        mceTableToggleCaption: toggleCaption,\n        mceTableSizingMode: (_ui, sizing) => setSizingMode(sizing),\n        mceTableCellType: actOnType(type => type === 'th' ? actions.makeCellsHeader : actions.unmakeCellsHeader),\n        mceTableColType: actOnType(type => type === 'th' ? actions.makeColumnsHeader : actions.unmakeColumnsHeader),\n        mceTableRowType: actOnType(type => {\n          switch (type) {\n          case 'header':\n            return actions.makeRowsHeader;\n          case 'footer':\n            return actions.makeRowsFooter;\n          default:\n            return actions.makeRowsBody;\n          }\n        })\n      }, (func, name) => editor.addCommand(name, func));\n      editor.addCommand('mceInsertTable', (_ui, args) => {\n        insertTable(editor, args.rows, args.columns, args.options);\n      });\n      editor.addCommand('mceTableApplyCellStyle', (_ui, args) => {\n        const getFormatName = style => 'tablecell' + style.toLowerCase().replace('-', '');\n        if (!isObject(args)) {\n          return;\n        }\n        const cells = filter$2(getCellsFromSelection(editor), isInEditableContext$1);\n        if (cells.length === 0) {\n          return;\n        }\n        const validArgs = filter$1(args, (value, style) => editor.formatter.has(getFormatName(style)) && isString(value));\n        if (isEmpty(validArgs)) {\n          return;\n        }\n        each$1(validArgs, (value, style) => {\n          const formatName = getFormatName(style);\n          each$2(cells, cell => {\n            if (value === '') {\n              editor.formatter.remove(formatName, { value: null }, cell.dom, true);\n            } else {\n              editor.formatter.apply(formatName, { value }, cell.dom);\n            }\n          });\n        });\n        getTableFromCell(cells[0]).each(table => fireTableModified(editor, table.dom, styleModified));\n      });\n    };\n\n    const registerQueryCommands = (editor, actions) => {\n      const isRoot = getIsRoot(editor);\n      const lookupOnSelection = action => getSelectionCell(getSelectionStart(editor)).bind(cell => table(cell, isRoot).map(table => {\n        const targets = forMenu(getCellsFromSelection(editor), table, cell);\n        return action(table, targets);\n      })).getOr('');\n      each$1({\n        mceTableRowType: () => lookupOnSelection(actions.getTableRowType),\n        mceTableCellType: () => lookupOnSelection(actions.getTableCellType),\n        mceTableColType: () => lookupOnSelection(actions.getTableColType)\n      }, (func, name) => editor.addQueryValueHandler(name, func));\n    };\n\n    const adt$4 = Adt.generate([\n      { before: ['element'] },\n      {\n        on: [\n          'element',\n          'offset'\n        ]\n      },\n      { after: ['element'] }\n    ]);\n    const cata$1 = (subject, onBefore, onOn, onAfter) => subject.fold(onBefore, onOn, onAfter);\n    const getStart$1 = situ => situ.fold(identity, identity, identity);\n    const before$2 = adt$4.before;\n    const on = adt$4.on;\n    const after$3 = adt$4.after;\n    const Situ = {\n      before: before$2,\n      on,\n      after: after$3,\n      cata: cata$1,\n      getStart: getStart$1\n    };\n\n    const create$4 = (selection, kill) => ({\n      selection,\n      kill\n    });\n    const Response = { create: create$4 };\n\n    const selectNode = (win, element) => {\n      const rng = win.document.createRange();\n      rng.selectNode(element.dom);\n      return rng;\n    };\n    const selectNodeContents = (win, element) => {\n      const rng = win.document.createRange();\n      selectNodeContentsUsing(rng, element);\n      return rng;\n    };\n    const selectNodeContentsUsing = (rng, element) => rng.selectNodeContents(element.dom);\n    const setStart = (rng, situ) => {\n      situ.fold(e => {\n        rng.setStartBefore(e.dom);\n      }, (e, o) => {\n        rng.setStart(e.dom, o);\n      }, e => {\n        rng.setStartAfter(e.dom);\n      });\n    };\n    const setFinish = (rng, situ) => {\n      situ.fold(e => {\n        rng.setEndBefore(e.dom);\n      }, (e, o) => {\n        rng.setEnd(e.dom, o);\n      }, e => {\n        rng.setEndAfter(e.dom);\n      });\n    };\n    const relativeToNative = (win, startSitu, finishSitu) => {\n      const range = win.document.createRange();\n      setStart(range, startSitu);\n      setFinish(range, finishSitu);\n      return range;\n    };\n    const exactToNative = (win, start, soffset, finish, foffset) => {\n      const rng = win.document.createRange();\n      rng.setStart(start.dom, soffset);\n      rng.setEnd(finish.dom, foffset);\n      return rng;\n    };\n    const toRect = rect => ({\n      left: rect.left,\n      top: rect.top,\n      right: rect.right,\n      bottom: rect.bottom,\n      width: rect.width,\n      height: rect.height\n    });\n    const getFirstRect$1 = rng => {\n      const rects = rng.getClientRects();\n      const rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect();\n      return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect) : Optional.none();\n    };\n\n    const adt$3 = Adt.generate([\n      {\n        ltr: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      },\n      {\n        rtl: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      }\n    ]);\n    const fromRange = (win, type, range) => type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset);\n    const getRanges = (win, selection) => selection.match({\n      domRange: rng => {\n        return {\n          ltr: constant(rng),\n          rtl: Optional.none\n        };\n      },\n      relative: (startSitu, finishSitu) => {\n        return {\n          ltr: cached(() => relativeToNative(win, startSitu, finishSitu)),\n          rtl: cached(() => Optional.some(relativeToNative(win, finishSitu, startSitu)))\n        };\n      },\n      exact: (start, soffset, finish, foffset) => {\n        return {\n          ltr: cached(() => exactToNative(win, start, soffset, finish, foffset)),\n          rtl: cached(() => Optional.some(exactToNative(win, finish, foffset, start, soffset)))\n        };\n      }\n    });\n    const doDiagnose = (win, ranges) => {\n      const rng = ranges.ltr();\n      if (rng.collapsed) {\n        const reversed = ranges.rtl().filter(rev => rev.collapsed === false);\n        return reversed.map(rev => adt$3.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset)).getOrThunk(() => fromRange(win, adt$3.ltr, rng));\n      } else {\n        return fromRange(win, adt$3.ltr, rng);\n      }\n    };\n    const diagnose = (win, selection) => {\n      const ranges = getRanges(win, selection);\n      return doDiagnose(win, ranges);\n    };\n    const asLtrRange = (win, selection) => {\n      const diagnosis = diagnose(win, selection);\n      return diagnosis.match({\n        ltr: (start, soffset, finish, foffset) => {\n          const rng = win.document.createRange();\n          rng.setStart(start.dom, soffset);\n          rng.setEnd(finish.dom, foffset);\n          return rng;\n        },\n        rtl: (start, soffset, finish, foffset) => {\n          const rng = win.document.createRange();\n          rng.setStart(finish.dom, foffset);\n          rng.setEnd(start.dom, soffset);\n          return rng;\n        }\n      });\n    };\n    adt$3.ltr;\n    adt$3.rtl;\n\n    const create$3 = (start, soffset, finish, foffset) => ({\n      start,\n      soffset,\n      finish,\n      foffset\n    });\n    const SimRange = { create: create$3 };\n\n    const create$2 = (start, soffset, finish, foffset) => {\n      return {\n        start: Situ.on(start, soffset),\n        finish: Situ.on(finish, foffset)\n      };\n    };\n    const Situs = { create: create$2 };\n\n    const convertToRange = (win, selection) => {\n      const rng = asLtrRange(win, selection);\n      return SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset);\n    };\n    const makeSitus = Situs.create;\n\n    const sync = (container, isRoot, start, soffset, finish, foffset, selectRange) => {\n      if (!(eq$1(start, finish) && soffset === foffset)) {\n        return closest$1(start, 'td,th', isRoot).bind(s => {\n          return closest$1(finish, 'td,th', isRoot).bind(f => {\n            return detect(container, isRoot, s, f, selectRange);\n          });\n        });\n      } else {\n        return Optional.none();\n      }\n    };\n    const detect = (container, isRoot, start, finish, selectRange) => {\n      if (!eq$1(start, finish)) {\n        return identify(start, finish, isRoot).bind(cellSel => {\n          const boxes = cellSel.boxes.getOr([]);\n          if (boxes.length > 1) {\n            selectRange(container, boxes, cellSel.start, cellSel.finish);\n            return Optional.some(Response.create(Optional.some(makeSitus(start, 0, start, getEnd(start))), true));\n          } else {\n            return Optional.none();\n          }\n        });\n      } else {\n        return Optional.none();\n      }\n    };\n    const update = (rows, columns, container, selected, annotations) => {\n      const updateSelection = newSels => {\n        annotations.clearBeforeUpdate(container);\n        annotations.selectRange(container, newSels.boxes, newSels.start, newSels.finish);\n        return newSels.boxes;\n      };\n      return shiftSelection(selected, rows, columns, annotations.firstSelectedSelector, annotations.lastSelectedSelector).map(updateSelection);\n    };\n\n    const traverse = (item, mode) => ({\n      item,\n      mode\n    });\n    const backtrack = (universe, item, _direction, transition = sidestep) => {\n      return universe.property().parent(item).map(p => {\n        return traverse(p, transition);\n      });\n    };\n    const sidestep = (universe, item, direction, transition = advance) => {\n      return direction.sibling(universe, item).map(p => {\n        return traverse(p, transition);\n      });\n    };\n    const advance = (universe, item, direction, transition = advance) => {\n      const children = universe.property().children(item);\n      const result = direction.first(children);\n      return result.map(r => {\n        return traverse(r, transition);\n      });\n    };\n    const successors = [\n      {\n        current: backtrack,\n        next: sidestep,\n        fallback: Optional.none()\n      },\n      {\n        current: sidestep,\n        next: advance,\n        fallback: Optional.some(backtrack)\n      },\n      {\n        current: advance,\n        next: advance,\n        fallback: Optional.some(sidestep)\n      }\n    ];\n    const go = (universe, item, mode, direction, rules = successors) => {\n      const ruleOpt = find$1(rules, succ => {\n        return succ.current === mode;\n      });\n      return ruleOpt.bind(rule => {\n        return rule.current(universe, item, direction, rule.next).orThunk(() => {\n          return rule.fallback.bind(fb => {\n            return go(universe, item, fb, direction);\n          });\n        });\n      });\n    };\n\n    const left$1 = () => {\n      const sibling = (universe, item) => {\n        return universe.query().prevSibling(item);\n      };\n      const first = children => {\n        return children.length > 0 ? Optional.some(children[children.length - 1]) : Optional.none();\n      };\n      return {\n        sibling,\n        first\n      };\n    };\n    const right$1 = () => {\n      const sibling = (universe, item) => {\n        return universe.query().nextSibling(item);\n      };\n      const first = children => {\n        return children.length > 0 ? Optional.some(children[0]) : Optional.none();\n      };\n      return {\n        sibling,\n        first\n      };\n    };\n    const Walkers = {\n      left: left$1,\n      right: right$1\n    };\n\n    const hone = (universe, item, predicate, mode, direction, isRoot) => {\n      const next = go(universe, item, mode, direction);\n      return next.bind(n => {\n        if (isRoot(n.item)) {\n          return Optional.none();\n        } else {\n          return predicate(n.item) ? Optional.some(n.item) : hone(universe, n.item, predicate, n.mode, direction, isRoot);\n        }\n      });\n    };\n    const left = (universe, item, predicate, isRoot) => {\n      return hone(universe, item, predicate, sidestep, Walkers.left(), isRoot);\n    };\n    const right = (universe, item, predicate, isRoot) => {\n      return hone(universe, item, predicate, sidestep, Walkers.right(), isRoot);\n    };\n\n    const isLeaf = universe => element => universe.property().children(element).length === 0;\n    const before$1 = (universe, item, isRoot) => {\n      return seekLeft$1(universe, item, isLeaf(universe), isRoot);\n    };\n    const after$2 = (universe, item, isRoot) => {\n      return seekRight$1(universe, item, isLeaf(universe), isRoot);\n    };\n    const seekLeft$1 = left;\n    const seekRight$1 = right;\n\n    const universe = DomUniverse();\n    const before = (element, isRoot) => {\n      return before$1(universe, element, isRoot);\n    };\n    const after$1 = (element, isRoot) => {\n      return after$2(universe, element, isRoot);\n    };\n    const seekLeft = (element, predicate, isRoot) => {\n      return seekLeft$1(universe, element, predicate, isRoot);\n    };\n    const seekRight = (element, predicate, isRoot) => {\n      return seekRight$1(universe, element, predicate, isRoot);\n    };\n\n    const ancestor = (scope, predicate, isRoot) => ancestor$2(scope, predicate, isRoot).isSome();\n\n    const adt$2 = Adt.generate([\n      { none: ['message'] },\n      { success: [] },\n      { failedUp: ['cell'] },\n      { failedDown: ['cell'] }\n    ]);\n    const isOverlapping = (bridge, before, after) => {\n      const beforeBounds = bridge.getRect(before);\n      const afterBounds = bridge.getRect(after);\n      return afterBounds.right > beforeBounds.left && afterBounds.left < beforeBounds.right;\n    };\n    const isRow = elem => {\n      return closest$1(elem, 'tr');\n    };\n    const verify = (bridge, before, beforeOffset, after, afterOffset, failure, isRoot) => {\n      return closest$1(after, 'td,th', isRoot).bind(afterCell => {\n        return closest$1(before, 'td,th', isRoot).map(beforeCell => {\n          if (!eq$1(afterCell, beforeCell)) {\n            return sharedOne(isRow, [\n              afterCell,\n              beforeCell\n            ]).fold(() => {\n              return isOverlapping(bridge, beforeCell, afterCell) ? adt$2.success() : failure(beforeCell);\n            }, _sharedRow => {\n              return failure(beforeCell);\n            });\n          } else {\n            return eq$1(after, afterCell) && getEnd(afterCell) === afterOffset ? failure(beforeCell) : adt$2.none('in same cell');\n          }\n        });\n      }).getOr(adt$2.none('default'));\n    };\n    const cata = (subject, onNone, onSuccess, onFailedUp, onFailedDown) => {\n      return subject.fold(onNone, onSuccess, onFailedUp, onFailedDown);\n    };\n    const BeforeAfter = {\n      ...adt$2,\n      verify,\n      cata\n    };\n\n    const inParent = (parent, children, element, index) => ({\n      parent,\n      children,\n      element,\n      index\n    });\n    const indexInParent = element => parent(element).bind(parent => {\n      const children = children$2(parent);\n      return indexOf(children, element).map(index => inParent(parent, children, element, index));\n    });\n    const indexOf = (elements, element) => findIndex(elements, curry(eq$1, element));\n\n    const isBr = isTag('br');\n    const gatherer = (cand, gather, isRoot) => {\n      return gather(cand, isRoot).bind(target => {\n        return isText(target) && get$6(target).trim().length === 0 ? gatherer(target, gather, isRoot) : Optional.some(target);\n      });\n    };\n    const handleBr = (isRoot, element, direction) => {\n      return direction.traverse(element).orThunk(() => {\n        return gatherer(element, direction.gather, isRoot);\n      }).map(direction.relative);\n    };\n    const findBr = (element, offset) => {\n      return child$2(element, offset).filter(isBr).orThunk(() => {\n        return child$2(element, offset - 1).filter(isBr);\n      });\n    };\n    const handleParent = (isRoot, element, offset, direction) => {\n      return findBr(element, offset).bind(br => {\n        return direction.traverse(br).fold(() => {\n          return gatherer(br, direction.gather, isRoot).map(direction.relative);\n        }, adjacent => {\n          return indexInParent(adjacent).map(info => {\n            return Situ.on(info.parent, info.index);\n          });\n        });\n      });\n    };\n    const tryBr = (isRoot, element, offset, direction) => {\n      const target = isBr(element) ? handleBr(isRoot, element, direction) : handleParent(isRoot, element, offset, direction);\n      return target.map(tgt => {\n        return {\n          start: tgt,\n          finish: tgt\n        };\n      });\n    };\n    const process = analysis => {\n      return BeforeAfter.cata(analysis, _message => {\n        return Optional.none();\n      }, () => {\n        return Optional.none();\n      }, cell => {\n        return Optional.some(point(cell, 0));\n      }, cell => {\n        return Optional.some(point(cell, getEnd(cell)));\n      });\n    };\n\n    const moveDown = (caret, amount) => {\n      return {\n        left: caret.left,\n        top: caret.top + amount,\n        right: caret.right,\n        bottom: caret.bottom + amount\n      };\n    };\n    const moveUp = (caret, amount) => {\n      return {\n        left: caret.left,\n        top: caret.top - amount,\n        right: caret.right,\n        bottom: caret.bottom - amount\n      };\n    };\n    const translate = (caret, xDelta, yDelta) => {\n      return {\n        left: caret.left + xDelta,\n        top: caret.top + yDelta,\n        right: caret.right + xDelta,\n        bottom: caret.bottom + yDelta\n      };\n    };\n    const getTop = caret => {\n      return caret.top;\n    };\n    const getBottom = caret => {\n      return caret.bottom;\n    };\n\n    const getPartialBox = (bridge, element, offset) => {\n      if (offset >= 0 && offset < getEnd(element)) {\n        return bridge.getRangedRect(element, offset, element, offset + 1);\n      } else if (offset > 0) {\n        return bridge.getRangedRect(element, offset - 1, element, offset);\n      }\n      return Optional.none();\n    };\n    const toCaret = rect => ({\n      left: rect.left,\n      top: rect.top,\n      right: rect.right,\n      bottom: rect.bottom\n    });\n    const getElemBox = (bridge, element) => {\n      return Optional.some(bridge.getRect(element));\n    };\n    const getBoxAt = (bridge, element, offset) => {\n      if (isElement(element)) {\n        return getElemBox(bridge, element).map(toCaret);\n      } else if (isText(element)) {\n        return getPartialBox(bridge, element, offset).map(toCaret);\n      } else {\n        return Optional.none();\n      }\n    };\n    const getEntireBox = (bridge, element) => {\n      if (isElement(element)) {\n        return getElemBox(bridge, element).map(toCaret);\n      } else if (isText(element)) {\n        return bridge.getRangedRect(element, 0, element, getEnd(element)).map(toCaret);\n      } else {\n        return Optional.none();\n      }\n    };\n\n    const JUMP_SIZE = 5;\n    const NUM_RETRIES = 100;\n    const adt$1 = Adt.generate([\n      { none: [] },\n      { retry: ['caret'] }\n    ]);\n    const isOutside = (caret, box) => {\n      return caret.left < box.left || Math.abs(box.right - caret.left) < 1 || caret.left > box.right;\n    };\n    const inOutsideBlock = (bridge, element, caret) => {\n      return closest$2(element, isBlock).fold(never, cell => {\n        return getEntireBox(bridge, cell).exists(box => {\n          return isOutside(caret, box);\n        });\n      });\n    };\n    const adjustDown = (bridge, element, guessBox, original, caret) => {\n      const lowerCaret = moveDown(caret, JUMP_SIZE);\n      if (Math.abs(guessBox.bottom - original.bottom) < 1) {\n        return adt$1.retry(lowerCaret);\n      } else if (guessBox.top > caret.bottom) {\n        return adt$1.retry(lowerCaret);\n      } else if (guessBox.top === caret.bottom) {\n        return adt$1.retry(moveDown(caret, 1));\n      } else {\n        return inOutsideBlock(bridge, element, caret) ? adt$1.retry(translate(lowerCaret, JUMP_SIZE, 0)) : adt$1.none();\n      }\n    };\n    const adjustUp = (bridge, element, guessBox, original, caret) => {\n      const higherCaret = moveUp(caret, JUMP_SIZE);\n      if (Math.abs(guessBox.top - original.top) < 1) {\n        return adt$1.retry(higherCaret);\n      } else if (guessBox.bottom < caret.top) {\n        return adt$1.retry(higherCaret);\n      } else if (guessBox.bottom === caret.top) {\n        return adt$1.retry(moveUp(caret, 1));\n      } else {\n        return inOutsideBlock(bridge, element, caret) ? adt$1.retry(translate(higherCaret, JUMP_SIZE, 0)) : adt$1.none();\n      }\n    };\n    const upMovement = {\n      point: getTop,\n      adjuster: adjustUp,\n      move: moveUp,\n      gather: before\n    };\n    const downMovement = {\n      point: getBottom,\n      adjuster: adjustDown,\n      move: moveDown,\n      gather: after$1\n    };\n    const isAtTable = (bridge, x, y) => {\n      return bridge.elementFromPoint(x, y).filter(elm => {\n        return name(elm) === 'table';\n      }).isSome();\n    };\n    const adjustForTable = (bridge, movement, original, caret, numRetries) => {\n      return adjustTil(bridge, movement, original, movement.move(caret, JUMP_SIZE), numRetries);\n    };\n    const adjustTil = (bridge, movement, original, caret, numRetries) => {\n      if (numRetries === 0) {\n        return Optional.some(caret);\n      }\n      if (isAtTable(bridge, caret.left, movement.point(caret))) {\n        return adjustForTable(bridge, movement, original, caret, numRetries - 1);\n      }\n      return bridge.situsFromPoint(caret.left, movement.point(caret)).bind(guess => {\n        return guess.start.fold(Optional.none, element => {\n          return getEntireBox(bridge, element).bind(guessBox => {\n            return movement.adjuster(bridge, element, guessBox, original, caret).fold(Optional.none, newCaret => {\n              return adjustTil(bridge, movement, original, newCaret, numRetries - 1);\n            });\n          }).orThunk(() => {\n            return Optional.some(caret);\n          });\n        }, Optional.none);\n      });\n    };\n    const checkScroll = (movement, adjusted, bridge) => {\n      if (movement.point(adjusted) > bridge.getInnerHeight()) {\n        return Optional.some(movement.point(adjusted) - bridge.getInnerHeight());\n      } else if (movement.point(adjusted) < 0) {\n        return Optional.some(-movement.point(adjusted));\n      } else {\n        return Optional.none();\n      }\n    };\n    const retry = (movement, bridge, caret) => {\n      const moved = movement.move(caret, JUMP_SIZE);\n      const adjusted = adjustTil(bridge, movement, caret, moved, NUM_RETRIES).getOr(moved);\n      return checkScroll(movement, adjusted, bridge).fold(() => {\n        return bridge.situsFromPoint(adjusted.left, movement.point(adjusted));\n      }, delta => {\n        bridge.scrollBy(0, delta);\n        return bridge.situsFromPoint(adjusted.left, movement.point(adjusted) - delta);\n      });\n    };\n    const Retries = {\n      tryUp: curry(retry, upMovement),\n      tryDown: curry(retry, downMovement),\n      getJumpSize: constant(JUMP_SIZE)\n    };\n\n    const MAX_RETRIES = 20;\n    const findSpot = (bridge, isRoot, direction) => {\n      return bridge.getSelection().bind(sel => {\n        return tryBr(isRoot, sel.finish, sel.foffset, direction).fold(() => {\n          return Optional.some(point(sel.finish, sel.foffset));\n        }, brNeighbour => {\n          const range = bridge.fromSitus(brNeighbour);\n          const analysis = BeforeAfter.verify(bridge, sel.finish, sel.foffset, range.finish, range.foffset, direction.failure, isRoot);\n          return process(analysis);\n        });\n      });\n    };\n    const scan = (bridge, isRoot, element, offset, direction, numRetries) => {\n      if (numRetries === 0) {\n        return Optional.none();\n      }\n      return tryCursor(bridge, isRoot, element, offset, direction).bind(situs => {\n        const range = bridge.fromSitus(situs);\n        const analysis = BeforeAfter.verify(bridge, element, offset, range.finish, range.foffset, direction.failure, isRoot);\n        return BeforeAfter.cata(analysis, () => {\n          return Optional.none();\n        }, () => {\n          return Optional.some(situs);\n        }, cell => {\n          if (eq$1(element, cell) && offset === 0) {\n            return tryAgain(bridge, element, offset, moveUp, direction);\n          } else {\n            return scan(bridge, isRoot, cell, 0, direction, numRetries - 1);\n          }\n        }, cell => {\n          if (eq$1(element, cell) && offset === getEnd(cell)) {\n            return tryAgain(bridge, element, offset, moveDown, direction);\n          } else {\n            return scan(bridge, isRoot, cell, getEnd(cell), direction, numRetries - 1);\n          }\n        });\n      });\n    };\n    const tryAgain = (bridge, element, offset, move, direction) => {\n      return getBoxAt(bridge, element, offset).bind(box => {\n        return tryAt(bridge, direction, move(box, Retries.getJumpSize()));\n      });\n    };\n    const tryAt = (bridge, direction, box) => {\n      const browser = detect$2().browser;\n      if (browser.isChromium() || browser.isSafari() || browser.isFirefox()) {\n        return direction.retry(bridge, box);\n      } else {\n        return Optional.none();\n      }\n    };\n    const tryCursor = (bridge, isRoot, element, offset, direction) => {\n      return getBoxAt(bridge, element, offset).bind(box => {\n        return tryAt(bridge, direction, box);\n      });\n    };\n    const handle$1 = (bridge, isRoot, direction) => {\n      return findSpot(bridge, isRoot, direction).bind(spot => {\n        return scan(bridge, isRoot, spot.element, spot.offset, direction, MAX_RETRIES).map(bridge.fromSitus);\n      });\n    };\n\n    const inSameTable = (elem, table) => {\n      return ancestor(elem, e => {\n        return parent(e).exists(p => {\n          return eq$1(p, table);\n        });\n      });\n    };\n    const simulate = (bridge, isRoot, direction, initial, anchor) => {\n      return closest$1(initial, 'td,th', isRoot).bind(start => {\n        return closest$1(start, 'table', isRoot).bind(table => {\n          if (!inSameTable(anchor, table)) {\n            return Optional.none();\n          }\n          return handle$1(bridge, isRoot, direction).bind(range => {\n            return closest$1(range.finish, 'td,th', isRoot).map(finish => {\n              return {\n                start,\n                finish,\n                range\n              };\n            });\n          });\n        });\n      });\n    };\n    const navigate = (bridge, isRoot, direction, initial, anchor, precheck) => {\n      return precheck(initial, isRoot).orThunk(() => {\n        return simulate(bridge, isRoot, direction, initial, anchor).map(info => {\n          const range = info.range;\n          return Response.create(Optional.some(makeSitus(range.start, range.soffset, range.finish, range.foffset)), true);\n        });\n      });\n    };\n    const firstUpCheck = (initial, isRoot) => {\n      return closest$1(initial, 'tr', isRoot).bind(startRow => {\n        return closest$1(startRow, 'table', isRoot).bind(table => {\n          const rows = descendants(table, 'tr');\n          if (eq$1(startRow, rows[0])) {\n            return seekLeft(table, element => {\n              return last$1(element).isSome();\n            }, isRoot).map(last => {\n              const lastOffset = getEnd(last);\n              return Response.create(Optional.some(makeSitus(last, lastOffset, last, lastOffset)), true);\n            });\n          } else {\n            return Optional.none();\n          }\n        });\n      });\n    };\n    const lastDownCheck = (initial, isRoot) => {\n      return closest$1(initial, 'tr', isRoot).bind(startRow => {\n        return closest$1(startRow, 'table', isRoot).bind(table => {\n          const rows = descendants(table, 'tr');\n          if (eq$1(startRow, rows[rows.length - 1])) {\n            return seekRight(table, element => {\n              return first(element).isSome();\n            }, isRoot).map(first => {\n              return Response.create(Optional.some(makeSitus(first, 0, first, 0)), true);\n            });\n          } else {\n            return Optional.none();\n          }\n        });\n      });\n    };\n    const select = (bridge, container, isRoot, direction, initial, anchor, selectRange) => {\n      return simulate(bridge, isRoot, direction, initial, anchor).bind(info => {\n        return detect(container, isRoot, info.start, info.finish, selectRange);\n      });\n    };\n\n    const Cell = initial => {\n      let value = initial;\n      const get = () => {\n        return value;\n      };\n      const set = v => {\n        value = v;\n      };\n      return {\n        get,\n        set\n      };\n    };\n\n    const singleton = doRevoke => {\n      const subject = Cell(Optional.none());\n      const revoke = () => subject.get().each(doRevoke);\n      const clear = () => {\n        revoke();\n        subject.set(Optional.none());\n      };\n      const isSet = () => subject.get().isSome();\n      const get = () => subject.get();\n      const set = s => {\n        revoke();\n        subject.set(Optional.some(s));\n      };\n      return {\n        clear,\n        isSet,\n        get,\n        set\n      };\n    };\n    const value = () => {\n      const subject = singleton(noop);\n      const on = f => subject.get().each(f);\n      return {\n        ...subject,\n        on\n      };\n    };\n\n    const findCell = (target, isRoot) => closest$1(target, 'td,th', isRoot);\n    const isInEditableContext = cell => parentElement(cell).exists(isEditable$1);\n    const MouseSelection = (bridge, container, isRoot, annotations) => {\n      const cursor = value();\n      const clearstate = cursor.clear;\n      const applySelection = event => {\n        cursor.on(start => {\n          annotations.clearBeforeUpdate(container);\n          findCell(event.target, isRoot).each(finish => {\n            identify(start, finish, isRoot).each(cellSel => {\n              const boxes = cellSel.boxes.getOr([]);\n              if (boxes.length === 1) {\n                const singleCell = boxes[0];\n                const isNonEditableCell = getRaw(singleCell) === 'false';\n                const isCellClosestContentEditable = is(closest(event.target), singleCell, eq$1);\n                if (isNonEditableCell && isCellClosestContentEditable) {\n                  annotations.selectRange(container, boxes, singleCell, singleCell);\n                  bridge.selectContents(singleCell);\n                }\n              } else if (boxes.length > 1) {\n                annotations.selectRange(container, boxes, cellSel.start, cellSel.finish);\n                bridge.selectContents(finish);\n              }\n            });\n          });\n        });\n      };\n      const mousedown = event => {\n        annotations.clear(container);\n        findCell(event.target, isRoot).filter(isInEditableContext).each(cursor.set);\n      };\n      const mouseover = event => {\n        applySelection(event);\n      };\n      const mouseup = event => {\n        applySelection(event);\n        clearstate();\n      };\n      return {\n        clearstate,\n        mousedown,\n        mouseover,\n        mouseup\n      };\n    };\n\n    const down = {\n      traverse: nextSibling,\n      gather: after$1,\n      relative: Situ.before,\n      retry: Retries.tryDown,\n      failure: BeforeAfter.failedDown\n    };\n    const up = {\n      traverse: prevSibling,\n      gather: before,\n      relative: Situ.before,\n      retry: Retries.tryUp,\n      failure: BeforeAfter.failedUp\n    };\n\n    const isKey = key => {\n      return keycode => {\n        return keycode === key;\n      };\n    };\n    const isUp = isKey(38);\n    const isDown = isKey(40);\n    const isNavigation = keycode => {\n      return keycode >= 37 && keycode <= 40;\n    };\n    const ltr = {\n      isBackward: isKey(37),\n      isForward: isKey(39)\n    };\n    const rtl = {\n      isBackward: isKey(39),\n      isForward: isKey(37)\n    };\n\n    const get$3 = _DOC => {\n      const doc = _DOC !== undefined ? _DOC.dom : document;\n      const x = doc.body.scrollLeft || doc.documentElement.scrollLeft;\n      const y = doc.body.scrollTop || doc.documentElement.scrollTop;\n      return SugarPosition(x, y);\n    };\n    const by = (x, y, _DOC) => {\n      const doc = _DOC !== undefined ? _DOC.dom : document;\n      const win = doc.defaultView;\n      if (win) {\n        win.scrollBy(x, y);\n      }\n    };\n\n    const adt = Adt.generate([\n      { domRange: ['rng'] },\n      {\n        relative: [\n          'startSitu',\n          'finishSitu'\n        ]\n      },\n      {\n        exact: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      }\n    ]);\n    const exactFromRange = simRange => adt.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset);\n    const getStart = selection => selection.match({\n      domRange: rng => SugarElement.fromDom(rng.startContainer),\n      relative: (startSitu, _finishSitu) => Situ.getStart(startSitu),\n      exact: (start, _soffset, _finish, _foffset) => start\n    });\n    const domRange = adt.domRange;\n    const relative = adt.relative;\n    const exact = adt.exact;\n    const getWin = selection => {\n      const start = getStart(selection);\n      return defaultView(start);\n    };\n    const range = SimRange.create;\n    const SimSelection = {\n      domRange,\n      relative,\n      exact,\n      exactFromRange,\n      getWin,\n      range\n    };\n\n    const caretPositionFromPoint = (doc, x, y) => {\n      var _a, _b;\n      return Optional.from((_b = (_a = doc.dom).caretPositionFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y)).bind(pos => {\n        if (pos.offsetNode === null) {\n          return Optional.none();\n        }\n        const r = doc.dom.createRange();\n        r.setStart(pos.offsetNode, pos.offset);\n        r.collapse();\n        return Optional.some(r);\n      });\n    };\n    const caretRangeFromPoint = (doc, x, y) => {\n      var _a, _b;\n      return Optional.from((_b = (_a = doc.dom).caretRangeFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y));\n    };\n    const availableSearch = (() => {\n      if (document.caretPositionFromPoint) {\n        return caretPositionFromPoint;\n      } else if (document.caretRangeFromPoint) {\n        return caretRangeFromPoint;\n      } else {\n        return Optional.none;\n      }\n    })();\n    const fromPoint = (win, x, y) => {\n      const doc = SugarElement.fromDom(win.document);\n      return availableSearch(doc, x, y).map(rng => SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset));\n    };\n\n    const beforeSpecial = (element, offset) => {\n      const name$1 = name(element);\n      if ('input' === name$1) {\n        return Situ.after(element);\n      } else if (!contains$2([\n          'br',\n          'img'\n        ], name$1)) {\n        return Situ.on(element, offset);\n      } else {\n        return offset === 0 ? Situ.before(element) : Situ.after(element);\n      }\n    };\n    const preprocessRelative = (startSitu, finishSitu) => {\n      const start = startSitu.fold(Situ.before, beforeSpecial, Situ.after);\n      const finish = finishSitu.fold(Situ.before, beforeSpecial, Situ.after);\n      return SimSelection.relative(start, finish);\n    };\n    const preprocessExact = (start, soffset, finish, foffset) => {\n      const startSitu = beforeSpecial(start, soffset);\n      const finishSitu = beforeSpecial(finish, foffset);\n      return SimSelection.relative(startSitu, finishSitu);\n    };\n\n    const makeRange = (start, soffset, finish, foffset) => {\n      const doc = owner(start);\n      const rng = doc.dom.createRange();\n      rng.setStart(start.dom, soffset);\n      rng.setEnd(finish.dom, foffset);\n      return rng;\n    };\n    const after = (start, soffset, finish, foffset) => {\n      const r = makeRange(start, soffset, finish, foffset);\n      const same = eq$1(start, finish) && soffset === foffset;\n      return r.collapsed && !same;\n    };\n\n    const getNativeSelection = win => Optional.from(win.getSelection());\n    const doSetNativeRange = (win, rng) => {\n      getNativeSelection(win).each(selection => {\n        selection.removeAllRanges();\n        selection.addRange(rng);\n      });\n    };\n    const doSetRange = (win, start, soffset, finish, foffset) => {\n      const rng = exactToNative(win, start, soffset, finish, foffset);\n      doSetNativeRange(win, rng);\n    };\n    const setLegacyRtlRange = (win, selection, start, soffset, finish, foffset) => {\n      selection.collapse(start.dom, soffset);\n      selection.extend(finish.dom, foffset);\n    };\n    const setRangeFromRelative = (win, relative) => diagnose(win, relative).match({\n      ltr: (start, soffset, finish, foffset) => {\n        doSetRange(win, start, soffset, finish, foffset);\n      },\n      rtl: (start, soffset, finish, foffset) => {\n        getNativeSelection(win).each(selection => {\n          if (selection.setBaseAndExtent) {\n            selection.setBaseAndExtent(start.dom, soffset, finish.dom, foffset);\n          } else if (selection.extend) {\n            try {\n              setLegacyRtlRange(win, selection, start, soffset, finish, foffset);\n            } catch (e) {\n              doSetRange(win, finish, foffset, start, soffset);\n            }\n          } else {\n            doSetRange(win, finish, foffset, start, soffset);\n          }\n        });\n      }\n    });\n    const setExact = (win, start, soffset, finish, foffset) => {\n      const relative = preprocessExact(start, soffset, finish, foffset);\n      setRangeFromRelative(win, relative);\n    };\n    const setRelative = (win, startSitu, finishSitu) => {\n      const relative = preprocessRelative(startSitu, finishSitu);\n      setRangeFromRelative(win, relative);\n    };\n    const readRange = selection => {\n      if (selection.rangeCount > 0) {\n        const firstRng = selection.getRangeAt(0);\n        const lastRng = selection.getRangeAt(selection.rangeCount - 1);\n        return Optional.some(SimRange.create(SugarElement.fromDom(firstRng.startContainer), firstRng.startOffset, SugarElement.fromDom(lastRng.endContainer), lastRng.endOffset));\n      } else {\n        return Optional.none();\n      }\n    };\n    const doGetExact = selection => {\n      if (selection.anchorNode === null || selection.focusNode === null) {\n        return readRange(selection);\n      } else {\n        const anchor = SugarElement.fromDom(selection.anchorNode);\n        const focus = SugarElement.fromDom(selection.focusNode);\n        return after(anchor, selection.anchorOffset, focus, selection.focusOffset) ? Optional.some(SimRange.create(anchor, selection.anchorOffset, focus, selection.focusOffset)) : readRange(selection);\n      }\n    };\n    const setToElement = (win, element, selectNodeContents$1 = true) => {\n      const rngGetter = selectNodeContents$1 ? selectNodeContents : selectNode;\n      const rng = rngGetter(win, element);\n      doSetNativeRange(win, rng);\n    };\n    const getExact = win => getNativeSelection(win).filter(sel => sel.rangeCount > 0).bind(doGetExact);\n    const get$2 = win => getExact(win).map(range => SimSelection.exact(range.start, range.soffset, range.finish, range.foffset));\n    const getFirstRect = (win, selection) => {\n      const rng = asLtrRange(win, selection);\n      return getFirstRect$1(rng);\n    };\n    const getAtPoint = (win, x, y) => fromPoint(win, x, y);\n    const clear = win => {\n      getNativeSelection(win).each(selection => selection.removeAllRanges());\n    };\n\n    const WindowBridge = win => {\n      const elementFromPoint = (x, y) => {\n        return SugarElement.fromPoint(SugarElement.fromDom(win.document), x, y);\n      };\n      const getRect = element => {\n        return element.dom.getBoundingClientRect();\n      };\n      const getRangedRect = (start, soffset, finish, foffset) => {\n        const sel = SimSelection.exact(start, soffset, finish, foffset);\n        return getFirstRect(win, sel);\n      };\n      const getSelection = () => {\n        return get$2(win).map(exactAdt => {\n          return convertToRange(win, exactAdt);\n        });\n      };\n      const fromSitus = situs => {\n        const relative = SimSelection.relative(situs.start, situs.finish);\n        return convertToRange(win, relative);\n      };\n      const situsFromPoint = (x, y) => {\n        return getAtPoint(win, x, y).map(exact => {\n          return Situs.create(exact.start, exact.soffset, exact.finish, exact.foffset);\n        });\n      };\n      const clearSelection = () => {\n        clear(win);\n      };\n      const collapseSelection = (toStart = false) => {\n        get$2(win).each(sel => sel.fold(rng => rng.collapse(toStart), (startSitu, finishSitu) => {\n          const situ = toStart ? startSitu : finishSitu;\n          setRelative(win, situ, situ);\n        }, (start, soffset, finish, foffset) => {\n          const node = toStart ? start : finish;\n          const offset = toStart ? soffset : foffset;\n          setExact(win, node, offset, node, offset);\n        }));\n      };\n      const selectNode = element => {\n        setToElement(win, element, false);\n      };\n      const selectContents = element => {\n        setToElement(win, element);\n      };\n      const setSelection = sel => {\n        setExact(win, sel.start, sel.soffset, sel.finish, sel.foffset);\n      };\n      const setRelativeSelection = (start, finish) => {\n        setRelative(win, start, finish);\n      };\n      const getInnerHeight = () => {\n        return win.innerHeight;\n      };\n      const getScrollY = () => {\n        const pos = get$3(SugarElement.fromDom(win.document));\n        return pos.top;\n      };\n      const scrollBy = (x, y) => {\n        by(x, y, SugarElement.fromDom(win.document));\n      };\n      return {\n        elementFromPoint,\n        getRect,\n        getRangedRect,\n        getSelection,\n        fromSitus,\n        situsFromPoint,\n        clearSelection,\n        collapseSelection,\n        setSelection,\n        setRelativeSelection,\n        selectNode,\n        selectContents,\n        getInnerHeight,\n        getScrollY,\n        scrollBy\n      };\n    };\n\n    const rc = (rows, cols) => ({\n      rows,\n      cols\n    });\n    const mouse = (win, container, isRoot, annotations) => {\n      const bridge = WindowBridge(win);\n      const handlers = MouseSelection(bridge, container, isRoot, annotations);\n      return {\n        clearstate: handlers.clearstate,\n        mousedown: handlers.mousedown,\n        mouseover: handlers.mouseover,\n        mouseup: handlers.mouseup\n      };\n    };\n    const isEditableNode = node => closest$2(node, isHTMLElement).exists(isEditable$1);\n    const isEditableSelection = (start, finish) => isEditableNode(start) || isEditableNode(finish);\n    const keyboard = (win, container, isRoot, annotations) => {\n      const bridge = WindowBridge(win);\n      const clearToNavigate = () => {\n        annotations.clear(container);\n        return Optional.none();\n      };\n      const keydown = (event, start, soffset, finish, foffset, direction) => {\n        const realEvent = event.raw;\n        const keycode = realEvent.which;\n        const shiftKey = realEvent.shiftKey === true;\n        const handler = retrieve$1(container, annotations.selectedSelector).fold(() => {\n          if (isNavigation(keycode) && !shiftKey) {\n            annotations.clearBeforeUpdate(container);\n          }\n          if (isNavigation(keycode) && shiftKey && !isEditableSelection(start, finish)) {\n            return Optional.none;\n          } else if (isDown(keycode) && shiftKey) {\n            return curry(select, bridge, container, isRoot, down, finish, start, annotations.selectRange);\n          } else if (isUp(keycode) && shiftKey) {\n            return curry(select, bridge, container, isRoot, up, finish, start, annotations.selectRange);\n          } else if (isDown(keycode)) {\n            return curry(navigate, bridge, isRoot, down, finish, start, lastDownCheck);\n          } else if (isUp(keycode)) {\n            return curry(navigate, bridge, isRoot, up, finish, start, firstUpCheck);\n          } else {\n            return Optional.none;\n          }\n        }, selected => {\n          const update$1 = attempts => {\n            return () => {\n              const navigation = findMap(attempts, delta => {\n                return update(delta.rows, delta.cols, container, selected, annotations);\n              });\n              return navigation.fold(() => {\n                return getEdges(container, annotations.firstSelectedSelector, annotations.lastSelectedSelector).map(edges => {\n                  const relative = isDown(keycode) || direction.isForward(keycode) ? Situ.after : Situ.before;\n                  bridge.setRelativeSelection(Situ.on(edges.first, 0), relative(edges.table));\n                  annotations.clear(container);\n                  return Response.create(Optional.none(), true);\n                });\n              }, _ => {\n                return Optional.some(Response.create(Optional.none(), true));\n              });\n            };\n          };\n          if (isNavigation(keycode) && shiftKey && !isEditableSelection(start, finish)) {\n            return Optional.none;\n          } else if (isDown(keycode) && shiftKey) {\n            return update$1([rc(+1, 0)]);\n          } else if (isUp(keycode) && shiftKey) {\n            return update$1([rc(-1, 0)]);\n          } else if (direction.isBackward(keycode) && shiftKey) {\n            return update$1([\n              rc(0, -1),\n              rc(-1, 0)\n            ]);\n          } else if (direction.isForward(keycode) && shiftKey) {\n            return update$1([\n              rc(0, +1),\n              rc(+1, 0)\n            ]);\n          } else if (isNavigation(keycode) && !shiftKey) {\n            return clearToNavigate;\n          } else {\n            return Optional.none;\n          }\n        });\n        return handler();\n      };\n      const keyup = (event, start, soffset, finish, foffset) => {\n        return retrieve$1(container, annotations.selectedSelector).fold(() => {\n          const realEvent = event.raw;\n          const keycode = realEvent.which;\n          const shiftKey = realEvent.shiftKey === true;\n          if (!shiftKey) {\n            return Optional.none();\n          }\n          if (isNavigation(keycode) && isEditableSelection(start, finish)) {\n            return sync(container, isRoot, start, soffset, finish, foffset, annotations.selectRange);\n          } else {\n            return Optional.none();\n          }\n        }, Optional.none);\n      };\n      return {\n        keydown,\n        keyup\n      };\n    };\n    const external = (win, container, isRoot, annotations) => {\n      const bridge = WindowBridge(win);\n      return (start, finish) => {\n        annotations.clearBeforeUpdate(container);\n        identify(start, finish, isRoot).each(cellSel => {\n          const boxes = cellSel.boxes.getOr([]);\n          annotations.selectRange(container, boxes, cellSel.start, cellSel.finish);\n          bridge.selectContents(finish);\n          bridge.collapseSelection();\n        });\n      };\n    };\n\n    const read = (element, attr) => {\n      const value = get$b(element, attr);\n      return value === undefined || value === '' ? [] : value.split(' ');\n    };\n    const add$2 = (element, attr, id) => {\n      const old = read(element, attr);\n      const nu = old.concat([id]);\n      set$2(element, attr, nu.join(' '));\n      return true;\n    };\n    const remove$4 = (element, attr, id) => {\n      const nu = filter$2(read(element, attr), v => v !== id);\n      if (nu.length > 0) {\n        set$2(element, attr, nu.join(' '));\n      } else {\n        remove$7(element, attr);\n      }\n      return false;\n    };\n\n    const supports = element => element.dom.classList !== undefined;\n    const get$1 = element => read(element, 'class');\n    const add$1 = (element, clazz) => add$2(element, 'class', clazz);\n    const remove$3 = (element, clazz) => remove$4(element, 'class', clazz);\n\n    const add = (element, clazz) => {\n      if (supports(element)) {\n        element.dom.classList.add(clazz);\n      } else {\n        add$1(element, clazz);\n      }\n    };\n    const cleanClass = element => {\n      const classList = supports(element) ? element.dom.classList : get$1(element);\n      if (classList.length === 0) {\n        remove$7(element, 'class');\n      }\n    };\n    const remove$2 = (element, clazz) => {\n      if (supports(element)) {\n        const classList = element.dom.classList;\n        classList.remove(clazz);\n      } else {\n        remove$3(element, clazz);\n      }\n      cleanClass(element);\n    };\n    const has = (element, clazz) => supports(element) && element.dom.classList.contains(clazz);\n\n    const remove$1 = (element, classes) => {\n      each$2(classes, x => {\n        remove$2(element, x);\n      });\n    };\n\n    const addClass = clazz => element => {\n      add(element, clazz);\n    };\n    const removeClasses = classes => element => {\n      remove$1(element, classes);\n    };\n\n    const byClass = ephemera => {\n      const addSelectionClass = addClass(ephemera.selected);\n      const removeSelectionClasses = removeClasses([\n        ephemera.selected,\n        ephemera.lastSelected,\n        ephemera.firstSelected\n      ]);\n      const clear = container => {\n        const sels = descendants(container, ephemera.selectedSelector);\n        each$2(sels, removeSelectionClasses);\n      };\n      const selectRange = (container, cells, start, finish) => {\n        clear(container);\n        each$2(cells, addSelectionClass);\n        add(start, ephemera.firstSelected);\n        add(finish, ephemera.lastSelected);\n      };\n      return {\n        clearBeforeUpdate: clear,\n        clear,\n        selectRange,\n        selectedSelector: ephemera.selectedSelector,\n        firstSelectedSelector: ephemera.firstSelectedSelector,\n        lastSelectedSelector: ephemera.lastSelectedSelector\n      };\n    };\n    const byAttr = (ephemera, onSelection, onClear) => {\n      const removeSelectionAttributes = element => {\n        remove$7(element, ephemera.selected);\n        remove$7(element, ephemera.firstSelected);\n        remove$7(element, ephemera.lastSelected);\n      };\n      const addSelectionAttribute = element => {\n        set$2(element, ephemera.selected, '1');\n      };\n      const clear = container => {\n        clearBeforeUpdate(container);\n        onClear();\n      };\n      const clearBeforeUpdate = container => {\n        const sels = descendants(container, `${ ephemera.selectedSelector },${ ephemera.firstSelectedSelector },${ ephemera.lastSelectedSelector }`);\n        each$2(sels, removeSelectionAttributes);\n      };\n      const selectRange = (container, cells, start, finish) => {\n        clear(container);\n        each$2(cells, addSelectionAttribute);\n        set$2(start, ephemera.firstSelected, '1');\n        set$2(finish, ephemera.lastSelected, '1');\n        onSelection(cells, start, finish);\n      };\n      return {\n        clearBeforeUpdate,\n        clear,\n        selectRange,\n        selectedSelector: ephemera.selectedSelector,\n        firstSelectedSelector: ephemera.firstSelectedSelector,\n        lastSelectedSelector: ephemera.lastSelectedSelector\n      };\n    };\n    const SelectionAnnotation = {\n      byClass,\n      byAttr\n    };\n\n    const fold = (subject, onNone, onMultiple, onSingle) => {\n      switch (subject.tag) {\n      case 'none':\n        return onNone();\n      case 'single':\n        return onSingle(subject.element);\n      case 'multiple':\n        return onMultiple(subject.elements);\n      }\n    };\n    const none = () => ({ tag: 'none' });\n    const multiple = elements => ({\n      tag: 'multiple',\n      elements\n    });\n    const single = element => ({\n      tag: 'single',\n      element\n    });\n\n    const Selections = (lazyRoot, getStart, selectedSelector) => {\n      const get = () => retrieve(lazyRoot(), selectedSelector).fold(() => getStart().fold(none, single), multiple);\n      return { get };\n    };\n\n    const getUpOrLeftCells = (grid, selectedCells) => {\n      const upGrid = grid.slice(0, selectedCells[selectedCells.length - 1].row + 1);\n      const upDetails = toDetailList(upGrid);\n      return bind$2(upDetails, detail => {\n        const slicedCells = detail.cells.slice(0, selectedCells[selectedCells.length - 1].column + 1);\n        return map$1(slicedCells, cell => cell.element);\n      });\n    };\n    const getDownOrRightCells = (grid, selectedCells) => {\n      const downGrid = grid.slice(selectedCells[0].row + selectedCells[0].rowspan - 1, grid.length);\n      const downDetails = toDetailList(downGrid);\n      return bind$2(downDetails, detail => {\n        const slicedCells = detail.cells.slice(selectedCells[0].column + selectedCells[0].colspan - 1, detail.cells.length);\n        return map$1(slicedCells, cell => cell.element);\n      });\n    };\n    const getOtherCells = (table, target, generators) => {\n      const warehouse = Warehouse.fromTable(table);\n      const details = onCells(warehouse, target);\n      return details.map(selectedCells => {\n        const grid = toGrid(warehouse, generators, false);\n        const {rows} = extractGridDetails(grid);\n        const upOrLeftCells = getUpOrLeftCells(rows, selectedCells);\n        const downOrRightCells = getDownOrRightCells(rows, selectedCells);\n        return {\n          upOrLeftCells,\n          downOrRightCells\n        };\n      });\n    };\n\n    const mkEvent = (target, x, y, stop, prevent, kill, raw) => ({\n      target,\n      x,\n      y,\n      stop,\n      prevent,\n      kill,\n      raw\n    });\n    const fromRawEvent$1 = rawEvent => {\n      const target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));\n      const stop = () => rawEvent.stopPropagation();\n      const prevent = () => rawEvent.preventDefault();\n      const kill = compose(prevent, stop);\n      return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);\n    };\n    const handle = (filter, handler) => rawEvent => {\n      if (filter(rawEvent)) {\n        handler(fromRawEvent$1(rawEvent));\n      }\n    };\n    const binder = (element, event, filter, handler, useCapture) => {\n      const wrapped = handle(filter, handler);\n      element.dom.addEventListener(event, wrapped, useCapture);\n      return { unbind: curry(unbind, element, event, wrapped, useCapture) };\n    };\n    const bind$1 = (element, event, filter, handler) => binder(element, event, filter, handler, false);\n    const unbind = (element, event, handler, useCapture) => {\n      element.dom.removeEventListener(event, handler, useCapture);\n    };\n\n    const filter = always;\n    const bind = (element, event, handler) => bind$1(element, event, filter, handler);\n    const fromRawEvent = fromRawEvent$1;\n\n    const hasInternalTarget = e => !has(SugarElement.fromDom(e.target), 'ephox-snooker-resizer-bar');\n    const TableCellSelectionHandler = (editor, resizeHandler) => {\n      const cellSelection = Selections(() => SugarElement.fromDom(editor.getBody()), () => getSelectionCell(getSelectionStart(editor), getIsRoot(editor)), ephemera.selectedSelector);\n      const onSelection = (cells, start, finish) => {\n        const tableOpt = table(start);\n        tableOpt.each(table => {\n          const cellsDom = map$1(cells, cell => cell.dom);\n          const cloneFormats = getTableCloneElements(editor);\n          const generators = cellOperations(noop, SugarElement.fromDom(editor.getDoc()), cloneFormats);\n          const selectedCells = getCellsFromSelection(editor);\n          const otherCellsDom = getOtherCells(table, { selection: selectedCells }, generators).map(otherCells => map(otherCells, cellArr => map$1(cellArr, cell => cell.dom))).getOrUndefined();\n          fireTableSelectionChange(editor, cellsDom, start.dom, finish.dom, otherCellsDom);\n        });\n      };\n      const onClear = () => fireTableSelectionClear(editor);\n      const annotations = SelectionAnnotation.byAttr(ephemera, onSelection, onClear);\n      editor.on('init', _e => {\n        const win = editor.getWin();\n        const body = getBody(editor);\n        const isRoot = getIsRoot(editor);\n        const syncSelection = () => {\n          const sel = editor.selection;\n          const start = SugarElement.fromDom(sel.getStart());\n          const end = SugarElement.fromDom(sel.getEnd());\n          const shared = sharedOne(table, [\n            start,\n            end\n          ]);\n          shared.fold(() => annotations.clear(body), noop);\n        };\n        const mouseHandlers = mouse(win, body, isRoot, annotations);\n        const keyHandlers = keyboard(win, body, isRoot, annotations);\n        const external$1 = external(win, body, isRoot, annotations);\n        const hasShiftKey = event => event.raw.shiftKey === true;\n        editor.on('TableSelectorChange', e => external$1(e.start, e.finish));\n        const handleResponse = (event, response) => {\n          if (!hasShiftKey(event)) {\n            return;\n          }\n          if (response.kill) {\n            event.kill();\n          }\n          response.selection.each(ns => {\n            const relative = SimSelection.relative(ns.start, ns.finish);\n            const rng = asLtrRange(win, relative);\n            editor.selection.setRng(rng);\n          });\n        };\n        const keyup = event => {\n          const wrappedEvent = fromRawEvent(event);\n          if (wrappedEvent.raw.shiftKey && isNavigation(wrappedEvent.raw.which)) {\n            const rng = editor.selection.getRng();\n            const start = SugarElement.fromDom(rng.startContainer);\n            const end = SugarElement.fromDom(rng.endContainer);\n            keyHandlers.keyup(wrappedEvent, start, rng.startOffset, end, rng.endOffset).each(response => {\n              handleResponse(wrappedEvent, response);\n            });\n          }\n        };\n        const keydown = event => {\n          const wrappedEvent = fromRawEvent(event);\n          resizeHandler.hide();\n          const rng = editor.selection.getRng();\n          const start = SugarElement.fromDom(rng.startContainer);\n          const end = SugarElement.fromDom(rng.endContainer);\n          const direction = onDirection(ltr, rtl)(SugarElement.fromDom(editor.selection.getStart()));\n          keyHandlers.keydown(wrappedEvent, start, rng.startOffset, end, rng.endOffset, direction).each(response => {\n            handleResponse(wrappedEvent, response);\n          });\n          resizeHandler.show();\n        };\n        const isLeftMouse = raw => raw.button === 0;\n        const isLeftButtonPressed = raw => {\n          if (raw.buttons === undefined) {\n            return true;\n          }\n          return (raw.buttons & 1) !== 0;\n        };\n        const dragStart = _e => {\n          mouseHandlers.clearstate();\n        };\n        const mouseDown = e => {\n          if (isLeftMouse(e) && hasInternalTarget(e)) {\n            mouseHandlers.mousedown(fromRawEvent(e));\n          }\n        };\n        const mouseOver = e => {\n          if (isLeftButtonPressed(e) && hasInternalTarget(e)) {\n            mouseHandlers.mouseover(fromRawEvent(e));\n          }\n        };\n        const mouseUp = e => {\n          if (isLeftMouse(e) && hasInternalTarget(e)) {\n            mouseHandlers.mouseup(fromRawEvent(e));\n          }\n        };\n        const getDoubleTap = () => {\n          const lastTarget = Cell(SugarElement.fromDom(body));\n          const lastTimeStamp = Cell(0);\n          const touchEnd = t => {\n            const target = SugarElement.fromDom(t.target);\n            if (isTag('td')(target) || isTag('th')(target)) {\n              const lT = lastTarget.get();\n              const lTS = lastTimeStamp.get();\n              if (eq$1(lT, target) && t.timeStamp - lTS < 300) {\n                t.preventDefault();\n                external$1(target, target);\n              }\n            }\n            lastTarget.set(target);\n            lastTimeStamp.set(t.timeStamp);\n          };\n          return { touchEnd };\n        };\n        const doubleTap = getDoubleTap();\n        editor.on('dragstart', dragStart);\n        editor.on('mousedown', mouseDown);\n        editor.on('mouseover', mouseOver);\n        editor.on('mouseup', mouseUp);\n        editor.on('touchend', doubleTap.touchEnd);\n        editor.on('keyup', keyup);\n        editor.on('keydown', keydown);\n        editor.on('NodeChange', syncSelection);\n      });\n      editor.on('PreInit', () => {\n        editor.serializer.addTempAttr(ephemera.firstSelected);\n        editor.serializer.addTempAttr(ephemera.lastSelected);\n      });\n      const clearSelectedCells = container => annotations.clear(SugarElement.fromDom(container));\n      const getSelectedCells = () => fold(cellSelection.get(), constant([]), cells => {\n        return map$1(cells, cell => cell.dom);\n      }, cell => [cell.dom]);\n      return {\n        getSelectedCells,\n        clearSelectedCells\n      };\n    };\n\n    const Event = fields => {\n      let handlers = [];\n      const bind = handler => {\n        if (handler === undefined) {\n          throw new Error('Event bind error: undefined handler');\n        }\n        handlers.push(handler);\n      };\n      const unbind = handler => {\n        handlers = filter$2(handlers, h => {\n          return h !== handler;\n        });\n      };\n      const trigger = (...args) => {\n        const event = {};\n        each$2(fields, (name, i) => {\n          event[name] = args[i];\n        });\n        each$2(handlers, handler => {\n          handler(event);\n        });\n      };\n      return {\n        bind,\n        unbind,\n        trigger\n      };\n    };\n\n    const create$1 = typeDefs => {\n      const registry = map(typeDefs, event => {\n        return {\n          bind: event.bind,\n          unbind: event.unbind\n        };\n      });\n      const trigger = map(typeDefs, event => {\n        return event.trigger;\n      });\n      return {\n        registry,\n        trigger\n      };\n    };\n\n    const last = (fn, rate) => {\n      let timer = null;\n      const cancel = () => {\n        if (!isNull(timer)) {\n          clearTimeout(timer);\n          timer = null;\n        }\n      };\n      const throttle = (...args) => {\n        cancel();\n        timer = setTimeout(() => {\n          timer = null;\n          fn.apply(null, args);\n        }, rate);\n      };\n      return {\n        cancel,\n        throttle\n      };\n    };\n\n    const sort = arr => {\n      return arr.slice(0).sort();\n    };\n    const reqMessage = (required, keys) => {\n      throw new Error('All required keys (' + sort(required).join(', ') + ') were not specified. Specified keys were: ' + sort(keys).join(', ') + '.');\n    };\n    const unsuppMessage = unsupported => {\n      throw new Error('Unsupported keys for object: ' + sort(unsupported).join(', '));\n    };\n    const validateStrArr = (label, array) => {\n      if (!isArray(array)) {\n        throw new Error('The ' + label + ' fields must be an array. Was: ' + array + '.');\n      }\n      each$2(array, a => {\n        if (!isString(a)) {\n          throw new Error('The value ' + a + ' in the ' + label + ' fields was not a string.');\n        }\n      });\n    };\n    const invalidTypeMessage = (incorrect, type) => {\n      throw new Error('All values need to be of type: ' + type + '. Keys (' + sort(incorrect).join(', ') + ') were not.');\n    };\n    const checkDupes = everything => {\n      const sorted = sort(everything);\n      const dupe = find$1(sorted, (s, i) => {\n        return i < sorted.length - 1 && s === sorted[i + 1];\n      });\n      dupe.each(d => {\n        throw new Error('The field: ' + d + ' occurs more than once in the combined fields: [' + sorted.join(', ') + '].');\n      });\n    };\n\n    const base = (handleUnsupported, required) => {\n      return baseWith(handleUnsupported, required, {\n        validate: isFunction,\n        label: 'function'\n      });\n    };\n    const baseWith = (handleUnsupported, required, pred) => {\n      if (required.length === 0) {\n        throw new Error('You must specify at least one required field.');\n      }\n      validateStrArr('required', required);\n      checkDupes(required);\n      return obj => {\n        const keys$1 = keys(obj);\n        const allReqd = forall(required, req => {\n          return contains$2(keys$1, req);\n        });\n        if (!allReqd) {\n          reqMessage(required, keys$1);\n        }\n        handleUnsupported(required, keys$1);\n        const invalidKeys = filter$2(required, key => {\n          return !pred.validate(obj[key], key);\n        });\n        if (invalidKeys.length > 0) {\n          invalidTypeMessage(invalidKeys, pred.label);\n        }\n        return obj;\n      };\n    };\n    const handleExact = (required, keys) => {\n      const unsupported = filter$2(keys, key => {\n        return !contains$2(required, key);\n      });\n      if (unsupported.length > 0) {\n        unsuppMessage(unsupported);\n      }\n    };\n    const exactly = required => base(handleExact, required);\n\n    const DragMode = exactly([\n      'compare',\n      'extract',\n      'mutate',\n      'sink'\n    ]);\n    const DragSink = exactly([\n      'element',\n      'start',\n      'stop',\n      'destroy'\n    ]);\n    const DragApi = exactly([\n      'forceDrop',\n      'drop',\n      'move',\n      'delayDrop'\n    ]);\n\n    const InDrag = () => {\n      let previous = Optional.none();\n      const reset = () => {\n        previous = Optional.none();\n      };\n      const update = (mode, nu) => {\n        const result = previous.map(old => {\n          return mode.compare(old, nu);\n        });\n        previous = Optional.some(nu);\n        return result;\n      };\n      const onEvent = (event, mode) => {\n        const dataOption = mode.extract(event);\n        dataOption.each(data => {\n          const offset = update(mode, data);\n          offset.each(d => {\n            events.trigger.move(d);\n          });\n        });\n      };\n      const events = create$1({ move: Event(['info']) });\n      return {\n        onEvent,\n        reset,\n        events: events.registry\n      };\n    };\n\n    const NoDrag = () => {\n      const events = create$1({ move: Event(['info']) });\n      return {\n        onEvent: noop,\n        reset: noop,\n        events: events.registry\n      };\n    };\n\n    const Movement = () => {\n      const noDragState = NoDrag();\n      const inDragState = InDrag();\n      let dragState = noDragState;\n      const on = () => {\n        dragState.reset();\n        dragState = inDragState;\n      };\n      const off = () => {\n        dragState.reset();\n        dragState = noDragState;\n      };\n      const onEvent = (event, mode) => {\n        dragState.onEvent(event, mode);\n      };\n      const isOn = () => {\n        return dragState === inDragState;\n      };\n      return {\n        on,\n        off,\n        isOn,\n        onEvent,\n        events: inDragState.events\n      };\n    };\n\n    const setup = (mutation, mode, settings) => {\n      let active = false;\n      const events = create$1({\n        start: Event([]),\n        stop: Event([])\n      });\n      const movement = Movement();\n      const drop = () => {\n        sink.stop();\n        if (movement.isOn()) {\n          movement.off();\n          events.trigger.stop();\n        }\n      };\n      const throttledDrop = last(drop, 200);\n      const go = parent => {\n        sink.start(parent);\n        movement.on();\n        events.trigger.start();\n      };\n      const mousemove = event => {\n        throttledDrop.cancel();\n        movement.onEvent(event, mode);\n      };\n      movement.events.move.bind(event => {\n        mode.mutate(mutation, event.info);\n      });\n      const on = () => {\n        active = true;\n      };\n      const off = () => {\n        active = false;\n      };\n      const isActive = () => active;\n      const runIfActive = f => {\n        return (...args) => {\n          if (active) {\n            f.apply(null, args);\n          }\n        };\n      };\n      const sink = mode.sink(DragApi({\n        forceDrop: drop,\n        drop: runIfActive(drop),\n        move: runIfActive(mousemove),\n        delayDrop: runIfActive(throttledDrop.throttle)\n      }), settings);\n      const destroy = () => {\n        sink.destroy();\n      };\n      return {\n        element: sink.element,\n        go,\n        on,\n        off,\n        isActive,\n        destroy,\n        events: events.registry\n      };\n    };\n\n    const css = namespace => {\n      const dashNamespace = namespace.replace(/\\./g, '-');\n      const resolve = str => {\n        return dashNamespace + '-' + str;\n      };\n      return { resolve };\n    };\n\n    const styles$1 = css('ephox-dragster');\n    const resolve$1 = styles$1.resolve;\n\n    const Blocker = options => {\n      const settings = {\n        layerClass: resolve$1('blocker'),\n        ...options\n      };\n      const div = SugarElement.fromTag('div');\n      set$2(div, 'role', 'presentation');\n      setAll(div, {\n        position: 'fixed',\n        left: '0px',\n        top: '0px',\n        width: '100%',\n        height: '100%'\n      });\n      add(div, resolve$1('blocker'));\n      add(div, settings.layerClass);\n      const element = constant(div);\n      const destroy = () => {\n        remove$6(div);\n      };\n      return {\n        element,\n        destroy\n      };\n    };\n\n    const compare = (old, nu) => {\n      return SugarPosition(nu.left - old.left, nu.top - old.top);\n    };\n    const extract = event => {\n      return Optional.some(SugarPosition(event.x, event.y));\n    };\n    const mutate = (mutation, info) => {\n      mutation.mutate(info.left, info.top);\n    };\n    const sink = (dragApi, settings) => {\n      const blocker = Blocker(settings);\n      const mdown = bind(blocker.element(), 'mousedown', dragApi.forceDrop);\n      const mup = bind(blocker.element(), 'mouseup', dragApi.drop);\n      const mmove = bind(blocker.element(), 'mousemove', dragApi.move);\n      const mout = bind(blocker.element(), 'mouseout', dragApi.delayDrop);\n      const destroy = () => {\n        blocker.destroy();\n        mup.unbind();\n        mmove.unbind();\n        mout.unbind();\n        mdown.unbind();\n      };\n      const start = parent => {\n        append$1(parent, blocker.element());\n      };\n      const stop = () => {\n        remove$6(blocker.element());\n      };\n      return DragSink({\n        element: blocker.element,\n        start,\n        stop,\n        destroy\n      });\n    };\n    var MouseDrag = DragMode({\n      compare,\n      extract,\n      sink,\n      mutate\n    });\n\n    const transform = (mutation, settings = {}) => {\n      var _a;\n      const mode = (_a = settings.mode) !== null && _a !== void 0 ? _a : MouseDrag;\n      return setup(mutation, mode, settings);\n    };\n\n    const styles = css('ephox-snooker');\n    const resolve = styles.resolve;\n\n    const Mutation = () => {\n      const events = create$1({\n        drag: Event([\n          'xDelta',\n          'yDelta'\n        ])\n      });\n      const mutate = (x, y) => {\n        events.trigger.drag(x, y);\n      };\n      return {\n        mutate,\n        events: events.registry\n      };\n    };\n\n    const BarMutation = () => {\n      const events = create$1({\n        drag: Event([\n          'xDelta',\n          'yDelta',\n          'target'\n        ])\n      });\n      let target = Optional.none();\n      const delegate = Mutation();\n      delegate.events.drag.bind(event => {\n        target.each(t => {\n          events.trigger.drag(event.xDelta, event.yDelta, t);\n        });\n      });\n      const assign = t => {\n        target = Optional.some(t);\n      };\n      const get = () => {\n        return target;\n      };\n      return {\n        assign,\n        get,\n        mutate: delegate.mutate,\n        events: events.registry\n      };\n    };\n\n    const col = (column, x, y, w, h) => {\n      const bar = SugarElement.fromTag('div');\n      setAll(bar, {\n        position: 'absolute',\n        left: x - w / 2 + 'px',\n        top: y + 'px',\n        height: h + 'px',\n        width: w + 'px'\n      });\n      setAll$1(bar, {\n        'data-column': column,\n        'role': 'presentation'\n      });\n      return bar;\n    };\n    const row = (r, x, y, w, h) => {\n      const bar = SugarElement.fromTag('div');\n      setAll(bar, {\n        position: 'absolute',\n        left: x + 'px',\n        top: y - h / 2 + 'px',\n        height: h + 'px',\n        width: w + 'px'\n      });\n      setAll$1(bar, {\n        'data-row': r,\n        'role': 'presentation'\n      });\n      return bar;\n    };\n\n    const resizeBar = resolve('resizer-bar');\n    const resizeRowBar = resolve('resizer-rows');\n    const resizeColBar = resolve('resizer-cols');\n    const BAR_THICKNESS = 7;\n    const resizableRows = (warehouse, isResizable) => bind$2(warehouse.all, (row, i) => isResizable(row.element) ? [i] : []);\n    const resizableColumns = (warehouse, isResizable) => {\n      const resizableCols = [];\n      range$1(warehouse.grid.columns, index => {\n        const colElmOpt = Warehouse.getColumnAt(warehouse, index).map(col => col.element);\n        if (colElmOpt.forall(isResizable)) {\n          resizableCols.push(index);\n        }\n      });\n      return filter$2(resizableCols, colIndex => {\n        const columnCells = Warehouse.filterItems(warehouse, cell => cell.column === colIndex);\n        return forall(columnCells, cell => isResizable(cell.element));\n      });\n    };\n    const destroy = wire => {\n      const previous = descendants(wire.parent(), '.' + resizeBar);\n      each$2(previous, remove$6);\n    };\n    const drawBar = (wire, positions, create) => {\n      const origin = wire.origin();\n      each$2(positions, cpOption => {\n        cpOption.each(cp => {\n          const bar = create(origin, cp);\n          add(bar, resizeBar);\n          append$1(wire.parent(), bar);\n        });\n      });\n    };\n    const refreshCol = (wire, colPositions, position, tableHeight) => {\n      drawBar(wire, colPositions, (origin, cp) => {\n        const colBar = col(cp.col, cp.x - origin.left, position.top - origin.top, BAR_THICKNESS, tableHeight);\n        add(colBar, resizeColBar);\n        return colBar;\n      });\n    };\n    const refreshRow = (wire, rowPositions, position, tableWidth) => {\n      drawBar(wire, rowPositions, (origin, cp) => {\n        const rowBar = row(cp.row, position.left - origin.left, cp.y - origin.top, tableWidth, BAR_THICKNESS);\n        add(rowBar, resizeRowBar);\n        return rowBar;\n      });\n    };\n    const refreshGrid = (warhouse, wire, table, rows, cols) => {\n      const position = absolute(table);\n      const isResizable = wire.isResizable;\n      const rowPositions = rows.length > 0 ? height.positions(rows, table) : [];\n      const resizableRowBars = rowPositions.length > 0 ? resizableRows(warhouse, isResizable) : [];\n      const resizableRowPositions = filter$2(rowPositions, (_pos, i) => exists(resizableRowBars, barIndex => i === barIndex));\n      refreshRow(wire, resizableRowPositions, position, getOuter$2(table));\n      const colPositions = cols.length > 0 ? width.positions(cols, table) : [];\n      const resizableColBars = colPositions.length > 0 ? resizableColumns(warhouse, isResizable) : [];\n      const resizableColPositions = filter$2(colPositions, (_pos, i) => exists(resizableColBars, barIndex => i === barIndex));\n      refreshCol(wire, resizableColPositions, position, getOuter$1(table));\n    };\n    const refresh = (wire, table) => {\n      destroy(wire);\n      if (wire.isResizable(table)) {\n        const warehouse = Warehouse.fromTable(table);\n        const rows$1 = rows(warehouse);\n        const cols = columns(warehouse);\n        refreshGrid(warehouse, wire, table, rows$1, cols);\n      }\n    };\n    const each = (wire, f) => {\n      const bars = descendants(wire.parent(), '.' + resizeBar);\n      each$2(bars, f);\n    };\n    const hide = wire => {\n      each(wire, bar => {\n        set$1(bar, 'display', 'none');\n      });\n    };\n    const show = wire => {\n      each(wire, bar => {\n        set$1(bar, 'display', 'block');\n      });\n    };\n    const isRowBar = element => {\n      return has(element, resizeRowBar);\n    };\n    const isColBar = element => {\n      return has(element, resizeColBar);\n    };\n\n    const resizeBarDragging = resolve('resizer-bar-dragging');\n    const BarManager = wire => {\n      const mutation = BarMutation();\n      const resizing = transform(mutation, {});\n      let hoverTable = Optional.none();\n      const getResizer = (element, type) => {\n        return Optional.from(get$b(element, type));\n      };\n      mutation.events.drag.bind(event => {\n        getResizer(event.target, 'data-row').each(_dataRow => {\n          const currentRow = getCssValue(event.target, 'top');\n          set$1(event.target, 'top', currentRow + event.yDelta + 'px');\n        });\n        getResizer(event.target, 'data-column').each(_dataCol => {\n          const currentCol = getCssValue(event.target, 'left');\n          set$1(event.target, 'left', currentCol + event.xDelta + 'px');\n        });\n      });\n      const getDelta = (target, dir) => {\n        const newX = getCssValue(target, dir);\n        const oldX = getAttrValue(target, 'data-initial-' + dir, 0);\n        return newX - oldX;\n      };\n      resizing.events.stop.bind(() => {\n        mutation.get().each(target => {\n          hoverTable.each(table => {\n            getResizer(target, 'data-row').each(row => {\n              const delta = getDelta(target, 'top');\n              remove$7(target, 'data-initial-top');\n              events.trigger.adjustHeight(table, delta, parseInt(row, 10));\n            });\n            getResizer(target, 'data-column').each(column => {\n              const delta = getDelta(target, 'left');\n              remove$7(target, 'data-initial-left');\n              events.trigger.adjustWidth(table, delta, parseInt(column, 10));\n            });\n            refresh(wire, table);\n          });\n        });\n      });\n      const handler = (target, dir) => {\n        events.trigger.startAdjust();\n        mutation.assign(target);\n        set$2(target, 'data-initial-' + dir, getCssValue(target, dir));\n        add(target, resizeBarDragging);\n        set$1(target, 'opacity', '0.2');\n        resizing.go(wire.parent());\n      };\n      const mousedown = bind(wire.parent(), 'mousedown', event => {\n        if (isRowBar(event.target)) {\n          handler(event.target, 'top');\n        }\n        if (isColBar(event.target)) {\n          handler(event.target, 'left');\n        }\n      });\n      const isRoot = e => {\n        return eq$1(e, wire.view());\n      };\n      const findClosestEditableTable = target => closest$1(target, 'table', isRoot).filter(isEditable$1);\n      const mouseover = bind(wire.view(), 'mouseover', event => {\n        findClosestEditableTable(event.target).fold(() => {\n          if (inBody(event.target)) {\n            destroy(wire);\n          }\n        }, table => {\n          if (resizing.isActive()) {\n            hoverTable = Optional.some(table);\n            refresh(wire, table);\n          }\n        });\n      });\n      const destroy$1 = () => {\n        mousedown.unbind();\n        mouseover.unbind();\n        resizing.destroy();\n        destroy(wire);\n      };\n      const refresh$1 = tbl => {\n        refresh(wire, tbl);\n      };\n      const events = create$1({\n        adjustHeight: Event([\n          'table',\n          'delta',\n          'row'\n        ]),\n        adjustWidth: Event([\n          'table',\n          'delta',\n          'column'\n        ]),\n        startAdjust: Event([])\n      });\n      return {\n        destroy: destroy$1,\n        refresh: refresh$1,\n        on: resizing.on,\n        off: resizing.off,\n        hideBars: curry(hide, wire),\n        showBars: curry(show, wire),\n        events: events.registry\n      };\n    };\n\n    const create = (wire, resizing, lazySizing) => {\n      const hdirection = height;\n      const vdirection = width;\n      const manager = BarManager(wire);\n      const events = create$1({\n        beforeResize: Event([\n          'table',\n          'type'\n        ]),\n        afterResize: Event([\n          'table',\n          'type'\n        ]),\n        startDrag: Event([])\n      });\n      manager.events.adjustHeight.bind(event => {\n        const table = event.table;\n        events.trigger.beforeResize(table, 'row');\n        const delta = hdirection.delta(event.delta, table);\n        adjustHeight(table, delta, event.row);\n        events.trigger.afterResize(table, 'row');\n      });\n      manager.events.startAdjust.bind(_event => {\n        events.trigger.startDrag();\n      });\n      manager.events.adjustWidth.bind(event => {\n        const table = event.table;\n        events.trigger.beforeResize(table, 'col');\n        const delta = vdirection.delta(event.delta, table);\n        const tableSize = lazySizing(table);\n        adjustWidth(table, delta, event.column, resizing, tableSize);\n        events.trigger.afterResize(table, 'col');\n      });\n      return {\n        on: manager.on,\n        off: manager.off,\n        refreshBars: manager.refresh,\n        hideBars: manager.hideBars,\n        showBars: manager.showBars,\n        destroy: manager.destroy,\n        events: events.registry\n      };\n    };\n    const TableResize = { create };\n\n    const only = (element, isResizable) => {\n      const parent = isDocument(element) ? documentElement(element) : element;\n      return {\n        parent: constant(parent),\n        view: constant(element),\n        origin: constant(SugarPosition(0, 0)),\n        isResizable\n      };\n    };\n    const detached = (editable, chrome, isResizable) => {\n      const origin = () => absolute(chrome);\n      return {\n        parent: constant(chrome),\n        view: constant(editable),\n        origin,\n        isResizable\n      };\n    };\n    const body = (editable, chrome, isResizable) => {\n      return {\n        parent: constant(chrome),\n        view: constant(editable),\n        origin: constant(SugarPosition(0, 0)),\n        isResizable\n      };\n    };\n    const ResizeWire = {\n      only,\n      detached,\n      body\n    };\n\n    const createContainer = () => {\n      const container = SugarElement.fromTag('div');\n      setAll(container, {\n        position: 'static',\n        height: '0',\n        width: '0',\n        padding: '0',\n        margin: '0',\n        border: '0'\n      });\n      append$1(body$1(), container);\n      return container;\n    };\n    const get = (editor, isResizable) => {\n      return editor.inline ? ResizeWire.body(SugarElement.fromDom(editor.getBody()), createContainer(), isResizable) : ResizeWire.only(SugarElement.fromDom(editor.getDoc()), isResizable);\n    };\n    const remove = (editor, wire) => {\n      if (editor.inline) {\n        remove$6(wire.parent());\n      }\n    };\n\n    const isTable = node => isNonNullable(node) && node.nodeName === 'TABLE';\n    const barResizerPrefix = 'bar-';\n    const isResizable = elm => get$b(elm, 'data-mce-resize') !== 'false';\n    const syncTableCellPixels = table => {\n      const warehouse = Warehouse.fromTable(table);\n      if (!Warehouse.hasColumns(warehouse)) {\n        each$2(cells$1(table), cell => {\n          const computedWidth = get$a(cell, 'width');\n          set$1(cell, 'width', computedWidth);\n          remove$7(cell, 'width');\n        });\n      }\n    };\n    const TableResizeHandler = editor => {\n      const selectionRng = value();\n      const tableResize = value();\n      const resizeWire = value();\n      let startW;\n      let startRawW;\n      let startH;\n      let startRawH;\n      const lazySizing = table => get$5(editor, table);\n      const lazyResizingBehaviour = () => isPreserveTableColumnResizing(editor) ? preserveTable() : resizeTable();\n      const getNumColumns = table => getGridSize(table).columns;\n      const getNumRows = table => getGridSize(table).rows;\n      const afterCornerResize = (table, origin, width, height) => {\n        const isRightEdgeResize = endsWith(origin, 'e');\n        if (startRawW === '') {\n          convertToPercentSizeWidth(table);\n        }\n        if (startRawH === '') {\n          convertToPixelSizeHeight(table);\n        }\n        if (width !== startW && startRawW !== '') {\n          set$1(table, 'width', startRawW);\n          const resizing = lazyResizingBehaviour();\n          const tableSize = lazySizing(table);\n          const col = isPreserveTableColumnResizing(editor) || isRightEdgeResize ? getNumColumns(table) - 1 : 0;\n          adjustWidth(table, width - startW, col, resizing, tableSize);\n        } else if (isPercentage$1(startRawW)) {\n          const percentW = parseFloat(startRawW.replace('%', ''));\n          const targetPercentW = width * percentW / startW;\n          set$1(table, 'width', targetPercentW + '%');\n        }\n        if (isPixel(startRawW)) {\n          syncTableCellPixels(table);\n        }\n        if (height !== startH && startRawH !== '') {\n          set$1(table, 'height', startRawH);\n          const idx = getNumRows(table) - 1;\n          adjustHeight(table, height - startH, idx);\n        }\n      };\n      const destroy = () => {\n        tableResize.on(sz => {\n          sz.destroy();\n        });\n        resizeWire.on(w => {\n          remove(editor, w);\n        });\n      };\n      editor.on('init', () => {\n        const rawWire = get(editor, isResizable);\n        resizeWire.set(rawWire);\n        if (hasTableObjectResizing(editor) && hasTableResizeBars(editor)) {\n          const resizing = lazyResizingBehaviour();\n          const sz = TableResize.create(rawWire, resizing, lazySizing);\n          sz.on();\n          sz.events.startDrag.bind(_event => {\n            selectionRng.set(editor.selection.getRng());\n          });\n          sz.events.beforeResize.bind(event => {\n            const rawTable = event.table.dom;\n            fireObjectResizeStart(editor, rawTable, getPixelWidth(rawTable), getPixelHeight(rawTable), barResizerPrefix + event.type);\n          });\n          sz.events.afterResize.bind(event => {\n            const table = event.table;\n            const rawTable = table.dom;\n            removeDataStyle(table);\n            selectionRng.on(rng => {\n              editor.selection.setRng(rng);\n              editor.focus();\n            });\n            fireObjectResized(editor, rawTable, getPixelWidth(rawTable), getPixelHeight(rawTable), barResizerPrefix + event.type);\n            editor.undoManager.add();\n          });\n          tableResize.set(sz);\n        }\n      });\n      editor.on('ObjectResizeStart', e => {\n        const targetElm = e.target;\n        if (isTable(targetElm)) {\n          const table = SugarElement.fromDom(targetElm);\n          each$2(editor.dom.select('.mce-clonedresizable'), clone => {\n            editor.dom.addClass(clone, 'mce-' + getTableColumnResizingBehaviour(editor) + '-columns');\n          });\n          if (!isPixelSizing(table) && isTablePixelsForced(editor)) {\n            convertToPixelSizeWidth(table);\n          } else if (!isPercentSizing(table) && isTablePercentagesForced(editor)) {\n            convertToPercentSizeWidth(table);\n          }\n          if (isNoneSizing(table) && startsWith(e.origin, barResizerPrefix)) {\n            convertToPercentSizeWidth(table);\n          }\n          startW = e.width;\n          startRawW = isTableResponsiveForced(editor) ? '' : getRawWidth(editor, targetElm).getOr('');\n          startH = e.height;\n          startRawH = getRawHeight(editor, targetElm).getOr('');\n        }\n      });\n      editor.on('ObjectResized', e => {\n        const targetElm = e.target;\n        if (isTable(targetElm)) {\n          const table = SugarElement.fromDom(targetElm);\n          const origin = e.origin;\n          if (startsWith(origin, 'corner-')) {\n            afterCornerResize(table, origin, e.width, e.height);\n          }\n          removeDataStyle(table);\n          fireTableModified(editor, table.dom, styleModified);\n        }\n      });\n      editor.on('SwitchMode', () => {\n        tableResize.on(resize => {\n          if (editor.mode.isReadOnly()) {\n            resize.hideBars();\n          } else {\n            resize.showBars();\n          }\n        });\n      });\n      editor.on('dragstart dragend', e => {\n        tableResize.on(resize => {\n          if (e.type === 'dragstart') {\n            resize.hideBars();\n            resize.off();\n          } else {\n            resize.on();\n            resize.showBars();\n          }\n        });\n      });\n      editor.on('remove', () => {\n        destroy();\n      });\n      const refresh = table => {\n        tableResize.on(resize => resize.refreshBars(SugarElement.fromDom(table)));\n      };\n      const hide = () => {\n        tableResize.on(resize => resize.hideBars());\n      };\n      const show = () => {\n        tableResize.on(resize => resize.showBars());\n      };\n      return {\n        refresh,\n        hide,\n        show\n      };\n    };\n\n    const setupTable = editor => {\n      register(editor);\n      const resizeHandler = TableResizeHandler(editor);\n      const cellSelectionHandler = TableCellSelectionHandler(editor, resizeHandler);\n      const actions = TableActions(editor, resizeHandler, cellSelectionHandler);\n      registerCommands(editor, actions);\n      registerQueryCommands(editor, actions);\n      registerEvents(editor, actions);\n      return {\n        getSelectedCells: cellSelectionHandler.getSelectedCells,\n        clearSelectedCells: cellSelectionHandler.clearSelectedCells\n      };\n    };\n\n    const DomModel = editor => {\n      const table = setupTable(editor);\n      return { table };\n    };\n    var Model = () => {\n      global$1.add('dom', DomModel);\n    };\n\n    Model();\n\n})();\n","/* Import TinyMCE */\nimport hugerte from \"hugerte\";\n\n/* Default icons are required. After that, import custom icons if applicable */\nimport \"hugerte/icons/default\";\n\n/* Required TinyMCE components */\nimport \"hugerte/themes/silver\";\nimport \"hugerte/models/dom\";\n\n/* Import a skin (can be a custom skin instead of the default) */\n//import \"hugerte/skins/ui/oxide/skin.css\";\n\n/* Import plugins */\n//import \"hugerte/plugins/advlist\";\n//import \"hugerte/plugins/code\";\n//import \"hugerte/plugins/emoticons\";\n//import \"hugerte/plugins/emoticons/js/emojis\";\nimport \"hugerte/plugins/link\";\n//import \"hugerte/plugins/lists\";\n//import \"hugerte/plugins/table\";\n\n/* content UI CSS is required */\n//import contentUiSkinCss from \"hugerte/skins/ui/oxide/content.css\";\n\n/* The default content CSS can be changed or replaced with appropriate CSS for the editor content. */\n//import contentCss from \"hugerte/skins/content/default/content.css\";\n\n/* Initialize TinyMCE */\nexport function tinymceInit(config = {}) {\n  // timeout because turbo isn't reliable on wanting to re-init things again\n  setTimeout(() => {\n    hugerte.init(\n      Object.assign(\n        {},\n        {\n          selector: \".tinymce\",\n          language: \"et\",\n          language_url: \"/tinymce-selfhost/et.js\",\n          promotion: false,\n          height: 280,\n          menubar: \"\",\n          toolbar:\n            \"blocks fontsize | forecolor backcolor | bold italic underline strikethrough | removeformat\",\n          plugins: \"link\",\n          color_cols: 5,\n          skin_url: \"/tinymce-selfhost/oxide\",\n          content_css: \"/tinymce-selfhost/content/default/content.min.css\",\n          convert_unsafe_embeds: true\n          //content_style: contentUiSkinCss.toString() + \"\\n\" + contentCss.toString() Not possible with shakapacker. It cannot get those CSS as string\n        },\n        config\n      )\n    );\n  }, 50);\n}\n","import \"@hotwired/turbo-rails\";\nimport { turboConfirmationDialog } from \"../mixins/confirmationDialog\";\n\nimport { Application } from \"@hotwired/stimulus\";\nimport { definitionsFromContext } from \"@hotwired/stimulus-webpack-helpers\";\n\n//Turbo.session.drive = false;\nTurbo.config.drive.progressBarDelay = 500;\nTurbo.config.forms.confirm = (message, formElement) => {\n  turboConfirmationDialog(formElement.cloneNode(true));\n};\n\nconst application = Application.start();\n// Loads all controllers\nconst context = require.context(\"../controllers\", true, /\\.js$/);\napplication.load(definitionsFromContext(context));\n","window.DayJS = require(\"dayjs\");\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\nwindow.DayJS.extend(customParseFormat)\nimport \"dayjs/locale/et\";\nwindow.DayJS.locale(\"et\");","hugerte.IconManager.add('default', {\n  icons: {\n    'accessibility-check': '<svg width=\"24\" height=\"24\"><path d=\"M12 2a2 2 0 0 1 2 2 2 2 0 0 1-2 2 2 2 0 0 1-2-2c0-1.1.9-2 2-2Zm8 7h-5v12c0 .6-.4 1-1 1a1 1 0 0 1-1-1v-5c0-.6-.4-1-1-1a1 1 0 0 0-1 1v5c0 .6-.4 1-1 1a1 1 0 0 1-1-1V9H4a1 1 0 1 1 0-2h16c.6 0 1 .4 1 1s-.4 1-1 1Z\" fill-rule=\"nonzero\"/></svg>',\n    'accordion-toggle': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12 15c0-.6.4-1 1-1h6c.6 0 1 .4 1 1s-.4 1-1 1h-6a1 1 0 0 1-1-1Z\"/><path opacity=\".2\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M4 15c0-.6.4-1 1-1h6c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1-1-1Z\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12 19c0-.6.4-1 1-1h6c.6 0 1 .4 1 1s-.4 1-1 1h-6a1 1 0 0 1-1-1Z\"/><path opacity=\".2\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M4 19c0-.6.4-1 1-1h6c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1-1-1Z\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12.3 7.3a1 1 0 0 1 1.4 0L16 9.6l2.3-2.3a1 1 0 1 1 1.4 1.4L16 12.4l-3.7-3.7a1 1 0 0 1 0-1.4ZM4.3 11.7a1 1 0 0 1 0-1.4L6.6 8 4.3 5.7a1 1 0 0 1 1.4-1.4L9.4 8l-3.7 3.7a1 1 0 0 1-1.4 0Z\"/></svg>',\n    'accordion': '<svg width=\"24\" height=\"24\"><rect x=\"12\" y=\"7\" width=\"10\" height=\"2\" rx=\"1\"/><rect x=\"12\" y=\"11\" width=\"10\" height=\"2\" rx=\"1\"/><rect x=\"12\" y=\"15\" width=\"6\" height=\"2\" rx=\"1\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2.3 7.3a1 1 0 0 1 1.4 0L6 9.6l2.3-2.3a1 1 0 0 1 1.4 1.4L6 12.4 2.3 8.7a1 1 0 0 1 0-1.4Z\"/></svg>',\n    'action-next': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M5.7 7.3a1 1 0 0 0-1.4 1.4l7.7 7.7 7.7-7.7a1 1 0 1 0-1.4-1.4L12 13.6 5.7 7.3Z\"/></svg>',\n    'action-prev': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M18.3 15.7a1 1 0 0 0 1.4-1.4L12 6.6l-7.7 7.7a1 1 0 0 0 1.4 1.4L12 9.4l6.3 6.3Z\"/></svg>',\n    'addtag': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15 5a2 2 0 0 1 1.6.8L21 12l-4.4 6.2a2 2 0 0 1-1.6.8h-3v-2h3l3.5-5L15 7H5v3H3V7c0-1.1.9-2 2-2h10Z\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M6 12a1 1 0 0 0-1 1v2H3a1 1 0 1 0 0 2h2v2a1 1 0 1 0 2 0v-2h2a1 1 0 1 0 0-2H7v-2c0-.6-.4-1-1-1Z\"/></svg>',\n    'ai-prompt': '<svg width=\"24\" height=\"24\"><g clip-path=\"url(#a)\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15 6.7a1 1 0 0 0-1.4 0l-9.9 10a1 1 0 0 0 0 1.3l2.1 2.1c.4.4 1 .4 1.4 0l10-9.9c.3-.3.3-1 0-1.4l-2.2-2Zm1.4 2.8-2-2-3 2.7 2.2 2.2 2.8-2.9Z\"/><path d=\"m18.5 7.3-.7-1.5-1.5-.8 1.5-.7.7-1.5.7 1.5 1.5.7-1.5.8-.7 1.5ZM18.5 16.5l-.7-1.6-1.5-.7 1.5-.7.7-1.6.7 1.6 1.5.7-1.5.7-.7 1.6ZM9.7 7.3 9 5.8 7.5 5 9 4.3l.7-1.5.7 1.5L12 5l-1.5.8-.7 1.5Z\"/></g><defs><clipPath id=\"a\"><path d=\"M0 0h24v24H0z\"/></clipPath></defs></svg>',\n    'ai': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M5 3a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3V6a3 3 0 0 0-3-3H5Zm6.8 11.5.5 1.2a68.3 68.3 0 0 0 .7 1.1l.4.1c.3 0 .5 0 .7-.3.2-.1.3-.3.3-.6l-.3-1-2.6-6.2a20.4 20.4 0 0 0-.5-1.3l-.5-.4-.7-.2c-.2 0-.5 0-.6.2-.2 0-.4.2-.5.4l-.3.6-.3.7L5.7 15l-.2.6-.1.4c0 .3 0 .5.3.7l.6.2c.3 0 .5 0 .7-.2l.4-1 .5-1.2h3.9ZM9.8 9l1.5 4h-3l1.5-4Zm5.6-.9v7.6c0 .4 0 .7.2 1l.7.2c.3 0 .6 0 .8-.3l.2-.9V8.1c0-.4 0-.7-.2-.9a1 1 0 0 0-.8-.3c-.2 0-.5.1-.7.3l-.2 1Z\"/></svg>',\n    'align-center': '<svg width=\"24\" height=\"24\"><path d=\"M5 5h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2Zm3 4h8c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 1 1 0-2Zm0 8h8c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 0 1 0-2Zm-3-4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2Z\" fill-rule=\"evenodd\"/></svg>',\n    'align-justify': '<svg width=\"24\" height=\"24\"><path d=\"M5 5h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2Zm0 4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2Zm0 4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2Zm0 4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2Z\" fill-rule=\"evenodd\"/></svg>',\n    'align-left': '<svg width=\"24\" height=\"24\"><path d=\"M5 5h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2Zm0 4h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2Zm0 8h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2Zm0-4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2Z\" fill-rule=\"evenodd\"/></svg>',\n    'align-none': '<svg width=\"24\" height=\"24\"><path d=\"M14.2 5 13 7H5a1 1 0 1 1 0-2h9.2Zm4 0h.8a1 1 0 0 1 0 2h-2l1.2-2Zm-6.4 4-1.2 2H5a1 1 0 0 1 0-2h6.8Zm4 0H19a1 1 0 0 1 0 2h-4.4l1.2-2Zm-6.4 4-1.2 2H5a1 1 0 0 1 0-2h4.4Zm4 0H19a1 1 0 0 1 0 2h-6.8l1.2-2ZM7 17l-1.2 2H5a1 1 0 0 1 0-2h2Zm4 0h8a1 1 0 0 1 0 2H9.8l1.2-2Zm5.2-13.5 1.3.7-9.7 16.3-1.3-.7 9.7-16.3Z\" fill-rule=\"evenodd\"/></svg>',\n    'align-right': '<svg width=\"24\" height=\"24\"><path d=\"M5 5h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2Zm6 4h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Zm0 8h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Zm-6-4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2Z\" fill-rule=\"evenodd\"/></svg>',\n    'arrow-left': '<svg width=\"24\" height=\"24\"><path d=\"m5.6 13 12 6a1 1 0 0 0 1.4-1V6a1 1 0 0 0-1.4-.9l-12 6a1 1 0 0 0 0 1.8Z\" fill-rule=\"evenodd\"/></svg>',\n    'arrow-right': '<svg width=\"24\" height=\"24\"><path d=\"m18.5 13-12 6A1 1 0 0 1 5 18V6a1 1 0 0 1 1.4-.9l12 6a1 1 0 0 1 0 1.8Z\" fill-rule=\"evenodd\"/></svg>',\n    'bold': '<svg width=\"24\" height=\"24\"><path d=\"M7.8 19c-.3 0-.5 0-.6-.2l-.2-.5V5.7c0-.2 0-.4.2-.5l.6-.2h5c1.5 0 2.7.3 3.5 1 .7.6 1.1 1.4 1.1 2.5a3 3 0 0 1-.6 1.9c-.4.6-1 1-1.6 1.2.4.1.9.3 1.3.6s.8.7 1 1.2c.4.4.5 1 .5 1.6 0 1.3-.4 2.3-1.3 3-.8.7-2.1 1-3.8 1H7.8Zm5-8.3c.6 0 1.2-.1 1.6-.5.4-.3.6-.7.6-1.3 0-1.1-.8-1.7-2.3-1.7H9.3v3.5h3.4Zm.5 6c.7 0 1.3-.1 1.7-.4.4-.4.6-.9.6-1.5s-.2-1-.7-1.4c-.4-.3-1-.4-2-.4H9.4v3.8h4Z\" fill-rule=\"evenodd\"/></svg>',\n    'bookmark': '<svg width=\"24\" height=\"24\"><path d=\"M6 4v17l6-4 6 4V4c0-.6-.4-1-1-1H7a1 1 0 0 0-1 1Z\" fill-rule=\"nonzero\"/></svg>',\n    'border-style': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><rect width=\"18\" height=\"2\" x=\"3\" y=\"6\" rx=\"1\"/><rect width=\"2.8\" height=\"2\" x=\"3\" y=\"16\" rx=\"1\"/><rect width=\"2.8\" height=\"2\" x=\"6.8\" y=\"16\" rx=\"1\"/><rect width=\"2.8\" height=\"2\" x=\"10.6\" y=\"16\" rx=\"1\"/><rect width=\"2.8\" height=\"2\" x=\"14.4\" y=\"16\" rx=\"1\"/><rect width=\"2.8\" height=\"2\" x=\"18.2\" y=\"16\" rx=\"1\"/><rect width=\"8\" height=\"2\" x=\"3\" y=\"11\" rx=\"1\"/><rect width=\"8\" height=\"2\" x=\"13\" y=\"11\" rx=\"1\"/></g></svg>',\n    'border-width': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><rect width=\"18\" height=\"5\" x=\"3\" y=\"5\" rx=\"1\"/><rect width=\"18\" height=\"3.5\" x=\"3\" y=\"11.5\" rx=\"1\"/><rect width=\"18\" height=\"2\" x=\"3\" y=\"17\" rx=\"1\"/></g></svg>',\n    'brightness': '<svg width=\"24\" height=\"24\"><path d=\"M12 17c.3 0 .5.1.7.3.2.2.3.4.3.7v1c0 .3-.1.5-.3.7a1 1 0 0 1-.7.3 1 1 0 0 1-.7-.3 1 1 0 0 1-.3-.7v-1c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3Zm0-10a1 1 0 0 1-.7-.3A1 1 0 0 1 11 6V5c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3.3 0 .5.1.7.3.2.2.3.4.3.7v1c0 .3-.1.5-.3.7a1 1 0 0 1-.7.3Zm7 4c.3 0 .5.1.7.3.2.2.3.4.3.7 0 .3-.1.5-.3.7a1 1 0 0 1-.7.3h-1a1 1 0 0 1-.7-.3 1 1 0 0 1-.3-.7c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h1ZM7 12c0 .3-.1.5-.3.7a1 1 0 0 1-.7.3H5a1 1 0 0 1-.7-.3A1 1 0 0 1 4 12c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h1c.3 0 .5.1.7.3.2.2.3.4.3.7Zm10 3.5.7.8c.2.1.3.4.3.6 0 .3-.1.6-.3.8a1 1 0 0 1-.8.3 1 1 0 0 1-.6-.3l-.8-.7a1 1 0 0 1-.3-.8c0-.2.1-.5.3-.7a1 1 0 0 1 1.4 0Zm-10-7-.7-.8a1 1 0 0 1-.3-.6c0-.3.1-.6.3-.8.2-.2.5-.3.8-.3.2 0 .5.1.7.3l.7.7c.2.2.3.5.3.8 0 .2-.1.5-.3.7a1 1 0 0 1-.7.3 1 1 0 0 1-.8-.3Zm10 0a1 1 0 0 1-.8.3 1 1 0 0 1-.7-.3 1 1 0 0 1-.3-.7c0-.3.1-.6.3-.8l.8-.7c.1-.2.4-.3.6-.3.3 0 .6.1.8.3.2.2.3.5.3.8 0 .2-.1.5-.3.7l-.7.7Zm-10 7c.2-.2.5-.3.8-.3.2 0 .5.1.7.3a1 1 0 0 1 0 1.4l-.8.8a1 1 0 0 1-.6.3 1 1 0 0 1-.8-.3 1 1 0 0 1-.3-.8c0-.2.1-.5.3-.6l.7-.8ZM12 8a4 4 0 0 1 3.7 2.4 4 4 0 0 1 0 3.2A4 4 0 0 1 12 16a4 4 0 0 1-3.7-2.4 4 4 0 0 1 0-3.2A4 4 0 0 1 12 8Zm0 6.5c.7 0 1.3-.2 1.8-.7.5-.5.7-1.1.7-1.8s-.2-1.3-.7-1.8c-.5-.5-1.1-.7-1.8-.7s-1.3.2-1.8.7c-.5.5-.7 1.1-.7 1.8s.2 1.3.7 1.8c.5.5 1.1.7 1.8.7Z\" fill-rule=\"evenodd\"/></svg>',\n    'browse': '<svg width=\"24\" height=\"24\"><path d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-4v-2h4V8H5v10h4v2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14Zm-8 9.4-2.3 2.3a1 1 0 1 1-1.4-1.4l4-4a1 1 0 0 1 1.4 0l4 4a1 1 0 0 1-1.4 1.4L13 13.4V20a1 1 0 0 1-2 0v-6.6Z\" fill-rule=\"nonzero\"/></svg>',\n    'cancel': '<svg width=\"24\" height=\"24\"><path d=\"M12 4.6a7.4 7.4 0 1 1 0 14.8 7.4 7.4 0 0 1 0-14.8ZM12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18Zm0 8L14.8 8l1 1.1-2.7 2.8 2.7 2.7-1.1 1.1-2.7-2.7-2.7 2.7-1-1.1 2.6-2.7-2.7-2.7 1-1.1 2.8 2.7Z\" fill-rule=\"nonzero\"/></svg>',\n    'cell-background-color': '<svg width=\"24\" height=\"24\"><path d=\"m15.7 2 1.6 1.6-2.7 2.6 5.9 5.8c.7.7.7 1.7 0 2.4l-6.3 6.1a1.7 1.7 0 0 1-2.4 0l-6.3-6.1c-.7-.7-.7-1.7 0-2.4L15.7 2ZM18 12l-4.5-4L9 12h9ZM4 16s2 2.4 2 3.8C6 21 5.1 22 4 22s-2-1-2-2.2C2 18.4 4 16 4 16Z\"/></svg>',\n    'cell-border-color': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path fill-rule=\"nonzero\" d=\"M5 13v5h2v2H5a2 2 0 0 1-2-2v-5h2zm8-7V4h6a2 2 0 0 1 2 2h-8z\" opacity=\".2\"/><path fill-rule=\"nonzero\" d=\"M13 4v2H5v7H3V6c0-1.1.9-2 2-2h8zm-2.6 14.1.1-.1.1.1.2.3.2.2.2.2c.4.6.8 1.2.8 1.7 0 .8-.7 1.5-1.5 1.5S9 21.3 9 20.5c0-.5.4-1.1.8-1.7l.2-.2.2-.2.2-.3z\"/><path d=\"m13 11-2 2H5v-2h6V6h2z\"/><path fill-rule=\"nonzero\" d=\"m18.4 8 1 1-1.8 1.9 4 4c.5.4.5 1.1 0 1.6l-4.3 4.2a1.2 1.2 0 0 1-1.6 0l-4.4-4.2c-.4-.5-.4-1.2 0-1.7l7-6.8Zm1.6 7-3-3-3 3h6Z\"/></g></svg>',\n    'change-case': '<svg width=\"24\" height=\"24\"><path d=\"M18.4 18.2v-.6c-.5.8-1.3 1.2-2.4 1.2-2.2 0-3.3-1.6-3.3-4.8 0-3.1 1-4.7 3.3-4.7 1.1 0 1.8.3 2.4 1.1v-.6c0-.5.4-.8.8-.8s.8.3.8.8v8.4c0 .5-.4.8-.8.8a.8.8 0 0 1-.8-.8zm-2-7.4c-1.3 0-1.8.9-1.8 3.2 0 2.4.5 3.3 1.7 3.3 1.3 0 1.8-.9 1.8-3.2 0-2.4-.5-3.3-1.7-3.3zM10 15.7H5.5l-.8 2.6a1 1 0 0 1-1 .7h-.2a.7.7 0 0 1-.7-1l4-12a1 1 0 0 1 2 0l4 12a.7.7 0 0 1-.8 1h-.2a1 1 0 0 1-1-.7l-.8-2.6zm-.3-1.5-2-6.5-1.9 6.5h3.9z\" fill-rule=\"evenodd\"/></svg>',\n    'character-count': '<svg width=\"24\" height=\"24\"><path d=\"M4 11.5h16v1H4v-1Zm4.8-6.8V10H7.7V5.8h-1v-1h2ZM11 8.3V9h2v1h-3V7.7l2-1v-.9h-2v-1h3v2.4l-2 1Zm6.3-3.4V10h-3.1V9h2.1V8h-2.1V6.8h2.1v-1h-2.1v-1h3.1ZM5.8 16.4c0-.5.2-.8.5-1 .2-.2.6-.3 1.2-.3l.8.1c.2 0 .4.2.5.3l.4.4v2.8l.2.3H8.2V18.7l-.6.3H7c-.4 0-.7 0-1-.2a1 1 0 0 1-.3-.9c0-.3 0-.6.3-.8.3-.2.7-.4 1.2-.4l.6-.2h.3v-.2l-.1-.2a.8.8 0 0 0-.5-.1 1 1 0 0 0-.4 0l-.3.4h-1Zm2.3.8h-.2l-.2.1-.4.1a1 1 0 0 0-.4.2l-.2.2.1.3.5.1h.4l.4-.4v-.6Zm2-3.4h1.2v1.7l.5-.3h.5c.5 0 .9.1 1.2.5.3.4.5.8.5 1.4 0 .6-.2 1.1-.5 1.5-.3.4-.7.6-1.3.6l-.6-.1-.4-.4v.4h-1.1v-5.4Zm1.1 3.3c0 .3 0 .6.2.8a.7.7 0 0 0 1.2 0l.2-.8c0-.4 0-.6-.2-.8a.7.7 0 0 0-.6-.3l-.6.3-.2.8Zm6.1-.5c0-.2 0-.3-.2-.4a.8.8 0 0 0-.5-.2c-.3 0-.5.1-.6.3l-.2.9c0 .3 0 .6.2.8.1.2.3.3.6.3.2 0 .4 0 .5-.2l.2-.4h1.1c0 .5-.3.8-.6 1.1a2 2 0 0 1-1.3.4c-.5 0-1-.2-1.3-.6a2 2 0 0 1-.5-1.4c0-.6.1-1.1.5-1.5.3-.4.8-.5 1.4-.5.5 0 1 0 1.2.3.4.3.5.7.5 1.2h-1v-.1Z\" fill-rule=\"evenodd\"/></svg>',\n    'checklist-rtl': '<svg width=\"24\" height=\"24\"><path d=\"M5 17h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2zm14.2 11c.2-.4.6-.5.9-.3.3.2.4.6.2 1L18 20c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 0 1 0-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8zm0-6c.2-.4.6-.5.9-.3.3.2.4.6.2 1L18 14c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 0 1 0-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8zm0-6c.2-.4.6-.5.9-.3.3.2.4.6.2 1L18 8c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 0 1 0-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8z\" fill-rule=\"evenodd\"/></svg>',\n    'checklist': '<svg width=\"24\" height=\"24\"><path d=\"M11 17h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Zm0-6h8a1 1 0 0 1 0 2h-8a1 1 0 0 1 0-2ZM7.2 16c.2-.4.6-.5.9-.3.3.2.4.6.2 1L6 20c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 0 1 0-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8Zm0-6c.2-.4.6-.5.9-.3.3.2.4.6.2 1L6 14c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 0 1 0-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8Zm0-6c.2-.4.6-.5.9-.3.3.2.4.6.2 1L6 8c-.2.3-.7.4-1 0L3.8 6.9a.7.7 0 0 1 0-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8Z\" fill-rule=\"evenodd\"/></svg>',\n    'checkmark': '<svg width=\"24\" height=\"24\"><path d=\"M18.2 5.4a1 1 0 0 1 1.6 1.2l-8 12a1 1 0 0 1-1.5.1l-5-5a1 1 0 1 1 1.4-1.4l4.1 4.1 7.4-11Z\" fill-rule=\"nonzero\"/></svg>',\n    'chevron-down': '<svg width=\"10\" height=\"10\"><path d=\"M8.7 2.2c.3-.3.8-.3 1 0 .4.4.4.9 0 1.2L5.7 7.8c-.3.3-.9.3-1.2 0L.2 3.4a.8.8 0 0 1 0-1.2c.3-.3.8-.3 1.1 0L5 6l3.7-3.8Z\" fill-rule=\"nonzero\"/></svg>',\n    'chevron-left': '<svg width=\"10\" height=\"10\"><path d=\"M7.8 1.3 4 5l3.8 3.7c.3.3.3.8 0 1-.4.4-.9.4-1.2 0L2.2 5.7a.8.8 0 0 1 0-1.2L6.6.2C7 0 7.4 0 7.8.2c.3.3.3.8 0 1.1Z\" fill-rule=\"nonzero\"/></svg>',\n    'chevron-right': '<svg width=\"10\" height=\"10\"><path d=\"M2.2 1.3a.8.8 0 0 1 0-1c.4-.4.9-.4 1.2 0l4.4 4.1c.3.4.3.9 0 1.2L3.4 9.8c-.3.3-.8.3-1.2 0a.8.8 0 0 1 0-1.1L6 5 2.2 1.3Z\" fill-rule=\"nonzero\"/></svg>',\n    'chevron-up': '<svg width=\"10\" height=\"10\"><path d=\"M8.7 7.8 5 4 1.3 7.8c-.3.3-.8.3-1 0a.8.8 0 0 1 0-1.2l4.1-4.4c.3-.3.9-.3 1.2 0l4.2 4.4c.3.3.3.9 0 1.2-.3.3-.8.3-1.1 0Z\" fill-rule=\"nonzero\"/></svg>',\n    'close': '<svg width=\"24\" height=\"24\"><path d=\"M17.3 8.2 13.4 12l3.9 3.8a1 1 0 0 1-1.5 1.5L12 13.4l-3.8 3.9a1 1 0 0 1-1.5-1.5l3.9-3.8-3.9-3.8a1 1 0 0 1 1.5-1.5l3.8 3.9 3.8-3.9a1 1 0 0 1 1.5 1.5Z\" fill-rule=\"evenodd\"/></svg>',\n    'code-sample': '<svg width=\"24\" height=\"26\"><path d=\"M7.1 11a2.8 2.8 0 0 1-.8 2 2.8 2.8 0 0 1 .8 2v1.7c0 .3.1.6.4.8.2.3.5.4.8.4.3 0 .4.2.4.4v.8c0 .2-.1.4-.4.4-.7 0-1.4-.3-2-.8-.5-.6-.8-1.3-.8-2V15c0-.3-.1-.6-.4-.8-.2-.3-.5-.4-.8-.4a.4.4 0 0 1-.4-.4v-.8c0-.2.2-.4.4-.4.3 0 .6-.1.8-.4.3-.2.4-.5.4-.8V9.3c0-.7.3-1.4.8-2 .6-.5 1.3-.8 2-.8.3 0 .4.2.4.4v.8c0 .2-.1.4-.4.4-.3 0-.6.1-.8.4-.3.2-.4.5-.4.8V11Zm9.8 0V9.3c0-.3-.1-.6-.4-.8-.2-.3-.5-.4-.8-.4a.4.4 0 0 1-.4-.4V7c0-.2.1-.4.4-.4.7 0 1.4.3 2 .8.5.6.8 1.3.8 2V11c0 .3.1.6.4.8.2.3.5.4.8.4.2 0 .4.2.4.4v.8c0 .2-.2.4-.4.4-.3 0-.6.1-.8.4-.3.2-.4.5-.4.8v1.7c0 .7-.3 1.4-.8 2-.6.5-1.3.8-2 .8a.4.4 0 0 1-.4-.4v-.8c0-.2.1-.4.4-.4.3 0 .6-.1.8-.4.3-.2.4-.5.4-.8V15a2.8 2.8 0 0 1 .8-2 2.8 2.8 0 0 1-.8-2Zm-3.3-.4c0 .4-.1.8-.5 1.1-.3.3-.7.5-1.1.5-.4 0-.8-.2-1.1-.5-.4-.3-.5-.7-.5-1.1 0-.5.1-.9.5-1.2.3-.3.7-.4 1.1-.4.4 0 .8.1 1.1.4.4.3.5.7.5 1.2ZM12 13c.4 0 .8.1 1.1.5.4.3.5.7.5 1.1 0 1-.1 1.6-.5 2a3 3 0 0 1-1.1 1c-.4.3-.8.4-1.1.4a.5.5 0 0 1-.5-.5V17a3 3 0 0 0 1-.2l.6-.6c-.6 0-1-.2-1.3-.5-.2-.3-.3-.7-.3-1 0-.5.1-1 .5-1.2.3-.4.7-.5 1.1-.5Z\" fill-rule=\"evenodd\"/></svg>',\n    'color-levels': '<svg width=\"24\" height=\"24\"><path d=\"M17.5 11.4A9 9 0 0 1 18 14c0 .5 0 1-.2 1.4 0 .4-.3.9-.5 1.3a6.2 6.2 0 0 1-3.7 3 5.7 5.7 0 0 1-3.2 0A5.9 5.9 0 0 1 7.6 18a6.2 6.2 0 0 1-1.4-2.6 6.7 6.7 0 0 1 0-2.8c0-.4.1-.9.3-1.3a13.6 13.6 0 0 1 2.3-4A20 20 0 0 1 12 4a26.4 26.4 0 0 1 3.2 3.4 18.2 18.2 0 0 1 2.3 4Zm-2 4.5c.4-.7.5-1.4.5-2a7.3 7.3 0 0 0-1-3.2c.2.6.2 1.2.2 1.9a4.5 4.5 0 0 1-1.3 3 5.3 5.3 0 0 1-2.3 1.5 4.9 4.9 0 0 1-2 .1 4.3 4.3 0 0 0 2.4.8 4 4 0 0 0 2-.6 4 4 0 0 0 1.5-1.5Z\" fill-rule=\"evenodd\"/></svg>',\n    'color-picker': '<svg width=\"24\" height=\"24\"><path d=\"M12 3a9 9 0 0 0 0 18 1.5 1.5 0 0 0 1.1-2.5c-.2-.3-.4-.6-.4-1 0-.8.7-1.5 1.5-1.5H16a5 5 0 0 0 5-5c0-4.4-4-8-9-8Zm-5.5 9a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3Zm3-4a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3Zm5 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3Zm3 4a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3Z\" fill-rule=\"nonzero\"/></svg>',\n    'color-swatch-remove-color': '<svg width=\"24\" height=\"24\"><path stroke=\"#000\" stroke-width=\"2\" d=\"M21 3 3 21\" fill-rule=\"evenodd\"/></svg>',\n    'color-swatch': '<svg width=\"24\" height=\"24\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\" fill-rule=\"evenodd\"/></svg>',\n    'comment-add': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><path d=\"m9 19 3-2h7c.6 0 1-.4 1-1V6c0-.6-.4-1-1-1H5a1 1 0 0 0-1 1v10c0 .6.4 1 1 1h4v2Zm-2 4v-4H5a3 3 0 0 1-3-3V6a3 3 0 0 1 3-3h14a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3h-6.4L7 23Z\"/><path d=\"M13 10h2a1 1 0 0 1 0 2h-2v2a1 1 0 0 1-2 0v-2H9a1 1 0 0 1 0-2h2V8a1 1 0 0 1 2 0v2Z\"/></g></svg>',\n    'comment': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"m9 19 3-2h7c.6 0 1-.4 1-1V6c0-.6-.4-1-1-1H5a1 1 0 0 0-1 1v10c0 .6.4 1 1 1h4v2Zm-2 4v-4H5a3 3 0 0 1-3-3V6a3 3 0 0 1 3-3h14a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3h-6.4L7 23Z\"/></svg>',\n    'contrast': '<svg width=\"24\" height=\"24\"><path d=\"M12 4a7.8 7.8 0 0 1 5.7 2.3A8 8 0 1 1 12 4Zm-6 8a6 6 0 0 0 6 6V6a6 6 0 0 0-6 6Z\" fill-rule=\"evenodd\"/></svg>',\n    'copy': '<svg width=\"24\" height=\"24\"><path d=\"M16 3H6a2 2 0 0 0-2 2v11h2V5h10V3Zm1 4a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-7a2 2 0 0 1-2-2V9c0-1.2.9-2 2-2h7Zm0 12V9h-7v10h7Z\" fill-rule=\"nonzero\"/></svg>',\n    'crop': '<svg width=\"24\" height=\"24\"><path d=\"M17 8v7h2c.6 0 1 .4 1 1s-.4 1-1 1h-2v2c0 .6-.4 1-1 1a1 1 0 0 1-1-1v-2H7V9H5a1 1 0 1 1 0-2h2V5c0-.6.4-1 1-1s1 .4 1 1v2h7l3-3 1 1-3 3ZM9 9v5l5-5H9Zm1 6h5v-5l-5 5Z\" fill-rule=\"evenodd\"/></svg>',\n    'cut-column': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"M7.2 4.5c.9 0 1.6.4 2.2 1A3.7 3.7 0 0 1 10.5 8v.5l1 1 4-4 1-.5a3.3 3.3 0 0 1 2 0c.4 0 .7.3 1 .5L17 8h4v13h-6V10l-1.5 1.5.5.5v4l-2.5-2.5-1 1v.5c0 .4 0 .8-.3 1.2-.2.5-.4.9-.8 1.2-.6.7-1.3 1-2.2 1-.8.2-1.5 0-2-.6l-.5-.8-.2-1c0-.4 0-.8.3-1.2A3.9 3.9 0 0 1 7 12.7c.5-.2 1-.3 1.5-.2l1-1-1-1c-.5 0-1 0-1.5-.2-.5-.1-1-.4-1.4-.9-.4-.3-.6-.7-.8-1.2L4.5 7c0-.4 0-.7.2-1 0-.3.3-.6.5-.8.5-.5 1.2-.8 2-.7Zm12.3 5h-3v10h3v-10ZM8 13.8h-.3l-.4.2a2.8 2.8 0 0 0-.7.4v.1a2.8 2.8 0 0 0-.6.8l-.1.4v.7l.2.5.5.2h.7a2.6 2.6 0 0 0 .8-.3 2.4 2.4 0 0 0 .7-.7 2.5 2.5 0 0 0 .3-.8 1.5 1.5 0 0 0 0-.8 1 1 0 0 0-.2-.4 1 1 0 0 0-.5-.2H8Zm3.5-3.7c-.4 0-.7.1-1 .4-.3.3-.4.6-.4 1s.1.7.4 1c.3.3.6.4 1 .4s.7-.1 1-.4c.3-.3.4-.6.4-1s-.1-.7-.4-1c-.3-.3-.6-.4-1-.4ZM7 5.8h-.4a1 1 0 0 0-.5.3 1 1 0 0 0-.2.5v.7a2.5 2.5 0 0 0 .3.8l.2.3h.1l.4.4.4.2.4.1h.7L9 9l.2-.4a1.6 1.6 0 0 0 0-.8 2.6 2.6 0 0 0-.3-.8A2.5 2.5 0 0 0 7.7 6l-.4-.1H7Z\"/></svg>',\n    'cut-row': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"M22 3v5H9l3 3 2-2h4l-4 4 1 1h.5c.4 0 .8 0 1.2.3.5.2.9.4 1.2.8.7.6 1 1.3 1 2.2.2.8 0 1.5-.6 2l-.8.5-1 .2c-.4 0-.8 0-1.2-.3a3.9 3.9 0 0 1-2.1-2.2c-.2-.5-.3-1-.2-1.5l-1-1-1 1c0 .5 0 1-.2 1.5-.1.5-.4 1-.9 1.4-.3.4-.7.6-1.2.8l-1.2.3c-.4 0-.7 0-1-.2-.3 0-.6-.3-.8-.5-.5-.5-.8-1.2-.7-2 0-.9.4-1.6 1-2.2A3.7 3.7 0 0 1 8.6 14H9l1-1-4-4-.5-1a3.3 3.3 0 0 1 0-2c0-.4.3-.7.5-1l2 2V3h14ZM8.5 15.3h-.3a2.6 2.6 0 0 0-.8.4 2.5 2.5 0 0 0-.9 1.1l-.1.4v.7l.2.5.5.2h.7a2.5 2.5 0 0 0 .8-.3L9 18V18l.4-.4.2-.4.1-.4v-.7a1 1 0 0 0-.2-.5 1 1 0 0 0-.4-.2h-.5Zm7 0H15a1 1 0 0 0-.4.3 1 1 0 0 0-.2.5 1.5 1.5 0 0 0 0 .7v.4a2.8 2.8 0 0 0 .5.7h.1a2.8 2.8 0 0 0 .8.6l.4.1h.7l.5-.2.2-.5v-.7a2.6 2.6 0 0 0-.3-.8 2.4 2.4 0 0 0-.7-.7 2.5 2.5 0 0 0-.8-.3h-.3ZM12 11.6c-.4 0-.7.1-1 .4-.3.3-.4.6-.4 1s.1.7.4 1c.3.3.6.4 1 .4s.7-.1 1-.4c.3-.3.4-.6.4-1s-.1-.7-.4-1c-.3-.3-.6-.4-1-.4Zm8.5-7.1h-11v2h11v-2Z\"/></svg>',\n    'cut': '<svg width=\"24\" height=\"24\"><path d=\"M18 15c.6.7 1 1.4 1 2.3 0 .8-.2 1.5-.7 2l-.8.5-1 .2c-.4 0-.8 0-1.2-.3a3.9 3.9 0 0 1-2.1-2.2c-.2-.5-.3-1-.2-1.5l-1-1-1 1c0 .5 0 1-.2 1.5-.1.5-.4 1-.9 1.4-.3.4-.7.6-1.2.8l-1.2.3c-.4 0-.7 0-1-.2-.3 0-.6-.3-.8-.5-.5-.5-.8-1.2-.7-2 0-.9.4-1.6 1-2.2A3.7 3.7 0 0 1 8.6 14H9l1-1-4-4-.5-1a3.3 3.3 0 0 1 0-2c0-.4.3-.7.5-1l6 6 6-6 .5 1a3.3 3.3 0 0 1 0 2c0 .4-.3.7-.5 1l-4 4 1 1h.5c.4 0 .8 0 1.2.3.5.2.9.4 1.2.8Zm-8.5 2.2.1-.4v-.7a1 1 0 0 0-.2-.5 1 1 0 0 0-.4-.2 1.6 1.6 0 0 0-.8 0 2.6 2.6 0 0 0-.8.3 2.5 2.5 0 0 0-.9 1.1l-.1.4v.7l.2.5.5.2h.7a2.5 2.5 0 0 0 .8-.3 2.8 2.8 0 0 0 1-1Zm2.5-2.8c.4 0 .7-.1 1-.4.3-.3.4-.6.4-1s-.1-.7-.4-1c-.3-.3-.6-.4-1-.4s-.7.1-1 .4c-.3.3-.4.6-.4 1s.1.7.4 1c.3.3.6.4 1 .4Zm5.4 4 .2-.5v-.7a2.6 2.6 0 0 0-.3-.8 2.4 2.4 0 0 0-.7-.7 2.5 2.5 0 0 0-.8-.3 1.5 1.5 0 0 0-.8 0 1 1 0 0 0-.4.2 1 1 0 0 0-.2.5 1.5 1.5 0 0 0 0 .7v.4l.3.4.3.4a2.8 2.8 0 0 0 .8.5l.4.1h.7l.5-.2Z\" fill-rule=\"evenodd\"/></svg>',\n    'document-properties': '<svg width=\"24\" height=\"24\"><path d=\"M14.4 3H7a2 2 0 0 0-2 2v14c0 1.1.9 2 2 2h10a2 2 0 0 0 2-2V7.6L14.4 3ZM17 19H7V5h6v4h4v10Z\" fill-rule=\"nonzero\"/></svg>',\n    'drag': '<svg width=\"24\" height=\"24\"><path d=\"M13 5h2v2h-2V5Zm0 4h2v2h-2V9ZM9 9h2v2H9V9Zm4 4h2v2h-2v-2Zm-4 0h2v2H9v-2Zm0 4h2v2H9v-2Zm4 0h2v2h-2v-2ZM9 5h2v2H9V5Z\" fill-rule=\"evenodd\"/></svg>',\n    'duplicate-column': '<svg width=\"24\" height=\"24\"><path d=\"M17 6v16h-7V6h7Zm-2 2h-3v12h3V8Zm-2-6v2H8v15H6V2h7Z\"/></svg>',\n    'duplicate-row': '<svg width=\"24\" height=\"24\"><path d=\"M22 11v7H6v-7h16Zm-2 2H8v3h12v-3Zm-1-6v2H4v5H2V7h17Z\"/></svg>',\n    'duplicate': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><path d=\"M16 3v2H6v11H4V5c0-1.1.9-2 2-2h10Zm3 8h-2V9h-7v10h9a2 2 0 0 1-2 2h-7a2 2 0 0 1-2-2V9c0-1.2.9-2 2-2h7a2 2 0 0 1 2 2v2Z\"/><path d=\"M17 14h1a1 1 0 0 1 0 2h-1v1a1 1 0 0 1-2 0v-1h-1a1 1 0 0 1 0-2h1v-1a1 1 0 0 1 2 0v1Z\"/></g></svg>',\n    'edit-block': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"m19.8 8.8-9.4 9.4c-.2.2-.5.4-.9.4l-5.4 1.2 1.2-5.4.5-.8 9.4-9.4c.7-.7 1.8-.7 2.5 0l2.1 2.1c.7.7.7 1.8 0 2.5Zm-2-.2 1-.9v-.3l-2.2-2.2a.3.3 0 0 0-.3 0l-1 1L18 8.5Zm-1 1-2.5-2.4-6 6 2.5 2.5 6-6Zm-7 7.1-2.6-2.4-.3.3-.1.2-.7 3 3.1-.6h.1l.4-.5Z\"/></svg>',\n    'edit-image': '<svg width=\"24\" height=\"24\"><path d=\"M18 16h2V7a2 2 0 0 0-2-2H7v2h11v9ZM6 17h15a1 1 0 0 1 0 2h-1v1a1 1 0 0 1-2 0v-1H6a2 2 0 0 1-2-2V7H3a1 1 0 1 1 0-2h1V4a1 1 0 1 1 2 0v13Zm3-5.3 1.3 2 3-4.7 3.7 6H7l2-3.3Z\" fill-rule=\"nonzero\"/></svg>',\n    'embed-page': '<svg width=\"24\" height=\"24\"><path d=\"M19 6V5H5v14h2A13 13 0 0 1 19 6Zm0 1.4c-.8.8-1.6 2.4-2.2 4.6H19V7.4Zm0 5.6h-2.4c-.4 1.8-.6 3.8-.6 6h3v-6Zm-4 6c0-2.2.2-4.2.6-6H13c-.7 1.8-1.1 3.8-1.1 6h3Zm-4 0c0-2.2.4-4.2 1-6H9.6A12 12 0 0 0 8 19h3ZM4 3h16c.6 0 1 .4 1 1v16c0 .6-.4 1-1 1H4a1 1 0 0 1-1-1V4c0-.6.4-1 1-1Zm11.8 9c.4-1.9 1-3.4 1.8-4.5a9.2 9.2 0 0 0-4 4.5h2.2Zm-3.4 0a12 12 0 0 1 2.8-4 12 12 0 0 0-5 4h2.2Z\" fill-rule=\"nonzero\"/></svg>',\n    'embed': '<svg width=\"24\" height=\"24\"><path d=\"M4 3h16c.6 0 1 .4 1 1v16c0 .6-.4 1-1 1H4a1 1 0 0 1-1-1V4c0-.6.4-1 1-1Zm1 2v14h14V5H5Zm4.8 2.6 5.6 4a.5.5 0 0 1 0 .8l-5.6 4A.5.5 0 0 1 9 16V8a.5.5 0 0 1 .8-.4Z\" fill-rule=\"nonzero\"/></svg>',\n    'emoji': '<svg width=\"24\" height=\"24\"><path d=\"M9 11c.6 0 1-.4 1-1s-.4-1-1-1a1 1 0 0 0-1 1c0 .6.4 1 1 1Zm6 0c.6 0 1-.4 1-1s-.4-1-1-1a1 1 0 0 0-1 1c0 .6.4 1 1 1Zm-3 5.5c2.1 0 4-1.5 4.4-3.5H7.6c.5 2 2.3 3.5 4.4 3.5ZM12 4a8 8 0 1 0 0 16 8 8 0 0 0 0-16Zm0 14.5a6.5 6.5 0 1 1 0-13 6.5 6.5 0 0 1 0 13Z\" fill-rule=\"nonzero\"/></svg>',\n    'export': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><path d=\"M14.4 3 18 7v1h-5V5H7v14h9a1 1 0 0 1 2 0c0 1-.8 2-1.9 2H7c-1 0-2-.8-2-1.9V5c0-1 .8-2 1.9-2h7.5Z\"/><path d=\"M18.1 12c.5 0 .9.4.9 1 0 .5-.3 1-.8 1h-7.3c-.5 0-.9-.4-.9-1 0-.5.3-1 .8-1h7.3Z\"/><path d=\"M16.4 9.2a1 1 0 0 1 1.4.2l2.4 3.6-2.4 3.6a1 1 0 0 1-1.7-1v-.2l1.7-2.4-1.6-2.4a1 1 0 0 1 .2-1.4Z\"/></g></svg>',\n    'fill': '<svg width=\"24\" height=\"26\"><path d=\"m16.6 12-9-9-1.4 1.4 2.4 2.4-5.2 5.1c-.5.6-.5 1.6 0 2.2L9 19.6a1.5 1.5 0 0 0 2.2 0l5.5-5.5c.5-.6.5-1.6 0-2.2ZM5.2 13 10 8.2l4.8 4.8H5.2ZM19 14.5s-2 2.2-2 3.5c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.3-2-3.5-2-3.5Z\" fill-rule=\"nonzero\"/></svg>',\n    'flip-horizontally': '<svg width=\"24\" height=\"24\"><path d=\"M14 19h2v-2h-2v2Zm4-8h2V9h-2v2ZM4 7v10c0 1.1.9 2 2 2h3v-2H6V7h3V5H6a2 2 0 0 0-2 2Zm14-2v2h2a2 2 0 0 0-2-2Zm-7 16h2V3h-2v18Zm7-6h2v-2h-2v2Zm-4-8h2V5h-2v2Zm4 12a2 2 0 0 0 2-2h-2v2Z\" fill-rule=\"nonzero\"/></svg>',\n    'flip-vertically': '<svg width=\"24\" height=\"24\"><path d=\"M5 14v2h2v-2H5Zm8 4v2h2v-2h-2Zm4-14H7a2 2 0 0 0-2 2v3h2V6h10v3h2V6a2 2 0 0 0-2-2Zm2 14h-2v2a2 2 0 0 0 2-2ZM3 11v2h18v-2H3Zm6 7v2h2v-2H9Zm8-4v2h2v-2h-2ZM5 18c0 1.1.9 2 2 2v-2H5Z\" fill-rule=\"nonzero\"/></svg>',\n    'footnote': '<svg width=\"24\" height=\"24\"><path d=\"M19 13c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2h14Z\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M19 4v6h-1V5h-1.5V4h2.6Z\"/><path d=\"M12 18c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2h7ZM14 8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2h9Z\"/></svg>',\n    'format-painter': '<svg width=\"24\" height=\"24\"><path d=\"M18 5V4c0-.5-.4-1-1-1H5a1 1 0 0 0-1 1v4c0 .6.5 1 1 1h12c.6 0 1-.4 1-1V7h1v4H9v9c0 .6.4 1 1 1h2c.6 0 1-.4 1-1v-7h8V5h-3Z\" fill-rule=\"nonzero\"/></svg>',\n    'format': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"M17 5a1 1 0 0 1 0 2h-4v11a1 1 0 0 1-2 0V7H7a1 1 0 1 1 0-2h10Z\"/></svg>',\n    'fullscreen': '<svg width=\"24\" height=\"24\"><path d=\"m15.3 10-1.2-1.3 2.9-3h-2.3a.9.9 0 1 1 0-1.7H19c.5 0 .9.4.9.9v4.4a.9.9 0 1 1-1.8 0V7l-2.9 3Zm0 4 3 3v-2.3a.9.9 0 1 1 1.7 0V19c0 .5-.4.9-.9.9h-4.4a.9.9 0 1 1 0-1.8H17l-3-2.9 1.3-1.2ZM10 15.4l-2.9 3h2.3a.9.9 0 1 1 0 1.7H5a.9.9 0 0 1-.9-.9v-4.4a.9.9 0 1 1 1.8 0V17l2.9-3 1.2 1.3ZM8.7 10 5.7 7v2.3a.9.9 0 0 1-1.7 0V5c0-.5.4-.9.9-.9h4.4a.9.9 0 0 1 0 1.8H7l3 2.9-1.3 1.2Z\" fill-rule=\"nonzero\"/></svg>',\n    'gallery': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"m5 15.7 2.3-2.2c.3-.3.7-.3 1 0L11 16l5.1-5c.3-.4.8-.4 1 0l2 1.9V8H5v7.7ZM5 18V19h3l1.8-1.9-2-2L5 17.9Zm14-3-2.5-2.4-6.4 6.5H19v-4ZM4 6h16c.6 0 1 .4 1 1v13c0 .6-.4 1-1 1H4a1 1 0 0 1-1-1V7c0-.6.4-1 1-1Zm6 7a2 2 0 1 1 0-4 2 2 0 0 1 0 4ZM4.5 4h15a.5.5 0 1 1 0 1h-15a.5.5 0 0 1 0-1Zm2-2h11a.5.5 0 1 1 0 1h-11a.5.5 0 0 1 0-1Z\"/></svg>',\n    'gamma': '<svg width=\"24\" height=\"24\"><path d=\"M4 3h16c.6 0 1 .4 1 1v16c0 .6-.4 1-1 1H4a1 1 0 0 1-1-1V4c0-.6.4-1 1-1Zm1 2v14h14V5H5Zm6.5 11.8V14L9.2 8.7a5.1 5.1 0 0 0-.4-.8l-.1-.2H8v-1l.3-.1.3-.1h.7a1 1 0 0 1 .6.5l.1.3a8.5 8.5 0 0 1 .3.6l1.9 4.6 2-5.2a1 1 0 0 1 1-.6.5.5 0 0 1 .5.6L13 14v2.8a.7.7 0 0 1-1.4 0Z\" fill-rule=\"nonzero\"/></svg>',\n    'help': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path d=\"M12 5.5a6.5 6.5 0 0 0-6 9 6.3 6.3 0 0 0 1.4 2l1 1a6.3 6.3 0 0 0 3.6 1 6.5 6.5 0 0 0 6-9 6.3 6.3 0 0 0-1.4-2l-1-1a6.3 6.3 0 0 0-3.6-1ZM12 4a7.8 7.8 0 0 1 5.7 2.3A8 8 0 1 1 12 4Z\"/><path d=\"M9.6 9.7a.7.7 0 0 1-.7-.8c0-1.1 1.5-1.8 3.2-1.8 1.8 0 3.2.8 3.2 2.4 0 1.4-.4 2.1-1.5 2.8-.2 0-.3.1-.3.2a2 2 0 0 0-.8.8.8.8 0 0 1-1.4-.6c.3-.7.8-1 1.3-1.5l.4-.2c.7-.4.8-.6.8-1.5 0-.5-.6-.9-1.7-.9-.5 0-1 .1-1.4.3-.2 0-.3.1-.3.2v-.2c0 .4-.4.8-.8.8Z\" fill-rule=\"nonzero\"/><circle cx=\"12\" cy=\"16\" r=\"1\"/></g></svg>',\n    'highlight-bg-color': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path class=\"tox-icon-highlight-bg-color__color\" d=\"M3 18h18v3H3z\"/><path fill-rule=\"nonzero\" d=\"M7.7 16.7H3l3.3-3.3-.7-.8L10.2 8l4 4.1-4 4.2c-.2.2-.6.2-.8 0l-.6-.7-1.1 1.1zm5-7.5L11 7.4l3-2.9a2 2 0 0 1 2.6 0L18 6c.7.7.7 2 0 2.7l-2.9 2.9-1.8-1.8-.5-.6\"/></g></svg>',\n    'home': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z\"/></svg>',\n    'horizontal-rule': '<svg width=\"24\" height=\"24\"><path d=\"M4 11h16v2H4z\" fill-rule=\"evenodd\"/></svg>',\n    'image-options': '<svg width=\"24\" height=\"24\"><path d=\"M6 10a2 2 0 0 0-2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2 2 2 0 0 0-2-2Zm12 0a2 2 0 0 0-2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2 2 2 0 0 0-2-2Zm-6 0a2 2 0 0 0-2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2 2 2 0 0 0-2-2Z\" fill-rule=\"nonzero\"/></svg>',\n    'image': '<svg width=\"24\" height=\"24\"><path d=\"m5 15.7 3.3-3.2c.3-.3.7-.3 1 0L12 15l4.1-4c.3-.4.8-.4 1 0l2 1.9V5H5v10.7ZM5 18V19h3l2.8-2.9-2-2L5 17.9Zm14-3-2.5-2.4-6.4 6.5H19v-4ZM4 3h16c.6 0 1 .4 1 1v16c0 .6-.4 1-1 1H4a1 1 0 0 1-1-1V4c0-.6.4-1 1-1Zm6 8a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z\" fill-rule=\"nonzero\"/></svg>',\n    'indent': '<svg width=\"24\" height=\"24\"><path d=\"M7 5h12c.6 0 1 .4 1 1s-.4 1-1 1H7a1 1 0 1 1 0-2Zm5 4h7c.6 0 1 .4 1 1s-.4 1-1 1h-7a1 1 0 0 1 0-2Zm0 4h7c.6 0 1 .4 1 1s-.4 1-1 1h-7a1 1 0 0 1 0-2Zm-5 4h12a1 1 0 0 1 0 2H7a1 1 0 0 1 0-2Zm-2.6-3.8L6.2 12l-1.8-1.2a1 1 0 0 1 1.2-1.6l3 2a1 1 0 0 1 0 1.6l-3 2a1 1 0 1 1-1.2-1.6Z\" fill-rule=\"evenodd\"/></svg>',\n    'info': '<svg width=\"24\" height=\"24\"><path d=\"M12 4a7.8 7.8 0 0 1 5.7 2.3A8 8 0 1 1 12 4Zm-1 3v2h2V7h-2Zm3 10v-1h-1v-5h-3v1h1v4h-1v1h4Z\" fill-rule=\"evenodd\"/></svg>',\n    'insert-character': '<svg width=\"24\" height=\"24\"><path d=\"M15 18h4l1-2v4h-6v-3.3l1.4-1a6 6 0 0 0 1.8-2.9 6.3 6.3 0 0 0-.1-4.1 5.8 5.8 0 0 0-3-3.2c-.6-.3-1.3-.5-2.1-.5a5.1 5.1 0 0 0-3.9 1.8 6.3 6.3 0 0 0-1.3 6 6.2 6.2 0 0 0 1.8 3l1.4.9V20H4v-4l1 2h4v-.5l-2-1L5.4 15A6.5 6.5 0 0 1 4 11c0-1 .2-1.9.6-2.7A7 7 0 0 1 6.3 6C7.1 5.4 8 5 9 4.5c1-.3 2-.5 3.1-.5a8.8 8.8 0 0 1 5.7 2 7 7 0 0 1 1.7 2.3 6 6 0 0 1 .2 4.8c-.2.7-.6 1.3-1 1.9a7.6 7.6 0 0 1-3.6 2.5v.5Z\" fill-rule=\"evenodd\"/></svg>',\n    'insert-time': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><path d=\"M12 19a7 7 0 1 0 0-14 7 7 0 0 0 0 14Zm0 2a9 9 0 1 1 0-18 9 9 0 0 1 0 18Z\"/><path d=\"M16 12h-3V7c0-.6-.4-1-1-1a1 1 0 0 0-1 1v7h5c.6 0 1-.4 1-1s-.4-1-1-1Z\"/></g></svg>',\n    'invert': '<svg width=\"24\" height=\"24\"><path d=\"M18 19.3 16.5 18a5.8 5.8 0 0 1-3.1 1.9 6.1 6.1 0 0 1-5.5-1.6A5.8 5.8 0 0 1 6 14v-.3l.1-1.2A13.9 13.9 0 0 1 7.7 9l-3-3 .7-.8 2.8 2.9 9 8.9 1.5 1.6-.7.6Zm0-5.5v.3l-.1 1.1-.4 1-1.2-1.2a4.3 4.3 0 0 0 .2-1v-.2c0-.4 0-.8-.2-1.3l-.5-1.4a14.8 14.8 0 0 0-3-4.2L12 6a26.1 26.1 0 0 0-2.2 2.5l-1-1a20.9 20.9 0 0 1 2.9-3.3L12 4l1 .8a22.2 22.2 0 0 1 4 5.4c.6 1.2 1 2.4 1 3.6Z\" fill-rule=\"evenodd\"/></svg>',\n    'italic': '<svg width=\"24\" height=\"24\"><path d=\"m16.7 4.7-.1.9h-.3c-.6 0-1 0-1.4.3-.3.3-.4.6-.5 1.1l-2.1 9.8v.6c0 .5.4.8 1.4.8h.2l-.2.8H8l.2-.8h.2c1.1 0 1.8-.5 2-1.5l2-9.8.1-.5c0-.6-.4-.8-1.4-.8h-.3l.2-.9h5.8Z\" fill-rule=\"evenodd\"/></svg>',\n    'language': '<svg width=\"24\" height=\"24\"><path d=\"M12 3a9 9 0 1 1 0 18 9 9 0 0 1 0-18Zm4.3 13.3c-.5 1-1.2 2-2 2.9a7.5 7.5 0 0 0 3.2-2.1l-.2-.2a6 6 0 0 0-1-.6Zm-8.6 0c-.5.2-.9.5-1.2.8.9 1 2 1.7 3.2 2a10 10 0 0 1-2-2.8Zm3.6-.8c-.8 0-1.6.1-2.2.3.5 1 1.2 1.9 2.1 2.7Zm1.5 0v3c.9-.8 1.6-1.7 2.1-2.7-.6-.2-1.4-.3-2.1-.3Zm-6-2.7H4.5c.2 1 .5 2.1 1 3h.3l1.3-1a10 10 0 0 1-.3-2Zm12.7 0h-2.3c0 .7-.1 1.4-.3 2l1.6 1.1c.5-1 .9-2 1-3.1Zm-3.8 0h-3V14c1 0 2 .1 2.7.4.2-.5.3-1 .3-1.6Zm-4.4 0h-3l.3 1.6c.8-.3 1.7-.4 2.7-.4v-1.3Zm-5.5-5c-.7 1-1.1 2.2-1.3 3.5h2.3c0-1 .2-1.8.5-2.6l-1.5-1Zm2.9 1.4v.1c-.2.6-.4 1.3-.4 2h3V9.4c-1 0-1.8-.1-2.6-.3Zm6.6 0h-.1l-2.4.3v1.8h3l-.5-2.1Zm3-1.4-.3.1-1.3.8c.3.8.5 1.6.5 2.6h2.3a7.5 7.5 0 0 0-1.3-3.5Zm-9 0 2 .2V5.5a9 9 0 0 0-2 2.2Zm3.5-2.3V8c.6 0 1.3 0 1.9-.2a9 9 0 0 0-2-2.3Zm-3-.7h-.1c-1.1.4-2.1 1-3 1.8l1.2.7a10 10 0 0 1 1.9-2.5Zm4.4 0 .1.1a10 10 0 0 1 1.8 2.4l1.1-.7a7.5 7.5 0 0 0-3-1.8Z\"/></svg>',\n    'line-height': '<svg width=\"24\" height=\"24\"><path d=\"M21 5a1 1 0 0 1 .1 2H13a1 1 0 0 1-.1-2H21zm0 4a1 1 0 0 1 .1 2H13a1 1 0 0 1-.1-2H21zm0 4a1 1 0 0 1 .1 2H13a1 1 0 0 1-.1-2H21zm0 4a1 1 0 0 1 .1 2H13a1 1 0 0 1-.1-2H21zM7 3.6l3.7 3.7a1 1 0 0 1-1.3 1.5h-.1L8 7.3v9.2l1.3-1.3a1 1 0 0 1 1.3 0h.1c.4.4.4 1 0 1.3v.1L7 20.4l-3.7-3.7a1 1 0 0 1 1.3-1.5h.1L6 16.7V7.4L4.7 8.7a1 1 0 0 1-1.3 0h-.1a1 1 0 0 1 0-1.3v-.1L7 3.6z\"/></svg>',\n    'line': '<svg width=\"24\" height=\"24\"><path d=\"m15 9-8 8H4v-3l8-8 3 3Zm1-1-3-3 1-1h1c-.2 0 0 0 0 0l2 2s0 .2 0 0v1l-1 1ZM4 18h16v2H4v-2Z\" fill-rule=\"evenodd\"/></svg>',\n    'link': '<svg width=\"24\" height=\"24\"><path d=\"M6.2 12.3a1 1 0 0 1 1.4 1.4l-2 2a2 2 0 1 0 2.6 2.8l4.8-4.8a1 1 0 0 0 0-1.4 1 1 0 1 1 1.4-1.3 2.9 2.9 0 0 1 0 4L9.6 20a3.9 3.9 0 0 1-5.5-5.5l2-2Zm11.6-.6a1 1 0 0 1-1.4-1.4l2-2a2 2 0 1 0-2.6-2.8L11 10.3a1 1 0 0 0 0 1.4A1 1 0 1 1 9.6 13a2.9 2.9 0 0 1 0-4L14.4 4a3.9 3.9 0 0 1 5.5 5.5l-2 2Z\" fill-rule=\"nonzero\"/></svg>',\n    'list-bull-circle': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path d=\"M11 16a2 2 0 1 0 0-4 2 2 0 0 0 0 4Zm0 1a3 3 0 1 1 0-6 3 3 0 0 1 0 6ZM11 26a2 2 0 1 0 0-4 2 2 0 0 0 0 4Zm0 1a3 3 0 1 1 0-6 3 3 0 0 1 0 6ZM11 36a2 2 0 1 0 0-4 2 2 0 0 0 0 4Zm0 1a3 3 0 1 1 0-6 3 3 0 0 1 0 6Z\" fill-rule=\"nonzero\"/><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/></g></svg>',\n    'list-bull-default': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><circle cx=\"11\" cy=\"14\" r=\"3\"/><circle cx=\"11\" cy=\"24\" r=\"3\"/><circle cx=\"11\" cy=\"34\" r=\"3\"/><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/></g></svg>',\n    'list-bull-square': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path d=\"M8 11h6v6H8zM8 21h6v6H8zM8 31h6v6H8z\"/><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/></g></svg>',\n    'list-num-default-rtl': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z\"/><path d=\"M37.4 17v-4.8h-.1l-1.5 1v-1.1l1.6-1.1h1.2v6zM33.3 17.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm1.7 5.7c0-1.2 1-2 2.2-2 1.3 0 2.1.8 2.1 1.8 0 .7-.3 1.2-1.3 2.2l-1.2 1v.2h2.6v1h-4.3v-.9l2-1.9c.8-.8 1-1.1 1-1.5 0-.5-.4-.8-1-.8-.5 0-.9.3-.9.9H35zm-1.7 4.3c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm3.2 7.3v-1h.7c.6 0 1-.3 1-.8 0-.4-.4-.7-1-.7s-1 .3-1 .8H35c0-1.1 1-1.8 2.2-1.8 1.2 0 2.1.6 2.1 1.6 0 .7-.4 1.2-1 1.3v.1c.7.1 1.3.7 1.3 1.4 0 1-1 1.9-2.4 1.9-1.3 0-2.2-.8-2.3-2h1.2c0 .6.5 1 1.1 1 .6 0 1-.4 1-1 0-.5-.3-.8-1-.8h-.7zm-3.3 2.7c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7z\"/></g></svg>',\n    'list-num-default': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/><path d=\"M10 17v-4.8l-1.5 1v-1.1l1.6-1h1.2V17h-1.2Zm3.6.1c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .7.3.7.7 0 .4-.2.7-.7.7Zm-5 5.7c0-1.2.8-2 2.1-2s2.1.8 2.1 1.8c0 .7-.3 1.2-1.4 2.2l-1.1 1v.2h2.6v1H8.6v-.9l2-1.9c.8-.8 1-1.1 1-1.5 0-.5-.4-.8-1-.8-.5 0-.9.3-.9.9H8.5Zm6.3 4.3c-.5 0-.7-.3-.7-.7 0-.4.2-.7.7-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7ZM10 34.4v-1h.7c.6 0 1-.3 1-.8 0-.4-.4-.7-1-.7s-1 .3-1 .8H8.6c0-1.1 1-1.8 2.2-1.8 1.3 0 2.1.6 2.1 1.6 0 .7-.4 1.2-1 1.3v.1c.8.1 1.3.7 1.3 1.4 0 1-1 1.9-2.4 1.9-1.3 0-2.2-.8-2.3-2h1.2c0 .6.5 1 1.1 1 .7 0 1-.4 1-1 0-.5-.3-.8-1-.8h-.7Zm4.7 2.7c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7Z\"/></g></svg>',\n    'list-num-lower-alpha-rtl': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z\"/><path d=\"M36.5 16c-.9 0-1.5-.5-1.5-1.3s.6-1.3 1.8-1.4h1v-.4c0-.4-.2-.6-.7-.6-.4 0-.7.1-.8.4h-1.1c0-.8.8-1.4 2-1.4S39 12 39 13V16h-1.2v-.6c-.3.4-.8.7-1.4.7Zm.4-.8c.6 0 1-.4 1-.9V14h-1c-.5.1-.7.3-.7.6 0 .4.3.6.7.6ZM33.1 16.1c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7ZM37.7 26c-.7 0-1.2-.2-1.5-.7v.7H35v-6.3h1.2v2.5c.3-.5.8-.9 1.5-.9 1.1 0 1.8 1 1.8 2.4 0 1.5-.7 2.4-1.8 2.4Zm-.5-3.6c-.6 0-1 .5-1 1.3s.4 1.4 1 1.4c.7 0 1-.6 1-1.4 0-.8-.3-1.3-1-1.3ZM33.2 26.1c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7zm6 7h-1c-.1-.5-.4-.8-1-.8s-1 .5-1 1.4c0 1 .4 1.4 1 1.4.5 0 .9-.2 1-.7h1c0 1-.8 1.7-2 1.7-1.4 0-2.2-.9-2.2-2.4s.8-2.4 2.2-2.4c1.2 0 2 .7 2 1.7zm-6.1 3c-.5 0-.7-.3-.7-.7 0-.4.2-.7.7-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7z\"/></g></svg>',\n    'list-num-lower-alpha': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/><path d=\"M10.3 15.2c.5 0 1-.4 1-.9V14h-1c-.5.1-.8.3-.8.6 0 .4.3.6.8.6Zm-.4.9c-1 0-1.5-.6-1.5-1.4 0-.8.6-1.3 1.7-1.4h1.1v-.4c0-.4-.2-.6-.7-.6-.5 0-.8.1-.9.4h-1c0-.8.8-1.4 2-1.4 1.1 0 1.8.6 1.8 1.6V16h-1.1v-.6h-.1c-.2.4-.7.7-1.3.7Zm4.6 0c-.5 0-.7-.3-.7-.7 0-.4.2-.7.7-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7Zm-3.2 10c-.6 0-1.2-.3-1.4-.8v.7H8.5v-6.3H10v2.5c.3-.5.8-.9 1.4-.9 1.2 0 1.9 1 1.9 2.4 0 1.5-.7 2.4-1.9 2.4Zm-.4-3.7c-.7 0-1 .5-1 1.3s.3 1.4 1 1.4c.6 0 1-.6 1-1.4 0-.8-.4-1.3-1-1.3Zm4 3.7c-.5 0-.7-.3-.7-.7 0-.4.2-.7.7-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7Zm-2.2 7h-1.2c0-.5-.4-.8-.9-.8-.6 0-1 .5-1 1.4 0 1 .4 1.4 1 1.4.5 0 .8-.2 1-.7h1c0 1-.8 1.7-2 1.7-1.4 0-2.2-.9-2.2-2.4s.8-2.4 2.2-2.4c1.2 0 2 .7 2 1.7Zm1.8 3c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7Z\"/></g></svg>',\n    'list-num-lower-greek-rtl': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z\"/><path d=\"M37.4 16c-1.2 0-2-.8-2-2.3 0-1.5.8-2.4 2-2.4.6 0 1 .4 1.3 1v-.9H40v3.2c0 .4.1.5.4.5h.2v.9h-.6c-.6 0-1-.2-1-.7h-.2c-.2.4-.7.8-1.3.8Zm.3-1c.6 0 1-.5 1-1.3s-.4-1.3-1-1.3-1 .5-1 1.3.4 1.4 1 1.4ZM33.3 16.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7ZM36 21.9c0-1.5.8-2.3 2.1-2.3 1.2 0 2 .6 2 1.6 0 .6-.3 1-.9 1.3.9.3 1.3.8 1.3 1.7 0 1.2-.7 1.9-1.8 1.9-.6 0-1.1-.3-1.4-.8v2.2H36V22Zm1.8 1.2v-1h.3c.5 0 .9-.2.9-.7 0-.5-.3-.8-.9-.8-.5 0-.8.3-.8 1v2.2c0 .8.4 1.3 1 1.3s1-.4 1-1-.4-1-1.2-1h-.3ZM33.3 26.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7ZM37.1 34.6 34.8 30h1.4l1.7 3.5 1.7-3.5h1.1l-2.2 4.6v.1c.5.8.7 1.4.7 1.8 0 .4-.2.8-.4 1-.2.2-.6.3-1 .3-.9 0-1.3-.4-1.3-1.2 0-.5.2-1 .5-1.7l.1-.2Zm.7 1a2 2 0 0 0-.4.9c0 .3.1.4.4.4.3 0 .4-.1.4-.4 0-.2-.1-.6-.4-1ZM33.3 36.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7Z\"/></g></svg>',\n    'list-num-lower-greek': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/><path d=\"M10.5 15c.7 0 1-.5 1-1.3s-.3-1.3-1-1.3c-.5 0-.9.5-.9 1.3s.4 1.4 1 1.4Zm-.3 1c-1.1 0-1.8-.8-1.8-2.3 0-1.5.7-2.4 1.8-2.4.7 0 1.1.4 1.3 1h.1v-.9h1.2v3.2c0 .4.1.5.4.5h.2v.9h-.6c-.6 0-1-.2-1.1-.7h-.1c-.2.4-.7.8-1.4.8Zm5 .1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7Zm-4.9 7v-1h.3c.6 0 1-.2 1-.7 0-.5-.4-.8-1-.8-.5 0-.8.3-.8 1v2.2c0 .8.4 1.3 1.1 1.3.6 0 1-.4 1-1s-.5-1-1.3-1h-.3ZM8.6 22c0-1.5.7-2.3 2-2.3 1.2 0 2 .6 2 1.6 0 .6-.3 1-.8 1.3.8.3 1.3.8 1.3 1.7 0 1.2-.8 1.9-1.9 1.9-.6 0-1.1-.3-1.3-.8v2.2H8.5V22Zm6.2 4.2c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .7.3.7.7 0 .4-.2.7-.7.7Zm-4.5 8.5L8 30h1.4l1.7 3.5 1.7-3.5h1.1l-2.2 4.6v.1c.5.8.7 1.4.7 1.8 0 .4-.1.8-.4 1-.2.2-.6.3-1 .3-.9 0-1.3-.4-1.3-1.2 0-.5.2-1 .5-1.7l.1-.2Zm.7 1a2 2 0 0 0-.4.9c0 .3.1.4.4.4.3 0 .4-.1.4-.4 0-.2-.1-.6-.4-1Zm4.5.5c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7Z\"/></g></svg>',\n    'list-num-lower-roman-rtl': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z\"/><path d=\"M32.9 16v-1.2h-1.3V16H33Zm0 10v-1.2h-1.3V26H33Zm0 10v-1.2h-1.3V36H33Z\"/><path fill-rule=\"nonzero\" d=\"M36 21h-1.5v5H36zM36 31h-1.5v5H36zM39 21h-1.5v5H39zM39 31h-1.5v5H39zM42 31h-1.5v5H42zM36 11h-1.5v5H36zM36 19h-1.5v1H36zM36 29h-1.5v1H36zM39 19h-1.5v1H39zM39 29h-1.5v1H39zM42 29h-1.5v1H42zM36 9h-1.5v1H36z\"/></g></svg>',\n    'list-num-lower-roman': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/><path d=\"M15.1 16v-1.2h1.3V16H15Zm0 10v-1.2h1.3V26H15Zm0 10v-1.2h1.3V36H15Z\"/><path fill-rule=\"nonzero\" d=\"M12 21h1.5v5H12zM12 31h1.5v5H12zM9 21h1.5v5H9zM9 31h1.5v5H9zM6 31h1.5v5H6zM12 11h1.5v5H12zM12 19h1.5v1H12zM12 29h1.5v1H12zM9 19h1.5v1H9zM9 29h1.5v1H9zM6 29h1.5v1H6zM12 9h1.5v1H12z\"/></g></svg>',\n    'list-num-upper-alpha-rtl': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z\"/><path d=\"m39.3 17-.5-1.4h-2l-.5 1.4H35l2-6h1.6l2 6h-1.3Zm-1.6-4.7-.7 2.3h1.6l-.8-2.3ZM33.4 17c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .7.3.7.7 0 .4-.2.7-.7.7Zm4.7 9.9h-2.7v-6H38c1.2 0 1.9.6 1.9 1.5 0 .6-.5 1.2-1 1.3.7.1 1.3.7 1.3 1.5 0 1-.8 1.7-2 1.7Zm-1.4-5v1.5h1c.6 0 1-.3 1-.8 0-.4-.4-.7-1-.7h-1Zm0 4h1.1c.7 0 1.1-.3 1.1-.8 0-.6-.4-.9-1.1-.9h-1.1V26ZM33 27.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7Zm4.9 10c-1.8 0-2.8-1.1-2.8-3.1s1-3.1 2.8-3.1c1.4 0 2.5.9 2.6 2.2h-1.3c0-.7-.6-1.1-1.3-1.1-1 0-1.6.7-1.6 2s.6 2 1.6 2c.7 0 1.2-.4 1.4-1h1.2c-.1 1.3-1.2 2.2-2.6 2.2Zm-4.5 0c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7Z\"/></g></svg>',\n    'list-num-upper-alpha': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/><path d=\"m12.6 17-.5-1.4h-2L9.5 17H8.3l2-6H12l2 6h-1.3ZM11 12.3l-.7 2.3h1.6l-.8-2.3Zm4.7 4.8c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .7.3.7.7 0 .4-.2.7-.7.7ZM11.4 27H8.7v-6h2.6c1.2 0 1.9.6 1.9 1.5 0 .6-.5 1.2-1 1.3.7.1 1.3.7 1.3 1.5 0 1-.8 1.7-2 1.7ZM10 22v1.5h1c.6 0 1-.3 1-.8 0-.4-.4-.7-1-.7h-1Zm0 4H11c.7 0 1.1-.3 1.1-.8 0-.6-.4-.9-1.1-.9H10V26Zm5.4 1.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7Zm-4.1 10c-1.8 0-2.8-1.1-2.8-3.1s1-3.1 2.8-3.1c1.4 0 2.5.9 2.6 2.2h-1.3c0-.7-.6-1.1-1.3-1.1-1 0-1.6.7-1.6 2s.6 2 1.6 2c.7 0 1.2-.4 1.4-1h1.2c-.1 1.3-1.2 2.2-2.6 2.2Zm4.5 0c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7Z\"/></g></svg>',\n    'list-num-upper-roman-rtl': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z\"/><path d=\"M31.6 17v-1.2H33V17h-1.3Zm0 10v-1.2H33V27h-1.3Zm0 10v-1.2H33V37h-1.3Z\"/><path fill-rule=\"nonzero\" d=\"M34.5 20H36v7h-1.5zM34.5 30H36v7h-1.5zM37.5 20H39v7h-1.5zM37.5 30H39v7h-1.5zM40.5 30H42v7h-1.5zM34.5 10H36v7h-1.5z\"/></g></svg>',\n    'list-num-upper-roman': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/><path d=\"M15.1 17v-1.2h1.3V17H15Zm0 10v-1.2h1.3V27H15Zm0 10v-1.2h1.3V37H15Z\"/><path fill-rule=\"nonzero\" d=\"M12 20h1.5v7H12zM12 30h1.5v7H12zM9 20h1.5v7H9zM9 30h1.5v7H9zM6 30h1.5v7H6zM12 10h1.5v7H12z\"/></g></svg>',\n    'lock': '<svg width=\"24\" height=\"24\"><path d=\"M16.3 11c.2 0 .3 0 .5.2l.2.6v7.4c0 .3 0 .4-.2.6l-.6.2H7.8c-.3 0-.4 0-.6-.2a.7.7 0 0 1-.2-.6v-7.4c0-.3 0-.4.2-.6l.5-.2H8V8c0-.8.3-1.5.9-2.1.6-.6 1.3-.9 2.1-.9h2c.8 0 1.5.3 2.1.9.6.6.9 1.3.9 2.1v3h.3ZM10 8v3h4V8a1 1 0 0 0-.3-.7A1 1 0 0 0 13 7h-2a1 1 0 0 0-.7.3 1 1 0 0 0-.3.7Z\" fill-rule=\"evenodd\"/></svg>',\n    'ltr': '<svg width=\"24\" height=\"24\"><path d=\"M11 5h7a1 1 0 0 1 0 2h-1v11a1 1 0 0 1-2 0V7h-2v11a1 1 0 0 1-2 0v-6c-.5 0-1 0-1.4-.3A3.4 3.4 0 0 1 7.8 10a3.3 3.3 0 0 1 0-2.8 3.4 3.4 0 0 1 1.8-1.8L11 5ZM4.4 16.2 6.2 15l-1.8-1.2a1 1 0 0 1 1.2-1.6l3 2a1 1 0 0 1 0 1.6l-3 2a1 1 0 1 1-1.2-1.6Z\" fill-rule=\"evenodd\"/></svg>',\n    'minus': '<svg width=\"24\" height=\"24\"><path d=\"M19 11a1 1 0 0 1 .1 2H5a1 1 0 0 1-.1-2H19Z\"/></svg>',\n    'more-drawer': '<svg width=\"24\" height=\"24\"><path d=\"M6 10a2 2 0 0 0-2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2 2 2 0 0 0-2-2Zm12 0a2 2 0 0 0-2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2 2 2 0 0 0-2-2Zm-6 0a2 2 0 0 0-2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2 2 2 0 0 0-2-2Z\" fill-rule=\"nonzero\"/></svg>',\n    'new-document': '<svg width=\"24\" height=\"24\"><path d=\"M14.4 3H7a2 2 0 0 0-2 2v14c0 1.1.9 2 2 2h10a2 2 0 0 0 2-2V7.6L14.4 3ZM17 19H7V5h6v4h4v10Z\" fill-rule=\"nonzero\"/></svg>',\n    'new-tab': '<svg width=\"24\" height=\"24\"><path d=\"m15 13 2-2v8H5V7h8l-2 2H7v8h8v-4Zm4-8v5.5l-2-2-5.6 5.5H10v-1.4L15.5 7l-2-2H19Z\" fill-rule=\"evenodd\"/></svg>',\n    'non-breaking': '<svg width=\"24\" height=\"24\"><path d=\"M11 11H8a1 1 0 1 1 0-2h3V6c0-.6.4-1 1-1s1 .4 1 1v3h3c.6 0 1 .4 1 1s-.4 1-1 1h-3v3c0 .6-.4 1-1 1a1 1 0 0 1-1-1v-3Zm10 4v5H3v-5c0-.6.4-1 1-1s1 .4 1 1v3h14v-3c0-.6.4-1 1-1s1 .4 1 1Z\" fill-rule=\"evenodd\"/></svg>',\n    'notice': '<svg width=\"24\" height=\"24\"><path d=\"M15.5 4 20 8.5v7L15.5 20h-7L4 15.5v-7L8.5 4h7ZM13 17v-2h-2v2h2Zm0-4V7h-2v6h2Z\" fill-rule=\"evenodd\" clip-rule=\"evenodd\"/></svg>',\n    'ordered-list-rtl': '<svg width=\"24\" height=\"24\"><path d=\"M6 17h8a1 1 0 0 1 0 2H6a1 1 0 0 1 0-2Zm0-6h8a1 1 0 0 1 0 2H6a1 1 0 0 1 0-2Zm0-6h8a1 1 0 0 1 0 2H6a1 1 0 1 1 0-2Zm13-1v3.5a.5.5 0 1 1-1 0V5h-.5a.5.5 0 1 1 0-1H19Zm-1 8.8.2.2h1.3a.5.5 0 1 1 0 1h-1.6a1 1 0 0 1-.9-1V13c0-.4.3-.8.6-1l1.2-.4.2-.3a.2.2 0 0 0-.2-.2h-1.3a.5.5 0 0 1-.5-.5c0-.3.2-.5.5-.5h1.6c.5 0 .9.4.9 1v.1c0 .4-.3.8-.6 1l-1.2.4-.2.3Zm2 4.2v2c0 .6-.4 1-1 1h-1.5a.5.5 0 0 1 0-1h1.2a.3.3 0 1 0 0-.6h-1.3a.4.4 0 1 1 0-.8h1.3a.3.3 0 0 0 0-.6h-1.2a.5.5 0 1 1 0-1H19c.6 0 1 .4 1 1Z\" fill-rule=\"evenodd\"/></svg>',\n    'ordered-list': '<svg width=\"24\" height=\"24\"><path d=\"M10 17h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 1 1 0-2ZM6 4v3.5c0 .3-.2.5-.5.5a.5.5 0 0 1-.5-.5V5h-.5a.5.5 0 0 1 0-1H6Zm-1 8.8.2.2h1.3c.3 0 .5.2.5.5s-.2.5-.5.5H4.9a1 1 0 0 1-.9-1V13c0-.4.3-.8.6-1l1.2-.4.2-.3a.2.2 0 0 0-.2-.2H4.5a.5.5 0 0 1-.5-.5c0-.3.2-.5.5-.5h1.6c.5 0 .9.4.9 1v.1c0 .4-.3.8-.6 1l-1.2.4-.2.3ZM7 17v2c0 .6-.4 1-1 1H4.5a.5.5 0 0 1 0-1h1.2c.2 0 .3-.1.3-.3 0-.2-.1-.3-.3-.3H4.4a.4.4 0 1 1 0-.8h1.3c.2 0 .3-.1.3-.3 0-.2-.1-.3-.3-.3H4.5a.5.5 0 1 1 0-1H6c.6 0 1 .4 1 1Z\" fill-rule=\"evenodd\"/></svg>',\n    'orientation': '<svg width=\"24\" height=\"24\"><path d=\"M7.3 6.4 1 13l6.4 6.5 6.5-6.5-6.5-6.5ZM3.7 13l3.6-3.7L11 13l-3.7 3.7-3.6-3.7ZM12 6l2.8 2.7c.3.3.3.8 0 1-.3.4-.9.4-1.2 0L9.2 5.7a.8.8 0 0 1 0-1.2L13.6.2c.3-.3.9-.3 1.2 0 .3.3.3.8 0 1.1L12 4h1a9 9 0 1 1-4.3 16.9l1.5-1.5A7 7 0 1 0 13 6h-1Z\" fill-rule=\"nonzero\"/></svg>',\n    'outdent': '<svg width=\"24\" height=\"24\"><path d=\"M7 5h12c.6 0 1 .4 1 1s-.4 1-1 1H7a1 1 0 1 1 0-2Zm5 4h7c.6 0 1 .4 1 1s-.4 1-1 1h-7a1 1 0 0 1 0-2Zm0 4h7c.6 0 1 .4 1 1s-.4 1-1 1h-7a1 1 0 0 1 0-2Zm-5 4h12a1 1 0 0 1 0 2H7a1 1 0 0 1 0-2Zm1.6-3.8a1 1 0 0 1-1.2 1.6l-3-2a1 1 0 0 1 0-1.6l3-2a1 1 0 0 1 1.2 1.6L6.8 12l1.8 1.2Z\" fill-rule=\"evenodd\"/></svg>',\n    'page-break': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path d=\"M5 11c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 0 1 0-2Zm3 0h1c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 0 1 0-2Zm4 0c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 0 1 0-2Zm3 0h1c.6 0 1 .4 1 1s-.4 1-1 1h-1a1 1 0 0 1 0-2Zm4 0c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 0 1 0-2ZM7 3v5h10V3c0-.6.4-1 1-1s1 .4 1 1v7H5V3c0-.6.4-1 1-1s1 .4 1 1ZM6 22a1 1 0 0 1-1-1v-7h14v7c0 .6-.4 1-1 1a1 1 0 0 1-1-1v-5H7v5c0 .6-.4 1-1 1Z\"/></g></svg>',\n    'paragraph': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"M10 5h7a1 1 0 0 1 0 2h-1v11a1 1 0 0 1-2 0V7h-2v11a1 1 0 0 1-2 0v-6c-.5 0-1 0-1.4-.3A3.4 3.4 0 0 1 6.8 10a3.3 3.3 0 0 1 0-2.8 3.4 3.4 0 0 1 1.8-1.8L10 5Z\"/></svg>',\n    'paste-column-after': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"M12 1a3 3 0 0 1 2.8 2H18c1 0 2 .8 2 1.9V7h-2V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 0 1-1-1V5H6v13h7v2H6c-1 0-2-.8-2-1.9V5c0-1 .8-2 1.9-2H9.2A3 3 0 0 1 12 1Zm8 7v12h-6V8h6Zm-1.5 1.5h-3v9h3v-9ZM12 3a1 1 0 1 0 0 2 1 1 0 0 0 0-2Z\"/></svg>',\n    'paste-column-before': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"M12 1a3 3 0 0 1 2.8 2H18c1 0 2 .8 2 1.9V18c0 1-.8 2-1.9 2H11v-2h7V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 0 1-1-1V5H6v2H4V5c0-1 .8-2 1.9-2H9.2A3 3 0 0 1 12 1Zm-2 7v12H4V8h6ZM8.5 9.5h-3v9h3v-9ZM12 3a1 1 0 1 0 0 2 1 1 0 0 0 0-2Z\"/></svg>',\n    'paste-row-after': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"M12 1a3 3 0 0 1 2.8 2H18c1 0 2 .8 2 1.9V11h-2V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 0 1-1-1V5H6v13h14c0 1-.8 2-1.9 2H6c-1 0-2-.8-2-1.9V5c0-1 .8-2 1.9-2H9.2A3 3 0 0 1 12 1Zm10 11v5H8v-5h14Zm-1.5 1.5h-11v2h11v-2ZM12 3a1 1 0 1 0 0 2 1 1 0 0 0 0-2Z\"/></svg>',\n    'paste-row-before': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"M12 1a3 3 0 0 1 2.8 2H18c1 0 2 .8 2 1.9V7h-2V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 0 1-1-1V5H6v13h12v-4h2v4c0 1-.8 2-1.9 2H6c-1 0-2-.8-2-1.9V5c0-1 .8-2 1.9-2H9.2A3 3 0 0 1 12 1Zm10 7v5H8V8h14Zm-1.5 1.5h-11v2h11v-2ZM12 3a1 1 0 1 0 0 2 1 1 0 0 0 0-2Z\"/></svg>',\n    'paste-text': '<svg width=\"24\" height=\"24\"><path d=\"M18 9V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 0 1-1-1V5H6v13h3V9h9ZM9 20H6a2 2 0 0 1-2-2V5c0-1.1.9-2 2-2h3.2A3 3 0 0 1 12 1a3 3 0 0 1 2.8 2H18a2 2 0 0 1 2 2v4h1v12H9v-1Zm1.5-9.5v9h9v-9h-9ZM12 3a1 1 0 0 0-1 1c0 .5.4 1 1 1s1-.5 1-1-.4-1-1-1Zm0 9h6v2h-.5l-.5-1h-1v4h.8v1h-3.6v-1h.8v-4h-1l-.5 1H12v-2Z\" fill-rule=\"nonzero\"/></svg>',\n    'paste': '<svg width=\"24\" height=\"24\"><path d=\"M18 9V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 0 1-1-1V5H6v13h3V9h9ZM9 20H6a2 2 0 0 1-2-2V5c0-1.1.9-2 2-2h3.2A3 3 0 0 1 12 1a3 3 0 0 1 2.8 2H18a2 2 0 0 1 2 2v4h1v12H9v-1Zm1.5-9.5v9h9v-9h-9ZM12 3a1 1 0 0 0-1 1c0 .5.4 1 1 1s1-.5 1-1-.4-1-1-1Z\" fill-rule=\"nonzero\"/></svg>',\n    'permanent-pen': '<svg width=\"24\" height=\"24\"><path d=\"M10.5 17.5 8 20H3v-3l3.5-3.5a2 2 0 0 1 0-3L14 3l1 1-7.3 7.3a1 1 0 0 0 0 1.4l3.6 3.6c.4.4 1 .4 1.4 0L20 9l1 1-7.6 7.6a2 2 0 0 1-2.8 0l-.1-.1Z\" fill-rule=\"nonzero\"/></svg>',\n    'plus': '<svg width=\"24\" height=\"24\"><path d=\"M12 4c.5 0 1 .4 1 .9V11h6a1 1 0 0 1 .1 2H13v6a1 1 0 0 1-2 .1V13H5a1 1 0 0 1-.1-2H11V5c0-.6.4-1 1-1Z\"/></svg>',\n    'preferences': '<svg width=\"24\" height=\"24\"><path d=\"m20.1 13.5-1.9.2a5.8 5.8 0 0 1-.6 1.5l1.2 1.5c.4.4.3 1 0 1.4l-.7.7a1 1 0 0 1-1.4 0l-1.5-1.2a6.2 6.2 0 0 1-1.5.6l-.2 1.9c0 .5-.5.9-1 .9h-1a1 1 0 0 1-1-.9l-.2-1.9a5.8 5.8 0 0 1-1.5-.6l-1.5 1.2a1 1 0 0 1-1.4 0l-.7-.7a1 1 0 0 1 0-1.4l1.2-1.5a6.2 6.2 0 0 1-.6-1.5l-1.9-.2a1 1 0 0 1-.9-1v-1c0-.5.4-1 .9-1l1.9-.2a5.8 5.8 0 0 1 .6-1.5L5.2 7.3a1 1 0 0 1 0-1.4l.7-.7a1 1 0 0 1 1.4 0l1.5 1.2a6.2 6.2 0 0 1 1.5-.6l.2-1.9c0-.5.5-.9 1-.9h1c.5 0 1 .4 1 .9l.2 1.9a5.8 5.8 0 0 1 1.5.6l1.5-1.2a1 1 0 0 1 1.4 0l.7.7c.3.4.4 1 0 1.4l-1.2 1.5a6.2 6.2 0 0 1 .6 1.5l1.9.2c.5 0 .9.5.9 1v1c0 .5-.4 1-.9 1ZM12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z\" fill-rule=\"evenodd\"/></svg>',\n    'preview': '<svg width=\"24\" height=\"24\"><path d=\"M3.5 12.5c.5.8 1.1 1.6 1.8 2.3 2 2 4.2 3.2 6.7 3.2s4.7-1.2 6.7-3.2a16.2 16.2 0 0 0 2.1-2.8 15.7 15.7 0 0 0-2.1-2.8c-2-2-4.2-3.2-6.7-3.2a9.3 9.3 0 0 0-6.7 3.2A16.2 16.2 0 0 0 3.2 12c0 .2.2.3.3.5Zm-2.4-1 .7-1.2L4 7.8C6.2 5.4 8.9 4 12 4c3 0 5.8 1.4 8.1 3.8a18.2 18.2 0 0 1 2.8 3.7v1l-.7 1.2-2.1 2.5c-2.3 2.4-5 3.8-8.1 3.8-3 0-5.8-1.4-8.1-3.8a18.2 18.2 0 0 1-2.8-3.7 1 1 0 0 1 0-1Zm12-3.3a2 2 0 1 0 2.7 2.6 4 4 0 1 1-2.6-2.6Z\" fill-rule=\"nonzero\"/></svg>',\n    'print': '<svg width=\"24\" height=\"24\"><path d=\"M18 8H6a3 3 0 0 0-3 3v6h2v3h14v-3h2v-6a3 3 0 0 0-3-3Zm-1 10H7v-4h10v4Zm.5-5c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5Zm.5-8H6v2h12V5Z\" fill-rule=\"nonzero\"/></svg>',\n    'quote': '<svg width=\"24\" height=\"24\"><path d=\"M7.5 17h.9c.4 0 .7-.2.9-.6L11 13V8c0-.6-.4-1-1-1H6a1 1 0 0 0-1 1v4c0 .6.4 1 1 1h2l-1.3 2.7a1 1 0 0 0 .8 1.3Zm8 0h.9c.4 0 .7-.2.9-.6L19 13V8c0-.6-.4-1-1-1h-4a1 1 0 0 0-1 1v4c0 .6.4 1 1 1h2l-1.3 2.7a1 1 0 0 0 .8 1.3Z\" fill-rule=\"nonzero\"/></svg>',\n    'redo': '<svg width=\"24\" height=\"24\"><path d=\"M17.6 10H12c-2.8 0-4.4 1.4-4.9 3.5-.4 2 .3 4 1.4 4.6a1 1 0 1 1-1 1.8c-2-1.2-2.9-4.1-2.3-6.8.6-3 3-5.1 6.8-5.1h5.6l-3.3-3.3a1 1 0 1 1 1.4-1.4l5 5a1 1 0 0 1 0 1.4l-5 5a1 1 0 0 1-1.4-1.4l3.3-3.3Z\" fill-rule=\"nonzero\"/></svg>',\n    'reload': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><path d=\"m5 22.1-1.2-4.7v-.2a1 1 0 0 1 1-1l5 .4a1 1 0 1 1-.2 2l-2.2-.2a7.8 7.8 0 0 0 8.4.2 7.5 7.5 0 0 0 3.5-6.4 1 1 0 1 1 2 0 9.5 9.5 0 0 1-4.5 8 9.9 9.9 0 0 1-10.2 0l.4 1.4a1 1 0 1 1-2 .5ZM13.6 7.4c0-.5.5-1 1-.9l2.8.2a8 8 0 0 0-9.5-1 7.5 7.5 0 0 0-3.6 7 1 1 0 0 1-2 0 9.5 9.5 0 0 1 4.5-8.6 10 10 0 0 1 10.9.3l-.3-1a1 1 0 0 1 2-.5l1.1 4.8a1 1 0 0 1-1 1.2l-5-.4a1 1 0 0 1-.9-1Z\"/></g></svg>',\n    'remove-formatting': '<svg width=\"24\" height=\"24\"><path d=\"M13.2 6a1 1 0 0 1 0 .2l-2.6 10a1 1 0 0 1-1 .8h-.2a.8.8 0 0 1-.8-1l2.6-10H8a1 1 0 1 1 0-2h9a1 1 0 0 1 0 2h-3.8ZM5 18h7a1 1 0 0 1 0 2H5a1 1 0 0 1 0-2Zm13 1.5L16.5 18 15 19.5a.7.7 0 0 1-1-1l1.5-1.5-1.5-1.5a.7.7 0 0 1 1-1l1.5 1.5 1.5-1.5a.7.7 0 0 1 1 1L17.5 17l1.5 1.5a.7.7 0 0 1-1 1Z\" fill-rule=\"evenodd\"/></svg>',\n    'remove': '<svg width=\"24\" height=\"24\"><path d=\"M16 7h3a1 1 0 0 1 0 2h-1v9a3 3 0 0 1-3 3H9a3 3 0 0 1-3-3V9H5a1 1 0 1 1 0-2h3V6a3 3 0 0 1 3-3h2a3 3 0 0 1 3 3v1Zm-2 0V6c0-.6-.4-1-1-1h-2a1 1 0 0 0-1 1v1h4Zm2 2H8v9c0 .6.4 1 1 1h6c.6 0 1-.4 1-1V9Zm-7 3a1 1 0 0 1 2 0v4a1 1 0 0 1-2 0v-4Zm4 0a1 1 0 0 1 2 0v4a1 1 0 0 1-2 0v-4Z\" fill-rule=\"nonzero\"/></svg>',\n    'resize-handle': '<svg width=\"10\" height=\"10\"><g fill-rule=\"nonzero\"><path d=\"M8.1 1.1A.5.5 0 1 1 9 2l-7 7A.5.5 0 1 1 1 8l7-7ZM8.1 5.1A.5.5 0 1 1 9 6l-3 3A.5.5 0 1 1 5 8l3-3Z\"/></g></svg>',\n    'resize': '<svg width=\"24\" height=\"24\"><path d=\"M4 5c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h6c.3 0 .5.1.7.3.2.2.3.4.3.7 0 .3-.1.5-.3.7a1 1 0 0 1-.7.3H7.4L18 16.6V13c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3.3 0 .5.1.7.3.2.2.3.4.3.7v6c0 .3-.1.5-.3.7a1 1 0 0 1-.7.3h-6a1 1 0 0 1-.7-.3 1 1 0 0 1-.3-.7c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h3.6L6 7.4V11c0 .3-.1.5-.3.7a1 1 0 0 1-.7.3 1 1 0 0 1-.7-.3A1 1 0 0 1 4 11V5Z\" fill-rule=\"evenodd\"/></svg>',\n    'restore-draft': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path d=\"M17 13c0 .6-.4 1-1 1h-4V8c0-.6.4-1 1-1s1 .4 1 1v4h2c.6 0 1 .4 1 1Z\"/><path d=\"M4.7 10H9a1 1 0 0 1 0 2H3a1 1 0 0 1-1-1V5a1 1 0 1 1 2 0v3l2.5-2.4a9.2 9.2 0 0 1 10.8-1.5A9 9 0 0 1 13.4 21c-2.4.1-4.7-.7-6.5-2.2a1 1 0 1 1 1.3-1.5 7.2 7.2 0 0 0 11.6-3.7 7 7 0 0 0-3.5-7.7A7.2 7.2 0 0 0 8 7L4.7 10Z\" fill-rule=\"nonzero\"/></g></svg>',\n    'revision-history': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path d=\"M17 13c0 .6-.4 1-1 1h-4V8c0-.6.4-1 1-1s1 .4 1 1v4h2c.6 0 1 .4 1 1Z\"/><path d=\"M4.7 10H9a1 1 0 0 1 0 2H3a1 1 0 0 1-1-1V5a1 1 0 1 1 2 0v3l2.5-2.4a9.2 9.2 0 0 1 10.8-1.5A9 9 0 0 1 13.4 21c-2.4.1-4.7-.7-6.5-2.2a1 1 0 1 1 1.3-1.5 7.2 7.2 0 0 0 11.6-3.7 7 7 0 0 0-3.5-7.7A7.2 7.2 0 0 0 8 7L4.7 10Z\" fill-rule=\"nonzero\"/></g></svg>',\n    'rotate-left': '<svg width=\"24\" height=\"24\"><path d=\"M4.7 10H9a1 1 0 0 1 0 2H3a1 1 0 0 1-1-1V5a1 1 0 1 1 2 0v3l2.5-2.4a9.2 9.2 0 0 1 10.8-1.5A9 9 0 0 1 13.4 21c-2.4.1-4.7-.7-6.5-2.2a1 1 0 1 1 1.3-1.5 7.2 7.2 0 0 0 11.6-3.7 7 7 0 0 0-3.5-7.7A7.2 7.2 0 0 0 8 7L4.7 10Z\" fill-rule=\"nonzero\"/></svg>',\n    'rotate-right': '<svg width=\"24\" height=\"24\"><path d=\"M20 8V5a1 1 0 0 1 2 0v6c0 .6-.4 1-1 1h-6a1 1 0 0 1 0-2h4.3L16 7A7.2 7.2 0 0 0 7.7 6a7 7 0 0 0 3 13.1c1.9.1 3.7-.5 5-1.7a1 1 0 0 1 1.4 1.5A9.2 9.2 0 0 1 2.2 14c-.9-3.9 1-8 4.5-9.9 3.5-1.9 8-1.3 10.8 1.5L20 8Z\" fill-rule=\"nonzero\"/></svg>',\n    'rtl': '<svg width=\"24\" height=\"24\"><path d=\"M8 5h8v2h-2v12h-2V7h-2v12H8v-7c-.5 0-1 0-1.4-.3A3.4 3.4 0 0 1 4.8 10a3.3 3.3 0 0 1 0-2.8 3.4 3.4 0 0 1 1.8-1.8L8 5Zm12 11.2a1 1 0 1 1-1 1.6l-3-2a1 1 0 0 1 0-1.6l3-2a1 1 0 1 1 1 1.6L18.4 15l1.8 1.2Z\" fill-rule=\"evenodd\"/></svg>',\n    'save': '<svg width=\"24\" height=\"24\"><path d=\"M5 16h14a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-2c0-1.1.9-2 2-2Zm0 2v2h14v-2H5Zm10 0h2v2h-2v-2Zm-4-6.4L8.7 9.3a1 1 0 1 0-1.4 1.4l4 4c.4.4 1 .4 1.4 0l4-4a1 1 0 1 0-1.4-1.4L13 11.6V4a1 1 0 0 0-2 0v7.6Z\" fill-rule=\"nonzero\"/></svg>',\n    'search': '<svg width=\"24\" height=\"24\"><path d=\"M16 17.3a8 8 0 1 1 1.4-1.4l4.3 4.4a1 1 0 0 1-1.4 1.4l-4.4-4.3Zm-5-.3a6 6 0 1 0 0-12 6 6 0 0 0 0 12Z\" fill-rule=\"nonzero\"/></svg>',\n    'select-all': '<svg width=\"24\" height=\"24\"><path d=\"M3 5h2V3a2 2 0 0 0-2 2Zm0 8h2v-2H3v2Zm4 8h2v-2H7v2ZM3 9h2V7H3v2Zm10-6h-2v2h2V3Zm6 0v2h2a2 2 0 0 0-2-2ZM5 21v-2H3c0 1.1.9 2 2 2Zm-2-4h2v-2H3v2ZM9 3H7v2h2V3Zm2 18h2v-2h-2v2Zm8-8h2v-2h-2v2Zm0 8a2 2 0 0 0 2-2h-2v2Zm0-12h2V7h-2v2Zm0 8h2v-2h-2v2Zm-4 4h2v-2h-2v2Zm0-16h2V3h-2v2ZM7 17h10V7H7v10Zm2-8h6v6H9V9Z\" fill-rule=\"nonzero\"/></svg>',\n    'selected': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M6 4h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2Zm3.6 10.9L7 12.3a.7.7 0 0 0-1 1L9.6 17 18 8.6a.7.7 0 0 0 0-1 .7.7 0 0 0-1 0l-7.4 7.3Z\"/></svg>',\n    'send': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"m13.3 22 7-18.3-18.3 7L9 15l4.3 7ZM18 6.8l-.7-.7L9.4 14l.7.7L18 6.8Z\"/></svg>',\n    'settings': '<svg width=\"24\" height=\"24\"><path d=\"M11 6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8v.3c0 .2 0 .3-.2.5l-.6.2H7.8c-.3 0-.4 0-.6-.2a.7.7 0 0 1-.2-.6V8H5a1 1 0 1 1 0-2h2v-.3c0-.2 0-.3.2-.5l.5-.2h2.5c.3 0 .4 0 .6.2l.2.5V6ZM8 8h2V6H8v2Zm9 2.8v.2h2c.6 0 1 .4 1 1s-.4 1-1 1h-2v.3c0 .2 0 .3-.2.5l-.6.2h-2.4c-.3 0-.4 0-.6-.2a.7.7 0 0 1-.2-.6V13H5a1 1 0 0 1 0-2h8v-.3c0-.2 0-.3.2-.5l.6-.2h2.4c.3 0 .4 0 .6.2l.2.6ZM14 13h2v-2h-2v2Zm-3 2.8v.2h8c.6 0 1 .4 1 1s-.4 1-1 1h-8v.3c0 .2 0 .3-.2.5l-.6.2H7.8c-.3 0-.4 0-.6-.2a.7.7 0 0 1-.2-.6V18H5a1 1 0 0 1 0-2h2v-.3c0-.2 0-.3.2-.5l.5-.2h2.5c.3 0 .4 0 .6.2l.2.6ZM8 18h2v-2H8v2Z\" fill-rule=\"evenodd\"/></svg>',\n    'sharpen': '<svg width=\"24\" height=\"24\"><path d=\"m16 6 4 4-8 9-8-9 4-4h8Zm-4 10.2 5.5-6.2-.1-.1H12v-.3h5.1l-.2-.2H12V9h4.6l-.2-.2H12v-.3h4.1l-.2-.2H12V8h3.6l-.2-.2H8.7L6.5 10l.1.1H12v.3H6.9l.2.2H12v.3H7.3l.2.2H12v.3H7.7l.3.2h4v.3H8.2l.2.2H12v.3H8.6l.3.2H12v.3H9l.3.2H12v.3H9.5l.2.2H12v.3h-2l.2.2H12v.3h-1.6l.2.2H12v.3h-1.1l.2.2h.9v.3h-.7l.2.2h.5v.3h-.3l.3.2Z\" fill-rule=\"evenodd\"/></svg>',\n    'sourcecode': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><path d=\"M9.8 15.7c.3.3.3.8 0 1-.3.4-.9.4-1.2 0l-4.4-4.1a.8.8 0 0 1 0-1.2l4.4-4.2c.3-.3.9-.3 1.2 0 .3.3.3.8 0 1.1L6 12l3.8 3.7ZM14.2 15.7c-.3.3-.3.8 0 1 .4.4.9.4 1.2 0l4.4-4.1c.3-.3.3-.9 0-1.2l-4.4-4.2a.8.8 0 0 0-1.2 0c-.3.3-.3.8 0 1.1L18 12l-3.8 3.7Z\"/></g></svg>',\n    'spell-check': '<svg width=\"24\" height=\"24\"><path d=\"M6 8v3H5V5c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h2c.3 0 .5.1.7.3.2.2.3.4.3.7v6H8V8H6Zm0-3v2h2V5H6Zm13 0h-3v5h3v1h-3a1 1 0 0 1-.7-.3 1 1 0 0 1-.3-.7V5c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h3v1Zm-5 1.5-.1.7c-.1.2-.3.3-.6.3.3 0 .5.1.6.3l.1.7V10c0 .3-.1.5-.3.7a1 1 0 0 1-.7.3h-3V4h3c.3 0 .5.1.7.3.2.2.3.4.3.7v1.5ZM13 10V8h-2v2h2Zm0-3V5h-2v2h2Zm3 5 1 1-6.5 7L7 15.5l1.3-1 2.2 2.2L16 12Z\" fill-rule=\"evenodd\"/></svg>',\n    'strike-through': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path d=\"M15.6 8.5c-.5-.7-1-1.1-1.3-1.3-.6-.4-1.3-.6-2-.6-2.7 0-2.8 1.7-2.8 2.1 0 1.6 1.8 2 3.2 2.3 4.4.9 4.6 2.8 4.6 3.9 0 1.4-.7 4.1-5 4.1A6.2 6.2 0 0 1 7 16.4l1.5-1.1c.4.6 1.6 2 3.7 2 1.6 0 2.5-.4 3-1.2.4-.8.3-2-.8-2.6-.7-.4-1.6-.7-2.9-1-1-.2-3.9-.8-3.9-3.6C7.6 6 10.3 5 12.4 5c2.9 0 4.2 1.6 4.7 2.4l-1.5 1.1Z\"/><path d=\"M5 11h14a1 1 0 0 1 0 2H5a1 1 0 0 1 0-2Z\" fill-rule=\"nonzero\"/></g></svg>',\n    'subscript': '<svg width=\"24\" height=\"24\"><path d=\"m10.4 10 4.6 4.6-1.4 1.4L9 11.4 4.4 16 3 14.6 7.6 10 3 5.4 4.4 4 9 8.6 13.6 4 15 5.4 10.4 10ZM21 19h-5v-1l1-.8 1.7-1.6c.3-.4.5-.8.5-1.2 0-.3 0-.6-.2-.7-.2-.2-.5-.3-.9-.3a2 2 0 0 0-.8.2l-.7.3-.4-1.1 1-.6 1.2-.2c.8 0 1.4.3 1.8.7.4.4.6.9.6 1.5s-.2 1.1-.5 1.6a8 8 0 0 1-1.3 1.3l-.6.6h2.6V19Z\" fill-rule=\"nonzero\"/></svg>',\n    'superscript': '<svg width=\"24\" height=\"24\"><path d=\"M15 9.4 10.4 14l4.6 4.6-1.4 1.4L9 15.4 4.4 20 3 18.6 7.6 14 3 9.4 4.4 8 9 12.6 13.6 8 15 9.4Zm5.9 1.6h-5v-1l1-.8 1.7-1.6c.3-.5.5-.9.5-1.3 0-.3 0-.5-.2-.7-.2-.2-.5-.3-.9-.3l-.8.2-.7.4-.4-1.2c.2-.2.5-.4 1-.5.3-.2.8-.2 1.2-.2.8 0 1.4.2 1.8.6.4.4.6 1 .6 1.6 0 .5-.2 1-.5 1.5l-1.3 1.4-.6.5h2.6V11Z\" fill-rule=\"nonzero\"/></svg>',\n    'table-caption': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><rect width=\"12\" height=\"2\" x=\"3\" y=\"4\" rx=\"1\"/><path d=\"M19 8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-8c0-1.1.9-2 2-2h14ZM5 15v3h6v-3H5Zm14 0h-6v3h6v-3Zm0-5h-6v3h6v-3ZM5 13h6v-3H5v3Z\"/></g></svg>',\n    'table-cell-classes': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path fill-rule=\"nonzero\" d=\"M13 4v9H3V6c0-1.1.9-2 2-2h8Zm-2 2H5v5h6V6Z\"/><path fill-rule=\"nonzero\" d=\"M13 4h6a2 2 0 0 1 2 2v7h-8v-2h6V6h-6V4Z\" opacity=\".2\"/><path d=\"m18 20-2.6 1.6.7-3-2.4-2 3.1-.2 1.2-2.9 1.2 2.9 3.1.2-2.4 2 .7 3z\"/><path fill-rule=\"nonzero\" d=\"M3 13v5c0 1.1.9 2 2 2h8v-7h-2v5H5v-5H3Z\" opacity=\".2\"/></g></svg>',\n    'table-cell-properties': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14Zm-8 9H5v5h6v-5Zm8 0h-6v5h6v-5Zm-8-7H5v5h6V6Z\"/></svg>',\n    'table-cell-select-all': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14Zm0 2H5v12h14V6Z\"/><path d=\"M13 6v5h6v2h-6v5h-2v-5H5v-2h6V6h2Z\" opacity=\".2\"/></g></svg>',\n    'table-cell-select-inner': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14Zm0 2H5v12h14V6Z\" opacity=\".2\"/><path d=\"M13 6v5h6v2h-6v5h-2v-5H5v-2h6V6h2Z\"/></g></svg>',\n    'table-classes': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v7h-8v7H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14Zm-8 9H5v5h6v-5Zm8-7h-6v5h6V6Zm-8 0H5v5h6V6Z\"/><path d=\"m18 20-2.6 1.6.7-3-2.4-2 3.1-.2 1.2-2.9 1.2 2.9 3.1.2-2.4 2 .7 3z\"/></g></svg>',\n    'table-delete-column': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14Zm-4 4h-2V6h-2v2H9V6H5v12h4v-2h2v2h2v-2h2v2h4V6h-4v2Zm.3.5 1 1.2-3 2.3 3 2.3-1 1.2L12 13l-3.3 2.6-1-1.2 3-2.3-3-2.3 1-1.2L12 11l3.3-2.5Z\"/></svg>',\n    'table-delete-row': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14Zm0 2H5v3h2.5v2H5v2h2.5v2H5v3h14v-3h-2.5v-2H19v-2h-2.5V9H19V6Zm-4.7 1.8 1.2 1L13 12l2.6 3.3-1.2 1-2.3-3-2.3 3-1.2-1L11 12 8.5 8.7l1.2-1 2.3 3 2.3-3Z\"/></svg>',\n    'table-delete-table': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><path d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14ZM5 6v12h14V6H5Z\"/><path d=\"m14.4 8.6 1.1 1-2.4 2.4 2.4 2.4-1.1 1.1-2.4-2.4-2.4 2.4-1-1.1 2.3-2.4-2.3-2.4 1-1 2.4 2.3z\"/></g></svg>',\n    'table-insert-column-after': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M20 4c.6 0 1 .4 1 1v2a1 1 0 0 1-2 0V6h-8v12h8v-1a1 1 0 0 1 2 0v2c0 .5-.4 1-.9 1H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h15ZM9 13H5v5h4v-5Zm7-5c.5 0 1 .4 1 .9V11h2a1 1 0 0 1 .1 2H17v2a1 1 0 0 1-2 .1V13h-2a1 1 0 0 1-.1-2H15V9c0-.6.4-1 1-1ZM9 6H5v5h4V6Z\"/></svg>',\n    'table-insert-column-before': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a1 1 0 0 1-1-1v-2a1 1 0 0 1 2 0v1h8V6H5v1a1 1 0 1 1-2 0V5c0-.6.4-1 1-1h15Zm0 9h-4v5h4v-5ZM8 8c.5 0 1 .4 1 .9V11h2a1 1 0 0 1 .1 2H9v2a1 1 0 0 1-2 .1V13H5a1 1 0 0 1-.1-2H7V9c0-.6.4-1 1-1Zm11-2h-4v5h4V6Z\"/></svg>',\n    'table-insert-row-above': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M6 4a1 1 0 1 1 0 2H5v6h14V6h-1a1 1 0 0 1 0-2h2c.6 0 1 .4 1 1v13a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5c0-.6.4-1 1-1h2Zm5 10H5v4h6v-4Zm8 0h-6v4h6v-4ZM12 3c.5 0 1 .4 1 .9V6h2a1 1 0 0 1 0 2h-2v2a1 1 0 0 1-2 .1V8H9a1 1 0 0 1 0-2h2V4c0-.6.4-1 1-1Z\"/></svg>',\n    'table-insert-row-after': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M12 13c.5 0 1 .4 1 .9V16h2a1 1 0 0 1 .1 2H13v2a1 1 0 0 1-2 .1V18H9a1 1 0 0 1-.1-2H11v-2c0-.6.4-1 1-1Zm6 7a1 1 0 0 1 0-2h1v-6H5v6h1a1 1 0 0 1 0 2H4a1 1 0 0 1-1-1V6c0-1.1.9-2 2-2h14a2 2 0 0 1 2 2v13c0 .5-.4 1-.9 1H18ZM11 6H5v4h6V6Zm8 0h-6v4h6V6Z\"/></svg>',\n    'table-left-header': '<svg width=\"24\" height=\"24\"><path d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14Zm0 9h-4v5h4v-5Zm-6 0H9v5h4v-5Zm0-7H9v5h4V6Zm6 0h-4v5h4V6Z\"/></svg>',\n    'table-merge-cells': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14ZM5 15.5V18h3v-2.5H5Zm14-5h-9V18h9v-7.5ZM19 6h-4v2.5h4V6ZM8 6H5v2.5h3V6Zm5 0h-3v2.5h3V6Zm-8 7.5h3v-3H5v3Z\"/></svg>',\n    'table-row-numbering-rtl': '<svg width=\"24\" height=\"24\"><path d=\"M6 4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H6Zm0 12h8v3H6v-3Zm11 0c.6 0 1 .4 1 1v1a1 1 0 0 1-2 0v-1c0-.6.4-1 1-1ZM6 11h8v3H6v-3Zm11 0c.6 0 1 .4 1 1v1a1 1 0 0 1-2 0v-1c0-.6.4-1 1-1ZM6 6h8v3H6V6Zm11 0c.6 0 1 .4 1 1v1a1 1 0 1 1-2 0V7c0-.6.4-1 1-1Z\"/></svg>',\n    'table-row-numbering': '<svg width=\"24\" height=\"24\"><path d=\"M18 4a2 2 0 0 1 2 2v13a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h12Zm0 12h-8v3h8v-3ZM7 16a1 1 0 0 0-1 1v1a1 1 0 0 0 2 0v-1c0-.6-.4-1-1-1Zm11-5h-8v3h8v-3ZM7 11a1 1 0 0 0-1 1v1a1 1 0 0 0 2 0v-1c0-.6-.4-1-1-1Zm11-5h-8v3h8V6ZM7 6a1 1 0 0 0-1 1v1a1 1 0 1 0 2 0V7c0-.6-.4-1-1-1Z\"/></svg>',\n    'table-row-properties': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14ZM5 15v3h6v-3H5Zm14 0h-6v3h6v-3Zm0-9h-6v3h6V6ZM5 9h6V6H5v3Z\"/></svg>',\n    'table-split-cells': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14ZM8 15.5H5V18h3v-2.5Zm11-5h-9V18h9v-7.5Zm-2.5 1 1 1-2 2 2 2-1 1-2-2-2 2-1-1 2-2-2-2 1-1 2 2 2-2Zm-8.5-1H5v3h3v-3ZM19 6h-4v2.5h4V6ZM8 6H5v2.5h3V6Zm5 0h-3v2.5h3V6Z\"/></svg>',\n    'table-top-header': '<svg width=\"24\" height=\"24\"><path d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14Zm-8 11H5v3h6v-3Zm8 0h-6v3h6v-3Zm0-5h-6v3h6v-3ZM5 13h6v-3H5v3Z\"/></svg>',\n    'table': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14ZM5 14v4h6v-4H5Zm14 0h-6v4h6v-4Zm0-6h-6v4h6V8ZM5 12h6V8H5v4Z\"/></svg>',\n    'template-add': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M9 12v4H5a2 2 0 0 0-2 2v3h9.3a6 6 0 0 1-.3-2H5v-1h7a6 6 0 0 1 .8-2H11v-5l-.8-.6a3 3 0 1 1 3.6 0l-.8.6v4.7a6 6 0 0 1 2-1.9V12a5 5 0 1 0-6 0Z\"/><path d=\"M18 15c.5 0 1 .4 1 .9V18h2a1 1 0 0 1 .1 2H19v2a1 1 0 0 1-2 .1V20h-2a1 1 0 0 1-.1-2H17v-2c0-.6.4-1 1-1Z\"/></svg>',\n    'template': '<svg width=\"24\" height=\"24\"><path d=\"M19 19v-1H5v1h14ZM9 16v-4a5 5 0 1 1 6 0v4h4a2 2 0 0 1 2 2v3H3v-3c0-1.1.9-2 2-2h4Zm4 0v-5l.8-.6a3 3 0 1 0-3.6 0l.8.6v5h2Z\" fill-rule=\"nonzero\"/></svg>',\n    'temporary-placeholder': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path d=\"M9 7.6V6h2.5V4.5a.5.5 0 1 1 1 0V6H15v1.6a8 8 0 1 1-6 0Zm-2.6 5.3a.5.5 0 0 0 .3.6c.3 0 .6 0 .6-.3l.1-.2a5 5 0 0 1 3.3-2.8c.3-.1.4-.4.4-.6-.1-.3-.4-.5-.6-.4a6 6 0 0 0-4.1 3.7Z\"/><circle cx=\"14\" cy=\"4\" r=\"1\"/><circle cx=\"12\" cy=\"2\" r=\"1\"/><circle cx=\"10\" cy=\"4\" r=\"1\"/></g></svg>',\n    'text-color': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path class=\"tox-icon-text-color__color\" d=\"M3 18h18v3H3z\"/><path d=\"M8.7 16h-.8a.5.5 0 0 1-.5-.6l2.7-9c.1-.3.3-.4.5-.4h2.8c.2 0 .4.1.5.4l2.7 9a.5.5 0 0 1-.5.6h-.8a.5.5 0 0 1-.4-.4l-.7-2.2c0-.3-.3-.4-.5-.4h-3.4c-.2 0-.4.1-.5.4l-.7 2.2c0 .3-.2.4-.4.4Zm2.6-7.6-.6 2a.5.5 0 0 0 .5.6h1.6a.5.5 0 0 0 .5-.6l-.6-2c0-.3-.3-.4-.5-.4h-.4c-.2 0-.4.1-.5.4Z\"/></g></svg>',\n    'text-size-decrease': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M14 5a1 1 0 1 1 0 2h-4v11a1 1 0 1 1-2 0V7H4a1 1 0 0 1 0-2h10ZM14 12a1 1 0 1 0 0 2h6a1 1 0 1 0 0-2h-6Z\"/></svg>',\n    'text-size-increase': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M14 5a1 1 0 1 1 0 2h-4v11a1 1 0 1 1-2 0V7H4a1 1 0 0 1 0-2h10ZM17 9a1 1 0 0 0-1 1v2h-2a1 1 0 1 0 0 2h2v2a1 1 0 1 0 2 0v-2h2a1 1 0 1 0 0-2h-2v-2c0-.6-.4-1-1-1Z\"/></svg>',\n    'toc': '<svg width=\"24\" height=\"24\"><path d=\"M5 5c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 1 1 0-2Zm3 0h11c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 1 1 0-2Zm-3 8c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 0 1 0-2Zm3 0h11c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 0 1 0-2Zm0-4c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 1 1 0-2Zm3 0h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Zm-3 8c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 0 1 0-2Zm3 0h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Z\" fill-rule=\"evenodd\"/></svg>',\n    'translate': '<svg width=\"24\" height=\"24\"><path d=\"m12.7 14.3-.3.7-.4.7-2.2-2.2-3.1 3c-.3.4-.8.4-1 0a.7.7 0 0 1 0-1l3.1-3A12.4 12.4 0 0 1 6.7 9H8a10.1 10.1 0 0 0 1.7 2.4c.5-.5 1-1.1 1.4-1.8l.9-2H4.7a.7.7 0 1 1 0-1.5h4.4v-.7c0-.4.3-.8.7-.8.4 0 .7.4.7.8v.7H15c.4 0 .8.3.8.7 0 .4-.4.8-.8.8h-1.4a12.3 12.3 0 0 1-1 2.4 13.5 13.5 0 0 1-1.7 2.3l1.9 1.8Zm4.3-3 2.7 7.3a.5.5 0 0 1-.4.7 1 1 0 0 1-1-.7l-.6-1.5h-3.4l-.6 1.5a1 1 0 0 1-1 .7.5.5 0 0 1-.4-.7l2.7-7.4a1 1 0 0 1 2 0Zm-2.2 4.4h2.4L16 12.5l-1.2 3.2Z\" fill-rule=\"evenodd\"/></svg>',\n    'typography': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M17 5a1 1 0 1 1 0 2h-4v11a1 1 0 1 1-2 0V7H7a1 1 0 0 1 0-2h10Z\"/><path d=\"m17.5 14 .8-1.7 1.7-.8-1.7-.8-.8-1.7-.8 1.7-1.7.8 1.7.8.8 1.7ZM7 14l1 2 2 1-2 1-1 2-1-2-2-1 2-1 1-2Z\"/></svg>',\n    'underline': '<svg width=\"24\" height=\"24\"><path d=\"M16 5c.6 0 1 .4 1 1v5.5a4 4 0 0 1-.4 1.8l-1 1.4a5.3 5.3 0 0 1-5.5 1 5 5 0 0 1-1.6-1c-.5-.4-.8-.9-1.1-1.4a4 4 0 0 1-.4-1.8V6c0-.6.4-1 1-1s1 .4 1 1v5.5c0 .3 0 .6.2 1l.6.7a3.3 3.3 0 0 0 2.2.8 3.4 3.4 0 0 0 2.2-.8c.3-.2.4-.5.6-.8l.2-.9V6c0-.6.4-1 1-1ZM8 17h8c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 0 1 0-2Z\" fill-rule=\"evenodd\"/></svg>',\n    'undo': '<svg width=\"24\" height=\"24\"><path d=\"M6.4 8H12c3.7 0 6.2 2 6.8 5.1.6 2.7-.4 5.6-2.3 6.8a1 1 0 0 1-1-1.8c1.1-.6 1.8-2.7 1.4-4.6-.5-2.1-2.1-3.5-4.9-3.5H6.4l3.3 3.3a1 1 0 1 1-1.4 1.4l-5-5a1 1 0 0 1 0-1.4l5-5a1 1 0 0 1 1.4 1.4L6.4 8Z\" fill-rule=\"nonzero\"/></svg>',\n    'unlink': '<svg width=\"24\" height=\"24\"><path d=\"M6.2 12.3a1 1 0 0 1 1.4 1.4l-2 2a2 2 0 1 0 2.6 2.8l4.8-4.8a1 1 0 0 0 0-1.4 1 1 0 1 1 1.4-1.3 2.9 2.9 0 0 1 0 4L9.6 20a3.9 3.9 0 0 1-5.5-5.5l2-2Zm11.6-.6a1 1 0 0 1-1.4-1.4l2.1-2a2 2 0 1 0-2.7-2.8L11 10.3a1 1 0 0 0 0 1.4A1 1 0 1 1 9.6 13a2.9 2.9 0 0 1 0-4L14.4 4a3.9 3.9 0 0 1 5.5 5.5l-2 2ZM7.6 6.3a.8.8 0 0 1-1 1.1L3.3 4.2a.7.7 0 1 1 1-1l3.2 3.1ZM5.1 8.6a.8.8 0 0 1 0 1.5H3a.8.8 0 0 1 0-1.5H5Zm5-3.5a.8.8 0 0 1-1.5 0V3a.8.8 0 0 1 1.5 0V5Zm6 11.8a.8.8 0 0 1 1-1l3.2 3.2a.8.8 0 0 1-1 1L16 17Zm-2.2 2a.8.8 0 0 1 1.5 0V21a.8.8 0 0 1-1.5 0V19Zm5-3.5a.7.7 0 1 1 0-1.5H21a.8.8 0 0 1 0 1.5H19Z\" fill-rule=\"nonzero\"/></svg>',\n    'unlock': '<svg width=\"24\" height=\"24\"><path d=\"M16 5c.8 0 1.5.3 2.1.9.6.6.9 1.3.9 2.1v3h-2V8a1 1 0 0 0-.3-.7A1 1 0 0 0 16 7h-2a1 1 0 0 0-.7.3 1 1 0 0 0-.3.7v3h.3c.2 0 .3 0 .5.2l.2.6v7.4c0 .3 0 .4-.2.6l-.6.2H4.8c-.3 0-.4 0-.6-.2a.7.7 0 0 1-.2-.6v-7.4c0-.3 0-.4.2-.6l.5-.2H11V8c0-.8.3-1.5.9-2.1.6-.6 1.3-.9 2.1-.9h2Z\" fill-rule=\"evenodd\"/></svg>',\n    'unordered-list': '<svg width=\"24\" height=\"24\"><path d=\"M11 5h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Zm0 6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Zm0 6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2ZM4.5 6c0-.4.1-.8.4-1 .3-.4.7-.5 1.1-.5.4 0 .8.1 1 .4.4.3.5.7.5 1.1 0 .4-.1.8-.4 1-.3.4-.7.5-1.1.5-.4 0-.8-.1-1-.4-.4-.3-.5-.7-.5-1.1Zm0 6c0-.4.1-.8.4-1 .3-.4.7-.5 1.1-.5.4 0 .8.1 1 .4.4.3.5.7.5 1.1 0 .4-.1.8-.4 1-.3.4-.7.5-1.1.5-.4 0-.8-.1-1-.4-.4-.3-.5-.7-.5-1.1Zm0 6c0-.4.1-.8.4-1 .3-.4.7-.5 1.1-.5.4 0 .8.1 1 .4.4.3.5.7.5 1.1 0 .4-.1.8-.4 1-.3.4-.7.5-1.1.5-.4 0-.8-.1-1-.4-.4-.3-.5-.7-.5-1.1Z\" fill-rule=\"evenodd\"/></svg>',\n    'unselected': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M6 4h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2Zm0 1a1 1 0 0 0-1 1v12c0 .6.4 1 1 1h12c.6 0 1-.4 1-1V6c0-.6-.4-1-1-1H6Z\"/></svg>',\n    'upload': '<svg width=\"24\" height=\"24\"><path d=\"M18 19v-2a1 1 0 0 1 2 0v3c0 .6-.4 1-1 1H5a1 1 0 0 1-1-1v-3a1 1 0 0 1 2 0v2h12ZM11 6.4 8.7 8.7a1 1 0 0 1-1.4-1.4l4-4a1 1 0 0 1 1.4 0l4 4a1 1 0 1 1-1.4 1.4L13 6.4V16a1 1 0 0 1-2 0V6.4Z\" fill-rule=\"nonzero\"/></svg>',\n    'user': '<svg width=\"24\" height=\"24\"><path d=\"M12 24a12 12 0 1 1 0-24 12 12 0 0 1 0 24Zm-8.7-5.3a11 11 0 0 0 17.4 0C19.4 16.3 14.6 15 12 15c-2.6 0-7.4 1.3-8.7 3.7ZM12 13c2.2 0 4-2 4-4.5S14.2 4 12 4 8 6 8 8.5 9.8 13 12 13Z\" fill-rule=\"nonzero\"/></svg>',\n    'vertical-align': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><rect width=\"18\" height=\"2\" x=\"3\" y=\"11\" rx=\"1\"/><path d=\"M12 2c.6 0 1 .4 1 1v4l2-1.3a1 1 0 0 1 1.2 1.5l-.1.1-4.1 3-4-3a1 1 0 0 1 1-1.7l2 1.5V3c0-.6.4-1 1-1zm0 11.8 4 2.9a1 1 0 0 1-1 1.7l-2-1.5V21c0 .5-.4 1-.9 1H12a1 1 0 0 1-1-1v-4l-2 1.3a1 1 0 0 1-1.2-.1l-.1-.1a1 1 0 0 1 .1-1.3l.1-.1 4.1-3z\"/></g></svg>',\n    'visualblocks': '<svg width=\"24\" height=\"24\"><path d=\"M9 19v2H7v-2h2Zm-4 0v2a2 2 0 0 1-2-2h2Zm8 0v2h-2v-2h2Zm8 0a2 2 0 0 1-2 2v-2h2Zm-4 0v2h-2v-2h2ZM15 7a1 1 0 0 1 0 2v7a1 1 0 0 1-2 0V9h-1v7a1 1 0 0 1-2 0v-4a2.5 2.5 0 0 1-.2-5H15ZM5 15v2H3v-2h2Zm16 0v2h-2v-2h2ZM5 11v2H3v-2h2Zm16 0v2h-2v-2h2ZM5 7v2H3V7h2Zm16 0v2h-2V7h2ZM5 3v2H3c0-1.1.9-2 2-2Zm8 0v2h-2V3h2Zm6 0a2 2 0 0 1 2 2h-2V3ZM9 3v2H7V3h2Zm8 0v2h-2V3h2Z\" fill-rule=\"evenodd\"/></svg>',\n    'visualchars': '<svg width=\"24\" height=\"24\"><path d=\"M10 5h7a1 1 0 0 1 0 2h-1v11a1 1 0 0 1-2 0V7h-2v11a1 1 0 0 1-2 0v-6c-.5 0-1 0-1.4-.3A3.4 3.4 0 0 1 6.8 10a3.3 3.3 0 0 1 0-2.8 3.4 3.4 0 0 1 1.8-1.8L10 5Z\" fill-rule=\"evenodd\"/></svg>',\n    'warning': '<svg width=\"24\" height=\"24\"><path d=\"M19.8 18.3c.2.5.3.9 0 1.2-.1.3-.5.5-1 .5H5.2c-.5 0-.9-.2-1-.5-.3-.3-.2-.7 0-1.2L11 4.7l.5-.5.5-.2c.2 0 .3 0 .5.2.2 0 .3.3.5.5l6.8 13.6ZM12 18c.3 0 .5-.1.7-.3.2-.2.3-.4.3-.7a1 1 0 0 0-.3-.7 1 1 0 0 0-.7-.3 1 1 0 0 0-.7.3 1 1 0 0 0-.3.7c0 .3.1.5.3.7.2.2.4.3.7.3Zm.7-3 .3-4a1 1 0 0 0-.3-.7 1 1 0 0 0-.7-.3 1 1 0 0 0-.7.3 1 1 0 0 0-.3.7l.3 4h1.4Z\" fill-rule=\"evenodd\"/></svg>',\n    'zoom-in': '<svg width=\"24\" height=\"24\"><path d=\"M16 17.3a8 8 0 1 1 1.4-1.4l4.3 4.4a1 1 0 0 1-1.4 1.4l-4.4-4.3Zm-5-.3a6 6 0 1 0 0-12 6 6 0 0 0 0 12Zm-1-9a1 1 0 0 1 2 0v6a1 1 0 0 1-2 0V8Zm-2 4a1 1 0 0 1 0-2h6a1 1 0 0 1 0 2H8Z\" fill-rule=\"nonzero\"/></svg>',\n    'zoom-out': '<svg width=\"24\" height=\"24\"><path d=\"M16 17.3a8 8 0 1 1 1.4-1.4l4.3 4.4a1 1 0 0 1-1.4 1.4l-4.4-4.3Zm-5-.3a6 6 0 1 0 0-12 6 6 0 0 0 0 12Zm-3-5a1 1 0 0 1 0-2h6a1 1 0 0 1 0 2H8Z\" fill-rule=\"nonzero\"/></svg>',\n    'export-pdf': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7 3h7.4L19 7.6V17h-2V9h-4V5H7v3H5V5c0-1.1.9-2 2-2Z\"/><path d=\"M2.6 15.2v-1.9h1c.6 0 1-.2 1.4-.5.3-.3.5-.7.5-1.2s-.2-.9-.5-1.2a2 2 0 0 0-1.3-.4H1v5.2h1.6Zm.4-3h-.4v-1.1h.5l.6.1.2.5c0 .1 0 .3-.2.4l-.7.1Zm5.7 3 1-.1c.3 0 .5-.2.7-.4l.5-.8c.2-.3.2-.7.2-1.3v-1l-.5-.8c-.2-.3-.4-.5-.7-.6L8.7 10H6.3v5.2h2.4Zm-.4-1.1H8v-3h.4c.5 0 .8.2 1 .4l.2 1.1-.1 1-.3.3-.8.2Zm5.3 1.2V13h2v-1h-2v-1H16V10h-4v5.2h1.6Z\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15 17a1 1 0 1 0-2 0v3.1l-1.4-1a1 1 0 1 0-1.2 1.7l3.6 2.4 3.6-2.4a1 1 0 0 0-1.2-1.6l-1.4 1V17Z\"/></svg>',\n    'export-word': '<svg width=\"24\" height=\"24\"><path d=\"M9.5 7A1.5 1.5 0 0 1 11 8.4v7.1A1.5 1.5 0 0 1 9.6 17H2.5A1.5 1.5 0 0 1 1 15.6V8.5A1.5 1.5 0 0 1 2.4 7h7.1Zm-1 2.8-1 2.6-1-2.5v-.1a.6.6 0 0 0-1 0l-.1.1-.9 2.5-1-2.5v-.1a.6.6 0 0 0-1 .4v.1l1.5 4v.1a.6.6 0 0 0 1 0v-.1l1-2.5.9 2.5v.1a.6.6 0 0 0 1 0H8l1.6-4v-.2a.6.6 0 0 0-1.1-.4Z\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7 3h7.4L19 7.6V17h-2V9h-4V5H5c0-1.1.9-2 2-2ZM15 17a1 1 0 1 0-2 0v3.1l-1.4-1a1 1 0 1 0-1.2 1.7l3.6 2.4 3.6-2.4a1 1 0 0 0-1.2-1.6l-1.4 1V17Z\"/></svg>',\n    'import-word': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7 3h7.4L19 7.6V15h-2V9h-4V5H5c0-1.1.9-2 2-2Z\"/><path d=\"M9.5 7A1.5 1.5 0 0 1 11 8.4v7.1A1.5 1.5 0 0 1 9.6 17H2.5A1.5 1.5 0 0 1 1 15.6V8.5A1.5 1.5 0 0 1 2.4 7h7.1Zm-1 2.8-1 2.6-1-2.5v-.1a.6.6 0 0 0-1 0l-.1.1-.9 2.5-1-2.5v-.1a.6.6 0 0 0-1 .4v.1l1.5 4v.1a.6.6 0 0 0 1 0v-.1l1-2.5.9 2.5v.1a.6.6 0 0 0 1 0H8l1.6-4v-.2a.6.6 0 0 0-1.1-.4Z\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.4 18.2a1 1 0 0 0 1.2 1.6l1.4-1V22a1 1 0 1 0 2 0v-3.1l1.4 1a1 1 0 0 0 1.2-1.7L15 15.8l-3.6 2.4Z\"/></svg>',\n  }\n});","// Exports the \"default\" icons for usage with module loaders\n// Usage:\n//   CommonJS:\n//     require('hugerte/icons/default')\n//   ES2015:\n//     import 'hugerte/icons/default'\nrequire('./icons.js');","import \"bootstrap-datepicker\";\nimport \"bootstrap-datepicker/dist/locales/bootstrap-datepicker.et.min.js\";\n\nconst datePickerOptions = {\n  clearBtn: true,\n  weekStart: 1,\n  maxViewMode: 2,\n  autoclose: true,\n  language: \"et\",\n  todayHighlight: true,\n  keyboardNavigation: false,\n  orientation: \"bottom\",\n  forceParse: false,\n  format: {\n    toDisplay: function (date) {\n      return DayJS(date).format(\"DD.MM.YYYY\");\n    },\n    toValue: function (date) {\n      return date;\n    }\n  }\n};\n\n$.extend($.fn.datepicker.defaults, datePickerOptions);\n\nwindow.initDatepicker = function () {\n  document.querySelectorAll('[data-behaviour=\"datepicker\"]').forEach(el => {\n    if (el.parentElement.querySelector(\"input[data-is-server-input]\")) {\n      return; // If found, then it means it still has retained it and its just turbo:submit-end triggerig initDatepicker again\n    }\n\n    el.autocomplete = \"off\";\n    let dateValue = DayJS(el.value, [\"YYYY-MM-DD\", \"DD.MM.YYYY\"]);\n\n    function setDate(inputEl, date) {\n      if (!date || date == \"\") {\n        inputEl.value = null;\n        return true;\n      } else {\n        let dateValue =\n          date.constructor.name == \"Date\"\n            ? DayJS(date)\n            : DayJS(date, [\"YYYY-MM-DD\", \"DD.MM.YYYY\"], true);\n        if (dateValue.isValid()) {\n          inputEl.value = dateValue.format(\"YYYY-MM-DD\");\n        }\n        return dateValue.isValid();\n      }\n    }\n\n    let serverField = el.parentNode.querySelector(`input[type=\"hidden\"]`);\n    //if (serverField) return; // If element exists, then no need to create nor update input\n\n    // Create seperate input where to store ISO date for the server\n    serverField = document.createElement(\"input\");\n    serverField.type = \"hidden\";\n    serverField.name = el.name;\n    serverField.setAttribute(\"data-is-server-input\", \"true\");\n\n    if (Object.entries(el.dataset).length) {\n      // Move (except behaviour) datasets to the new field\n      Object.entries(el.dataset).forEach(([dataKey, dataVal]) => {\n        if (dataKey == \"behaviour\") return;\n        serverField.dataset[dataKey] = dataVal;\n        delete el.dataset[dataKey];\n      });\n    }\n\n    if (el.form) {\n      serverField.addEventListener(\"input\", () => {\n        el.form.dispatchEvent(new Event(\"change\"));\n      });\n    }\n\n    setDate(serverField, dateValue);\n\n    el.insertAdjacentElement(\"afterend\", serverField);\n    el.removeAttribute(\"name\");\n\n    let startDate = undefined;\n    let endDate = undefined;\n\n    if (serverField.dataset.dateStartDate) {\n      startDate = serverField.dataset.dateStartDate;\n    }\n    if (serverField.dataset.dateEndDate) {\n      endDate = serverField.dataset.dateEndDate;\n    }\n\n    $(el)\n      .datepicker({\n        startDate,\n        endDate\n      })\n      .on(\"changeDate\", ({ date }) => {\n        if (setDate(serverField, date)) {\n          serverField.dispatchEvent(new Event(\"input\"));\n        }\n      })\n      .on(\"input\", ({ target }) => {\n        if (setDate(serverField, target.value)) {\n          serverField.dispatchEvent(new Event(\"input\"));\n        }\n      });\n\n    if (dateValue.isValid()) {\n      $(el).datepicker(\"update\", dateValue.toDate());\n    }\n\n    window.addEventListener(\n      \"turbo:before-cache\",\n      () => {\n        el.name = serverField.name;\n        serverField.remove();\n      },\n      { once: true }\n    );\n  });\n};\n","// Exports the \"link\" plugin for usage with module loaders\n// Usage:\n//   CommonJS:\n//     require('hugerte/plugins/link')\n//   ES2015:\n//     import 'hugerte/plugins/link'\nrequire('./plugin.js');","/**\n * HugeRTE version 1.0.8 (2025-03-11)\n * Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc.\n * Copyright (c) 2024 HugeRTE contributors\n * Licensed under the MIT license (https://github.com/hugerte/hugerte/blob/main/LICENSE.TXT)\n */\n\n/**\n * This file bundles the code of DOMPurify, which is dual-licensed under the Mozilla Public License v2.0 and the Apache License, Version 2.0, meaning you can use it under either one of those licenses.\n * Copyright 2024 Dr.-Ing. Mario Heiderich, Cure53 and other contributors\n * https://github.com/cure53/DOMPurify/blob/main/LICENSE\n * The code of DOMPurify included in this file has been modified. The latest original code of DOMPurify can be found at https://github.com/cure53/DOMPurify.\n */\n\n(function () {\n    'use strict';\n\n    var typeOf$1 = function (x) {\n      if (x === null) {\n        return 'null';\n      }\n      if (x === undefined) {\n        return 'undefined';\n      }\n      var t = typeof x;\n      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n        return 'array';\n      }\n      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n        return 'string';\n      }\n      return t;\n    };\n    var isEquatableType = function (x) {\n      return [\n        'undefined',\n        'boolean',\n        'number',\n        'string',\n        'function',\n        'xml',\n        'null'\n      ].indexOf(x) !== -1;\n    };\n\n    var sort$1 = function (xs, compareFn) {\n      var clone = Array.prototype.slice.call(xs);\n      return clone.sort(compareFn);\n    };\n\n    var contramap = function (eqa, f) {\n      return eq$2(function (x, y) {\n        return eqa.eq(f(x), f(y));\n      });\n    };\n    var eq$2 = function (f) {\n      return { eq: f };\n    };\n    var tripleEq = eq$2(function (x, y) {\n      return x === y;\n    });\n    var eqString = tripleEq;\n    var eqArray = function (eqa) {\n      return eq$2(function (x, y) {\n        if (x.length !== y.length) {\n          return false;\n        }\n        var len = x.length;\n        for (var i = 0; i < len; i++) {\n          if (!eqa.eq(x[i], y[i])) {\n            return false;\n          }\n        }\n        return true;\n      });\n    };\n    var eqSortedArray = function (eqa, compareFn) {\n      return contramap(eqArray(eqa), function (xs) {\n        return sort$1(xs, compareFn);\n      });\n    };\n    var eqRecord = function (eqa) {\n      return eq$2(function (x, y) {\n        var kx = Object.keys(x);\n        var ky = Object.keys(y);\n        if (!eqSortedArray(eqString).eq(kx, ky)) {\n          return false;\n        }\n        var len = kx.length;\n        for (var i = 0; i < len; i++) {\n          var q = kx[i];\n          if (!eqa.eq(x[q], y[q])) {\n            return false;\n          }\n        }\n        return true;\n      });\n    };\n    var eqAny = eq$2(function (x, y) {\n      if (x === y) {\n        return true;\n      }\n      var tx = typeOf$1(x);\n      var ty = typeOf$1(y);\n      if (tx !== ty) {\n        return false;\n      }\n      if (isEquatableType(tx)) {\n        return x === y;\n      } else if (tx === 'array') {\n        return eqArray(eqAny).eq(x, y);\n      } else if (tx === 'object') {\n        return eqRecord(eqAny).eq(x, y);\n      }\n      return false;\n    });\n\n    const getPrototypeOf$2 = Object.getPrototypeOf;\n    const hasProto = (v, constructor, predicate) => {\n      var _a;\n      if (predicate(v, constructor.prototype)) {\n        return true;\n      } else {\n        return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;\n      }\n    };\n    const typeOf = x => {\n      const t = typeof x;\n      if (x === null) {\n        return 'null';\n      } else if (t === 'object' && Array.isArray(x)) {\n        return 'array';\n      } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {\n        return 'string';\n      } else {\n        return t;\n      }\n    };\n    const isType$1 = type => value => typeOf(value) === type;\n    const isSimpleType = type => value => typeof value === type;\n    const eq$1 = t => a => t === a;\n    const is$4 = (value, constructor) => isObject(value) && hasProto(value, constructor, (o, proto) => getPrototypeOf$2(o) === proto);\n    const isString = isType$1('string');\n    const isObject = isType$1('object');\n    const isPlainObject = value => is$4(value, Object);\n    const isArray$1 = isType$1('array');\n    const isNull = eq$1(null);\n    const isBoolean = isSimpleType('boolean');\n    const isUndefined = eq$1(undefined);\n    const isNullable = a => a === null || a === undefined;\n    const isNonNullable = a => !isNullable(a);\n    const isFunction = isSimpleType('function');\n    const isNumber = isSimpleType('number');\n    const isArrayOf = (value, pred) => {\n      if (isArray$1(value)) {\n        for (let i = 0, len = value.length; i < len; ++i) {\n          if (!pred(value[i])) {\n            return false;\n          }\n        }\n        return true;\n      }\n      return false;\n    };\n\n    const noop = () => {\n    };\n    const compose = (fa, fb) => {\n      return (...args) => {\n        return fa(fb.apply(null, args));\n      };\n    };\n    const compose1 = (fbc, fab) => a => fbc(fab(a));\n    const constant = value => {\n      return () => {\n        return value;\n      };\n    };\n    const identity = x => {\n      return x;\n    };\n    const tripleEquals = (a, b) => {\n      return a === b;\n    };\n    function curry(fn, ...initialArgs) {\n      return (...restArgs) => {\n        const all = initialArgs.concat(restArgs);\n        return fn.apply(null, all);\n      };\n    }\n    const not = f => t => !f(t);\n    const die = msg => {\n      return () => {\n        throw new Error(msg);\n      };\n    };\n    const apply$1 = f => {\n      return f();\n    };\n    const call = f => {\n      f();\n    };\n    const never = constant(false);\n    const always = constant(true);\n\n    class Optional {\n      constructor(tag, value) {\n        this.tag = tag;\n        this.value = value;\n      }\n      static some(value) {\n        return new Optional(true, value);\n      }\n      static none() {\n        return Optional.singletonNone;\n      }\n      fold(onNone, onSome) {\n        if (this.tag) {\n          return onSome(this.value);\n        } else {\n          return onNone();\n        }\n      }\n      isSome() {\n        return this.tag;\n      }\n      isNone() {\n        return !this.tag;\n      }\n      map(mapper) {\n        if (this.tag) {\n          return Optional.some(mapper(this.value));\n        } else {\n          return Optional.none();\n        }\n      }\n      bind(binder) {\n        if (this.tag) {\n          return binder(this.value);\n        } else {\n          return Optional.none();\n        }\n      }\n      exists(predicate) {\n        return this.tag && predicate(this.value);\n      }\n      forall(predicate) {\n        return !this.tag || predicate(this.value);\n      }\n      filter(predicate) {\n        if (!this.tag || predicate(this.value)) {\n          return this;\n        } else {\n          return Optional.none();\n        }\n      }\n      getOr(replacement) {\n        return this.tag ? this.value : replacement;\n      }\n      or(replacement) {\n        return this.tag ? this : replacement;\n      }\n      getOrThunk(thunk) {\n        return this.tag ? this.value : thunk();\n      }\n      orThunk(thunk) {\n        return this.tag ? this : thunk();\n      }\n      getOrDie(message) {\n        if (!this.tag) {\n          throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');\n        } else {\n          return this.value;\n        }\n      }\n      static from(value) {\n        return isNonNullable(value) ? Optional.some(value) : Optional.none();\n      }\n      getOrNull() {\n        return this.tag ? this.value : null;\n      }\n      getOrUndefined() {\n        return this.value;\n      }\n      each(worker) {\n        if (this.tag) {\n          worker(this.value);\n        }\n      }\n      toArray() {\n        return this.tag ? [this.value] : [];\n      }\n      toString() {\n        return this.tag ? `some(${ this.value })` : 'none()';\n      }\n    }\n    Optional.singletonNone = new Optional(false);\n\n    const nativeSlice = Array.prototype.slice;\n    const nativeIndexOf = Array.prototype.indexOf;\n    const nativePush = Array.prototype.push;\n    const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t);\n    const indexOf$1 = (xs, x) => {\n      const r = rawIndexOf(xs, x);\n      return r === -1 ? Optional.none() : Optional.some(r);\n    };\n    const contains$2 = (xs, x) => rawIndexOf(xs, x) > -1;\n    const exists = (xs, pred) => {\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        if (pred(x, i)) {\n          return true;\n        }\n      }\n      return false;\n    };\n    const map$3 = (xs, f) => {\n      const len = xs.length;\n      const r = new Array(len);\n      for (let i = 0; i < len; i++) {\n        const x = xs[i];\n        r[i] = f(x, i);\n      }\n      return r;\n    };\n    const each$e = (xs, f) => {\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        f(x, i);\n      }\n    };\n    const eachr = (xs, f) => {\n      for (let i = xs.length - 1; i >= 0; i--) {\n        const x = xs[i];\n        f(x, i);\n      }\n    };\n    const partition$2 = (xs, pred) => {\n      const pass = [];\n      const fail = [];\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        const arr = pred(x, i) ? pass : fail;\n        arr.push(x);\n      }\n      return {\n        pass,\n        fail\n      };\n    };\n    const filter$5 = (xs, pred) => {\n      const r = [];\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        if (pred(x, i)) {\n          r.push(x);\n        }\n      }\n      return r;\n    };\n    const foldr = (xs, f, acc) => {\n      eachr(xs, (x, i) => {\n        acc = f(acc, x, i);\n      });\n      return acc;\n    };\n    const foldl = (xs, f, acc) => {\n      each$e(xs, (x, i) => {\n        acc = f(acc, x, i);\n      });\n      return acc;\n    };\n    const findUntil$1 = (xs, pred, until) => {\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        if (pred(x, i)) {\n          return Optional.some(x);\n        } else if (until(x, i)) {\n          break;\n        }\n      }\n      return Optional.none();\n    };\n    const find$2 = (xs, pred) => {\n      return findUntil$1(xs, pred, never);\n    };\n    const findIndex$2 = (xs, pred) => {\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        if (pred(x, i)) {\n          return Optional.some(i);\n        }\n      }\n      return Optional.none();\n    };\n    const flatten = xs => {\n      const r = [];\n      for (let i = 0, len = xs.length; i < len; ++i) {\n        if (!isArray$1(xs[i])) {\n          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);\n        }\n        nativePush.apply(r, xs[i]);\n      }\n      return r;\n    };\n    const bind$3 = (xs, f) => flatten(map$3(xs, f));\n    const forall = (xs, pred) => {\n      for (let i = 0, len = xs.length; i < len; ++i) {\n        const x = xs[i];\n        if (pred(x, i) !== true) {\n          return false;\n        }\n      }\n      return true;\n    };\n    const reverse = xs => {\n      const r = nativeSlice.call(xs, 0);\n      r.reverse();\n      return r;\n    };\n    const difference = (a1, a2) => filter$5(a1, x => !contains$2(a2, x));\n    const mapToObject = (xs, f) => {\n      const r = {};\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        r[String(x)] = f(x, i);\n      }\n      return r;\n    };\n    const sort = (xs, comparator) => {\n      const copy = nativeSlice.call(xs, 0);\n      copy.sort(comparator);\n      return copy;\n    };\n    const get$b = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();\n    const head = xs => get$b(xs, 0);\n    const last$2 = xs => get$b(xs, xs.length - 1);\n    const from = isFunction(Array.from) ? Array.from : x => nativeSlice.call(x);\n    const findMap = (arr, f) => {\n      for (let i = 0; i < arr.length; i++) {\n        const r = f(arr[i], i);\n        if (r.isSome()) {\n          return r;\n        }\n      }\n      return Optional.none();\n    };\n    const unique$1 = (xs, comparator) => {\n      const r = [];\n      const isDuplicated = isFunction(comparator) ? x => exists(r, i => comparator(i, x)) : x => contains$2(r, x);\n      for (let i = 0, len = xs.length; i < len; i++) {\n        const x = xs[i];\n        if (!isDuplicated(x)) {\n          r.push(x);\n        }\n      }\n      return r;\n    };\n\n    const keys = Object.keys;\n    const hasOwnProperty$1 = Object.hasOwnProperty;\n    const each$d = (obj, f) => {\n      const props = keys(obj);\n      for (let k = 0, len = props.length; k < len; k++) {\n        const i = props[k];\n        const x = obj[i];\n        f(x, i);\n      }\n    };\n    const map$2 = (obj, f) => {\n      return tupleMap(obj, (x, i) => ({\n        k: i,\n        v: f(x, i)\n      }));\n    };\n    const tupleMap = (obj, f) => {\n      const r = {};\n      each$d(obj, (x, i) => {\n        const tuple = f(x, i);\n        r[tuple.k] = tuple.v;\n      });\n      return r;\n    };\n    const objAcc = r => (x, i) => {\n      r[i] = x;\n    };\n    const internalFilter = (obj, pred, onTrue, onFalse) => {\n      each$d(obj, (x, i) => {\n        (pred(x, i) ? onTrue : onFalse)(x, i);\n      });\n    };\n    const bifilter = (obj, pred) => {\n      const t = {};\n      const f = {};\n      internalFilter(obj, pred, objAcc(t), objAcc(f));\n      return {\n        t,\n        f\n      };\n    };\n    const filter$4 = (obj, pred) => {\n      const t = {};\n      internalFilter(obj, pred, objAcc(t), noop);\n      return t;\n    };\n    const mapToArray = (obj, f) => {\n      const r = [];\n      each$d(obj, (value, name) => {\n        r.push(f(value, name));\n      });\n      return r;\n    };\n    const values = obj => {\n      return mapToArray(obj, identity);\n    };\n    const get$a = (obj, key) => {\n      return has$2(obj, key) ? Optional.from(obj[key]) : Optional.none();\n    };\n    const has$2 = (obj, key) => hasOwnProperty$1.call(obj, key);\n    const hasNonNullableKey = (obj, key) => has$2(obj, key) && obj[key] !== undefined && obj[key] !== null;\n    const equal$1 = (a1, a2, eq = eqAny) => eqRecord(eq).eq(a1, a2);\n\n    const stringArray = a => {\n      const all = {};\n      each$e(a, key => {\n        all[key] = {};\n      });\n      return keys(all);\n    };\n\n    const isArrayLike = o => o.length !== undefined;\n    const isArray = Array.isArray;\n    const toArray$1 = obj => {\n      if (!isArray(obj)) {\n        const array = [];\n        for (let i = 0, l = obj.length; i < l; i++) {\n          array[i] = obj[i];\n        }\n        return array;\n      } else {\n        return obj;\n      }\n    };\n    const each$c = (o, cb, s) => {\n      if (!o) {\n        return false;\n      }\n      s = s || o;\n      if (isArrayLike(o)) {\n        for (let n = 0, l = o.length; n < l; n++) {\n          if (cb.call(s, o[n], n, o) === false) {\n            return false;\n          }\n        }\n      } else {\n        for (const n in o) {\n          if (has$2(o, n)) {\n            if (cb.call(s, o[n], n, o) === false) {\n              return false;\n            }\n          }\n        }\n      }\n      return true;\n    };\n    const map$1 = (array, callback) => {\n      const out = [];\n      each$c(array, (item, index) => {\n        out.push(callback(item, index, array));\n      });\n      return out;\n    };\n    const filter$3 = (a, f) => {\n      const o = [];\n      each$c(a, (v, index) => {\n        if (!f || f(v, index, a)) {\n          o.push(v);\n        }\n      });\n      return o;\n    };\n    const indexOf = (a, v) => {\n      if (a) {\n        for (let i = 0, l = a.length; i < l; i++) {\n          if (a[i] === v) {\n            return i;\n          }\n        }\n      }\n      return -1;\n    };\n    const reduce = (collection, iteratee, accumulator, thisArg) => {\n      let acc = isUndefined(accumulator) ? collection[0] : accumulator;\n      for (let i = 0; i < collection.length; i++) {\n        acc = iteratee.call(thisArg, acc, collection[i], i);\n      }\n      return acc;\n    };\n    const findIndex$1 = (array, predicate, thisArg) => {\n      for (let i = 0, l = array.length; i < l; i++) {\n        if (predicate.call(thisArg, array[i], i, array)) {\n          return i;\n        }\n      }\n      return -1;\n    };\n    const last$1 = collection => collection[collection.length - 1];\n\n    const cached = f => {\n      let called = false;\n      let r;\n      return (...args) => {\n        if (!called) {\n          called = true;\n          r = f.apply(null, args);\n        }\n        return r;\n      };\n    };\n\n    const DeviceType = (os, browser, userAgent, mediaMatch) => {\n      const isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;\n      const isiPhone = os.isiOS() && !isiPad;\n      const isMobile = os.isiOS() || os.isAndroid();\n      const isTouch = isMobile || mediaMatch('(pointer:coarse)');\n      const isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');\n      const isPhone = isiPhone || isMobile && !isTablet;\n      const iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;\n      const isDesktop = !isPhone && !isTablet && !iOSwebview;\n      return {\n        isiPad: constant(isiPad),\n        isiPhone: constant(isiPhone),\n        isTablet: constant(isTablet),\n        isPhone: constant(isPhone),\n        isTouch: constant(isTouch),\n        isAndroid: os.isAndroid,\n        isiOS: os.isiOS,\n        isWebView: constant(iOSwebview),\n        isDesktop: constant(isDesktop)\n      };\n    };\n\n    const firstMatch = (regexes, s) => {\n      for (let i = 0; i < regexes.length; i++) {\n        const x = regexes[i];\n        if (x.test(s)) {\n          return x;\n        }\n      }\n      return undefined;\n    };\n    const find$1 = (regexes, agent) => {\n      const r = firstMatch(regexes, agent);\n      if (!r) {\n        return {\n          major: 0,\n          minor: 0\n        };\n      }\n      const group = i => {\n        return Number(agent.replace(r, '$' + i));\n      };\n      return nu$3(group(1), group(2));\n    };\n    const detect$4 = (versionRegexes, agent) => {\n      const cleanedAgent = String(agent).toLowerCase();\n      if (versionRegexes.length === 0) {\n        return unknown$2();\n      }\n      return find$1(versionRegexes, cleanedAgent);\n    };\n    const unknown$2 = () => {\n      return nu$3(0, 0);\n    };\n    const nu$3 = (major, minor) => {\n      return {\n        major,\n        minor\n      };\n    };\n    const Version = {\n      nu: nu$3,\n      detect: detect$4,\n      unknown: unknown$2\n    };\n\n    const detectBrowser$1 = (browsers, userAgentData) => {\n      return findMap(userAgentData.brands, uaBrand => {\n        const lcBrand = uaBrand.brand.toLowerCase();\n        return find$2(browsers, browser => {\n          var _a;\n          return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());\n        }).map(info => ({\n          current: info.name,\n          version: Version.nu(parseInt(uaBrand.version, 10), 0)\n        }));\n      });\n    };\n\n    const detect$3 = (candidates, userAgent) => {\n      const agent = String(userAgent).toLowerCase();\n      return find$2(candidates, candidate => {\n        return candidate.search(agent);\n      });\n    };\n    const detectBrowser = (browsers, userAgent) => {\n      return detect$3(browsers, userAgent).map(browser => {\n        const version = Version.detect(browser.versionRegexes, userAgent);\n        return {\n          current: browser.name,\n          version\n        };\n      });\n    };\n    const detectOs = (oses, userAgent) => {\n      return detect$3(oses, userAgent).map(os => {\n        const version = Version.detect(os.versionRegexes, userAgent);\n        return {\n          current: os.name,\n          version\n        };\n      });\n    };\n\n    const removeFromStart = (str, numChars) => {\n      return str.substring(numChars);\n    };\n\n    const checkRange = (str, substr, start) => substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;\n    const removeLeading = (str, prefix) => {\n      return startsWith(str, prefix) ? removeFromStart(str, prefix.length) : str;\n    };\n    const contains$1 = (str, substr, start = 0, end) => {\n      const idx = str.indexOf(substr, start);\n      if (idx !== -1) {\n        return isUndefined(end) ? true : idx + substr.length <= end;\n      } else {\n        return false;\n      }\n    };\n    const startsWith = (str, prefix) => {\n      return checkRange(str, prefix, 0);\n    };\n    const endsWith = (str, suffix) => {\n      return checkRange(str, suffix, str.length - suffix.length);\n    };\n    const blank = r => s => s.replace(r, '');\n    const trim$4 = blank(/^\\s+|\\s+$/g);\n    const lTrim = blank(/^\\s+/g);\n    const rTrim = blank(/\\s+$/g);\n    const isNotEmpty = s => s.length > 0;\n    const isEmpty$3 = s => !isNotEmpty(s);\n    const repeat = (s, count) => count <= 0 ? '' : new Array(count + 1).join(s);\n    const toInt = (value, radix = 10) => {\n      const num = parseInt(value, radix);\n      return isNaN(num) ? Optional.none() : Optional.some(num);\n    };\n\n    const normalVersionRegex = /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/;\n    const checkContains = target => {\n      return uastring => {\n        return contains$1(uastring, target);\n      };\n    };\n    const browsers = [\n      {\n        name: 'Edge',\n        versionRegexes: [/.*?edge\\/ ?([0-9]+)\\.([0-9]+)$/],\n        search: uastring => {\n          return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit');\n        }\n      },\n      {\n        name: 'Chromium',\n        brand: 'Chromium',\n        versionRegexes: [\n          /.*?chrome\\/([0-9]+)\\.([0-9]+).*/,\n          normalVersionRegex\n        ],\n        search: uastring => {\n          return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe');\n        }\n      },\n      {\n        name: 'IE',\n        versionRegexes: [\n          /.*?msie\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*?rv:([0-9]+)\\.([0-9]+).*/\n        ],\n        search: uastring => {\n          return contains$1(uastring, 'msie') || contains$1(uastring, 'trident');\n        }\n      },\n      {\n        name: 'Opera',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?opera\\/([0-9]+)\\.([0-9]+).*/\n        ],\n        search: checkContains('opera')\n      },\n      {\n        name: 'Firefox',\n        versionRegexes: [/.*?firefox\\/\\ ?([0-9]+)\\.([0-9]+).*/],\n        search: checkContains('firefox')\n      },\n      {\n        name: 'Safari',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?cpu os ([0-9]+)_([0-9]+).*/\n        ],\n        search: uastring => {\n          return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit');\n        }\n      }\n    ];\n    const oses = [\n      {\n        name: 'Windows',\n        search: checkContains('win'),\n        versionRegexes: [/.*?windows\\ nt\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'iOS',\n        search: uastring => {\n          return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad');\n        },\n        versionRegexes: [\n          /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*cpu os ([0-9]+)_([0-9]+).*/,\n          /.*cpu iphone os ([0-9]+)_([0-9]+).*/\n        ]\n      },\n      {\n        name: 'Android',\n        search: checkContains('android'),\n        versionRegexes: [/.*?android\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'macOS',\n        search: checkContains('mac os x'),\n        versionRegexes: [/.*?mac\\ os\\ x\\ ?([0-9]+)_([0-9]+).*/]\n      },\n      {\n        name: 'Linux',\n        search: checkContains('linux'),\n        versionRegexes: []\n      },\n      {\n        name: 'Solaris',\n        search: checkContains('sunos'),\n        versionRegexes: []\n      },\n      {\n        name: 'FreeBSD',\n        search: checkContains('freebsd'),\n        versionRegexes: []\n      },\n      {\n        name: 'ChromeOS',\n        search: checkContains('cros'),\n        versionRegexes: [/.*?chrome\\/([0-9]+)\\.([0-9]+).*/]\n      }\n    ];\n    const PlatformInfo = {\n      browsers: constant(browsers),\n      oses: constant(oses)\n    };\n\n    const edge = 'Edge';\n    const chromium = 'Chromium';\n    const ie = 'IE';\n    const opera = 'Opera';\n    const firefox = 'Firefox';\n    const safari = 'Safari';\n    const unknown$1 = () => {\n      return nu$2({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    const nu$2 = info => {\n      const current = info.current;\n      const version = info.version;\n      const isBrowser = name => () => current === name;\n      return {\n        current,\n        version,\n        isEdge: isBrowser(edge),\n        isChromium: isBrowser(chromium),\n        isIE: isBrowser(ie),\n        isOpera: isBrowser(opera),\n        isFirefox: isBrowser(firefox),\n        isSafari: isBrowser(safari)\n      };\n    };\n    const Browser = {\n      unknown: unknown$1,\n      nu: nu$2,\n      edge: constant(edge),\n      chromium: constant(chromium),\n      ie: constant(ie),\n      opera: constant(opera),\n      firefox: constant(firefox),\n      safari: constant(safari)\n    };\n\n    const windows = 'Windows';\n    const ios = 'iOS';\n    const android = 'Android';\n    const linux = 'Linux';\n    const macos = 'macOS';\n    const solaris = 'Solaris';\n    const freebsd = 'FreeBSD';\n    const chromeos = 'ChromeOS';\n    const unknown = () => {\n      return nu$1({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    const nu$1 = info => {\n      const current = info.current;\n      const version = info.version;\n      const isOS = name => () => current === name;\n      return {\n        current,\n        version,\n        isWindows: isOS(windows),\n        isiOS: isOS(ios),\n        isAndroid: isOS(android),\n        isMacOS: isOS(macos),\n        isLinux: isOS(linux),\n        isSolaris: isOS(solaris),\n        isFreeBSD: isOS(freebsd),\n        isChromeOS: isOS(chromeos)\n      };\n    };\n    const OperatingSystem = {\n      unknown,\n      nu: nu$1,\n      windows: constant(windows),\n      ios: constant(ios),\n      android: constant(android),\n      linux: constant(linux),\n      macos: constant(macos),\n      solaris: constant(solaris),\n      freebsd: constant(freebsd),\n      chromeos: constant(chromeos)\n    };\n\n    const detect$2 = (userAgent, userAgentDataOpt, mediaMatch) => {\n      const browsers = PlatformInfo.browsers();\n      const oses = PlatformInfo.oses();\n      const browser = userAgentDataOpt.bind(userAgentData => detectBrowser$1(browsers, userAgentData)).orThunk(() => detectBrowser(browsers, userAgent)).fold(Browser.unknown, Browser.nu);\n      const os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);\n      const deviceType = DeviceType(os, browser, userAgent, mediaMatch);\n      return {\n        browser,\n        os,\n        deviceType\n      };\n    };\n    const PlatformDetection = { detect: detect$2 };\n\n    const mediaMatch = query => window.matchMedia(query).matches;\n    let platform$4 = cached(() => PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch));\n    const detect$1 = () => platform$4();\n\n    const userAgent = navigator.userAgent;\n    const platform$3 = detect$1();\n    const browser$3 = platform$3.browser;\n    const os$1 = platform$3.os;\n    const deviceType = platform$3.deviceType;\n    const windowsPhone = userAgent.indexOf('Windows Phone') !== -1;\n    const Env = {\n      transparentSrc: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n      documentMode: browser$3.isIE() ? document.documentMode || 7 : 10,\n      cacheSuffix: null,\n      container: null,\n      canHaveCSP: !browser$3.isIE(),\n      windowsPhone,\n      browser: {\n        current: browser$3.current,\n        version: browser$3.version,\n        isChromium: browser$3.isChromium,\n        isEdge: browser$3.isEdge,\n        isFirefox: browser$3.isFirefox,\n        isIE: browser$3.isIE,\n        isOpera: browser$3.isOpera,\n        isSafari: browser$3.isSafari\n      },\n      os: {\n        current: os$1.current,\n        version: os$1.version,\n        isAndroid: os$1.isAndroid,\n        isChromeOS: os$1.isChromeOS,\n        isFreeBSD: os$1.isFreeBSD,\n        isiOS: os$1.isiOS,\n        isLinux: os$1.isLinux,\n        isMacOS: os$1.isMacOS,\n        isSolaris: os$1.isSolaris,\n        isWindows: os$1.isWindows\n      },\n      deviceType: {\n        isDesktop: deviceType.isDesktop,\n        isiPad: deviceType.isiPad,\n        isiPhone: deviceType.isiPhone,\n        isPhone: deviceType.isPhone,\n        isTablet: deviceType.isTablet,\n        isTouch: deviceType.isTouch,\n        isWebView: deviceType.isWebView\n      }\n    };\n\n    const trim$3 = str => {\n      return isNullable(str) ? '' : ('' + str).trim();\n    };\n    const is$3 = (obj, type) => {\n      if (!type) {\n        return obj !== undefined;\n      }\n      if (type === 'array' && isArray(obj)) {\n        return true;\n      }\n      return typeof obj === type;\n    };\n    const makeMap$4 = (items, delim, map = {}) => {\n      const resolvedItems = isString(items) ? items.split(delim || ',') : items || [];\n      let i = resolvedItems.length;\n      while (i--) {\n        map[resolvedItems[i]] = {};\n      }\n      return map;\n    };\n    const hasOwnProperty = has$2;\n    const extend$3 = (obj, ...exts) => {\n      for (let i = 0; i < exts.length; i++) {\n        const ext = exts[i];\n        for (const name in ext) {\n          if (has$2(ext, name)) {\n            const value = ext[name];\n            if (value !== undefined) {\n              obj[name] = value;\n            }\n          }\n        }\n      }\n      return obj;\n    };\n    const walk$4 = function (o, f, n, s) {\n      s = s || this;\n      if (o) {\n        if (n) {\n          o = o[n];\n        }\n        each$c(o, (o, i) => {\n          if (f.call(s, o, i, n) === false) {\n            return false;\n          } else {\n            walk$4(o, f, n, s);\n            return true;\n          }\n        });\n      }\n    };\n    const resolve$3 = (n, o = window) => {\n      const path = n.split('.');\n      for (let i = 0, l = path.length; i < l; i++) {\n        o = o[path[i]];\n        if (!o) {\n          break;\n        }\n      }\n      return o;\n    };\n    const explode$3 = (s, d) => {\n      if (isArray$1(s)) {\n        return s;\n      } else if (s === '') {\n        return [];\n      } else {\n        return map$1(s.split(d || ','), trim$3);\n      }\n    };\n    const _addCacheSuffix = url => {\n      const cacheSuffix = Env.cacheSuffix;\n      if (cacheSuffix) {\n        url += (url.indexOf('?') === -1 ? '?' : '&') + cacheSuffix;\n      }\n      return url;\n    };\n    const Tools = {\n      trim: trim$3,\n      isArray: isArray,\n      is: is$3,\n      toArray: toArray$1,\n      makeMap: makeMap$4,\n      each: each$c,\n      map: map$1,\n      grep: filter$3,\n      inArray: indexOf,\n      hasOwn: hasOwnProperty,\n      extend: extend$3,\n      walk: walk$4,\n      resolve: resolve$3,\n      explode: explode$3,\n      _addCacheSuffix\n    };\n\n    const is$2 = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs));\n    const equals = (lhs, rhs, comparator = tripleEquals) => lift2(lhs, rhs, comparator).getOr(lhs.isNone() && rhs.isNone());\n    const cat = arr => {\n      const r = [];\n      const push = x => {\n        r.push(x);\n      };\n      for (let i = 0; i < arr.length; i++) {\n        arr[i].each(push);\n      }\n      return r;\n    };\n    const lift2 = (oa, ob, f) => oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();\n    const lift3 = (oa, ob, oc, f) => oa.isSome() && ob.isSome() && oc.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie(), oc.getOrDie())) : Optional.none();\n    const someIf = (b, a) => b ? Optional.some(a) : Optional.none();\n\n    const Global = typeof window !== 'undefined' ? window : Function('return this;')();\n\n    const path = (parts, scope) => {\n      let o = scope !== undefined && scope !== null ? scope : Global;\n      for (let i = 0; i < parts.length && o !== undefined && o !== null; ++i) {\n        o = o[parts[i]];\n      }\n      return o;\n    };\n    const resolve$2 = (p, scope) => {\n      const parts = p.split('.');\n      return path(parts, scope);\n    };\n\n    const unsafe = (name, scope) => {\n      return resolve$2(name, scope);\n    };\n    const getOrDie = (name, scope) => {\n      const actual = unsafe(name, scope);\n      if (actual === undefined || actual === null) {\n        throw new Error(name + ' not available on this browser');\n      }\n      return actual;\n    };\n\n    const getPrototypeOf$1 = Object.getPrototypeOf;\n    const sandHTMLElement = scope => {\n      return getOrDie('HTMLElement', scope);\n    };\n    const isPrototypeOf = x => {\n      const scope = resolve$2('ownerDocument.defaultView', x);\n      return isObject(x) && (sandHTMLElement(scope).prototype.isPrototypeOf(x) || /^HTML\\w*Element$/.test(getPrototypeOf$1(x).constructor.name));\n    };\n\n    const COMMENT = 8;\n    const DOCUMENT = 9;\n    const DOCUMENT_FRAGMENT = 11;\n    const ELEMENT = 1;\n    const TEXT = 3;\n\n    const name = element => {\n      const r = element.dom.nodeName;\n      return r.toLowerCase();\n    };\n    const type$1 = element => element.dom.nodeType;\n    const isType = t => element => type$1(element) === t;\n    const isComment$1 = element => type$1(element) === COMMENT || name(element) === '#comment';\n    const isHTMLElement$1 = element => isElement$7(element) && isPrototypeOf(element.dom);\n    const isElement$7 = isType(ELEMENT);\n    const isText$c = isType(TEXT);\n    const isDocument$2 = isType(DOCUMENT);\n    const isDocumentFragment$1 = isType(DOCUMENT_FRAGMENT);\n    const isTag = tag => e => isElement$7(e) && name(e) === tag;\n\n    const rawSet = (dom, key, value) => {\n      if (isString(value) || isBoolean(value) || isNumber(value)) {\n        dom.setAttribute(key, value + '');\n      } else {\n        console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);\n        throw new Error('Attribute value was not simple');\n      }\n    };\n    const set$3 = (element, key, value) => {\n      rawSet(element.dom, key, value);\n    };\n    const setAll$1 = (element, attrs) => {\n      const dom = element.dom;\n      each$d(attrs, (v, k) => {\n        rawSet(dom, k, v);\n      });\n    };\n    const get$9 = (element, key) => {\n      const v = element.dom.getAttribute(key);\n      return v === null ? undefined : v;\n    };\n    const getOpt = (element, key) => Optional.from(get$9(element, key));\n    const has$1 = (element, key) => {\n      const dom = element.dom;\n      return dom && dom.hasAttribute ? dom.hasAttribute(key) : false;\n    };\n    const remove$9 = (element, key) => {\n      element.dom.removeAttribute(key);\n    };\n    const hasNone = element => {\n      const attrs = element.dom.attributes;\n      return attrs === undefined || attrs === null || attrs.length === 0;\n    };\n    const clone$4 = element => foldl(element.dom.attributes, (acc, attr) => {\n      acc[attr.name] = attr.value;\n      return acc;\n    }, {});\n\n    const read$4 = (element, attr) => {\n      const value = get$9(element, attr);\n      return value === undefined || value === '' ? [] : value.split(' ');\n    };\n    const add$4 = (element, attr, id) => {\n      const old = read$4(element, attr);\n      const nu = old.concat([id]);\n      set$3(element, attr, nu.join(' '));\n      return true;\n    };\n    const remove$8 = (element, attr, id) => {\n      const nu = filter$5(read$4(element, attr), v => v !== id);\n      if (nu.length > 0) {\n        set$3(element, attr, nu.join(' '));\n      } else {\n        remove$9(element, attr);\n      }\n      return false;\n    };\n\n    const supports = element => element.dom.classList !== undefined;\n    const get$8 = element => read$4(element, 'class');\n    const add$3 = (element, clazz) => add$4(element, 'class', clazz);\n    const remove$7 = (element, clazz) => remove$8(element, 'class', clazz);\n    const toggle$2 = (element, clazz) => {\n      if (contains$2(get$8(element), clazz)) {\n        return remove$7(element, clazz);\n      } else {\n        return add$3(element, clazz);\n      }\n    };\n\n    const add$2 = (element, clazz) => {\n      if (supports(element)) {\n        element.dom.classList.add(clazz);\n      } else {\n        add$3(element, clazz);\n      }\n    };\n    const cleanClass = element => {\n      const classList = supports(element) ? element.dom.classList : get$8(element);\n      if (classList.length === 0) {\n        remove$9(element, 'class');\n      }\n    };\n    const remove$6 = (element, clazz) => {\n      if (supports(element)) {\n        const classList = element.dom.classList;\n        classList.remove(clazz);\n      } else {\n        remove$7(element, clazz);\n      }\n      cleanClass(element);\n    };\n    const toggle$1 = (element, clazz) => {\n      const result = supports(element) ? element.dom.classList.toggle(clazz) : toggle$2(element, clazz);\n      cleanClass(element);\n      return result;\n    };\n    const has = (element, clazz) => supports(element) && element.dom.classList.contains(clazz);\n\n    const fromHtml$1 = (html, scope) => {\n      const doc = scope || document;\n      const div = doc.createElement('div');\n      div.innerHTML = html;\n      if (!div.hasChildNodes() || div.childNodes.length > 1) {\n        const message = 'HTML does not have a single root node';\n        console.error(message, html);\n        throw new Error(message);\n      }\n      return fromDom$2(div.childNodes[0]);\n    };\n    const fromTag = (tag, scope) => {\n      const doc = scope || document;\n      const node = doc.createElement(tag);\n      return fromDom$2(node);\n    };\n    const fromText = (text, scope) => {\n      const doc = scope || document;\n      const node = doc.createTextNode(text);\n      return fromDom$2(node);\n    };\n    const fromDom$2 = node => {\n      if (node === null || node === undefined) {\n        throw new Error('Node cannot be null or undefined');\n      }\n      return { dom: node };\n    };\n    const fromPoint$2 = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom$2);\n    const SugarElement = {\n      fromHtml: fromHtml$1,\n      fromTag,\n      fromText,\n      fromDom: fromDom$2,\n      fromPoint: fromPoint$2\n    };\n\n    const toArray = (target, f) => {\n      const r = [];\n      const recurse = e => {\n        r.push(e);\n        return f(e);\n      };\n      let cur = f(target);\n      do {\n        cur = cur.bind(recurse);\n      } while (cur.isSome());\n      return r;\n    };\n\n    const is$1 = (element, selector) => {\n      const dom = element.dom;\n      if (dom.nodeType !== ELEMENT) {\n        return false;\n      } else {\n        const elem = dom;\n        if (elem.matches !== undefined) {\n          return elem.matches(selector);\n        } else if (elem.msMatchesSelector !== undefined) {\n          return elem.msMatchesSelector(selector);\n        } else if (elem.webkitMatchesSelector !== undefined) {\n          return elem.webkitMatchesSelector(selector);\n        } else if (elem.mozMatchesSelector !== undefined) {\n          return elem.mozMatchesSelector(selector);\n        } else {\n          throw new Error('Browser lacks native selectors');\n        }\n      }\n    };\n    const bypassSelector = dom => dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;\n    const all = (selector, scope) => {\n      const base = scope === undefined ? document : scope.dom;\n      return bypassSelector(base) ? [] : map$3(base.querySelectorAll(selector), SugarElement.fromDom);\n    };\n    const one = (selector, scope) => {\n      const base = scope === undefined ? document : scope.dom;\n      return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom);\n    };\n\n    const eq = (e1, e2) => e1.dom === e2.dom;\n    const contains = (e1, e2) => {\n      const d1 = e1.dom;\n      const d2 = e2.dom;\n      return d1 === d2 ? false : d1.contains(d2);\n    };\n\n    const owner$1 = element => SugarElement.fromDom(element.dom.ownerDocument);\n    const documentOrOwner = dos => isDocument$2(dos) ? dos : owner$1(dos);\n    const documentElement = element => SugarElement.fromDom(documentOrOwner(element).dom.documentElement);\n    const defaultView = element => SugarElement.fromDom(documentOrOwner(element).dom.defaultView);\n    const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom);\n    const parentElement = element => Optional.from(element.dom.parentElement).map(SugarElement.fromDom);\n    const parents$1 = (element, isRoot) => {\n      const stop = isFunction(isRoot) ? isRoot : never;\n      let dom = element.dom;\n      const ret = [];\n      while (dom.parentNode !== null && dom.parentNode !== undefined) {\n        const rawParent = dom.parentNode;\n        const p = SugarElement.fromDom(rawParent);\n        ret.push(p);\n        if (stop(p) === true) {\n          break;\n        } else {\n          dom = rawParent;\n        }\n      }\n      return ret;\n    };\n    const siblings = element => {\n      const filterSelf = elements => filter$5(elements, x => !eq(element, x));\n      return parent(element).map(children$1).map(filterSelf).getOr([]);\n    };\n    const prevSibling = element => Optional.from(element.dom.previousSibling).map(SugarElement.fromDom);\n    const nextSibling = element => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);\n    const prevSiblings = element => reverse(toArray(element, prevSibling));\n    const nextSiblings = element => toArray(element, nextSibling);\n    const children$1 = element => map$3(element.dom.childNodes, SugarElement.fromDom);\n    const child$1 = (element, index) => {\n      const cs = element.dom.childNodes;\n      return Optional.from(cs[index]).map(SugarElement.fromDom);\n    };\n    const firstChild = element => child$1(element, 0);\n    const lastChild = element => child$1(element, element.dom.childNodes.length - 1);\n    const childNodesCount = element => element.dom.childNodes.length;\n    const hasChildNodes = element => element.dom.hasChildNodes();\n\n    const getHead = doc => {\n      const b = doc.dom.head;\n      if (b === null || b === undefined) {\n        throw new Error('Head is not available yet');\n      }\n      return SugarElement.fromDom(b);\n    };\n\n    const isShadowRoot = dos => isDocumentFragment$1(dos) && isNonNullable(dos.dom.host);\n    const supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);\n    const isSupported$1 = constant(supported);\n    const getRootNode = supported ? e => SugarElement.fromDom(e.dom.getRootNode()) : documentOrOwner;\n    const getStyleContainer = dos => isShadowRoot(dos) ? dos : getHead(documentOrOwner(dos));\n    const getContentContainer = dos => isShadowRoot(dos) ? dos : SugarElement.fromDom(documentOrOwner(dos).dom.body);\n    const getShadowRoot = e => {\n      const r = getRootNode(e);\n      return isShadowRoot(r) ? Optional.some(r) : Optional.none();\n    };\n    const getShadowHost = e => SugarElement.fromDom(e.dom.host);\n    const getOriginalEventTarget = event => {\n      if (isSupported$1() && isNonNullable(event.target)) {\n        const el = SugarElement.fromDom(event.target);\n        if (isElement$7(el) && isOpenShadowHost(el)) {\n          if (event.composed && event.composedPath) {\n            const composedPath = event.composedPath();\n            if (composedPath) {\n              return head(composedPath);\n            }\n          }\n        }\n      }\n      return Optional.from(event.target);\n    };\n    const isOpenShadowHost = element => isNonNullable(element.dom.shadowRoot);\n\n    const inBody = element => {\n      const dom = isText$c(element) ? element.dom.parentNode : element.dom;\n      if (dom === undefined || dom === null || dom.ownerDocument === null) {\n        return false;\n      }\n      const doc = dom.ownerDocument;\n      return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost));\n    };\n\n    var ClosestOrAncestor = (is, ancestor, scope, a, isRoot) => {\n      if (is(scope, a)) {\n        return Optional.some(scope);\n      } else if (isFunction(isRoot) && isRoot(scope)) {\n        return Optional.none();\n      } else {\n        return ancestor(scope, a, isRoot);\n      }\n    };\n\n    const ancestor$4 = (scope, predicate, isRoot) => {\n      let element = scope.dom;\n      const stop = isFunction(isRoot) ? isRoot : never;\n      while (element.parentNode) {\n        element = element.parentNode;\n        const el = SugarElement.fromDom(element);\n        if (predicate(el)) {\n          return Optional.some(el);\n        } else if (stop(el)) {\n          break;\n        }\n      }\n      return Optional.none();\n    };\n    const closest$4 = (scope, predicate, isRoot) => {\n      const is = (s, test) => test(s);\n      return ClosestOrAncestor(is, ancestor$4, scope, predicate, isRoot);\n    };\n    const sibling$1 = (scope, predicate) => {\n      const element = scope.dom;\n      if (!element.parentNode) {\n        return Optional.none();\n      }\n      return child(SugarElement.fromDom(element.parentNode), x => !eq(scope, x) && predicate(x));\n    };\n    const child = (scope, predicate) => {\n      const pred = node => predicate(SugarElement.fromDom(node));\n      const result = find$2(scope.dom.childNodes, pred);\n      return result.map(SugarElement.fromDom);\n    };\n    const descendant$2 = (scope, predicate) => {\n      const descend = node => {\n        for (let i = 0; i < node.childNodes.length; i++) {\n          const child = SugarElement.fromDom(node.childNodes[i]);\n          if (predicate(child)) {\n            return Optional.some(child);\n          }\n          const res = descend(node.childNodes[i]);\n          if (res.isSome()) {\n            return res;\n          }\n        }\n        return Optional.none();\n      };\n      return descend(scope.dom);\n    };\n\n    const ancestor$3 = (scope, selector, isRoot) => ancestor$4(scope, e => is$1(e, selector), isRoot);\n    const descendant$1 = (scope, selector) => one(selector, scope);\n    const closest$3 = (scope, selector, isRoot) => {\n      const is = (element, selector) => is$1(element, selector);\n      return ClosestOrAncestor(is, ancestor$3, scope, selector, isRoot);\n    };\n\n    const closest$2 = target => closest$3(target, '[contenteditable]');\n    const isEditable$2 = (element, assumeEditable = false) => {\n      if (inBody(element)) {\n        return element.dom.isContentEditable;\n      } else {\n        return closest$2(element).fold(constant(assumeEditable), editable => getRaw$1(editable) === 'true');\n      }\n    };\n    const getRaw$1 = element => element.dom.contentEditable;\n\n    const isSupported = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue);\n\n    const internalSet = (dom, property, value) => {\n      if (!isString(value)) {\n        console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);\n        throw new Error('CSS value must be a string: ' + value);\n      }\n      if (isSupported(dom)) {\n        dom.style.setProperty(property, value);\n      }\n    };\n    const internalRemove = (dom, property) => {\n      if (isSupported(dom)) {\n        dom.style.removeProperty(property);\n      }\n    };\n    const set$2 = (element, property, value) => {\n      const dom = element.dom;\n      internalSet(dom, property, value);\n    };\n    const setAll = (element, css) => {\n      const dom = element.dom;\n      each$d(css, (v, k) => {\n        internalSet(dom, k, v);\n      });\n    };\n    const get$7 = (element, property) => {\n      const dom = element.dom;\n      const styles = window.getComputedStyle(dom);\n      const r = styles.getPropertyValue(property);\n      return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;\n    };\n    const getUnsafeProperty = (dom, property) => isSupported(dom) ? dom.style.getPropertyValue(property) : '';\n    const getRaw = (element, property) => {\n      const dom = element.dom;\n      const raw = getUnsafeProperty(dom, property);\n      return Optional.from(raw).filter(r => r.length > 0);\n    };\n    const getAllRaw = element => {\n      const css = {};\n      const dom = element.dom;\n      if (isSupported(dom)) {\n        for (let i = 0; i < dom.style.length; i++) {\n          const ruleName = dom.style.item(i);\n          css[ruleName] = dom.style[ruleName];\n        }\n      }\n      return css;\n    };\n    const remove$5 = (element, property) => {\n      const dom = element.dom;\n      internalRemove(dom, property);\n      if (is$2(getOpt(element, 'style').map(trim$4), '')) {\n        remove$9(element, 'style');\n      }\n    };\n    const reflow = e => e.dom.offsetWidth;\n\n    const before$3 = (marker, element) => {\n      const parent$1 = parent(marker);\n      parent$1.each(v => {\n        v.dom.insertBefore(element.dom, marker.dom);\n      });\n    };\n    const after$4 = (marker, element) => {\n      const sibling = nextSibling(marker);\n      sibling.fold(() => {\n        const parent$1 = parent(marker);\n        parent$1.each(v => {\n          append$1(v, element);\n        });\n      }, v => {\n        before$3(v, element);\n      });\n    };\n    const prepend = (parent, element) => {\n      const firstChild$1 = firstChild(parent);\n      firstChild$1.fold(() => {\n        append$1(parent, element);\n      }, v => {\n        parent.dom.insertBefore(element.dom, v.dom);\n      });\n    };\n    const append$1 = (parent, element) => {\n      parent.dom.appendChild(element.dom);\n    };\n    const wrap$2 = (element, wrapper) => {\n      before$3(element, wrapper);\n      append$1(wrapper, element);\n    };\n\n    const after$3 = (marker, elements) => {\n      each$e(elements, (x, i) => {\n        const e = i === 0 ? marker : elements[i - 1];\n        after$4(e, x);\n      });\n    };\n    const append = (parent, elements) => {\n      each$e(elements, x => {\n        append$1(parent, x);\n      });\n    };\n\n    const empty = element => {\n      element.dom.textContent = '';\n      each$e(children$1(element), rogue => {\n        remove$4(rogue);\n      });\n    };\n    const remove$4 = element => {\n      const dom = element.dom;\n      if (dom.parentNode !== null) {\n        dom.parentNode.removeChild(dom);\n      }\n    };\n    const unwrap = wrapper => {\n      const children = children$1(wrapper);\n      if (children.length > 0) {\n        after$3(wrapper, children);\n      }\n      remove$4(wrapper);\n    };\n\n    const fromHtml = (html, scope) => {\n      const doc = scope || document;\n      const div = doc.createElement('div');\n      div.innerHTML = html;\n      return children$1(SugarElement.fromDom(div));\n    };\n    const fromDom$1 = nodes => map$3(nodes, SugarElement.fromDom);\n\n    const get$6 = element => element.dom.innerHTML;\n    const set$1 = (element, content) => {\n      const owner = owner$1(element);\n      const docDom = owner.dom;\n      const fragment = SugarElement.fromDom(docDom.createDocumentFragment());\n      const contentElements = fromHtml(content, docDom);\n      append(fragment, contentElements);\n      empty(element);\n      append$1(element, fragment);\n    };\n    const getOuter = element => {\n      const container = SugarElement.fromTag('div');\n      const clone = SugarElement.fromDom(element.dom.cloneNode(true));\n      append$1(container, clone);\n      return get$6(container);\n    };\n\n    const mkEvent = (target, x, y, stop, prevent, kill, raw) => ({\n      target,\n      x,\n      y,\n      stop,\n      prevent,\n      kill,\n      raw\n    });\n    const fromRawEvent = rawEvent => {\n      const target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));\n      const stop = () => rawEvent.stopPropagation();\n      const prevent = () => rawEvent.preventDefault();\n      const kill = compose(prevent, stop);\n      return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);\n    };\n    const handle$1 = (filter, handler) => rawEvent => {\n      if (filter(rawEvent)) {\n        handler(fromRawEvent(rawEvent));\n      }\n    };\n    const binder = (element, event, filter, handler, useCapture) => {\n      const wrapped = handle$1(filter, handler);\n      element.dom.addEventListener(event, wrapped, useCapture);\n      return { unbind: curry(unbind, element, event, wrapped, useCapture) };\n    };\n    const bind$2 = (element, event, filter, handler) => binder(element, event, filter, handler, false);\n    const unbind = (element, event, handler, useCapture) => {\n      element.dom.removeEventListener(event, handler, useCapture);\n    };\n\n    const r = (left, top) => {\n      const translate = (x, y) => r(left + x, top + y);\n      return {\n        left,\n        top,\n        translate\n      };\n    };\n    const SugarPosition = r;\n\n    const boxPosition = dom => {\n      const box = dom.getBoundingClientRect();\n      return SugarPosition(box.left, box.top);\n    };\n    const firstDefinedOrZero = (a, b) => {\n      if (a !== undefined) {\n        return a;\n      } else {\n        return b !== undefined ? b : 0;\n      }\n    };\n    const absolute = element => {\n      const doc = element.dom.ownerDocument;\n      const body = doc.body;\n      const win = doc.defaultView;\n      const html = doc.documentElement;\n      if (body === element.dom) {\n        return SugarPosition(body.offsetLeft, body.offsetTop);\n      }\n      const scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop);\n      const scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageXOffset, html.scrollLeft);\n      const clientTop = firstDefinedOrZero(html.clientTop, body.clientTop);\n      const clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft);\n      return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop);\n    };\n    const viewport = element => {\n      const dom = element.dom;\n      const doc = dom.ownerDocument;\n      const body = doc.body;\n      if (body === dom) {\n        return SugarPosition(body.offsetLeft, body.offsetTop);\n      }\n      if (!inBody(element)) {\n        return SugarPosition(0, 0);\n      }\n      return boxPosition(dom);\n    };\n\n    const get$5 = _DOC => {\n      const doc = _DOC !== undefined ? _DOC.dom : document;\n      const x = doc.body.scrollLeft || doc.documentElement.scrollLeft;\n      const y = doc.body.scrollTop || doc.documentElement.scrollTop;\n      return SugarPosition(x, y);\n    };\n    const to = (x, y, _DOC) => {\n      const doc = _DOC !== undefined ? _DOC.dom : document;\n      const win = doc.defaultView;\n      if (win) {\n        win.scrollTo(x, y);\n      }\n    };\n    const intoView = (element, alignToTop) => {\n      const isSafari = detect$1().browser.isSafari();\n      if (isSafari && isFunction(element.dom.scrollIntoViewIfNeeded)) {\n        element.dom.scrollIntoViewIfNeeded(false);\n      } else {\n        element.dom.scrollIntoView(alignToTop);\n      }\n    };\n\n    const get$4 = _win => {\n      const win = _win === undefined ? window : _win;\n      if (detect$1().browser.isFirefox()) {\n        return Optional.none();\n      } else {\n        return Optional.from(win.visualViewport);\n      }\n    };\n    const bounds = (x, y, width, height) => ({\n      x,\n      y,\n      width,\n      height,\n      right: x + width,\n      bottom: y + height\n    });\n    const getBounds = _win => {\n      const win = _win === undefined ? window : _win;\n      const doc = win.document;\n      const scroll = get$5(SugarElement.fromDom(doc));\n      return get$4(win).fold(() => {\n        const html = win.document.documentElement;\n        const width = html.clientWidth;\n        const height = html.clientHeight;\n        return bounds(scroll.left, scroll.top, width, height);\n      }, visualViewport => bounds(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height));\n    };\n\n    const children = (scope, predicate) => filter$5(children$1(scope), predicate);\n    const descendants$1 = (scope, predicate) => {\n      let result = [];\n      each$e(children$1(scope), x => {\n        if (predicate(x)) {\n          result = result.concat([x]);\n        }\n        result = result.concat(descendants$1(x, predicate));\n      });\n      return result;\n    };\n\n    const descendants = (scope, selector) => all(selector, scope);\n\n    const ancestor$2 = (scope, predicate, isRoot) => ancestor$4(scope, predicate, isRoot).isSome();\n    const sibling = (scope, predicate) => sibling$1(scope, predicate).isSome();\n    const descendant = (scope, predicate) => descendant$2(scope, predicate).isSome();\n\n    class DomTreeWalker {\n      constructor(startNode, rootNode) {\n        this.node = startNode;\n        this.rootNode = rootNode;\n        this.current = this.current.bind(this);\n        this.next = this.next.bind(this);\n        this.prev = this.prev.bind(this);\n        this.prev2 = this.prev2.bind(this);\n      }\n      current() {\n        return this.node;\n      }\n      next(shallow) {\n        this.node = this.findSibling(this.node, 'firstChild', 'nextSibling', shallow);\n        return this.node;\n      }\n      prev(shallow) {\n        this.node = this.findSibling(this.node, 'lastChild', 'previousSibling', shallow);\n        return this.node;\n      }\n      prev2(shallow) {\n        this.node = this.findPreviousNode(this.node, shallow);\n        return this.node;\n      }\n      findSibling(node, startName, siblingName, shallow) {\n        if (node) {\n          if (!shallow && node[startName]) {\n            return node[startName];\n          }\n          if (node !== this.rootNode) {\n            let sibling = node[siblingName];\n            if (sibling) {\n              return sibling;\n            }\n            for (let parent = node.parentNode; parent && parent !== this.rootNode; parent = parent.parentNode) {\n              sibling = parent[siblingName];\n              if (sibling) {\n                return sibling;\n              }\n            }\n          }\n        }\n        return undefined;\n      }\n      findPreviousNode(node, shallow) {\n        if (node) {\n          const sibling = node.previousSibling;\n          if (this.rootNode && sibling === this.rootNode) {\n            return;\n          }\n          if (sibling) {\n            if (!shallow) {\n              for (let child = sibling.lastChild; child; child = child.lastChild) {\n                if (!child.lastChild) {\n                  return child;\n                }\n              }\n            }\n            return sibling;\n          }\n          const parent = node.parentNode;\n          if (parent && parent !== this.rootNode) {\n            return parent;\n          }\n        }\n        return undefined;\n      }\n    }\n\n    const zeroWidth = '\\uFEFF';\n    const nbsp = '\\xA0';\n    const isZwsp$2 = char => char === zeroWidth;\n    const removeZwsp = s => s.replace(/\\uFEFF/g, '');\n\n    const whiteSpaceRegExp = /^[ \\t\\r\\n]*$/;\n    const isWhitespaceText = text => whiteSpaceRegExp.test(text);\n    const isZwsp$1 = text => {\n      for (const c of text) {\n        if (!isZwsp$2(c)) {\n          return false;\n        }\n      }\n      return true;\n    };\n    const isCollapsibleWhitespace$1 = c => ' \\f\\t\\x0B'.indexOf(c) !== -1;\n    const isNewLineChar = c => c === '\\n' || c === '\\r';\n    const isNewline = (text, idx) => idx < text.length && idx >= 0 ? isNewLineChar(text[idx]) : false;\n    const normalize$4 = (text, tabSpaces = 4, isStartOfContent = true, isEndOfContent = true) => {\n      const tabSpace = repeat(' ', tabSpaces);\n      const normalizedText = text.replace(/\\t/g, tabSpace);\n      const result = foldl(normalizedText, (acc, c) => {\n        if (isCollapsibleWhitespace$1(c) || c === nbsp) {\n          if (acc.pcIsSpace || acc.str === '' && isStartOfContent || acc.str.length === normalizedText.length - 1 && isEndOfContent || isNewline(normalizedText, acc.str.length + 1)) {\n            return {\n              pcIsSpace: false,\n              str: acc.str + nbsp\n            };\n          } else {\n            return {\n              pcIsSpace: true,\n              str: acc.str + ' '\n            };\n          }\n        } else {\n          return {\n            pcIsSpace: isNewLineChar(c),\n            str: acc.str + c\n          };\n        }\n      }, {\n        pcIsSpace: false,\n        str: ''\n      });\n      return result.str;\n    };\n\n    const isNodeType = type => {\n      return node => {\n        return !!node && node.nodeType === type;\n      };\n    };\n    const isRestrictedNode = node => !!node && !Object.getPrototypeOf(node);\n    const isElement$6 = isNodeType(1);\n    const isHTMLElement = node => isElement$6(node) && isHTMLElement$1(SugarElement.fromDom(node));\n    const isSVGElement = node => isElement$6(node) && node.namespaceURI === 'http://www.w3.org/2000/svg';\n    const matchNodeName = name => {\n      const lowerCasedName = name.toLowerCase();\n      return node => isNonNullable(node) && node.nodeName.toLowerCase() === lowerCasedName;\n    };\n    const matchNodeNames = names => {\n      const lowerCasedNames = names.map(s => s.toLowerCase());\n      return node => {\n        if (node && node.nodeName) {\n          const nodeName = node.nodeName.toLowerCase();\n          return contains$2(lowerCasedNames, nodeName);\n        }\n        return false;\n      };\n    };\n    const matchStyleValues = (name, values) => {\n      const items = values.toLowerCase().split(' ');\n      return node => {\n        if (isElement$6(node)) {\n          const win = node.ownerDocument.defaultView;\n          if (win) {\n            for (let i = 0; i < items.length; i++) {\n              const computed = win.getComputedStyle(node, null);\n              const cssValue = computed ? computed.getPropertyValue(name) : null;\n              if (cssValue === items[i]) {\n                return true;\n              }\n            }\n          }\n        }\n        return false;\n      };\n    };\n    const hasAttribute = attrName => {\n      return node => {\n        return isElement$6(node) && node.hasAttribute(attrName);\n      };\n    };\n    const isBogus$1 = node => isElement$6(node) && node.hasAttribute('data-mce-bogus');\n    const isBogusAll = node => isElement$6(node) && node.getAttribute('data-mce-bogus') === 'all';\n    const isTable$2 = node => isElement$6(node) && node.tagName === 'TABLE';\n    const hasContentEditableState = value => {\n      return node => {\n        if (isHTMLElement(node)) {\n          if (node.contentEditable === value) {\n            return true;\n          }\n          if (node.getAttribute('data-mce-contenteditable') === value) {\n            return true;\n          }\n        }\n        return false;\n      };\n    };\n    const isTextareaOrInput = matchNodeNames([\n      'textarea',\n      'input'\n    ]);\n    const isText$b = isNodeType(3);\n    const isCData = isNodeType(4);\n    const isPi = isNodeType(7);\n    const isComment = isNodeType(8);\n    const isDocument$1 = isNodeType(9);\n    const isDocumentFragment = isNodeType(11);\n    const isBr$6 = matchNodeName('br');\n    const isImg = matchNodeName('img');\n    const isContentEditableTrue$3 = hasContentEditableState('true');\n    const isContentEditableFalse$b = hasContentEditableState('false');\n    const isTableCell$3 = matchNodeNames([\n      'td',\n      'th'\n    ]);\n    const isTableCellOrCaption = matchNodeNames([\n      'td',\n      'th',\n      'caption'\n    ]);\n    const isMedia$2 = matchNodeNames([\n      'video',\n      'audio',\n      'object',\n      'embed'\n    ]);\n    const isListItem$2 = matchNodeName('li');\n    const isDetails = matchNodeName('details');\n    const isSummary$1 = matchNodeName('summary');\n\n    const defaultOptionValues = {\n      skipBogus: true,\n      includeZwsp: false,\n      checkRootAsContent: false\n    };\n    const hasWhitespacePreserveParent = (node, rootNode, schema) => {\n      const rootElement = SugarElement.fromDom(rootNode);\n      const startNode = SugarElement.fromDom(node);\n      const whitespaceElements = schema.getWhitespaceElements();\n      const predicate = node => has$2(whitespaceElements, name(node));\n      return ancestor$2(startNode, predicate, curry(eq, rootElement));\n    };\n    const isNamedAnchor = node => {\n      return isElement$6(node) && node.nodeName === 'A' && !node.hasAttribute('href') && (node.hasAttribute('name') || node.hasAttribute('id'));\n    };\n    const isNonEmptyElement$1 = (node, schema) => {\n      return isElement$6(node) && has$2(schema.getNonEmptyElements(), node.nodeName);\n    };\n    const isBookmark = hasAttribute('data-mce-bookmark');\n    const hasNonEditableParent = node => parentElement(SugarElement.fromDom(node)).exists(parent => !isEditable$2(parent));\n    const isWhitespace$1 = (node, rootNode, schema) => isWhitespaceText(node.data) && !hasWhitespacePreserveParent(node, rootNode, schema);\n    const isText$a = (node, rootNode, schema, options) => isText$b(node) && !isWhitespace$1(node, rootNode, schema) && (!options.includeZwsp || !isZwsp$1(node.data));\n    const isContentNode = (schema, node, rootNode, options) => {\n      return isFunction(options.isContent) && options.isContent(node) || isNonEmptyElement$1(node, schema) || isBookmark(node) || isNamedAnchor(node) || isText$a(node, rootNode, schema, options) || isContentEditableFalse$b(node) || isContentEditableTrue$3(node) && hasNonEditableParent(node);\n    };\n    const isEmptyNode = (schema, targetNode, opts) => {\n      const options = {\n        ...defaultOptionValues,\n        ...opts\n      };\n      if (options.checkRootAsContent) {\n        if (isContentNode(schema, targetNode, targetNode, options)) {\n          return false;\n        }\n      }\n      let node = targetNode.firstChild;\n      let brCount = 0;\n      if (!node) {\n        return true;\n      }\n      const walker = new DomTreeWalker(node, targetNode);\n      do {\n        if (options.skipBogus && isElement$6(node)) {\n          const bogusValue = node.getAttribute('data-mce-bogus');\n          if (bogusValue) {\n            node = walker.next(bogusValue === 'all');\n            continue;\n          }\n        }\n        if (isComment(node)) {\n          node = walker.next(true);\n          continue;\n        }\n        if (isBr$6(node)) {\n          brCount++;\n          node = walker.next();\n          continue;\n        }\n        if (isContentNode(schema, node, targetNode, options)) {\n          return false;\n        }\n        node = walker.next();\n      } while (node);\n      return brCount <= 1;\n    };\n    const isEmpty$2 = (schema, elm, options) => {\n      return isEmptyNode(schema, elm.dom, {\n        checkRootAsContent: true,\n        ...options\n      });\n    };\n    const isContent$1 = (schema, node, options) => {\n      return isContentNode(schema, node, node, {\n        includeZwsp: defaultOptionValues.includeZwsp,\n        ...options\n      });\n    };\n\n    const isNonHtmlElementRootName = name => name.toLowerCase() === 'svg';\n    const isNonHtmlElementRoot = node => isNonHtmlElementRootName(node.nodeName);\n    const toScopeType = node => (node === null || node === void 0 ? void 0 : node.nodeName) === 'svg' ? 'svg' : 'html';\n    const namespaceElements = ['svg'];\n    const createNamespaceTracker = () => {\n      let scopes = [];\n      const peek = () => scopes[scopes.length - 1];\n      const track = node => {\n        if (isNonHtmlElementRoot(node)) {\n          scopes.push(node);\n        }\n        let currentScope = peek();\n        if (currentScope && !currentScope.contains(node)) {\n          scopes.pop();\n          currentScope = peek();\n        }\n        return toScopeType(currentScope);\n      };\n      const current = () => toScopeType(peek());\n      const reset = () => {\n        scopes = [];\n      };\n      return {\n        track,\n        current,\n        reset\n      };\n    };\n\n    const transparentBlockAttr = 'data-mce-block';\n    const elementNames = map => filter$5(keys(map), key => !/[A-Z]/.test(key));\n    const makeSelectorFromSchemaMap = map => map$3(elementNames(map), name => {\n      return `${ name }:` + map$3(namespaceElements, ns => `not(${ ns } ${ name })`).join(':');\n    }).join(',');\n    const updateTransparent = (blocksSelector, transparent) => {\n      if (isNonNullable(transparent.querySelector(blocksSelector))) {\n        transparent.setAttribute(transparentBlockAttr, 'true');\n        if (transparent.getAttribute('data-mce-selected') === 'inline-boundary') {\n          transparent.removeAttribute('data-mce-selected');\n        }\n        return true;\n      } else {\n        transparent.removeAttribute(transparentBlockAttr);\n        return false;\n      }\n    };\n    const updateBlockStateOnChildren = (schema, scope) => {\n      const transparentSelector = makeSelectorFromSchemaMap(schema.getTransparentElements());\n      const blocksSelector = makeSelectorFromSchemaMap(schema.getBlockElements());\n      return filter$5(scope.querySelectorAll(transparentSelector), transparent => updateTransparent(blocksSelector, transparent));\n    };\n    const trimEdge = (schema, el, leftSide) => {\n      var _a;\n      const childPropertyName = leftSide ? 'lastChild' : 'firstChild';\n      for (let child = el[childPropertyName]; child; child = child[childPropertyName]) {\n        if (isEmptyNode(schema, child, { checkRootAsContent: true })) {\n          (_a = child.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(child);\n          return;\n        }\n      }\n    };\n    const split$2 = (schema, parentElm, splitElm) => {\n      const range = document.createRange();\n      const parentNode = parentElm.parentNode;\n      if (parentNode) {\n        range.setStartBefore(parentElm);\n        range.setEndBefore(splitElm);\n        const beforeFragment = range.extractContents();\n        trimEdge(schema, beforeFragment, true);\n        range.setStartAfter(splitElm);\n        range.setEndAfter(parentElm);\n        const afterFragment = range.extractContents();\n        trimEdge(schema, afterFragment, false);\n        if (!isEmptyNode(schema, beforeFragment, { checkRootAsContent: true })) {\n          parentNode.insertBefore(beforeFragment, parentElm);\n        }\n        if (!isEmptyNode(schema, splitElm, { checkRootAsContent: true })) {\n          parentNode.insertBefore(splitElm, parentElm);\n        }\n        if (!isEmptyNode(schema, afterFragment, { checkRootAsContent: true })) {\n          parentNode.insertBefore(afterFragment, parentElm);\n        }\n        parentNode.removeChild(parentElm);\n      }\n    };\n    const splitInvalidChildren = (schema, scope, transparentBlocks) => {\n      const blocksElements = schema.getBlockElements();\n      const rootNode = SugarElement.fromDom(scope);\n      const isBlock = el => name(el) in blocksElements;\n      const isRoot = el => eq(el, rootNode);\n      each$e(fromDom$1(transparentBlocks), transparentBlock => {\n        ancestor$4(transparentBlock, isBlock, isRoot).each(parentBlock => {\n          const invalidChildren = children(transparentBlock, el => isBlock(el) && !schema.isValidChild(name(parentBlock), name(el)));\n          if (invalidChildren.length > 0) {\n            const stateScope = parentElement(parentBlock);\n            each$e(invalidChildren, child => {\n              ancestor$4(child, isBlock, isRoot).each(parentBlock => {\n                split$2(schema, parentBlock.dom, child.dom);\n              });\n            });\n            stateScope.each(scope => updateBlockStateOnChildren(schema, scope.dom));\n          }\n        });\n      });\n    };\n    const unwrapInvalidChildren = (schema, scope, transparentBlocks) => {\n      each$e([\n        ...transparentBlocks,\n        ...isTransparentBlock(schema, scope) ? [scope] : []\n      ], block => each$e(descendants(SugarElement.fromDom(block), block.nodeName.toLowerCase()), elm => {\n        if (isTransparentInline(schema, elm.dom)) {\n          unwrap(elm);\n        }\n      }));\n    };\n    const updateChildren = (schema, scope) => {\n      const transparentBlocks = updateBlockStateOnChildren(schema, scope);\n      splitInvalidChildren(schema, scope, transparentBlocks);\n      unwrapInvalidChildren(schema, scope, transparentBlocks);\n    };\n    const updateElement = (schema, target) => {\n      if (isTransparentElement(schema, target)) {\n        const blocksSelector = makeSelectorFromSchemaMap(schema.getBlockElements());\n        updateTransparent(blocksSelector, target);\n      }\n    };\n    const updateCaret = (schema, root, caretParent) => {\n      const isRoot = el => eq(el, SugarElement.fromDom(root));\n      const parents = parents$1(SugarElement.fromDom(caretParent), isRoot);\n      get$b(parents, parents.length - 2).filter(isElement$7).fold(() => updateChildren(schema, root), scope => updateChildren(schema, scope.dom));\n    };\n    const hasBlockAttr = el => el.hasAttribute(transparentBlockAttr);\n    const isTransparentElementName = (schema, name) => has$2(schema.getTransparentElements(), name);\n    const isTransparentElement = (schema, node) => isElement$6(node) && isTransparentElementName(schema, node.nodeName);\n    const isTransparentBlock = (schema, node) => isTransparentElement(schema, node) && hasBlockAttr(node);\n    const isTransparentInline = (schema, node) => isTransparentElement(schema, node) && !hasBlockAttr(node);\n    const isTransparentAstBlock = (schema, node) => node.type === 1 && isTransparentElementName(schema, node.name) && isString(node.attr(transparentBlockAttr));\n\n    const browser$2 = detect$1().browser;\n    const firstElement = nodes => find$2(nodes, isElement$7);\n    const getTableCaptionDeltaY = elm => {\n      if (browser$2.isFirefox() && name(elm) === 'table') {\n        return firstElement(children$1(elm)).filter(elm => {\n          return name(elm) === 'caption';\n        }).bind(caption => {\n          return firstElement(nextSiblings(caption)).map(body => {\n            const bodyTop = body.dom.offsetTop;\n            const captionTop = caption.dom.offsetTop;\n            const captionHeight = caption.dom.offsetHeight;\n            return bodyTop <= captionTop ? -captionHeight : 0;\n          });\n        }).getOr(0);\n      } else {\n        return 0;\n      }\n    };\n    const hasChild = (elm, child) => elm.children && contains$2(elm.children, child);\n    const getPos = (body, elm, rootElm) => {\n      let x = 0, y = 0;\n      const doc = body.ownerDocument;\n      rootElm = rootElm ? rootElm : body;\n      if (elm) {\n        if (rootElm === body && elm.getBoundingClientRect && get$7(SugarElement.fromDom(body), 'position') === 'static') {\n          const pos = elm.getBoundingClientRect();\n          x = pos.left + (doc.documentElement.scrollLeft || body.scrollLeft) - doc.documentElement.clientLeft;\n          y = pos.top + (doc.documentElement.scrollTop || body.scrollTop) - doc.documentElement.clientTop;\n          return {\n            x,\n            y\n          };\n        }\n        let offsetParent = elm;\n        while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType && !hasChild(offsetParent, rootElm)) {\n          const castOffsetParent = offsetParent;\n          x += castOffsetParent.offsetLeft || 0;\n          y += castOffsetParent.offsetTop || 0;\n          offsetParent = castOffsetParent.offsetParent;\n        }\n        offsetParent = elm.parentNode;\n        while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType && !hasChild(offsetParent, rootElm)) {\n          x -= offsetParent.scrollLeft || 0;\n          y -= offsetParent.scrollTop || 0;\n          offsetParent = offsetParent.parentNode;\n        }\n        y += getTableCaptionDeltaY(SugarElement.fromDom(elm));\n      }\n      return {\n        x,\n        y\n      };\n    };\n\n    const StyleSheetLoader = (documentOrShadowRoot, settings = {}) => {\n      let idCount = 0;\n      const loadedStates = {};\n      const edos = SugarElement.fromDom(documentOrShadowRoot);\n      const doc = documentOrOwner(edos);\n      const _setReferrerPolicy = referrerPolicy => {\n        settings.referrerPolicy = referrerPolicy;\n      };\n      const _setContentCssCors = contentCssCors => {\n        settings.contentCssCors = contentCssCors;\n      };\n      const addStyle = element => {\n        append$1(getStyleContainer(edos), element);\n      };\n      const removeStyle = id => {\n        const styleContainer = getStyleContainer(edos);\n        descendant$1(styleContainer, '#' + id).each(remove$4);\n      };\n      const getOrCreateState = url => get$a(loadedStates, url).getOrThunk(() => ({\n        id: 'mce-u' + idCount++,\n        passed: [],\n        failed: [],\n        count: 0\n      }));\n      const load = url => new Promise((success, failure) => {\n        let link;\n        const urlWithSuffix = Tools._addCacheSuffix(url);\n        const state = getOrCreateState(urlWithSuffix);\n        loadedStates[urlWithSuffix] = state;\n        state.count++;\n        const resolve = (callbacks, status) => {\n          each$e(callbacks, call);\n          state.status = status;\n          state.passed = [];\n          state.failed = [];\n          if (link) {\n            link.onload = null;\n            link.onerror = null;\n            link = null;\n          }\n        };\n        const passed = () => resolve(state.passed, 2);\n        const failed = () => resolve(state.failed, 3);\n        if (success) {\n          state.passed.push(success);\n        }\n        if (failure) {\n          state.failed.push(failure);\n        }\n        if (state.status === 1) {\n          return;\n        }\n        if (state.status === 2) {\n          passed();\n          return;\n        }\n        if (state.status === 3) {\n          failed();\n          return;\n        }\n        state.status = 1;\n        const linkElem = SugarElement.fromTag('link', doc.dom);\n        setAll$1(linkElem, {\n          rel: 'stylesheet',\n          type: 'text/css',\n          id: state.id\n        });\n        if (settings.contentCssCors) {\n          set$3(linkElem, 'crossOrigin', 'anonymous');\n        }\n        if (settings.referrerPolicy) {\n          set$3(linkElem, 'referrerpolicy', settings.referrerPolicy);\n        }\n        link = linkElem.dom;\n        link.onload = passed;\n        link.onerror = failed;\n        addStyle(linkElem);\n        set$3(linkElem, 'href', urlWithSuffix);\n      });\n      const loadRawCss = (key, css) => {\n        const state = getOrCreateState(key);\n        loadedStates[key] = state;\n        state.count++;\n        const styleElem = SugarElement.fromTag('style', doc.dom);\n        setAll$1(styleElem, {\n          rel: 'stylesheet',\n          type: 'text/css',\n          id: state.id\n        });\n        styleElem.dom.innerHTML = css;\n        addStyle(styleElem);\n      };\n      const loadAll = urls => {\n        const loadedUrls = Promise.allSettled(map$3(urls, url => load(url).then(constant(url))));\n        return loadedUrls.then(results => {\n          const parts = partition$2(results, r => r.status === 'fulfilled');\n          if (parts.fail.length > 0) {\n            return Promise.reject(map$3(parts.fail, result => result.reason));\n          } else {\n            return map$3(parts.pass, result => result.value);\n          }\n        });\n      };\n      const unload = url => {\n        const urlWithSuffix = Tools._addCacheSuffix(url);\n        get$a(loadedStates, urlWithSuffix).each(state => {\n          const count = --state.count;\n          if (count === 0) {\n            delete loadedStates[urlWithSuffix];\n            removeStyle(state.id);\n          }\n        });\n      };\n      const unloadRawCss = key => {\n        get$a(loadedStates, key).each(state => {\n          const count = --state.count;\n          if (count === 0) {\n            delete loadedStates[key];\n            removeStyle(state.id);\n          }\n        });\n      };\n      const unloadAll = urls => {\n        each$e(urls, url => {\n          unload(url);\n        });\n      };\n      return {\n        load,\n        loadRawCss,\n        loadAll,\n        unload,\n        unloadRawCss,\n        unloadAll,\n        _setReferrerPolicy,\n        _setContentCssCors\n      };\n    };\n\n    const create$c = () => {\n      const map = new WeakMap();\n      const forElement = (referenceElement, settings) => {\n        const root = getRootNode(referenceElement);\n        const rootDom = root.dom;\n        return Optional.from(map.get(rootDom)).getOrThunk(() => {\n          const sl = StyleSheetLoader(rootDom, settings);\n          map.set(rootDom, sl);\n          return sl;\n        });\n      };\n      return { forElement };\n    };\n    const instance = create$c();\n\n    const isSpan = node => node.nodeName.toLowerCase() === 'span';\n    const isInlineContent = (node, schema) => isNonNullable(node) && (isContent$1(schema, node) || schema.isInline(node.nodeName.toLowerCase()));\n    const surroundedByInlineContent = (node, root, schema) => {\n      const prev = new DomTreeWalker(node, root).prev(false);\n      const next = new DomTreeWalker(node, root).next(false);\n      const prevIsInline = isUndefined(prev) || isInlineContent(prev, schema);\n      const nextIsInline = isUndefined(next) || isInlineContent(next, schema);\n      return prevIsInline && nextIsInline;\n    };\n    const isBookmarkNode$2 = node => isSpan(node) && node.getAttribute('data-mce-type') === 'bookmark';\n    const isKeepTextNode = (node, root, schema) => isText$b(node) && node.data.length > 0 && surroundedByInlineContent(node, root, schema);\n    const isKeepElement = node => isElement$6(node) ? node.childNodes.length > 0 : false;\n    const isDocument = node => isDocumentFragment(node) || isDocument$1(node);\n    const trimNode = (dom, node, schema, root) => {\n      var _a;\n      const rootNode = root || node;\n      if (isElement$6(node) && isBookmarkNode$2(node)) {\n        return node;\n      }\n      const children = node.childNodes;\n      for (let i = children.length - 1; i >= 0; i--) {\n        trimNode(dom, children[i], schema, rootNode);\n      }\n      if (isElement$6(node)) {\n        const currentChildren = node.childNodes;\n        if (currentChildren.length === 1 && isBookmarkNode$2(currentChildren[0])) {\n          (_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(currentChildren[0], node);\n        }\n      }\n      if (!isDocument(node) && !isContent$1(schema, node) && !isKeepElement(node) && !isKeepTextNode(node, rootNode, schema)) {\n        dom.remove(node);\n      }\n      return node;\n    };\n\n    const makeMap$3 = Tools.makeMap;\n    const attrsCharsRegExp = /[&<>\\\"\\u0060\\u007E-\\uD7FF\\uE000-\\uFFEF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n    const textCharsRegExp = /[<>&\\u007E-\\uD7FF\\uE000-\\uFFEF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n    const rawCharsRegExp = /[<>&\\\"\\']/g;\n    const entityRegExp = /&#([a-z0-9]+);?|&([a-z0-9]+);/gi;\n    const asciiMap = {\n      128: '\\u20AC',\n      130: '\\u201A',\n      131: '\\u0192',\n      132: '\\u201E',\n      133: '\\u2026',\n      134: '\\u2020',\n      135: '\\u2021',\n      136: '\\u02c6',\n      137: '\\u2030',\n      138: '\\u0160',\n      139: '\\u2039',\n      140: '\\u0152',\n      142: '\\u017d',\n      145: '\\u2018',\n      146: '\\u2019',\n      147: '\\u201C',\n      148: '\\u201D',\n      149: '\\u2022',\n      150: '\\u2013',\n      151: '\\u2014',\n      152: '\\u02DC',\n      153: '\\u2122',\n      154: '\\u0161',\n      155: '\\u203A',\n      156: '\\u0153',\n      158: '\\u017e',\n      159: '\\u0178'\n    };\n    const baseEntities = {\n      '\"': '&quot;',\n      '\\'': '&#39;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '&': '&amp;',\n      '`': '&#96;'\n    };\n    const reverseEntities = {\n      '&lt;': '<',\n      '&gt;': '>',\n      '&amp;': '&',\n      '&quot;': '\"',\n      '&apos;': `'`\n    };\n    const nativeDecode = text => {\n      const elm = SugarElement.fromTag('div').dom;\n      elm.innerHTML = text;\n      return elm.textContent || elm.innerText || text;\n    };\n    const buildEntitiesLookup = (items, radix) => {\n      const lookup = {};\n      if (items) {\n        const itemList = items.split(',');\n        radix = radix || 10;\n        for (let i = 0; i < itemList.length; i += 2) {\n          const chr = String.fromCharCode(parseInt(itemList[i], radix));\n          if (!baseEntities[chr]) {\n            const entity = '&' + itemList[i + 1] + ';';\n            lookup[chr] = entity;\n            lookup[entity] = chr;\n          }\n        }\n        return lookup;\n      } else {\n        return undefined;\n      }\n    };\n    const namedEntities = buildEntitiesLookup('50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' + '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' + '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' + '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' + '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' + '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' + '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' + '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' + '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' + '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' + 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' + 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' + 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' + 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' + 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' + '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' + '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' + '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' + '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' + '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' + 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' + 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' + 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' + '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' + '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro', 32);\n    const encodeRaw = (text, attr) => text.replace(attr ? attrsCharsRegExp : textCharsRegExp, chr => {\n      return baseEntities[chr] || chr;\n    });\n    const encodeAllRaw = text => ('' + text).replace(rawCharsRegExp, chr => {\n      return baseEntities[chr] || chr;\n    });\n    const encodeNumeric = (text, attr) => text.replace(attr ? attrsCharsRegExp : textCharsRegExp, chr => {\n      if (chr.length > 1) {\n        return '&#' + ((chr.charCodeAt(0) - 55296) * 1024 + (chr.charCodeAt(1) - 56320) + 65536) + ';';\n      }\n      return baseEntities[chr] || '&#' + chr.charCodeAt(0) + ';';\n    });\n    const encodeNamed = (text, attr, entities) => {\n      const resolveEntities = entities || namedEntities;\n      return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, chr => {\n        return baseEntities[chr] || resolveEntities[chr] || chr;\n      });\n    };\n    const getEncodeFunc = (name, entities) => {\n      const entitiesMap = buildEntitiesLookup(entities) || namedEntities;\n      const encodeNamedAndNumeric = (text, attr) => text.replace(attr ? attrsCharsRegExp : textCharsRegExp, chr => {\n        if (baseEntities[chr] !== undefined) {\n          return baseEntities[chr];\n        }\n        if (entitiesMap[chr] !== undefined) {\n          return entitiesMap[chr];\n        }\n        if (chr.length > 1) {\n          return '&#' + ((chr.charCodeAt(0) - 55296) * 1024 + (chr.charCodeAt(1) - 56320) + 65536) + ';';\n        }\n        return '&#' + chr.charCodeAt(0) + ';';\n      });\n      const encodeCustomNamed = (text, attr) => {\n        return encodeNamed(text, attr, entitiesMap);\n      };\n      const nameMap = makeMap$3(name.replace(/\\+/g, ','));\n      if (nameMap.named && nameMap.numeric) {\n        return encodeNamedAndNumeric;\n      }\n      if (nameMap.named) {\n        if (entities) {\n          return encodeCustomNamed;\n        }\n        return encodeNamed;\n      }\n      if (nameMap.numeric) {\n        return encodeNumeric;\n      }\n      return encodeRaw;\n    };\n    const decode = text => text.replace(entityRegExp, (all, numeric) => {\n      if (numeric) {\n        if (numeric.charAt(0).toLowerCase() === 'x') {\n          numeric = parseInt(numeric.substr(1), 16);\n        } else {\n          numeric = parseInt(numeric, 10);\n        }\n        if (numeric > 65535) {\n          numeric -= 65536;\n          return String.fromCharCode(55296 + (numeric >> 10), 56320 + (numeric & 1023));\n        }\n        return asciiMap[numeric] || String.fromCharCode(numeric);\n      }\n      return reverseEntities[all] || namedEntities[all] || nativeDecode(all);\n    });\n    const Entities = {\n      encodeRaw,\n      encodeAllRaw,\n      encodeNumeric,\n      encodeNamed,\n      getEncodeFunc,\n      decode\n    };\n\n    const split$1 = (items, delim) => {\n      items = Tools.trim(items);\n      return items ? items.split(delim || ' ') : [];\n    };\n    const patternToRegExp = str => new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$');\n    const isRegExp$1 = obj => isObject(obj) && obj.source && Object.prototype.toString.call(obj) === '[object RegExp]';\n    const deepCloneElementRule = obj => {\n      const helper = value => {\n        if (isArray$1(value)) {\n          return map$3(value, helper);\n        } else if (isRegExp$1(value)) {\n          return new RegExp(value.source, value.flags);\n        } else if (isObject(value)) {\n          return map$2(value, helper);\n        } else {\n          return value;\n        }\n      };\n      return helper(obj);\n    };\n\n    const parseCustomElementsRules = value => {\n      const customElementRegExp = /^(~)?(.+)$/;\n      return bind$3(split$1(value, ','), rule => {\n        const matches = customElementRegExp.exec(rule);\n        if (matches) {\n          const inline = matches[1] === '~';\n          const cloneName = inline ? 'span' : 'div';\n          const name = matches[2];\n          return [{\n              cloneName,\n              name\n            }];\n        } else {\n          return [];\n        }\n      });\n    };\n\n    const getGlobalAttributeSet = type => {\n      return Object.freeze([\n        'id',\n        'accesskey',\n        'class',\n        'dir',\n        'lang',\n        'style',\n        'tabindex',\n        'title',\n        'role',\n        ...type !== 'html4' ? [\n          'contenteditable',\n          'contextmenu',\n          'draggable',\n          'dropzone',\n          'hidden',\n          'spellcheck',\n          'translate'\n        ] : [],\n        ...type !== 'html5-strict' ? ['xml:lang'] : []\n      ]);\n    };\n\n    const getElementSetsAsStrings = type => {\n      let blockContent;\n      let phrasingContent;\n      blockContent = 'address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul';\n      phrasingContent = 'a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd ' + 'label map noscript object q s samp script select small span strong sub sup ' + 'textarea u var #text #comment';\n      if (type !== 'html4') {\n        const transparentContent = 'a ins del canvas map';\n        blockContent += ' article aside details dialog figure main header footer hgroup section nav ' + transparentContent;\n        phrasingContent += ' audio canvas command data datalist mark meter output picture ' + 'progress time wbr video ruby bdi keygen svg';\n      }\n      if (type !== 'html5-strict') {\n        const html4PhrasingContent = 'acronym applet basefont big font strike tt';\n        phrasingContent = [\n          phrasingContent,\n          html4PhrasingContent\n        ].join(' ');\n        const html4BlockContent = 'center dir isindex noframes';\n        blockContent = [\n          blockContent,\n          html4BlockContent\n        ].join(' ');\n      }\n      const flowContent = [\n        blockContent,\n        phrasingContent\n      ].join(' ');\n      return {\n        blockContent,\n        phrasingContent,\n        flowContent\n      };\n    };\n    const getElementSets = type => {\n      const {blockContent, phrasingContent, flowContent} = getElementSetsAsStrings(type);\n      const toArr = value => {\n        return Object.freeze(value.split(' '));\n      };\n      return Object.freeze({\n        blockContent: toArr(blockContent),\n        phrasingContent: toArr(phrasingContent),\n        flowContent: toArr(flowContent)\n      });\n    };\n\n    const cachedSets = {\n      'html4': cached(() => getElementSets('html4')),\n      'html5': cached(() => getElementSets('html5')),\n      'html5-strict': cached(() => getElementSets('html5-strict'))\n    };\n    const getElementsPreset = (type, name) => {\n      const {blockContent, phrasingContent, flowContent} = cachedSets[type]();\n      if (name === 'blocks') {\n        return Optional.some(blockContent);\n      } else if (name === 'phrasing') {\n        return Optional.some(phrasingContent);\n      } else if (name === 'flow') {\n        return Optional.some(flowContent);\n      } else {\n        return Optional.none();\n      }\n    };\n\n    const makeSchema = type => {\n      const globalAttributes = getGlobalAttributeSet(type);\n      const {phrasingContent, flowContent} = getElementSetsAsStrings(type);\n      const schema = {};\n      const addElement = (name, attributes, children) => {\n        schema[name] = {\n          attributes: mapToObject(attributes, constant({})),\n          attributesOrder: attributes,\n          children: mapToObject(children, constant({}))\n        };\n      };\n      const add = (name, attributes = '', children = '') => {\n        const childNames = split$1(children);\n        const names = split$1(name);\n        let ni = names.length;\n        const allAttributes = [\n          ...globalAttributes,\n          ...split$1(attributes)\n        ];\n        while (ni--) {\n          addElement(names[ni], allAttributes.slice(), childNames);\n        }\n      };\n      const addAttrs = (name, attributes) => {\n        const names = split$1(name);\n        const attrs = split$1(attributes);\n        let ni = names.length;\n        while (ni--) {\n          const schemaItem = schema[names[ni]];\n          for (let i = 0, l = attrs.length; i < l; i++) {\n            schemaItem.attributes[attrs[i]] = {};\n            schemaItem.attributesOrder.push(attrs[i]);\n          }\n        }\n      };\n      if (type !== 'html5-strict') {\n        const html4PhrasingContent = 'acronym applet basefont big font strike tt';\n        each$e(split$1(html4PhrasingContent), name => {\n          add(name, '', phrasingContent);\n        });\n        const html4BlockContent = 'center dir isindex noframes';\n        each$e(split$1(html4BlockContent), name => {\n          add(name, '', flowContent);\n        });\n      }\n      add('html', 'manifest', 'head body');\n      add('head', '', 'base command link meta noscript script style title');\n      add('title hr noscript br');\n      add('base', 'href target');\n      add('link', 'href rel media hreflang type sizes hreflang');\n      add('meta', 'name http-equiv content charset');\n      add('style', 'media type scoped');\n      add('script', 'src async defer type charset');\n      add('body', 'onafterprint onbeforeprint onbeforeunload onblur onerror onfocus ' + 'onhashchange onload onmessage onoffline ononline onpagehide onpageshow ' + 'onpopstate onresize onscroll onstorage onunload', flowContent);\n      add('dd div', '', flowContent);\n      add('address dt caption', '', type === 'html4' ? phrasingContent : flowContent);\n      add('h1 h2 h3 h4 h5 h6 pre p abbr code var samp kbd sub sup i b u bdo span legend em strong small s cite dfn', '', phrasingContent);\n      add('blockquote', 'cite', flowContent);\n      add('ol', 'reversed start type', 'li');\n      add('ul', '', 'li');\n      add('li', 'value', flowContent);\n      add('dl', '', 'dt dd');\n      add('a', 'href target rel media hreflang type', type === 'html4' ? phrasingContent : flowContent);\n      add('q', 'cite', phrasingContent);\n      add('ins del', 'cite datetime', flowContent);\n      add('img', 'src sizes srcset alt usemap ismap width height');\n      add('iframe', 'src name width height', flowContent);\n      add('embed', 'src type width height');\n      add('object', 'data type typemustmatch name usemap form width height', [\n        flowContent,\n        'param'\n      ].join(' '));\n      add('param', 'name value');\n      add('map', 'name', [\n        flowContent,\n        'area'\n      ].join(' '));\n      add('area', 'alt coords shape href target rel media hreflang type');\n      add('table', 'border', 'caption colgroup thead tfoot tbody tr' + (type === 'html4' ? ' col' : ''));\n      add('colgroup', 'span', 'col');\n      add('col', 'span');\n      add('tbody thead tfoot', '', 'tr');\n      add('tr', '', 'td th');\n      add('td', 'colspan rowspan headers', flowContent);\n      add('th', 'colspan rowspan headers scope abbr', flowContent);\n      add('form', 'accept-charset action autocomplete enctype method name novalidate target', flowContent);\n      add('fieldset', 'disabled form name', [\n        flowContent,\n        'legend'\n      ].join(' '));\n      add('label', 'form for', phrasingContent);\n      add('input', 'accept alt autocomplete checked dirname disabled form formaction formenctype formmethod formnovalidate ' + 'formtarget height list max maxlength min multiple name pattern readonly required size src step type value width');\n      add('button', 'disabled form formaction formenctype formmethod formnovalidate formtarget name type value', type === 'html4' ? flowContent : phrasingContent);\n      add('select', 'disabled form multiple name required size', 'option optgroup');\n      add('optgroup', 'disabled label', 'option');\n      add('option', 'disabled label selected value');\n      add('textarea', 'cols dirname disabled form maxlength name readonly required rows wrap');\n      add('menu', 'type label', [\n        flowContent,\n        'li'\n      ].join(' '));\n      add('noscript', '', flowContent);\n      if (type !== 'html4') {\n        add('wbr');\n        add('ruby', '', [\n          phrasingContent,\n          'rt rp'\n        ].join(' '));\n        add('figcaption', '', flowContent);\n        add('mark rt rp bdi', '', phrasingContent);\n        add('summary', '', [\n          phrasingContent,\n          'h1 h2 h3 h4 h5 h6'\n        ].join(' '));\n        add('canvas', 'width height', flowContent);\n        add('data', 'value', phrasingContent);\n        add('video', 'src crossorigin poster preload autoplay mediagroup loop ' + 'muted controls width height buffered', [\n          flowContent,\n          'track source'\n        ].join(' '));\n        add('audio', 'src crossorigin preload autoplay mediagroup loop muted controls ' + 'buffered volume', [\n          flowContent,\n          'track source'\n        ].join(' '));\n        add('picture', '', 'img source');\n        add('source', 'src srcset type media sizes');\n        add('track', 'kind src srclang label default');\n        add('datalist', '', [\n          phrasingContent,\n          'option'\n        ].join(' '));\n        add('article section nav aside main header footer', '', flowContent);\n        add('hgroup', '', 'h1 h2 h3 h4 h5 h6');\n        add('figure', '', [\n          flowContent,\n          'figcaption'\n        ].join(' '));\n        add('time', 'datetime', phrasingContent);\n        add('dialog', 'open', flowContent);\n        add('command', 'type label icon disabled checked radiogroup command');\n        add('output', 'for form name', phrasingContent);\n        add('progress', 'value max', phrasingContent);\n        add('meter', 'value min max low high optimum', phrasingContent);\n        add('details', 'open', [\n          flowContent,\n          'summary'\n        ].join(' '));\n        add('keygen', 'autofocus challenge disabled form keytype name');\n        addElement('svg', 'id tabindex lang xml:space class style x y width height viewBox preserveAspectRatio zoomAndPan transform'.split(' '), []);\n      }\n      if (type !== 'html5-strict') {\n        addAttrs('script', 'language xml:space');\n        addAttrs('style', 'xml:space');\n        addAttrs('object', 'declare classid code codebase codetype archive standby align border hspace vspace');\n        addAttrs('embed', 'align name hspace vspace');\n        addAttrs('param', 'valuetype type');\n        addAttrs('a', 'charset name rev shape coords');\n        addAttrs('br', 'clear');\n        addAttrs('applet', 'codebase archive code object alt name width height align hspace vspace');\n        addAttrs('img', 'name longdesc align border hspace vspace');\n        addAttrs('iframe', 'longdesc frameborder marginwidth marginheight scrolling align');\n        addAttrs('font basefont', 'size color face');\n        addAttrs('input', 'usemap align');\n        addAttrs('select');\n        addAttrs('textarea');\n        addAttrs('h1 h2 h3 h4 h5 h6 div p legend caption', 'align');\n        addAttrs('ul', 'type compact');\n        addAttrs('li', 'type');\n        addAttrs('ol dl menu dir', 'compact');\n        addAttrs('pre', 'width xml:space');\n        addAttrs('hr', 'align noshade size width');\n        addAttrs('isindex', 'prompt');\n        addAttrs('table', 'summary width frame rules cellspacing cellpadding align bgcolor');\n        addAttrs('col', 'width align char charoff valign');\n        addAttrs('colgroup', 'width align char charoff valign');\n        addAttrs('thead', 'align char charoff valign');\n        addAttrs('tr', 'align char charoff valign bgcolor');\n        addAttrs('th', 'axis align char charoff valign nowrap bgcolor width height');\n        addAttrs('form', 'accept');\n        addAttrs('td', 'abbr axis scope align char charoff valign nowrap bgcolor width height');\n        addAttrs('tfoot', 'align char charoff valign');\n        addAttrs('tbody', 'align char charoff valign');\n        addAttrs('area', 'nohref');\n        addAttrs('body', 'background bgcolor text link vlink alink');\n      }\n      if (type !== 'html4') {\n        addAttrs('input button select textarea', 'autofocus');\n        addAttrs('input textarea', 'placeholder');\n        addAttrs('a', 'download');\n        addAttrs('link script img', 'crossorigin');\n        addAttrs('img', 'loading');\n        addAttrs('iframe', 'sandbox seamless allow allowfullscreen loading');\n      }\n      if (type !== 'html4') {\n        each$e([\n          schema.video,\n          schema.audio\n        ], item => {\n          delete item.children.audio;\n          delete item.children.video;\n        });\n      }\n      each$e(split$1('a form meter progress dfn'), name => {\n        if (schema[name]) {\n          delete schema[name].children[name];\n        }\n      });\n      delete schema.caption.children.table;\n      delete schema.script;\n      return schema;\n    };\n\n    const prefixToOperation = prefix => prefix === '-' ? 'remove' : 'add';\n    const parseValidChild = name => {\n      const validChildRegExp = /^(@?)([A-Za-z0-9_\\-.\\u00b7\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u037d\\u037f-\\u1fff\\u200c-\\u200d\\u203f-\\u2040\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd]+)$/;\n      return Optional.from(validChildRegExp.exec(name)).map(matches => ({\n        preset: matches[1] === '@',\n        name: matches[2]\n      }));\n    };\n    const parseValidChildrenRules = value => {\n      const childRuleRegExp = /^([+\\-]?)([A-Za-z0-9_\\-.\\u00b7\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u037d\\u037f-\\u1fff\\u200c-\\u200d\\u203f-\\u2040\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd]+)\\[([^\\]]+)]$/;\n      return bind$3(split$1(value, ','), rule => {\n        const matches = childRuleRegExp.exec(rule);\n        if (matches) {\n          const prefix = matches[1];\n          const operation = prefix ? prefixToOperation(prefix) : 'replace';\n          const name = matches[2];\n          const validChildren = bind$3(split$1(matches[3], '|'), validChild => parseValidChild(validChild).toArray());\n          return [{\n              operation,\n              name,\n              validChildren\n            }];\n        } else {\n          return [];\n        }\n      });\n    };\n\n    const parseValidElementsAttrDataIntoElement = (attrData, targetElement) => {\n      const attrRuleRegExp = /^([!\\-])?(\\w+[\\\\:]:\\w+|[^=~<]+)?(?:([=~<])(.*))?$/;\n      const hasPatternsRegExp = /[*?+]/;\n      const {attributes, attributesOrder} = targetElement;\n      return each$e(split$1(attrData, '|'), rule => {\n        const matches = attrRuleRegExp.exec(rule);\n        if (matches) {\n          const attr = {};\n          const attrType = matches[1];\n          const attrName = matches[2].replace(/[\\\\:]:/g, ':');\n          const attrPrefix = matches[3];\n          const value = matches[4];\n          if (attrType === '!') {\n            targetElement.attributesRequired = targetElement.attributesRequired || [];\n            targetElement.attributesRequired.push(attrName);\n            attr.required = true;\n          }\n          if (attrType === '-') {\n            delete attributes[attrName];\n            attributesOrder.splice(Tools.inArray(attributesOrder, attrName), 1);\n            return;\n          }\n          if (attrPrefix) {\n            if (attrPrefix === '=') {\n              targetElement.attributesDefault = targetElement.attributesDefault || [];\n              targetElement.attributesDefault.push({\n                name: attrName,\n                value\n              });\n              attr.defaultValue = value;\n            } else if (attrPrefix === '~') {\n              targetElement.attributesForced = targetElement.attributesForced || [];\n              targetElement.attributesForced.push({\n                name: attrName,\n                value\n              });\n              attr.forcedValue = value;\n            } else if (attrPrefix === '<') {\n              attr.validValues = Tools.makeMap(value, '?');\n            }\n          }\n          if (hasPatternsRegExp.test(attrName)) {\n            const attrPattern = attr;\n            targetElement.attributePatterns = targetElement.attributePatterns || [];\n            attrPattern.pattern = patternToRegExp(attrName);\n            targetElement.attributePatterns.push(attrPattern);\n          } else {\n            if (!attributes[attrName]) {\n              attributesOrder.push(attrName);\n            }\n            attributes[attrName] = attr;\n          }\n        }\n      });\n    };\n    const cloneAttributesInto = (from, to) => {\n      each$d(from.attributes, (value, key) => {\n        to.attributes[key] = value;\n      });\n      to.attributesOrder.push(...from.attributesOrder);\n    };\n    const parseValidElementsRules = (globalElement, validElements) => {\n      const elementRuleRegExp = /^([#+\\-])?([^\\[!\\/]+)(?:\\/([^\\[!]+))?(?:(!?)\\[([^\\]]+)])?$/;\n      return bind$3(split$1(validElements, ','), rule => {\n        const matches = elementRuleRegExp.exec(rule);\n        if (matches) {\n          const prefix = matches[1];\n          const elementName = matches[2];\n          const outputName = matches[3];\n          const attrsPrefix = matches[4];\n          const attrData = matches[5];\n          const element = {\n            attributes: {},\n            attributesOrder: []\n          };\n          globalElement.each(el => cloneAttributesInto(el, element));\n          if (prefix === '#') {\n            element.paddEmpty = true;\n          } else if (prefix === '-') {\n            element.removeEmpty = true;\n          }\n          if (attrsPrefix === '!') {\n            element.removeEmptyAttrs = true;\n          }\n          if (attrData) {\n            parseValidElementsAttrDataIntoElement(attrData, element);\n          }\n          if (outputName) {\n            element.outputName = elementName;\n          }\n          if (elementName === '@') {\n            if (globalElement.isNone()) {\n              globalElement = Optional.some(element);\n            } else {\n              return [];\n            }\n          }\n          return [outputName ? {\n              name: elementName,\n              element,\n              aliasName: outputName\n            } : {\n              name: elementName,\n              element\n            }];\n        } else {\n          return [];\n        }\n      });\n    };\n\n    const mapCache = {};\n    const makeMap$2 = Tools.makeMap, each$b = Tools.each, extend$2 = Tools.extend, explode$2 = Tools.explode;\n    const createMap = (defaultValue, extendWith = {}) => {\n      const value = makeMap$2(defaultValue, ' ', makeMap$2(defaultValue.toUpperCase(), ' '));\n      return extend$2(value, extendWith);\n    };\n    const getTextRootBlockElements = schema => createMap('td th li dt dd figcaption caption details summary', schema.getTextBlockElements());\n    const compileElementMap = (value, mode) => {\n      if (value) {\n        const styles = {};\n        if (isString(value)) {\n          value = { '*': value };\n        }\n        each$b(value, (value, key) => {\n          styles[key] = styles[key.toUpperCase()] = mode === 'map' ? makeMap$2(value, /[, ]/) : explode$2(value, /[, ]/);\n        });\n        return styles;\n      } else {\n        return undefined;\n      }\n    };\n    const Schema = (settings = {}) => {\n      var _a;\n      const elements = {};\n      const children = {};\n      let patternElements = [];\n      const customElementsMap = {};\n      const specialElements = {};\n      const createLookupTable = (option, defaultValue, extendWith) => {\n        const value = settings[option];\n        if (!value) {\n          let newValue = mapCache[option];\n          if (!newValue) {\n            newValue = createMap(defaultValue, extendWith);\n            mapCache[option] = newValue;\n          }\n          return newValue;\n        } else {\n          return makeMap$2(value, /[, ]/, makeMap$2(value.toUpperCase(), /[, ]/));\n        }\n      };\n      const schemaType = (_a = settings.schema) !== null && _a !== void 0 ? _a : 'html5';\n      const schemaItems = makeSchema(schemaType);\n      if (settings.verify_html === false) {\n        settings.valid_elements = '*[*]';\n      }\n      const validStyles = compileElementMap(settings.valid_styles);\n      const invalidStyles = compileElementMap(settings.invalid_styles, 'map');\n      const validClasses = compileElementMap(settings.valid_classes, 'map');\n      const whitespaceElementsMap = createLookupTable('whitespace_elements', 'pre script noscript style textarea video audio iframe object code');\n      const selfClosingElementsMap = createLookupTable('self_closing_elements', 'colgroup dd dt li option p td tfoot th thead tr');\n      const voidElementsMap = createLookupTable('void_elements', 'area base basefont br col frame hr img input isindex link ' + 'meta param embed source wbr track');\n      const boolAttrMap = createLookupTable('boolean_attributes', 'checked compact declare defer disabled ismap multiple nohref noresize ' + 'noshade nowrap readonly selected autoplay loop controls allowfullscreen');\n      const nonEmptyOrMoveCaretBeforeOnEnter = 'td th iframe video audio object script code';\n      const nonEmptyElementsMap = createLookupTable('non_empty_elements', nonEmptyOrMoveCaretBeforeOnEnter + ' pre svg textarea summary', voidElementsMap);\n      const moveCaretBeforeOnEnterElementsMap = createLookupTable('move_caret_before_on_enter_elements', nonEmptyOrMoveCaretBeforeOnEnter + ' table', voidElementsMap);\n      const headings = 'h1 h2 h3 h4 h5 h6';\n      const textBlockElementsMap = createLookupTable('text_block_elements', headings + ' p div address pre form ' + 'blockquote center dir fieldset header footer article section hgroup aside main nav figure');\n      const blockElementsMap = createLookupTable('block_elements', 'hr table tbody thead tfoot ' + 'th tr td li ol ul caption dl dt dd noscript menu isindex option ' + 'datalist select optgroup figcaption details summary html body multicol listing', textBlockElementsMap);\n      const textInlineElementsMap = createLookupTable('text_inline_elements', 'span strong b em i font s strike u var cite ' + 'dfn code mark q sup sub samp');\n      const transparentElementsMap = createLookupTable('transparent_elements', 'a ins del canvas map');\n      const wrapBlockElementsMap = createLookupTable('wrap_block_elements', 'pre ' + headings);\n      each$b('script noscript iframe noframes noembed title style textarea xmp plaintext'.split(' '), name => {\n        specialElements[name] = new RegExp('</' + name + '[^>]*>', 'gi');\n      });\n      const addValidElements = validElements => {\n        const globalElement = Optional.from(elements['@']);\n        const hasPatternsRegExp = /[*?+]/;\n        each$e(parseValidElementsRules(globalElement, validElements !== null && validElements !== void 0 ? validElements : ''), ({name, element, aliasName}) => {\n          if (aliasName) {\n            elements[aliasName] = element;\n          }\n          if (hasPatternsRegExp.test(name)) {\n            const patternElement = element;\n            patternElement.pattern = patternToRegExp(name);\n            patternElements.push(patternElement);\n          } else {\n            elements[name] = element;\n          }\n        });\n      };\n      const setValidElements = validElements => {\n        patternElements = [];\n        each$e(keys(elements), name => {\n          delete elements[name];\n        });\n        addValidElements(validElements);\n      };\n      const addCustomElement = (name, spec) => {\n        var _a, _b;\n        delete mapCache.text_block_elements;\n        delete mapCache.block_elements;\n        const inline = spec.extends ? !isBlock(spec.extends) : false;\n        const cloneName = spec.extends;\n        children[name] = cloneName ? children[cloneName] : {};\n        customElementsMap[name] = cloneName !== null && cloneName !== void 0 ? cloneName : name;\n        nonEmptyElementsMap[name.toUpperCase()] = {};\n        nonEmptyElementsMap[name] = {};\n        if (!inline) {\n          blockElementsMap[name.toUpperCase()] = {};\n          blockElementsMap[name] = {};\n        }\n        if (cloneName && !elements[name] && elements[cloneName]) {\n          const customRule = deepCloneElementRule(elements[cloneName]);\n          delete customRule.removeEmptyAttrs;\n          delete customRule.removeEmpty;\n          elements[name] = customRule;\n        } else {\n          elements[name] = {\n            attributesOrder: [],\n            attributes: {}\n          };\n        }\n        if (isArray$1(spec.attributes)) {\n          const processAttrName = name => {\n            customRule.attributesOrder.push(name);\n            customRule.attributes[name] = {};\n          };\n          const customRule = (_a = elements[name]) !== null && _a !== void 0 ? _a : {};\n          delete customRule.attributesDefault;\n          delete customRule.attributesForced;\n          delete customRule.attributePatterns;\n          delete customRule.attributesRequired;\n          customRule.attributesOrder = [];\n          customRule.attributes = {};\n          each$e(spec.attributes, attrName => {\n            const globalAttrs = getGlobalAttributeSet(schemaType);\n            parseValidChild(attrName).each(({preset, name}) => {\n              if (preset) {\n                if (name === 'global') {\n                  each$e(globalAttrs, processAttrName);\n                }\n              } else {\n                processAttrName(name);\n              }\n            });\n          });\n          elements[name] = customRule;\n        }\n        if (isBoolean(spec.padEmpty)) {\n          const customRule = (_b = elements[name]) !== null && _b !== void 0 ? _b : {};\n          customRule.paddEmpty = spec.padEmpty;\n          elements[name] = customRule;\n        }\n        if (isArray$1(spec.children)) {\n          const customElementChildren = {};\n          const processNodeName = name => {\n            customElementChildren[name] = {};\n          };\n          const processPreset = name => {\n            getElementsPreset(schemaType, name).each(names => {\n              each$e(names, processNodeName);\n            });\n          };\n          each$e(spec.children, child => {\n            parseValidChild(child).each(({preset, name}) => {\n              if (preset) {\n                processPreset(name);\n              } else {\n                processNodeName(name);\n              }\n            });\n          });\n          children[name] = customElementChildren;\n        }\n        if (cloneName) {\n          each$d(children, (element, elmName) => {\n            if (element[cloneName]) {\n              children[elmName] = element = extend$2({}, children[elmName]);\n              element[name] = element[cloneName];\n            }\n          });\n        }\n      };\n      const addCustomElementsFromString = customElements => {\n        each$e(parseCustomElementsRules(customElements !== null && customElements !== void 0 ? customElements : ''), ({name, cloneName}) => {\n          addCustomElement(name, { extends: cloneName });\n        });\n      };\n      const addCustomElements = customElements => {\n        if (isObject(customElements)) {\n          each$d(customElements, (spec, name) => addCustomElement(name, spec));\n        } else if (isString(customElements)) {\n          addCustomElementsFromString(customElements);\n        }\n      };\n      const addValidChildren = validChildren => {\n        each$e(parseValidChildrenRules(validChildren !== null && validChildren !== void 0 ? validChildren : ''), ({operation, name, validChildren}) => {\n          const parent = operation === 'replace' ? { '#comment': {} } : children[name];\n          const processNodeName = name => {\n            if (operation === 'remove') {\n              delete parent[name];\n            } else {\n              parent[name] = {};\n            }\n          };\n          const processPreset = name => {\n            getElementsPreset(schemaType, name).each(names => {\n              each$e(names, processNodeName);\n            });\n          };\n          each$e(validChildren, ({preset, name}) => {\n            if (preset) {\n              processPreset(name);\n            } else {\n              processNodeName(name);\n            }\n          });\n          children[name] = parent;\n        });\n      };\n      const getElementRule = name => {\n        const element = elements[name];\n        if (element) {\n          return element;\n        }\n        let i = patternElements.length;\n        while (i--) {\n          const patternElement = patternElements[i];\n          if (patternElement.pattern.test(name)) {\n            return patternElement;\n          }\n        }\n        return undefined;\n      };\n      const setup = () => {\n        if (!settings.valid_elements) {\n          each$b(schemaItems, (element, name) => {\n            elements[name] = {\n              attributes: element.attributes,\n              attributesOrder: element.attributesOrder\n            };\n            children[name] = element.children;\n          });\n          each$b(split$1('strong/b em/i'), item => {\n            const items = split$1(item, '/');\n            elements[items[1]].outputName = items[0];\n          });\n          each$b(textInlineElementsMap, (_val, name) => {\n            if (elements[name]) {\n              if (settings.padd_empty_block_inline_children) {\n                elements[name].paddInEmptyBlock = true;\n              }\n              elements[name].removeEmpty = true;\n            }\n          });\n          each$b(split$1('ol ul blockquote a table tbody'), name => {\n            if (elements[name]) {\n              elements[name].removeEmpty = true;\n            }\n          });\n          each$b(split$1('p h1 h2 h3 h4 h5 h6 th td pre div address caption li summary'), name => {\n            if (elements[name]) {\n              elements[name].paddEmpty = true;\n            }\n          });\n          each$b(split$1('span'), name => {\n            elements[name].removeEmptyAttrs = true;\n          });\n        } else {\n          setValidElements(settings.valid_elements);\n          each$b(schemaItems, (element, name) => {\n            children[name] = element.children;\n          });\n        }\n        delete elements.svg;\n        addCustomElements(settings.custom_elements);\n        addValidChildren(settings.valid_children);\n        addValidElements(settings.extended_valid_elements);\n        addValidChildren('+ol[ul|ol],+ul[ul|ol]');\n        each$b({\n          dd: 'dl',\n          dt: 'dl',\n          li: 'ul ol',\n          td: 'tr',\n          th: 'tr',\n          tr: 'tbody thead tfoot',\n          tbody: 'table',\n          thead: 'table',\n          tfoot: 'table',\n          legend: 'fieldset',\n          area: 'map',\n          param: 'video audio object'\n        }, (parents, item) => {\n          if (elements[item]) {\n            elements[item].parentsRequired = split$1(parents);\n          }\n        });\n        if (settings.invalid_elements) {\n          each$b(explode$2(settings.invalid_elements), item => {\n            if (elements[item]) {\n              delete elements[item];\n            }\n          });\n        }\n        if (!getElementRule('span')) {\n          addValidElements('span[!data-mce-type|*]');\n        }\n      };\n      const getValidStyles = constant(validStyles);\n      const getInvalidStyles = constant(invalidStyles);\n      const getValidClasses = constant(validClasses);\n      const getBoolAttrs = constant(boolAttrMap);\n      const getBlockElements = constant(blockElementsMap);\n      const getTextBlockElements = constant(textBlockElementsMap);\n      const getTextInlineElements = constant(textInlineElementsMap);\n      const getVoidElements = constant(Object.seal(voidElementsMap));\n      const getSelfClosingElements = constant(selfClosingElementsMap);\n      const getNonEmptyElements = constant(nonEmptyElementsMap);\n      const getMoveCaretBeforeOnEnterElements = constant(moveCaretBeforeOnEnterElementsMap);\n      const getWhitespaceElements = constant(whitespaceElementsMap);\n      const getTransparentElements = constant(transparentElementsMap);\n      const getWrapBlockElements = constant(wrapBlockElementsMap);\n      const getSpecialElements = constant(Object.seal(specialElements));\n      const isValidChild = (name, child) => {\n        const parent = children[name.toLowerCase()];\n        return !!(parent && parent[child.toLowerCase()]);\n      };\n      const isValid = (name, attr) => {\n        const rule = getElementRule(name);\n        if (rule) {\n          if (attr) {\n            if (rule.attributes[attr]) {\n              return true;\n            }\n            const attrPatterns = rule.attributePatterns;\n            if (attrPatterns) {\n              let i = attrPatterns.length;\n              while (i--) {\n                if (attrPatterns[i].pattern.test(attr)) {\n                  return true;\n                }\n              }\n            }\n          } else {\n            return true;\n          }\n        }\n        return false;\n      };\n      const isBlock = name => has$2(getBlockElements(), name);\n      const isInline = name => !startsWith(name, '#') && isValid(name) && !isBlock(name);\n      const isWrapper = name => has$2(getWrapBlockElements(), name) || isInline(name);\n      const getCustomElements = constant(customElementsMap);\n      setup();\n      return {\n        type: schemaType,\n        children,\n        elements,\n        getValidStyles,\n        getValidClasses,\n        getBlockElements,\n        getInvalidStyles,\n        getVoidElements,\n        getTextBlockElements,\n        getTextInlineElements,\n        getBoolAttrs,\n        getElementRule,\n        getSelfClosingElements,\n        getNonEmptyElements,\n        getMoveCaretBeforeOnEnterElements,\n        getWhitespaceElements,\n        getTransparentElements,\n        getSpecialElements,\n        isValidChild,\n        isValid,\n        isBlock,\n        isInline,\n        isWrapper,\n        getCustomElements,\n        addValidElements,\n        setValidElements,\n        addCustomElements,\n        addValidChildren\n      };\n    };\n\n    const hexColour = value => ({ value: normalizeHex(value) });\n    const normalizeHex = hex => removeLeading(hex, '#').toUpperCase();\n    const toHex = component => {\n      const hex = component.toString(16);\n      return (hex.length === 1 ? '0' + hex : hex).toUpperCase();\n    };\n    const fromRgba = rgbaColour => {\n      const value = toHex(rgbaColour.red) + toHex(rgbaColour.green) + toHex(rgbaColour.blue);\n      return hexColour(value);\n    };\n\n    const rgbRegex = /^\\s*rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/i;\n    const rgbaRegex = /^\\s*rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d?(?:\\.\\d+)?)\\s*\\)\\s*$/i;\n    const rgbaColour = (red, green, blue, alpha) => ({\n      red,\n      green,\n      blue,\n      alpha\n    });\n    const fromStringValues = (red, green, blue, alpha) => {\n      const r = parseInt(red, 10);\n      const g = parseInt(green, 10);\n      const b = parseInt(blue, 10);\n      const a = parseFloat(alpha);\n      return rgbaColour(r, g, b, a);\n    };\n    const fromString = rgbaString => {\n      if (rgbaString === 'transparent') {\n        return Optional.some(rgbaColour(0, 0, 0, 0));\n      }\n      const rgbMatch = rgbRegex.exec(rgbaString);\n      if (rgbMatch !== null) {\n        return Optional.some(fromStringValues(rgbMatch[1], rgbMatch[2], rgbMatch[3], '1'));\n      }\n      const rgbaMatch = rgbaRegex.exec(rgbaString);\n      if (rgbaMatch !== null) {\n        return Optional.some(fromStringValues(rgbaMatch[1], rgbaMatch[2], rgbaMatch[3], rgbaMatch[4]));\n      }\n      return Optional.none();\n    };\n    const toString = rgba => `rgba(${ rgba.red },${ rgba.green },${ rgba.blue },${ rgba.alpha })`;\n\n    const rgbaToHexString = color => fromString(color).map(fromRgba).map(h => '#' + h.value).getOr(color);\n\n    const Styles = (settings = {}, schema) => {\n      const urlOrStrRegExp = /(?:url(?:(?:\\(\\s*\\\"([^\\\"]+)\\\"\\s*\\))|(?:\\(\\s*\\'([^\\']+)\\'\\s*\\))|(?:\\(\\s*([^)\\s]+)\\s*\\))))|(?:\\'([^\\']+)\\')|(?:\\\"([^\\\"]+)\\\")/gi;\n      const styleRegExp = /\\s*([^:]+):\\s*([^;]+);?/g;\n      const trimRightRegExp = /\\s+$/;\n      const encodingLookup = {};\n      let validStyles;\n      let invalidStyles;\n      const invisibleChar = zeroWidth;\n      if (schema) {\n        validStyles = schema.getValidStyles();\n        invalidStyles = schema.getInvalidStyles();\n      }\n      const encodingItems = (`\\\\\" \\\\' \\\\; \\\\: ; : ` + invisibleChar).split(' ');\n      for (let i = 0; i < encodingItems.length; i++) {\n        encodingLookup[encodingItems[i]] = invisibleChar + i;\n        encodingLookup[invisibleChar + i] = encodingItems[i];\n      }\n      const self = {\n        parse: css => {\n          const styles = {};\n          let isEncoded = false;\n          const urlConverter = settings.url_converter;\n          const urlConverterScope = settings.url_converter_scope || self;\n          const compress = (prefix, suffix, noJoin) => {\n            const top = styles[prefix + '-top' + suffix];\n            if (!top) {\n              return;\n            }\n            const right = styles[prefix + '-right' + suffix];\n            if (!right) {\n              return;\n            }\n            const bottom = styles[prefix + '-bottom' + suffix];\n            if (!bottom) {\n              return;\n            }\n            const left = styles[prefix + '-left' + suffix];\n            if (!left) {\n              return;\n            }\n            const box = [\n              top,\n              right,\n              bottom,\n              left\n            ];\n            let i = box.length - 1;\n            while (i--) {\n              if (box[i] !== box[i + 1]) {\n                break;\n              }\n            }\n            if (i > -1 && noJoin) {\n              return;\n            }\n            styles[prefix + suffix] = i === -1 ? box[0] : box.join(' ');\n            delete styles[prefix + '-top' + suffix];\n            delete styles[prefix + '-right' + suffix];\n            delete styles[prefix + '-bottom' + suffix];\n            delete styles[prefix + '-left' + suffix];\n          };\n          const canCompress = key => {\n            const value = styles[key];\n            if (!value) {\n              return;\n            }\n            const values = value.indexOf(',') > -1 ? [value] : value.split(' ');\n            let i = values.length;\n            while (i--) {\n              if (values[i] !== values[0]) {\n                return false;\n              }\n            }\n            styles[key] = values[0];\n            return true;\n          };\n          const compress2 = (target, a, b, c) => {\n            if (!canCompress(a)) {\n              return;\n            }\n            if (!canCompress(b)) {\n              return;\n            }\n            if (!canCompress(c)) {\n              return;\n            }\n            styles[target] = styles[a] + ' ' + styles[b] + ' ' + styles[c];\n            delete styles[a];\n            delete styles[b];\n            delete styles[c];\n          };\n          const encode = str => {\n            isEncoded = true;\n            return encodingLookup[str];\n          };\n          const decode = (str, keepSlashes) => {\n            if (isEncoded) {\n              str = str.replace(/\\uFEFF[0-9]/g, str => {\n                return encodingLookup[str];\n              });\n            }\n            if (!keepSlashes) {\n              str = str.replace(/\\\\([\\'\\\";:])/g, '$1');\n            }\n            return str;\n          };\n          const decodeSingleHexSequence = escSeq => {\n            return String.fromCharCode(parseInt(escSeq.slice(1), 16));\n          };\n          const decodeHexSequences = value => {\n            return value.replace(/\\\\[0-9a-f]+/gi, decodeSingleHexSequence);\n          };\n          const processUrl = (match, url, url2, url3, str, str2) => {\n            str = str || str2;\n            if (str) {\n              str = decode(str);\n              return `'` + str.replace(/\\'/g, `\\\\'`) + `'`;\n            }\n            url = decode(url || url2 || url3 || '');\n            if (!settings.allow_script_urls) {\n              const scriptUrl = url.replace(/[\\s\\r\\n]+/g, '');\n              if (/(java|vb)script:/i.test(scriptUrl)) {\n                return '';\n              }\n              if (!settings.allow_svg_data_urls && /^data:image\\/svg/i.test(scriptUrl)) {\n                return '';\n              }\n            }\n            if (urlConverter) {\n              url = urlConverter.call(urlConverterScope, url, 'style');\n            }\n            return `url('` + url.replace(/\\'/g, `\\\\'`) + `')`;\n          };\n          if (css) {\n            css = css.replace(/[\\u0000-\\u001F]/g, '');\n            css = css.replace(/\\\\[\\\"\\';:\\uFEFF]/g, encode).replace(/\\\"[^\\\"]+\\\"|\\'[^\\']+\\'/g, str => {\n              return str.replace(/[;:]/g, encode);\n            });\n            let matches;\n            while (matches = styleRegExp.exec(css)) {\n              styleRegExp.lastIndex = matches.index + matches[0].length;\n              let name = matches[1].replace(trimRightRegExp, '').toLowerCase();\n              let value = matches[2].replace(trimRightRegExp, '');\n              if (name && value) {\n                name = decodeHexSequences(name);\n                value = decodeHexSequences(value);\n                if (name.indexOf(invisibleChar) !== -1 || name.indexOf('\"') !== -1) {\n                  continue;\n                }\n                if (!settings.allow_script_urls && (name === 'behavior' || /expression\\s*\\(|\\/\\*|\\*\\//.test(value))) {\n                  continue;\n                }\n                if (name === 'font-weight' && value === '700') {\n                  value = 'bold';\n                } else if (name === 'color' || name === 'background-color') {\n                  value = value.toLowerCase();\n                }\n                if (isString(settings.force_hex_color) && settings.force_hex_color !== 'off') {\n                  fromString(value).each(rgba => {\n                    if (settings.force_hex_color === 'always' || rgba.alpha === 1) {\n                      value = rgbaToHexString(toString(rgba));\n                    }\n                  });\n                }\n                value = value.replace(urlOrStrRegExp, processUrl);\n                styles[name] = isEncoded ? decode(value, true) : value;\n              }\n            }\n            compress('border', '', true);\n            compress('border', '-width');\n            compress('border', '-color');\n            compress('border', '-style');\n            compress('padding', '');\n            compress('margin', '');\n            compress2('border', 'border-width', 'border-style', 'border-color');\n            if (styles.border === 'medium none') {\n              delete styles.border;\n            }\n            if (styles['border-image'] === 'none') {\n              delete styles['border-image'];\n            }\n          }\n          return styles;\n        },\n        serialize: (styles, elementName) => {\n          let css = '';\n          const serializeStyles = (elemName, validStyleList) => {\n            const styleList = validStyleList[elemName];\n            if (styleList) {\n              for (let i = 0, l = styleList.length; i < l; i++) {\n                const name = styleList[i];\n                const value = styles[name];\n                if (value) {\n                  css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';\n                }\n              }\n            }\n          };\n          const isValid = (name, elemName) => {\n            if (!invalidStyles || !elemName) {\n              return true;\n            }\n            let styleMap = invalidStyles['*'];\n            if (styleMap && styleMap[name]) {\n              return false;\n            }\n            styleMap = invalidStyles[elemName];\n            return !(styleMap && styleMap[name]);\n          };\n          if (elementName && validStyles) {\n            serializeStyles('*', validStyles);\n            serializeStyles(elementName, validStyles);\n          } else {\n            each$d(styles, (value, name) => {\n              if (value && isValid(name, elementName)) {\n                css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';\n              }\n            });\n          }\n          return css;\n        }\n      };\n      return self;\n    };\n\n    const deprecated = {\n      keyLocation: true,\n      layerX: true,\n      layerY: true,\n      returnValue: true,\n      webkitMovementX: true,\n      webkitMovementY: true,\n      keyIdentifier: true,\n      mozPressure: true\n    };\n    const isNativeEvent = event => event instanceof Event || isFunction(event.initEvent);\n    const hasIsDefaultPrevented = event => event.isDefaultPrevented === always || event.isDefaultPrevented === never;\n    const needsNormalizing = event => isNullable(event.preventDefault) || isNativeEvent(event);\n    const clone$3 = (originalEvent, data) => {\n      const event = data !== null && data !== void 0 ? data : {};\n      for (const name in originalEvent) {\n        if (!has$2(deprecated, name)) {\n          event[name] = originalEvent[name];\n        }\n      }\n      if (isNonNullable(originalEvent.composedPath)) {\n        event.composedPath = () => originalEvent.composedPath();\n      }\n      if (isNonNullable(originalEvent.getModifierState)) {\n        event.getModifierState = keyArg => originalEvent.getModifierState(keyArg);\n      }\n      if (isNonNullable(originalEvent.getTargetRanges)) {\n        event.getTargetRanges = () => originalEvent.getTargetRanges();\n      }\n      return event;\n    };\n    const normalize$3 = (type, originalEvent, fallbackTarget, data) => {\n      var _a;\n      const event = clone$3(originalEvent, data);\n      event.type = type;\n      if (isNullable(event.target)) {\n        event.target = (_a = event.srcElement) !== null && _a !== void 0 ? _a : fallbackTarget;\n      }\n      if (needsNormalizing(originalEvent)) {\n        event.preventDefault = () => {\n          event.defaultPrevented = true;\n          event.isDefaultPrevented = always;\n          if (isFunction(originalEvent.preventDefault)) {\n            originalEvent.preventDefault();\n          }\n        };\n        event.stopPropagation = () => {\n          event.cancelBubble = true;\n          event.isPropagationStopped = always;\n          if (isFunction(originalEvent.stopPropagation)) {\n            originalEvent.stopPropagation();\n          }\n        };\n        event.stopImmediatePropagation = () => {\n          event.isImmediatePropagationStopped = always;\n          event.stopPropagation();\n        };\n        if (!hasIsDefaultPrevented(event)) {\n          event.isDefaultPrevented = event.defaultPrevented === true ? always : never;\n          event.isPropagationStopped = event.cancelBubble === true ? always : never;\n          event.isImmediatePropagationStopped = never;\n        }\n      }\n      return event;\n    };\n\n    const eventExpandoPrefix = 'mce-data-';\n    const mouseEventRe = /^(?:mouse|contextmenu)|click/;\n    const addEvent = (target, name, callback, capture) => {\n      target.addEventListener(name, callback, capture || false);\n    };\n    const removeEvent = (target, name, callback, capture) => {\n      target.removeEventListener(name, callback, capture || false);\n    };\n    const isMouseEvent = event => isNonNullable(event) && mouseEventRe.test(event.type);\n    const fix = (originalEvent, data) => {\n      const event = normalize$3(originalEvent.type, originalEvent, document, data);\n      if (isMouseEvent(originalEvent) && isUndefined(originalEvent.pageX) && !isUndefined(originalEvent.clientX)) {\n        const eventDoc = event.target.ownerDocument || document;\n        const doc = eventDoc.documentElement;\n        const body = eventDoc.body;\n        const mouseEvent = event;\n        mouseEvent.pageX = originalEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);\n        mouseEvent.pageY = originalEvent.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);\n      }\n      return event;\n    };\n    const bindOnReady = (win, callback, eventUtils) => {\n      const doc = win.document, event = { type: 'ready' };\n      if (eventUtils.domLoaded) {\n        callback(event);\n        return;\n      }\n      const isDocReady = () => {\n        return doc.readyState === 'complete' || doc.readyState === 'interactive' && doc.body;\n      };\n      const readyHandler = () => {\n        removeEvent(win, 'DOMContentLoaded', readyHandler);\n        removeEvent(win, 'load', readyHandler);\n        if (!eventUtils.domLoaded) {\n          eventUtils.domLoaded = true;\n          callback(event);\n        }\n        win = null;\n      };\n      if (isDocReady()) {\n        readyHandler();\n      } else {\n        addEvent(win, 'DOMContentLoaded', readyHandler);\n      }\n      if (!eventUtils.domLoaded) {\n        addEvent(win, 'load', readyHandler);\n      }\n    };\n    class EventUtils {\n      constructor() {\n        this.domLoaded = false;\n        this.events = {};\n        this.count = 1;\n        this.expando = eventExpandoPrefix + (+new Date()).toString(32);\n        this.hasFocusIn = 'onfocusin' in document.documentElement;\n        this.count = 1;\n      }\n      bind(target, names, callback, scope) {\n        const self = this;\n        let callbackList;\n        const win = window;\n        const defaultNativeHandler = evt => {\n          self.executeHandlers(fix(evt || win.event), id);\n        };\n        if (!target || isText$b(target) || isComment(target)) {\n          return callback;\n        }\n        let id;\n        if (!target[self.expando]) {\n          id = self.count++;\n          target[self.expando] = id;\n          self.events[id] = {};\n        } else {\n          id = target[self.expando];\n        }\n        scope = scope || target;\n        const namesList = names.split(' ');\n        let i = namesList.length;\n        while (i--) {\n          let name = namesList[i];\n          let nativeHandler = defaultNativeHandler;\n          let capture = false;\n          let fakeName = false;\n          if (name === 'DOMContentLoaded') {\n            name = 'ready';\n          }\n          if (self.domLoaded && name === 'ready' && target.readyState === 'complete') {\n            callback.call(scope, fix({ type: name }));\n            continue;\n          }\n          if (!self.hasFocusIn && (name === 'focusin' || name === 'focusout')) {\n            capture = true;\n            fakeName = name === 'focusin' ? 'focus' : 'blur';\n            nativeHandler = evt => {\n              const event = fix(evt || win.event);\n              event.type = event.type === 'focus' ? 'focusin' : 'focusout';\n              self.executeHandlers(event, id);\n            };\n          }\n          callbackList = self.events[id][name];\n          if (!callbackList) {\n            self.events[id][name] = callbackList = [{\n                func: callback,\n                scope\n              }];\n            callbackList.fakeName = fakeName;\n            callbackList.capture = capture;\n            callbackList.nativeHandler = nativeHandler;\n            if (name === 'ready') {\n              bindOnReady(target, nativeHandler, self);\n            } else {\n              addEvent(target, fakeName || name, nativeHandler, capture);\n            }\n          } else {\n            if (name === 'ready' && self.domLoaded) {\n              callback(fix({ type: name }));\n            } else {\n              callbackList.push({\n                func: callback,\n                scope\n              });\n            }\n          }\n        }\n        target = callbackList = null;\n        return callback;\n      }\n      unbind(target, names, callback) {\n        if (!target || isText$b(target) || isComment(target)) {\n          return this;\n        }\n        const id = target[this.expando];\n        if (id) {\n          let eventMap = this.events[id];\n          if (names) {\n            const namesList = names.split(' ');\n            let i = namesList.length;\n            while (i--) {\n              const name = namesList[i];\n              const callbackList = eventMap[name];\n              if (callbackList) {\n                if (callback) {\n                  let ci = callbackList.length;\n                  while (ci--) {\n                    if (callbackList[ci].func === callback) {\n                      const nativeHandler = callbackList.nativeHandler;\n                      const fakeName = callbackList.fakeName, capture = callbackList.capture;\n                      const newCallbackList = callbackList.slice(0, ci).concat(callbackList.slice(ci + 1));\n                      newCallbackList.nativeHandler = nativeHandler;\n                      newCallbackList.fakeName = fakeName;\n                      newCallbackList.capture = capture;\n                      eventMap[name] = newCallbackList;\n                    }\n                  }\n                }\n                if (!callback || callbackList.length === 0) {\n                  delete eventMap[name];\n                  removeEvent(target, callbackList.fakeName || name, callbackList.nativeHandler, callbackList.capture);\n                }\n              }\n            }\n          } else {\n            each$d(eventMap, (callbackList, name) => {\n              removeEvent(target, callbackList.fakeName || name, callbackList.nativeHandler, callbackList.capture);\n            });\n            eventMap = {};\n          }\n          for (const name in eventMap) {\n            if (has$2(eventMap, name)) {\n              return this;\n            }\n          }\n          delete this.events[id];\n          try {\n            delete target[this.expando];\n          } catch (ex) {\n            target[this.expando] = null;\n          }\n        }\n        return this;\n      }\n      fire(target, name, args) {\n        return this.dispatch(target, name, args);\n      }\n      dispatch(target, name, args) {\n        if (!target || isText$b(target) || isComment(target)) {\n          return this;\n        }\n        const event = fix({\n          type: name,\n          target\n        }, args);\n        do {\n          const id = target[this.expando];\n          if (id) {\n            this.executeHandlers(event, id);\n          }\n          target = target.parentNode || target.ownerDocument || target.defaultView || target.parentWindow;\n        } while (target && !event.isPropagationStopped());\n        return this;\n      }\n      clean(target) {\n        if (!target || isText$b(target) || isComment(target)) {\n          return this;\n        }\n        if (target[this.expando]) {\n          this.unbind(target);\n        }\n        if (!target.getElementsByTagName) {\n          target = target.document;\n        }\n        if (target && target.getElementsByTagName) {\n          this.unbind(target);\n          const children = target.getElementsByTagName('*');\n          let i = children.length;\n          while (i--) {\n            target = children[i];\n            if (target[this.expando]) {\n              this.unbind(target);\n            }\n          }\n        }\n        return this;\n      }\n      destroy() {\n        this.events = {};\n      }\n      cancel(e) {\n        if (e) {\n          e.preventDefault();\n          e.stopImmediatePropagation();\n        }\n        return false;\n      }\n      executeHandlers(evt, id) {\n        const container = this.events[id];\n        const callbackList = container && container[evt.type];\n        if (callbackList) {\n          for (let i = 0, l = callbackList.length; i < l; i++) {\n            const callback = callbackList[i];\n            if (callback && callback.func.call(callback.scope, evt) === false) {\n              evt.preventDefault();\n            }\n            if (evt.isImmediatePropagationStopped()) {\n              return;\n            }\n          }\n        }\n      }\n    }\n    EventUtils.Event = new EventUtils();\n\n    const each$a = Tools.each;\n    const grep = Tools.grep;\n    const internalStyleName = 'data-mce-style';\n    const numericalCssMap = Tools.makeMap('fill-opacity font-weight line-height opacity orphans widows z-index zoom', ' ');\n    const legacySetAttribute = (elm, name, value) => {\n      if (isNullable(value) || value === '') {\n        remove$9(elm, name);\n      } else {\n        set$3(elm, name, value);\n      }\n    };\n    const camelCaseToHyphens = name => name.replace(/[A-Z]/g, v => '-' + v.toLowerCase());\n    const findNodeIndex = (node, normalized) => {\n      let idx = 0;\n      if (node) {\n        for (let lastNodeType = node.nodeType, tempNode = node.previousSibling; tempNode; tempNode = tempNode.previousSibling) {\n          const nodeType = tempNode.nodeType;\n          if (normalized && isText$b(tempNode)) {\n            if (nodeType === lastNodeType || !tempNode.data.length) {\n              continue;\n            }\n          }\n          idx++;\n          lastNodeType = nodeType;\n        }\n      }\n      return idx;\n    };\n    const updateInternalStyleAttr = (styles, elm) => {\n      const rawValue = get$9(elm, 'style');\n      const value = styles.serialize(styles.parse(rawValue), name(elm));\n      legacySetAttribute(elm, internalStyleName, value);\n    };\n    const convertStyleToString = (cssValue, cssName) => {\n      if (isNumber(cssValue)) {\n        return has$2(numericalCssMap, cssName) ? cssValue + '' : cssValue + 'px';\n      } else {\n        return cssValue;\n      }\n    };\n    const applyStyle$1 = ($elm, cssName, cssValue) => {\n      const normalizedName = camelCaseToHyphens(cssName);\n      if (isNullable(cssValue) || cssValue === '') {\n        remove$5($elm, normalizedName);\n      } else {\n        set$2($elm, normalizedName, convertStyleToString(cssValue, normalizedName));\n      }\n    };\n    const setupAttrHooks = (styles, settings, getContext) => {\n      const keepValues = settings.keep_values;\n      const keepUrlHook = {\n        set: (elm, value, name) => {\n          const sugarElm = SugarElement.fromDom(elm);\n          if (isFunction(settings.url_converter) && isNonNullable(value)) {\n            value = settings.url_converter.call(settings.url_converter_scope || getContext(), String(value), name, elm);\n          }\n          const internalName = 'data-mce-' + name;\n          legacySetAttribute(sugarElm, internalName, value);\n          legacySetAttribute(sugarElm, name, value);\n        },\n        get: (elm, name) => {\n          const sugarElm = SugarElement.fromDom(elm);\n          return get$9(sugarElm, 'data-mce-' + name) || get$9(sugarElm, name);\n        }\n      };\n      const attrHooks = {\n        style: {\n          set: (elm, value) => {\n            const sugarElm = SugarElement.fromDom(elm);\n            if (keepValues) {\n              legacySetAttribute(sugarElm, internalStyleName, value);\n            }\n            remove$9(sugarElm, 'style');\n            if (isString(value)) {\n              setAll(sugarElm, styles.parse(value));\n            }\n          },\n          get: elm => {\n            const sugarElm = SugarElement.fromDom(elm);\n            const value = get$9(sugarElm, internalStyleName) || get$9(sugarElm, 'style');\n            return styles.serialize(styles.parse(value), name(sugarElm));\n          }\n        }\n      };\n      if (keepValues) {\n        attrHooks.href = attrHooks.src = keepUrlHook;\n      }\n      return attrHooks;\n    };\n    const DOMUtils = (doc, settings = {}) => {\n      const addedStyles = {};\n      const win = window;\n      const files = {};\n      let counter = 0;\n      const stdMode = true;\n      const boxModel = true;\n      const styleSheetLoader = instance.forElement(SugarElement.fromDom(doc), {\n        contentCssCors: settings.contentCssCors,\n        referrerPolicy: settings.referrerPolicy\n      });\n      const boundEvents = [];\n      const schema = settings.schema ? settings.schema : Schema({});\n      const styles = Styles({\n        url_converter: settings.url_converter,\n        url_converter_scope: settings.url_converter_scope,\n        force_hex_color: settings.force_hex_color\n      }, settings.schema);\n      const events = settings.ownEvents ? new EventUtils() : EventUtils.Event;\n      const blockElementsMap = schema.getBlockElements();\n      const isBlock = node => {\n        if (isString(node)) {\n          return has$2(blockElementsMap, node);\n        } else {\n          return isElement$6(node) && (has$2(blockElementsMap, node.nodeName) || isTransparentBlock(schema, node));\n        }\n      };\n      const get = elm => elm && doc && isString(elm) ? doc.getElementById(elm) : elm;\n      const _get = elm => {\n        const value = get(elm);\n        return isNonNullable(value) ? SugarElement.fromDom(value) : null;\n      };\n      const getAttrib = (elm, name, defaultVal = '') => {\n        let value;\n        const $elm = _get(elm);\n        if (isNonNullable($elm) && isElement$7($elm)) {\n          const hook = attrHooks[name];\n          if (hook && hook.get) {\n            value = hook.get($elm.dom, name);\n          } else {\n            value = get$9($elm, name);\n          }\n        }\n        return isNonNullable(value) ? value : defaultVal;\n      };\n      const getAttribs = elm => {\n        const node = get(elm);\n        return isNullable(node) ? [] : node.attributes;\n      };\n      const setAttrib = (elm, name, value) => {\n        run(elm, e => {\n          if (isElement$6(e)) {\n            const $elm = SugarElement.fromDom(e);\n            const val = value === '' ? null : value;\n            const originalValue = get$9($elm, name);\n            const hook = attrHooks[name];\n            if (hook && hook.set) {\n              hook.set($elm.dom, val, name);\n            } else {\n              legacySetAttribute($elm, name, val);\n            }\n            if (originalValue !== val && settings.onSetAttrib) {\n              settings.onSetAttrib({\n                attrElm: $elm.dom,\n                attrName: name,\n                attrValue: val\n              });\n            }\n          }\n        });\n      };\n      const clone = (node, deep) => {\n        return node.cloneNode(deep);\n      };\n      const getRoot = () => settings.root_element || doc.body;\n      const getViewPort = argWin => {\n        const vp = getBounds(argWin);\n        return {\n          x: vp.x,\n          y: vp.y,\n          w: vp.width,\n          h: vp.height\n        };\n      };\n      const getPos$1 = (elm, rootElm) => getPos(doc.body, get(elm), rootElm);\n      const setStyle = (elm, name, value) => {\n        run(elm, e => {\n          const $elm = SugarElement.fromDom(e);\n          applyStyle$1($elm, name, value);\n          if (settings.update_styles) {\n            updateInternalStyleAttr(styles, $elm);\n          }\n        });\n      };\n      const setStyles = (elm, stylesArg) => {\n        run(elm, e => {\n          const $elm = SugarElement.fromDom(e);\n          each$d(stylesArg, (v, n) => {\n            applyStyle$1($elm, n, v);\n          });\n          if (settings.update_styles) {\n            updateInternalStyleAttr(styles, $elm);\n          }\n        });\n      };\n      const getStyle = (elm, name, computed) => {\n        const $elm = get(elm);\n        if (isNullable($elm) || !isHTMLElement($elm) && !isSVGElement($elm)) {\n          return undefined;\n        }\n        if (computed) {\n          return get$7(SugarElement.fromDom($elm), camelCaseToHyphens(name));\n        } else {\n          name = name.replace(/-(\\D)/g, (a, b) => b.toUpperCase());\n          if (name === 'float') {\n            name = 'cssFloat';\n          }\n          return $elm.style ? $elm.style[name] : undefined;\n        }\n      };\n      const getSize = elm => {\n        const $elm = get(elm);\n        if (!$elm) {\n          return {\n            w: 0,\n            h: 0\n          };\n        }\n        let w = getStyle($elm, 'width');\n        let h = getStyle($elm, 'height');\n        if (!w || w.indexOf('px') === -1) {\n          w = '0';\n        }\n        if (!h || h.indexOf('px') === -1) {\n          h = '0';\n        }\n        return {\n          w: parseInt(w, 10) || $elm.offsetWidth || $elm.clientWidth,\n          h: parseInt(h, 10) || $elm.offsetHeight || $elm.clientHeight\n        };\n      };\n      const getRect = elm => {\n        const $elm = get(elm);\n        const pos = getPos$1($elm);\n        const size = getSize($elm);\n        return {\n          x: pos.x,\n          y: pos.y,\n          w: size.w,\n          h: size.h\n        };\n      };\n      const is = (elm, selector) => {\n        if (!elm) {\n          return false;\n        }\n        const elms = isArray$1(elm) ? elm : [elm];\n        return exists(elms, e => {\n          return is$1(SugarElement.fromDom(e), selector);\n        });\n      };\n      const getParents = (elm, selector, root, collect) => {\n        const result = [];\n        let node = get(elm);\n        collect = collect === undefined;\n        const resolvedRoot = root || (getRoot().nodeName !== 'BODY' ? getRoot().parentNode : null);\n        if (isString(selector)) {\n          if (selector === '*') {\n            selector = isElement$6;\n          } else {\n            const selectorVal = selector;\n            selector = node => is(node, selectorVal);\n          }\n        }\n        while (node) {\n          if (node === resolvedRoot || isNullable(node.nodeType) || isDocument$1(node) || isDocumentFragment(node)) {\n            break;\n          }\n          if (!selector || selector(node)) {\n            if (collect) {\n              result.push(node);\n            } else {\n              return [node];\n            }\n          }\n          node = node.parentNode;\n        }\n        return collect ? result : null;\n      };\n      const getParent = (node, selector, root) => {\n        const parents = getParents(node, selector, root, false);\n        return parents && parents.length > 0 ? parents[0] : null;\n      };\n      const _findSib = (node, selector, name) => {\n        let func = selector;\n        if (node) {\n          if (isString(selector)) {\n            func = node => {\n              return is(node, selector);\n            };\n          }\n          for (let tempNode = node[name]; tempNode; tempNode = tempNode[name]) {\n            if (isFunction(func) && func(tempNode)) {\n              return tempNode;\n            }\n          }\n        }\n        return null;\n      };\n      const getNext = (node, selector) => _findSib(node, selector, 'nextSibling');\n      const getPrev = (node, selector) => _findSib(node, selector, 'previousSibling');\n      const isParentNode = node => isFunction(node.querySelectorAll);\n      const select = (selector, scope) => {\n        var _a, _b;\n        const elm = (_b = (_a = get(scope)) !== null && _a !== void 0 ? _a : settings.root_element) !== null && _b !== void 0 ? _b : doc;\n        return isParentNode(elm) ? from(elm.querySelectorAll(selector)) : [];\n      };\n      const run = function (elm, func, scope) {\n        const context = scope !== null && scope !== void 0 ? scope : this;\n        if (isArray$1(elm)) {\n          const result = [];\n          each$a(elm, (e, i) => {\n            const node = get(e);\n            if (node) {\n              result.push(func.call(context, node, i));\n            }\n          });\n          return result;\n        } else {\n          const node = get(elm);\n          return !node ? false : func.call(context, node);\n        }\n      };\n      const setAttribs = (elm, attrs) => {\n        run(elm, $elm => {\n          each$d(attrs, (value, name) => {\n            setAttrib($elm, name, value);\n          });\n        });\n      };\n      const setHTML = (elm, html) => {\n        run(elm, e => {\n          const $elm = SugarElement.fromDom(e);\n          set$1($elm, html);\n        });\n      };\n      const add = (parentElm, name, attrs, html, create) => run(parentElm, parentElm => {\n        const newElm = isString(name) ? doc.createElement(name) : name;\n        if (isNonNullable(attrs)) {\n          setAttribs(newElm, attrs);\n        }\n        if (html) {\n          if (!isString(html) && html.nodeType) {\n            newElm.appendChild(html);\n          } else if (isString(html)) {\n            setHTML(newElm, html);\n          }\n        }\n        return !create ? parentElm.appendChild(newElm) : newElm;\n      });\n      const create = (name, attrs, html) => add(doc.createElement(name), name, attrs, html, true);\n      const decode = Entities.decode;\n      const encode = Entities.encodeAllRaw;\n      const createHTML = (name, attrs, html = '') => {\n        let outHtml = '<' + name;\n        for (const key in attrs) {\n          if (hasNonNullableKey(attrs, key)) {\n            outHtml += ' ' + key + '=\"' + encode(attrs[key]) + '\"';\n          }\n        }\n        if (isEmpty$3(html) && has$2(schema.getVoidElements(), name)) {\n          return outHtml + ' />';\n        } else {\n          return outHtml + '>' + html + '</' + name + '>';\n        }\n      };\n      const createFragment = html => {\n        const container = doc.createElement('div');\n        const frag = doc.createDocumentFragment();\n        frag.appendChild(container);\n        if (html) {\n          container.innerHTML = html;\n        }\n        let node;\n        while (node = container.firstChild) {\n          frag.appendChild(node);\n        }\n        frag.removeChild(container);\n        return frag;\n      };\n      const remove = (node, keepChildren) => {\n        return run(node, n => {\n          const $node = SugarElement.fromDom(n);\n          if (keepChildren) {\n            each$e(children$1($node), child => {\n              if (isText$c(child) && child.dom.length === 0) {\n                remove$4(child);\n              } else {\n                before$3($node, child);\n              }\n            });\n          }\n          remove$4($node);\n          return $node.dom;\n        });\n      };\n      const removeAllAttribs = e => run(e, e => {\n        const attrs = e.attributes;\n        for (let i = attrs.length - 1; i >= 0; i--) {\n          e.removeAttributeNode(attrs.item(i));\n        }\n      });\n      const parseStyle = cssText => styles.parse(cssText);\n      const serializeStyle = (stylesArg, name) => styles.serialize(stylesArg, name);\n      const addStyle = cssText => {\n        if (self !== DOMUtils.DOM && doc === document) {\n          if (addedStyles[cssText]) {\n            return;\n          }\n          addedStyles[cssText] = true;\n        }\n        let styleElm = doc.getElementById('mceDefaultStyles');\n        if (!styleElm) {\n          styleElm = doc.createElement('style');\n          styleElm.id = 'mceDefaultStyles';\n          styleElm.type = 'text/css';\n          const head = doc.head;\n          if (head.firstChild) {\n            head.insertBefore(styleElm, head.firstChild);\n          } else {\n            head.appendChild(styleElm);\n          }\n        }\n        if (styleElm.styleSheet) {\n          styleElm.styleSheet.cssText += cssText;\n        } else {\n          styleElm.appendChild(doc.createTextNode(cssText));\n        }\n      };\n      const loadCSS = urls => {\n        if (!urls) {\n          urls = '';\n        }\n        each$e(urls.split(','), url => {\n          files[url] = true;\n          styleSheetLoader.load(url).catch(noop);\n        });\n      };\n      const toggleClass = (elm, cls, state) => {\n        run(elm, e => {\n          if (isElement$6(e)) {\n            const $elm = SugarElement.fromDom(e);\n            const classes = cls.split(' ');\n            each$e(classes, c => {\n              if (isNonNullable(state)) {\n                const fn = state ? add$2 : remove$6;\n                fn($elm, c);\n              } else {\n                toggle$1($elm, c);\n              }\n            });\n          }\n        });\n      };\n      const addClass = (elm, cls) => {\n        toggleClass(elm, cls, true);\n      };\n      const removeClass = (elm, cls) => {\n        toggleClass(elm, cls, false);\n      };\n      const hasClass = (elm, cls) => {\n        const $elm = _get(elm);\n        const classes = cls.split(' ');\n        return isNonNullable($elm) && forall(classes, c => has($elm, c));\n      };\n      const show = elm => {\n        run(elm, e => remove$5(SugarElement.fromDom(e), 'display'));\n      };\n      const hide = elm => {\n        run(elm, e => set$2(SugarElement.fromDom(e), 'display', 'none'));\n      };\n      const isHidden = elm => {\n        const $elm = _get(elm);\n        return isNonNullable($elm) && is$2(getRaw($elm, 'display'), 'none');\n      };\n      const uniqueId = prefix => (!prefix ? 'mce_' : prefix) + counter++;\n      const getOuterHTML = elm => {\n        const $elm = _get(elm);\n        if (isNonNullable($elm)) {\n          return isElement$6($elm.dom) ? $elm.dom.outerHTML : getOuter($elm);\n        } else {\n          return '';\n        }\n      };\n      const setOuterHTML = (elm, html) => {\n        run(elm, $elm => {\n          if (isElement$6($elm)) {\n            $elm.outerHTML = html;\n          }\n        });\n      };\n      const insertAfter = (node, reference) => {\n        const referenceNode = get(reference);\n        return run(node, node => {\n          const parent = referenceNode === null || referenceNode === void 0 ? void 0 : referenceNode.parentNode;\n          const nextSibling = referenceNode === null || referenceNode === void 0 ? void 0 : referenceNode.nextSibling;\n          if (parent) {\n            if (nextSibling) {\n              parent.insertBefore(node, nextSibling);\n            } else {\n              parent.appendChild(node);\n            }\n          }\n          return node;\n        });\n      };\n      const replace = (newElm, oldElm, keepChildren) => run(oldElm, elm => {\n        var _a;\n        const replacee = isArray$1(oldElm) ? newElm.cloneNode(true) : newElm;\n        if (keepChildren) {\n          each$a(grep(elm.childNodes), node => {\n            replacee.appendChild(node);\n          });\n        }\n        (_a = elm.parentNode) === null || _a === void 0 ? void 0 : _a.replaceChild(replacee, elm);\n        return elm;\n      });\n      const rename = (elm, name) => {\n        if (elm.nodeName !== name.toUpperCase()) {\n          const newElm = create(name);\n          each$a(getAttribs(elm), attrNode => {\n            setAttrib(newElm, attrNode.nodeName, getAttrib(elm, attrNode.nodeName));\n          });\n          replace(newElm, elm, true);\n          return newElm;\n        } else {\n          return elm;\n        }\n      };\n      const findCommonAncestor = (a, b) => {\n        let ps = a;\n        while (ps) {\n          let pe = b;\n          while (pe && ps !== pe) {\n            pe = pe.parentNode;\n          }\n          if (ps === pe) {\n            break;\n          }\n          ps = ps.parentNode;\n        }\n        if (!ps && a.ownerDocument) {\n          return a.ownerDocument.documentElement;\n        } else {\n          return ps;\n        }\n      };\n      const isEmpty = (node, elements, options) => {\n        if (isPlainObject(elements)) {\n          const isContent = node => {\n            const name = node.nodeName.toLowerCase();\n            return Boolean(elements[name]);\n          };\n          return isEmptyNode(schema, node, {\n            ...options,\n            isContent\n          });\n        } else {\n          return isEmptyNode(schema, node, options);\n        }\n      };\n      const createRng = () => doc.createRange();\n      const split = (parentElm, splitElm, replacementElm) => {\n        let range = createRng();\n        let beforeFragment;\n        let afterFragment;\n        if (parentElm && splitElm && parentElm.parentNode && splitElm.parentNode) {\n          const parentNode = parentElm.parentNode;\n          range.setStart(parentNode, findNodeIndex(parentElm));\n          range.setEnd(splitElm.parentNode, findNodeIndex(splitElm));\n          beforeFragment = range.extractContents();\n          range = createRng();\n          range.setStart(splitElm.parentNode, findNodeIndex(splitElm) + 1);\n          range.setEnd(parentNode, findNodeIndex(parentElm) + 1);\n          afterFragment = range.extractContents();\n          parentNode.insertBefore(trimNode(self, beforeFragment, schema), parentElm);\n          if (replacementElm) {\n            parentNode.insertBefore(replacementElm, parentElm);\n          } else {\n            parentNode.insertBefore(splitElm, parentElm);\n          }\n          parentNode.insertBefore(trimNode(self, afterFragment, schema), parentElm);\n          remove(parentElm);\n          return replacementElm || splitElm;\n        } else {\n          return undefined;\n        }\n      };\n      const bind = (target, name, func, scope) => {\n        if (isArray$1(target)) {\n          let i = target.length;\n          const rv = [];\n          while (i--) {\n            rv[i] = bind(target[i], name, func, scope);\n          }\n          return rv;\n        } else {\n          if (settings.collect && (target === doc || target === win)) {\n            boundEvents.push([\n              target,\n              name,\n              func,\n              scope\n            ]);\n          }\n          return events.bind(target, name, func, scope || self);\n        }\n      };\n      const unbind = (target, name, func) => {\n        if (isArray$1(target)) {\n          let i = target.length;\n          const rv = [];\n          while (i--) {\n            rv[i] = unbind(target[i], name, func);\n          }\n          return rv;\n        } else {\n          if (boundEvents.length > 0 && (target === doc || target === win)) {\n            let i = boundEvents.length;\n            while (i--) {\n              const [boundTarget, boundName, boundFunc] = boundEvents[i];\n              if (target === boundTarget && (!name || name === boundName) && (!func || func === boundFunc)) {\n                events.unbind(boundTarget, boundName, boundFunc);\n              }\n            }\n          }\n          return events.unbind(target, name, func);\n        }\n      };\n      const dispatch = (target, name, evt) => events.dispatch(target, name, evt);\n      const fire = (target, name, evt) => events.dispatch(target, name, evt);\n      const getContentEditable = node => {\n        if (node && isHTMLElement(node)) {\n          const contentEditable = node.getAttribute('data-mce-contenteditable');\n          if (contentEditable && contentEditable !== 'inherit') {\n            return contentEditable;\n          }\n          return node.contentEditable !== 'inherit' ? node.contentEditable : null;\n        } else {\n          return null;\n        }\n      };\n      const getContentEditableParent = node => {\n        const root = getRoot();\n        let state = null;\n        for (let tempNode = node; tempNode && tempNode !== root; tempNode = tempNode.parentNode) {\n          state = getContentEditable(tempNode);\n          if (state !== null) {\n            break;\n          }\n        }\n        return state;\n      };\n      const isEditable = node => {\n        if (isNonNullable(node)) {\n          const scope = isElement$6(node) ? node : node.parentElement;\n          return isNonNullable(scope) && isHTMLElement(scope) && isEditable$2(SugarElement.fromDom(scope));\n        } else {\n          return false;\n        }\n      };\n      const destroy = () => {\n        if (boundEvents.length > 0) {\n          let i = boundEvents.length;\n          while (i--) {\n            const [boundTarget, boundName, boundFunc] = boundEvents[i];\n            events.unbind(boundTarget, boundName, boundFunc);\n          }\n        }\n        each$d(files, (_, url) => {\n          styleSheetLoader.unload(url);\n          delete files[url];\n        });\n      };\n      const isChildOf = (node, parent) => {\n        return node === parent || parent.contains(node);\n      };\n      const dumpRng = r => 'startContainer: ' + r.startContainer.nodeName + ', startOffset: ' + r.startOffset + ', endContainer: ' + r.endContainer.nodeName + ', endOffset: ' + r.endOffset;\n      const self = {\n        doc,\n        settings,\n        win,\n        files,\n        stdMode,\n        boxModel,\n        styleSheetLoader,\n        boundEvents,\n        styles,\n        schema,\n        events,\n        isBlock: isBlock,\n        root: null,\n        clone,\n        getRoot,\n        getViewPort,\n        getRect,\n        getSize,\n        getParent,\n        getParents: getParents,\n        get,\n        getNext,\n        getPrev,\n        select,\n        is,\n        add,\n        create,\n        createHTML,\n        createFragment,\n        remove,\n        setStyle,\n        getStyle: getStyle,\n        setStyles,\n        removeAllAttribs,\n        setAttrib,\n        setAttribs,\n        getAttrib,\n        getPos: getPos$1,\n        parseStyle,\n        serializeStyle,\n        addStyle,\n        loadCSS,\n        addClass,\n        removeClass,\n        hasClass,\n        toggleClass,\n        show,\n        hide,\n        isHidden,\n        uniqueId,\n        setHTML,\n        getOuterHTML,\n        setOuterHTML,\n        decode,\n        encode,\n        insertAfter,\n        replace,\n        rename,\n        findCommonAncestor,\n        run,\n        getAttribs,\n        isEmpty,\n        createRng,\n        nodeIndex: findNodeIndex,\n        split,\n        bind: bind,\n        unbind: unbind,\n        fire,\n        dispatch,\n        getContentEditable,\n        getContentEditableParent,\n        isEditable,\n        destroy,\n        isChildOf,\n        dumpRng\n      };\n      const attrHooks = setupAttrHooks(styles, settings, constant(self));\n      return self;\n    };\n    DOMUtils.DOM = DOMUtils(document);\n    DOMUtils.nodeIndex = findNodeIndex;\n\n    const DOM$b = DOMUtils.DOM;\n    const QUEUED = 0;\n    const LOADING = 1;\n    const LOADED = 2;\n    const FAILED = 3;\n    class ScriptLoader {\n      constructor(settings = {}) {\n        this.states = {};\n        this.queue = [];\n        this.scriptLoadedCallbacks = {};\n        this.queueLoadedCallbacks = [];\n        this.loading = false;\n        this.settings = settings;\n      }\n      _setReferrerPolicy(referrerPolicy) {\n        this.settings.referrerPolicy = referrerPolicy;\n      }\n      loadScript(url) {\n        return new Promise((resolve, reject) => {\n          const dom = DOM$b;\n          let elm;\n          const cleanup = () => {\n            dom.remove(id);\n            if (elm) {\n              elm.onerror = elm.onload = elm = null;\n            }\n          };\n          const done = () => {\n            cleanup();\n            resolve();\n          };\n          const error = () => {\n            cleanup();\n            reject('Failed to load script: ' + url);\n          };\n          const id = dom.uniqueId();\n          elm = document.createElement('script');\n          elm.id = id;\n          elm.type = 'text/javascript';\n          elm.src = Tools._addCacheSuffix(url);\n          if (this.settings.referrerPolicy) {\n            dom.setAttrib(elm, 'referrerpolicy', this.settings.referrerPolicy);\n          }\n          elm.onload = done;\n          elm.onerror = error;\n          (document.getElementsByTagName('head')[0] || document.body).appendChild(elm);\n        });\n      }\n      isDone(url) {\n        return this.states[url] === LOADED;\n      }\n      markDone(url) {\n        this.states[url] = LOADED;\n      }\n      add(url) {\n        const self = this;\n        self.queue.push(url);\n        const state = self.states[url];\n        if (state === undefined) {\n          self.states[url] = QUEUED;\n        }\n        return new Promise((resolve, reject) => {\n          if (!self.scriptLoadedCallbacks[url]) {\n            self.scriptLoadedCallbacks[url] = [];\n          }\n          self.scriptLoadedCallbacks[url].push({\n            resolve,\n            reject\n          });\n        });\n      }\n      load(url) {\n        return this.add(url);\n      }\n      remove(url) {\n        delete this.states[url];\n        delete this.scriptLoadedCallbacks[url];\n      }\n      loadQueue() {\n        const queue = this.queue;\n        this.queue = [];\n        return this.loadScripts(queue);\n      }\n      loadScripts(scripts) {\n        const self = this;\n        const execCallbacks = (name, url) => {\n          get$a(self.scriptLoadedCallbacks, url).each(callbacks => {\n            each$e(callbacks, callback => callback[name](url));\n          });\n          delete self.scriptLoadedCallbacks[url];\n        };\n        const processResults = results => {\n          const failures = filter$5(results, result => result.status === 'rejected');\n          if (failures.length > 0) {\n            return Promise.reject(bind$3(failures, ({reason}) => isArray$1(reason) ? reason : [reason]));\n          } else {\n            return Promise.resolve();\n          }\n        };\n        const load = urls => Promise.allSettled(map$3(urls, url => {\n          if (self.states[url] === LOADED) {\n            execCallbacks('resolve', url);\n            return Promise.resolve();\n          } else if (self.states[url] === FAILED) {\n            execCallbacks('reject', url);\n            return Promise.reject(url);\n          } else {\n            self.states[url] = LOADING;\n            return self.loadScript(url).then(() => {\n              self.states[url] = LOADED;\n              execCallbacks('resolve', url);\n              const queue = self.queue;\n              if (queue.length > 0) {\n                self.queue = [];\n                return load(queue).then(processResults);\n              } else {\n                return Promise.resolve();\n              }\n            }, () => {\n              self.states[url] = FAILED;\n              execCallbacks('reject', url);\n              return Promise.reject(url);\n            });\n          }\n        }));\n        const processQueue = urls => {\n          self.loading = true;\n          return load(urls).then(results => {\n            self.loading = false;\n            const nextQueuedItem = self.queueLoadedCallbacks.shift();\n            Optional.from(nextQueuedItem).each(call);\n            return processResults(results);\n          });\n        };\n        const uniqueScripts = stringArray(scripts);\n        if (self.loading) {\n          return new Promise((resolve, reject) => {\n            self.queueLoadedCallbacks.push(() => {\n              processQueue(uniqueScripts).then(resolve, reject);\n            });\n          });\n        } else {\n          return processQueue(uniqueScripts);\n        }\n      }\n    }\n    ScriptLoader.ScriptLoader = new ScriptLoader();\n\n    const Cell = initial => {\n      let value = initial;\n      const get = () => {\n        return value;\n      };\n      const set = v => {\n        value = v;\n      };\n      return {\n        get,\n        set\n      };\n    };\n\n    const isDuplicated = (items, item) => {\n      const firstIndex = items.indexOf(item);\n      return firstIndex !== -1 && items.indexOf(item, firstIndex + 1) > firstIndex;\n    };\n    const isRaw = str => isObject(str) && has$2(str, 'raw');\n    const isTokenised = str => isArray$1(str) && str.length > 1;\n    const data = {};\n    const currentCode = Cell('en');\n    const getLanguageData = () => get$a(data, currentCode.get());\n    const getData$1 = () => map$2(data, value => ({ ...value }));\n    const setCode = newCode => {\n      if (newCode) {\n        currentCode.set(newCode);\n      }\n    };\n    const getCode = () => currentCode.get();\n    const add$1 = (code, items) => {\n      let langData = data[code];\n      if (!langData) {\n        data[code] = langData = {};\n      }\n      const lcNames = map$3(keys(items), name => name.toLowerCase());\n      each$d(items, (translation, name) => {\n        const lcName = name.toLowerCase();\n        if (lcName !== name && isDuplicated(lcNames, lcName)) {\n          if (!has$2(items, lcName)) {\n            langData[lcName] = translation;\n          }\n          langData[name] = translation;\n        } else {\n          langData[lcName] = translation;\n        }\n      });\n    };\n    const translate = text => {\n      const langData = getLanguageData().getOr({});\n      const toString = obj => {\n        if (isFunction(obj)) {\n          return Object.prototype.toString.call(obj);\n        }\n        return !isEmpty(obj) ? '' + obj : '';\n      };\n      const isEmpty = text => text === '' || text === null || text === undefined;\n      const getLangData = text => {\n        const textStr = toString(text);\n        return has$2(langData, textStr) ? toString(langData[textStr]) : get$a(langData, textStr.toLowerCase()).map(toString).getOr(textStr);\n      };\n      const removeContext = str => str.replace(/{context:\\w+}$/, '');\n      if (isEmpty(text)) {\n        return '';\n      }\n      if (isRaw(text)) {\n        return toString(text.raw);\n      }\n      if (isTokenised(text)) {\n        const values = text.slice(1);\n        const substitued = getLangData(text[0]).replace(/\\{([0-9]+)\\}/g, ($1, $2) => has$2(values, $2) ? toString(values[$2]) : $1);\n        return removeContext(substitued);\n      }\n      return removeContext(getLangData(text));\n    };\n    const isRtl$1 = () => getLanguageData().bind(items => get$a(items, '_dir')).exists(dir => dir === 'rtl');\n    const hasCode = code => has$2(data, code);\n    const I18n = {\n      getData: getData$1,\n      setCode,\n      getCode,\n      add: add$1,\n      translate,\n      isRtl: isRtl$1,\n      hasCode\n    };\n\n    const AddOnManager = () => {\n      const items = [];\n      const urls = {};\n      const lookup = {};\n      const _listeners = [];\n      const runListeners = (name, state) => {\n        const matchedListeners = filter$5(_listeners, listener => listener.name === name && listener.state === state);\n        each$e(matchedListeners, listener => listener.resolve());\n      };\n      const isLoaded = name => has$2(urls, name);\n      const isAdded = name => has$2(lookup, name);\n      const get = name => {\n        if (lookup[name]) {\n          return lookup[name].instance;\n        }\n        return undefined;\n      };\n      const loadLanguagePack = (name, languages) => {\n        const language = I18n.getCode();\n        const wrappedLanguages = ',' + (languages || '') + ',';\n        if (!language || languages && wrappedLanguages.indexOf(',' + language + ',') === -1) {\n          return;\n        }\n        ScriptLoader.ScriptLoader.add(urls[name] + '/langs/' + language + '.js');\n      };\n      const requireLangPack = (name, languages) => {\n        if (AddOnManager.languageLoad !== false) {\n          if (isLoaded(name)) {\n            loadLanguagePack(name, languages);\n          } else {\n            waitFor(name, 'loaded').then(() => loadLanguagePack(name, languages));\n          }\n        }\n      };\n      const add = (id, addOn) => {\n        items.push(addOn);\n        lookup[id] = { instance: addOn };\n        runListeners(id, 'added');\n        return addOn;\n      };\n      const remove = name => {\n        delete urls[name];\n        delete lookup[name];\n      };\n      const createUrl = (baseUrl, dep) => {\n        if (isString(dep)) {\n          return isString(baseUrl) ? {\n            prefix: '',\n            resource: dep,\n            suffix: ''\n          } : {\n            prefix: baseUrl.prefix,\n            resource: dep,\n            suffix: baseUrl.suffix\n          };\n        } else {\n          return dep;\n        }\n      };\n      const load = (name, addOnUrl) => {\n        if (urls[name]) {\n          return Promise.resolve();\n        }\n        let urlString = isString(addOnUrl) ? addOnUrl : addOnUrl.prefix + addOnUrl.resource + addOnUrl.suffix;\n        if (urlString.indexOf('/') !== 0 && urlString.indexOf('://') === -1) {\n          urlString = AddOnManager.baseURL + '/' + urlString;\n        }\n        urls[name] = urlString.substring(0, urlString.lastIndexOf('/'));\n        const done = () => {\n          runListeners(name, 'loaded');\n          return Promise.resolve();\n        };\n        if (lookup[name]) {\n          return done();\n        } else {\n          return ScriptLoader.ScriptLoader.add(urlString).then(done);\n        }\n      };\n      const waitFor = (name, state = 'added') => {\n        if (state === 'added' && isAdded(name)) {\n          return Promise.resolve();\n        } else if (state === 'loaded' && isLoaded(name)) {\n          return Promise.resolve();\n        } else {\n          return new Promise(resolve => {\n            _listeners.push({\n              name,\n              state,\n              resolve\n            });\n          });\n        }\n      };\n      return {\n        items,\n        urls,\n        lookup,\n        get,\n        requireLangPack,\n        add,\n        remove,\n        createUrl,\n        load,\n        waitFor\n      };\n    };\n    AddOnManager.languageLoad = true;\n    AddOnManager.baseURL = '';\n    AddOnManager.PluginManager = AddOnManager();\n    AddOnManager.ThemeManager = AddOnManager();\n    AddOnManager.ModelManager = AddOnManager();\n\n    const singleton = doRevoke => {\n      const subject = Cell(Optional.none());\n      const revoke = () => subject.get().each(doRevoke);\n      const clear = () => {\n        revoke();\n        subject.set(Optional.none());\n      };\n      const isSet = () => subject.get().isSome();\n      const get = () => subject.get();\n      const set = s => {\n        revoke();\n        subject.set(Optional.some(s));\n      };\n      return {\n        clear,\n        isSet,\n        get,\n        set\n      };\n    };\n    const repeatable = delay => {\n      const intervalId = Cell(Optional.none());\n      const revoke = () => intervalId.get().each(id => clearInterval(id));\n      const clear = () => {\n        revoke();\n        intervalId.set(Optional.none());\n      };\n      const isSet = () => intervalId.get().isSome();\n      const get = () => intervalId.get();\n      const set = functionToRepeat => {\n        revoke();\n        intervalId.set(Optional.some(setInterval(functionToRepeat, delay)));\n      };\n      return {\n        clear,\n        isSet,\n        get,\n        set\n      };\n    };\n    const value$2 = () => {\n      const subject = singleton(noop);\n      const on = f => subject.get().each(f);\n      return {\n        ...subject,\n        on\n      };\n    };\n\n    const first$1 = (fn, rate) => {\n      let timer = null;\n      const cancel = () => {\n        if (!isNull(timer)) {\n          clearTimeout(timer);\n          timer = null;\n        }\n      };\n      const throttle = (...args) => {\n        if (isNull(timer)) {\n          timer = setTimeout(() => {\n            timer = null;\n            fn.apply(null, args);\n          }, rate);\n        }\n      };\n      return {\n        cancel,\n        throttle\n      };\n    };\n    const last = (fn, rate) => {\n      let timer = null;\n      const cancel = () => {\n        if (!isNull(timer)) {\n          clearTimeout(timer);\n          timer = null;\n        }\n      };\n      const throttle = (...args) => {\n        cancel();\n        timer = setTimeout(() => {\n          timer = null;\n          fn.apply(null, args);\n        }, rate);\n      };\n      return {\n        cancel,\n        throttle\n      };\n    };\n\n    const ancestor$1 = (scope, selector, isRoot) => ancestor$3(scope, selector, isRoot).isSome();\n\n    const annotation = constant('mce-annotation');\n    const dataAnnotation = constant('data-mce-annotation');\n    const dataAnnotationId = constant('data-mce-annotation-uid');\n    const dataAnnotationActive = constant('data-mce-annotation-active');\n    const dataAnnotationClasses = constant('data-mce-annotation-classes');\n    const dataAnnotationAttributes = constant('data-mce-annotation-attrs');\n\n    const isRoot$1 = root => node => eq(node, root);\n    const identify = (editor, annotationName) => {\n      const rng = editor.selection.getRng();\n      const start = SugarElement.fromDom(rng.startContainer);\n      const root = SugarElement.fromDom(editor.getBody());\n      const selector = annotationName.fold(() => '.' + annotation(), an => `[${ dataAnnotation() }=\"${ an }\"]`);\n      const newStart = child$1(start, rng.startOffset).getOr(start);\n      const closest = closest$3(newStart, selector, isRoot$1(root));\n      return closest.bind(c => getOpt(c, `${ dataAnnotationId() }`).bind(uid => getOpt(c, `${ dataAnnotation() }`).map(name => {\n        const elements = findMarkers(editor, uid);\n        return {\n          uid,\n          name,\n          elements\n        };\n      })));\n    };\n    const isAnnotation = elem => isElement$7(elem) && has(elem, annotation());\n    const isBogusElement = (elem, root) => has$1(elem, 'data-mce-bogus') || ancestor$1(elem, '[data-mce-bogus=\"all\"]', isRoot$1(root));\n    const findMarkers = (editor, uid) => {\n      const body = SugarElement.fromDom(editor.getBody());\n      const descendants$1 = descendants(body, `[${ dataAnnotationId() }=\"${ uid }\"]`);\n      return filter$5(descendants$1, descendant => !isBogusElement(descendant, body));\n    };\n    const findAll = (editor, name) => {\n      const body = SugarElement.fromDom(editor.getBody());\n      const markers = descendants(body, `[${ dataAnnotation() }=\"${ name }\"]`);\n      const directory = {};\n      each$e(markers, m => {\n        if (!isBogusElement(m, body)) {\n          const uid = get$9(m, dataAnnotationId());\n          const nodesAlready = get$a(directory, uid).getOr([]);\n          directory[uid] = nodesAlready.concat([m]);\n        }\n      });\n      return directory;\n    };\n\n    const setup$y = (editor, registry) => {\n      const changeCallbacks = Cell({});\n      const initData = () => ({\n        listeners: [],\n        previous: value$2()\n      });\n      const withCallbacks = (name, f) => {\n        updateCallbacks(name, data => {\n          f(data);\n          return data;\n        });\n      };\n      const updateCallbacks = (name, f) => {\n        const callbackMap = changeCallbacks.get();\n        const data = get$a(callbackMap, name).getOrThunk(initData);\n        const outputData = f(data);\n        callbackMap[name] = outputData;\n        changeCallbacks.set(callbackMap);\n      };\n      const fireCallbacks = (name, uid, elements) => {\n        withCallbacks(name, data => {\n          each$e(data.listeners, f => f(true, name, {\n            uid,\n            nodes: map$3(elements, elem => elem.dom)\n          }));\n        });\n      };\n      const fireNoAnnotation = name => {\n        withCallbacks(name, data => {\n          each$e(data.listeners, f => f(false, name));\n        });\n      };\n      const toggleActiveAttr = (uid, state) => {\n        each$e(findMarkers(editor, uid), elem => {\n          if (state) {\n            set$3(elem, dataAnnotationActive(), 'true');\n          } else {\n            remove$9(elem, dataAnnotationActive());\n          }\n        });\n      };\n      const onNodeChange = last(() => {\n        const annotations = sort(registry.getNames());\n        each$e(annotations, name => {\n          updateCallbacks(name, data => {\n            const prev = data.previous.get();\n            identify(editor, Optional.some(name)).fold(() => {\n              prev.each(uid => {\n                fireNoAnnotation(name);\n                data.previous.clear();\n                toggleActiveAttr(uid, false);\n              });\n            }, ({uid, name, elements}) => {\n              if (!is$2(prev, uid)) {\n                prev.each(uid => toggleActiveAttr(uid, false));\n                fireCallbacks(name, uid, elements);\n                data.previous.set(uid);\n                toggleActiveAttr(uid, true);\n              }\n            });\n            return {\n              previous: data.previous,\n              listeners: data.listeners\n            };\n          });\n        });\n      }, 30);\n      editor.on('remove', () => {\n        onNodeChange.cancel();\n      });\n      editor.on('NodeChange', () => {\n        onNodeChange.throttle();\n      });\n      const addListener = (name, f) => {\n        updateCallbacks(name, data => ({\n          previous: data.previous,\n          listeners: data.listeners.concat([f])\n        }));\n      };\n      return { addListener };\n    };\n\n    const setup$x = (editor, registry) => {\n      const dataAnnotation$1 = dataAnnotation();\n      const identifyParserNode = node => Optional.from(node.attr(dataAnnotation$1)).bind(registry.lookup);\n      const removeDirectAnnotation = node => {\n        var _a, _b;\n        node.attr(dataAnnotationId(), null);\n        node.attr(dataAnnotation(), null);\n        node.attr(dataAnnotationActive(), null);\n        const customAttrNames = Optional.from(node.attr(dataAnnotationAttributes())).map(names => names.split(',')).getOr([]);\n        const customClasses = Optional.from(node.attr(dataAnnotationClasses())).map(names => names.split(',')).getOr([]);\n        each$e(customAttrNames, name => node.attr(name, null));\n        const classList = (_b = (_a = node.attr('class')) === null || _a === void 0 ? void 0 : _a.split(' ')) !== null && _b !== void 0 ? _b : [];\n        const newClassList = difference(classList, [annotation()].concat(customClasses));\n        node.attr('class', newClassList.length > 0 ? newClassList.join(' ') : null);\n        node.attr(dataAnnotationClasses(), null);\n        node.attr(dataAnnotationAttributes(), null);\n      };\n      editor.serializer.addTempAttr(dataAnnotationActive());\n      editor.serializer.addAttributeFilter(dataAnnotation$1, nodes => {\n        for (const node of nodes) {\n          identifyParserNode(node).each(settings => {\n            if (settings.persistent === false) {\n              if (node.name === 'span') {\n                node.unwrap();\n              } else {\n                removeDirectAnnotation(node);\n              }\n            }\n          });\n        }\n      });\n    };\n\n    const create$b = () => {\n      const annotations = {};\n      const register = (name, settings) => {\n        annotations[name] = {\n          name,\n          settings\n        };\n      };\n      const lookup = name => get$a(annotations, name).map(a => a.settings);\n      const getNames = () => keys(annotations);\n      return {\n        register,\n        lookup,\n        getNames\n      };\n    };\n\n    let unique = 0;\n    const generate$1 = prefix => {\n      const date = new Date();\n      const time = date.getTime();\n      const random = Math.floor(Math.random() * 1000000000);\n      unique++;\n      return prefix + '_' + random + unique + String(time);\n    };\n\n    const add = (element, classes) => {\n      each$e(classes, x => {\n        add$2(element, x);\n      });\n    };\n    const remove$3 = (element, classes) => {\n      each$e(classes, x => {\n        remove$6(element, x);\n      });\n    };\n\n    const clone$2 = (original, isDeep) => SugarElement.fromDom(original.dom.cloneNode(isDeep));\n    const shallow$1 = original => clone$2(original, false);\n    const deep$1 = original => clone$2(original, true);\n    const shallowAs = (original, tag) => {\n      const nu = SugarElement.fromTag(tag);\n      const attributes = clone$4(original);\n      setAll$1(nu, attributes);\n      return nu;\n    };\n    const mutate = (original, tag) => {\n      const nu = shallowAs(original, tag);\n      after$4(original, nu);\n      const children = children$1(original);\n      append(nu, children);\n      remove$4(original);\n      return nu;\n    };\n\n    const TextWalker = (startNode, rootNode, isBoundary = never) => {\n      const walker = new DomTreeWalker(startNode, rootNode);\n      const walk = direction => {\n        let next;\n        do {\n          next = walker[direction]();\n        } while (next && !isText$b(next) && !isBoundary(next));\n        return Optional.from(next).filter(isText$b);\n      };\n      return {\n        current: () => Optional.from(walker.current()).filter(isText$b),\n        next: () => walk('next'),\n        prev: () => walk('prev'),\n        prev2: () => walk('prev2')\n      };\n    };\n\n    const TextSeeker = (dom, isBoundary) => {\n      const isBlockBoundary = isBoundary ? isBoundary : node => dom.isBlock(node) || isBr$6(node) || isContentEditableFalse$b(node);\n      const walk = (node, offset, walker, process) => {\n        if (isText$b(node)) {\n          const newOffset = process(node, offset, node.data);\n          if (newOffset !== -1) {\n            return Optional.some({\n              container: node,\n              offset: newOffset\n            });\n          }\n        }\n        return walker().bind(next => walk(next.container, next.offset, walker, process));\n      };\n      const backwards = (node, offset, process, root) => {\n        const walker = TextWalker(node, root !== null && root !== void 0 ? root : dom.getRoot(), isBlockBoundary);\n        return walk(node, offset, () => walker.prev().map(prev => ({\n          container: prev,\n          offset: prev.length\n        })), process).getOrNull();\n      };\n      const forwards = (node, offset, process, root) => {\n        const walker = TextWalker(node, root !== null && root !== void 0 ? root : dom.getRoot(), isBlockBoundary);\n        return walk(node, offset, () => walker.next().map(next => ({\n          container: next,\n          offset: 0\n        })), process).getOrNull();\n      };\n      return {\n        backwards,\n        forwards\n      };\n    };\n\n    const NodeValue = (is, name) => {\n      const get = element => {\n        if (!is(element)) {\n          throw new Error('Can only get ' + name + ' value of a ' + name + ' node');\n        }\n        return getOption(element).getOr('');\n      };\n      const getOption = element => is(element) ? Optional.from(element.dom.nodeValue) : Optional.none();\n      const set = (element, value) => {\n        if (!is(element)) {\n          throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');\n        }\n        element.dom.nodeValue = value;\n      };\n      return {\n        get,\n        getOption,\n        set\n      };\n    };\n\n    const api$1 = NodeValue(isText$c, 'text');\n    const get$3 = element => api$1.get(element);\n    const getOption = element => api$1.getOption(element);\n    const set = (element, value) => api$1.set(element, value);\n\n    const tableCells = [\n      'td',\n      'th'\n    ];\n    const tableSections = [\n      'thead',\n      'tbody',\n      'tfoot'\n    ];\n    const textBlocks = [\n      'h1',\n      'h2',\n      'h3',\n      'h4',\n      'h5',\n      'h6',\n      'p',\n      'div',\n      'address',\n      'pre',\n      'form',\n      'blockquote',\n      'center',\n      'dir',\n      'fieldset',\n      'header',\n      'footer',\n      'article',\n      'section',\n      'hgroup',\n      'aside',\n      'nav',\n      'figure'\n    ];\n    const listItems$1 = [\n      'li',\n      'dd',\n      'dt'\n    ];\n    const lists = [\n      'ul',\n      'ol',\n      'dl'\n    ];\n    const wsElements = [\n      'pre',\n      'script',\n      'textarea',\n      'style'\n    ];\n    const lazyLookup = items => {\n      let lookup;\n      return node => {\n        lookup = lookup ? lookup : mapToObject(items, always);\n        return has$2(lookup, name(node));\n      };\n    };\n    const isTable$1 = node => name(node) === 'table';\n    const isBr$5 = node => isElement$7(node) && name(node) === 'br';\n    const isTextBlock$2 = lazyLookup(textBlocks);\n    const isList = lazyLookup(lists);\n    const isListItem$1 = lazyLookup(listItems$1);\n    const isTableSection = lazyLookup(tableSections);\n    const isTableCell$2 = lazyLookup(tableCells);\n    const isWsPreserveElement = lazyLookup(wsElements);\n\n    const getLastChildren$1 = elm => {\n      const children = [];\n      let rawNode = elm.dom;\n      while (rawNode) {\n        children.push(SugarElement.fromDom(rawNode));\n        rawNode = rawNode.lastChild;\n      }\n      return children;\n    };\n    const removeTrailingBr = elm => {\n      const allBrs = descendants(elm, 'br');\n      const brs = filter$5(getLastChildren$1(elm).slice(-1), isBr$5);\n      if (allBrs.length === brs.length) {\n        each$e(brs, remove$4);\n      }\n    };\n    const createPaddingBr = () => {\n      const br = SugarElement.fromTag('br');\n      set$3(br, 'data-mce-bogus', '1');\n      return br;\n    };\n    const fillWithPaddingBr = elm => {\n      empty(elm);\n      append$1(elm, createPaddingBr());\n    };\n    const trimBlockTrailingBr = (elm, schema) => {\n      lastChild(elm).each(lastChild => {\n        prevSibling(lastChild).each(lastChildPrevSibling => {\n          if (schema.isBlock(name(elm)) && isBr$5(lastChild) && schema.isBlock(name(lastChildPrevSibling))) {\n            remove$4(lastChild);\n          }\n        });\n      });\n    };\n\n    const ZWSP$1 = zeroWidth;\n    const isZwsp = isZwsp$2;\n    const trim$2 = removeZwsp;\n    const insert$5 = editor => editor.insertContent(ZWSP$1, { preserve_zwsp: true });\n\n    const isElement$5 = isElement$6;\n    const isText$9 = isText$b;\n    const isCaretContainerBlock$1 = node => {\n      if (isText$9(node)) {\n        node = node.parentNode;\n      }\n      return isElement$5(node) && node.hasAttribute('data-mce-caret');\n    };\n    const isCaretContainerInline = node => isText$9(node) && isZwsp(node.data);\n    const isCaretContainer$2 = node => isCaretContainerBlock$1(node) || isCaretContainerInline(node);\n    const hasContent = node => node.firstChild !== node.lastChild || !isBr$6(node.firstChild);\n    const insertInline$1 = (node, before) => {\n      var _a;\n      const doc = (_a = node.ownerDocument) !== null && _a !== void 0 ? _a : document;\n      const textNode = doc.createTextNode(ZWSP$1);\n      const parentNode = node.parentNode;\n      if (!before) {\n        const sibling = node.nextSibling;\n        if (isText$9(sibling)) {\n          if (isCaretContainer$2(sibling)) {\n            return sibling;\n          }\n          if (startsWithCaretContainer$1(sibling)) {\n            sibling.splitText(1);\n            return sibling;\n          }\n        }\n        if (node.nextSibling) {\n          parentNode === null || parentNode === void 0 ? void 0 : parentNode.insertBefore(textNode, node.nextSibling);\n        } else {\n          parentNode === null || parentNode === void 0 ? void 0 : parentNode.appendChild(textNode);\n        }\n      } else {\n        const sibling = node.previousSibling;\n        if (isText$9(sibling)) {\n          if (isCaretContainer$2(sibling)) {\n            return sibling;\n          }\n          if (endsWithCaretContainer$1(sibling)) {\n            return sibling.splitText(sibling.data.length - 1);\n          }\n        }\n        parentNode === null || parentNode === void 0 ? void 0 : parentNode.insertBefore(textNode, node);\n      }\n      return textNode;\n    };\n    const isBeforeInline = pos => {\n      const container = pos.container();\n      if (!isText$b(container)) {\n        return false;\n      }\n      return container.data.charAt(pos.offset()) === ZWSP$1 || pos.isAtStart() && isCaretContainerInline(container.previousSibling);\n    };\n    const isAfterInline = pos => {\n      const container = pos.container();\n      if (!isText$b(container)) {\n        return false;\n      }\n      return container.data.charAt(pos.offset() - 1) === ZWSP$1 || pos.isAtEnd() && isCaretContainerInline(container.nextSibling);\n    };\n    const insertBlock = (blockName, node, before) => {\n      var _a;\n      const doc = (_a = node.ownerDocument) !== null && _a !== void 0 ? _a : document;\n      const blockNode = doc.createElement(blockName);\n      blockNode.setAttribute('data-mce-caret', before ? 'before' : 'after');\n      blockNode.setAttribute('data-mce-bogus', 'all');\n      blockNode.appendChild(createPaddingBr().dom);\n      const parentNode = node.parentNode;\n      if (!before) {\n        if (node.nextSibling) {\n          parentNode === null || parentNode === void 0 ? void 0 : parentNode.insertBefore(blockNode, node.nextSibling);\n        } else {\n          parentNode === null || parentNode === void 0 ? void 0 : parentNode.appendChild(blockNode);\n        }\n      } else {\n        parentNode === null || parentNode === void 0 ? void 0 : parentNode.insertBefore(blockNode, node);\n      }\n      return blockNode;\n    };\n    const startsWithCaretContainer$1 = node => isText$9(node) && node.data[0] === ZWSP$1;\n    const endsWithCaretContainer$1 = node => isText$9(node) && node.data[node.data.length - 1] === ZWSP$1;\n    const trimBogusBr = elm => {\n      var _a;\n      const brs = elm.getElementsByTagName('br');\n      const lastBr = brs[brs.length - 1];\n      if (isBogus$1(lastBr)) {\n        (_a = lastBr.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(lastBr);\n      }\n    };\n    const showCaretContainerBlock = caretContainer => {\n      if (caretContainer && caretContainer.hasAttribute('data-mce-caret')) {\n        trimBogusBr(caretContainer);\n        caretContainer.removeAttribute('data-mce-caret');\n        caretContainer.removeAttribute('data-mce-bogus');\n        caretContainer.removeAttribute('style');\n        caretContainer.removeAttribute('data-mce-style');\n        caretContainer.removeAttribute('_moz_abspos');\n        return caretContainer;\n      }\n      return null;\n    };\n    const isRangeInCaretContainerBlock = range => isCaretContainerBlock$1(range.startContainer);\n\n    const round$2 = Math.round;\n    const clone$1 = rect => {\n      if (!rect) {\n        return {\n          left: 0,\n          top: 0,\n          bottom: 0,\n          right: 0,\n          width: 0,\n          height: 0\n        };\n      }\n      return {\n        left: round$2(rect.left),\n        top: round$2(rect.top),\n        bottom: round$2(rect.bottom),\n        right: round$2(rect.right),\n        width: round$2(rect.width),\n        height: round$2(rect.height)\n      };\n    };\n    const collapse = (rect, toStart) => {\n      rect = clone$1(rect);\n      if (toStart) {\n        rect.right = rect.left;\n      } else {\n        rect.left = rect.left + rect.width;\n        rect.right = rect.left;\n      }\n      rect.width = 0;\n      return rect;\n    };\n    const isEqual = (rect1, rect2) => rect1.left === rect2.left && rect1.top === rect2.top && rect1.bottom === rect2.bottom && rect1.right === rect2.right;\n    const isValidOverflow = (overflowY, rect1, rect2) => overflowY >= 0 && overflowY <= Math.min(rect1.height, rect2.height) / 2;\n    const isAbove$1 = (rect1, rect2) => {\n      const halfHeight = Math.min(rect2.height / 2, rect1.height / 2);\n      if (rect1.bottom - halfHeight < rect2.top) {\n        return true;\n      }\n      if (rect1.top > rect2.bottom) {\n        return false;\n      }\n      return isValidOverflow(rect2.top - rect1.bottom, rect1, rect2);\n    };\n    const isBelow$1 = (rect1, rect2) => {\n      if (rect1.top > rect2.bottom) {\n        return true;\n      }\n      if (rect1.bottom < rect2.top) {\n        return false;\n      }\n      return isValidOverflow(rect2.bottom - rect1.top, rect1, rect2);\n    };\n    const containsXY = (rect, clientX, clientY) => clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom;\n    const boundingClientRectFromRects = rects => {\n      return foldl(rects, (acc, rect) => {\n        return acc.fold(() => Optional.some(rect), prevRect => {\n          const left = Math.min(rect.left, prevRect.left);\n          const top = Math.min(rect.top, prevRect.top);\n          const right = Math.max(rect.right, prevRect.right);\n          const bottom = Math.max(rect.bottom, prevRect.bottom);\n          return Optional.some({\n            top,\n            right,\n            bottom,\n            left,\n            width: right - left,\n            height: bottom - top\n          });\n        });\n      }, Optional.none());\n    };\n    const distanceToRectEdgeFromXY = (rect, x, y) => {\n      const cx = Math.max(Math.min(x, rect.left + rect.width), rect.left);\n      const cy = Math.max(Math.min(y, rect.top + rect.height), rect.top);\n      return Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy));\n    };\n    const overlapY = (r1, r2) => Math.max(0, Math.min(r1.bottom, r2.bottom) - Math.max(r1.top, r2.top));\n\n    const clamp$2 = (value, min, max) => Math.min(Math.max(value, min), max);\n\n    const getSelectedNode = range => {\n      const startContainer = range.startContainer, startOffset = range.startOffset;\n      if (startContainer === range.endContainer && startContainer.hasChildNodes() && range.endOffset === startOffset + 1) {\n        return startContainer.childNodes[startOffset];\n      }\n      return null;\n    };\n    const getNode$1 = (container, offset) => {\n      if (isElement$6(container) && container.hasChildNodes()) {\n        const childNodes = container.childNodes;\n        const safeOffset = clamp$2(offset, 0, childNodes.length - 1);\n        return childNodes[safeOffset];\n      } else {\n        return container;\n      }\n    };\n    const getNodeUnsafe = (container, offset) => {\n      if (offset < 0 && isElement$6(container) && container.hasChildNodes()) {\n        return undefined;\n      } else {\n        return getNode$1(container, offset);\n      }\n    };\n\n    const extendingChars = new RegExp('[\\u0300-\\u036f\\u0483-\\u0487\\u0488-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u0610-\\u061a' + '\\u064b-\\u065f\\u0670\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7-\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0' + '\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0859-\\u085b\\u08e3-\\u0902\\u093a\\u093c' + '\\u0941-\\u0948\\u094d\\u0951-\\u0957\\u0962-\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2-\\u09e3' + '\\u0a01-\\u0a02\\u0a3c\\u0a41-\\u0a42\\u0a47-\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70-\\u0a71\\u0a75\\u0a81-\\u0a82\\u0abc' + '\\u0ac1-\\u0ac5\\u0ac7-\\u0ac8\\u0acd\\u0ae2-\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57' + '\\u0b62-\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c00\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55-\\u0c56' + '\\u0c62-\\u0c63\\u0c81\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc-\\u0ccd\\u0cd5-\\u0cd6\\u0ce2-\\u0ce3\\u0d01\\u0d3e\\u0d41-\\u0d44' + '\\u0d4d\\u0d57\\u0d62-\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9' + '\\u0ebb-\\u0ebc\\u0ec8-\\u0ecd\\u0f18-\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86-\\u0f87\\u0f8d-\\u0f97' + '\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039-\\u103a\\u103d-\\u103e\\u1058-\\u1059\\u105e-\\u1060\\u1071-\\u1074' + '\\u1082\\u1085-\\u1086\\u108d\\u109d\\u135d-\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752-\\u1753\\u1772-\\u1773\\u17b4-\\u17b5' + '\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927-\\u1928\\u1932\\u1939-\\u193b\\u1a17-\\u1a18' + '\\u1a1b\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1ab0-\\u1abd\\u1ABE\\u1b00-\\u1b03\\u1b34' + '\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80-\\u1b81\\u1ba2-\\u1ba5\\u1ba8-\\u1ba9\\u1bab-\\u1bad\\u1be6\\u1be8-\\u1be9' + '\\u1bed\\u1bef-\\u1bf1\\u1c2c-\\u1c33\\u1c36-\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1cf4\\u1cf8-\\u1cf9' + '\\u1dc0-\\u1df5\\u1dfc-\\u1dff\\u200c-\\u200d\\u20d0-\\u20dc\\u20DD-\\u20E0\\u20e1\\u20E2-\\u20E4\\u20e5-\\u20f0\\u2cef-\\u2cf1' + '\\u2d7f\\u2de0-\\u2dff\\u302a-\\u302d\\u302e-\\u302f\\u3099-\\u309a\\ua66f\\uA670-\\uA672\\ua674-\\ua67d\\ua69e-\\ua69f\\ua6f0-\\ua6f1' + '\\ua802\\ua806\\ua80b\\ua825-\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc' + '\\ua9e5\\uaa29-\\uaa2e\\uaa31-\\uaa32\\uaa35-\\uaa36\\uaa43\\uaa4c\\uaa7c\\uaab0\\uaab2-\\uaab4\\uaab7-\\uaab8\\uaabe-\\uaabf\\uaac1' + '\\uaaec-\\uaaed\\uaaf6\\uabe5\\uabe8\\uabed\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe2f\\uff9e-\\uff9f]');\n    const isExtendingChar = ch => isString(ch) && ch.charCodeAt(0) >= 768 && extendingChars.test(ch);\n\n    const or = (...args) => {\n      return x => {\n        for (let i = 0; i < args.length; i++) {\n          if (args[i](x)) {\n            return true;\n          }\n        }\n        return false;\n      };\n    };\n    const and = (...args) => {\n      return x => {\n        for (let i = 0; i < args.length; i++) {\n          if (!args[i](x)) {\n            return false;\n          }\n        }\n        return true;\n      };\n    };\n\n    const isContentEditableTrue$2 = isContentEditableTrue$3;\n    const isContentEditableFalse$a = isContentEditableFalse$b;\n    const isBr$4 = isBr$6;\n    const isText$8 = isText$b;\n    const isInvalidTextElement = matchNodeNames([\n      'script',\n      'style',\n      'textarea'\n    ]);\n    const isAtomicInline = matchNodeNames([\n      'img',\n      'input',\n      'textarea',\n      'hr',\n      'iframe',\n      'video',\n      'audio',\n      'object',\n      'embed'\n    ]);\n    const isTable = matchNodeNames(['table']);\n    const isCaretContainer$1 = isCaretContainer$2;\n    const isCaretCandidate$3 = node => {\n      if (isCaretContainer$1(node)) {\n        return false;\n      }\n      if (isText$8(node)) {\n        return !isInvalidTextElement(node.parentNode);\n      }\n      return isAtomicInline(node) || isBr$4(node) || isTable(node) || isNonUiContentEditableFalse(node);\n    };\n    const isUnselectable = node => isElement$6(node) && node.getAttribute('unselectable') === 'true';\n    const isNonUiContentEditableFalse = node => !isUnselectable(node) && isContentEditableFalse$a(node);\n    const isInEditable = (node, root) => {\n      for (let tempNode = node.parentNode; tempNode && tempNode !== root; tempNode = tempNode.parentNode) {\n        if (isNonUiContentEditableFalse(tempNode)) {\n          return false;\n        }\n        if (isContentEditableTrue$2(tempNode)) {\n          return true;\n        }\n      }\n      return true;\n    };\n    const isAtomicContentEditableFalse = node => {\n      if (!isNonUiContentEditableFalse(node)) {\n        return false;\n      }\n      return !foldl(from(node.getElementsByTagName('*')), (result, elm) => {\n        return result || isContentEditableTrue$2(elm);\n      }, false);\n    };\n    const isAtomic$1 = node => isAtomicInline(node) || isAtomicContentEditableFalse(node);\n    const isEditableCaretCandidate$1 = (node, root) => isCaretCandidate$3(node) && isInEditable(node, root);\n\n    const isElement$4 = isElement$6;\n    const isCaretCandidate$2 = isCaretCandidate$3;\n    const isBlock$2 = matchStyleValues('display', 'block table');\n    const isFloated = matchStyleValues('float', 'left right');\n    const isValidElementCaretCandidate = and(isElement$4, isCaretCandidate$2, not(isFloated));\n    const isNotPre = not(matchStyleValues('white-space', 'pre pre-line pre-wrap'));\n    const isText$7 = isText$b;\n    const isBr$3 = isBr$6;\n    const nodeIndex$1 = DOMUtils.nodeIndex;\n    const resolveIndex$1 = getNodeUnsafe;\n    const createRange$1 = doc => doc ? doc.createRange() : DOMUtils.DOM.createRng();\n    const isWhiteSpace$1 = chr => isString(chr) && /[\\r\\n\\t ]/.test(chr);\n    const isRange = rng => !!rng.setStart && !!rng.setEnd;\n    const isHiddenWhiteSpaceRange = range => {\n      const container = range.startContainer;\n      const offset = range.startOffset;\n      if (isWhiteSpace$1(range.toString()) && isNotPre(container.parentNode) && isText$b(container)) {\n        const text = container.data;\n        if (isWhiteSpace$1(text[offset - 1]) || isWhiteSpace$1(text[offset + 1])) {\n          return true;\n        }\n      }\n      return false;\n    };\n    const getBrClientRect = brNode => {\n      const doc = brNode.ownerDocument;\n      const rng = createRange$1(doc);\n      const nbsp$1 = doc.createTextNode(nbsp);\n      const parentNode = brNode.parentNode;\n      parentNode.insertBefore(nbsp$1, brNode);\n      rng.setStart(nbsp$1, 0);\n      rng.setEnd(nbsp$1, 1);\n      const clientRect = clone$1(rng.getBoundingClientRect());\n      parentNode.removeChild(nbsp$1);\n      return clientRect;\n    };\n    const getBoundingClientRectWebKitText = rng => {\n      const sc = rng.startContainer;\n      const ec = rng.endContainer;\n      const so = rng.startOffset;\n      const eo = rng.endOffset;\n      if (sc === ec && isText$b(ec) && so === 0 && eo === 1) {\n        const newRng = rng.cloneRange();\n        newRng.setEndAfter(ec);\n        return getBoundingClientRect$1(newRng);\n      } else {\n        return null;\n      }\n    };\n    const isZeroRect = r => r.left === 0 && r.right === 0 && r.top === 0 && r.bottom === 0;\n    const getBoundingClientRect$1 = item => {\n      var _a;\n      let clientRect;\n      const clientRects = item.getClientRects();\n      if (clientRects.length > 0) {\n        clientRect = clone$1(clientRects[0]);\n      } else {\n        clientRect = clone$1(item.getBoundingClientRect());\n      }\n      if (!isRange(item) && isBr$3(item) && isZeroRect(clientRect)) {\n        return getBrClientRect(item);\n      }\n      if (isZeroRect(clientRect) && isRange(item)) {\n        return (_a = getBoundingClientRectWebKitText(item)) !== null && _a !== void 0 ? _a : clientRect;\n      }\n      return clientRect;\n    };\n    const collapseAndInflateWidth = (clientRect, toStart) => {\n      const newClientRect = collapse(clientRect, toStart);\n      newClientRect.width = 1;\n      newClientRect.right = newClientRect.left + 1;\n      return newClientRect;\n    };\n    const getCaretPositionClientRects = caretPosition => {\n      const clientRects = [];\n      const addUniqueAndValidRect = clientRect => {\n        if (clientRect.height === 0) {\n          return;\n        }\n        if (clientRects.length > 0) {\n          if (isEqual(clientRect, clientRects[clientRects.length - 1])) {\n            return;\n          }\n        }\n        clientRects.push(clientRect);\n      };\n      const addCharacterOffset = (container, offset) => {\n        const range = createRange$1(container.ownerDocument);\n        if (offset < container.data.length) {\n          if (isExtendingChar(container.data[offset])) {\n            return;\n          }\n          if (isExtendingChar(container.data[offset - 1])) {\n            range.setStart(container, offset);\n            range.setEnd(container, offset + 1);\n            if (!isHiddenWhiteSpaceRange(range)) {\n              addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(range), false));\n              return;\n            }\n          }\n        }\n        if (offset > 0) {\n          range.setStart(container, offset - 1);\n          range.setEnd(container, offset);\n          if (!isHiddenWhiteSpaceRange(range)) {\n            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(range), false));\n          }\n        }\n        if (offset < container.data.length) {\n          range.setStart(container, offset);\n          range.setEnd(container, offset + 1);\n          if (!isHiddenWhiteSpaceRange(range)) {\n            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(range), true));\n          }\n        }\n      };\n      const container = caretPosition.container();\n      const offset = caretPosition.offset();\n      if (isText$7(container)) {\n        addCharacterOffset(container, offset);\n        return clientRects;\n      }\n      if (isElement$4(container)) {\n        if (caretPosition.isAtEnd()) {\n          const node = resolveIndex$1(container, offset);\n          if (isText$7(node)) {\n            addCharacterOffset(node, node.data.length);\n          }\n          if (isValidElementCaretCandidate(node) && !isBr$3(node)) {\n            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(node), false));\n          }\n        } else {\n          const node = resolveIndex$1(container, offset);\n          if (isText$7(node)) {\n            addCharacterOffset(node, 0);\n          }\n          if (isValidElementCaretCandidate(node) && caretPosition.isAtEnd()) {\n            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(node), false));\n            return clientRects;\n          }\n          const beforeNode = resolveIndex$1(caretPosition.container(), caretPosition.offset() - 1);\n          if (isValidElementCaretCandidate(beforeNode) && !isBr$3(beforeNode)) {\n            if (isBlock$2(beforeNode) || isBlock$2(node) || !isValidElementCaretCandidate(node)) {\n              addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(beforeNode), false));\n            }\n          }\n          if (isValidElementCaretCandidate(node)) {\n            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(node), true));\n          }\n        }\n      }\n      return clientRects;\n    };\n    const CaretPosition = (container, offset, clientRects) => {\n      const isAtStart = () => {\n        if (isText$7(container)) {\n          return offset === 0;\n        }\n        return offset === 0;\n      };\n      const isAtEnd = () => {\n        if (isText$7(container)) {\n          return offset >= container.data.length;\n        }\n        return offset >= container.childNodes.length;\n      };\n      const toRange = () => {\n        const range = createRange$1(container.ownerDocument);\n        range.setStart(container, offset);\n        range.setEnd(container, offset);\n        return range;\n      };\n      const getClientRects = () => {\n        if (!clientRects) {\n          clientRects = getCaretPositionClientRects(CaretPosition(container, offset));\n        }\n        return clientRects;\n      };\n      const isVisible = () => getClientRects().length > 0;\n      const isEqual = caretPosition => caretPosition && container === caretPosition.container() && offset === caretPosition.offset();\n      const getNode = before => resolveIndex$1(container, before ? offset - 1 : offset);\n      return {\n        container: constant(container),\n        offset: constant(offset),\n        toRange,\n        getClientRects,\n        isVisible,\n        isAtStart,\n        isAtEnd,\n        isEqual,\n        getNode\n      };\n    };\n    CaretPosition.fromRangeStart = range => CaretPosition(range.startContainer, range.startOffset);\n    CaretPosition.fromRangeEnd = range => CaretPosition(range.endContainer, range.endOffset);\n    CaretPosition.after = node => CaretPosition(node.parentNode, nodeIndex$1(node) + 1);\n    CaretPosition.before = node => CaretPosition(node.parentNode, nodeIndex$1(node));\n    CaretPosition.isAbove = (pos1, pos2) => lift2(head(pos2.getClientRects()), last$2(pos1.getClientRects()), isAbove$1).getOr(false);\n    CaretPosition.isBelow = (pos1, pos2) => lift2(last$2(pos2.getClientRects()), head(pos1.getClientRects()), isBelow$1).getOr(false);\n    CaretPosition.isAtStart = pos => pos ? pos.isAtStart() : false;\n    CaretPosition.isAtEnd = pos => pos ? pos.isAtEnd() : false;\n    CaretPosition.isTextPosition = pos => pos ? isText$b(pos.container()) : false;\n    CaretPosition.isElementPosition = pos => !CaretPosition.isTextPosition(pos);\n\n    const trimEmptyTextNode$1 = (dom, node) => {\n      if (isText$b(node) && node.data.length === 0) {\n        dom.remove(node);\n      }\n    };\n    const insertNode = (dom, rng, node) => {\n      rng.insertNode(node);\n      trimEmptyTextNode$1(dom, node.previousSibling);\n      trimEmptyTextNode$1(dom, node.nextSibling);\n    };\n    const insertFragment = (dom, rng, frag) => {\n      const firstChild = Optional.from(frag.firstChild);\n      const lastChild = Optional.from(frag.lastChild);\n      rng.insertNode(frag);\n      firstChild.each(child => trimEmptyTextNode$1(dom, child.previousSibling));\n      lastChild.each(child => trimEmptyTextNode$1(dom, child.nextSibling));\n    };\n    const rangeInsertNode = (dom, rng, node) => {\n      if (isDocumentFragment(node)) {\n        insertFragment(dom, rng, node);\n      } else {\n        insertNode(dom, rng, node);\n      }\n    };\n\n    const isText$6 = isText$b;\n    const isBogus = isBogus$1;\n    const nodeIndex = DOMUtils.nodeIndex;\n    const normalizedParent = node => {\n      const parentNode = node.parentNode;\n      if (isBogus(parentNode)) {\n        return normalizedParent(parentNode);\n      }\n      return parentNode;\n    };\n    const getChildNodes = node => {\n      if (!node) {\n        return [];\n      }\n      return reduce(node.childNodes, (result, node) => {\n        if (isBogus(node) && node.nodeName !== 'BR') {\n          result = result.concat(getChildNodes(node));\n        } else {\n          result.push(node);\n        }\n        return result;\n      }, []);\n    };\n    const normalizedTextOffset = (node, offset) => {\n      let tempNode = node;\n      while (tempNode = tempNode.previousSibling) {\n        if (!isText$6(tempNode)) {\n          break;\n        }\n        offset += tempNode.data.length;\n      }\n      return offset;\n    };\n    const equal = a => b => a === b;\n    const normalizedNodeIndex = node => {\n      let nodes, index;\n      nodes = getChildNodes(normalizedParent(node));\n      index = findIndex$1(nodes, equal(node), node);\n      nodes = nodes.slice(0, index + 1);\n      const numTextFragments = reduce(nodes, (result, node, i) => {\n        if (isText$6(node) && isText$6(nodes[i - 1])) {\n          result++;\n        }\n        return result;\n      }, 0);\n      nodes = filter$3(nodes, matchNodeNames([node.nodeName]));\n      index = findIndex$1(nodes, equal(node), node);\n      return index - numTextFragments;\n    };\n    const createPathItem = node => {\n      const name = isText$6(node) ? 'text()' : node.nodeName.toLowerCase();\n      return name + '[' + normalizedNodeIndex(node) + ']';\n    };\n    const parentsUntil$1 = (root, node, predicate) => {\n      const parents = [];\n      for (let tempNode = node.parentNode; tempNode && tempNode !== root; tempNode = tempNode.parentNode) {\n        if (predicate && predicate(tempNode)) {\n          break;\n        }\n        parents.push(tempNode);\n      }\n      return parents;\n    };\n    const create$a = (root, caretPosition) => {\n      let path = [];\n      let container = caretPosition.container();\n      let offset = caretPosition.offset();\n      let outputOffset;\n      if (isText$6(container)) {\n        outputOffset = normalizedTextOffset(container, offset);\n      } else {\n        const childNodes = container.childNodes;\n        if (offset >= childNodes.length) {\n          outputOffset = 'after';\n          offset = childNodes.length - 1;\n        } else {\n          outputOffset = 'before';\n        }\n        container = childNodes[offset];\n      }\n      path.push(createPathItem(container));\n      let parents = parentsUntil$1(root, container);\n      parents = filter$3(parents, not(isBogus$1));\n      path = path.concat(map$1(parents, node => {\n        return createPathItem(node);\n      }));\n      return path.reverse().join('/') + ',' + outputOffset;\n    };\n    const resolvePathItem = (node, name, index) => {\n      let nodes = getChildNodes(node);\n      nodes = filter$3(nodes, (node, index) => {\n        return !isText$6(node) || !isText$6(nodes[index - 1]);\n      });\n      nodes = filter$3(nodes, matchNodeNames([name]));\n      return nodes[index];\n    };\n    const findTextPosition = (container, offset) => {\n      let node = container;\n      let targetOffset = 0;\n      while (isText$6(node)) {\n        const dataLen = node.data.length;\n        if (offset >= targetOffset && offset <= targetOffset + dataLen) {\n          container = node;\n          offset = offset - targetOffset;\n          break;\n        }\n        if (!isText$6(node.nextSibling)) {\n          container = node;\n          offset = dataLen;\n          break;\n        }\n        targetOffset += dataLen;\n        node = node.nextSibling;\n      }\n      if (isText$6(container) && offset > container.data.length) {\n        offset = container.data.length;\n      }\n      return CaretPosition(container, offset);\n    };\n    const resolve$1 = (root, path) => {\n      if (!path) {\n        return null;\n      }\n      const parts = path.split(',');\n      const paths = parts[0].split('/');\n      const offset = parts.length > 1 ? parts[1] : 'before';\n      const container = reduce(paths, (result, value) => {\n        const match = /([\\w\\-\\(\\)]+)\\[([0-9]+)\\]/.exec(value);\n        if (!match) {\n          return null;\n        }\n        if (match[1] === 'text()') {\n          match[1] = '#text';\n        }\n        return resolvePathItem(result, match[1], parseInt(match[2], 10));\n      }, root);\n      if (!container) {\n        return null;\n      }\n      if (!isText$6(container) && container.parentNode) {\n        let nodeOffset;\n        if (offset === 'after') {\n          nodeOffset = nodeIndex(container) + 1;\n        } else {\n          nodeOffset = nodeIndex(container);\n        }\n        return CaretPosition(container.parentNode, nodeOffset);\n      }\n      return findTextPosition(container, parseInt(offset, 10));\n    };\n\n    const isContentEditableFalse$9 = isContentEditableFalse$b;\n    const getNormalizedTextOffset$1 = (trim, container, offset) => {\n      let trimmedOffset = trim(container.data.slice(0, offset)).length;\n      for (let node = container.previousSibling; node && isText$b(node); node = node.previousSibling) {\n        trimmedOffset += trim(node.data).length;\n      }\n      return trimmedOffset;\n    };\n    const getPoint = (dom, trim, normalized, rng, start) => {\n      const container = start ? rng.startContainer : rng.endContainer;\n      let offset = start ? rng.startOffset : rng.endOffset;\n      const point = [];\n      const root = dom.getRoot();\n      if (isText$b(container)) {\n        point.push(normalized ? getNormalizedTextOffset$1(trim, container, offset) : offset);\n      } else {\n        let after = 0;\n        const childNodes = container.childNodes;\n        if (offset >= childNodes.length && childNodes.length) {\n          after = 1;\n          offset = Math.max(0, childNodes.length - 1);\n        }\n        point.push(dom.nodeIndex(childNodes[offset], normalized) + after);\n      }\n      for (let node = container; node && node !== root; node = node.parentNode) {\n        point.push(dom.nodeIndex(node, normalized));\n      }\n      return point;\n    };\n    const getLocation = (trim, selection, normalized, rng) => {\n      const dom = selection.dom;\n      const start = getPoint(dom, trim, normalized, rng, true);\n      const forward = selection.isForward();\n      const fakeCaret = isRangeInCaretContainerBlock(rng) ? { isFakeCaret: true } : {};\n      if (!selection.isCollapsed()) {\n        const end = getPoint(dom, trim, normalized, rng, false);\n        return {\n          start,\n          end,\n          forward,\n          ...fakeCaret\n        };\n      } else {\n        return {\n          start,\n          forward,\n          ...fakeCaret\n        };\n      }\n    };\n    const findIndex = (dom, name, element) => {\n      let count = 0;\n      Tools.each(dom.select(name), node => {\n        if (node.getAttribute('data-mce-bogus') === 'all') {\n          return;\n        } else if (node === element) {\n          return false;\n        } else {\n          count++;\n          return;\n        }\n      });\n      return count;\n    };\n    const moveEndPoint$1 = (rng, start) => {\n      let container = start ? rng.startContainer : rng.endContainer;\n      let offset = start ? rng.startOffset : rng.endOffset;\n      if (isElement$6(container) && container.nodeName === 'TR') {\n        const childNodes = container.childNodes;\n        container = childNodes[Math.min(start ? offset : offset - 1, childNodes.length - 1)];\n        if (container) {\n          offset = start ? 0 : container.childNodes.length;\n          if (start) {\n            rng.setStart(container, offset);\n          } else {\n            rng.setEnd(container, offset);\n          }\n        }\n      }\n    };\n    const normalizeTableCellSelection = rng => {\n      moveEndPoint$1(rng, true);\n      moveEndPoint$1(rng, false);\n      return rng;\n    };\n    const findSibling = (node, offset) => {\n      if (isElement$6(node)) {\n        node = getNode$1(node, offset);\n        if (isContentEditableFalse$9(node)) {\n          return node;\n        }\n      }\n      if (isCaretContainer$2(node)) {\n        if (isText$b(node) && isCaretContainerBlock$1(node)) {\n          node = node.parentNode;\n        }\n        let sibling = node.previousSibling;\n        if (isContentEditableFalse$9(sibling)) {\n          return sibling;\n        }\n        sibling = node.nextSibling;\n        if (isContentEditableFalse$9(sibling)) {\n          return sibling;\n        }\n      }\n      return undefined;\n    };\n    const findAdjacentContentEditableFalseElm = rng => {\n      return findSibling(rng.startContainer, rng.startOffset) || findSibling(rng.endContainer, rng.endOffset);\n    };\n    const getOffsetBookmark = (trim, normalized, selection) => {\n      const element = selection.getNode();\n      const rng = selection.getRng();\n      if (element.nodeName === 'IMG' || isContentEditableFalse$9(element)) {\n        const name = element.nodeName;\n        return {\n          name,\n          index: findIndex(selection.dom, name, element)\n        };\n      }\n      const sibling = findAdjacentContentEditableFalseElm(rng);\n      if (sibling) {\n        const name = sibling.tagName;\n        return {\n          name,\n          index: findIndex(selection.dom, name, sibling)\n        };\n      }\n      return getLocation(trim, selection, normalized, rng);\n    };\n    const getCaretBookmark = selection => {\n      const rng = selection.getRng();\n      return {\n        start: create$a(selection.dom.getRoot(), CaretPosition.fromRangeStart(rng)),\n        end: create$a(selection.dom.getRoot(), CaretPosition.fromRangeEnd(rng)),\n        forward: selection.isForward()\n      };\n    };\n    const getRangeBookmark = selection => {\n      return {\n        rng: selection.getRng(),\n        forward: selection.isForward()\n      };\n    };\n    const createBookmarkSpan = (dom, id, filled) => {\n      const args = {\n        'data-mce-type': 'bookmark',\n        id,\n        'style': 'overflow:hidden;line-height:0px'\n      };\n      return filled ? dom.create('span', args, '&#xFEFF;') : dom.create('span', args);\n    };\n    const getPersistentBookmark = (selection, filled) => {\n      const dom = selection.dom;\n      let rng = selection.getRng();\n      const id = dom.uniqueId();\n      const collapsed = selection.isCollapsed();\n      const element = selection.getNode();\n      const name = element.nodeName;\n      const forward = selection.isForward();\n      if (name === 'IMG') {\n        return {\n          name,\n          index: findIndex(dom, name, element)\n        };\n      }\n      const rng2 = normalizeTableCellSelection(rng.cloneRange());\n      if (!collapsed) {\n        rng2.collapse(false);\n        const endBookmarkNode = createBookmarkSpan(dom, id + '_end', filled);\n        rangeInsertNode(dom, rng2, endBookmarkNode);\n      }\n      rng = normalizeTableCellSelection(rng);\n      rng.collapse(true);\n      const startBookmarkNode = createBookmarkSpan(dom, id + '_start', filled);\n      rangeInsertNode(dom, rng, startBookmarkNode);\n      selection.moveToBookmark({\n        id,\n        keep: true,\n        forward\n      });\n      return {\n        id,\n        forward\n      };\n    };\n    const getBookmark$2 = (selection, type, normalized = false) => {\n      if (type === 2) {\n        return getOffsetBookmark(trim$2, normalized, selection);\n      } else if (type === 3) {\n        return getCaretBookmark(selection);\n      } else if (type) {\n        return getRangeBookmark(selection);\n      } else {\n        return getPersistentBookmark(selection, false);\n      }\n    };\n    const getUndoBookmark = curry(getOffsetBookmark, identity, true);\n\n    const value$1 = value => {\n      const applyHelper = fn => fn(value);\n      const constHelper = constant(value);\n      const outputHelper = () => output;\n      const output = {\n        tag: true,\n        inner: value,\n        fold: (_onError, onValue) => onValue(value),\n        isValue: always,\n        isError: never,\n        map: mapper => Result.value(mapper(value)),\n        mapError: outputHelper,\n        bind: applyHelper,\n        exists: applyHelper,\n        forall: applyHelper,\n        getOr: constHelper,\n        or: outputHelper,\n        getOrThunk: constHelper,\n        orThunk: outputHelper,\n        getOrDie: constHelper,\n        each: fn => {\n          fn(value);\n        },\n        toOptional: () => Optional.some(value)\n      };\n      return output;\n    };\n    const error = error => {\n      const outputHelper = () => output;\n      const output = {\n        tag: false,\n        inner: error,\n        fold: (onError, _onValue) => onError(error),\n        isValue: never,\n        isError: always,\n        map: outputHelper,\n        mapError: mapper => Result.error(mapper(error)),\n        bind: outputHelper,\n        exists: never,\n        forall: always,\n        getOr: identity,\n        or: identity,\n        getOrThunk: apply$1,\n        orThunk: apply$1,\n        getOrDie: die(String(error)),\n        each: noop,\n        toOptional: Optional.none\n      };\n      return output;\n    };\n    const fromOption = (optional, err) => optional.fold(() => error(err), value$1);\n    const Result = {\n      value: value$1,\n      error,\n      fromOption\n    };\n\n    const generate = cases => {\n      if (!isArray$1(cases)) {\n        throw new Error('cases must be an array');\n      }\n      if (cases.length === 0) {\n        throw new Error('there must be at least one case');\n      }\n      const constructors = [];\n      const adt = {};\n      each$e(cases, (acase, count) => {\n        const keys$1 = keys(acase);\n        if (keys$1.length !== 1) {\n          throw new Error('one and only one name per case');\n        }\n        const key = keys$1[0];\n        const value = acase[key];\n        if (adt[key] !== undefined) {\n          throw new Error('duplicate key detected:' + key);\n        } else if (key === 'cata') {\n          throw new Error('cannot have a case named cata (sorry)');\n        } else if (!isArray$1(value)) {\n          throw new Error('case arguments must be an array');\n        }\n        constructors.push(key);\n        adt[key] = (...args) => {\n          const argLength = args.length;\n          if (argLength !== value.length) {\n            throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);\n          }\n          const match = branches => {\n            const branchKeys = keys(branches);\n            if (constructors.length !== branchKeys.length) {\n              throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\\nActual: ' + branchKeys.join(','));\n            }\n            const allReqd = forall(constructors, reqKey => {\n              return contains$2(branchKeys, reqKey);\n            });\n            if (!allReqd) {\n              throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\\nRequired: ' + constructors.join(', '));\n            }\n            return branches[key].apply(null, args);\n          };\n          return {\n            fold: (...foldArgs) => {\n              if (foldArgs.length !== cases.length) {\n                throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length);\n              }\n              const target = foldArgs[count];\n              return target.apply(null, args);\n            },\n            match,\n            log: label => {\n              console.log(label, {\n                constructors,\n                constructor: key,\n                params: args\n              });\n            }\n          };\n        };\n      });\n      return adt;\n    };\n    const Adt = { generate };\n\n    Adt.generate([\n      {\n        bothErrors: [\n          'error1',\n          'error2'\n        ]\n      },\n      {\n        firstError: [\n          'error1',\n          'value2'\n        ]\n      },\n      {\n        secondError: [\n          'value1',\n          'error2'\n        ]\n      },\n      {\n        bothValues: [\n          'value1',\n          'value2'\n        ]\n      }\n    ]);\n    const partition$1 = results => {\n      const errors = [];\n      const values = [];\n      each$e(results, result => {\n        result.fold(err => {\n          errors.push(err);\n        }, value => {\n          values.push(value);\n        });\n      });\n      return {\n        errors,\n        values\n      };\n    };\n\n    const isInlinePattern = pattern => pattern.type === 'inline-command' || pattern.type === 'inline-format';\n    const isBlockPattern = pattern => pattern.type === 'block-command' || pattern.type === 'block-format';\n    const hasBlockTrigger = (pattern, trigger) => (pattern.type === 'block-command' || pattern.type === 'block-format') && pattern.trigger === trigger;\n    const normalizePattern = pattern => {\n      var _a;\n      const err = message => Result.error({\n        message,\n        pattern\n      });\n      const formatOrCmd = (name, onFormat, onCommand) => {\n        if (pattern.format !== undefined) {\n          let formats;\n          if (isArray$1(pattern.format)) {\n            if (!forall(pattern.format, isString)) {\n              return err(name + ' pattern has non-string items in the `format` array');\n            }\n            formats = pattern.format;\n          } else if (isString(pattern.format)) {\n            formats = [pattern.format];\n          } else {\n            return err(name + ' pattern has non-string `format` parameter');\n          }\n          return Result.value(onFormat(formats));\n        } else if (pattern.cmd !== undefined) {\n          if (!isString(pattern.cmd)) {\n            return err(name + ' pattern has non-string `cmd` parameter');\n          }\n          return Result.value(onCommand(pattern.cmd, pattern.value));\n        } else {\n          return err(name + ' pattern is missing both `format` and `cmd` parameters');\n        }\n      };\n      if (!isObject(pattern)) {\n        return err('Raw pattern is not an object');\n      }\n      if (!isString(pattern.start)) {\n        return err('Raw pattern is missing `start` parameter');\n      }\n      if (pattern.end !== undefined) {\n        if (!isString(pattern.end)) {\n          return err('Inline pattern has non-string `end` parameter');\n        }\n        if (pattern.start.length === 0 && pattern.end.length === 0) {\n          return err('Inline pattern has empty `start` and `end` parameters');\n        }\n        let start = pattern.start;\n        let end = pattern.end;\n        if (end.length === 0) {\n          end = start;\n          start = '';\n        }\n        return formatOrCmd('Inline', format => ({\n          type: 'inline-format',\n          start,\n          end,\n          format\n        }), (cmd, value) => ({\n          type: 'inline-command',\n          start,\n          end,\n          cmd,\n          value\n        }));\n      } else if (pattern.replacement !== undefined) {\n        if (!isString(pattern.replacement)) {\n          return err('Replacement pattern has non-string `replacement` parameter');\n        }\n        if (pattern.start.length === 0) {\n          return err('Replacement pattern has empty `start` parameter');\n        }\n        return Result.value({\n          type: 'inline-command',\n          start: '',\n          end: pattern.start,\n          cmd: 'mceInsertContent',\n          value: pattern.replacement\n        });\n      } else {\n        const trigger = (_a = pattern.trigger) !== null && _a !== void 0 ? _a : 'space';\n        if (pattern.start.length === 0) {\n          return err('Block pattern has empty `start` parameter');\n        }\n        return formatOrCmd('Block', formats => ({\n          type: 'block-format',\n          start: pattern.start,\n          format: formats[0],\n          trigger\n        }), (command, commandValue) => ({\n          type: 'block-command',\n          start: pattern.start,\n          cmd: command,\n          value: commandValue,\n          trigger\n        }));\n      }\n    };\n    const getBlockPatterns = patterns => filter$5(patterns, isBlockPattern);\n    const getInlinePatterns = patterns => filter$5(patterns, isInlinePattern);\n    const createPatternSet = (patterns, dynamicPatternsLookup) => ({\n      inlinePatterns: getInlinePatterns(patterns),\n      blockPatterns: getBlockPatterns(patterns),\n      dynamicPatternsLookup\n    });\n    const filterByTrigger = (patterns, trigger) => {\n      return {\n        ...patterns,\n        blockPatterns: filter$5(patterns.blockPatterns, pattern => hasBlockTrigger(pattern, trigger))\n      };\n    };\n    const fromRawPatterns = patterns => {\n      const normalized = partition$1(map$3(patterns, normalizePattern));\n      each$e(normalized.errors, err => console.error(err.message, err.pattern));\n      return normalized.values;\n    };\n    const fromRawPatternsLookup = lookupFn => {\n      return ctx => {\n        const rawPatterns = lookupFn(ctx);\n        return fromRawPatterns(rawPatterns);\n      };\n    };\n\n    const deviceDetection$1 = detect$1().deviceType;\n    const isTouch = deviceDetection$1.isTouch();\n    const DOM$a = DOMUtils.DOM;\n    const getHash = value => {\n      const items = value.indexOf('=') > 0 ? value.split(/[;,](?![^=;,]*(?:[;,]|$))/) : value.split(',');\n      return foldl(items, (output, item) => {\n        const arr = item.split('=');\n        const key = arr[0];\n        const val = arr.length > 1 ? arr[1] : key;\n        output[trim$4(key)] = trim$4(val);\n        return output;\n      }, {});\n    };\n    const isRegExp = x => is$4(x, RegExp);\n    const option = name => editor => editor.options.get(name);\n    const stringOrObjectProcessor = value => isString(value) || isObject(value);\n    const bodyOptionProcessor = (editor, defaultValue = '') => value => {\n      const valid = isString(value);\n      if (valid) {\n        if (value.indexOf('=') !== -1) {\n          const bodyObj = getHash(value);\n          return {\n            value: get$a(bodyObj, editor.id).getOr(defaultValue),\n            valid\n          };\n        } else {\n          return {\n            value,\n            valid\n          };\n        }\n      } else {\n        return {\n          valid: false,\n          message: 'Must be a string.'\n        };\n      }\n    };\n    const register$7 = editor => {\n      const registerOption = editor.options.register;\n      registerOption('id', {\n        processor: 'string',\n        default: editor.id\n      });\n      registerOption('selector', { processor: 'string' });\n      registerOption('target', { processor: 'object' });\n      registerOption('suffix', { processor: 'string' });\n      registerOption('cache_suffix', { processor: 'string' });\n      registerOption('base_url', { processor: 'string' });\n      registerOption('referrer_policy', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('language_load', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('inline', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('iframe_attrs', {\n        processor: 'object',\n        default: {}\n      });\n      registerOption('doctype', {\n        processor: 'string',\n        default: '<!DOCTYPE html>'\n      });\n      registerOption('document_base_url', {\n        processor: 'string',\n        default: editor.documentBaseUrl\n      });\n      registerOption('body_id', {\n        processor: bodyOptionProcessor(editor, 'hugerte'),\n        default: 'hugerte'\n      });\n      registerOption('body_class', {\n        processor: bodyOptionProcessor(editor),\n        default: ''\n      });\n      registerOption('content_security_policy', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('br_in_pre', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('forced_root_block', {\n        processor: value => {\n          const valid = isString(value) && isNotEmpty(value);\n          if (valid) {\n            return {\n              value,\n              valid\n            };\n          } else {\n            return {\n              valid: false,\n              message: 'Must be a non-empty string.'\n            };\n          }\n        },\n        default: 'p'\n      });\n      registerOption('forced_root_block_attrs', {\n        processor: 'object',\n        default: {}\n      });\n      registerOption('newline_behavior', {\n        processor: value => {\n          const valid = contains$2([\n            'block',\n            'linebreak',\n            'invert',\n            'default'\n          ], value);\n          return valid ? {\n            value,\n            valid\n          } : {\n            valid: false,\n            message: 'Must be one of: block, linebreak, invert or default.'\n          };\n        },\n        default: 'default'\n      });\n      registerOption('br_newline_selector', {\n        processor: 'string',\n        default: '.mce-toc h2,figcaption,caption'\n      });\n      registerOption('no_newline_selector', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('keep_styles', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('end_container_on_empty_block', {\n        processor: value => {\n          if (isBoolean(value)) {\n            return {\n              valid: true,\n              value\n            };\n          } else if (isString(value)) {\n            return {\n              valid: true,\n              value\n            };\n          } else {\n            return {\n              valid: false,\n              message: 'Must be boolean or a string'\n            };\n          }\n        },\n        default: 'blockquote'\n      });\n      registerOption('font_size_style_values', {\n        processor: 'string',\n        default: 'xx-small,x-small,small,medium,large,x-large,xx-large'\n      });\n      registerOption('font_size_legacy_values', {\n        processor: 'string',\n        default: 'xx-small,small,medium,large,x-large,xx-large,300%'\n      });\n      registerOption('font_size_classes', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('automatic_uploads', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('images_reuse_filename', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('images_replace_blob_uris', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('icons', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('icons_url', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('images_upload_url', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('images_upload_base_path', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('images_upload_credentials', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('images_upload_handler', { processor: 'function' });\n      registerOption('language', {\n        processor: 'string',\n        default: 'en'\n      });\n      registerOption('language_url', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('entity_encoding', {\n        processor: 'string',\n        default: 'named'\n      });\n      registerOption('indent', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('indent_before', {\n        processor: 'string',\n        default: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' + 'tfoot,tbody,tr,section,details,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist'\n      });\n      registerOption('indent_after', {\n        processor: 'string',\n        default: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' + 'tfoot,tbody,tr,section,details,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist'\n      });\n      registerOption('indent_use_margin', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('indentation', {\n        processor: 'string',\n        default: '40px'\n      });\n      registerOption('content_css', {\n        processor: value => {\n          const valid = value === false || isString(value) || isArrayOf(value, isString);\n          if (valid) {\n            if (isString(value)) {\n              return {\n                value: map$3(value.split(','), trim$4),\n                valid\n              };\n            } else if (isArray$1(value)) {\n              return {\n                value,\n                valid\n              };\n            } else if (value === false) {\n              return {\n                value: [],\n                valid\n              };\n            } else {\n              return {\n                value,\n                valid\n              };\n            }\n          } else {\n            return {\n              valid: false,\n              message: 'Must be false, a string or an array of strings.'\n            };\n          }\n        },\n        default: isInline$1(editor) ? [] : ['default']\n      });\n      registerOption('content_style', { processor: 'string' });\n      registerOption('content_css_cors', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('font_css', {\n        processor: value => {\n          const valid = isString(value) || isArrayOf(value, isString);\n          if (valid) {\n            const newValue = isArray$1(value) ? value : map$3(value.split(','), trim$4);\n            return {\n              value: newValue,\n              valid\n            };\n          } else {\n            return {\n              valid: false,\n              message: 'Must be a string or an array of strings.'\n            };\n          }\n        },\n        default: []\n      });\n      registerOption('inline_boundaries', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('inline_boundaries_selector', {\n        processor: 'string',\n        default: 'a[href],code,span.mce-annotation'\n      });\n      registerOption('object_resizing', {\n        processor: value => {\n          const valid = isBoolean(value) || isString(value);\n          if (valid) {\n            if (value === false || deviceDetection$1.isiPhone() || deviceDetection$1.isiPad()) {\n              return {\n                value: '',\n                valid\n              };\n            } else {\n              return {\n                value: value === true ? 'table,img,figure.image,div,video,iframe' : value,\n                valid\n              };\n            }\n          } else {\n            return {\n              valid: false,\n              message: 'Must be boolean or a string'\n            };\n          }\n        },\n        default: !isTouch\n      });\n      registerOption('resize_img_proportional', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('event_root', { processor: 'string' });\n      registerOption('service_message', { processor: 'string' });\n      registerOption('theme', {\n        processor: value => value === false || isString(value) || isFunction(value),\n        default: 'silver'\n      });\n      registerOption('theme_url', { processor: 'string' });\n      registerOption('formats', { processor: 'object' });\n      registerOption('format_empty_lines', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('format_noneditable_selector', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('preview_styles', {\n        processor: value => {\n          const valid = value === false || isString(value);\n          if (valid) {\n            return {\n              value: value === false ? '' : value,\n              valid\n            };\n          } else {\n            return {\n              valid: false,\n              message: 'Must be false or a string'\n            };\n          }\n        },\n        default: 'font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow'\n      });\n      registerOption('custom_ui_selector', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('hidden_input', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('submit_patch', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('encoding', { processor: 'string' });\n      registerOption('add_form_submit_trigger', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('add_unload_trigger', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('custom_undo_redo_levels', {\n        processor: 'number',\n        default: 0\n      });\n      registerOption('disable_nodechange', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('readonly', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('editable_root', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('plugins', {\n        processor: 'string[]',\n        default: []\n      });\n      registerOption('external_plugins', { processor: 'object' });\n      registerOption('forced_plugins', { processor: 'string[]' });\n      registerOption('model', {\n        processor: 'string',\n        default: editor.hasPlugin('rtc') ? 'plugin' : 'dom'\n      });\n      registerOption('model_url', { processor: 'string' });\n      registerOption('block_unsupported_drop', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('visual', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('visual_table_class', {\n        processor: 'string',\n        default: 'mce-item-table'\n      });\n      registerOption('visual_anchor_class', {\n        processor: 'string',\n        default: 'mce-item-anchor'\n      });\n      registerOption('iframe_aria_text', {\n        processor: 'string',\n        default: 'Rich Text Area. Press ALT-0 for help.'\n      });\n      registerOption('setup', { processor: 'function' });\n      registerOption('init_instance_callback', { processor: 'function' });\n      registerOption('url_converter', {\n        processor: 'function',\n        default: editor.convertURL\n      });\n      registerOption('url_converter_scope', {\n        processor: 'object',\n        default: editor\n      });\n      registerOption('urlconverter_callback', { processor: 'function' });\n      registerOption('allow_conditional_comments', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('allow_html_data_urls', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('allow_svg_data_urls', { processor: 'boolean' });\n      registerOption('allow_html_in_named_anchor', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('allow_script_urls', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('allow_unsafe_link_target', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('convert_fonts_to_spans', {\n        processor: 'boolean',\n        default: true,\n        deprecated: true\n      });\n      registerOption('fix_list_elements', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('preserve_cdata', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('remove_trailing_brs', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('pad_empty_with_br', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('inline_styles', {\n        processor: 'boolean',\n        default: true,\n        deprecated: true\n      });\n      registerOption('element_format', {\n        processor: 'string',\n        default: 'html'\n      });\n      registerOption('entities', { processor: 'string' });\n      registerOption('schema', {\n        processor: 'string',\n        default: 'html5'\n      });\n      registerOption('convert_urls', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('relative_urls', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('remove_script_host', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('custom_elements', { processor: stringOrObjectProcessor });\n      registerOption('extended_valid_elements', { processor: 'string' });\n      registerOption('invalid_elements', { processor: 'string' });\n      registerOption('invalid_styles', { processor: stringOrObjectProcessor });\n      registerOption('valid_children', { processor: 'string' });\n      registerOption('valid_classes', { processor: stringOrObjectProcessor });\n      registerOption('valid_elements', { processor: 'string' });\n      registerOption('valid_styles', { processor: stringOrObjectProcessor });\n      registerOption('verify_html', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('auto_focus', { processor: value => isString(value) || value === true });\n      registerOption('browser_spellcheck', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('protect', { processor: 'array' });\n      registerOption('images_file_types', {\n        processor: 'string',\n        default: 'jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp'\n      });\n      registerOption('deprecation_warnings', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('a11y_advanced_options', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('api_key', { processor: 'string' });\n      registerOption('paste_block_drop', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('paste_data_images', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('paste_preprocess', { processor: 'function' });\n      registerOption('paste_postprocess', { processor: 'function' });\n      registerOption('paste_webkit_styles', {\n        processor: 'string',\n        default: 'none'\n      });\n      registerOption('paste_remove_styles_if_webkit', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('paste_merge_formats', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('smart_paste', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('paste_as_text', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('paste_tab_spaces', {\n        processor: 'number',\n        default: 4\n      });\n      registerOption('text_patterns', {\n        processor: value => {\n          if (isArrayOf(value, isObject) || value === false) {\n            const patterns = value === false ? [] : value;\n            return {\n              value: fromRawPatterns(patterns),\n              valid: true\n            };\n          } else {\n            return {\n              valid: false,\n              message: 'Must be an array of objects or false.'\n            };\n          }\n        },\n        default: [\n          {\n            start: '*',\n            end: '*',\n            format: 'italic'\n          },\n          {\n            start: '**',\n            end: '**',\n            format: 'bold'\n          },\n          {\n            start: '#',\n            format: 'h1',\n            trigger: 'space'\n          },\n          {\n            start: '##',\n            format: 'h2',\n            trigger: 'space'\n          },\n          {\n            start: '###',\n            format: 'h3',\n            trigger: 'space'\n          },\n          {\n            start: '####',\n            format: 'h4',\n            trigger: 'space'\n          },\n          {\n            start: '#####',\n            format: 'h5',\n            trigger: 'space'\n          },\n          {\n            start: '######',\n            format: 'h6',\n            trigger: 'space'\n          },\n          {\n            start: '1.',\n            cmd: 'InsertOrderedList',\n            trigger: 'space'\n          },\n          {\n            start: '*',\n            cmd: 'InsertUnorderedList',\n            trigger: 'space'\n          },\n          {\n            start: '-',\n            cmd: 'InsertUnorderedList',\n            trigger: 'space'\n          },\n          {\n            start: '>',\n            cmd: 'mceBlockQuote',\n            trigger: 'space'\n          },\n          {\n            start: '---',\n            cmd: 'InsertHorizontalRule',\n            trigger: 'space'\n          }\n        ]\n      });\n      registerOption('text_patterns_lookup', {\n        processor: value => {\n          if (isFunction(value)) {\n            return {\n              value: fromRawPatternsLookup(value),\n              valid: true\n            };\n          } else {\n            return {\n              valid: false,\n              message: 'Must be a single function'\n            };\n          }\n        },\n        default: _ctx => []\n      });\n      registerOption('noneditable_class', {\n        processor: 'string',\n        default: 'mceNonEditable'\n      });\n      registerOption('editable_class', {\n        processor: 'string',\n        default: 'mceEditable'\n      });\n      registerOption('noneditable_regexp', {\n        processor: value => {\n          if (isArrayOf(value, isRegExp)) {\n            return {\n              value,\n              valid: true\n            };\n          } else if (isRegExp(value)) {\n            return {\n              value: [value],\n              valid: true\n            };\n          } else {\n            return {\n              valid: false,\n              message: 'Must be a RegExp or an array of RegExp.'\n            };\n          }\n        },\n        default: []\n      });\n      registerOption('table_tab_navigation', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('highlight_on_focus', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('xss_sanitization', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('details_initial_state', {\n        processor: value => {\n          const valid = contains$2([\n            'inherited',\n            'collapsed',\n            'expanded'\n          ], value);\n          return valid ? {\n            value,\n            valid\n          } : {\n            valid: false,\n            message: 'Must be one of: inherited, collapsed, or expanded.'\n          };\n        },\n        default: 'inherited'\n      });\n      registerOption('details_serialized_state', {\n        processor: value => {\n          const valid = contains$2([\n            'inherited',\n            'collapsed',\n            'expanded'\n          ], value);\n          return valid ? {\n            value,\n            valid\n          } : {\n            valid: false,\n            message: 'Must be one of: inherited, collapsed, or expanded.'\n          };\n        },\n        default: 'inherited'\n      });\n      registerOption('init_content_sync', {\n        processor: 'boolean',\n        default: false\n      });\n      registerOption('newdocument_content', {\n        processor: 'string',\n        default: ''\n      });\n      registerOption('force_hex_color', {\n        processor: value => {\n          const options = [\n            'always',\n            'rgb_only',\n            'off'\n          ];\n          const valid = contains$2(options, value);\n          return valid ? {\n            value,\n            valid\n          } : {\n            valid: false,\n            message: `Must be one of: ${ options.join(', ') }.`\n          };\n        },\n        default: 'off'\n      });\n      registerOption('sandbox_iframes', {\n        processor: 'boolean',\n        default: true\n      });\n      registerOption('sandbox_iframes_exclusions', {\n        processor: 'string[]',\n        default: [\n          'youtube.com',\n          'youtu.be',\n          'vimeo.com',\n          'dailymotion.com',\n          'dai.ly',\n          'codepen.io'\n        ]\n      });\n      registerOption('convert_unsafe_embeds', {\n        processor: 'boolean',\n        default: true\n      });\n      editor.on('ScriptsLoaded', () => {\n        registerOption('directionality', {\n          processor: 'string',\n          default: I18n.isRtl() ? 'rtl' : undefined\n        });\n        registerOption('placeholder', {\n          processor: 'string',\n          default: DOM$a.getAttrib(editor.getElement(), 'placeholder')\n        });\n      });\n    };\n    const getIframeAttrs = option('iframe_attrs');\n    const getDocType = option('doctype');\n    const getDocumentBaseUrl = option('document_base_url');\n    const getBodyId = option('body_id');\n    const getBodyClass = option('body_class');\n    const getContentSecurityPolicy = option('content_security_policy');\n    const shouldPutBrInPre$1 = option('br_in_pre');\n    const getForcedRootBlock = option('forced_root_block');\n    const getForcedRootBlockAttrs = option('forced_root_block_attrs');\n    const getNewlineBehavior = option('newline_behavior');\n    const getBrNewLineSelector = option('br_newline_selector');\n    const getNoNewLineSelector = option('no_newline_selector');\n    const shouldKeepStyles = option('keep_styles');\n    const shouldEndContainerOnEmptyBlock = option('end_container_on_empty_block');\n    const isAutomaticUploadsEnabled = option('automatic_uploads');\n    const shouldReuseFileName = option('images_reuse_filename');\n    const shouldReplaceBlobUris = option('images_replace_blob_uris');\n    const getIconPackName = option('icons');\n    const getIconsUrl = option('icons_url');\n    const getImageUploadUrl = option('images_upload_url');\n    const getImageUploadBasePath = option('images_upload_base_path');\n    const getImagesUploadCredentials = option('images_upload_credentials');\n    const getImagesUploadHandler = option('images_upload_handler');\n    const shouldUseContentCssCors = option('content_css_cors');\n    const getReferrerPolicy = option('referrer_policy');\n    const getLanguageCode = option('language');\n    const getLanguageUrl = option('language_url');\n    const shouldIndentUseMargin = option('indent_use_margin');\n    const getIndentation = option('indentation');\n    const getContentCss = option('content_css');\n    const getContentStyle = option('content_style');\n    const getFontCss = option('font_css');\n    const getDirectionality = option('directionality');\n    const getInlineBoundarySelector = option('inline_boundaries_selector');\n    const getObjectResizing = option('object_resizing');\n    const getResizeImgProportional = option('resize_img_proportional');\n    const getPlaceholder = option('placeholder');\n    const getEventRoot = option('event_root');\n    const getServiceMessage = option('service_message');\n    const getTheme = option('theme');\n    const getThemeUrl = option('theme_url');\n    const getModel = option('model');\n    const getModelUrl = option('model_url');\n    const isInlineBoundariesEnabled = option('inline_boundaries');\n    const getFormats = option('formats');\n    const getPreviewStyles = option('preview_styles');\n    const canFormatEmptyLines = option('format_empty_lines');\n    const getFormatNoneditableSelector = option('format_noneditable_selector');\n    const getCustomUiSelector = option('custom_ui_selector');\n    const isInline$1 = option('inline');\n    const hasHiddenInput = option('hidden_input');\n    const shouldPatchSubmit = option('submit_patch');\n    const shouldAddFormSubmitTrigger = option('add_form_submit_trigger');\n    const shouldAddUnloadTrigger = option('add_unload_trigger');\n    const getCustomUndoRedoLevels = option('custom_undo_redo_levels');\n    const shouldDisableNodeChange = option('disable_nodechange');\n    const isReadOnly$1 = option('readonly');\n    const hasEditableRoot$1 = option('editable_root');\n    const hasContentCssCors = option('content_css_cors');\n    const getPlugins = option('plugins');\n    const getExternalPlugins$1 = option('external_plugins');\n    const shouldBlockUnsupportedDrop = option('block_unsupported_drop');\n    const isVisualAidsEnabled = option('visual');\n    const getVisualAidsTableClass = option('visual_table_class');\n    const getVisualAidsAnchorClass = option('visual_anchor_class');\n    const getIframeAriaText = option('iframe_aria_text');\n    const getSetupCallback = option('setup');\n    const getInitInstanceCallback = option('init_instance_callback');\n    const getUrlConverterCallback = option('urlconverter_callback');\n    const getAutoFocus = option('auto_focus');\n    const shouldBrowserSpellcheck = option('browser_spellcheck');\n    const getProtect = option('protect');\n    const shouldPasteBlockDrop = option('paste_block_drop');\n    const shouldPasteDataImages = option('paste_data_images');\n    const getPastePreProcess = option('paste_preprocess');\n    const getPastePostProcess = option('paste_postprocess');\n    const getNewDocumentContent = option('newdocument_content');\n    const getPasteWebkitStyles = option('paste_webkit_styles');\n    const shouldPasteRemoveWebKitStyles = option('paste_remove_styles_if_webkit');\n    const shouldPasteMergeFormats = option('paste_merge_formats');\n    const isSmartPasteEnabled = option('smart_paste');\n    const isPasteAsTextEnabled = option('paste_as_text');\n    const getPasteTabSpaces = option('paste_tab_spaces');\n    const shouldAllowHtmlDataUrls = option('allow_html_data_urls');\n    const getTextPatterns = option('text_patterns');\n    const getTextPatternsLookup = option('text_patterns_lookup');\n    const getNonEditableClass = option('noneditable_class');\n    const getEditableClass = option('editable_class');\n    const getNonEditableRegExps = option('noneditable_regexp');\n    const shouldPreserveCData = option('preserve_cdata');\n    const shouldHighlightOnFocus = option('highlight_on_focus');\n    const shouldSanitizeXss = option('xss_sanitization');\n    const shouldUseDocumentWrite = option('init_content_sync');\n    const hasTextPatternsLookup = editor => editor.options.isSet('text_patterns_lookup');\n    const getFontStyleValues = editor => Tools.explode(editor.options.get('font_size_style_values'));\n    const getFontSizeClasses = editor => Tools.explode(editor.options.get('font_size_classes'));\n    const isEncodingXml = editor => editor.options.get('encoding') === 'xml';\n    const getAllowedImageFileTypes = editor => Tools.explode(editor.options.get('images_file_types'));\n    const hasTableTabNavigation = option('table_tab_navigation');\n    const getDetailsInitialState = option('details_initial_state');\n    const getDetailsSerializedState = option('details_serialized_state');\n    const shouldForceHexColor = option('force_hex_color');\n    const shouldSandboxIframes = option('sandbox_iframes');\n    const getSandboxIframesExclusions = editor => editor.options.get('sandbox_iframes_exclusions');\n    const shouldConvertUnsafeEmbeds = option('convert_unsafe_embeds');\n\n    const isElement$3 = isElement$6;\n    const isText$5 = isText$b;\n    const removeNode$1 = node => {\n      const parentNode = node.parentNode;\n      if (parentNode) {\n        parentNode.removeChild(node);\n      }\n    };\n    const trimCount = text => {\n      const trimmedText = trim$2(text);\n      return {\n        count: text.length - trimmedText.length,\n        text: trimmedText\n      };\n    };\n    const deleteZwspChars = caretContainer => {\n      let idx;\n      while ((idx = caretContainer.data.lastIndexOf(ZWSP$1)) !== -1) {\n        caretContainer.deleteData(idx, 1);\n      }\n    };\n    const removeUnchanged = (caretContainer, pos) => {\n      remove$2(caretContainer);\n      return pos;\n    };\n    const removeTextAndReposition = (caretContainer, pos) => {\n      const before = trimCount(caretContainer.data.substr(0, pos.offset()));\n      const after = trimCount(caretContainer.data.substr(pos.offset()));\n      const text = before.text + after.text;\n      if (text.length > 0) {\n        deleteZwspChars(caretContainer);\n        return CaretPosition(caretContainer, pos.offset() - before.count);\n      } else {\n        return pos;\n      }\n    };\n    const removeElementAndReposition = (caretContainer, pos) => {\n      const parentNode = pos.container();\n      const newPosition = indexOf$1(from(parentNode.childNodes), caretContainer).map(index => {\n        return index < pos.offset() ? CaretPosition(parentNode, pos.offset() - 1) : pos;\n      }).getOr(pos);\n      remove$2(caretContainer);\n      return newPosition;\n    };\n    const removeTextCaretContainer = (caretContainer, pos) => isText$5(caretContainer) && pos.container() === caretContainer ? removeTextAndReposition(caretContainer, pos) : removeUnchanged(caretContainer, pos);\n    const removeElementCaretContainer = (caretContainer, pos) => pos.container() === caretContainer.parentNode ? removeElementAndReposition(caretContainer, pos) : removeUnchanged(caretContainer, pos);\n    const removeAndReposition = (container, pos) => CaretPosition.isTextPosition(pos) ? removeTextCaretContainer(container, pos) : removeElementCaretContainer(container, pos);\n    const remove$2 = caretContainerNode => {\n      if (isElement$3(caretContainerNode) && isCaretContainer$2(caretContainerNode)) {\n        if (hasContent(caretContainerNode)) {\n          caretContainerNode.removeAttribute('data-mce-caret');\n        } else {\n          removeNode$1(caretContainerNode);\n        }\n      }\n      if (isText$5(caretContainerNode)) {\n        deleteZwspChars(caretContainerNode);\n        if (caretContainerNode.data.length === 0) {\n          removeNode$1(caretContainerNode);\n        }\n      }\n    };\n\n    const isContentEditableFalse$8 = isContentEditableFalse$b;\n    const isMedia$1 = isMedia$2;\n    const isTableCell$1 = isTableCell$3;\n    const inlineFakeCaretSelector = '*[contentEditable=false],video,audio,embed,object';\n    const getAbsoluteClientRect = (root, element, before) => {\n      const clientRect = collapse(element.getBoundingClientRect(), before);\n      let scrollX;\n      let scrollY;\n      if (root.tagName === 'BODY') {\n        const docElm = root.ownerDocument.documentElement;\n        scrollX = root.scrollLeft || docElm.scrollLeft;\n        scrollY = root.scrollTop || docElm.scrollTop;\n      } else {\n        const rootRect = root.getBoundingClientRect();\n        scrollX = root.scrollLeft - rootRect.left;\n        scrollY = root.scrollTop - rootRect.top;\n      }\n      clientRect.left += scrollX;\n      clientRect.right += scrollX;\n      clientRect.top += scrollY;\n      clientRect.bottom += scrollY;\n      clientRect.width = 1;\n      let margin = element.offsetWidth - element.clientWidth;\n      if (margin > 0) {\n        if (before) {\n          margin *= -1;\n        }\n        clientRect.left += margin;\n        clientRect.right += margin;\n      }\n      return clientRect;\n    };\n    const trimInlineCaretContainers = root => {\n      var _a, _b;\n      const fakeCaretTargetNodes = descendants(SugarElement.fromDom(root), inlineFakeCaretSelector);\n      for (let i = 0; i < fakeCaretTargetNodes.length; i++) {\n        const node = fakeCaretTargetNodes[i].dom;\n        let sibling = node.previousSibling;\n        if (endsWithCaretContainer$1(sibling)) {\n          const data = sibling.data;\n          if (data.length === 1) {\n            (_a = sibling.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(sibling);\n          } else {\n            sibling.deleteData(data.length - 1, 1);\n          }\n        }\n        sibling = node.nextSibling;\n        if (startsWithCaretContainer$1(sibling)) {\n          const data = sibling.data;\n          if (data.length === 1) {\n            (_b = sibling.parentNode) === null || _b === void 0 ? void 0 : _b.removeChild(sibling);\n          } else {\n            sibling.deleteData(0, 1);\n          }\n        }\n      }\n    };\n    const FakeCaret = (editor, root, isBlock, hasFocus) => {\n      const lastVisualCaret = value$2();\n      let cursorInterval;\n      let caretContainerNode;\n      const caretBlock = getForcedRootBlock(editor);\n      const dom = editor.dom;\n      const show = (before, element) => {\n        let rng;\n        hide();\n        if (isTableCell$1(element)) {\n          return null;\n        }\n        if (isBlock(element)) {\n          const caretContainer = insertBlock(caretBlock, element, before);\n          const clientRect = getAbsoluteClientRect(root, element, before);\n          dom.setStyle(caretContainer, 'top', clientRect.top);\n          dom.setStyle(caretContainer, 'caret-color', 'transparent');\n          caretContainerNode = caretContainer;\n          const caret = dom.create('div', {\n            'class': 'mce-visual-caret',\n            'data-mce-bogus': 'all'\n          });\n          dom.setStyles(caret, { ...clientRect });\n          dom.add(root, caret);\n          lastVisualCaret.set({\n            caret,\n            element,\n            before\n          });\n          if (before) {\n            dom.addClass(caret, 'mce-visual-caret-before');\n          }\n          startBlink();\n          rng = element.ownerDocument.createRange();\n          rng.setStart(caretContainer, 0);\n          rng.setEnd(caretContainer, 0);\n        } else {\n          caretContainerNode = insertInline$1(element, before);\n          rng = element.ownerDocument.createRange();\n          if (isInlineFakeCaretTarget(caretContainerNode.nextSibling)) {\n            rng.setStart(caretContainerNode, 0);\n            rng.setEnd(caretContainerNode, 0);\n          } else {\n            rng.setStart(caretContainerNode, 1);\n            rng.setEnd(caretContainerNode, 1);\n          }\n          return rng;\n        }\n        return rng;\n      };\n      const hide = () => {\n        trimInlineCaretContainers(root);\n        if (caretContainerNode) {\n          remove$2(caretContainerNode);\n          caretContainerNode = null;\n        }\n        lastVisualCaret.on(caretState => {\n          dom.remove(caretState.caret);\n          lastVisualCaret.clear();\n        });\n        if (cursorInterval) {\n          clearInterval(cursorInterval);\n          cursorInterval = undefined;\n        }\n      };\n      const startBlink = () => {\n        cursorInterval = setInterval(() => {\n          lastVisualCaret.on(caretState => {\n            if (hasFocus()) {\n              dom.toggleClass(caretState.caret, 'mce-visual-caret-hidden');\n            } else {\n              dom.addClass(caretState.caret, 'mce-visual-caret-hidden');\n            }\n          });\n        }, 500);\n      };\n      const reposition = () => {\n        lastVisualCaret.on(caretState => {\n          const clientRect = getAbsoluteClientRect(root, caretState.element, caretState.before);\n          dom.setStyles(caretState.caret, { ...clientRect });\n        });\n      };\n      const destroy = () => clearInterval(cursorInterval);\n      const getCss = () => '.mce-visual-caret {' + 'position: absolute;' + 'background-color: black;' + 'background-color: currentcolor;' + '}' + '.mce-visual-caret-hidden {' + 'display: none;' + '}' + '*[data-mce-caret] {' + 'position: absolute;' + 'left: -1000px;' + 'right: auto;' + 'top: 0;' + 'margin: 0;' + 'padding: 0;' + '}';\n      return {\n        show,\n        hide,\n        getCss,\n        reposition,\n        destroy\n      };\n    };\n    const isFakeCaretTableBrowser = () => Env.browser.isFirefox();\n    const isInlineFakeCaretTarget = node => isContentEditableFalse$8(node) || isMedia$1(node);\n    const isFakeCaretTarget = node => {\n      const isTarget = isInlineFakeCaretTarget(node) || isTable$2(node) && isFakeCaretTableBrowser();\n      return isTarget && parentElement(SugarElement.fromDom(node)).exists(isEditable$2);\n    };\n\n    const isContentEditableTrue$1 = isContentEditableTrue$3;\n    const isContentEditableFalse$7 = isContentEditableFalse$b;\n    const isMedia = isMedia$2;\n    const isBlockLike = matchStyleValues('display', 'block table table-cell table-caption list-item');\n    const isCaretContainer = isCaretContainer$2;\n    const isCaretContainerBlock = isCaretContainerBlock$1;\n    const isElement$2 = isElement$6;\n    const isText$4 = isText$b;\n    const isCaretCandidate$1 = isCaretCandidate$3;\n    const isForwards = direction => direction > 0;\n    const isBackwards = direction => direction < 0;\n    const skipCaretContainers = (walk, shallow) => {\n      let node;\n      while (node = walk(shallow)) {\n        if (!isCaretContainerBlock(node)) {\n          return node;\n        }\n      }\n      return null;\n    };\n    const findNode = (node, direction, predicateFn, rootNode, shallow) => {\n      const walker = new DomTreeWalker(node, rootNode);\n      const isCefOrCaretContainer = isContentEditableFalse$7(node) || isCaretContainerBlock(node);\n      let tempNode;\n      if (isBackwards(direction)) {\n        if (isCefOrCaretContainer) {\n          tempNode = skipCaretContainers(walker.prev.bind(walker), true);\n          if (predicateFn(tempNode)) {\n            return tempNode;\n          }\n        }\n        while (tempNode = skipCaretContainers(walker.prev.bind(walker), shallow)) {\n          if (predicateFn(tempNode)) {\n            return tempNode;\n          }\n        }\n      }\n      if (isForwards(direction)) {\n        if (isCefOrCaretContainer) {\n          tempNode = skipCaretContainers(walker.next.bind(walker), true);\n          if (predicateFn(tempNode)) {\n            return tempNode;\n          }\n        }\n        while (tempNode = skipCaretContainers(walker.next.bind(walker), shallow)) {\n          if (predicateFn(tempNode)) {\n            return tempNode;\n          }\n        }\n      }\n      return null;\n    };\n    const getEditingHost = (node, rootNode) => {\n      const isCETrue = node => isContentEditableTrue$1(node.dom);\n      const isRoot = node => node.dom === rootNode;\n      return ancestor$4(SugarElement.fromDom(node), isCETrue, isRoot).map(elm => elm.dom).getOr(rootNode);\n    };\n    const getParentBlock$3 = (node, rootNode) => {\n      while (node && node !== rootNode) {\n        if (isBlockLike(node)) {\n          return node;\n        }\n        node = node.parentNode;\n      }\n      return null;\n    };\n    const isInSameBlock = (caretPosition1, caretPosition2, rootNode) => getParentBlock$3(caretPosition1.container(), rootNode) === getParentBlock$3(caretPosition2.container(), rootNode);\n    const getChildNodeAtRelativeOffset = (relativeOffset, caretPosition) => {\n      if (!caretPosition) {\n        return Optional.none();\n      }\n      const container = caretPosition.container();\n      const offset = caretPosition.offset();\n      if (!isElement$2(container)) {\n        return Optional.none();\n      }\n      return Optional.from(container.childNodes[offset + relativeOffset]);\n    };\n    const beforeAfter = (before, node) => {\n      var _a;\n      const doc = (_a = node.ownerDocument) !== null && _a !== void 0 ? _a : document;\n      const range = doc.createRange();\n      if (before) {\n        range.setStartBefore(node);\n        range.setEndBefore(node);\n      } else {\n        range.setStartAfter(node);\n        range.setEndAfter(node);\n      }\n      return range;\n    };\n    const isNodesInSameBlock = (root, node1, node2) => getParentBlock$3(node1, root) === getParentBlock$3(node2, root);\n    const lean = (left, root, node) => {\n      const siblingName = left ? 'previousSibling' : 'nextSibling';\n      let tempNode = node;\n      while (tempNode && tempNode !== root) {\n        let sibling = tempNode[siblingName];\n        if (sibling && isCaretContainer(sibling)) {\n          sibling = sibling[siblingName];\n        }\n        if (isContentEditableFalse$7(sibling) || isMedia(sibling)) {\n          if (isNodesInSameBlock(root, sibling, tempNode)) {\n            return sibling;\n          }\n          break;\n        }\n        if (isCaretCandidate$1(sibling)) {\n          break;\n        }\n        tempNode = tempNode.parentNode;\n      }\n      return null;\n    };\n    const before$2 = curry(beforeAfter, true);\n    const after$2 = curry(beforeAfter, false);\n    const normalizeRange = (direction, root, range) => {\n      let node;\n      const leanLeft = curry(lean, true, root);\n      const leanRight = curry(lean, false, root);\n      const container = range.startContainer;\n      const offset = range.startOffset;\n      if (isCaretContainerBlock$1(container)) {\n        const block = isText$4(container) ? container.parentNode : container;\n        const location = block.getAttribute('data-mce-caret');\n        if (location === 'before') {\n          node = block.nextSibling;\n          if (isFakeCaretTarget(node)) {\n            return before$2(node);\n          }\n        }\n        if (location === 'after') {\n          node = block.previousSibling;\n          if (isFakeCaretTarget(node)) {\n            return after$2(node);\n          }\n        }\n      }\n      if (!range.collapsed) {\n        return range;\n      }\n      if (isText$b(container)) {\n        if (isCaretContainer(container)) {\n          if (direction === 1) {\n            node = leanRight(container);\n            if (node) {\n              return before$2(node);\n            }\n            node = leanLeft(container);\n            if (node) {\n              return after$2(node);\n            }\n          }\n          if (direction === -1) {\n            node = leanLeft(container);\n            if (node) {\n              return after$2(node);\n            }\n            node = leanRight(container);\n            if (node) {\n              return before$2(node);\n            }\n          }\n          return range;\n        }\n        if (endsWithCaretContainer$1(container) && offset >= container.data.length - 1) {\n          if (direction === 1) {\n            node = leanRight(container);\n            if (node) {\n              return before$2(node);\n            }\n          }\n          return range;\n        }\n        if (startsWithCaretContainer$1(container) && offset <= 1) {\n          if (direction === -1) {\n            node = leanLeft(container);\n            if (node) {\n              return after$2(node);\n            }\n          }\n          return range;\n        }\n        if (offset === container.data.length) {\n          node = leanRight(container);\n          if (node) {\n            return before$2(node);\n          }\n          return range;\n        }\n        if (offset === 0) {\n          node = leanLeft(container);\n          if (node) {\n            return after$2(node);\n          }\n          return range;\n        }\n      }\n      return range;\n    };\n    const getRelativeCefElm = (forward, caretPosition) => getChildNodeAtRelativeOffset(forward ? 0 : -1, caretPosition).filter(isContentEditableFalse$7);\n    const getNormalizedRangeEndPoint = (direction, root, range) => {\n      const normalizedRange = normalizeRange(direction, root, range);\n      return direction === -1 ? CaretPosition.fromRangeStart(normalizedRange) : CaretPosition.fromRangeEnd(normalizedRange);\n    };\n    const getElementFromPosition = pos => Optional.from(pos.getNode()).map(SugarElement.fromDom);\n    const getElementFromPrevPosition = pos => Optional.from(pos.getNode(true)).map(SugarElement.fromDom);\n    const getVisualCaretPosition = (walkFn, caretPosition) => {\n      let pos = caretPosition;\n      while (pos = walkFn(pos)) {\n        if (pos.isVisible()) {\n          return pos;\n        }\n      }\n      return pos;\n    };\n    const isMoveInsideSameBlock = (from, to) => {\n      const inSameBlock = isInSameBlock(from, to);\n      if (!inSameBlock && isBr$6(from.getNode())) {\n        return true;\n      }\n      return inSameBlock;\n    };\n\n    var HDirection;\n    (function (HDirection) {\n      HDirection[HDirection['Backwards'] = -1] = 'Backwards';\n      HDirection[HDirection['Forwards'] = 1] = 'Forwards';\n    }(HDirection || (HDirection = {})));\n    const isContentEditableFalse$6 = isContentEditableFalse$b;\n    const isText$3 = isText$b;\n    const isElement$1 = isElement$6;\n    const isBr$2 = isBr$6;\n    const isCaretCandidate = isCaretCandidate$3;\n    const isAtomic = isAtomic$1;\n    const isEditableCaretCandidate = isEditableCaretCandidate$1;\n    const getParents$3 = (node, root) => {\n      const parents = [];\n      let tempNode = node;\n      while (tempNode && tempNode !== root) {\n        parents.push(tempNode);\n        tempNode = tempNode.parentNode;\n      }\n      return parents;\n    };\n    const nodeAtIndex = (container, offset) => {\n      if (container.hasChildNodes() && offset < container.childNodes.length) {\n        return container.childNodes[offset];\n      }\n      return null;\n    };\n    const getCaretCandidatePosition = (direction, node) => {\n      if (isForwards(direction)) {\n        if (isCaretCandidate(node.previousSibling) && !isText$3(node.previousSibling)) {\n          return CaretPosition.before(node);\n        }\n        if (isText$3(node)) {\n          return CaretPosition(node, 0);\n        }\n      }\n      if (isBackwards(direction)) {\n        if (isCaretCandidate(node.nextSibling) && !isText$3(node.nextSibling)) {\n          return CaretPosition.after(node);\n        }\n        if (isText$3(node)) {\n          return CaretPosition(node, node.data.length);\n        }\n      }\n      if (isBackwards(direction)) {\n        if (isBr$2(node)) {\n          return CaretPosition.before(node);\n        }\n        return CaretPosition.after(node);\n      }\n      return CaretPosition.before(node);\n    };\n    const moveForwardFromBr = (root, nextNode) => {\n      const nextSibling = nextNode.nextSibling;\n      if (nextSibling && isCaretCandidate(nextSibling)) {\n        if (isText$3(nextSibling)) {\n          return CaretPosition(nextSibling, 0);\n        } else {\n          return CaretPosition.before(nextSibling);\n        }\n      } else {\n        return findCaretPosition$1(HDirection.Forwards, CaretPosition.after(nextNode), root);\n      }\n    };\n    const findCaretPosition$1 = (direction, startPos, root) => {\n      let node;\n      let nextNode;\n      let innerNode;\n      let caretPosition;\n      if (!isElement$1(root) || !startPos) {\n        return null;\n      }\n      if (startPos.isEqual(CaretPosition.after(root)) && root.lastChild) {\n        caretPosition = CaretPosition.after(root.lastChild);\n        if (isBackwards(direction) && isCaretCandidate(root.lastChild) && isElement$1(root.lastChild)) {\n          return isBr$2(root.lastChild) ? CaretPosition.before(root.lastChild) : caretPosition;\n        }\n      } else {\n        caretPosition = startPos;\n      }\n      const container = caretPosition.container();\n      let offset = caretPosition.offset();\n      if (isText$3(container)) {\n        if (isBackwards(direction) && offset > 0) {\n          return CaretPosition(container, --offset);\n        }\n        if (isForwards(direction) && offset < container.length) {\n          return CaretPosition(container, ++offset);\n        }\n        node = container;\n      } else {\n        if (isBackwards(direction) && offset > 0) {\n          nextNode = nodeAtIndex(container, offset - 1);\n          if (isCaretCandidate(nextNode)) {\n            if (!isAtomic(nextNode)) {\n              innerNode = findNode(nextNode, direction, isEditableCaretCandidate, nextNode);\n              if (innerNode) {\n                if (isText$3(innerNode)) {\n                  return CaretPosition(innerNode, innerNode.data.length);\n                }\n                return CaretPosition.after(innerNode);\n              }\n            }\n            if (isText$3(nextNode)) {\n              return CaretPosition(nextNode, nextNode.data.length);\n            }\n            return CaretPosition.before(nextNode);\n          }\n        }\n        if (isForwards(direction) && offset < container.childNodes.length) {\n          nextNode = nodeAtIndex(container, offset);\n          if (isCaretCandidate(nextNode)) {\n            if (isBr$2(nextNode)) {\n              return moveForwardFromBr(root, nextNode);\n            }\n            if (!isAtomic(nextNode)) {\n              innerNode = findNode(nextNode, direction, isEditableCaretCandidate, nextNode);\n              if (innerNode) {\n                if (isText$3(innerNode)) {\n                  return CaretPosition(innerNode, 0);\n                }\n                return CaretPosition.before(innerNode);\n              }\n            }\n            if (isText$3(nextNode)) {\n              return CaretPosition(nextNode, 0);\n            }\n            return CaretPosition.after(nextNode);\n          }\n        }\n        node = nextNode ? nextNode : caretPosition.getNode();\n      }\n      if (node && (isForwards(direction) && caretPosition.isAtEnd() || isBackwards(direction) && caretPosition.isAtStart())) {\n        node = findNode(node, direction, always, root, true);\n        if (isEditableCaretCandidate(node, root)) {\n          return getCaretCandidatePosition(direction, node);\n        }\n      }\n      nextNode = node ? findNode(node, direction, isEditableCaretCandidate, root) : node;\n      const rootContentEditableFalseElm = last$1(filter$5(getParents$3(container, root), isContentEditableFalse$6));\n      if (rootContentEditableFalseElm && (!nextNode || !rootContentEditableFalseElm.contains(nextNode))) {\n        if (isForwards(direction)) {\n          caretPosition = CaretPosition.after(rootContentEditableFalseElm);\n        } else {\n          caretPosition = CaretPosition.before(rootContentEditableFalseElm);\n        }\n        return caretPosition;\n      }\n      if (nextNode) {\n        return getCaretCandidatePosition(direction, nextNode);\n      }\n      return null;\n    };\n    const CaretWalker = root => ({\n      next: caretPosition => {\n        return findCaretPosition$1(HDirection.Forwards, caretPosition, root);\n      },\n      prev: caretPosition => {\n        return findCaretPosition$1(HDirection.Backwards, caretPosition, root);\n      }\n    });\n\n    const walkToPositionIn = (forward, root, start) => {\n      const position = forward ? CaretPosition.before(start) : CaretPosition.after(start);\n      return fromPosition(forward, root, position);\n    };\n    const afterElement = node => isBr$6(node) ? CaretPosition.before(node) : CaretPosition.after(node);\n    const isBeforeOrStart = position => {\n      if (CaretPosition.isTextPosition(position)) {\n        return position.offset() === 0;\n      } else {\n        return isCaretCandidate$3(position.getNode());\n      }\n    };\n    const isAfterOrEnd = position => {\n      if (CaretPosition.isTextPosition(position)) {\n        const container = position.container();\n        return position.offset() === container.data.length;\n      } else {\n        return isCaretCandidate$3(position.getNode(true));\n      }\n    };\n    const isBeforeAfterSameElement = (from, to) => !CaretPosition.isTextPosition(from) && !CaretPosition.isTextPosition(to) && from.getNode() === to.getNode(true);\n    const isAtBr = position => !CaretPosition.isTextPosition(position) && isBr$6(position.getNode());\n    const shouldSkipPosition = (forward, from, to) => {\n      if (forward) {\n        return !isBeforeAfterSameElement(from, to) && !isAtBr(from) && isAfterOrEnd(from) && isBeforeOrStart(to);\n      } else {\n        return !isBeforeAfterSameElement(to, from) && isBeforeOrStart(from) && isAfterOrEnd(to);\n      }\n    };\n    const fromPosition = (forward, root, pos) => {\n      const walker = CaretWalker(root);\n      return Optional.from(forward ? walker.next(pos) : walker.prev(pos));\n    };\n    const navigate = (forward, root, from) => fromPosition(forward, root, from).bind(to => {\n      if (isInSameBlock(from, to, root) && shouldSkipPosition(forward, from, to)) {\n        return fromPosition(forward, root, to);\n      } else {\n        return Optional.some(to);\n      }\n    });\n    const navigateIgnore = (forward, root, from, ignoreFilter) => navigate(forward, root, from).bind(pos => ignoreFilter(pos) ? navigateIgnore(forward, root, pos, ignoreFilter) : Optional.some(pos));\n    const positionIn = (forward, element) => {\n      const startNode = forward ? element.firstChild : element.lastChild;\n      if (isText$b(startNode)) {\n        return Optional.some(CaretPosition(startNode, forward ? 0 : startNode.data.length));\n      } else if (startNode) {\n        if (isCaretCandidate$3(startNode)) {\n          return Optional.some(forward ? CaretPosition.before(startNode) : afterElement(startNode));\n        } else {\n          return walkToPositionIn(forward, element, startNode);\n        }\n      } else {\n        return Optional.none();\n      }\n    };\n    const nextPosition = curry(fromPosition, true);\n    const prevPosition = curry(fromPosition, false);\n    const firstPositionIn = curry(positionIn, true);\n    const lastPositionIn = curry(positionIn, false);\n\n    const CARET_ID = '_mce_caret';\n    const isCaretNode = node => isElement$6(node) && node.id === CARET_ID;\n    const getParentCaretContainer = (body, node) => {\n      let currentNode = node;\n      while (currentNode && currentNode !== body) {\n        if (isCaretNode(currentNode)) {\n          return currentNode;\n        }\n        currentNode = currentNode.parentNode;\n      }\n      return null;\n    };\n\n    const isStringPathBookmark = bookmark => isString(bookmark.start);\n    const isRangeBookmark = bookmark => has$2(bookmark, 'rng');\n    const isIdBookmark = bookmark => has$2(bookmark, 'id');\n    const isIndexBookmark = bookmark => has$2(bookmark, 'name');\n    const isPathBookmark = bookmark => Tools.isArray(bookmark.start);\n\n    const isForwardBookmark = bookmark => !isIndexBookmark(bookmark) && isBoolean(bookmark.forward) ? bookmark.forward : true;\n    const addBogus = (dom, node) => {\n      if (isElement$6(node) && dom.isBlock(node) && !node.innerHTML) {\n        node.innerHTML = '<br data-mce-bogus=\"1\" />';\n      }\n      return node;\n    };\n    const resolveCaretPositionBookmark = (dom, bookmark) => {\n      const startPos = Optional.from(resolve$1(dom.getRoot(), bookmark.start));\n      const endPos = Optional.from(resolve$1(dom.getRoot(), bookmark.end));\n      return lift2(startPos, endPos, (start, end) => {\n        const range = dom.createRng();\n        range.setStart(start.container(), start.offset());\n        range.setEnd(end.container(), end.offset());\n        return {\n          range,\n          forward: isForwardBookmark(bookmark)\n        };\n      });\n    };\n    const insertZwsp = (node, rng) => {\n      var _a;\n      const doc = (_a = node.ownerDocument) !== null && _a !== void 0 ? _a : document;\n      const textNode = doc.createTextNode(ZWSP$1);\n      node.appendChild(textNode);\n      rng.setStart(textNode, 0);\n      rng.setEnd(textNode, 0);\n    };\n    const isEmpty$1 = node => !node.hasChildNodes();\n    const tryFindRangePosition = (node, rng) => lastPositionIn(node).fold(never, pos => {\n      rng.setStart(pos.container(), pos.offset());\n      rng.setEnd(pos.container(), pos.offset());\n      return true;\n    });\n    const padEmptyCaretContainer = (root, node, rng) => {\n      if (isEmpty$1(node) && getParentCaretContainer(root, node)) {\n        insertZwsp(node, rng);\n        return true;\n      } else {\n        return false;\n      }\n    };\n    const setEndPoint = (dom, start, bookmark, rng) => {\n      const point = bookmark[start ? 'start' : 'end'];\n      const root = dom.getRoot();\n      if (point) {\n        let node = root;\n        let offset = point[0];\n        for (let i = point.length - 1; node && i >= 1; i--) {\n          const children = node.childNodes;\n          if (padEmptyCaretContainer(root, node, rng)) {\n            return true;\n          }\n          if (point[i] > children.length - 1) {\n            if (padEmptyCaretContainer(root, node, rng)) {\n              return true;\n            }\n            return tryFindRangePosition(node, rng);\n          }\n          node = children[point[i]];\n        }\n        if (isText$b(node)) {\n          offset = Math.min(point[0], node.data.length);\n        }\n        if (isElement$6(node)) {\n          offset = Math.min(point[0], node.childNodes.length);\n        }\n        if (start) {\n          rng.setStart(node, offset);\n        } else {\n          rng.setEnd(node, offset);\n        }\n      }\n      return true;\n    };\n    const isValidTextNode = node => isText$b(node) && node.data.length > 0;\n    const restoreEndPoint = (dom, suffix, bookmark) => {\n      const marker = dom.get(bookmark.id + '_' + suffix);\n      const markerParent = marker === null || marker === void 0 ? void 0 : marker.parentNode;\n      const keep = bookmark.keep;\n      if (marker && markerParent) {\n        let container;\n        let offset;\n        if (suffix === 'start') {\n          if (!keep) {\n            container = markerParent;\n            offset = dom.nodeIndex(marker);\n          } else {\n            if (marker.hasChildNodes()) {\n              container = marker.firstChild;\n              offset = 1;\n            } else if (isValidTextNode(marker.nextSibling)) {\n              container = marker.nextSibling;\n              offset = 0;\n            } else if (isValidTextNode(marker.previousSibling)) {\n              container = marker.previousSibling;\n              offset = marker.previousSibling.data.length;\n            } else {\n              container = markerParent;\n              offset = dom.nodeIndex(marker) + 1;\n            }\n          }\n        } else {\n          if (!keep) {\n            container = markerParent;\n            offset = dom.nodeIndex(marker);\n          } else {\n            if (marker.hasChildNodes()) {\n              container = marker.firstChild;\n              offset = 1;\n            } else if (isValidTextNode(marker.previousSibling)) {\n              container = marker.previousSibling;\n              offset = marker.previousSibling.data.length;\n            } else {\n              container = markerParent;\n              offset = dom.nodeIndex(marker);\n            }\n          }\n        }\n        if (!keep) {\n          const prev = marker.previousSibling;\n          const next = marker.nextSibling;\n          Tools.each(Tools.grep(marker.childNodes), node => {\n            if (isText$b(node)) {\n              node.data = node.data.replace(/\\uFEFF/g, '');\n            }\n          });\n          let otherMarker;\n          while (otherMarker = dom.get(bookmark.id + '_' + suffix)) {\n            dom.remove(otherMarker, true);\n          }\n          if (isText$b(next) && isText$b(prev) && !Env.browser.isOpera()) {\n            const idx = prev.data.length;\n            prev.appendData(next.data);\n            dom.remove(next);\n            container = prev;\n            offset = idx;\n          }\n        }\n        return Optional.some(CaretPosition(container, offset));\n      } else {\n        return Optional.none();\n      }\n    };\n    const resolvePaths = (dom, bookmark) => {\n      const range = dom.createRng();\n      if (setEndPoint(dom, true, bookmark, range) && setEndPoint(dom, false, bookmark, range)) {\n        return Optional.some({\n          range,\n          forward: isForwardBookmark(bookmark)\n        });\n      } else {\n        return Optional.none();\n      }\n    };\n    const resolveId = (dom, bookmark) => {\n      const startPos = restoreEndPoint(dom, 'start', bookmark);\n      const endPos = restoreEndPoint(dom, 'end', bookmark);\n      return lift2(startPos, endPos.or(startPos), (spos, epos) => {\n        const range = dom.createRng();\n        range.setStart(addBogus(dom, spos.container()), spos.offset());\n        range.setEnd(addBogus(dom, epos.container()), epos.offset());\n        return {\n          range,\n          forward: isForwardBookmark(bookmark)\n        };\n      });\n    };\n    const resolveIndex = (dom, bookmark) => Optional.from(dom.select(bookmark.name)[bookmark.index]).map(elm => {\n      const range = dom.createRng();\n      range.selectNode(elm);\n      return {\n        range,\n        forward: true\n      };\n    });\n    const resolve = (selection, bookmark) => {\n      const dom = selection.dom;\n      if (bookmark) {\n        if (isPathBookmark(bookmark)) {\n          return resolvePaths(dom, bookmark);\n        } else if (isStringPathBookmark(bookmark)) {\n          return resolveCaretPositionBookmark(dom, bookmark);\n        } else if (isIdBookmark(bookmark)) {\n          return resolveId(dom, bookmark);\n        } else if (isIndexBookmark(bookmark)) {\n          return resolveIndex(dom, bookmark);\n        } else if (isRangeBookmark(bookmark)) {\n          return Optional.some({\n            range: bookmark.rng,\n            forward: isForwardBookmark(bookmark)\n          });\n        }\n      }\n      return Optional.none();\n    };\n\n    const getBookmark$1 = (selection, type, normalized) => {\n      return getBookmark$2(selection, type, normalized);\n    };\n    const moveToBookmark = (selection, bookmark) => {\n      resolve(selection, bookmark).each(({range, forward}) => {\n        selection.setRng(range, forward);\n      });\n    };\n    const isBookmarkNode$1 = node => {\n      return isElement$6(node) && node.tagName === 'SPAN' && node.getAttribute('data-mce-type') === 'bookmark';\n    };\n\n    const is = expected => actual => expected === actual;\n    const isNbsp = is(nbsp);\n    const isWhiteSpace = chr => chr !== '' && ' \\f\\n\\r\\t\\x0B'.indexOf(chr) !== -1;\n    const isContent = chr => !isWhiteSpace(chr) && !isNbsp(chr) && !isZwsp$2(chr);\n\n    const getRanges$1 = selection => {\n      const ranges = [];\n      if (selection) {\n        for (let i = 0; i < selection.rangeCount; i++) {\n          ranges.push(selection.getRangeAt(i));\n        }\n      }\n      return ranges;\n    };\n    const getSelectedNodes = ranges => {\n      return bind$3(ranges, range => {\n        const node = getSelectedNode(range);\n        return node ? [SugarElement.fromDom(node)] : [];\n      });\n    };\n    const hasMultipleRanges = selection => {\n      return getRanges$1(selection).length > 1;\n    };\n\n    const getCellsFromRanges = ranges => filter$5(getSelectedNodes(ranges), isTableCell$2);\n    const getCellsFromElement = elm => descendants(elm, 'td[data-mce-selected],th[data-mce-selected]');\n    const getCellsFromElementOrRanges = (ranges, element) => {\n      const selectedCells = getCellsFromElement(element);\n      return selectedCells.length > 0 ? selectedCells : getCellsFromRanges(ranges);\n    };\n    const getCellsFromEditor = editor => getCellsFromElementOrRanges(getRanges$1(editor.selection.getSel()), SugarElement.fromDom(editor.getBody()));\n    const getClosestTable = (cell, isRoot) => ancestor$3(cell, 'table', isRoot);\n\n    const getStartNode = rng => {\n      const sc = rng.startContainer, so = rng.startOffset;\n      if (isText$b(sc)) {\n        return so === 0 ? Optional.some(SugarElement.fromDom(sc)) : Optional.none();\n      } else {\n        return Optional.from(sc.childNodes[so]).map(SugarElement.fromDom);\n      }\n    };\n    const getEndNode = rng => {\n      const ec = rng.endContainer, eo = rng.endOffset;\n      if (isText$b(ec)) {\n        return eo === ec.data.length ? Optional.some(SugarElement.fromDom(ec)) : Optional.none();\n      } else {\n        return Optional.from(ec.childNodes[eo - 1]).map(SugarElement.fromDom);\n      }\n    };\n    const getFirstChildren = node => {\n      return firstChild(node).fold(constant([node]), child => {\n        return [node].concat(getFirstChildren(child));\n      });\n    };\n    const getLastChildren = node => {\n      return lastChild(node).fold(constant([node]), child => {\n        if (name(child) === 'br') {\n          return prevSibling(child).map(sibling => {\n            return [node].concat(getLastChildren(sibling));\n          }).getOr([]);\n        } else {\n          return [node].concat(getLastChildren(child));\n        }\n      });\n    };\n    const hasAllContentsSelected = (elm, rng) => {\n      return lift2(getStartNode(rng), getEndNode(rng), (startNode, endNode) => {\n        const start = find$2(getFirstChildren(elm), curry(eq, startNode));\n        const end = find$2(getLastChildren(elm), curry(eq, endNode));\n        return start.isSome() && end.isSome();\n      }).getOr(false);\n    };\n    const moveEndPoint = (dom, rng, node, start) => {\n      const root = node;\n      const walker = new DomTreeWalker(node, root);\n      const moveCaretBeforeOnEnterElementsMap = filter$4(dom.schema.getMoveCaretBeforeOnEnterElements(), (_, name) => !contains$2([\n        'td',\n        'th',\n        'table'\n      ], name.toLowerCase()));\n      let currentNode = node;\n      do {\n        if (isText$b(currentNode) && Tools.trim(currentNode.data).length !== 0) {\n          if (start) {\n            rng.setStart(currentNode, 0);\n          } else {\n            rng.setEnd(currentNode, currentNode.data.length);\n          }\n          return;\n        }\n        if (moveCaretBeforeOnEnterElementsMap[currentNode.nodeName]) {\n          if (start) {\n            rng.setStartBefore(currentNode);\n          } else {\n            if (currentNode.nodeName === 'BR') {\n              rng.setEndBefore(currentNode);\n            } else {\n              rng.setEndAfter(currentNode);\n            }\n          }\n          return;\n        }\n      } while (currentNode = start ? walker.next() : walker.prev());\n      if (root.nodeName === 'BODY') {\n        if (start) {\n          rng.setStart(root, 0);\n        } else {\n          rng.setEnd(root, root.childNodes.length);\n        }\n      }\n    };\n    const hasAnyRanges = editor => {\n      const sel = editor.selection.getSel();\n      return isNonNullable(sel) && sel.rangeCount > 0;\n    };\n    const runOnRanges = (editor, executor) => {\n      const fakeSelectionNodes = getCellsFromEditor(editor);\n      if (fakeSelectionNodes.length > 0) {\n        each$e(fakeSelectionNodes, elem => {\n          const node = elem.dom;\n          const fakeNodeRng = editor.dom.createRng();\n          fakeNodeRng.setStartBefore(node);\n          fakeNodeRng.setEndAfter(node);\n          executor(fakeNodeRng, true);\n        });\n      } else {\n        executor(editor.selection.getRng(), false);\n      }\n    };\n    const preserve = (selection, fillBookmark, executor) => {\n      const bookmark = getPersistentBookmark(selection, fillBookmark);\n      executor(bookmark);\n      selection.moveToBookmark(bookmark);\n    };\n\n    const isNode = node => isNumber(node === null || node === void 0 ? void 0 : node.nodeType);\n    const isElementNode$1 = node => isElement$6(node) && !isBookmarkNode$1(node) && !isCaretNode(node) && !isBogus$1(node);\n    const isElementDirectlySelected = (dom, node) => {\n      if (isElementNode$1(node) && !/^(TD|TH)$/.test(node.nodeName)) {\n        const selectedAttr = dom.getAttrib(node, 'data-mce-selected');\n        const value = parseInt(selectedAttr, 10);\n        return !isNaN(value) && value > 0;\n      } else {\n        return false;\n      }\n    };\n    const preserveSelection = (editor, action, shouldMoveStart) => {\n      const {selection, dom} = editor;\n      const selectedNodeBeforeAction = selection.getNode();\n      const isSelectedBeforeNodeNoneditable = isContentEditableFalse$b(selectedNodeBeforeAction);\n      preserve(selection, true, () => {\n        action();\n      });\n      const isBeforeNodeStillNoneditable = isSelectedBeforeNodeNoneditable && isContentEditableFalse$b(selectedNodeBeforeAction);\n      if (isBeforeNodeStillNoneditable && dom.isChildOf(selectedNodeBeforeAction, editor.getBody())) {\n        editor.selection.select(selectedNodeBeforeAction);\n      } else if (shouldMoveStart(selection.getStart())) {\n        moveStartToNearestText(dom, selection);\n      }\n    };\n    const moveStartToNearestText = (dom, selection) => {\n      var _a, _b;\n      const rng = selection.getRng();\n      const {startContainer, startOffset} = rng;\n      const selectedNode = selection.getNode();\n      if (isElementDirectlySelected(dom, selectedNode)) {\n        return;\n      }\n      if (isElement$6(startContainer)) {\n        const nodes = startContainer.childNodes;\n        const root = dom.getRoot();\n        let walker;\n        if (startOffset < nodes.length) {\n          const startNode = nodes[startOffset];\n          walker = new DomTreeWalker(startNode, (_a = dom.getParent(startNode, dom.isBlock)) !== null && _a !== void 0 ? _a : root);\n        } else {\n          const startNode = nodes[nodes.length - 1];\n          walker = new DomTreeWalker(startNode, (_b = dom.getParent(startNode, dom.isBlock)) !== null && _b !== void 0 ? _b : root);\n          walker.next(true);\n        }\n        for (let node = walker.current(); node; node = walker.next()) {\n          if (dom.getContentEditable(node) === 'false') {\n            return;\n          } else if (isText$b(node) && !isWhiteSpaceNode$1(node)) {\n            rng.setStart(node, 0);\n            selection.setRng(rng);\n            return;\n          }\n        }\n      }\n    };\n    const getNonWhiteSpaceSibling = (node, next, inc) => {\n      if (node) {\n        const nextName = next ? 'nextSibling' : 'previousSibling';\n        for (node = inc ? node : node[nextName]; node; node = node[nextName]) {\n          if (isElement$6(node) || !isWhiteSpaceNode$1(node)) {\n            return node;\n          }\n        }\n      }\n      return undefined;\n    };\n    const isTextBlock$1 = (schema, node) => !!schema.getTextBlockElements()[node.nodeName.toLowerCase()] || isTransparentBlock(schema, node);\n    const isValid = (ed, parent, child) => {\n      return ed.schema.isValidChild(parent, child);\n    };\n    const isWhiteSpaceNode$1 = (node, allowSpaces = false) => {\n      if (isNonNullable(node) && isText$b(node)) {\n        const data = allowSpaces ? node.data.replace(/ /g, '\\xA0') : node.data;\n        return isWhitespaceText(data);\n      } else {\n        return false;\n      }\n    };\n    const isEmptyTextNode$1 = node => {\n      return isNonNullable(node) && isText$b(node) && node.length === 0;\n    };\n    const isWrapNoneditableTarget = (editor, node) => {\n      const baseDataSelector = '[data-mce-cef-wrappable]';\n      const formatNoneditableSelector = getFormatNoneditableSelector(editor);\n      const selector = isEmpty$3(formatNoneditableSelector) ? baseDataSelector : `${ baseDataSelector },${ formatNoneditableSelector }`;\n      return is$1(SugarElement.fromDom(node), selector);\n    };\n    const isWrappableNoneditable = (editor, node) => {\n      const dom = editor.dom;\n      return isElementNode$1(node) && dom.getContentEditable(node) === 'false' && isWrapNoneditableTarget(editor, node) && dom.select('[contenteditable=\"true\"]', node).length === 0;\n    };\n    const replaceVars = (value, vars) => {\n      if (isFunction(value)) {\n        return value(vars);\n      } else if (isNonNullable(vars)) {\n        value = value.replace(/%(\\w+)/g, (str, name) => {\n          return vars[name] || str;\n        });\n      }\n      return value;\n    };\n    const isEq$5 = (str1, str2) => {\n      str1 = str1 || '';\n      str2 = str2 || '';\n      str1 = '' + (str1.nodeName || str1);\n      str2 = '' + (str2.nodeName || str2);\n      return str1.toLowerCase() === str2.toLowerCase();\n    };\n    const normalizeStyleValue = (value, name) => {\n      if (isNullable(value)) {\n        return null;\n      } else {\n        let strValue = String(value);\n        if (name === 'color' || name === 'backgroundColor') {\n          strValue = rgbaToHexString(strValue);\n        }\n        if (name === 'fontWeight' && value === 700) {\n          strValue = 'bold';\n        }\n        if (name === 'fontFamily') {\n          strValue = strValue.replace(/[\\'\\\"]/g, '').replace(/,\\s+/g, ',');\n        }\n        return strValue;\n      }\n    };\n    const getStyle = (dom, node, name) => {\n      const style = dom.getStyle(node, name);\n      return normalizeStyleValue(style, name);\n    };\n    const getTextDecoration = (dom, node) => {\n      let decoration;\n      dom.getParent(node, n => {\n        if (isElement$6(n)) {\n          decoration = dom.getStyle(n, 'text-decoration');\n          return !!decoration && decoration !== 'none';\n        } else {\n          return false;\n        }\n      });\n      return decoration;\n    };\n    const getParents$2 = (dom, node, selector) => {\n      return dom.getParents(node, selector, dom.getRoot());\n    };\n    const isFormatPredicate = (editor, formatName, predicate) => {\n      const formats = editor.formatter.get(formatName);\n      return isNonNullable(formats) && exists(formats, predicate);\n    };\n    const isVariableFormatName = (editor, formatName) => {\n      const hasVariableValues = format => {\n        const isVariableValue = val => isFunction(val) || val.length > 1 && val.charAt(0) === '%';\n        return exists([\n          'styles',\n          'attributes'\n        ], key => get$a(format, key).exists(field => {\n          const fieldValues = isArray$1(field) ? field : values(field);\n          return exists(fieldValues, isVariableValue);\n        }));\n      };\n      return isFormatPredicate(editor, formatName, hasVariableValues);\n    };\n    const areSimilarFormats = (editor, formatName, otherFormatName) => {\n      const validKeys = [\n        'inline',\n        'block',\n        'selector',\n        'attributes',\n        'styles',\n        'classes'\n      ];\n      const filterObj = format => filter$4(format, (_, key) => exists(validKeys, validKey => validKey === key));\n      return isFormatPredicate(editor, formatName, fmt1 => {\n        const filteredFmt1 = filterObj(fmt1);\n        return isFormatPredicate(editor, otherFormatName, fmt2 => {\n          const filteredFmt2 = filterObj(fmt2);\n          return equal$1(filteredFmt1, filteredFmt2);\n        });\n      });\n    };\n    const isBlockFormat = format => hasNonNullableKey(format, 'block');\n    const isWrappingBlockFormat = format => isBlockFormat(format) && format.wrapper === true;\n    const isNonWrappingBlockFormat = format => isBlockFormat(format) && format.wrapper !== true;\n    const isSelectorFormat = format => hasNonNullableKey(format, 'selector');\n    const isInlineFormat = format => hasNonNullableKey(format, 'inline');\n    const isMixedFormat = format => isSelectorFormat(format) && isInlineFormat(format) && is$2(get$a(format, 'mixed'), true);\n    const shouldExpandToSelector = format => isSelectorFormat(format) && format.expand !== false && !isInlineFormat(format);\n    const getEmptyCaretContainers = node => {\n      const nodes = [];\n      let tempNode = node;\n      while (tempNode) {\n        if (isText$b(tempNode) && tempNode.data !== ZWSP$1 || tempNode.childNodes.length > 1) {\n          return [];\n        }\n        if (isElement$6(tempNode)) {\n          nodes.push(tempNode);\n        }\n        tempNode = tempNode.firstChild;\n      }\n      return nodes;\n    };\n    const isCaretContainerEmpty = node => {\n      return getEmptyCaretContainers(node).length > 0;\n    };\n    const isEmptyCaretFormatElement = element => {\n      return isCaretNode(element.dom) && isCaretContainerEmpty(element.dom);\n    };\n\n    const isBookmarkNode = isBookmarkNode$1;\n    const getParents$1 = getParents$2;\n    const isWhiteSpaceNode = isWhiteSpaceNode$1;\n    const isTextBlock = isTextBlock$1;\n    const isBogusBr = node => {\n      return isBr$6(node) && node.getAttribute('data-mce-bogus') && !node.nextSibling;\n    };\n    const findParentContentEditable = (dom, node) => {\n      let parent = node;\n      while (parent) {\n        if (isElement$6(parent) && dom.getContentEditable(parent)) {\n          return dom.getContentEditable(parent) === 'false' ? parent : node;\n        }\n        parent = parent.parentNode;\n      }\n      return node;\n    };\n    const walkText = (start, node, offset, predicate) => {\n      const str = node.data;\n      if (start) {\n        for (let i = offset; i > 0; i--) {\n          if (predicate(str.charAt(i - 1))) {\n            return i;\n          }\n        }\n      } else {\n        for (let i = offset; i < str.length; i++) {\n          if (predicate(str.charAt(i))) {\n            return i;\n          }\n        }\n      }\n      return -1;\n    };\n    const findSpace = (start, node, offset) => walkText(start, node, offset, c => isNbsp(c) || isWhiteSpace(c));\n    const findContent = (start, node, offset) => walkText(start, node, offset, isContent);\n    const findWordEndPoint = (dom, body, container, offset, start, includeTrailingSpaces) => {\n      let lastTextNode;\n      const rootNode = dom.getParent(container, dom.isBlock) || body;\n      const walk = (container, offset, pred) => {\n        const textSeeker = TextSeeker(dom);\n        const walker = start ? textSeeker.backwards : textSeeker.forwards;\n        return Optional.from(walker(container, offset, (text, textOffset) => {\n          if (isBookmarkNode(text.parentNode)) {\n            return -1;\n          } else {\n            lastTextNode = text;\n            return pred(start, text, textOffset);\n          }\n        }, rootNode));\n      };\n      const spaceResult = walk(container, offset, findSpace);\n      return spaceResult.bind(result => includeTrailingSpaces ? walk(result.container, result.offset + (start ? -1 : 0), findContent) : Optional.some(result)).orThunk(() => lastTextNode ? Optional.some({\n        container: lastTextNode,\n        offset: start ? 0 : lastTextNode.length\n      }) : Optional.none());\n    };\n    const findSelectorEndPoint = (dom, formatList, rng, container, siblingName) => {\n      const sibling = container[siblingName];\n      if (isText$b(container) && isEmpty$3(container.data) && sibling) {\n        container = sibling;\n      }\n      const parents = getParents$1(dom, container);\n      for (let i = 0; i < parents.length; i++) {\n        for (let y = 0; y < formatList.length; y++) {\n          const curFormat = formatList[y];\n          if (isNonNullable(curFormat.collapsed) && curFormat.collapsed !== rng.collapsed) {\n            continue;\n          }\n          if (isSelectorFormat(curFormat) && dom.is(parents[i], curFormat.selector)) {\n            return parents[i];\n          }\n        }\n      }\n      return container;\n    };\n    const findBlockEndPoint = (dom, formatList, container, siblingName) => {\n      var _a;\n      let node = container;\n      const root = dom.getRoot();\n      const format = formatList[0];\n      if (isBlockFormat(format)) {\n        node = format.wrapper ? null : dom.getParent(container, format.block, root);\n      }\n      if (!node) {\n        const scopeRoot = (_a = dom.getParent(container, 'LI,TD,TH,SUMMARY')) !== null && _a !== void 0 ? _a : root;\n        node = dom.getParent(isText$b(container) ? container.parentNode : container, node => node !== root && isTextBlock(dom.schema, node), scopeRoot);\n      }\n      if (node && isBlockFormat(format) && format.wrapper) {\n        node = getParents$1(dom, node, 'ul,ol').reverse()[0] || node;\n      }\n      if (!node) {\n        node = container;\n        while (node && node[siblingName] && !dom.isBlock(node[siblingName])) {\n          node = node[siblingName];\n          if (isEq$5(node, 'br')) {\n            break;\n          }\n        }\n      }\n      return node || container;\n    };\n    const isAtBlockBoundary$1 = (dom, root, container, siblingName) => {\n      const parent = container.parentNode;\n      if (isNonNullable(container[siblingName])) {\n        return false;\n      } else if (parent === root || isNullable(parent) || dom.isBlock(parent)) {\n        return true;\n      } else {\n        return isAtBlockBoundary$1(dom, root, parent, siblingName);\n      }\n    };\n    const findParentContainer = (dom, formatList, container, offset, start) => {\n      let parent = container;\n      const siblingName = start ? 'previousSibling' : 'nextSibling';\n      const root = dom.getRoot();\n      if (isText$b(container) && !isWhiteSpaceNode(container)) {\n        if (start ? offset > 0 : offset < container.data.length) {\n          return container;\n        }\n      }\n      while (parent) {\n        if (!formatList[0].block_expand && dom.isBlock(parent)) {\n          return parent;\n        }\n        for (let sibling = parent[siblingName]; sibling; sibling = sibling[siblingName]) {\n          const allowSpaces = isText$b(sibling) && !isAtBlockBoundary$1(dom, root, sibling, siblingName);\n          if (!isBookmarkNode(sibling) && !isBogusBr(sibling) && !isWhiteSpaceNode(sibling, allowSpaces)) {\n            return parent;\n          }\n        }\n        if (parent === root || parent.parentNode === root) {\n          container = parent;\n          break;\n        }\n        parent = parent.parentNode;\n      }\n      return container;\n    };\n    const isSelfOrParentBookmark = container => isBookmarkNode(container.parentNode) || isBookmarkNode(container);\n    const expandRng = (dom, rng, formatList, includeTrailingSpace = false) => {\n      let {startContainer, startOffset, endContainer, endOffset} = rng;\n      const format = formatList[0];\n      if (isElement$6(startContainer) && startContainer.hasChildNodes()) {\n        startContainer = getNode$1(startContainer, startOffset);\n        if (isText$b(startContainer)) {\n          startOffset = 0;\n        }\n      }\n      if (isElement$6(endContainer) && endContainer.hasChildNodes()) {\n        endContainer = getNode$1(endContainer, rng.collapsed ? endOffset : endOffset - 1);\n        if (isText$b(endContainer)) {\n          endOffset = endContainer.data.length;\n        }\n      }\n      startContainer = findParentContentEditable(dom, startContainer);\n      endContainer = findParentContentEditable(dom, endContainer);\n      if (isSelfOrParentBookmark(startContainer)) {\n        startContainer = isBookmarkNode(startContainer) ? startContainer : startContainer.parentNode;\n        if (rng.collapsed) {\n          startContainer = startContainer.previousSibling || startContainer;\n        } else {\n          startContainer = startContainer.nextSibling || startContainer;\n        }\n        if (isText$b(startContainer)) {\n          startOffset = rng.collapsed ? startContainer.length : 0;\n        }\n      }\n      if (isSelfOrParentBookmark(endContainer)) {\n        endContainer = isBookmarkNode(endContainer) ? endContainer : endContainer.parentNode;\n        if (rng.collapsed) {\n          endContainer = endContainer.nextSibling || endContainer;\n        } else {\n          endContainer = endContainer.previousSibling || endContainer;\n        }\n        if (isText$b(endContainer)) {\n          endOffset = rng.collapsed ? 0 : endContainer.length;\n        }\n      }\n      if (rng.collapsed) {\n        const startPoint = findWordEndPoint(dom, dom.getRoot(), startContainer, startOffset, true, includeTrailingSpace);\n        startPoint.each(({container, offset}) => {\n          startContainer = container;\n          startOffset = offset;\n        });\n        const endPoint = findWordEndPoint(dom, dom.getRoot(), endContainer, endOffset, false, includeTrailingSpace);\n        endPoint.each(({container, offset}) => {\n          endContainer = container;\n          endOffset = offset;\n        });\n      }\n      if (isInlineFormat(format) || format.block_expand) {\n        if (!isInlineFormat(format) || (!isText$b(startContainer) || startOffset === 0)) {\n          startContainer = findParentContainer(dom, formatList, startContainer, startOffset, true);\n        }\n        if (!isInlineFormat(format) || (!isText$b(endContainer) || endOffset === endContainer.data.length)) {\n          endContainer = findParentContainer(dom, formatList, endContainer, endOffset, false);\n        }\n      }\n      if (shouldExpandToSelector(format)) {\n        startContainer = findSelectorEndPoint(dom, formatList, rng, startContainer, 'previousSibling');\n        endContainer = findSelectorEndPoint(dom, formatList, rng, endContainer, 'nextSibling');\n      }\n      if (isBlockFormat(format) || isSelectorFormat(format)) {\n        startContainer = findBlockEndPoint(dom, formatList, startContainer, 'previousSibling');\n        endContainer = findBlockEndPoint(dom, formatList, endContainer, 'nextSibling');\n        if (isBlockFormat(format)) {\n          if (!dom.isBlock(startContainer)) {\n            startContainer = findParentContainer(dom, formatList, startContainer, startOffset, true);\n            if (isText$b(startContainer)) {\n              startOffset = 0;\n            }\n          }\n          if (!dom.isBlock(endContainer)) {\n            endContainer = findParentContainer(dom, formatList, endContainer, endOffset, false);\n            if (isText$b(endContainer)) {\n              endOffset = endContainer.data.length;\n            }\n          }\n        }\n      }\n      if (isElement$6(startContainer) && startContainer.parentNode) {\n        startOffset = dom.nodeIndex(startContainer);\n        startContainer = startContainer.parentNode;\n      }\n      if (isElement$6(endContainer) && endContainer.parentNode) {\n        endOffset = dom.nodeIndex(endContainer) + 1;\n        endContainer = endContainer.parentNode;\n      }\n      return {\n        startContainer,\n        startOffset,\n        endContainer,\n        endOffset\n      };\n    };\n\n    const walk$3 = (dom, rng, callback) => {\n      var _a;\n      const startOffset = rng.startOffset;\n      const startContainer = getNode$1(rng.startContainer, startOffset);\n      const endOffset = rng.endOffset;\n      const endContainer = getNode$1(rng.endContainer, endOffset - 1);\n      const exclude = nodes => {\n        const firstNode = nodes[0];\n        if (isText$b(firstNode) && firstNode === startContainer && startOffset >= firstNode.data.length) {\n          nodes.splice(0, 1);\n        }\n        const lastNode = nodes[nodes.length - 1];\n        if (endOffset === 0 && nodes.length > 0 && lastNode === endContainer && isText$b(lastNode)) {\n          nodes.splice(nodes.length - 1, 1);\n        }\n        return nodes;\n      };\n      const collectSiblings = (node, name, endNode) => {\n        const siblings = [];\n        for (; node && node !== endNode; node = node[name]) {\n          siblings.push(node);\n        }\n        return siblings;\n      };\n      const findEndPoint = (node, root) => dom.getParent(node, node => node.parentNode === root, root);\n      const walkBoundary = (startNode, endNode, next) => {\n        const siblingName = next ? 'nextSibling' : 'previousSibling';\n        for (let node = startNode, parent = node.parentNode; node && node !== endNode; node = parent) {\n          parent = node.parentNode;\n          const siblings = collectSiblings(node === startNode ? node : node[siblingName], siblingName);\n          if (siblings.length) {\n            if (!next) {\n              siblings.reverse();\n            }\n            callback(exclude(siblings));\n          }\n        }\n      };\n      if (startContainer === endContainer) {\n        return callback(exclude([startContainer]));\n      }\n      const ancestor = (_a = dom.findCommonAncestor(startContainer, endContainer)) !== null && _a !== void 0 ? _a : dom.getRoot();\n      if (dom.isChildOf(startContainer, endContainer)) {\n        return walkBoundary(startContainer, ancestor, true);\n      }\n      if (dom.isChildOf(endContainer, startContainer)) {\n        return walkBoundary(endContainer, ancestor);\n      }\n      const startPoint = findEndPoint(startContainer, ancestor) || startContainer;\n      const endPoint = findEndPoint(endContainer, ancestor) || endContainer;\n      walkBoundary(startContainer, startPoint, true);\n      const siblings = collectSiblings(startPoint === startContainer ? startPoint : startPoint.nextSibling, 'nextSibling', endPoint === endContainer ? endPoint.nextSibling : endPoint);\n      if (siblings.length) {\n        callback(exclude(siblings));\n      }\n      walkBoundary(endContainer, endPoint);\n    };\n\n    const validBlocks = [\n      'pre[class*=language-][contenteditable=\"false\"]',\n      'figure.image',\n      'div[data-ephox-embed-iri]',\n      'div.tiny-pageembed',\n      'div.mce-toc',\n      'div[data-mce-toc]'\n    ];\n    const isZeroWidth = elem => isText$c(elem) && get$3(elem) === ZWSP$1;\n    const context = (editor, elem, wrapName, nodeName) => parent(elem).fold(() => 'skipping', parent => {\n      if (nodeName === 'br' || isZeroWidth(elem)) {\n        return 'valid';\n      } else if (isAnnotation(elem)) {\n        return 'existing';\n      } else if (isCaretNode(elem.dom)) {\n        return 'caret';\n      } else if (exists(validBlocks, selector => is$1(elem, selector))) {\n        return 'valid-block';\n      } else if (!isValid(editor, wrapName, nodeName) || !isValid(editor, name(parent), wrapName)) {\n        return 'invalid-child';\n      } else {\n        return 'valid';\n      }\n    });\n\n    const applyWordGrab = (editor, rng) => {\n      const r = expandRng(editor.dom, rng, [{ inline: 'span' }]);\n      rng.setStart(r.startContainer, r.startOffset);\n      rng.setEnd(r.endContainer, r.endOffset);\n      editor.selection.setRng(rng);\n    };\n    const applyAnnotation = (elem, masterUId, data, annotationName, decorate, directAnnotation) => {\n      const {uid = masterUId, ...otherData} = data;\n      add$2(elem, annotation());\n      set$3(elem, `${ dataAnnotationId() }`, uid);\n      set$3(elem, `${ dataAnnotation() }`, annotationName);\n      const {attributes = {}, classes = []} = decorate(uid, otherData);\n      setAll$1(elem, attributes);\n      add(elem, classes);\n      if (directAnnotation) {\n        if (classes.length > 0) {\n          set$3(elem, `${ dataAnnotationClasses() }`, classes.join(','));\n        }\n        const attributeNames = keys(attributes);\n        if (attributeNames.length > 0) {\n          set$3(elem, `${ dataAnnotationAttributes() }`, attributeNames.join(','));\n        }\n      }\n    };\n    const removeDirectAnnotation = elem => {\n      remove$6(elem, annotation());\n      remove$9(elem, `${ dataAnnotationId() }`);\n      remove$9(elem, `${ dataAnnotation() }`);\n      remove$9(elem, `${ dataAnnotationActive() }`);\n      const customAttrNames = getOpt(elem, `${ dataAnnotationAttributes() }`).map(names => names.split(',')).getOr([]);\n      const customClasses = getOpt(elem, `${ dataAnnotationClasses() }`).map(names => names.split(',')).getOr([]);\n      each$e(customAttrNames, name => remove$9(elem, name));\n      remove$3(elem, customClasses);\n      remove$9(elem, `${ dataAnnotationClasses() }`);\n      remove$9(elem, `${ dataAnnotationAttributes() }`);\n    };\n    const makeAnnotation = (eDoc, uid, data, annotationName, decorate) => {\n      const master = SugarElement.fromTag('span', eDoc);\n      applyAnnotation(master, uid, data, annotationName, decorate, false);\n      return master;\n    };\n    const annotate = (editor, rng, uid, annotationName, decorate, data) => {\n      const newWrappers = [];\n      const master = makeAnnotation(editor.getDoc(), uid, data, annotationName, decorate);\n      const wrapper = value$2();\n      const finishWrapper = () => {\n        wrapper.clear();\n      };\n      const getOrOpenWrapper = () => wrapper.get().getOrThunk(() => {\n        const nu = shallow$1(master);\n        newWrappers.push(nu);\n        wrapper.set(nu);\n        return nu;\n      });\n      const processElements = elems => {\n        each$e(elems, processElement);\n      };\n      const processElement = elem => {\n        const ctx = context(editor, elem, 'span', name(elem));\n        switch (ctx) {\n        case 'invalid-child': {\n            finishWrapper();\n            const children = children$1(elem);\n            processElements(children);\n            finishWrapper();\n            break;\n          }\n        case 'valid-block': {\n            finishWrapper();\n            applyAnnotation(elem, uid, data, annotationName, decorate, true);\n            break;\n          }\n        case 'valid': {\n            const w = getOrOpenWrapper();\n            wrap$2(elem, w);\n            break;\n          }\n        }\n      };\n      const processNodes = nodes => {\n        const elems = map$3(nodes, SugarElement.fromDom);\n        processElements(elems);\n      };\n      walk$3(editor.dom, rng, nodes => {\n        finishWrapper();\n        processNodes(nodes);\n      });\n      return newWrappers;\n    };\n    const annotateWithBookmark = (editor, name, settings, data) => {\n      editor.undoManager.transact(() => {\n        const selection = editor.selection;\n        const initialRng = selection.getRng();\n        const hasFakeSelection = getCellsFromEditor(editor).length > 0;\n        const masterUid = generate$1('mce-annotation');\n        if (initialRng.collapsed && !hasFakeSelection) {\n          applyWordGrab(editor, initialRng);\n        }\n        if (selection.getRng().collapsed && !hasFakeSelection) {\n          const wrapper = makeAnnotation(editor.getDoc(), masterUid, data, name, settings.decorate);\n          set$1(wrapper, nbsp);\n          selection.getRng().insertNode(wrapper.dom);\n          selection.select(wrapper.dom);\n        } else {\n          preserve(selection, false, () => {\n            runOnRanges(editor, selectionRng => {\n              annotate(editor, selectionRng, masterUid, name, settings.decorate, data);\n            });\n          });\n        }\n      });\n    };\n\n    const Annotator = editor => {\n      const registry = create$b();\n      setup$x(editor, registry);\n      const changes = setup$y(editor, registry);\n      const isSpan = isTag('span');\n      const removeAnnotations = elements => {\n        each$e(elements, element => {\n          if (isSpan(element)) {\n            unwrap(element);\n          } else {\n            removeDirectAnnotation(element);\n          }\n        });\n      };\n      return {\n        register: (name, settings) => {\n          registry.register(name, settings);\n        },\n        annotate: (name, data) => {\n          registry.lookup(name).each(settings => {\n            annotateWithBookmark(editor, name, settings, data);\n          });\n        },\n        annotationChanged: (name, callback) => {\n          changes.addListener(name, callback);\n        },\n        remove: name => {\n          identify(editor, Optional.some(name)).each(({elements}) => {\n            const bookmark = editor.selection.getBookmark();\n            removeAnnotations(elements);\n            editor.selection.moveToBookmark(bookmark);\n          });\n        },\n        removeAll: name => {\n          const bookmark = editor.selection.getBookmark();\n          each$d(findAll(editor, name), (elements, _) => {\n            removeAnnotations(elements);\n          });\n          editor.selection.moveToBookmark(bookmark);\n        },\n        getAll: name => {\n          const directory = findAll(editor, name);\n          return map$2(directory, elems => map$3(elems, elem => elem.dom));\n        }\n      };\n    };\n\n    const BookmarkManager = selection => {\n      return {\n        getBookmark: curry(getBookmark$1, selection),\n        moveToBookmark: curry(moveToBookmark, selection)\n      };\n    };\n    BookmarkManager.isBookmarkNode = isBookmarkNode$1;\n\n    const isXYWithinRange = (clientX, clientY, range) => {\n      if (range.collapsed) {\n        return false;\n      } else {\n        return exists(range.getClientRects(), rect => containsXY(rect, clientX, clientY));\n      }\n    };\n\n    const firePreProcess = (editor, args) => editor.dispatch('PreProcess', args);\n    const firePostProcess = (editor, args) => editor.dispatch('PostProcess', args);\n    const fireRemove = editor => {\n      editor.dispatch('remove');\n    };\n    const fireDetach = editor => {\n      editor.dispatch('detach');\n    };\n    const fireSwitchMode = (editor, mode) => {\n      editor.dispatch('SwitchMode', { mode });\n    };\n    const fireObjectResizeStart = (editor, target, width, height, origin) => {\n      editor.dispatch('ObjectResizeStart', {\n        target,\n        width,\n        height,\n        origin\n      });\n    };\n    const fireObjectResized = (editor, target, width, height, origin) => {\n      editor.dispatch('ObjectResized', {\n        target,\n        width,\n        height,\n        origin\n      });\n    };\n    const firePreInit = editor => {\n      editor.dispatch('PreInit');\n    };\n    const firePostRender = editor => {\n      editor.dispatch('PostRender');\n    };\n    const fireInit = editor => {\n      editor.dispatch('Init');\n    };\n    const firePlaceholderToggle = (editor, state) => {\n      editor.dispatch('PlaceholderToggle', { state });\n    };\n    const fireError = (editor, errorType, error) => {\n      editor.dispatch(errorType, error);\n    };\n    const fireFormatApply = (editor, format, node, vars) => {\n      editor.dispatch('FormatApply', {\n        format,\n        node,\n        vars\n      });\n    };\n    const fireFormatRemove = (editor, format, node, vars) => {\n      editor.dispatch('FormatRemove', {\n        format,\n        node,\n        vars\n      });\n    };\n    const fireBeforeSetContent = (editor, args) => editor.dispatch('BeforeSetContent', args);\n    const fireSetContent = (editor, args) => editor.dispatch('SetContent', args);\n    const fireBeforeGetContent = (editor, args) => editor.dispatch('BeforeGetContent', args);\n    const fireGetContent = (editor, args) => editor.dispatch('GetContent', args);\n    const fireAutocompleterStart = (editor, args) => {\n      editor.dispatch('AutocompleterStart', args);\n    };\n    const fireAutocompleterUpdate = (editor, args) => {\n      editor.dispatch('AutocompleterUpdate', args);\n    };\n    const fireAutocompleterUpdateActiveRange = (editor, args) => {\n      editor.dispatch('AutocompleterUpdateActiveRange', args);\n    };\n    const fireAutocompleterEnd = editor => {\n      editor.dispatch('AutocompleterEnd');\n    };\n    const firePastePreProcess = (editor, html, internal) => editor.dispatch('PastePreProcess', {\n      content: html,\n      internal\n    });\n    const firePastePostProcess = (editor, node, internal) => editor.dispatch('PastePostProcess', {\n      node,\n      internal\n    });\n    const firePastePlainTextToggle = (editor, state) => editor.dispatch('PastePlainTextToggle', { state });\n    const fireEditableRootStateChange = (editor, state) => editor.dispatch('EditableRootStateChange', { state });\n\n    const VK = {\n      BACKSPACE: 8,\n      DELETE: 46,\n      DOWN: 40,\n      ENTER: 13,\n      ESC: 27,\n      LEFT: 37,\n      RIGHT: 39,\n      SPACEBAR: 32,\n      TAB: 9,\n      UP: 38,\n      PAGE_UP: 33,\n      PAGE_DOWN: 34,\n      END: 35,\n      HOME: 36,\n      modifierPressed: e => {\n        return e.shiftKey || e.ctrlKey || e.altKey || VK.metaKeyPressed(e);\n      },\n      metaKeyPressed: e => {\n        return Env.os.isMacOS() || Env.os.isiOS() ? e.metaKey : e.ctrlKey && !e.altKey;\n      }\n    };\n\n    const elementSelectionAttr = 'data-mce-selected';\n    const controlElmSelector = 'table,img,figure.image,hr,video,span.mce-preview-object,details';\n    const abs = Math.abs;\n    const round$1 = Math.round;\n    const resizeHandles = {\n      nw: [\n        0,\n        0,\n        -1,\n        -1\n      ],\n      ne: [\n        1,\n        0,\n        1,\n        -1\n      ],\n      se: [\n        1,\n        1,\n        1,\n        1\n      ],\n      sw: [\n        0,\n        1,\n        -1,\n        1\n      ]\n    };\n    const isTouchEvent = evt => evt.type === 'longpress' || evt.type.indexOf('touch') === 0;\n    const ControlSelection = (selection, editor) => {\n      const dom = editor.dom;\n      const editableDoc = editor.getDoc();\n      const rootDocument = document;\n      const rootElement = editor.getBody();\n      let selectedElm, selectedElmGhost, resizeHelper, selectedHandle, resizeBackdrop;\n      let startX, startY, selectedElmX, selectedElmY, startW, startH, ratio, resizeStarted;\n      let width;\n      let height;\n      let startScrollWidth;\n      let startScrollHeight;\n      const isImage = elm => isNonNullable(elm) && (isImg(elm) || dom.is(elm, 'figure.image'));\n      const isMedia = elm => isMedia$2(elm) || dom.hasClass(elm, 'mce-preview-object');\n      const isEventOnImageOutsideRange = (evt, range) => {\n        if (isTouchEvent(evt)) {\n          const touch = evt.touches[0];\n          return isImage(evt.target) && !isXYWithinRange(touch.clientX, touch.clientY, range);\n        } else {\n          return isImage(evt.target) && !isXYWithinRange(evt.clientX, evt.clientY, range);\n        }\n      };\n      const contextMenuSelectImage = evt => {\n        const target = evt.target;\n        if (isEventOnImageOutsideRange(evt, editor.selection.getRng()) && !evt.isDefaultPrevented()) {\n          editor.selection.select(target);\n        }\n      };\n      const getResizeTargets = elm => {\n        if (dom.hasClass(elm, 'mce-preview-object') && isNonNullable(elm.firstElementChild)) {\n          return [\n            elm,\n            elm.firstElementChild\n          ];\n        } else if (dom.is(elm, 'figure.image')) {\n          return [elm.querySelector('img')];\n        } else {\n          return [elm];\n        }\n      };\n      const isResizable = elm => {\n        const selector = getObjectResizing(editor);\n        if (!selector) {\n          return false;\n        }\n        if (elm.getAttribute('data-mce-resize') === 'false') {\n          return false;\n        }\n        if (elm === editor.getBody()) {\n          return false;\n        }\n        if (dom.hasClass(elm, 'mce-preview-object') && isNonNullable(elm.firstElementChild)) {\n          return is$1(SugarElement.fromDom(elm.firstElementChild), selector);\n        } else {\n          return is$1(SugarElement.fromDom(elm), selector);\n        }\n      };\n      const createGhostElement = (dom, elm) => {\n        if (isMedia(elm)) {\n          return dom.create('img', { src: Env.transparentSrc });\n        } else if (isTable$2(elm)) {\n          const tableElm = elm.cloneNode(true);\n          last$2(dom.select('tr', tableElm)).each(tr => {\n            const cells = dom.select('td,th', tr);\n            dom.setStyle(tr, 'height', null);\n            each$e(cells, cell => dom.setStyle(cell, 'height', null));\n          });\n          return tableElm;\n        } else {\n          return elm.cloneNode(true);\n        }\n      };\n      const setSizeProp = (element, name, value) => {\n        if (isNonNullable(value)) {\n          const targets = getResizeTargets(element);\n          each$e(targets, target => {\n            if (target.style[name] || !editor.schema.isValid(target.nodeName.toLowerCase(), name)) {\n              dom.setStyle(target, name, value);\n            } else {\n              dom.setAttrib(target, name, '' + value);\n            }\n          });\n        }\n      };\n      const setGhostElmSize = (ghostElm, width, height) => {\n        setSizeProp(ghostElm, 'width', width);\n        setSizeProp(ghostElm, 'height', height);\n      };\n      const resizeGhostElement = e => {\n        let deltaX, deltaY, proportional;\n        let resizeHelperX, resizeHelperY;\n        deltaX = e.screenX - startX;\n        deltaY = e.screenY - startY;\n        width = deltaX * selectedHandle[2] + startW;\n        height = deltaY * selectedHandle[3] + startH;\n        width = width < 5 ? 5 : width;\n        height = height < 5 ? 5 : height;\n        if ((isImage(selectedElm) || isMedia(selectedElm)) && getResizeImgProportional(editor) !== false) {\n          proportional = !VK.modifierPressed(e);\n        } else {\n          proportional = VK.modifierPressed(e);\n        }\n        if (proportional) {\n          if (abs(deltaX) > abs(deltaY)) {\n            height = round$1(width * ratio);\n            width = round$1(height / ratio);\n          } else {\n            width = round$1(height / ratio);\n            height = round$1(width * ratio);\n          }\n        }\n        setGhostElmSize(selectedElmGhost, width, height);\n        resizeHelperX = selectedHandle.startPos.x + deltaX;\n        resizeHelperY = selectedHandle.startPos.y + deltaY;\n        resizeHelperX = resizeHelperX > 0 ? resizeHelperX : 0;\n        resizeHelperY = resizeHelperY > 0 ? resizeHelperY : 0;\n        dom.setStyles(resizeHelper, {\n          left: resizeHelperX,\n          top: resizeHelperY,\n          display: 'block'\n        });\n        resizeHelper.innerHTML = width + ' &times; ' + height;\n        if (selectedHandle[2] < 0 && selectedElmGhost.clientWidth <= width) {\n          dom.setStyle(selectedElmGhost, 'left', selectedElmX + (startW - width));\n        }\n        if (selectedHandle[3] < 0 && selectedElmGhost.clientHeight <= height) {\n          dom.setStyle(selectedElmGhost, 'top', selectedElmY + (startH - height));\n        }\n        deltaX = rootElement.scrollWidth - startScrollWidth;\n        deltaY = rootElement.scrollHeight - startScrollHeight;\n        if (deltaX + deltaY !== 0) {\n          dom.setStyles(resizeHelper, {\n            left: resizeHelperX - deltaX,\n            top: resizeHelperY - deltaY\n          });\n        }\n        if (!resizeStarted) {\n          fireObjectResizeStart(editor, selectedElm, startW, startH, 'corner-' + selectedHandle.name);\n          resizeStarted = true;\n        }\n      };\n      const endGhostResize = () => {\n        const wasResizeStarted = resizeStarted;\n        resizeStarted = false;\n        if (wasResizeStarted) {\n          setSizeProp(selectedElm, 'width', width);\n          setSizeProp(selectedElm, 'height', height);\n        }\n        dom.unbind(editableDoc, 'mousemove', resizeGhostElement);\n        dom.unbind(editableDoc, 'mouseup', endGhostResize);\n        if (rootDocument !== editableDoc) {\n          dom.unbind(rootDocument, 'mousemove', resizeGhostElement);\n          dom.unbind(rootDocument, 'mouseup', endGhostResize);\n        }\n        dom.remove(selectedElmGhost);\n        dom.remove(resizeHelper);\n        dom.remove(resizeBackdrop);\n        showResizeRect(selectedElm);\n        if (wasResizeStarted) {\n          fireObjectResized(editor, selectedElm, width, height, 'corner-' + selectedHandle.name);\n          dom.setAttrib(selectedElm, 'style', dom.getAttrib(selectedElm, 'style'));\n        }\n        editor.nodeChanged();\n      };\n      const showResizeRect = targetElm => {\n        unbindResizeHandleEvents();\n        const position = dom.getPos(targetElm, rootElement);\n        const selectedElmX = position.x;\n        const selectedElmY = position.y;\n        const rect = targetElm.getBoundingClientRect();\n        const targetWidth = rect.width || rect.right - rect.left;\n        const targetHeight = rect.height || rect.bottom - rect.top;\n        if (selectedElm !== targetElm) {\n          hideResizeRect();\n          selectedElm = targetElm;\n          width = height = 0;\n        }\n        const e = editor.dispatch('ObjectSelected', { target: targetElm });\n        if (isResizable(targetElm) && !e.isDefaultPrevented()) {\n          each$d(resizeHandles, (handle, name) => {\n            const startDrag = e => {\n              const target = getResizeTargets(selectedElm)[0];\n              startX = e.screenX;\n              startY = e.screenY;\n              startW = target.clientWidth;\n              startH = target.clientHeight;\n              ratio = startH / startW;\n              selectedHandle = handle;\n              selectedHandle.name = name;\n              selectedHandle.startPos = {\n                x: targetWidth * handle[0] + selectedElmX,\n                y: targetHeight * handle[1] + selectedElmY\n              };\n              startScrollWidth = rootElement.scrollWidth;\n              startScrollHeight = rootElement.scrollHeight;\n              resizeBackdrop = dom.add(rootElement, 'div', {\n                'class': 'mce-resize-backdrop',\n                'data-mce-bogus': 'all'\n              });\n              dom.setStyles(resizeBackdrop, {\n                position: 'fixed',\n                left: '0',\n                top: '0',\n                width: '100%',\n                height: '100%'\n              });\n              selectedElmGhost = createGhostElement(dom, selectedElm);\n              dom.addClass(selectedElmGhost, 'mce-clonedresizable');\n              dom.setAttrib(selectedElmGhost, 'data-mce-bogus', 'all');\n              selectedElmGhost.contentEditable = 'false';\n              dom.setStyles(selectedElmGhost, {\n                left: selectedElmX,\n                top: selectedElmY,\n                margin: 0\n              });\n              setGhostElmSize(selectedElmGhost, targetWidth, targetHeight);\n              selectedElmGhost.removeAttribute(elementSelectionAttr);\n              rootElement.appendChild(selectedElmGhost);\n              dom.bind(editableDoc, 'mousemove', resizeGhostElement);\n              dom.bind(editableDoc, 'mouseup', endGhostResize);\n              if (rootDocument !== editableDoc) {\n                dom.bind(rootDocument, 'mousemove', resizeGhostElement);\n                dom.bind(rootDocument, 'mouseup', endGhostResize);\n              }\n              resizeHelper = dom.add(rootElement, 'div', {\n                'class': 'mce-resize-helper',\n                'data-mce-bogus': 'all'\n              }, startW + ' &times; ' + startH);\n            };\n            let handleElm = dom.get('mceResizeHandle' + name);\n            if (handleElm) {\n              dom.remove(handleElm);\n            }\n            handleElm = dom.add(rootElement, 'div', {\n              'id': 'mceResizeHandle' + name,\n              'data-mce-bogus': 'all',\n              'class': 'mce-resizehandle',\n              'unselectable': true,\n              'style': 'cursor:' + name + '-resize; margin:0; padding:0'\n            });\n            dom.bind(handleElm, 'mousedown', e => {\n              e.stopImmediatePropagation();\n              e.preventDefault();\n              startDrag(e);\n            });\n            handle.elm = handleElm;\n            dom.setStyles(handleElm, {\n              left: targetWidth * handle[0] + selectedElmX - handleElm.offsetWidth / 2,\n              top: targetHeight * handle[1] + selectedElmY - handleElm.offsetHeight / 2\n            });\n          });\n        } else {\n          hideResizeRect(false);\n        }\n      };\n      const throttledShowResizeRect = first$1(showResizeRect, 0);\n      const hideResizeRect = (removeSelected = true) => {\n        throttledShowResizeRect.cancel();\n        unbindResizeHandleEvents();\n        if (selectedElm && removeSelected) {\n          selectedElm.removeAttribute(elementSelectionAttr);\n        }\n        each$d(resizeHandles, (value, name) => {\n          const handleElm = dom.get('mceResizeHandle' + name);\n          if (handleElm) {\n            dom.unbind(handleElm);\n            dom.remove(handleElm);\n          }\n        });\n      };\n      const isChildOrEqual = (node, parent) => dom.isChildOf(node, parent);\n      const updateResizeRect = e => {\n        if (resizeStarted || editor.removed || editor.composing) {\n          return;\n        }\n        const targetElm = e.type === 'mousedown' ? e.target : selection.getNode();\n        const controlElm = closest$3(SugarElement.fromDom(targetElm), controlElmSelector).map(e => e.dom).filter(e => dom.isEditable(e.parentElement) || e.nodeName === 'IMG' && dom.isEditable(e)).getOrUndefined();\n        const selectedValue = isNonNullable(controlElm) ? dom.getAttrib(controlElm, elementSelectionAttr, '1') : '1';\n        each$e(dom.select(`img[${ elementSelectionAttr }],hr[${ elementSelectionAttr }]`), img => {\n          img.removeAttribute(elementSelectionAttr);\n        });\n        if (isNonNullable(controlElm) && isChildOrEqual(controlElm, rootElement) && editor.hasFocus()) {\n          disableGeckoResize();\n          const startElm = selection.getStart(true);\n          if (isChildOrEqual(startElm, controlElm) && isChildOrEqual(selection.getEnd(true), controlElm)) {\n            dom.setAttrib(controlElm, elementSelectionAttr, selectedValue);\n            throttledShowResizeRect.throttle(controlElm);\n            return;\n          }\n        }\n        hideResizeRect();\n      };\n      const unbindResizeHandleEvents = () => {\n        each$d(resizeHandles, handle => {\n          if (handle.elm) {\n            dom.unbind(handle.elm);\n            delete handle.elm;\n          }\n        });\n      };\n      const disableGeckoResize = () => {\n        try {\n          editor.getDoc().execCommand('enableObjectResizing', false, 'false');\n        } catch (ex) {\n        }\n      };\n      editor.on('init', () => {\n        disableGeckoResize();\n        editor.on('NodeChange ResizeEditor ResizeWindow ResizeContent drop', updateResizeRect);\n        editor.on('keyup compositionend', e => {\n          if (selectedElm && selectedElm.nodeName === 'TABLE') {\n            updateResizeRect(e);\n          }\n        });\n        editor.on('hide blur', hideResizeRect);\n        editor.on('contextmenu longpress', contextMenuSelectImage, true);\n      });\n      editor.on('remove', unbindResizeHandleEvents);\n      const destroy = () => {\n        throttledShowResizeRect.cancel();\n        selectedElm = selectedElmGhost = resizeBackdrop = null;\n      };\n      return {\n        isResizable,\n        showResizeRect,\n        hideResizeRect,\n        updateResizeRect,\n        destroy\n      };\n    };\n\n    const setStart = (rng, situ) => {\n      situ.fold(e => {\n        rng.setStartBefore(e.dom);\n      }, (e, o) => {\n        rng.setStart(e.dom, o);\n      }, e => {\n        rng.setStartAfter(e.dom);\n      });\n    };\n    const setFinish = (rng, situ) => {\n      situ.fold(e => {\n        rng.setEndBefore(e.dom);\n      }, (e, o) => {\n        rng.setEnd(e.dom, o);\n      }, e => {\n        rng.setEndAfter(e.dom);\n      });\n    };\n    const relativeToNative = (win, startSitu, finishSitu) => {\n      const range = win.document.createRange();\n      setStart(range, startSitu);\n      setFinish(range, finishSitu);\n      return range;\n    };\n    const exactToNative = (win, start, soffset, finish, foffset) => {\n      const rng = win.document.createRange();\n      rng.setStart(start.dom, soffset);\n      rng.setEnd(finish.dom, foffset);\n      return rng;\n    };\n\n    const adt$3 = Adt.generate([\n      {\n        ltr: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      },\n      {\n        rtl: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      }\n    ]);\n    const fromRange = (win, type, range) => type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset);\n    const getRanges = (win, selection) => selection.match({\n      domRange: rng => {\n        return {\n          ltr: constant(rng),\n          rtl: Optional.none\n        };\n      },\n      relative: (startSitu, finishSitu) => {\n        return {\n          ltr: cached(() => relativeToNative(win, startSitu, finishSitu)),\n          rtl: cached(() => Optional.some(relativeToNative(win, finishSitu, startSitu)))\n        };\n      },\n      exact: (start, soffset, finish, foffset) => {\n        return {\n          ltr: cached(() => exactToNative(win, start, soffset, finish, foffset)),\n          rtl: cached(() => Optional.some(exactToNative(win, finish, foffset, start, soffset)))\n        };\n      }\n    });\n    const doDiagnose = (win, ranges) => {\n      const rng = ranges.ltr();\n      if (rng.collapsed) {\n        const reversed = ranges.rtl().filter(rev => rev.collapsed === false);\n        return reversed.map(rev => adt$3.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset)).getOrThunk(() => fromRange(win, adt$3.ltr, rng));\n      } else {\n        return fromRange(win, adt$3.ltr, rng);\n      }\n    };\n    const diagnose = (win, selection) => {\n      const ranges = getRanges(win, selection);\n      return doDiagnose(win, ranges);\n    };\n    adt$3.ltr;\n    adt$3.rtl;\n\n    const create$9 = (start, soffset, finish, foffset) => ({\n      start,\n      soffset,\n      finish,\n      foffset\n    });\n    const SimRange = { create: create$9 };\n\n    const caretPositionFromPoint = (doc, x, y) => {\n      var _a, _b;\n      return Optional.from((_b = (_a = doc.dom).caretPositionFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y)).bind(pos => {\n        if (pos.offsetNode === null) {\n          return Optional.none();\n        }\n        const r = doc.dom.createRange();\n        r.setStart(pos.offsetNode, pos.offset);\n        r.collapse();\n        return Optional.some(r);\n      });\n    };\n    const caretRangeFromPoint = (doc, x, y) => {\n      var _a, _b;\n      return Optional.from((_b = (_a = doc.dom).caretRangeFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y));\n    };\n    const availableSearch = (() => {\n      if (document.caretPositionFromPoint) {\n        return caretPositionFromPoint;\n      } else if (document.caretRangeFromPoint) {\n        return caretRangeFromPoint;\n      } else {\n        return Optional.none;\n      }\n    })();\n    const fromPoint$1 = (win, x, y) => {\n      const doc = SugarElement.fromDom(win.document);\n      return availableSearch(doc, x, y).map(rng => SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset));\n    };\n\n    const adt$2 = Adt.generate([\n      { before: ['element'] },\n      {\n        on: [\n          'element',\n          'offset'\n        ]\n      },\n      { after: ['element'] }\n    ]);\n    const cata = (subject, onBefore, onOn, onAfter) => subject.fold(onBefore, onOn, onAfter);\n    const getStart$2 = situ => situ.fold(identity, identity, identity);\n    const before$1 = adt$2.before;\n    const on = adt$2.on;\n    const after$1 = adt$2.after;\n    const Situ = {\n      before: before$1,\n      on,\n      after: after$1,\n      cata,\n      getStart: getStart$2\n    };\n\n    const adt$1 = Adt.generate([\n      { domRange: ['rng'] },\n      {\n        relative: [\n          'startSitu',\n          'finishSitu'\n        ]\n      },\n      {\n        exact: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      }\n    ]);\n    const exactFromRange = simRange => adt$1.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset);\n    const getStart$1 = selection => selection.match({\n      domRange: rng => SugarElement.fromDom(rng.startContainer),\n      relative: (startSitu, _finishSitu) => Situ.getStart(startSitu),\n      exact: (start, _soffset, _finish, _foffset) => start\n    });\n    const domRange = adt$1.domRange;\n    const relative = adt$1.relative;\n    const exact = adt$1.exact;\n    const getWin = selection => {\n      const start = getStart$1(selection);\n      return defaultView(start);\n    };\n    const range = SimRange.create;\n    const SimSelection = {\n      domRange,\n      relative,\n      exact,\n      exactFromRange,\n      getWin,\n      range\n    };\n\n    const beforeSpecial = (element, offset) => {\n      const name$1 = name(element);\n      if ('input' === name$1) {\n        return Situ.after(element);\n      } else if (!contains$2([\n          'br',\n          'img'\n        ], name$1)) {\n        return Situ.on(element, offset);\n      } else {\n        return offset === 0 ? Situ.before(element) : Situ.after(element);\n      }\n    };\n    const preprocessRelative = (startSitu, finishSitu) => {\n      const start = startSitu.fold(Situ.before, beforeSpecial, Situ.after);\n      const finish = finishSitu.fold(Situ.before, beforeSpecial, Situ.after);\n      return SimSelection.relative(start, finish);\n    };\n    const preprocessExact = (start, soffset, finish, foffset) => {\n      const startSitu = beforeSpecial(start, soffset);\n      const finishSitu = beforeSpecial(finish, foffset);\n      return SimSelection.relative(startSitu, finishSitu);\n    };\n    const preprocess = selection => selection.match({\n      domRange: rng => {\n        const start = SugarElement.fromDom(rng.startContainer);\n        const finish = SugarElement.fromDom(rng.endContainer);\n        return preprocessExact(start, rng.startOffset, finish, rng.endOffset);\n      },\n      relative: preprocessRelative,\n      exact: preprocessExact\n    });\n\n    const fromElements = (elements, scope) => {\n      const doc = scope || document;\n      const fragment = doc.createDocumentFragment();\n      each$e(elements, element => {\n        fragment.appendChild(element.dom);\n      });\n      return SugarElement.fromDom(fragment);\n    };\n\n    const toNative = selection => {\n      const win = SimSelection.getWin(selection).dom;\n      const getDomRange = (start, soffset, finish, foffset) => exactToNative(win, start, soffset, finish, foffset);\n      const filtered = preprocess(selection);\n      return diagnose(win, filtered).match({\n        ltr: getDomRange,\n        rtl: getDomRange\n      });\n    };\n    const getAtPoint = (win, x, y) => fromPoint$1(win, x, y);\n\n    const fromPoint = (clientX, clientY, doc) => {\n      const win = defaultView(SugarElement.fromDom(doc));\n      return getAtPoint(win.dom, clientX, clientY).map(simRange => {\n        const rng = doc.createRange();\n        rng.setStart(simRange.start.dom, simRange.soffset);\n        rng.setEnd(simRange.finish.dom, simRange.foffset);\n        return rng;\n      }).getOrUndefined();\n    };\n\n    const isEq$4 = (rng1, rng2) => {\n      return isNonNullable(rng1) && isNonNullable(rng2) && (rng1.startContainer === rng2.startContainer && rng1.startOffset === rng2.startOffset) && (rng1.endContainer === rng2.endContainer && rng1.endOffset === rng2.endOffset);\n    };\n\n    const findParent = (node, rootNode, predicate) => {\n      let currentNode = node;\n      while (currentNode && currentNode !== rootNode) {\n        if (predicate(currentNode)) {\n          return currentNode;\n        }\n        currentNode = currentNode.parentNode;\n      }\n      return null;\n    };\n    const hasParent$1 = (node, rootNode, predicate) => findParent(node, rootNode, predicate) !== null;\n    const hasParentWithName = (node, rootNode, name) => hasParent$1(node, rootNode, node => node.nodeName === name);\n    const isCeFalseCaretContainer = (node, rootNode) => isCaretContainer$2(node) && !hasParent$1(node, rootNode, isCaretNode);\n    const hasBrBeforeAfter = (dom, node, left) => {\n      const parentNode = node.parentNode;\n      if (parentNode) {\n        const walker = new DomTreeWalker(node, dom.getParent(parentNode, dom.isBlock) || dom.getRoot());\n        let currentNode;\n        while (currentNode = walker[left ? 'prev' : 'next']()) {\n          if (isBr$6(currentNode)) {\n            return true;\n          }\n        }\n      }\n      return false;\n    };\n    const isPrevNode = (node, name) => {\n      var _a;\n      return ((_a = node.previousSibling) === null || _a === void 0 ? void 0 : _a.nodeName) === name;\n    };\n    const hasContentEditableFalseParent = (root, node) => {\n      let currentNode = node;\n      while (currentNode && currentNode !== root) {\n        if (isContentEditableFalse$b(currentNode)) {\n          return true;\n        }\n        currentNode = currentNode.parentNode;\n      }\n      return false;\n    };\n    const findTextNodeRelative = (dom, isAfterNode, collapsed, left, startNode) => {\n      const body = dom.getRoot();\n      const nonEmptyElementsMap = dom.schema.getNonEmptyElements();\n      const parentNode = startNode.parentNode;\n      let lastInlineElement;\n      let node;\n      if (!parentNode) {\n        return Optional.none();\n      }\n      const parentBlockContainer = dom.getParent(parentNode, dom.isBlock) || body;\n      if (left && isBr$6(startNode) && isAfterNode && dom.isEmpty(parentBlockContainer)) {\n        return Optional.some(CaretPosition(parentNode, dom.nodeIndex(startNode)));\n      }\n      const walker = new DomTreeWalker(startNode, parentBlockContainer);\n      while (node = walker[left ? 'prev' : 'next']()) {\n        if (dom.getContentEditableParent(node) === 'false' || isCeFalseCaretContainer(node, body)) {\n          return Optional.none();\n        }\n        if (isText$b(node) && node.data.length > 0) {\n          if (!hasParentWithName(node, body, 'A')) {\n            return Optional.some(CaretPosition(node, left ? node.data.length : 0));\n          }\n          return Optional.none();\n        }\n        if (dom.isBlock(node) || nonEmptyElementsMap[node.nodeName.toLowerCase()]) {\n          return Optional.none();\n        }\n        lastInlineElement = node;\n      }\n      if (isComment(lastInlineElement)) {\n        return Optional.none();\n      }\n      if (collapsed && lastInlineElement) {\n        return Optional.some(CaretPosition(lastInlineElement, 0));\n      }\n      return Optional.none();\n    };\n    const normalizeEndPoint = (dom, collapsed, start, rng) => {\n      const body = dom.getRoot();\n      let node;\n      let normalized = false;\n      let container = start ? rng.startContainer : rng.endContainer;\n      let offset = start ? rng.startOffset : rng.endOffset;\n      const isAfterNode = isElement$6(container) && offset === container.childNodes.length;\n      const nonEmptyElementsMap = dom.schema.getNonEmptyElements();\n      let directionLeft = start;\n      if (isCaretContainer$2(container)) {\n        return Optional.none();\n      }\n      if (isElement$6(container) && offset > container.childNodes.length - 1) {\n        directionLeft = false;\n      }\n      if (isDocument$1(container)) {\n        container = body;\n        offset = 0;\n      }\n      if (container === body) {\n        if (directionLeft) {\n          node = container.childNodes[offset > 0 ? offset - 1 : 0];\n          if (node) {\n            if (isCaretContainer$2(node)) {\n              return Optional.none();\n            }\n            if (nonEmptyElementsMap[node.nodeName] || isTable$2(node)) {\n              return Optional.none();\n            }\n          }\n        }\n        if (container.hasChildNodes()) {\n          offset = Math.min(!directionLeft && offset > 0 ? offset - 1 : offset, container.childNodes.length - 1);\n          container = container.childNodes[offset];\n          offset = isText$b(container) && isAfterNode ? container.data.length : 0;\n          if (!collapsed && container === body.lastChild && isTable$2(container)) {\n            return Optional.none();\n          }\n          if (hasContentEditableFalseParent(body, container) || isCaretContainer$2(container)) {\n            return Optional.none();\n          }\n          if (isDetails(container)) {\n            return Optional.none();\n          }\n          if (container.hasChildNodes() && !isTable$2(container)) {\n            node = container;\n            const walker = new DomTreeWalker(container, body);\n            do {\n              if (isContentEditableFalse$b(node) || isCaretContainer$2(node)) {\n                normalized = false;\n                break;\n              }\n              if (isText$b(node) && node.data.length > 0) {\n                offset = directionLeft ? 0 : node.data.length;\n                container = node;\n                normalized = true;\n                break;\n              }\n              if (nonEmptyElementsMap[node.nodeName.toLowerCase()] && !isTableCellOrCaption(node)) {\n                offset = dom.nodeIndex(node);\n                container = node.parentNode;\n                if (!directionLeft) {\n                  offset++;\n                }\n                normalized = true;\n                break;\n              }\n            } while (node = directionLeft ? walker.next() : walker.prev());\n          }\n        }\n      }\n      if (collapsed) {\n        if (isText$b(container) && offset === 0) {\n          findTextNodeRelative(dom, isAfterNode, collapsed, true, container).each(pos => {\n            container = pos.container();\n            offset = pos.offset();\n            normalized = true;\n          });\n        }\n        if (isElement$6(container)) {\n          node = container.childNodes[offset];\n          if (!node) {\n            node = container.childNodes[offset - 1];\n          }\n          if (node && isBr$6(node) && !isPrevNode(node, 'A') && !hasBrBeforeAfter(dom, node, false) && !hasBrBeforeAfter(dom, node, true)) {\n            findTextNodeRelative(dom, isAfterNode, collapsed, true, node).each(pos => {\n              container = pos.container();\n              offset = pos.offset();\n              normalized = true;\n            });\n          }\n        }\n      }\n      if (directionLeft && !collapsed && isText$b(container) && offset === container.data.length) {\n        findTextNodeRelative(dom, isAfterNode, collapsed, false, container).each(pos => {\n          container = pos.container();\n          offset = pos.offset();\n          normalized = true;\n        });\n      }\n      return normalized && container ? Optional.some(CaretPosition(container, offset)) : Optional.none();\n    };\n    const normalize$2 = (dom, rng) => {\n      const collapsed = rng.collapsed, normRng = rng.cloneRange();\n      const startPos = CaretPosition.fromRangeStart(rng);\n      normalizeEndPoint(dom, collapsed, true, normRng).each(pos => {\n        if (!collapsed || !CaretPosition.isAbove(startPos, pos)) {\n          normRng.setStart(pos.container(), pos.offset());\n        }\n      });\n      if (!collapsed) {\n        normalizeEndPoint(dom, collapsed, false, normRng).each(pos => {\n          normRng.setEnd(pos.container(), pos.offset());\n        });\n      }\n      if (collapsed) {\n        normRng.collapse(true);\n      }\n      return isEq$4(rng, normRng) ? Optional.none() : Optional.some(normRng);\n    };\n\n    const splitText = (node, offset) => {\n      return node.splitText(offset);\n    };\n    const split = rng => {\n      let startContainer = rng.startContainer, startOffset = rng.startOffset, endContainer = rng.endContainer, endOffset = rng.endOffset;\n      if (startContainer === endContainer && isText$b(startContainer)) {\n        if (startOffset > 0 && startOffset < startContainer.data.length) {\n          endContainer = splitText(startContainer, startOffset);\n          startContainer = endContainer.previousSibling;\n          if (endOffset > startOffset) {\n            endOffset = endOffset - startOffset;\n            const newContainer = splitText(endContainer, endOffset).previousSibling;\n            startContainer = endContainer = newContainer;\n            endOffset = newContainer.data.length;\n            startOffset = 0;\n          } else {\n            endOffset = 0;\n          }\n        }\n      } else {\n        if (isText$b(startContainer) && startOffset > 0 && startOffset < startContainer.data.length) {\n          startContainer = splitText(startContainer, startOffset);\n          startOffset = 0;\n        }\n        if (isText$b(endContainer) && endOffset > 0 && endOffset < endContainer.data.length) {\n          const newContainer = splitText(endContainer, endOffset).previousSibling;\n          endContainer = newContainer;\n          endOffset = newContainer.data.length;\n        }\n      }\n      return {\n        startContainer,\n        startOffset,\n        endContainer,\n        endOffset\n      };\n    };\n\n    const RangeUtils = dom => {\n      const walk = (rng, callback) => {\n        return walk$3(dom, rng, callback);\n      };\n      const split$1 = split;\n      const normalize = rng => {\n        return normalize$2(dom, rng).fold(never, normalizedRng => {\n          rng.setStart(normalizedRng.startContainer, normalizedRng.startOffset);\n          rng.setEnd(normalizedRng.endContainer, normalizedRng.endOffset);\n          return true;\n        });\n      };\n      const expand = (rng, options = { type: 'word' }) => {\n        if (options.type === 'word') {\n          const rangeLike = expandRng(dom, rng, [{ inline: 'span' }]);\n          const newRange = dom.createRng();\n          newRange.setStart(rangeLike.startContainer, rangeLike.startOffset);\n          newRange.setEnd(rangeLike.endContainer, rangeLike.endOffset);\n          return newRange;\n        }\n        return rng;\n      };\n      return {\n        walk,\n        split: split$1,\n        expand,\n        normalize\n      };\n    };\n    RangeUtils.compareRanges = isEq$4;\n    RangeUtils.getCaretRangeFromPoint = fromPoint;\n    RangeUtils.getSelectedNode = getSelectedNode;\n    RangeUtils.getNode = getNode$1;\n\n    const Dimension = (name, getOffset) => {\n      const set = (element, h) => {\n        if (!isNumber(h) && !h.match(/^[0-9]+$/)) {\n          throw new Error(name + '.set accepts only positive integer values. Value was ' + h);\n        }\n        const dom = element.dom;\n        if (isSupported(dom)) {\n          dom.style[name] = h + 'px';\n        }\n      };\n      const get = element => {\n        const r = getOffset(element);\n        if (r <= 0 || r === null) {\n          const css = get$7(element, name);\n          return parseFloat(css) || 0;\n        }\n        return r;\n      };\n      const getOuter = get;\n      const aggregate = (element, properties) => foldl(properties, (acc, property) => {\n        const val = get$7(element, property);\n        const value = val === undefined ? 0 : parseInt(val, 10);\n        return isNaN(value) ? acc : acc + value;\n      }, 0);\n      const max = (element, value, properties) => {\n        const cumulativeInclusions = aggregate(element, properties);\n        const absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0;\n        return absoluteMax;\n      };\n      return {\n        set,\n        get,\n        getOuter,\n        aggregate,\n        max\n      };\n    };\n\n    const api = Dimension('height', element => {\n      const dom = element.dom;\n      return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;\n    });\n    const get$2 = element => api.get(element);\n\n    const getDocument = () => SugarElement.fromDom(document);\n\n    const walkUp = (navigation, doc) => {\n      const frame = navigation.view(doc);\n      return frame.fold(constant([]), f => {\n        const parent = navigation.owner(f);\n        const rest = walkUp(navigation, parent);\n        return [f].concat(rest);\n      });\n    };\n    const pathTo = (element, navigation) => {\n      const d = navigation.owner(element);\n      return walkUp(navigation, d);\n    };\n\n    const view = doc => {\n      var _a;\n      const element = doc.dom === document ? Optional.none() : Optional.from((_a = doc.dom.defaultView) === null || _a === void 0 ? void 0 : _a.frameElement);\n      return element.map(SugarElement.fromDom);\n    };\n    const owner = element => documentOrOwner(element);\n\n    var Navigation = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        view: view,\n        owner: owner\n    });\n\n    const find = element => {\n      const doc = getDocument();\n      const scroll = get$5(doc);\n      const frames = pathTo(element, Navigation);\n      const offset = viewport(element);\n      const r = foldr(frames, (b, a) => {\n        const loc = viewport(a);\n        return {\n          left: b.left + loc.left,\n          top: b.top + loc.top\n        };\n      }, {\n        left: 0,\n        top: 0\n      });\n      return SugarPosition(r.left + offset.left + scroll.left, r.top + offset.top + scroll.top);\n    };\n\n    const excludeFromDescend = element => name(element) === 'textarea';\n    const fireScrollIntoViewEvent = (editor, data) => {\n      const scrollEvent = editor.dispatch('ScrollIntoView', data);\n      return scrollEvent.isDefaultPrevented();\n    };\n    const fireAfterScrollIntoViewEvent = (editor, data) => {\n      editor.dispatch('AfterScrollIntoView', data);\n    };\n    const descend = (element, offset) => {\n      const children = children$1(element);\n      if (children.length === 0 || excludeFromDescend(element)) {\n        return {\n          element,\n          offset\n        };\n      } else if (offset < children.length && !excludeFromDescend(children[offset])) {\n        return {\n          element: children[offset],\n          offset: 0\n        };\n      } else {\n        const last = children[children.length - 1];\n        if (excludeFromDescend(last)) {\n          return {\n            element,\n            offset\n          };\n        } else {\n          if (name(last) === 'img') {\n            return {\n              element: last,\n              offset: 1\n            };\n          } else if (isText$c(last)) {\n            return {\n              element: last,\n              offset: get$3(last).length\n            };\n          } else {\n            return {\n              element: last,\n              offset: children$1(last).length\n            };\n          }\n        }\n      }\n    };\n    const markerInfo = (element, cleanupFun) => {\n      const pos = absolute(element);\n      const height = get$2(element);\n      return {\n        element,\n        bottom: pos.top + height,\n        height,\n        pos,\n        cleanup: cleanupFun\n      };\n    };\n    const createMarker$1 = (element, offset) => {\n      const startPoint = descend(element, offset);\n      const span = SugarElement.fromHtml('<span data-mce-bogus=\"all\" style=\"display: inline-block;\">' + ZWSP$1 + '</span>');\n      before$3(startPoint.element, span);\n      return markerInfo(span, () => remove$4(span));\n    };\n    const elementMarker = element => markerInfo(SugarElement.fromDom(element), noop);\n    const withMarker = (editor, f, rng, alignToTop) => {\n      preserveWith(editor, (_s, _e) => applyWithMarker(editor, f, rng, alignToTop), rng);\n    };\n    const withScrollEvents = (editor, doc, f, marker, alignToTop) => {\n      const data = {\n        elm: marker.element.dom,\n        alignToTop\n      };\n      if (fireScrollIntoViewEvent(editor, data)) {\n        return;\n      }\n      const scrollTop = get$5(doc).top;\n      f(editor, doc, scrollTop, marker, alignToTop);\n      fireAfterScrollIntoViewEvent(editor, data);\n    };\n    const applyWithMarker = (editor, f, rng, alignToTop) => {\n      const body = SugarElement.fromDom(editor.getBody());\n      const doc = SugarElement.fromDom(editor.getDoc());\n      reflow(body);\n      const marker = createMarker$1(SugarElement.fromDom(rng.startContainer), rng.startOffset);\n      withScrollEvents(editor, doc, f, marker, alignToTop);\n      marker.cleanup();\n    };\n    const withElement = (editor, element, f, alignToTop) => {\n      const doc = SugarElement.fromDom(editor.getDoc());\n      withScrollEvents(editor, doc, f, elementMarker(element), alignToTop);\n    };\n    const preserveWith = (editor, f, rng) => {\n      const startElement = rng.startContainer;\n      const startOffset = rng.startOffset;\n      const endElement = rng.endContainer;\n      const endOffset = rng.endOffset;\n      f(SugarElement.fromDom(startElement), SugarElement.fromDom(endElement));\n      const newRng = editor.dom.createRng();\n      newRng.setStart(startElement, startOffset);\n      newRng.setEnd(endElement, endOffset);\n      editor.selection.setRng(rng);\n    };\n    const scrollToMarker = (editor, marker, viewHeight, alignToTop, doc) => {\n      const pos = marker.pos;\n      if (alignToTop) {\n        to(pos.left, pos.top, doc);\n      } else {\n        const y = pos.top - viewHeight + marker.height;\n        to(-editor.getBody().getBoundingClientRect().left, y, doc);\n      }\n    };\n    const intoWindowIfNeeded = (editor, doc, scrollTop, viewHeight, marker, alignToTop) => {\n      const viewportBottom = viewHeight + scrollTop;\n      const markerTop = marker.pos.top;\n      const markerBottom = marker.bottom;\n      const largerThanViewport = markerBottom - markerTop >= viewHeight;\n      if (markerTop < scrollTop) {\n        scrollToMarker(editor, marker, viewHeight, alignToTop !== false, doc);\n      } else if (markerTop > viewportBottom) {\n        const align = largerThanViewport ? alignToTop !== false : alignToTop === true;\n        scrollToMarker(editor, marker, viewHeight, align, doc);\n      } else if (markerBottom > viewportBottom && !largerThanViewport) {\n        scrollToMarker(editor, marker, viewHeight, alignToTop === true, doc);\n      }\n    };\n    const intoWindow = (editor, doc, scrollTop, marker, alignToTop) => {\n      const viewHeight = defaultView(doc).dom.innerHeight;\n      intoWindowIfNeeded(editor, doc, scrollTop, viewHeight, marker, alignToTop);\n    };\n    const intoFrame = (editor, doc, scrollTop, marker, alignToTop) => {\n      const frameViewHeight = defaultView(doc).dom.innerHeight;\n      intoWindowIfNeeded(editor, doc, scrollTop, frameViewHeight, marker, alignToTop);\n      const op = find(marker.element);\n      const viewportBounds = getBounds(window);\n      if (op.top < viewportBounds.y) {\n        intoView(marker.element, alignToTop !== false);\n      } else if (op.top > viewportBounds.bottom) {\n        intoView(marker.element, alignToTop === true);\n      }\n    };\n    const rangeIntoWindow = (editor, rng, alignToTop) => withMarker(editor, intoWindow, rng, alignToTop);\n    const elementIntoWindow = (editor, element, alignToTop) => withElement(editor, element, intoWindow, alignToTop);\n    const rangeIntoFrame = (editor, rng, alignToTop) => withMarker(editor, intoFrame, rng, alignToTop);\n    const elementIntoFrame = (editor, element, alignToTop) => withElement(editor, element, intoFrame, alignToTop);\n    const scrollElementIntoView = (editor, element, alignToTop) => {\n      const scroller = editor.inline ? elementIntoWindow : elementIntoFrame;\n      scroller(editor, element, alignToTop);\n    };\n    const scrollRangeIntoView = (editor, rng, alignToTop) => {\n      const scroller = editor.inline ? rangeIntoWindow : rangeIntoFrame;\n      scroller(editor, rng, alignToTop);\n    };\n\n    const focus$1 = (element, preventScroll = false) => element.dom.focus({ preventScroll });\n    const hasFocus$1 = element => {\n      const root = getRootNode(element).dom;\n      return element.dom === root.activeElement;\n    };\n    const active$1 = (root = getDocument()) => Optional.from(root.dom.activeElement).map(SugarElement.fromDom);\n    const search = element => active$1(getRootNode(element)).filter(e => element.dom.contains(e.dom));\n\n    const clamp$1 = (offset, element) => {\n      const max = isText$c(element) ? get$3(element).length : children$1(element).length + 1;\n      if (offset > max) {\n        return max;\n      } else if (offset < 0) {\n        return 0;\n      }\n      return offset;\n    };\n    const normalizeRng = rng => SimSelection.range(rng.start, clamp$1(rng.soffset, rng.start), rng.finish, clamp$1(rng.foffset, rng.finish));\n    const isOrContains = (root, elm) => !isRestrictedNode(elm.dom) && (contains(root, elm) || eq(root, elm));\n    const isRngInRoot = root => rng => isOrContains(root, rng.start) && isOrContains(root, rng.finish);\n    const shouldStore = editor => editor.inline || Env.browser.isFirefox();\n    const nativeRangeToSelectionRange = r => SimSelection.range(SugarElement.fromDom(r.startContainer), r.startOffset, SugarElement.fromDom(r.endContainer), r.endOffset);\n    const readRange = win => {\n      const selection = win.getSelection();\n      const rng = !selection || selection.rangeCount === 0 ? Optional.none() : Optional.from(selection.getRangeAt(0));\n      return rng.map(nativeRangeToSelectionRange);\n    };\n    const getBookmark = root => {\n      const win = defaultView(root);\n      return readRange(win.dom).filter(isRngInRoot(root));\n    };\n    const validate = (root, bookmark) => Optional.from(bookmark).filter(isRngInRoot(root)).map(normalizeRng);\n    const bookmarkToNativeRng = bookmark => {\n      const rng = document.createRange();\n      try {\n        rng.setStart(bookmark.start.dom, bookmark.soffset);\n        rng.setEnd(bookmark.finish.dom, bookmark.foffset);\n        return Optional.some(rng);\n      } catch (_) {\n        return Optional.none();\n      }\n    };\n    const store = editor => {\n      const newBookmark = shouldStore(editor) ? getBookmark(SugarElement.fromDom(editor.getBody())) : Optional.none();\n      editor.bookmark = newBookmark.isSome() ? newBookmark : editor.bookmark;\n    };\n    const getRng = editor => {\n      const bookmark = editor.bookmark ? editor.bookmark : Optional.none();\n      return bookmark.bind(x => validate(SugarElement.fromDom(editor.getBody()), x)).bind(bookmarkToNativeRng);\n    };\n    const restore = editor => {\n      getRng(editor).each(rng => editor.selection.setRng(rng));\n    };\n\n    const isEditorUIElement$1 = elm => {\n      const className = elm.className.toString();\n      return className.indexOf('tox-') !== -1 || className.indexOf('mce-') !== -1;\n    };\n    const FocusManager = { isEditorUIElement: isEditorUIElement$1 };\n\n    const wrappedSetTimeout = (callback, time) => {\n      if (!isNumber(time)) {\n        time = 0;\n      }\n      return setTimeout(callback, time);\n    };\n    const wrappedSetInterval = (callback, time) => {\n      if (!isNumber(time)) {\n        time = 0;\n      }\n      return setInterval(callback, time);\n    };\n    const Delay = {\n      setEditorTimeout: (editor, callback, time) => {\n        return wrappedSetTimeout(() => {\n          if (!editor.removed) {\n            callback();\n          }\n        }, time);\n      },\n      setEditorInterval: (editor, callback, time) => {\n        const timer = wrappedSetInterval(() => {\n          if (!editor.removed) {\n            callback();\n          } else {\n            clearInterval(timer);\n          }\n        }, time);\n        return timer;\n      }\n    };\n\n    const isManualNodeChange = e => {\n      return e.type === 'nodechange' && e.selectionChange;\n    };\n    const registerPageMouseUp = (editor, throttledStore) => {\n      const mouseUpPage = () => {\n        throttledStore.throttle();\n      };\n      DOMUtils.DOM.bind(document, 'mouseup', mouseUpPage);\n      editor.on('remove', () => {\n        DOMUtils.DOM.unbind(document, 'mouseup', mouseUpPage);\n      });\n    };\n    const registerMouseUp = (editor, throttledStore) => {\n      editor.on('mouseup touchend', _e => {\n        throttledStore.throttle();\n      });\n    };\n    const registerEditorEvents = (editor, throttledStore) => {\n      registerMouseUp(editor, throttledStore);\n      editor.on('keyup NodeChange AfterSetSelectionRange', e => {\n        if (!isManualNodeChange(e)) {\n          store(editor);\n        }\n      });\n    };\n    const register$6 = editor => {\n      const throttledStore = first$1(() => {\n        store(editor);\n      }, 0);\n      editor.on('init', () => {\n        if (editor.inline) {\n          registerPageMouseUp(editor, throttledStore);\n        }\n        registerEditorEvents(editor, throttledStore);\n      });\n      editor.on('remove', () => {\n        throttledStore.cancel();\n      });\n    };\n\n    let documentFocusInHandler;\n    const DOM$9 = DOMUtils.DOM;\n    const isEditorUIElement = elm => {\n      return isElement$6(elm) && FocusManager.isEditorUIElement(elm);\n    };\n    const isEditorContentAreaElement = elm => {\n      const classList = elm.classList;\n      if (classList !== undefined) {\n        return classList.contains('tox-edit-area') || classList.contains('tox-edit-area__iframe') || classList.contains('mce-content-body');\n      } else {\n        return false;\n      }\n    };\n    const isUIElement = (editor, elm) => {\n      const customSelector = getCustomUiSelector(editor);\n      const parent = DOM$9.getParent(elm, elm => {\n        return isEditorUIElement(elm) || (customSelector ? editor.dom.is(elm, customSelector) : false);\n      });\n      return parent !== null;\n    };\n    const getActiveElement = editor => {\n      try {\n        const root = getRootNode(SugarElement.fromDom(editor.getElement()));\n        return active$1(root).fold(() => document.body, x => x.dom);\n      } catch (ex) {\n        return document.body;\n      }\n    };\n    const registerEvents$1 = (editorManager, e) => {\n      const editor = e.editor;\n      register$6(editor);\n      const toggleContentAreaOnFocus = (editor, fn) => {\n        if (shouldHighlightOnFocus(editor) && editor.inline !== true) {\n          const contentArea = SugarElement.fromDom(editor.getContainer());\n          fn(contentArea, 'tox-edit-focus');\n        }\n      };\n      editor.on('focusin', () => {\n        const focusedEditor = editorManager.focusedEditor;\n        if (isEditorContentAreaElement(getActiveElement(editor))) {\n          toggleContentAreaOnFocus(editor, add$2);\n        }\n        if (focusedEditor !== editor) {\n          if (focusedEditor) {\n            focusedEditor.dispatch('blur', { focusedEditor: editor });\n          }\n          editorManager.setActive(editor);\n          editorManager.focusedEditor = editor;\n          editor.dispatch('focus', { blurredEditor: focusedEditor });\n          editor.focus(true);\n        }\n      });\n      editor.on('focusout', () => {\n        Delay.setEditorTimeout(editor, () => {\n          const focusedEditor = editorManager.focusedEditor;\n          if (!isEditorContentAreaElement(getActiveElement(editor)) || focusedEditor !== editor) {\n            toggleContentAreaOnFocus(editor, remove$6);\n          }\n          if (!isUIElement(editor, getActiveElement(editor)) && focusedEditor === editor) {\n            editor.dispatch('blur', { focusedEditor: null });\n            editorManager.focusedEditor = null;\n          }\n        });\n      });\n      if (!documentFocusInHandler) {\n        documentFocusInHandler = e => {\n          const activeEditor = editorManager.activeEditor;\n          if (activeEditor) {\n            getOriginalEventTarget(e).each(target => {\n              const elem = target;\n              if (elem.ownerDocument === document) {\n                if (elem !== document.body && !isUIElement(activeEditor, elem) && editorManager.focusedEditor === activeEditor) {\n                  activeEditor.dispatch('blur', { focusedEditor: null });\n                  editorManager.focusedEditor = null;\n                }\n              }\n            });\n          }\n        };\n        DOM$9.bind(document, 'focusin', documentFocusInHandler);\n      }\n    };\n    const unregisterDocumentEvents = (editorManager, e) => {\n      if (editorManager.focusedEditor === e.editor) {\n        editorManager.focusedEditor = null;\n      }\n      if (!editorManager.activeEditor && documentFocusInHandler) {\n        DOM$9.unbind(document, 'focusin', documentFocusInHandler);\n        documentFocusInHandler = null;\n      }\n    };\n    const setup$w = editorManager => {\n      editorManager.on('AddEditor', curry(registerEvents$1, editorManager));\n      editorManager.on('RemoveEditor', curry(unregisterDocumentEvents, editorManager));\n    };\n\n    const getContentEditableHost = (editor, node) => editor.dom.getParent(node, node => editor.dom.getContentEditable(node) === 'true');\n    const getCollapsedNode = rng => rng.collapsed ? Optional.from(getNode$1(rng.startContainer, rng.startOffset)).map(SugarElement.fromDom) : Optional.none();\n    const getFocusInElement = (root, rng) => getCollapsedNode(rng).bind(node => {\n      if (isTableSection(node)) {\n        return Optional.some(node);\n      } else if (!contains(root, node)) {\n        return Optional.some(root);\n      } else {\n        return Optional.none();\n      }\n    });\n    const normalizeSelection = (editor, rng) => {\n      getFocusInElement(SugarElement.fromDom(editor.getBody()), rng).bind(elm => {\n        return firstPositionIn(elm.dom);\n      }).fold(() => {\n        editor.selection.normalize();\n      }, caretPos => editor.selection.setRng(caretPos.toRange()));\n    };\n    const focusBody = body => {\n      if (body.setActive) {\n        try {\n          body.setActive();\n        } catch (ex) {\n          body.focus();\n        }\n      } else {\n        body.focus();\n      }\n    };\n    const hasElementFocus = elm => hasFocus$1(elm) || search(elm).isSome();\n    const hasIframeFocus = editor => isNonNullable(editor.iframeElement) && hasFocus$1(SugarElement.fromDom(editor.iframeElement));\n    const hasInlineFocus = editor => {\n      const rawBody = editor.getBody();\n      return rawBody && hasElementFocus(SugarElement.fromDom(rawBody));\n    };\n    const hasUiFocus = editor => {\n      const dos = getRootNode(SugarElement.fromDom(editor.getElement()));\n      return active$1(dos).filter(elem => !isEditorContentAreaElement(elem.dom) && isUIElement(editor, elem.dom)).isSome();\n    };\n    const hasFocus = editor => editor.inline ? hasInlineFocus(editor) : hasIframeFocus(editor);\n    const hasEditorOrUiFocus = editor => hasFocus(editor) || hasUiFocus(editor);\n    const focusEditor = editor => {\n      const selection = editor.selection;\n      const body = editor.getBody();\n      let rng = selection.getRng();\n      editor.quirks.refreshContentEditable();\n      if (isNonNullable(editor.bookmark) && !hasFocus(editor)) {\n        getRng(editor).each(bookmarkRng => {\n          editor.selection.setRng(bookmarkRng);\n          rng = bookmarkRng;\n        });\n      }\n      const contentEditableHost = getContentEditableHost(editor, selection.getNode());\n      if (contentEditableHost && editor.dom.isChildOf(contentEditableHost, body)) {\n        focusBody(contentEditableHost);\n        normalizeSelection(editor, rng);\n        activateEditor(editor);\n        return;\n      }\n      if (!editor.inline) {\n        if (!Env.browser.isOpera()) {\n          focusBody(body);\n        }\n        editor.getWin().focus();\n      }\n      if (Env.browser.isFirefox() || editor.inline) {\n        focusBody(body);\n        normalizeSelection(editor, rng);\n      }\n      activateEditor(editor);\n    };\n    const activateEditor = editor => editor.editorManager.setActive(editor);\n    const focus = (editor, skipFocus) => {\n      if (editor.removed) {\n        return;\n      }\n      if (skipFocus) {\n        activateEditor(editor);\n      } else {\n        focusEditor(editor);\n      }\n    };\n\n    const isEditableRange = (dom, rng) => {\n      if (rng.collapsed) {\n        return dom.isEditable(rng.startContainer);\n      } else {\n        return dom.isEditable(rng.startContainer) && dom.isEditable(rng.endContainer);\n      }\n    };\n\n    const getEndpointElement = (root, rng, start, real, resolve) => {\n      const container = start ? rng.startContainer : rng.endContainer;\n      const offset = start ? rng.startOffset : rng.endOffset;\n      return Optional.from(container).map(SugarElement.fromDom).map(elm => !real || !rng.collapsed ? child$1(elm, resolve(elm, offset)).getOr(elm) : elm).bind(elm => isElement$7(elm) ? Optional.some(elm) : parent(elm).filter(isElement$7)).map(elm => elm.dom).getOr(root);\n    };\n    const getStart = (root, rng, real = false) => getEndpointElement(root, rng, true, real, (elm, offset) => Math.min(childNodesCount(elm), offset));\n    const getEnd = (root, rng, real = false) => getEndpointElement(root, rng, false, real, (elm, offset) => offset > 0 ? offset - 1 : offset);\n    const skipEmptyTextNodes = (node, forwards) => {\n      const orig = node;\n      while (node && isText$b(node) && node.length === 0) {\n        node = forwards ? node.nextSibling : node.previousSibling;\n      }\n      return node || orig;\n    };\n    const getNode = (root, rng) => {\n      if (!rng) {\n        return root;\n      }\n      let startContainer = rng.startContainer;\n      let endContainer = rng.endContainer;\n      const startOffset = rng.startOffset;\n      const endOffset = rng.endOffset;\n      let node = rng.commonAncestorContainer;\n      if (!rng.collapsed) {\n        if (startContainer === endContainer) {\n          if (endOffset - startOffset < 2) {\n            if (startContainer.hasChildNodes()) {\n              node = startContainer.childNodes[startOffset];\n            }\n          }\n        }\n        if (isText$b(startContainer) && isText$b(endContainer)) {\n          if (startContainer.length === startOffset) {\n            startContainer = skipEmptyTextNodes(startContainer.nextSibling, true);\n          } else {\n            startContainer = startContainer.parentNode;\n          }\n          if (endOffset === 0) {\n            endContainer = skipEmptyTextNodes(endContainer.previousSibling, false);\n          } else {\n            endContainer = endContainer.parentNode;\n          }\n          if (startContainer && startContainer === endContainer) {\n            node = startContainer;\n          }\n        }\n      }\n      const elm = isText$b(node) ? node.parentNode : node;\n      return isHTMLElement(elm) ? elm : root;\n    };\n    const getSelectedBlocks = (dom, rng, startElm, endElm) => {\n      const selectedBlocks = [];\n      const root = dom.getRoot();\n      const start = dom.getParent(startElm || getStart(root, rng, rng.collapsed), dom.isBlock);\n      const end = dom.getParent(endElm || getEnd(root, rng, rng.collapsed), dom.isBlock);\n      if (start && start !== root) {\n        selectedBlocks.push(start);\n      }\n      if (start && end && start !== end) {\n        let node;\n        const walker = new DomTreeWalker(start, root);\n        while ((node = walker.next()) && node !== end) {\n          if (dom.isBlock(node)) {\n            selectedBlocks.push(node);\n          }\n        }\n      }\n      if (end && start !== end && end !== root) {\n        selectedBlocks.push(end);\n      }\n      return selectedBlocks;\n    };\n    const select = (dom, node, content) => Optional.from(node).bind(node => Optional.from(node.parentNode).map(parent => {\n      const idx = dom.nodeIndex(node);\n      const rng = dom.createRng();\n      rng.setStart(parent, idx);\n      rng.setEnd(parent, idx + 1);\n      if (content) {\n        moveEndPoint(dom, rng, node, true);\n        moveEndPoint(dom, rng, node, false);\n      }\n      return rng;\n    }));\n\n    const processRanges = (editor, ranges) => map$3(ranges, range => {\n      const evt = editor.dispatch('GetSelectionRange', { range });\n      return evt.range !== range ? evt.range : range;\n    });\n\n    const typeLookup = {\n      '#text': 3,\n      '#comment': 8,\n      '#cdata': 4,\n      '#pi': 7,\n      '#doctype': 10,\n      '#document-fragment': 11\n    };\n    const walk$2 = (node, root, prev) => {\n      const startName = prev ? 'lastChild' : 'firstChild';\n      const siblingName = prev ? 'prev' : 'next';\n      if (node[startName]) {\n        return node[startName];\n      }\n      if (node !== root) {\n        let sibling = node[siblingName];\n        if (sibling) {\n          return sibling;\n        }\n        for (let parent = node.parent; parent && parent !== root; parent = parent.parent) {\n          sibling = parent[siblingName];\n          if (sibling) {\n            return sibling;\n          }\n        }\n      }\n      return undefined;\n    };\n    const isEmptyTextNode = node => {\n      var _a;\n      const text = (_a = node.value) !== null && _a !== void 0 ? _a : '';\n      if (!isWhitespaceText(text)) {\n        return false;\n      }\n      const parentNode = node.parent;\n      if (parentNode && (parentNode.name !== 'span' || parentNode.attr('style')) && /^[ ]+$/.test(text)) {\n        return false;\n      }\n      return true;\n    };\n    const isNonEmptyElement = node => {\n      const isNamedAnchor = node.name === 'a' && !node.attr('href') && node.attr('id');\n      return node.attr('name') || node.attr('id') && !node.firstChild || node.attr('data-mce-bookmark') || isNamedAnchor;\n    };\n    class AstNode {\n      static create(name, attrs) {\n        const node = new AstNode(name, typeLookup[name] || 1);\n        if (attrs) {\n          each$d(attrs, (value, attrName) => {\n            node.attr(attrName, value);\n          });\n        }\n        return node;\n      }\n      constructor(name, type) {\n        this.name = name;\n        this.type = type;\n        if (type === 1) {\n          this.attributes = [];\n          this.attributes.map = {};\n        }\n      }\n      replace(node) {\n        const self = this;\n        if (node.parent) {\n          node.remove();\n        }\n        self.insert(node, self);\n        self.remove();\n        return self;\n      }\n      attr(name, value) {\n        const self = this;\n        if (!isString(name)) {\n          if (isNonNullable(name)) {\n            each$d(name, (value, key) => {\n              self.attr(key, value);\n            });\n          }\n          return self;\n        }\n        const attrs = self.attributes;\n        if (attrs) {\n          if (value !== undefined) {\n            if (value === null) {\n              if (name in attrs.map) {\n                delete attrs.map[name];\n                let i = attrs.length;\n                while (i--) {\n                  if (attrs[i].name === name) {\n                    attrs.splice(i, 1);\n                    return self;\n                  }\n                }\n              }\n              return self;\n            }\n            if (name in attrs.map) {\n              let i = attrs.length;\n              while (i--) {\n                if (attrs[i].name === name) {\n                  attrs[i].value = value;\n                  break;\n                }\n              }\n            } else {\n              attrs.push({\n                name,\n                value\n              });\n            }\n            attrs.map[name] = value;\n            return self;\n          }\n          return attrs.map[name];\n        }\n        return undefined;\n      }\n      clone() {\n        const self = this;\n        const clone = new AstNode(self.name, self.type);\n        const selfAttrs = self.attributes;\n        if (selfAttrs) {\n          const cloneAttrs = [];\n          cloneAttrs.map = {};\n          for (let i = 0, l = selfAttrs.length; i < l; i++) {\n            const selfAttr = selfAttrs[i];\n            if (selfAttr.name !== 'id') {\n              cloneAttrs[cloneAttrs.length] = {\n                name: selfAttr.name,\n                value: selfAttr.value\n              };\n              cloneAttrs.map[selfAttr.name] = selfAttr.value;\n            }\n          }\n          clone.attributes = cloneAttrs;\n        }\n        clone.value = self.value;\n        return clone;\n      }\n      wrap(wrapper) {\n        const self = this;\n        if (self.parent) {\n          self.parent.insert(wrapper, self);\n          wrapper.append(self);\n        }\n        return self;\n      }\n      unwrap() {\n        const self = this;\n        for (let node = self.firstChild; node;) {\n          const next = node.next;\n          self.insert(node, self, true);\n          node = next;\n        }\n        self.remove();\n      }\n      remove() {\n        const self = this, parent = self.parent, next = self.next, prev = self.prev;\n        if (parent) {\n          if (parent.firstChild === self) {\n            parent.firstChild = next;\n            if (next) {\n              next.prev = null;\n            }\n          } else if (prev) {\n            prev.next = next;\n          }\n          if (parent.lastChild === self) {\n            parent.lastChild = prev;\n            if (prev) {\n              prev.next = null;\n            }\n          } else if (next) {\n            next.prev = prev;\n          }\n          self.parent = self.next = self.prev = null;\n        }\n        return self;\n      }\n      append(node) {\n        const self = this;\n        if (node.parent) {\n          node.remove();\n        }\n        const last = self.lastChild;\n        if (last) {\n          last.next = node;\n          node.prev = last;\n          self.lastChild = node;\n        } else {\n          self.lastChild = self.firstChild = node;\n        }\n        node.parent = self;\n        return node;\n      }\n      insert(node, refNode, before) {\n        if (node.parent) {\n          node.remove();\n        }\n        const parent = refNode.parent || this;\n        if (before) {\n          if (refNode === parent.firstChild) {\n            parent.firstChild = node;\n          } else if (refNode.prev) {\n            refNode.prev.next = node;\n          }\n          node.prev = refNode.prev;\n          node.next = refNode;\n          refNode.prev = node;\n        } else {\n          if (refNode === parent.lastChild) {\n            parent.lastChild = node;\n          } else if (refNode.next) {\n            refNode.next.prev = node;\n          }\n          node.next = refNode.next;\n          node.prev = refNode;\n          refNode.next = node;\n        }\n        node.parent = parent;\n        return node;\n      }\n      getAll(name) {\n        const self = this;\n        const collection = [];\n        for (let node = self.firstChild; node; node = walk$2(node, self)) {\n          if (node.name === name) {\n            collection.push(node);\n          }\n        }\n        return collection;\n      }\n      children() {\n        const self = this;\n        const collection = [];\n        for (let node = self.firstChild; node; node = node.next) {\n          collection.push(node);\n        }\n        return collection;\n      }\n      empty() {\n        const self = this;\n        if (self.firstChild) {\n          const nodes = [];\n          for (let node = self.firstChild; node; node = walk$2(node, self)) {\n            nodes.push(node);\n          }\n          let i = nodes.length;\n          while (i--) {\n            const node = nodes[i];\n            node.parent = node.firstChild = node.lastChild = node.next = node.prev = null;\n          }\n        }\n        self.firstChild = self.lastChild = null;\n        return self;\n      }\n      isEmpty(elements, whitespace = {}, predicate) {\n        var _a;\n        const self = this;\n        let node = self.firstChild;\n        if (isNonEmptyElement(self)) {\n          return false;\n        }\n        if (node) {\n          do {\n            if (node.type === 1) {\n              if (node.attr('data-mce-bogus')) {\n                continue;\n              }\n              if (elements[node.name]) {\n                return false;\n              }\n              if (isNonEmptyElement(node)) {\n                return false;\n              }\n            }\n            if (node.type === 8) {\n              return false;\n            }\n            if (node.type === 3 && !isEmptyTextNode(node)) {\n              return false;\n            }\n            if (node.type === 3 && node.parent && whitespace[node.parent.name] && isWhitespaceText((_a = node.value) !== null && _a !== void 0 ? _a : '')) {\n              return false;\n            }\n            if (predicate && predicate(node)) {\n              return false;\n            }\n          } while (node = walk$2(node, self));\n        }\n        return true;\n      }\n      walk(prev) {\n        return walk$2(this, null, prev);\n      }\n    }\n\n    const unescapedTextParents = Tools.makeMap('NOSCRIPT STYLE SCRIPT XMP IFRAME NOEMBED NOFRAMES PLAINTEXT', ' ');\n    const containsZwsp = node => isString(node.nodeValue) && node.nodeValue.includes(ZWSP$1);\n    const getTemporaryNodeSelector = tempAttrs => `${ tempAttrs.length === 0 ? '' : `${ map$3(tempAttrs, attr => `[${ attr }]`).join(',') },` }[data-mce-bogus=\"all\"]`;\n    const getTemporaryNodes = (tempAttrs, body) => body.querySelectorAll(getTemporaryNodeSelector(tempAttrs));\n    const createZwspCommentWalker = body => document.createTreeWalker(body, NodeFilter.SHOW_COMMENT, node => containsZwsp(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP);\n    const createUnescapedZwspTextWalker = body => document.createTreeWalker(body, NodeFilter.SHOW_TEXT, node => {\n      if (containsZwsp(node)) {\n        const parent = node.parentNode;\n        return parent && has$2(unescapedTextParents, parent.nodeName) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n      } else {\n        return NodeFilter.FILTER_SKIP;\n      }\n    });\n    const hasZwspComment = body => createZwspCommentWalker(body).nextNode() !== null;\n    const hasUnescapedZwspText = body => createUnescapedZwspTextWalker(body).nextNode() !== null;\n    const hasTemporaryNode = (tempAttrs, body) => body.querySelector(getTemporaryNodeSelector(tempAttrs)) !== null;\n    const trimTemporaryNodes = (tempAttrs, body) => {\n      each$e(getTemporaryNodes(tempAttrs, body), elm => {\n        const element = SugarElement.fromDom(elm);\n        if (get$9(element, 'data-mce-bogus') === 'all') {\n          remove$4(element);\n        } else {\n          each$e(tempAttrs, attr => {\n            if (has$1(element, attr)) {\n              remove$9(element, attr);\n            }\n          });\n        }\n      });\n    };\n    const emptyAllNodeValuesInWalker = walker => {\n      let curr = walker.nextNode();\n      while (curr !== null) {\n        curr.nodeValue = null;\n        curr = walker.nextNode();\n      }\n    };\n    const emptyZwspComments = compose(emptyAllNodeValuesInWalker, createZwspCommentWalker);\n    const emptyUnescapedZwspTexts = compose(emptyAllNodeValuesInWalker, createUnescapedZwspTextWalker);\n    const trim$1 = (body, tempAttrs) => {\n      const conditionalTrims = [\n        {\n          condition: curry(hasTemporaryNode, tempAttrs),\n          action: curry(trimTemporaryNodes, tempAttrs)\n        },\n        {\n          condition: hasZwspComment,\n          action: emptyZwspComments\n        },\n        {\n          condition: hasUnescapedZwspText,\n          action: emptyUnescapedZwspTexts\n        }\n      ];\n      let trimmed = body;\n      let cloned = false;\n      each$e(conditionalTrims, ({condition, action}) => {\n        if (condition(trimmed)) {\n          if (!cloned) {\n            trimmed = body.cloneNode(true);\n            cloned = true;\n          }\n          action(trimmed);\n        }\n      });\n      return trimmed;\n    };\n\n    const cleanupBogusElements = parent => {\n      const bogusElements = descendants(parent, '[data-mce-bogus]');\n      each$e(bogusElements, elem => {\n        const bogusValue = get$9(elem, 'data-mce-bogus');\n        if (bogusValue === 'all') {\n          remove$4(elem);\n        } else if (isBr$5(elem)) {\n          before$3(elem, SugarElement.fromText(zeroWidth));\n          remove$4(elem);\n        } else {\n          unwrap(elem);\n        }\n      });\n    };\n    const cleanupInputNames = parent => {\n      const inputs = descendants(parent, 'input');\n      each$e(inputs, input => {\n        remove$9(input, 'name');\n      });\n    };\n\n    const trimEmptyContents = (editor, html) => {\n      const blockName = getForcedRootBlock(editor);\n      const emptyRegExp = new RegExp(`^(<${ blockName }[^>]*>(&nbsp;|&#160;|\\\\s|\\u00a0|<br \\\\/>|)<\\\\/${ blockName }>[\\r\\n]*|<br \\\\/>[\\r\\n]*)$`);\n      return html.replace(emptyRegExp, '');\n    };\n    const getPlainTextContent = (editor, body) => {\n      const doc = editor.getDoc();\n      const dos = getRootNode(SugarElement.fromDom(editor.getBody()));\n      const offscreenDiv = SugarElement.fromTag('div', doc);\n      set$3(offscreenDiv, 'data-mce-bogus', 'all');\n      setAll(offscreenDiv, {\n        position: 'fixed',\n        left: '-9999999px',\n        top: '0'\n      });\n      set$1(offscreenDiv, body.innerHTML);\n      cleanupBogusElements(offscreenDiv);\n      cleanupInputNames(offscreenDiv);\n      const root = getContentContainer(dos);\n      append$1(root, offscreenDiv);\n      const content = trim$2(offscreenDiv.dom.innerText);\n      remove$4(offscreenDiv);\n      return content;\n    };\n    const getContentFromBody = (editor, args, body) => {\n      let content;\n      if (args.format === 'raw') {\n        content = Tools.trim(trim$2(trim$1(body, editor.serializer.getTempAttrs()).innerHTML));\n      } else if (args.format === 'text') {\n        content = getPlainTextContent(editor, body);\n      } else if (args.format === 'tree') {\n        content = editor.serializer.serialize(body, args);\n      } else {\n        content = trimEmptyContents(editor, editor.serializer.serialize(body, args));\n      }\n      const shouldTrim = args.format !== 'text' && !isWsPreserveElement(SugarElement.fromDom(body));\n      return shouldTrim && isString(content) ? Tools.trim(content) : content;\n    };\n    const getContentInternal = (editor, args) => Optional.from(editor.getBody()).fold(constant(args.format === 'tree' ? new AstNode('body', 11) : ''), body => getContentFromBody(editor, args, body));\n\n    const makeMap$1 = Tools.makeMap;\n    const Writer = settings => {\n      const html = [];\n      settings = settings || {};\n      const indent = settings.indent;\n      const indentBefore = makeMap$1(settings.indent_before || '');\n      const indentAfter = makeMap$1(settings.indent_after || '');\n      const encode = Entities.getEncodeFunc(settings.entity_encoding || 'raw', settings.entities);\n      const htmlOutput = settings.element_format !== 'xhtml';\n      return {\n        start: (name, attrs, empty) => {\n          if (indent && indentBefore[name] && html.length > 0) {\n            const value = html[html.length - 1];\n            if (value.length > 0 && value !== '\\n') {\n              html.push('\\n');\n            }\n          }\n          html.push('<', name);\n          if (attrs) {\n            for (let i = 0, l = attrs.length; i < l; i++) {\n              const attr = attrs[i];\n              html.push(' ', attr.name, '=\"', encode(attr.value, true), '\"');\n            }\n          }\n          if (!empty || htmlOutput) {\n            html[html.length] = '>';\n          } else {\n            html[html.length] = ' />';\n          }\n          if (empty && indent && indentAfter[name] && html.length > 0) {\n            const value = html[html.length - 1];\n            if (value.length > 0 && value !== '\\n') {\n              html.push('\\n');\n            }\n          }\n        },\n        end: name => {\n          let value;\n          html.push('</', name, '>');\n          if (indent && indentAfter[name] && html.length > 0) {\n            value = html[html.length - 1];\n            if (value.length > 0 && value !== '\\n') {\n              html.push('\\n');\n            }\n          }\n        },\n        text: (text, raw) => {\n          if (text.length > 0) {\n            html[html.length] = raw ? text : encode(text);\n          }\n        },\n        cdata: text => {\n          html.push('<![CDATA[', text, ']]>');\n        },\n        comment: text => {\n          html.push('<!--', text, '-->');\n        },\n        pi: (name, text) => {\n          if (text) {\n            html.push('<?', name, ' ', encode(text), '?>');\n          } else {\n            html.push('<?', name, '?>');\n          }\n          if (indent) {\n            html.push('\\n');\n          }\n        },\n        doctype: text => {\n          html.push('<!DOCTYPE', text, '>', indent ? '\\n' : '');\n        },\n        reset: () => {\n          html.length = 0;\n        },\n        getContent: () => {\n          return html.join('').replace(/\\n$/, '');\n        }\n      };\n    };\n\n    const HtmlSerializer = (settings = {}, schema = Schema()) => {\n      const writer = Writer(settings);\n      settings.validate = 'validate' in settings ? settings.validate : true;\n      const serialize = node => {\n        const validate = settings.validate;\n        const handlers = {\n          3: node => {\n            var _a;\n            writer.text((_a = node.value) !== null && _a !== void 0 ? _a : '', node.raw);\n          },\n          8: node => {\n            var _a;\n            writer.comment((_a = node.value) !== null && _a !== void 0 ? _a : '');\n          },\n          7: node => {\n            writer.pi(node.name, node.value);\n          },\n          10: node => {\n            var _a;\n            writer.doctype((_a = node.value) !== null && _a !== void 0 ? _a : '');\n          },\n          4: node => {\n            var _a;\n            writer.cdata((_a = node.value) !== null && _a !== void 0 ? _a : '');\n          },\n          11: node => {\n            let tempNode = node;\n            if (tempNode = tempNode.firstChild) {\n              do {\n                walk(tempNode);\n              } while (tempNode = tempNode.next);\n            }\n          }\n        };\n        writer.reset();\n        const walk = node => {\n          var _a;\n          const handler = handlers[node.type];\n          if (!handler) {\n            const name = node.name;\n            const isEmpty = name in schema.getVoidElements();\n            let attrs = node.attributes;\n            if (validate && attrs && attrs.length > 1) {\n              const sortedAttrs = [];\n              sortedAttrs.map = {};\n              const elementRule = schema.getElementRule(node.name);\n              if (elementRule) {\n                for (let i = 0, l = elementRule.attributesOrder.length; i < l; i++) {\n                  const attrName = elementRule.attributesOrder[i];\n                  if (attrName in attrs.map) {\n                    const attrValue = attrs.map[attrName];\n                    sortedAttrs.map[attrName] = attrValue;\n                    sortedAttrs.push({\n                      name: attrName,\n                      value: attrValue\n                    });\n                  }\n                }\n                for (let i = 0, l = attrs.length; i < l; i++) {\n                  const attrName = attrs[i].name;\n                  if (!(attrName in sortedAttrs.map)) {\n                    const attrValue = attrs.map[attrName];\n                    sortedAttrs.map[attrName] = attrValue;\n                    sortedAttrs.push({\n                      name: attrName,\n                      value: attrValue\n                    });\n                  }\n                }\n                attrs = sortedAttrs;\n              }\n            }\n            writer.start(name, attrs, isEmpty);\n            if (isNonHtmlElementRootName(name)) {\n              if (isString(node.value)) {\n                writer.text(node.value, true);\n              }\n              writer.end(name);\n            } else {\n              if (!isEmpty) {\n                let child = node.firstChild;\n                if (child) {\n                  if ((name === 'pre' || name === 'textarea') && child.type === 3 && ((_a = child.value) === null || _a === void 0 ? void 0 : _a[0]) === '\\n') {\n                    writer.text('\\n', true);\n                  }\n                  do {\n                    walk(child);\n                  } while (child = child.next);\n                }\n                writer.end(name);\n              }\n            }\n          } else {\n            handler(node);\n          }\n        };\n        if (node.type === 1 && !settings.inner) {\n          walk(node);\n        } else if (node.type === 3) {\n          handlers[3](node);\n        } else {\n          handlers[11](node);\n        }\n        return writer.getContent();\n      };\n      return { serialize };\n    };\n\n    const nonInheritableStyles = new Set();\n    (() => {\n      const nonInheritableStylesArr = [\n        'margin',\n        'margin-left',\n        'margin-right',\n        'margin-top',\n        'margin-bottom',\n        'padding',\n        'padding-left',\n        'padding-right',\n        'padding-top',\n        'padding-bottom',\n        'border',\n        'border-width',\n        'border-style',\n        'border-color',\n        'background',\n        'background-attachment',\n        'background-clip',\n        'background-color',\n        'background-image',\n        'background-origin',\n        'background-position',\n        'background-repeat',\n        'background-size',\n        'float',\n        'position',\n        'left',\n        'right',\n        'top',\n        'bottom',\n        'z-index',\n        'display',\n        'transform',\n        'width',\n        'max-width',\n        'min-width',\n        'height',\n        'max-height',\n        'min-height',\n        'overflow',\n        'overflow-x',\n        'overflow-y',\n        'text-overflow',\n        'vertical-align',\n        'transition',\n        'transition-delay',\n        'transition-duration',\n        'transition-property',\n        'transition-timing-function'\n      ];\n      each$e(nonInheritableStylesArr, style => {\n        nonInheritableStyles.add(style);\n      });\n    })();\n    const shorthandStyleProps = [\n      'font',\n      'text-decoration',\n      'text-emphasis'\n    ];\n    const getStyleProps = (dom, node) => keys(dom.parseStyle(dom.getAttrib(node, 'style')));\n    const isNonInheritableStyle = style => nonInheritableStyles.has(style);\n    const hasInheritableStyles = (dom, node) => forall(getStyleProps(dom, node), style => !isNonInheritableStyle(style));\n    const getLonghandStyleProps = styles => filter$5(styles, style => exists(shorthandStyleProps, prop => startsWith(style, prop)));\n    const hasStyleConflict = (dom, node, parentNode) => {\n      const nodeStyleProps = getStyleProps(dom, node);\n      const parentNodeStyleProps = getStyleProps(dom, parentNode);\n      const valueMismatch = prop => {\n        var _a, _b;\n        const nodeValue = (_a = dom.getStyle(node, prop)) !== null && _a !== void 0 ? _a : '';\n        const parentValue = (_b = dom.getStyle(parentNode, prop)) !== null && _b !== void 0 ? _b : '';\n        return isNotEmpty(nodeValue) && isNotEmpty(parentValue) && nodeValue !== parentValue;\n      };\n      return exists(nodeStyleProps, nodeStyleProp => {\n        const propExists = props => exists(props, prop => prop === nodeStyleProp);\n        if (!propExists(parentNodeStyleProps) && propExists(shorthandStyleProps)) {\n          const longhandProps = getLonghandStyleProps(parentNodeStyleProps);\n          return exists(longhandProps, valueMismatch);\n        } else {\n          return valueMismatch(nodeStyleProp);\n        }\n      });\n    };\n\n    const isChar = (forward, predicate, pos) => Optional.from(pos.container()).filter(isText$b).exists(text => {\n      const delta = forward ? 0 : -1;\n      return predicate(text.data.charAt(pos.offset() + delta));\n    });\n    const isBeforeSpace = curry(isChar, true, isWhiteSpace);\n    const isAfterSpace = curry(isChar, false, isWhiteSpace);\n    const isEmptyText = pos => {\n      const container = pos.container();\n      return isText$b(container) && (container.data.length === 0 || isZwsp(container.data) && BookmarkManager.isBookmarkNode(container.parentNode));\n    };\n    const matchesElementPosition = (before, predicate) => pos => getChildNodeAtRelativeOffset(before ? 0 : -1, pos).filter(predicate).isSome();\n    const isImageBlock = node => isImg(node) && get$7(SugarElement.fromDom(node), 'display') === 'block';\n    const isCefNode = node => isContentEditableFalse$b(node) && !isBogusAll(node);\n    const isBeforeImageBlock = matchesElementPosition(true, isImageBlock);\n    const isAfterImageBlock = matchesElementPosition(false, isImageBlock);\n    const isBeforeMedia = matchesElementPosition(true, isMedia$2);\n    const isAfterMedia = matchesElementPosition(false, isMedia$2);\n    const isBeforeTable = matchesElementPosition(true, isTable$2);\n    const isAfterTable = matchesElementPosition(false, isTable$2);\n    const isBeforeContentEditableFalse = matchesElementPosition(true, isCefNode);\n    const isAfterContentEditableFalse = matchesElementPosition(false, isCefNode);\n\n    const dropLast = xs => xs.slice(0, -1);\n    const parentsUntil = (start, root, predicate) => {\n      if (contains(root, start)) {\n        return dropLast(parents$1(start, elm => {\n          return predicate(elm) || eq(elm, root);\n        }));\n      } else {\n        return [];\n      }\n    };\n    const parents = (start, root) => parentsUntil(start, root, never);\n    const parentsAndSelf = (start, root) => [start].concat(parents(start, root));\n\n    const navigateIgnoreEmptyTextNodes = (forward, root, from) => navigateIgnore(forward, root, from, isEmptyText);\n    const isBlock$1 = schema => el => schema.isBlock(name(el));\n    const getClosestBlock$1 = (root, pos, schema) => find$2(parentsAndSelf(SugarElement.fromDom(pos.container()), root), isBlock$1(schema));\n    const isAtBeforeAfterBlockBoundary = (forward, root, pos, schema) => navigateIgnoreEmptyTextNodes(forward, root.dom, pos).forall(newPos => getClosestBlock$1(root, pos, schema).fold(() => !isInSameBlock(newPos, pos, root.dom), fromBlock => !isInSameBlock(newPos, pos, root.dom) && contains(fromBlock, SugarElement.fromDom(newPos.container()))));\n    const isAtBlockBoundary = (forward, root, pos, schema) => getClosestBlock$1(root, pos, schema).fold(() => navigateIgnoreEmptyTextNodes(forward, root.dom, pos).forall(newPos => !isInSameBlock(newPos, pos, root.dom)), parent => navigateIgnoreEmptyTextNodes(forward, parent.dom, pos).isNone());\n    const isAtStartOfBlock = curry(isAtBlockBoundary, false);\n    const isAtEndOfBlock = curry(isAtBlockBoundary, true);\n    const isBeforeBlock = curry(isAtBeforeAfterBlockBoundary, false);\n    const isAfterBlock = curry(isAtBeforeAfterBlockBoundary, true);\n\n    const isBr$1 = pos => getElementFromPosition(pos).exists(isBr$5);\n    const findBr = (forward, root, pos, schema) => {\n      const parentBlocks = filter$5(parentsAndSelf(SugarElement.fromDom(pos.container()), root), el => schema.isBlock(name(el)));\n      const scope = head(parentBlocks).getOr(root);\n      return fromPosition(forward, scope.dom, pos).filter(isBr$1);\n    };\n    const isBeforeBr$1 = (root, pos, schema) => getElementFromPosition(pos).exists(isBr$5) || findBr(true, root, pos, schema).isSome();\n    const isAfterBr = (root, pos, schema) => getElementFromPrevPosition(pos).exists(isBr$5) || findBr(false, root, pos, schema).isSome();\n    const findPreviousBr = curry(findBr, false);\n    const findNextBr = curry(findBr, true);\n\n    const isInMiddleOfText = pos => CaretPosition.isTextPosition(pos) && !pos.isAtStart() && !pos.isAtEnd();\n    const getClosestBlock = (root, pos, schema) => {\n      const parentBlocks = filter$5(parentsAndSelf(SugarElement.fromDom(pos.container()), root), el => schema.isBlock(name(el)));\n      return head(parentBlocks).getOr(root);\n    };\n    const hasSpaceBefore = (root, pos, schema) => {\n      if (isInMiddleOfText(pos)) {\n        return isAfterSpace(pos);\n      } else {\n        return isAfterSpace(pos) || prevPosition(getClosestBlock(root, pos, schema).dom, pos).exists(isAfterSpace);\n      }\n    };\n    const hasSpaceAfter = (root, pos, schema) => {\n      if (isInMiddleOfText(pos)) {\n        return isBeforeSpace(pos);\n      } else {\n        return isBeforeSpace(pos) || nextPosition(getClosestBlock(root, pos, schema).dom, pos).exists(isBeforeSpace);\n      }\n    };\n    const isPreValue = value => contains$2([\n      'pre',\n      'pre-wrap'\n    ], value);\n    const isInPre = pos => getElementFromPosition(pos).bind(elm => closest$4(elm, isElement$7)).exists(elm => isPreValue(get$7(elm, 'white-space')));\n    const isAtBeginningOfBody = (root, pos) => prevPosition(root.dom, pos).isNone();\n    const isAtEndOfBody = (root, pos) => nextPosition(root.dom, pos).isNone();\n    const isAtLineBoundary = (root, pos, schema) => isAtBeginningOfBody(root, pos) || isAtEndOfBody(root, pos) || isAtStartOfBlock(root, pos, schema) || isAtEndOfBlock(root, pos, schema) || isAfterBr(root, pos, schema) || isBeforeBr$1(root, pos, schema);\n    const isCefBlock = node => isNonNullable(node) && isContentEditableFalse$b(node) && isBlockLike(node);\n    const isSiblingCefBlock = (root, direction) => container => {\n      return isCefBlock(new DomTreeWalker(container, root)[direction]());\n    };\n    const isBeforeCefBlock = (root, pos) => {\n      const nextPos = nextPosition(root.dom, pos).getOr(pos);\n      const isNextCefBlock = isSiblingCefBlock(root.dom, 'next');\n      return pos.isAtEnd() && (isNextCefBlock(pos.container()) || isNextCefBlock(nextPos.container()));\n    };\n    const isAfterCefBlock = (root, pos) => {\n      const prevPos = prevPosition(root.dom, pos).getOr(pos);\n      const isPrevCefBlock = isSiblingCefBlock(root.dom, 'prev');\n      return pos.isAtStart() && (isPrevCefBlock(pos.container()) || isPrevCefBlock(prevPos.container()));\n    };\n    const needsToHaveNbsp = (root, pos, schema) => {\n      if (isInPre(pos)) {\n        return false;\n      } else {\n        return isAtLineBoundary(root, pos, schema) || hasSpaceBefore(root, pos, schema) || hasSpaceAfter(root, pos, schema);\n      }\n    };\n    const needsToBeNbspLeft = (root, pos, schema) => {\n      if (isInPre(pos)) {\n        return false;\n      } else {\n        return isAtStartOfBlock(root, pos, schema) || isBeforeBlock(root, pos, schema) || isAfterBr(root, pos, schema) || hasSpaceBefore(root, pos, schema) || isAfterCefBlock(root, pos);\n      }\n    };\n    const leanRight = pos => {\n      const container = pos.container();\n      const offset = pos.offset();\n      if (isText$b(container) && offset < container.data.length) {\n        return CaretPosition(container, offset + 1);\n      } else {\n        return pos;\n      }\n    };\n    const needsToBeNbspRight = (root, pos, schema) => {\n      if (isInPre(pos)) {\n        return false;\n      } else {\n        return isAtEndOfBlock(root, pos, schema) || isAfterBlock(root, pos, schema) || isBeforeBr$1(root, pos, schema) || hasSpaceAfter(root, pos, schema) || isBeforeCefBlock(root, pos);\n      }\n    };\n    const needsToBeNbsp = (root, pos, schema) => needsToBeNbspLeft(root, pos, schema) || needsToBeNbspRight(root, leanRight(pos), schema);\n    const isNbspAt = (text, offset) => isNbsp(text.charAt(offset));\n    const isWhiteSpaceAt = (text, offset) => isWhiteSpace(text.charAt(offset));\n    const hasNbsp = pos => {\n      const container = pos.container();\n      return isText$b(container) && contains$1(container.data, nbsp);\n    };\n    const normalizeNbspMiddle = text => {\n      const chars = text.split('');\n      return map$3(chars, (chr, i) => {\n        if (isNbsp(chr) && i > 0 && i < chars.length - 1 && isContent(chars[i - 1]) && isContent(chars[i + 1])) {\n          return ' ';\n        } else {\n          return chr;\n        }\n      }).join('');\n    };\n    const normalizeNbspAtStart = (root, node, makeNbsp, schema) => {\n      const text = node.data;\n      const firstPos = CaretPosition(node, 0);\n      if (!makeNbsp && isNbspAt(text, 0) && !needsToBeNbsp(root, firstPos, schema)) {\n        node.data = ' ' + text.slice(1);\n        return true;\n      } else if (makeNbsp && isWhiteSpaceAt(text, 0) && needsToBeNbspLeft(root, firstPos, schema)) {\n        node.data = nbsp + text.slice(1);\n        return true;\n      } else {\n        return false;\n      }\n    };\n    const normalizeNbspInMiddleOfTextNode = node => {\n      const text = node.data;\n      const newText = normalizeNbspMiddle(text);\n      if (newText !== text) {\n        node.data = newText;\n        return true;\n      } else {\n        return false;\n      }\n    };\n    const normalizeNbspAtEnd = (root, node, makeNbsp, schema) => {\n      const text = node.data;\n      const lastPos = CaretPosition(node, text.length - 1);\n      if (!makeNbsp && isNbspAt(text, text.length - 1) && !needsToBeNbsp(root, lastPos, schema)) {\n        node.data = text.slice(0, -1) + ' ';\n        return true;\n      } else if (makeNbsp && isWhiteSpaceAt(text, text.length - 1) && needsToBeNbspRight(root, lastPos, schema)) {\n        node.data = text.slice(0, -1) + nbsp;\n        return true;\n      } else {\n        return false;\n      }\n    };\n    const normalizeNbsps = (root, pos, schema) => {\n      const container = pos.container();\n      if (!isText$b(container)) {\n        return Optional.none();\n      }\n      if (hasNbsp(pos)) {\n        const normalized = normalizeNbspAtStart(root, container, false, schema) || normalizeNbspInMiddleOfTextNode(container) || normalizeNbspAtEnd(root, container, false, schema);\n        return someIf(normalized, pos);\n      } else if (needsToBeNbsp(root, pos, schema)) {\n        const normalized = normalizeNbspAtStart(root, container, true, schema) || normalizeNbspAtEnd(root, container, true, schema);\n        return someIf(normalized, pos);\n      } else {\n        return Optional.none();\n      }\n    };\n    const normalizeNbspsInEditor = editor => {\n      const root = SugarElement.fromDom(editor.getBody());\n      if (editor.selection.isCollapsed()) {\n        normalizeNbsps(root, CaretPosition.fromRangeStart(editor.selection.getRng()), editor.schema).each(pos => {\n          editor.selection.setRng(pos.toRange());\n        });\n      }\n    };\n\n    const normalize$1 = (node, offset, count, schema) => {\n      if (count === 0) {\n        return;\n      }\n      const elm = SugarElement.fromDom(node);\n      const root = ancestor$4(elm, el => schema.isBlock(name(el))).getOr(elm);\n      const whitespace = node.data.slice(offset, offset + count);\n      const isEndOfContent = offset + count >= node.data.length && needsToBeNbspRight(root, CaretPosition(node, node.data.length), schema);\n      const isStartOfContent = offset === 0 && needsToBeNbspLeft(root, CaretPosition(node, 0), schema);\n      node.replaceData(offset, count, normalize$4(whitespace, 4, isStartOfContent, isEndOfContent));\n    };\n    const normalizeWhitespaceAfter = (node, offset, schema) => {\n      const content = node.data.slice(offset);\n      const whitespaceCount = content.length - lTrim(content).length;\n      normalize$1(node, offset, whitespaceCount, schema);\n    };\n    const normalizeWhitespaceBefore = (node, offset, schema) => {\n      const content = node.data.slice(0, offset);\n      const whitespaceCount = content.length - rTrim(content).length;\n      normalize$1(node, offset - whitespaceCount, whitespaceCount, schema);\n    };\n    const mergeTextNodes = (prevNode, nextNode, schema, normalizeWhitespace, mergeToPrev = true) => {\n      const whitespaceOffset = rTrim(prevNode.data).length;\n      const newNode = mergeToPrev ? prevNode : nextNode;\n      const removeNode = mergeToPrev ? nextNode : prevNode;\n      if (mergeToPrev) {\n        newNode.appendData(removeNode.data);\n      } else {\n        newNode.insertData(0, removeNode.data);\n      }\n      remove$4(SugarElement.fromDom(removeNode));\n      if (normalizeWhitespace) {\n        normalizeWhitespaceAfter(newNode, whitespaceOffset, schema);\n      }\n      return newNode;\n    };\n\n    const needsReposition = (pos, elm) => {\n      const container = pos.container();\n      const offset = pos.offset();\n      return !CaretPosition.isTextPosition(pos) && container === elm.parentNode && offset > CaretPosition.before(elm).offset();\n    };\n    const reposition = (elm, pos) => needsReposition(pos, elm) ? CaretPosition(pos.container(), pos.offset() - 1) : pos;\n    const beforeOrStartOf = node => isText$b(node) ? CaretPosition(node, 0) : CaretPosition.before(node);\n    const afterOrEndOf = node => isText$b(node) ? CaretPosition(node, node.data.length) : CaretPosition.after(node);\n    const getPreviousSiblingCaretPosition = elm => {\n      if (isCaretCandidate$3(elm.previousSibling)) {\n        return Optional.some(afterOrEndOf(elm.previousSibling));\n      } else {\n        return elm.previousSibling ? lastPositionIn(elm.previousSibling) : Optional.none();\n      }\n    };\n    const getNextSiblingCaretPosition = elm => {\n      if (isCaretCandidate$3(elm.nextSibling)) {\n        return Optional.some(beforeOrStartOf(elm.nextSibling));\n      } else {\n        return elm.nextSibling ? firstPositionIn(elm.nextSibling) : Optional.none();\n      }\n    };\n    const findCaretPositionBackwardsFromElm = (rootElement, elm) => {\n      return Optional.from(elm.previousSibling ? elm.previousSibling : elm.parentNode).bind(node => prevPosition(rootElement, CaretPosition.before(node))).orThunk(() => nextPosition(rootElement, CaretPosition.after(elm)));\n    };\n    const findCaretPositionForwardsFromElm = (rootElement, elm) => nextPosition(rootElement, CaretPosition.after(elm)).orThunk(() => prevPosition(rootElement, CaretPosition.before(elm)));\n    const findCaretPositionBackwards = (rootElement, elm) => getPreviousSiblingCaretPosition(elm).orThunk(() => getNextSiblingCaretPosition(elm)).orThunk(() => findCaretPositionBackwardsFromElm(rootElement, elm));\n    const findCaretPositionForward = (rootElement, elm) => getNextSiblingCaretPosition(elm).orThunk(() => getPreviousSiblingCaretPosition(elm)).orThunk(() => findCaretPositionForwardsFromElm(rootElement, elm));\n    const findCaretPosition = (forward, rootElement, elm) => forward ? findCaretPositionForward(rootElement, elm) : findCaretPositionBackwards(rootElement, elm);\n    const findCaretPosOutsideElmAfterDelete = (forward, rootElement, elm) => findCaretPosition(forward, rootElement, elm).map(curry(reposition, elm));\n    const setSelection$1 = (editor, forward, pos) => {\n      pos.fold(() => {\n        editor.focus();\n      }, pos => {\n        editor.selection.setRng(pos.toRange(), forward);\n      });\n    };\n    const eqRawNode = rawNode => elm => elm.dom === rawNode;\n    const isBlock = (editor, elm) => elm && has$2(editor.schema.getBlockElements(), name(elm));\n    const paddEmptyBlock = (schema, elm, preserveEmptyCaret) => {\n      if (isEmpty$2(schema, elm)) {\n        const br = SugarElement.fromHtml('<br data-mce-bogus=\"1\">');\n        if (preserveEmptyCaret) {\n          each$e(children$1(elm), node => {\n            if (!isEmptyCaretFormatElement(node)) {\n              remove$4(node);\n            }\n          });\n        } else {\n          empty(elm);\n        }\n        append$1(elm, br);\n        return Optional.some(CaretPosition.before(br.dom));\n      } else {\n        return Optional.none();\n      }\n    };\n    const deleteNormalized = (elm, afterDeletePosOpt, schema, normalizeWhitespace) => {\n      const prevTextOpt = prevSibling(elm).filter(isText$c);\n      const nextTextOpt = nextSibling(elm).filter(isText$c);\n      remove$4(elm);\n      return lift3(prevTextOpt, nextTextOpt, afterDeletePosOpt, (prev, next, pos) => {\n        const prevNode = prev.dom, nextNode = next.dom;\n        const offset = prevNode.data.length;\n        mergeTextNodes(prevNode, nextNode, schema, normalizeWhitespace);\n        return pos.container() === nextNode ? CaretPosition(prevNode, offset) : pos;\n      }).orThunk(() => {\n        if (normalizeWhitespace) {\n          prevTextOpt.each(elm => normalizeWhitespaceBefore(elm.dom, elm.dom.length, schema));\n          nextTextOpt.each(elm => normalizeWhitespaceAfter(elm.dom, 0, schema));\n        }\n        return afterDeletePosOpt;\n      });\n    };\n    const isInlineElement = (editor, element) => has$2(editor.schema.getTextInlineElements(), name(element));\n    const deleteElement$2 = (editor, forward, elm, moveCaret = true, preserveEmptyCaret = false) => {\n      const afterDeletePos = findCaretPosOutsideElmAfterDelete(forward, editor.getBody(), elm.dom);\n      const parentBlock = ancestor$4(elm, curry(isBlock, editor), eqRawNode(editor.getBody()));\n      const normalizedAfterDeletePos = deleteNormalized(elm, afterDeletePos, editor.schema, isInlineElement(editor, elm));\n      if (editor.dom.isEmpty(editor.getBody())) {\n        editor.setContent('');\n        editor.selection.setCursorLocation();\n      } else {\n        parentBlock.bind(elm => paddEmptyBlock(editor.schema, elm, preserveEmptyCaret)).fold(() => {\n          if (moveCaret) {\n            setSelection$1(editor, forward, normalizedAfterDeletePos);\n          }\n        }, paddPos => {\n          if (moveCaret) {\n            setSelection$1(editor, forward, Optional.some(paddPos));\n          }\n        });\n      }\n    };\n\n    const strongRtl = /[\\u0591-\\u07FF\\uFB1D-\\uFDFF\\uFE70-\\uFEFC]/;\n    const hasStrongRtl = text => strongRtl.test(text);\n\n    const isInlineTarget = (editor, elm) => is$1(SugarElement.fromDom(elm), getInlineBoundarySelector(editor)) && !isTransparentBlock(editor.schema, elm) && editor.dom.isEditable(elm);\n    const isRtl = element => {\n      var _a;\n      return DOMUtils.DOM.getStyle(element, 'direction', true) === 'rtl' || hasStrongRtl((_a = element.textContent) !== null && _a !== void 0 ? _a : '');\n    };\n    const findInlineParents = (isInlineTarget, rootNode, pos) => filter$5(DOMUtils.DOM.getParents(pos.container(), '*', rootNode), isInlineTarget);\n    const findRootInline = (isInlineTarget, rootNode, pos) => {\n      const parents = findInlineParents(isInlineTarget, rootNode, pos);\n      return Optional.from(parents[parents.length - 1]);\n    };\n    const hasSameParentBlock = (rootNode, node1, node2) => {\n      const block1 = getParentBlock$3(node1, rootNode);\n      const block2 = getParentBlock$3(node2, rootNode);\n      return isNonNullable(block1) && block1 === block2;\n    };\n    const isAtZwsp = pos => isBeforeInline(pos) || isAfterInline(pos);\n    const normalizePosition = (forward, pos) => {\n      const container = pos.container(), offset = pos.offset();\n      if (forward) {\n        if (isCaretContainerInline(container)) {\n          if (isText$b(container.nextSibling)) {\n            return CaretPosition(container.nextSibling, 0);\n          } else {\n            return CaretPosition.after(container);\n          }\n        } else {\n          return isBeforeInline(pos) ? CaretPosition(container, offset + 1) : pos;\n        }\n      } else {\n        if (isCaretContainerInline(container)) {\n          if (isText$b(container.previousSibling)) {\n            return CaretPosition(container.previousSibling, container.previousSibling.data.length);\n          } else {\n            return CaretPosition.before(container);\n          }\n        } else {\n          return isAfterInline(pos) ? CaretPosition(container, offset - 1) : pos;\n        }\n      }\n    };\n    const normalizeForwards = curry(normalizePosition, true);\n    const normalizeBackwards = curry(normalizePosition, false);\n\n    const execCommandIgnoreInputEvents = (editor, command) => {\n      const inputBlocker = e => e.stopImmediatePropagation();\n      editor.on('beforeinput input', inputBlocker, true);\n      editor.getDoc().execCommand(command);\n      editor.off('beforeinput input', inputBlocker);\n    };\n    const execEditorDeleteCommand = editor => {\n      editor.execCommand('delete');\n    };\n    const execNativeDeleteCommand = editor => execCommandIgnoreInputEvents(editor, 'Delete');\n    const execNativeForwardDeleteCommand = editor => execCommandIgnoreInputEvents(editor, 'ForwardDelete');\n    const isBeforeRoot = rootNode => elm => is$2(parent(elm), rootNode, eq);\n    const isTextBlockOrListItem = element => isTextBlock$2(element) || isListItem$1(element);\n    const getParentBlock$2 = (rootNode, elm) => {\n      if (contains(rootNode, elm)) {\n        return closest$4(elm, isTextBlockOrListItem, isBeforeRoot(rootNode));\n      } else {\n        return Optional.none();\n      }\n    };\n    const paddEmptyBody = (editor, moveSelection = true) => {\n      if (editor.dom.isEmpty(editor.getBody())) {\n        editor.setContent('', { no_selection: !moveSelection });\n      }\n    };\n    const willDeleteLastPositionInElement = (forward, fromPos, elm) => lift2(firstPositionIn(elm), lastPositionIn(elm), (firstPos, lastPos) => {\n      const normalizedFirstPos = normalizePosition(true, firstPos);\n      const normalizedLastPos = normalizePosition(false, lastPos);\n      const normalizedFromPos = normalizePosition(false, fromPos);\n      if (forward) {\n        return nextPosition(elm, normalizedFromPos).exists(nextPos => nextPos.isEqual(normalizedLastPos) && fromPos.isEqual(normalizedFirstPos));\n      } else {\n        return prevPosition(elm, normalizedFromPos).exists(prevPos => prevPos.isEqual(normalizedFirstPos) && fromPos.isEqual(normalizedLastPos));\n      }\n    }).getOr(true);\n    const freefallRtl = root => {\n      const child = isComment$1(root) ? prevSibling(root) : lastChild(root);\n      return child.bind(freefallRtl).orThunk(() => Optional.some(root));\n    };\n    const deleteRangeContents = (editor, rng, root, moveSelection = true) => {\n      var _a;\n      rng.deleteContents();\n      const lastNode = freefallRtl(root).getOr(root);\n      const lastBlock = SugarElement.fromDom((_a = editor.dom.getParent(lastNode.dom, editor.dom.isBlock)) !== null && _a !== void 0 ? _a : root.dom);\n      if (lastBlock.dom === editor.getBody()) {\n        paddEmptyBody(editor, moveSelection);\n      } else if (isEmpty$2(editor.schema, lastBlock, { checkRootAsContent: false })) {\n        fillWithPaddingBr(lastBlock);\n        if (moveSelection) {\n          editor.selection.setCursorLocation(lastBlock.dom, 0);\n        }\n      }\n      if (!eq(root, lastBlock)) {\n        const additionalCleanupNodes = is$2(parent(lastBlock), root) ? [] : siblings(lastBlock);\n        each$e(additionalCleanupNodes.concat(children$1(root)), node => {\n          if (!eq(node, lastBlock) && !contains(node, lastBlock) && isEmpty$2(editor.schema, node)) {\n            remove$4(node);\n          }\n        });\n      }\n    };\n\n    const isRootFromElement = root => cur => eq(root, cur);\n    const getTableCells = table => descendants(table, 'td,th');\n    const getTable$1 = (node, isRoot) => getClosestTable(SugarElement.fromDom(node), isRoot);\n    const selectionInTableWithNestedTable = details => {\n      return lift2(details.startTable, details.endTable, (startTable, endTable) => {\n        const isStartTableParentOfEndTable = descendant(startTable, t => eq(t, endTable));\n        const isEndTableParentOfStartTable = descendant(endTable, t => eq(t, startTable));\n        return !isStartTableParentOfEndTable && !isEndTableParentOfStartTable ? details : {\n          ...details,\n          startTable: isStartTableParentOfEndTable ? Optional.none() : details.startTable,\n          endTable: isEndTableParentOfStartTable ? Optional.none() : details.endTable,\n          isSameTable: false,\n          isMultiTable: false\n        };\n      }).getOr(details);\n    };\n    const adjustQuirksInDetails = details => {\n      return selectionInTableWithNestedTable(details);\n    };\n    const getTableDetailsFromRange = (rng, isRoot) => {\n      const startTable = getTable$1(rng.startContainer, isRoot);\n      const endTable = getTable$1(rng.endContainer, isRoot);\n      const isStartInTable = startTable.isSome();\n      const isEndInTable = endTable.isSome();\n      const isSameTable = lift2(startTable, endTable, eq).getOr(false);\n      const isMultiTable = !isSameTable && isStartInTable && isEndInTable;\n      return adjustQuirksInDetails({\n        startTable,\n        endTable,\n        isStartInTable,\n        isEndInTable,\n        isSameTable,\n        isMultiTable\n      });\n    };\n\n    const tableCellRng = (start, end) => ({\n      start,\n      end\n    });\n    const tableSelection = (rng, table, cells) => ({\n      rng,\n      table,\n      cells\n    });\n    const deleteAction = Adt.generate([\n      {\n        singleCellTable: [\n          'rng',\n          'cell'\n        ]\n      },\n      { fullTable: ['table'] },\n      {\n        partialTable: [\n          'cells',\n          'outsideDetails'\n        ]\n      },\n      {\n        multiTable: [\n          'startTableCells',\n          'endTableCells',\n          'betweenRng'\n        ]\n      }\n    ]);\n    const getClosestCell$1 = (container, isRoot) => closest$3(SugarElement.fromDom(container), 'td,th', isRoot);\n    const isExpandedCellRng = cellRng => !eq(cellRng.start, cellRng.end);\n    const getTableFromCellRng = (cellRng, isRoot) => getClosestTable(cellRng.start, isRoot).bind(startParentTable => getClosestTable(cellRng.end, isRoot).bind(endParentTable => someIf(eq(startParentTable, endParentTable), startParentTable)));\n    const isSingleCellTable = (cellRng, isRoot) => !isExpandedCellRng(cellRng) && getTableFromCellRng(cellRng, isRoot).exists(table => {\n      const rows = table.dom.rows;\n      return rows.length === 1 && rows[0].cells.length === 1;\n    });\n    const getCellRng = (rng, isRoot) => {\n      const startCell = getClosestCell$1(rng.startContainer, isRoot);\n      const endCell = getClosestCell$1(rng.endContainer, isRoot);\n      return lift2(startCell, endCell, tableCellRng);\n    };\n    const getCellRangeFromStartTable = isRoot => startCell => getClosestTable(startCell, isRoot).bind(table => last$2(getTableCells(table)).map(endCell => tableCellRng(startCell, endCell)));\n    const getCellRangeFromEndTable = isRoot => endCell => getClosestTable(endCell, isRoot).bind(table => head(getTableCells(table)).map(startCell => tableCellRng(startCell, endCell)));\n    const getTableSelectionFromCellRng = isRoot => cellRng => getTableFromCellRng(cellRng, isRoot).map(table => tableSelection(cellRng, table, getTableCells(table)));\n    const getTableSelections = (cellRng, selectionDetails, rng, isRoot) => {\n      if (rng.collapsed || !cellRng.forall(isExpandedCellRng)) {\n        return Optional.none();\n      } else if (selectionDetails.isSameTable) {\n        const sameTableSelection = cellRng.bind(getTableSelectionFromCellRng(isRoot));\n        return Optional.some({\n          start: sameTableSelection,\n          end: sameTableSelection\n        });\n      } else {\n        const startCell = getClosestCell$1(rng.startContainer, isRoot);\n        const endCell = getClosestCell$1(rng.endContainer, isRoot);\n        const startTableSelection = startCell.bind(getCellRangeFromStartTable(isRoot)).bind(getTableSelectionFromCellRng(isRoot));\n        const endTableSelection = endCell.bind(getCellRangeFromEndTable(isRoot)).bind(getTableSelectionFromCellRng(isRoot));\n        return Optional.some({\n          start: startTableSelection,\n          end: endTableSelection\n        });\n      }\n    };\n    const getCellIndex = (cells, cell) => findIndex$2(cells, x => eq(x, cell));\n    const getSelectedCells = tableSelection => lift2(getCellIndex(tableSelection.cells, tableSelection.rng.start), getCellIndex(tableSelection.cells, tableSelection.rng.end), (startIndex, endIndex) => tableSelection.cells.slice(startIndex, endIndex + 1));\n    const isSingleCellTableContentSelected = (optCellRng, rng, isRoot) => optCellRng.exists(cellRng => isSingleCellTable(cellRng, isRoot) && hasAllContentsSelected(cellRng.start, rng));\n    const unselectCells = (rng, selectionDetails) => {\n      const {startTable, endTable} = selectionDetails;\n      const otherContentRng = rng.cloneRange();\n      startTable.each(table => otherContentRng.setStartAfter(table.dom));\n      endTable.each(table => otherContentRng.setEndBefore(table.dom));\n      return otherContentRng;\n    };\n    const handleSingleTable = (cellRng, selectionDetails, rng, isRoot) => getTableSelections(cellRng, selectionDetails, rng, isRoot).bind(({start, end}) => start.or(end)).bind(tableSelection => {\n      const {isSameTable} = selectionDetails;\n      const selectedCells = getSelectedCells(tableSelection).getOr([]);\n      if (isSameTable && tableSelection.cells.length === selectedCells.length) {\n        return Optional.some(deleteAction.fullTable(tableSelection.table));\n      } else if (selectedCells.length > 0) {\n        if (isSameTable) {\n          return Optional.some(deleteAction.partialTable(selectedCells, Optional.none()));\n        } else {\n          const otherContentRng = unselectCells(rng, selectionDetails);\n          return Optional.some(deleteAction.partialTable(selectedCells, Optional.some({\n            ...selectionDetails,\n            rng: otherContentRng\n          })));\n        }\n      } else {\n        return Optional.none();\n      }\n    });\n    const handleMultiTable = (cellRng, selectionDetails, rng, isRoot) => getTableSelections(cellRng, selectionDetails, rng, isRoot).bind(({start, end}) => {\n      const startTableSelectedCells = start.bind(getSelectedCells).getOr([]);\n      const endTableSelectedCells = end.bind(getSelectedCells).getOr([]);\n      if (startTableSelectedCells.length > 0 && endTableSelectedCells.length > 0) {\n        const otherContentRng = unselectCells(rng, selectionDetails);\n        return Optional.some(deleteAction.multiTable(startTableSelectedCells, endTableSelectedCells, otherContentRng));\n      } else {\n        return Optional.none();\n      }\n    });\n    const getActionFromRange = (root, rng) => {\n      const isRoot = isRootFromElement(root);\n      const optCellRng = getCellRng(rng, isRoot);\n      const selectionDetails = getTableDetailsFromRange(rng, isRoot);\n      if (isSingleCellTableContentSelected(optCellRng, rng, isRoot)) {\n        return optCellRng.map(cellRng => deleteAction.singleCellTable(rng, cellRng.start));\n      } else if (selectionDetails.isMultiTable) {\n        return handleMultiTable(optCellRng, selectionDetails, rng, isRoot);\n      } else {\n        return handleSingleTable(optCellRng, selectionDetails, rng, isRoot);\n      }\n    };\n\n    const cleanCells = cells => each$e(cells, cell => {\n      remove$9(cell, 'contenteditable');\n      fillWithPaddingBr(cell);\n    });\n    const getOutsideBlock = (editor, container) => Optional.from(editor.dom.getParent(container, editor.dom.isBlock)).map(SugarElement.fromDom);\n    const handleEmptyBlock = (editor, startInTable, emptyBlock) => {\n      emptyBlock.each(block => {\n        if (startInTable) {\n          remove$4(block);\n        } else {\n          fillWithPaddingBr(block);\n          editor.selection.setCursorLocation(block.dom, 0);\n        }\n      });\n    };\n    const deleteContentInsideCell = (editor, cell, rng, isFirstCellInSelection) => {\n      const insideTableRng = rng.cloneRange();\n      if (isFirstCellInSelection) {\n        insideTableRng.setStart(rng.startContainer, rng.startOffset);\n        insideTableRng.setEndAfter(cell.dom.lastChild);\n      } else {\n        insideTableRng.setStartBefore(cell.dom.firstChild);\n        insideTableRng.setEnd(rng.endContainer, rng.endOffset);\n      }\n      deleteCellContents(editor, insideTableRng, cell, false).each(action => action());\n    };\n    const collapseAndRestoreCellSelection = editor => {\n      const selectedCells = getCellsFromEditor(editor);\n      const selectedNode = SugarElement.fromDom(editor.selection.getNode());\n      if (isTableCell$3(selectedNode.dom) && isEmpty$2(editor.schema, selectedNode)) {\n        editor.selection.setCursorLocation(selectedNode.dom, 0);\n      } else {\n        editor.selection.collapse(true);\n      }\n      if (selectedCells.length > 1 && exists(selectedCells, cell => eq(cell, selectedNode))) {\n        set$3(selectedNode, 'data-mce-selected', '1');\n      }\n    };\n    const emptySingleTableCells = (editor, cells, outsideDetails) => Optional.some(() => {\n      const editorRng = editor.selection.getRng();\n      const cellsToClean = outsideDetails.bind(({rng, isStartInTable}) => {\n        const outsideBlock = getOutsideBlock(editor, isStartInTable ? rng.endContainer : rng.startContainer);\n        rng.deleteContents();\n        handleEmptyBlock(editor, isStartInTable, outsideBlock.filter(curry(isEmpty$2, editor.schema)));\n        const endPointCell = isStartInTable ? cells[0] : cells[cells.length - 1];\n        deleteContentInsideCell(editor, endPointCell, editorRng, isStartInTable);\n        if (!isEmpty$2(editor.schema, endPointCell)) {\n          return Optional.some(isStartInTable ? cells.slice(1) : cells.slice(0, -1));\n        } else {\n          return Optional.none();\n        }\n      }).getOr(cells);\n      cleanCells(cellsToClean);\n      collapseAndRestoreCellSelection(editor);\n    });\n    const emptyMultiTableCells = (editor, startTableCells, endTableCells, betweenRng) => Optional.some(() => {\n      const rng = editor.selection.getRng();\n      const startCell = startTableCells[0];\n      const endCell = endTableCells[endTableCells.length - 1];\n      deleteContentInsideCell(editor, startCell, rng, true);\n      deleteContentInsideCell(editor, endCell, rng, false);\n      const startTableCellsToClean = isEmpty$2(editor.schema, startCell) ? startTableCells : startTableCells.slice(1);\n      const endTableCellsToClean = isEmpty$2(editor.schema, endCell) ? endTableCells : endTableCells.slice(0, -1);\n      cleanCells(startTableCellsToClean.concat(endTableCellsToClean));\n      betweenRng.deleteContents();\n      collapseAndRestoreCellSelection(editor);\n    });\n    const deleteCellContents = (editor, rng, cell, moveSelection = true) => Optional.some(() => {\n      deleteRangeContents(editor, rng, cell, moveSelection);\n    });\n    const deleteTableElement = (editor, table) => Optional.some(() => deleteElement$2(editor, false, table));\n    const deleteCellRange = (editor, rootElm, rng) => getActionFromRange(rootElm, rng).bind(action => action.fold(curry(deleteCellContents, editor), curry(deleteTableElement, editor), curry(emptySingleTableCells, editor), curry(emptyMultiTableCells, editor)));\n    const deleteCaptionRange = (editor, caption) => emptyElement(editor, caption);\n    const deleteTableRange = (editor, rootElm, rng, startElm) => getParentCaption(rootElm, startElm).fold(() => deleteCellRange(editor, rootElm, rng), caption => deleteCaptionRange(editor, caption));\n    const deleteRange$3 = (editor, startElm, selectedCells) => {\n      const rootNode = SugarElement.fromDom(editor.getBody());\n      const rng = editor.selection.getRng();\n      return selectedCells.length !== 0 ? emptySingleTableCells(editor, selectedCells, Optional.none()) : deleteTableRange(editor, rootNode, rng, startElm);\n    };\n    const getParentCell = (rootElm, elm) => find$2(parentsAndSelf(elm, rootElm), isTableCell$2);\n    const getParentCaption = (rootElm, elm) => find$2(parentsAndSelf(elm, rootElm), isTag('caption'));\n    const deleteBetweenCells = (editor, rootElm, forward, fromCell, from) => navigate(forward, editor.getBody(), from).bind(to => getParentCell(rootElm, SugarElement.fromDom(to.getNode())).bind(toCell => eq(toCell, fromCell) ? Optional.none() : Optional.some(noop)));\n    const emptyElement = (editor, elm) => Optional.some(() => {\n      fillWithPaddingBr(elm);\n      editor.selection.setCursorLocation(elm.dom, 0);\n    });\n    const isDeleteOfLastCharPos = (fromCaption, forward, from, to) => firstPositionIn(fromCaption.dom).bind(first => lastPositionIn(fromCaption.dom).map(last => forward ? from.isEqual(first) && to.isEqual(last) : from.isEqual(last) && to.isEqual(first))).getOr(true);\n    const emptyCaretCaption = (editor, elm) => emptyElement(editor, elm);\n    const validateCaretCaption = (rootElm, fromCaption, to) => getParentCaption(rootElm, SugarElement.fromDom(to.getNode())).fold(() => Optional.some(noop), toCaption => someIf(!eq(toCaption, fromCaption), noop));\n    const deleteCaretInsideCaption = (editor, rootElm, forward, fromCaption, from) => navigate(forward, editor.getBody(), from).fold(() => Optional.some(noop), to => isDeleteOfLastCharPos(fromCaption, forward, from, to) ? emptyCaretCaption(editor, fromCaption) : validateCaretCaption(rootElm, fromCaption, to));\n    const deleteCaretCells = (editor, forward, rootElm, startElm) => {\n      const from = CaretPosition.fromRangeStart(editor.selection.getRng());\n      return getParentCell(rootElm, startElm).bind(fromCell => isEmpty$2(editor.schema, fromCell, { checkRootAsContent: false }) ? emptyElement(editor, fromCell) : deleteBetweenCells(editor, rootElm, forward, fromCell, from));\n    };\n    const deleteCaretCaption = (editor, forward, rootElm, fromCaption) => {\n      const from = CaretPosition.fromRangeStart(editor.selection.getRng());\n      return isEmpty$2(editor.schema, fromCaption) ? emptyElement(editor, fromCaption) : deleteCaretInsideCaption(editor, rootElm, forward, fromCaption, from);\n    };\n    const isNearTable = (forward, pos) => forward ? isBeforeTable(pos) : isAfterTable(pos);\n    const isBeforeOrAfterTable = (editor, forward) => {\n      const fromPos = CaretPosition.fromRangeStart(editor.selection.getRng());\n      return isNearTable(forward, fromPos) || fromPosition(forward, editor.getBody(), fromPos).exists(pos => isNearTable(forward, pos));\n    };\n    const deleteCaret$3 = (editor, forward, startElm) => {\n      const rootElm = SugarElement.fromDom(editor.getBody());\n      return getParentCaption(rootElm, startElm).fold(() => deleteCaretCells(editor, forward, rootElm, startElm).orThunk(() => someIf(isBeforeOrAfterTable(editor, forward), noop)), fromCaption => deleteCaretCaption(editor, forward, rootElm, fromCaption));\n    };\n    const backspaceDelete$a = (editor, forward) => {\n      const startElm = SugarElement.fromDom(editor.selection.getStart(true));\n      const cells = getCellsFromEditor(editor);\n      return editor.selection.isCollapsed() && cells.length === 0 ? deleteCaret$3(editor, forward, startElm) : deleteRange$3(editor, startElm, cells);\n    };\n\n    const getContentEditableRoot$1 = (root, node) => {\n      let tempNode = node;\n      while (tempNode && tempNode !== root) {\n        if (isContentEditableTrue$3(tempNode) || isContentEditableFalse$b(tempNode)) {\n          return tempNode;\n        }\n        tempNode = tempNode.parentNode;\n      }\n      return null;\n    };\n\n    const internalAttributesPrefixes = [\n      'data-ephox-',\n      'data-mce-',\n      'data-alloy-',\n      'data-snooker-',\n      '_'\n    ];\n    const each$9 = Tools.each;\n    const ElementUtils = editor => {\n      const dom = editor.dom;\n      const internalAttributes = new Set(editor.serializer.getTempAttrs());\n      const compare = (node1, node2) => {\n        if (node1.nodeName !== node2.nodeName || node1.nodeType !== node2.nodeType) {\n          return false;\n        }\n        const getAttribs = node => {\n          const attribs = {};\n          each$9(dom.getAttribs(node), attr => {\n            const name = attr.nodeName.toLowerCase();\n            if (name !== 'style' && !isAttributeInternal(name)) {\n              attribs[name] = dom.getAttrib(node, name);\n            }\n          });\n          return attribs;\n        };\n        const compareObjects = (obj1, obj2) => {\n          for (const name in obj1) {\n            if (has$2(obj1, name)) {\n              const value = obj2[name];\n              if (isUndefined(value)) {\n                return false;\n              }\n              if (obj1[name] !== value) {\n                return false;\n              }\n              delete obj2[name];\n            }\n          }\n          for (const name in obj2) {\n            if (has$2(obj2, name)) {\n              return false;\n            }\n          }\n          return true;\n        };\n        if (isElement$6(node1) && isElement$6(node2)) {\n          if (!compareObjects(getAttribs(node1), getAttribs(node2))) {\n            return false;\n          }\n          if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style')))) {\n            return false;\n          }\n        }\n        return !isBookmarkNode$1(node1) && !isBookmarkNode$1(node2);\n      };\n      const isAttributeInternal = attributeName => exists(internalAttributesPrefixes, value => startsWith(attributeName, value)) || internalAttributes.has(attributeName);\n      return {\n        compare,\n        isAttributeInternal\n      };\n    };\n\n    const isHeading = node => [\n      'h1',\n      'h2',\n      'h3',\n      'h4',\n      'h5',\n      'h6'\n    ].includes(node.name);\n    const isSummary = node => node.name === 'summary';\n\n    const traverse = (root, fn) => {\n      let node = root;\n      while (node = node.walk()) {\n        fn(node);\n      }\n    };\n    const matchNode$1 = (nodeFilters, attributeFilters, node, matches) => {\n      const name = node.name;\n      for (let ni = 0, nl = nodeFilters.length; ni < nl; ni++) {\n        const filter = nodeFilters[ni];\n        if (filter.name === name) {\n          const match = matches.nodes[name];\n          if (match) {\n            match.nodes.push(node);\n          } else {\n            matches.nodes[name] = {\n              filter,\n              nodes: [node]\n            };\n          }\n        }\n      }\n      if (node.attributes) {\n        for (let ai = 0, al = attributeFilters.length; ai < al; ai++) {\n          const filter = attributeFilters[ai];\n          const attrName = filter.name;\n          if (attrName in node.attributes.map) {\n            const match = matches.attributes[attrName];\n            if (match) {\n              match.nodes.push(node);\n            } else {\n              matches.attributes[attrName] = {\n                filter,\n                nodes: [node]\n              };\n            }\n          }\n        }\n      }\n    };\n    const findMatchingNodes = (nodeFilters, attributeFilters, node) => {\n      const matches = {\n        nodes: {},\n        attributes: {}\n      };\n      if (node.firstChild) {\n        traverse(node, childNode => {\n          matchNode$1(nodeFilters, attributeFilters, childNode, matches);\n        });\n      }\n      return matches;\n    };\n    const runFilters = (matches, args) => {\n      const run = (matchRecord, filteringAttributes) => {\n        each$d(matchRecord, match => {\n          const nodes = from(match.nodes);\n          each$e(match.filter.callbacks, callback => {\n            for (let i = nodes.length - 1; i >= 0; i--) {\n              const node = nodes[i];\n              const valueMatches = filteringAttributes ? node.attr(match.filter.name) !== undefined : node.name === match.filter.name;\n              if (!valueMatches || isNullable(node.parent)) {\n                nodes.splice(i, 1);\n              }\n            }\n            if (nodes.length > 0) {\n              callback(nodes, match.filter.name, args);\n            }\n          });\n        });\n      };\n      run(matches.nodes, false);\n      run(matches.attributes, true);\n    };\n    const filter$2 = (nodeFilters, attributeFilters, node, args = {}) => {\n      const matches = findMatchingNodes(nodeFilters, attributeFilters, node);\n      runFilters(matches, args);\n    };\n\n    const paddEmptyNode = (settings, args, isBlock, node) => {\n      const brPreferred = settings.pad_empty_with_br || args.insert;\n      if (brPreferred && isBlock(node)) {\n        const astNode = new AstNode('br', 1);\n        if (args.insert) {\n          astNode.attr('data-mce-bogus', '1');\n        }\n        node.empty().append(astNode);\n      } else {\n        node.empty().append(new AstNode('#text', 3)).value = nbsp;\n      }\n    };\n    const isPaddedWithNbsp = node => {\n      var _a;\n      return hasOnlyChild(node, '#text') && ((_a = node === null || node === void 0 ? void 0 : node.firstChild) === null || _a === void 0 ? void 0 : _a.value) === nbsp;\n    };\n    const hasOnlyChild = (node, name) => {\n      const firstChild = node === null || node === void 0 ? void 0 : node.firstChild;\n      return isNonNullable(firstChild) && firstChild === node.lastChild && firstChild.name === name;\n    };\n    const isPadded = (schema, node) => {\n      const rule = schema.getElementRule(node.name);\n      return (rule === null || rule === void 0 ? void 0 : rule.paddEmpty) === true;\n    };\n    const isEmpty = (schema, nonEmptyElements, whitespaceElements, node) => node.isEmpty(nonEmptyElements, whitespaceElements, node => isPadded(schema, node));\n    const isLineBreakNode = (node, isBlock) => isNonNullable(node) && (isBlock(node) || node.name === 'br');\n    const findClosestEditingHost = scope => {\n      let editableNode;\n      for (let node = scope; node; node = node.parent) {\n        const contentEditable = node.attr('contenteditable');\n        if (contentEditable === 'false') {\n          break;\n        } else if (contentEditable === 'true') {\n          editableNode = node;\n        }\n      }\n      return Optional.from(editableNode);\n    };\n\n    const removeOrUnwrapInvalidNode = (node, schema, originalNodeParent = node.parent) => {\n      if (schema.getSpecialElements()[node.name]) {\n        node.empty().remove();\n      } else {\n        const children = node.children();\n        for (const childNode of children) {\n          if (originalNodeParent && !schema.isValidChild(originalNodeParent.name, childNode.name)) {\n            removeOrUnwrapInvalidNode(childNode, schema, originalNodeParent);\n          }\n        }\n        node.unwrap();\n      }\n    };\n    const cleanInvalidNodes = (nodes, schema, rootNode, onCreate = noop) => {\n      const textBlockElements = schema.getTextBlockElements();\n      const nonEmptyElements = schema.getNonEmptyElements();\n      const whitespaceElements = schema.getWhitespaceElements();\n      const nonSplittableElements = Tools.makeMap('tr,td,th,tbody,thead,tfoot,table,summary');\n      const fixed = new Set();\n      const isSplittableElement = node => node !== rootNode && !nonSplittableElements[node.name];\n      for (let ni = 0; ni < nodes.length; ni++) {\n        const node = nodes[ni];\n        let parent;\n        let newParent;\n        let tempNode;\n        if (!node.parent || fixed.has(node)) {\n          continue;\n        }\n        if (textBlockElements[node.name] && node.parent.name === 'li') {\n          let sibling = node.next;\n          while (sibling) {\n            if (textBlockElements[sibling.name]) {\n              sibling.name = 'li';\n              fixed.add(sibling);\n              node.parent.insert(sibling, node.parent);\n            } else {\n              break;\n            }\n            sibling = sibling.next;\n          }\n          node.unwrap();\n          continue;\n        }\n        const parents = [node];\n        for (parent = node.parent; parent && !schema.isValidChild(parent.name, node.name) && isSplittableElement(parent); parent = parent.parent) {\n          parents.push(parent);\n        }\n        if (parent && parents.length > 1) {\n          if (!isInvalid(schema, node, parent)) {\n            parents.reverse();\n            newParent = parents[0].clone();\n            onCreate(newParent);\n            let currentNode = newParent;\n            for (let i = 0; i < parents.length - 1; i++) {\n              if (schema.isValidChild(currentNode.name, parents[i].name) && i > 0) {\n                tempNode = parents[i].clone();\n                onCreate(tempNode);\n                currentNode.append(tempNode);\n              } else {\n                tempNode = currentNode;\n              }\n              for (let childNode = parents[i].firstChild; childNode && childNode !== parents[i + 1];) {\n                const nextNode = childNode.next;\n                tempNode.append(childNode);\n                childNode = nextNode;\n              }\n              currentNode = tempNode;\n            }\n            if (!isEmpty(schema, nonEmptyElements, whitespaceElements, newParent)) {\n              parent.insert(newParent, parents[0], true);\n              parent.insert(node, newParent);\n            } else {\n              parent.insert(node, parents[0], true);\n            }\n            parent = parents[0];\n            if (isEmpty(schema, nonEmptyElements, whitespaceElements, parent) || hasOnlyChild(parent, 'br')) {\n              parent.empty().remove();\n            }\n          } else {\n            removeOrUnwrapInvalidNode(node, schema);\n          }\n        } else if (node.parent) {\n          if (node.name === 'li') {\n            let sibling = node.prev;\n            if (sibling && (sibling.name === 'ul' || sibling.name === 'ol')) {\n              sibling.append(node);\n              continue;\n            }\n            sibling = node.next;\n            if (sibling && (sibling.name === 'ul' || sibling.name === 'ol') && sibling.firstChild) {\n              sibling.insert(node, sibling.firstChild, true);\n              continue;\n            }\n            const wrapper = new AstNode('ul', 1);\n            onCreate(wrapper);\n            node.wrap(wrapper);\n            continue;\n          }\n          if (schema.isValidChild(node.parent.name, 'div') && schema.isValidChild('div', node.name)) {\n            const wrapper = new AstNode('div', 1);\n            onCreate(wrapper);\n            node.wrap(wrapper);\n          } else {\n            removeOrUnwrapInvalidNode(node, schema);\n          }\n        }\n      }\n    };\n    const hasClosest = (node, parentName) => {\n      let tempNode = node;\n      while (tempNode) {\n        if (tempNode.name === parentName) {\n          return true;\n        }\n        tempNode = tempNode.parent;\n      }\n      return false;\n    };\n    const isInvalid = (schema, node, parent = node.parent) => {\n      if (!parent) {\n        return false;\n      }\n      if (schema.children[node.name] && !schema.isValidChild(parent.name, node.name)) {\n        return true;\n      }\n      if (node.name === 'a' && hasClosest(parent, 'a')) {\n        return true;\n      }\n      if (isSummary(parent) && isHeading(node)) {\n        return !((parent === null || parent === void 0 ? void 0 : parent.firstChild) === node && (parent === null || parent === void 0 ? void 0 : parent.lastChild) === node);\n      }\n      return false;\n    };\n\n    const createRange = (sc, so, ec, eo) => {\n      const rng = document.createRange();\n      rng.setStart(sc, so);\n      rng.setEnd(ec, eo);\n      return rng;\n    };\n    const normalizeBlockSelectionRange = rng => {\n      const startPos = CaretPosition.fromRangeStart(rng);\n      const endPos = CaretPosition.fromRangeEnd(rng);\n      const rootNode = rng.commonAncestorContainer;\n      return fromPosition(false, rootNode, endPos).map(newEndPos => {\n        if (!isInSameBlock(startPos, endPos, rootNode) && isInSameBlock(startPos, newEndPos, rootNode)) {\n          return createRange(startPos.container(), startPos.offset(), newEndPos.container(), newEndPos.offset());\n        } else {\n          return rng;\n        }\n      }).getOr(rng);\n    };\n    const normalize = rng => rng.collapsed ? rng : normalizeBlockSelectionRange(rng);\n\n    const hasOnlyOneChild$1 = node => {\n      return isNonNullable(node.firstChild) && node.firstChild === node.lastChild;\n    };\n    const isPaddingNode = node => {\n      return node.name === 'br' || node.value === nbsp;\n    };\n    const isPaddedEmptyBlock = (schema, node) => {\n      const blockElements = schema.getBlockElements();\n      return blockElements[node.name] && hasOnlyOneChild$1(node) && isPaddingNode(node.firstChild);\n    };\n    const isEmptyFragmentElement = (schema, node) => {\n      const nonEmptyElements = schema.getNonEmptyElements();\n      return isNonNullable(node) && (node.isEmpty(nonEmptyElements) || isPaddedEmptyBlock(schema, node));\n    };\n    const isListFragment = (schema, fragment) => {\n      let firstChild = fragment.firstChild;\n      let lastChild = fragment.lastChild;\n      if (firstChild && firstChild.name === 'meta') {\n        firstChild = firstChild.next;\n      }\n      if (lastChild && lastChild.attr('id') === 'mce_marker') {\n        lastChild = lastChild.prev;\n      }\n      if (isEmptyFragmentElement(schema, lastChild)) {\n        lastChild = lastChild === null || lastChild === void 0 ? void 0 : lastChild.prev;\n      }\n      if (!firstChild || firstChild !== lastChild) {\n        return false;\n      }\n      return firstChild.name === 'ul' || firstChild.name === 'ol';\n    };\n    const cleanupDomFragment = domFragment => {\n      var _a, _b;\n      const firstChild = domFragment.firstChild;\n      const lastChild = domFragment.lastChild;\n      if (firstChild && firstChild.nodeName === 'META') {\n        (_a = firstChild.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(firstChild);\n      }\n      if (lastChild && lastChild.id === 'mce_marker') {\n        (_b = lastChild.parentNode) === null || _b === void 0 ? void 0 : _b.removeChild(lastChild);\n      }\n      return domFragment;\n    };\n    const toDomFragment = (dom, serializer, fragment) => {\n      const html = serializer.serialize(fragment);\n      const domFragment = dom.createFragment(html);\n      return cleanupDomFragment(domFragment);\n    };\n    const listItems = elm => {\n      var _a;\n      return filter$5((_a = elm === null || elm === void 0 ? void 0 : elm.childNodes) !== null && _a !== void 0 ? _a : [], child => {\n        return child.nodeName === 'LI';\n      });\n    };\n    const isPadding = node => {\n      return node.data === nbsp || isBr$6(node);\n    };\n    const isListItemPadded = node => {\n      return isNonNullable(node === null || node === void 0 ? void 0 : node.firstChild) && node.firstChild === node.lastChild && isPadding(node.firstChild);\n    };\n    const isEmptyOrPadded = elm => {\n      return !elm.firstChild || isListItemPadded(elm);\n    };\n    const trimListItems = elms => {\n      return elms.length > 0 && isEmptyOrPadded(elms[elms.length - 1]) ? elms.slice(0, -1) : elms;\n    };\n    const getParentLi = (dom, node) => {\n      const parentBlock = dom.getParent(node, dom.isBlock);\n      return parentBlock && parentBlock.nodeName === 'LI' ? parentBlock : null;\n    };\n    const isParentBlockLi = (dom, node) => {\n      return !!getParentLi(dom, node);\n    };\n    const getSplit = (parentNode, rng) => {\n      const beforeRng = rng.cloneRange();\n      const afterRng = rng.cloneRange();\n      beforeRng.setStartBefore(parentNode);\n      afterRng.setEndAfter(parentNode);\n      return [\n        beforeRng.cloneContents(),\n        afterRng.cloneContents()\n      ];\n    };\n    const findFirstIn = (node, rootNode) => {\n      const caretPos = CaretPosition.before(node);\n      const caretWalker = CaretWalker(rootNode);\n      const newCaretPos = caretWalker.next(caretPos);\n      return newCaretPos ? newCaretPos.toRange() : null;\n    };\n    const findLastOf = (node, rootNode) => {\n      const caretPos = CaretPosition.after(node);\n      const caretWalker = CaretWalker(rootNode);\n      const newCaretPos = caretWalker.prev(caretPos);\n      return newCaretPos ? newCaretPos.toRange() : null;\n    };\n    const insertMiddle = (target, elms, rootNode, rng) => {\n      const parts = getSplit(target, rng);\n      const parentElm = target.parentNode;\n      if (parentElm) {\n        parentElm.insertBefore(parts[0], target);\n        Tools.each(elms, li => {\n          parentElm.insertBefore(li, target);\n        });\n        parentElm.insertBefore(parts[1], target);\n        parentElm.removeChild(target);\n      }\n      return findLastOf(elms[elms.length - 1], rootNode);\n    };\n    const insertBefore$2 = (target, elms, rootNode) => {\n      const parentElm = target.parentNode;\n      if (parentElm) {\n        Tools.each(elms, elm => {\n          parentElm.insertBefore(elm, target);\n        });\n      }\n      return findFirstIn(target, rootNode);\n    };\n    const insertAfter$2 = (target, elms, rootNode, dom) => {\n      dom.insertAfter(elms.reverse(), target);\n      return findLastOf(elms[0], rootNode);\n    };\n    const insertAtCaret$1 = (serializer, dom, rng, fragment) => {\n      const domFragment = toDomFragment(dom, serializer, fragment);\n      const liTarget = getParentLi(dom, rng.startContainer);\n      const liElms = trimListItems(listItems(domFragment.firstChild));\n      const BEGINNING = 1, END = 2;\n      const rootNode = dom.getRoot();\n      const isAt = location => {\n        const caretPos = CaretPosition.fromRangeStart(rng);\n        const caretWalker = CaretWalker(dom.getRoot());\n        const newPos = location === BEGINNING ? caretWalker.prev(caretPos) : caretWalker.next(caretPos);\n        const newPosNode = newPos === null || newPos === void 0 ? void 0 : newPos.getNode();\n        return newPosNode ? getParentLi(dom, newPosNode) !== liTarget : true;\n      };\n      if (!liTarget) {\n        return null;\n      } else if (isAt(BEGINNING)) {\n        return insertBefore$2(liTarget, liElms, rootNode);\n      } else if (isAt(END)) {\n        return insertAfter$2(liTarget, liElms, rootNode, dom);\n      } else {\n        return insertMiddle(liTarget, liElms, rootNode, rng);\n      }\n    };\n\n    const mergeableWrappedElements = ['pre'];\n    const shouldPasteContentOnly = (dom, fragment, parentNode, root) => {\n      var _a;\n      const firstNode = fragment.firstChild;\n      const lastNode = fragment.lastChild;\n      const last = lastNode.attr('data-mce-type') === 'bookmark' ? lastNode.prev : lastNode;\n      const isPastingSingleElement = firstNode === last;\n      const isWrappedElement = contains$2(mergeableWrappedElements, firstNode.name);\n      if (isPastingSingleElement && isWrappedElement) {\n        const isContentEditable = firstNode.attr('contenteditable') !== 'false';\n        const isPastingInTheSameBlockTag = ((_a = dom.getParent(parentNode, dom.isBlock)) === null || _a === void 0 ? void 0 : _a.nodeName.toLowerCase()) === firstNode.name;\n        const isPastingInContentEditable = Optional.from(getContentEditableRoot$1(root, parentNode)).forall(isContentEditableTrue$3);\n        return isContentEditable && isPastingInTheSameBlockTag && isPastingInContentEditable;\n      } else {\n        return false;\n      }\n    };\n    const isTableCell = isTableCell$3;\n    const isTableCellContentSelected = (dom, rng, cell) => {\n      if (isNonNullable(cell)) {\n        const endCell = dom.getParent(rng.endContainer, isTableCell);\n        return cell === endCell && hasAllContentsSelected(SugarElement.fromDom(cell), rng);\n      } else {\n        return false;\n      }\n    };\n    const validInsertion = (editor, value, parentNode) => {\n      var _a;\n      if (parentNode.getAttribute('data-mce-bogus') === 'all') {\n        (_a = parentNode.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(editor.dom.createFragment(value), parentNode);\n      } else {\n        const node = parentNode.firstChild;\n        const node2 = parentNode.lastChild;\n        if (!node || node === node2 && node.nodeName === 'BR') {\n          editor.dom.setHTML(parentNode, value);\n        } else {\n          editor.selection.setContent(value, { no_events: true });\n        }\n      }\n    };\n    const trimBrsFromTableCell = (dom, elm, schema) => {\n      Optional.from(dom.getParent(elm, 'td,th')).map(SugarElement.fromDom).each(el => trimBlockTrailingBr(el, schema));\n    };\n    const reduceInlineTextElements = (editor, merge) => {\n      const textInlineElements = editor.schema.getTextInlineElements();\n      const dom = editor.dom;\n      if (merge) {\n        const root = editor.getBody();\n        const elementUtils = ElementUtils(editor);\n        Tools.each(dom.select('*[data-mce-fragment]'), node => {\n          const isInline = isNonNullable(textInlineElements[node.nodeName.toLowerCase()]);\n          if (isInline && hasInheritableStyles(dom, node)) {\n            for (let parentNode = node.parentElement; isNonNullable(parentNode) && parentNode !== root; parentNode = parentNode.parentElement) {\n              const styleConflict = hasStyleConflict(dom, node, parentNode);\n              if (styleConflict) {\n                break;\n              }\n              if (elementUtils.compare(parentNode, node)) {\n                dom.remove(node, true);\n                break;\n              }\n            }\n          }\n        });\n      }\n    };\n    const markFragmentElements = fragment => {\n      let node = fragment;\n      while (node = node.walk()) {\n        if (node.type === 1) {\n          node.attr('data-mce-fragment', '1');\n        }\n      }\n    };\n    const unmarkFragmentElements = elm => {\n      Tools.each(elm.getElementsByTagName('*'), elm => {\n        elm.removeAttribute('data-mce-fragment');\n      });\n    };\n    const isPartOfFragment = node => {\n      return !!node.getAttribute('data-mce-fragment');\n    };\n    const canHaveChildren = (editor, node) => {\n      return isNonNullable(node) && !editor.schema.getVoidElements()[node.nodeName];\n    };\n    const moveSelectionToMarker = (editor, marker) => {\n      var _a, _b, _c;\n      let nextRng;\n      const dom = editor.dom;\n      const selection = editor.selection;\n      if (!marker) {\n        return;\n      }\n      selection.scrollIntoView(marker);\n      const parentEditableElm = getContentEditableRoot$1(editor.getBody(), marker);\n      if (parentEditableElm && dom.getContentEditable(parentEditableElm) === 'false') {\n        dom.remove(marker);\n        selection.select(parentEditableElm);\n        return;\n      }\n      let rng = dom.createRng();\n      const node = marker.previousSibling;\n      if (isText$b(node)) {\n        rng.setStart(node, (_b = (_a = node.nodeValue) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0);\n        const node2 = marker.nextSibling;\n        if (isText$b(node2)) {\n          node.appendData(node2.data);\n          (_c = node2.parentNode) === null || _c === void 0 ? void 0 : _c.removeChild(node2);\n        }\n      } else {\n        rng.setStartBefore(marker);\n        rng.setEndBefore(marker);\n      }\n      const findNextCaretRng = rng => {\n        let caretPos = CaretPosition.fromRangeStart(rng);\n        const caretWalker = CaretWalker(editor.getBody());\n        caretPos = caretWalker.next(caretPos);\n        return caretPos === null || caretPos === void 0 ? void 0 : caretPos.toRange();\n      };\n      const parentBlock = dom.getParent(marker, dom.isBlock);\n      dom.remove(marker);\n      if (parentBlock && dom.isEmpty(parentBlock)) {\n        const isCell = isTableCell(parentBlock);\n        empty(SugarElement.fromDom(parentBlock));\n        rng.setStart(parentBlock, 0);\n        rng.setEnd(parentBlock, 0);\n        if (!isCell && !isPartOfFragment(parentBlock) && (nextRng = findNextCaretRng(rng))) {\n          rng = nextRng;\n          dom.remove(parentBlock);\n        } else {\n          dom.add(parentBlock, dom.create('br', isCell ? {} : { 'data-mce-bogus': '1' }));\n        }\n      }\n      selection.setRng(rng);\n    };\n    const deleteSelectedContent = editor => {\n      const dom = editor.dom;\n      const rng = normalize(editor.selection.getRng());\n      editor.selection.setRng(rng);\n      const startCell = dom.getParent(rng.startContainer, isTableCell);\n      if (isTableCellContentSelected(dom, rng, startCell)) {\n        deleteCellContents(editor, rng, SugarElement.fromDom(startCell));\n      } else if (rng.startContainer === rng.endContainer && rng.endOffset - rng.startOffset === 1 && isText$b(rng.startContainer.childNodes[rng.startOffset])) {\n        rng.deleteContents();\n      } else {\n        editor.getDoc().execCommand('Delete', false);\n      }\n    };\n    const findMarkerNode = scope => {\n      for (let markerNode = scope; markerNode; markerNode = markerNode.walk()) {\n        if (markerNode.attr('id') === 'mce_marker') {\n          return Optional.some(markerNode);\n        }\n      }\n      return Optional.none();\n    };\n    const notHeadingsInSummary = (dom, node, fragment) => {\n      var _a;\n      return exists(fragment.children(), isHeading) && ((_a = dom.getParent(node, dom.isBlock)) === null || _a === void 0 ? void 0 : _a.nodeName) === 'SUMMARY';\n    };\n    const insertHtmlAtCaret = (editor, value, details) => {\n      var _a, _b;\n      const selection = editor.selection;\n      const dom = editor.dom;\n      const parser = editor.parser;\n      const merge = details.merge;\n      const serializer = HtmlSerializer({ validate: true }, editor.schema);\n      const bookmarkHtml = '<span id=\"mce_marker\" data-mce-type=\"bookmark\">&#xFEFF;</span>';\n      if (!details.preserve_zwsp) {\n        value = trim$2(value);\n      }\n      if (value.indexOf('{$caret}') === -1) {\n        value += '{$caret}';\n      }\n      value = value.replace(/\\{\\$caret\\}/, bookmarkHtml);\n      let rng = selection.getRng();\n      const caretElement = rng.startContainer;\n      const body = editor.getBody();\n      if (caretElement === body && selection.isCollapsed()) {\n        if (dom.isBlock(body.firstChild) && canHaveChildren(editor, body.firstChild) && dom.isEmpty(body.firstChild)) {\n          rng = dom.createRng();\n          rng.setStart(body.firstChild, 0);\n          rng.setEnd(body.firstChild, 0);\n          selection.setRng(rng);\n        }\n      }\n      if (!selection.isCollapsed()) {\n        deleteSelectedContent(editor);\n      }\n      const parentNode = selection.getNode();\n      const parserArgs = {\n        context: parentNode.nodeName.toLowerCase(),\n        data: details.data,\n        insert: true\n      };\n      const fragment = parser.parse(value, parserArgs);\n      if (details.paste === true && isListFragment(editor.schema, fragment) && isParentBlockLi(dom, parentNode)) {\n        rng = insertAtCaret$1(serializer, dom, selection.getRng(), fragment);\n        if (rng) {\n          selection.setRng(rng);\n        }\n        return value;\n      }\n      if (details.paste === true && shouldPasteContentOnly(dom, fragment, parentNode, editor.getBody())) {\n        (_a = fragment.firstChild) === null || _a === void 0 ? void 0 : _a.unwrap();\n      }\n      markFragmentElements(fragment);\n      let node = fragment.lastChild;\n      if (node && node.attr('id') === 'mce_marker') {\n        const marker = node;\n        for (node = node.prev; node; node = node.walk(true)) {\n          if (node.type === 3 || !dom.isBlock(node.name)) {\n            if (node.parent && editor.schema.isValidChild(node.parent.name, 'span')) {\n              node.parent.insert(marker, node, node.name === 'br');\n            }\n            break;\n          }\n        }\n      }\n      editor._selectionOverrides.showBlockCaretContainer(parentNode);\n      if (!parserArgs.invalid && !notHeadingsInSummary(dom, parentNode, fragment)) {\n        value = serializer.serialize(fragment);\n        validInsertion(editor, value, parentNode);\n      } else {\n        editor.selection.setContent(bookmarkHtml);\n        let parentNode = selection.getNode();\n        let tempNode;\n        const rootNode = editor.getBody();\n        if (isDocument$1(parentNode)) {\n          parentNode = tempNode = rootNode;\n        } else {\n          tempNode = parentNode;\n        }\n        while (tempNode && tempNode !== rootNode) {\n          parentNode = tempNode;\n          tempNode = tempNode.parentNode;\n        }\n        value = parentNode === rootNode ? rootNode.innerHTML : dom.getOuterHTML(parentNode);\n        const root = parser.parse(value);\n        const markerNode = findMarkerNode(root);\n        const editingHost = markerNode.bind(findClosestEditingHost).getOr(root);\n        markerNode.each(marker => marker.replace(fragment));\n        const toExtract = fragment.children();\n        const parent = (_b = fragment.parent) !== null && _b !== void 0 ? _b : root;\n        fragment.unwrap();\n        const invalidChildren = filter$5(toExtract, node => isInvalid(editor.schema, node, parent));\n        cleanInvalidNodes(invalidChildren, editor.schema, editingHost);\n        filter$2(parser.getNodeFilters(), parser.getAttributeFilters(), root);\n        value = serializer.serialize(root);\n        if (parentNode === rootNode) {\n          dom.setHTML(rootNode, value);\n        } else {\n          dom.setOuterHTML(parentNode, value);\n        }\n      }\n      reduceInlineTextElements(editor, merge);\n      moveSelectionToMarker(editor, dom.get('mce_marker'));\n      unmarkFragmentElements(editor.getBody());\n      trimBrsFromTableCell(dom, selection.getStart(), editor.schema);\n      updateCaret(editor.schema, editor.getBody(), selection.getStart());\n      return value;\n    };\n\n    const isTreeNode = content => content instanceof AstNode;\n\n    const moveSelection = editor => {\n      if (hasFocus(editor)) {\n        firstPositionIn(editor.getBody()).each(pos => {\n          const node = pos.getNode();\n          const caretPos = isTable$2(node) ? firstPositionIn(node).getOr(pos) : pos;\n          editor.selection.setRng(caretPos.toRange());\n        });\n      }\n    };\n    const setEditorHtml = (editor, html, noSelection) => {\n      editor.dom.setHTML(editor.getBody(), html);\n      if (noSelection !== true) {\n        moveSelection(editor);\n      }\n    };\n    const setContentString = (editor, body, content, args) => {\n      content = trim$2(content);\n      if (content.length === 0 || /^\\s+$/.test(content)) {\n        const padd = '<br data-mce-bogus=\"1\">';\n        if (body.nodeName === 'TABLE') {\n          content = '<tr><td>' + padd + '</td></tr>';\n        } else if (/^(UL|OL)$/.test(body.nodeName)) {\n          content = '<li>' + padd + '</li>';\n        }\n        const forcedRootBlockName = getForcedRootBlock(editor);\n        if (editor.schema.isValidChild(body.nodeName.toLowerCase(), forcedRootBlockName.toLowerCase())) {\n          content = padd;\n          content = editor.dom.createHTML(forcedRootBlockName, getForcedRootBlockAttrs(editor), content);\n        } else if (!content) {\n          content = padd;\n        }\n        setEditorHtml(editor, content, args.no_selection);\n        return {\n          content,\n          html: content\n        };\n      } else {\n        if (args.format !== 'raw') {\n          content = HtmlSerializer({ validate: false }, editor.schema).serialize(editor.parser.parse(content, {\n            isRootContent: true,\n            insert: true\n          }));\n        }\n        const trimmedHtml = isWsPreserveElement(SugarElement.fromDom(body)) ? content : Tools.trim(content);\n        setEditorHtml(editor, trimmedHtml, args.no_selection);\n        return {\n          content: trimmedHtml,\n          html: trimmedHtml\n        };\n      }\n    };\n    const setContentTree = (editor, body, content, args) => {\n      filter$2(editor.parser.getNodeFilters(), editor.parser.getAttributeFilters(), content);\n      const html = HtmlSerializer({ validate: false }, editor.schema).serialize(content);\n      const trimmedHtml = trim$2(isWsPreserveElement(SugarElement.fromDom(body)) ? html : Tools.trim(html));\n      setEditorHtml(editor, trimmedHtml, args.no_selection);\n      return {\n        content,\n        html: trimmedHtml\n      };\n    };\n    const setContentInternal = (editor, content, args) => {\n      return Optional.from(editor.getBody()).map(body => {\n        if (isTreeNode(content)) {\n          return setContentTree(editor, body, content, args);\n        } else {\n          return setContentString(editor, body, content, args);\n        }\n      }).getOr({\n        content,\n        html: isTreeNode(args.content) ? '' : args.content\n      });\n    };\n\n    const ensureIsRoot = isRoot => isFunction(isRoot) ? isRoot : never;\n    const ancestor = (scope, transform, isRoot) => {\n      let element = scope.dom;\n      const stop = ensureIsRoot(isRoot);\n      while (element.parentNode) {\n        element = element.parentNode;\n        const el = SugarElement.fromDom(element);\n        const transformed = transform(el);\n        if (transformed.isSome()) {\n          return transformed;\n        } else if (stop(el)) {\n          break;\n        }\n      }\n      return Optional.none();\n    };\n    const closest$1 = (scope, transform, isRoot) => {\n      const current = transform(scope);\n      const stop = ensureIsRoot(isRoot);\n      return current.orThunk(() => stop(scope) ? Optional.none() : ancestor(scope, transform, stop));\n    };\n\n    const isEq$3 = isEq$5;\n    const matchesUnInheritedFormatSelector = (ed, node, name) => {\n      const formatList = ed.formatter.get(name);\n      if (formatList) {\n        for (let i = 0; i < formatList.length; i++) {\n          const format = formatList[i];\n          if (isSelectorFormat(format) && format.inherit === false && ed.dom.is(node, format.selector)) {\n            return true;\n          }\n        }\n      }\n      return false;\n    };\n    const matchParents = (editor, node, name, vars, similar) => {\n      const root = editor.dom.getRoot();\n      if (node === root) {\n        return false;\n      }\n      const matchedNode = editor.dom.getParent(node, elm => {\n        if (matchesUnInheritedFormatSelector(editor, elm, name)) {\n          return true;\n        }\n        return elm.parentNode === root || !!matchNode(editor, elm, name, vars, true);\n      });\n      return !!matchNode(editor, matchedNode, name, vars, similar);\n    };\n    const matchName = (dom, node, format) => {\n      if (isInlineFormat(format) && isEq$3(node, format.inline)) {\n        return true;\n      }\n      if (isBlockFormat(format) && isEq$3(node, format.block)) {\n        return true;\n      }\n      if (isSelectorFormat(format)) {\n        return isElement$6(node) && dom.is(node, format.selector);\n      }\n      return false;\n    };\n    const matchItems = (dom, node, format, itemName, similar, vars) => {\n      const items = format[itemName];\n      const matchAttributes = itemName === 'attributes';\n      if (isFunction(format.onmatch)) {\n        return format.onmatch(node, format, itemName);\n      }\n      if (items) {\n        if (!isArrayLike(items)) {\n          for (const key in items) {\n            if (has$2(items, key)) {\n              const value = matchAttributes ? dom.getAttrib(node, key) : getStyle(dom, node, key);\n              const expectedValue = replaceVars(items[key], vars);\n              const isEmptyValue = isNullable(value) || isEmpty$3(value);\n              if (isEmptyValue && isNullable(expectedValue)) {\n                continue;\n              }\n              if (similar && isEmptyValue && !format.exact) {\n                return false;\n              }\n              if ((!similar || format.exact) && !isEq$3(value, normalizeStyleValue(expectedValue, key))) {\n                return false;\n              }\n            }\n          }\n        } else {\n          for (let i = 0; i < items.length; i++) {\n            if (matchAttributes ? dom.getAttrib(node, items[i]) : getStyle(dom, node, items[i])) {\n              return true;\n            }\n          }\n        }\n      }\n      return true;\n    };\n    const matchNode = (ed, node, name, vars, similar) => {\n      const formatList = ed.formatter.get(name);\n      const dom = ed.dom;\n      if (formatList && isElement$6(node)) {\n        for (let i = 0; i < formatList.length; i++) {\n          const format = formatList[i];\n          if (matchName(ed.dom, node, format) && matchItems(dom, node, format, 'attributes', similar, vars) && matchItems(dom, node, format, 'styles', similar, vars)) {\n            const classes = format.classes;\n            if (classes) {\n              for (let x = 0; x < classes.length; x++) {\n                if (!ed.dom.hasClass(node, replaceVars(classes[x], vars))) {\n                  return;\n                }\n              }\n            }\n            return format;\n          }\n        }\n      }\n      return undefined;\n    };\n    const match$2 = (editor, name, vars, node, similar) => {\n      if (node) {\n        return matchParents(editor, node, name, vars, similar);\n      }\n      node = editor.selection.getNode();\n      if (matchParents(editor, node, name, vars, similar)) {\n        return true;\n      }\n      const startNode = editor.selection.getStart();\n      if (startNode !== node) {\n        if (matchParents(editor, startNode, name, vars, similar)) {\n          return true;\n        }\n      }\n      return false;\n    };\n    const matchAll = (editor, names, vars) => {\n      const matchedFormatNames = [];\n      const checkedMap = {};\n      const startElement = editor.selection.getStart();\n      editor.dom.getParent(startElement, node => {\n        for (let i = 0; i < names.length; i++) {\n          const name = names[i];\n          if (!checkedMap[name] && matchNode(editor, node, name, vars)) {\n            checkedMap[name] = true;\n            matchedFormatNames.push(name);\n          }\n        }\n      }, editor.dom.getRoot());\n      return matchedFormatNames;\n    };\n    const closest = (editor, names) => {\n      const isRoot = elm => eq(elm, SugarElement.fromDom(editor.getBody()));\n      const match = (elm, name) => matchNode(editor, elm.dom, name) ? Optional.some(name) : Optional.none();\n      return Optional.from(editor.selection.getStart(true)).bind(rawElm => closest$1(SugarElement.fromDom(rawElm), elm => findMap(names, name => match(elm, name)), isRoot)).getOrNull();\n    };\n    const canApply = (editor, name) => {\n      const formatList = editor.formatter.get(name);\n      const dom = editor.dom;\n      if (formatList && editor.selection.isEditable()) {\n        const startNode = editor.selection.getStart();\n        const parents = getParents$2(dom, startNode);\n        for (let x = formatList.length - 1; x >= 0; x--) {\n          const format = formatList[x];\n          if (!isSelectorFormat(format)) {\n            return true;\n          }\n          for (let i = parents.length - 1; i >= 0; i--) {\n            if (dom.is(parents[i], format.selector)) {\n              return true;\n            }\n          }\n        }\n      }\n      return false;\n    };\n    const matchAllOnNode = (editor, node, formatNames) => foldl(formatNames, (acc, name) => {\n      const matchSimilar = isVariableFormatName(editor, name);\n      if (editor.formatter.matchNode(node, name, {}, matchSimilar)) {\n        return acc.concat([name]);\n      } else {\n        return acc;\n      }\n    }, []);\n\n    const ZWSP = ZWSP$1;\n    const importNode = (ownerDocument, node) => {\n      return ownerDocument.importNode(node, true);\n    };\n    const findFirstTextNode = node => {\n      if (node) {\n        const walker = new DomTreeWalker(node, node);\n        for (let tempNode = walker.current(); tempNode; tempNode = walker.next()) {\n          if (isText$b(tempNode)) {\n            return tempNode;\n          }\n        }\n      }\n      return null;\n    };\n    const createCaretContainer = fill => {\n      const caretContainer = SugarElement.fromTag('span');\n      setAll$1(caretContainer, {\n        'id': CARET_ID,\n        'data-mce-bogus': '1',\n        'data-mce-type': 'format-caret'\n      });\n      if (fill) {\n        append$1(caretContainer, SugarElement.fromText(ZWSP));\n      }\n      return caretContainer;\n    };\n    const trimZwspFromCaretContainer = caretContainerNode => {\n      const textNode = findFirstTextNode(caretContainerNode);\n      if (textNode && textNode.data.charAt(0) === ZWSP) {\n        textNode.deleteData(0, 1);\n      }\n      return textNode;\n    };\n    const removeCaretContainerNode = (editor, node, moveCaret) => {\n      const dom = editor.dom, selection = editor.selection;\n      if (isCaretContainerEmpty(node)) {\n        deleteElement$2(editor, false, SugarElement.fromDom(node), moveCaret, true);\n      } else {\n        const rng = selection.getRng();\n        const block = dom.getParent(node, dom.isBlock);\n        const startContainer = rng.startContainer;\n        const startOffset = rng.startOffset;\n        const endContainer = rng.endContainer;\n        const endOffset = rng.endOffset;\n        const textNode = trimZwspFromCaretContainer(node);\n        dom.remove(node, true);\n        if (startContainer === textNode && startOffset > 0) {\n          rng.setStart(textNode, startOffset - 1);\n        }\n        if (endContainer === textNode && endOffset > 0) {\n          rng.setEnd(textNode, endOffset - 1);\n        }\n        if (block && dom.isEmpty(block)) {\n          fillWithPaddingBr(SugarElement.fromDom(block));\n        }\n        selection.setRng(rng);\n      }\n    };\n    const removeCaretContainer = (editor, node, moveCaret) => {\n      const dom = editor.dom, selection = editor.selection;\n      if (!node) {\n        node = getParentCaretContainer(editor.getBody(), selection.getStart());\n        if (!node) {\n          while (node = dom.get(CARET_ID)) {\n            removeCaretContainerNode(editor, node, moveCaret);\n          }\n        }\n      } else {\n        removeCaretContainerNode(editor, node, moveCaret);\n      }\n    };\n    const insertCaretContainerNode = (editor, caretContainer, formatNode) => {\n      var _a, _b;\n      const dom = editor.dom;\n      const block = dom.getParent(formatNode, curry(isTextBlock$1, editor.schema));\n      if (block && dom.isEmpty(block)) {\n        (_a = formatNode.parentNode) === null || _a === void 0 ? void 0 : _a.replaceChild(caretContainer, formatNode);\n      } else {\n        removeTrailingBr(SugarElement.fromDom(formatNode));\n        if (dom.isEmpty(formatNode)) {\n          (_b = formatNode.parentNode) === null || _b === void 0 ? void 0 : _b.replaceChild(caretContainer, formatNode);\n        } else {\n          dom.insertAfter(caretContainer, formatNode);\n        }\n      }\n    };\n    const appendNode = (parentNode, node) => {\n      parentNode.appendChild(node);\n      return node;\n    };\n    const insertFormatNodesIntoCaretContainer = (formatNodes, caretContainer) => {\n      var _a;\n      const innerMostFormatNode = foldr(formatNodes, (parentNode, formatNode) => {\n        return appendNode(parentNode, formatNode.cloneNode(false));\n      }, caretContainer);\n      const doc = (_a = innerMostFormatNode.ownerDocument) !== null && _a !== void 0 ? _a : document;\n      return appendNode(innerMostFormatNode, doc.createTextNode(ZWSP));\n    };\n    const cleanFormatNode = (editor, caretContainer, formatNode, name, vars, similar) => {\n      const formatter = editor.formatter;\n      const dom = editor.dom;\n      const validFormats = filter$5(keys(formatter.get()), formatName => formatName !== name && !contains$1(formatName, 'removeformat'));\n      const matchedFormats = matchAllOnNode(editor, formatNode, validFormats);\n      const uniqueFormats = filter$5(matchedFormats, fmtName => !areSimilarFormats(editor, fmtName, name));\n      if (uniqueFormats.length > 0) {\n        const clonedFormatNode = formatNode.cloneNode(false);\n        dom.add(caretContainer, clonedFormatNode);\n        formatter.remove(name, vars, clonedFormatNode, similar);\n        dom.remove(clonedFormatNode);\n        return Optional.some(clonedFormatNode);\n      } else {\n        return Optional.none();\n      }\n    };\n    const applyCaretFormat = (editor, name, vars) => {\n      let caretContainer;\n      const selection = editor.selection;\n      const formatList = editor.formatter.get(name);\n      if (!formatList) {\n        return;\n      }\n      const selectionRng = selection.getRng();\n      let offset = selectionRng.startOffset;\n      const container = selectionRng.startContainer;\n      const text = container.nodeValue;\n      caretContainer = getParentCaretContainer(editor.getBody(), selection.getStart());\n      const wordcharRegex = /[^\\s\\u00a0\\u00ad\\u200b\\ufeff]/;\n      if (text && offset > 0 && offset < text.length && wordcharRegex.test(text.charAt(offset)) && wordcharRegex.test(text.charAt(offset - 1))) {\n        const bookmark = selection.getBookmark();\n        selectionRng.collapse(true);\n        let rng = expandRng(editor.dom, selectionRng, formatList);\n        rng = split(rng);\n        editor.formatter.apply(name, vars, rng);\n        selection.moveToBookmark(bookmark);\n      } else {\n        let textNode = caretContainer ? findFirstTextNode(caretContainer) : null;\n        if (!caretContainer || (textNode === null || textNode === void 0 ? void 0 : textNode.data) !== ZWSP) {\n          caretContainer = importNode(editor.getDoc(), createCaretContainer(true).dom);\n          textNode = caretContainer.firstChild;\n          selectionRng.insertNode(caretContainer);\n          offset = 1;\n          editor.formatter.apply(name, vars, caretContainer);\n        } else {\n          editor.formatter.apply(name, vars, caretContainer);\n        }\n        selection.setCursorLocation(textNode, offset);\n      }\n    };\n    const removeCaretFormat = (editor, name, vars, similar) => {\n      const dom = editor.dom;\n      const selection = editor.selection;\n      let hasContentAfter = false;\n      const formatList = editor.formatter.get(name);\n      if (!formatList) {\n        return;\n      }\n      const rng = selection.getRng();\n      const container = rng.startContainer;\n      const offset = rng.startOffset;\n      let node = container;\n      if (isText$b(container)) {\n        if (offset !== container.data.length) {\n          hasContentAfter = true;\n        }\n        node = node.parentNode;\n      }\n      const parents = [];\n      let formatNode;\n      while (node) {\n        if (matchNode(editor, node, name, vars, similar)) {\n          formatNode = node;\n          break;\n        }\n        if (node.nextSibling) {\n          hasContentAfter = true;\n        }\n        parents.push(node);\n        node = node.parentNode;\n      }\n      if (!formatNode) {\n        return;\n      }\n      if (hasContentAfter) {\n        const bookmark = selection.getBookmark();\n        rng.collapse(true);\n        let expandedRng = expandRng(dom, rng, formatList, true);\n        expandedRng = split(expandedRng);\n        editor.formatter.remove(name, vars, expandedRng, similar);\n        selection.moveToBookmark(bookmark);\n      } else {\n        const caretContainer = getParentCaretContainer(editor.getBody(), formatNode);\n        const parentsAfter = isNonNullable(caretContainer) ? dom.getParents(formatNode.parentNode, always, caretContainer) : [];\n        const newCaretContainer = createCaretContainer(false).dom;\n        insertCaretContainerNode(editor, newCaretContainer, caretContainer !== null && caretContainer !== void 0 ? caretContainer : formatNode);\n        const cleanedFormatNode = cleanFormatNode(editor, newCaretContainer, formatNode, name, vars, similar);\n        const caretTextNode = insertFormatNodesIntoCaretContainer([\n          ...parents,\n          ...cleanedFormatNode.toArray(),\n          ...parentsAfter\n        ], newCaretContainer);\n        if (caretContainer) {\n          removeCaretContainerNode(editor, caretContainer, isNonNullable(caretContainer));\n        }\n        selection.setCursorLocation(caretTextNode, 1);\n        if (dom.isEmpty(formatNode)) {\n          dom.remove(formatNode);\n        }\n      }\n    };\n    const disableCaretContainer = (editor, keyCode, moveCaret) => {\n      const selection = editor.selection, body = editor.getBody();\n      removeCaretContainer(editor, null, moveCaret);\n      if ((keyCode === 8 || keyCode === 46) && selection.isCollapsed() && selection.getStart().innerHTML === ZWSP) {\n        removeCaretContainer(editor, getParentCaretContainer(body, selection.getStart()), true);\n      }\n      if (keyCode === 37 || keyCode === 39) {\n        removeCaretContainer(editor, getParentCaretContainer(body, selection.getStart()), true);\n      }\n    };\n    const endsWithNbsp = element => isText$b(element) && endsWith(element.data, nbsp);\n    const setup$v = editor => {\n      editor.on('mouseup keydown', e => {\n        disableCaretContainer(editor, e.keyCode, endsWithNbsp(editor.selection.getRng().endContainer));\n      });\n    };\n    const createCaretFormat = formatNodes => {\n      const caretContainer = createCaretContainer(false);\n      const innerMost = insertFormatNodesIntoCaretContainer(formatNodes, caretContainer.dom);\n      return {\n        caretContainer,\n        caretPosition: CaretPosition(innerMost, 0)\n      };\n    };\n    const replaceWithCaretFormat = (targetNode, formatNodes) => {\n      const {caretContainer, caretPosition} = createCaretFormat(formatNodes);\n      before$3(SugarElement.fromDom(targetNode), caretContainer);\n      remove$4(SugarElement.fromDom(targetNode));\n      return caretPosition;\n    };\n    const createCaretFormatAtStart$1 = (rng, formatNodes) => {\n      const {caretContainer, caretPosition} = createCaretFormat(formatNodes);\n      rng.insertNode(caretContainer.dom);\n      return caretPosition;\n    };\n    const isFormatElement = (editor, element) => {\n      if (isCaretNode(element.dom)) {\n        return false;\n      }\n      const inlineElements = editor.schema.getTextInlineElements();\n      return has$2(inlineElements, name(element)) && !isCaretNode(element.dom) && !isBogus$1(element.dom);\n    };\n\n    const postProcessHooks = {};\n    const isPre = matchNodeNames(['pre']);\n    const addPostProcessHook = (name, hook) => {\n      const hooks = postProcessHooks[name];\n      if (!hooks) {\n        postProcessHooks[name] = [];\n      }\n      postProcessHooks[name].push(hook);\n    };\n    const postProcess$1 = (name, editor) => {\n      if (has$2(postProcessHooks, name)) {\n        each$e(postProcessHooks[name], hook => {\n          hook(editor);\n        });\n      }\n    };\n    addPostProcessHook('pre', editor => {\n      const rng = editor.selection.getRng();\n      const hasPreSibling = blocks => pre => {\n        const prev = pre.previousSibling;\n        return isPre(prev) && contains$2(blocks, prev);\n      };\n      const joinPre = (pre1, pre2) => {\n        const sPre2 = SugarElement.fromDom(pre2);\n        const doc = documentOrOwner(sPre2).dom;\n        remove$4(sPre2);\n        append(SugarElement.fromDom(pre1), [\n          SugarElement.fromTag('br', doc),\n          SugarElement.fromTag('br', doc),\n          ...children$1(sPre2)\n        ]);\n      };\n      if (!rng.collapsed) {\n        const blocks = editor.selection.getSelectedBlocks();\n        const preBlocks = filter$5(filter$5(blocks, isPre), hasPreSibling(blocks));\n        each$e(preBlocks, pre => {\n          joinPre(pre.previousSibling, pre);\n        });\n      }\n    });\n\n    const listItemStyles = [\n      'fontWeight',\n      'fontStyle',\n      'color',\n      'fontSize',\n      'fontFamily'\n    ];\n    const hasListStyles = fmt => isObject(fmt.styles) && exists(keys(fmt.styles), name => contains$2(listItemStyles, name));\n    const findExpandedListItemFormat = formats => find$2(formats, fmt => isInlineFormat(fmt) && fmt.inline === 'span' && hasListStyles(fmt));\n    const getExpandedListItemFormat = (formatter, format) => {\n      const formatList = formatter.get(format);\n      return isArray$1(formatList) ? findExpandedListItemFormat(formatList) : Optional.none();\n    };\n    const isRngStartAtStartOfElement = (rng, elm) => prevPosition(elm, CaretPosition.fromRangeStart(rng)).isNone();\n    const isRngEndAtEndOfElement = (rng, elm) => {\n      return nextPosition(elm, CaretPosition.fromRangeEnd(rng)).exists(pos => !isBr$6(pos.getNode()) || nextPosition(elm, pos).isSome()) === false;\n    };\n    const isEditableListItem = dom => elm => isListItem$2(elm) && dom.isEditable(elm);\n    const getFullySelectedBlocks = selection => {\n      const blocks = selection.getSelectedBlocks();\n      const rng = selection.getRng();\n      if (selection.isCollapsed()) {\n        return [];\n      }\n      if (blocks.length === 1) {\n        return isRngStartAtStartOfElement(rng, blocks[0]) && isRngEndAtEndOfElement(rng, blocks[0]) ? blocks : [];\n      } else {\n        const first = head(blocks).filter(elm => isRngStartAtStartOfElement(rng, elm)).toArray();\n        const last = last$2(blocks).filter(elm => isRngEndAtEndOfElement(rng, elm)).toArray();\n        const middle = blocks.slice(1, -1);\n        return first.concat(middle).concat(last);\n      }\n    };\n    const getFullySelectedListItems = selection => filter$5(getFullySelectedBlocks(selection), isEditableListItem(selection.dom));\n    const getPartiallySelectedListItems = selection => filter$5(selection.getSelectedBlocks(), isEditableListItem(selection.dom));\n\n    const each$8 = Tools.each;\n    const isElementNode = node => isElement$6(node) && !isBookmarkNode$1(node) && !isCaretNode(node) && !isBogus$1(node);\n    const findElementSibling = (node, siblingName) => {\n      for (let sibling = node; sibling; sibling = sibling[siblingName]) {\n        if (isText$b(sibling) && isNotEmpty(sibling.data)) {\n          return node;\n        }\n        if (isElement$6(sibling) && !isBookmarkNode$1(sibling)) {\n          return sibling;\n        }\n      }\n      return node;\n    };\n    const mergeSiblingsNodes = (editor, prev, next) => {\n      const elementUtils = ElementUtils(editor);\n      const isPrevEditable = isHTMLElement(prev) && editor.dom.isEditable(prev);\n      const isNextEditable = isHTMLElement(next) && editor.dom.isEditable(next);\n      if (isPrevEditable && isNextEditable) {\n        const prevSibling = findElementSibling(prev, 'previousSibling');\n        const nextSibling = findElementSibling(next, 'nextSibling');\n        if (elementUtils.compare(prevSibling, nextSibling)) {\n          for (let sibling = prevSibling.nextSibling; sibling && sibling !== nextSibling;) {\n            const tmpSibling = sibling;\n            sibling = sibling.nextSibling;\n            prevSibling.appendChild(tmpSibling);\n          }\n          editor.dom.remove(nextSibling);\n          Tools.each(Tools.grep(nextSibling.childNodes), node => {\n            prevSibling.appendChild(node);\n          });\n          return prevSibling;\n        }\n      }\n      return next;\n    };\n    const mergeSiblings = (editor, format, vars, node) => {\n      var _a;\n      if (node && format.merge_siblings !== false) {\n        const newNode = (_a = mergeSiblingsNodes(editor, getNonWhiteSpaceSibling(node), node)) !== null && _a !== void 0 ? _a : node;\n        mergeSiblingsNodes(editor, newNode, getNonWhiteSpaceSibling(newNode, true));\n      }\n    };\n    const clearChildStyles = (dom, format, node) => {\n      if (format.clear_child_styles) {\n        const selector = format.links ? '*:not(a)' : '*';\n        each$8(dom.select(selector, node), childNode => {\n          if (isElementNode(childNode) && dom.isEditable(childNode)) {\n            each$8(format.styles, (_value, name) => {\n              dom.setStyle(childNode, name, '');\n            });\n          }\n        });\n      }\n    };\n    const processChildElements = (node, filter, process) => {\n      each$8(node.childNodes, node => {\n        if (isElementNode(node)) {\n          if (filter(node)) {\n            process(node);\n          }\n          if (node.hasChildNodes()) {\n            processChildElements(node, filter, process);\n          }\n        }\n      });\n    };\n    const unwrapEmptySpan = (dom, node) => {\n      if (node.nodeName === 'SPAN' && dom.getAttribs(node).length === 0) {\n        dom.remove(node, true);\n      }\n    };\n    const hasStyle = (dom, name) => node => !!(node && getStyle(dom, node, name));\n    const applyStyle = (dom, name, value) => node => {\n      dom.setStyle(node, name, value);\n      if (node.getAttribute('style') === '') {\n        node.removeAttribute('style');\n      }\n      unwrapEmptySpan(dom, node);\n    };\n\n    const removeResult = Adt.generate([\n      { keep: [] },\n      { rename: ['name'] },\n      { removed: [] }\n    ]);\n    const MCE_ATTR_RE = /^(src|href|style)$/;\n    const each$7 = Tools.each;\n    const isEq$2 = isEq$5;\n    const isTableCellOrRow = node => /^(TR|TH|TD)$/.test(node.nodeName);\n    const isChildOfInlineParent = (dom, node, parent) => dom.isChildOf(node, parent) && node !== parent && !dom.isBlock(parent);\n    const getContainer = (ed, rng, start) => {\n      let container = rng[start ? 'startContainer' : 'endContainer'];\n      let offset = rng[start ? 'startOffset' : 'endOffset'];\n      if (isElement$6(container)) {\n        const lastIdx = container.childNodes.length - 1;\n        if (!start && offset) {\n          offset--;\n        }\n        container = container.childNodes[offset > lastIdx ? lastIdx : offset];\n      }\n      if (isText$b(container) && start && offset >= container.data.length) {\n        container = new DomTreeWalker(container, ed.getBody()).next() || container;\n      }\n      if (isText$b(container) && !start && offset === 0) {\n        container = new DomTreeWalker(container, ed.getBody()).prev() || container;\n      }\n      return container;\n    };\n    const normalizeTableSelection = (node, start) => {\n      const prop = start ? 'firstChild' : 'lastChild';\n      const childNode = node[prop];\n      if (isTableCellOrRow(node) && childNode) {\n        if (node.nodeName === 'TR') {\n          return childNode[prop] || childNode;\n        } else {\n          return childNode;\n        }\n      }\n      return node;\n    };\n    const wrap$1 = (dom, node, name, attrs) => {\n      var _a;\n      const wrapper = dom.create(name, attrs);\n      (_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(wrapper, node);\n      wrapper.appendChild(node);\n      return wrapper;\n    };\n    const wrapWithSiblings = (dom, node, next, name, attrs) => {\n      const start = SugarElement.fromDom(node);\n      const wrapper = SugarElement.fromDom(dom.create(name, attrs));\n      const siblings = next ? nextSiblings(start) : prevSiblings(start);\n      append(wrapper, siblings);\n      if (next) {\n        before$3(start, wrapper);\n        prepend(wrapper, start);\n      } else {\n        after$4(start, wrapper);\n        append$1(wrapper, start);\n      }\n      return wrapper.dom;\n    };\n    const isColorFormatAndAnchor = (node, format) => format.links && node.nodeName === 'A';\n    const removeNode = (ed, node, format) => {\n      const parentNode = node.parentNode;\n      let rootBlockElm;\n      const dom = ed.dom;\n      const forcedRootBlock = getForcedRootBlock(ed);\n      if (isBlockFormat(format)) {\n        if (parentNode === dom.getRoot()) {\n          if (!format.list_block || !isEq$2(node, format.list_block)) {\n            each$e(from(node.childNodes), node => {\n              if (isValid(ed, forcedRootBlock, node.nodeName.toLowerCase())) {\n                if (!rootBlockElm) {\n                  rootBlockElm = wrap$1(dom, node, forcedRootBlock);\n                  dom.setAttribs(rootBlockElm, getForcedRootBlockAttrs(ed));\n                } else {\n                  rootBlockElm.appendChild(node);\n                }\n              } else {\n                rootBlockElm = null;\n              }\n            });\n          }\n        }\n      }\n      if (isMixedFormat(format) && !isEq$2(format.inline, node)) {\n        return;\n      }\n      dom.remove(node, true);\n    };\n    const processFormatAttrOrStyle = (name, value, vars) => {\n      if (isNumber(name)) {\n        return {\n          name: value,\n          value: null\n        };\n      } else {\n        return {\n          name,\n          value: replaceVars(value, vars)\n        };\n      }\n    };\n    const removeEmptyStyleAttributeIfNeeded = (dom, elm) => {\n      if (dom.getAttrib(elm, 'style') === '') {\n        elm.removeAttribute('style');\n        elm.removeAttribute('data-mce-style');\n      }\n    };\n    const removeStyles = (dom, elm, format, vars, compareNode) => {\n      let stylesModified = false;\n      each$7(format.styles, (value, name) => {\n        const {\n          name: styleName,\n          value: styleValue\n        } = processFormatAttrOrStyle(name, value, vars);\n        const normalizedStyleValue = normalizeStyleValue(styleValue, styleName);\n        if (format.remove_similar || isNull(styleValue) || !isElement$6(compareNode) || isEq$2(getStyle(dom, compareNode, styleName), normalizedStyleValue)) {\n          dom.setStyle(elm, styleName, '');\n        }\n        stylesModified = true;\n      });\n      if (stylesModified) {\n        removeEmptyStyleAttributeIfNeeded(dom, elm);\n      }\n    };\n    const removeListStyleFormats = (editor, name, vars) => {\n      if (name === 'removeformat') {\n        each$e(getPartiallySelectedListItems(editor.selection), li => {\n          each$e(listItemStyles, name => editor.dom.setStyle(li, name, ''));\n          removeEmptyStyleAttributeIfNeeded(editor.dom, li);\n        });\n      } else {\n        getExpandedListItemFormat(editor.formatter, name).each(liFmt => {\n          each$e(getPartiallySelectedListItems(editor.selection), li => removeStyles(editor.dom, li, liFmt, vars, null));\n        });\n      }\n    };\n    const removeNodeFormatInternal = (ed, format, vars, node, compareNode) => {\n      const dom = ed.dom;\n      const elementUtils = ElementUtils(ed);\n      const schema = ed.schema;\n      if (isInlineFormat(format) && isTransparentElementName(schema, format.inline) && isTransparentBlock(schema, node) && node.parentElement === ed.getBody()) {\n        removeNode(ed, node, format);\n        return removeResult.removed();\n      }\n      if (!format.ceFalseOverride && node && dom.getContentEditableParent(node) === 'false') {\n        return removeResult.keep();\n      }\n      if (node && !matchName(dom, node, format) && !isColorFormatAndAnchor(node, format)) {\n        return removeResult.keep();\n      }\n      const elm = node;\n      const preserveAttributes = format.preserve_attributes;\n      if (isInlineFormat(format) && format.remove === 'all' && isArray$1(preserveAttributes)) {\n        const attrsToPreserve = filter$5(dom.getAttribs(elm), attr => contains$2(preserveAttributes, attr.name.toLowerCase()));\n        dom.removeAllAttribs(elm);\n        each$e(attrsToPreserve, attr => dom.setAttrib(elm, attr.name, attr.value));\n        if (attrsToPreserve.length > 0) {\n          return removeResult.rename('span');\n        }\n      }\n      if (format.remove !== 'all') {\n        removeStyles(dom, elm, format, vars, compareNode);\n        each$7(format.attributes, (value, name) => {\n          const {\n            name: attrName,\n            value: attrValue\n          } = processFormatAttrOrStyle(name, value, vars);\n          if (format.remove_similar || isNull(attrValue) || !isElement$6(compareNode) || isEq$2(dom.getAttrib(compareNode, attrName), attrValue)) {\n            if (attrName === 'class') {\n              const currentValue = dom.getAttrib(elm, attrName);\n              if (currentValue) {\n                let valueOut = '';\n                each$e(currentValue.split(/\\s+/), cls => {\n                  if (/mce\\-\\w+/.test(cls)) {\n                    valueOut += (valueOut ? ' ' : '') + cls;\n                  }\n                });\n                if (valueOut) {\n                  dom.setAttrib(elm, attrName, valueOut);\n                  return;\n                }\n              }\n            }\n            if (MCE_ATTR_RE.test(attrName)) {\n              elm.removeAttribute('data-mce-' + attrName);\n            }\n            if (attrName === 'style' && matchNodeNames(['li'])(elm) && dom.getStyle(elm, 'list-style-type') === 'none') {\n              elm.removeAttribute(attrName);\n              dom.setStyle(elm, 'list-style-type', 'none');\n              return;\n            }\n            if (attrName === 'class') {\n              elm.removeAttribute('className');\n            }\n            elm.removeAttribute(attrName);\n          }\n        });\n        each$7(format.classes, value => {\n          value = replaceVars(value, vars);\n          if (!isElement$6(compareNode) || dom.hasClass(compareNode, value)) {\n            dom.removeClass(elm, value);\n          }\n        });\n        const attrs = dom.getAttribs(elm);\n        for (let i = 0; i < attrs.length; i++) {\n          const attrName = attrs[i].nodeName;\n          if (!elementUtils.isAttributeInternal(attrName)) {\n            return removeResult.keep();\n          }\n        }\n      }\n      if (format.remove !== 'none') {\n        removeNode(ed, elm, format);\n        return removeResult.removed();\n      }\n      return removeResult.keep();\n    };\n    const findFormatRoot = (editor, container, name, vars, similar) => {\n      let formatRoot;\n      if (container.parentNode) {\n        each$e(getParents$2(editor.dom, container.parentNode).reverse(), parent => {\n          if (!formatRoot && isElement$6(parent) && parent.id !== '_start' && parent.id !== '_end') {\n            const format = matchNode(editor, parent, name, vars, similar);\n            if (format && format.split !== false) {\n              formatRoot = parent;\n            }\n          }\n        });\n      }\n      return formatRoot;\n    };\n    const removeNodeFormatFromClone = (editor, format, vars, clone) => removeNodeFormatInternal(editor, format, vars, clone, clone).fold(constant(clone), newName => {\n      const fragment = editor.dom.createFragment();\n      fragment.appendChild(clone);\n      return editor.dom.rename(clone, newName);\n    }, constant(null));\n    const wrapAndSplit = (editor, formatList, formatRoot, container, target, split, format, vars) => {\n      var _a, _b;\n      let lastClone;\n      let firstClone;\n      const dom = editor.dom;\n      if (formatRoot) {\n        const formatRootParent = formatRoot.parentNode;\n        for (let parent = container.parentNode; parent && parent !== formatRootParent; parent = parent.parentNode) {\n          let clone = dom.clone(parent, false);\n          for (let i = 0; i < formatList.length; i++) {\n            clone = removeNodeFormatFromClone(editor, formatList[i], vars, clone);\n            if (clone === null) {\n              break;\n            }\n          }\n          if (clone) {\n            if (lastClone) {\n              clone.appendChild(lastClone);\n            }\n            if (!firstClone) {\n              firstClone = clone;\n            }\n            lastClone = clone;\n          }\n        }\n        if (split && (!format.mixed || !dom.isBlock(formatRoot))) {\n          container = (_a = dom.split(formatRoot, container)) !== null && _a !== void 0 ? _a : container;\n        }\n        if (lastClone && firstClone) {\n          (_b = target.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(lastClone, target);\n          firstClone.appendChild(target);\n          if (isInlineFormat(format)) {\n            mergeSiblings(editor, format, vars, lastClone);\n          }\n        }\n      }\n      return container;\n    };\n    const removeFormatInternal = (ed, name, vars, node, similar) => {\n      const formatList = ed.formatter.get(name);\n      const format = formatList[0];\n      const dom = ed.dom;\n      const selection = ed.selection;\n      const splitToFormatRoot = container => {\n        const formatRoot = findFormatRoot(ed, container, name, vars, similar);\n        return wrapAndSplit(ed, formatList, formatRoot, container, container, true, format, vars);\n      };\n      const isRemoveBookmarkNode = node => isBookmarkNode$1(node) && isElement$6(node) && (node.id === '_start' || node.id === '_end');\n      const removeFormatOnNode = node => exists(formatList, fmt => removeNodeFormat(ed, fmt, vars, node, node));\n      const process = node => {\n        const children = from(node.childNodes);\n        const removed = removeFormatOnNode(node);\n        const currentNodeMatches = removed || exists(formatList, f => matchName(dom, node, f));\n        const parentNode = node.parentNode;\n        if (!currentNodeMatches && isNonNullable(parentNode) && shouldExpandToSelector(format)) {\n          removeFormatOnNode(parentNode);\n        }\n        if (format.deep) {\n          if (children.length) {\n            for (let i = 0; i < children.length; i++) {\n              process(children[i]);\n            }\n          }\n        }\n        const textDecorations = [\n          'underline',\n          'line-through',\n          'overline'\n        ];\n        each$e(textDecorations, decoration => {\n          if (isElement$6(node) && ed.dom.getStyle(node, 'text-decoration') === decoration && node.parentNode && getTextDecoration(dom, node.parentNode) === decoration) {\n            removeNodeFormat(ed, {\n              deep: false,\n              exact: true,\n              inline: 'span',\n              styles: { textDecoration: decoration }\n            }, undefined, node);\n          }\n        });\n      };\n      const unwrap = start => {\n        const node = dom.get(start ? '_start' : '_end');\n        if (node) {\n          let out = node[start ? 'firstChild' : 'lastChild'];\n          if (isRemoveBookmarkNode(out)) {\n            out = out[start ? 'firstChild' : 'lastChild'];\n          }\n          if (isText$b(out) && out.data.length === 0) {\n            out = start ? node.previousSibling || node.nextSibling : node.nextSibling || node.previousSibling;\n          }\n          dom.remove(node, true);\n          return out;\n        } else {\n          return null;\n        }\n      };\n      const removeRngStyle = rng => {\n        let startContainer;\n        let endContainer;\n        let expandedRng = expandRng(dom, rng, formatList, rng.collapsed);\n        if (format.split) {\n          expandedRng = split(expandedRng);\n          startContainer = getContainer(ed, expandedRng, true);\n          endContainer = getContainer(ed, expandedRng);\n          if (startContainer !== endContainer) {\n            startContainer = normalizeTableSelection(startContainer, true);\n            endContainer = normalizeTableSelection(endContainer, false);\n            if (isChildOfInlineParent(dom, startContainer, endContainer)) {\n              const marker = Optional.from(startContainer.firstChild).getOr(startContainer);\n              splitToFormatRoot(wrapWithSiblings(dom, marker, true, 'span', {\n                'id': '_start',\n                'data-mce-type': 'bookmark'\n              }));\n              unwrap(true);\n              return;\n            }\n            if (isChildOfInlineParent(dom, endContainer, startContainer)) {\n              const marker = Optional.from(endContainer.lastChild).getOr(endContainer);\n              splitToFormatRoot(wrapWithSiblings(dom, marker, false, 'span', {\n                'id': '_end',\n                'data-mce-type': 'bookmark'\n              }));\n              unwrap(false);\n              return;\n            }\n            startContainer = wrap$1(dom, startContainer, 'span', {\n              'id': '_start',\n              'data-mce-type': 'bookmark'\n            });\n            endContainer = wrap$1(dom, endContainer, 'span', {\n              'id': '_end',\n              'data-mce-type': 'bookmark'\n            });\n            const newRng = dom.createRng();\n            newRng.setStartAfter(startContainer);\n            newRng.setEndBefore(endContainer);\n            walk$3(dom, newRng, nodes => {\n              each$e(nodes, n => {\n                if (!isBookmarkNode$1(n) && !isBookmarkNode$1(n.parentNode)) {\n                  splitToFormatRoot(n);\n                }\n              });\n            });\n            splitToFormatRoot(startContainer);\n            splitToFormatRoot(endContainer);\n            startContainer = unwrap(true);\n            endContainer = unwrap();\n          } else {\n            startContainer = endContainer = splitToFormatRoot(startContainer);\n          }\n          expandedRng.startContainer = startContainer.parentNode ? startContainer.parentNode : startContainer;\n          expandedRng.startOffset = dom.nodeIndex(startContainer);\n          expandedRng.endContainer = endContainer.parentNode ? endContainer.parentNode : endContainer;\n          expandedRng.endOffset = dom.nodeIndex(endContainer) + 1;\n        }\n        walk$3(dom, expandedRng, nodes => {\n          each$e(nodes, process);\n        });\n      };\n      if (node) {\n        if (isNode(node)) {\n          const rng = dom.createRng();\n          rng.setStartBefore(node);\n          rng.setEndAfter(node);\n          removeRngStyle(rng);\n        } else {\n          removeRngStyle(node);\n        }\n        fireFormatRemove(ed, name, node, vars);\n        return;\n      }\n      if (!selection.isCollapsed() || !isInlineFormat(format) || getCellsFromEditor(ed).length) {\n        preserveSelection(ed, () => runOnRanges(ed, removeRngStyle), startNode => isInlineFormat(format) && match$2(ed, name, vars, startNode));\n        ed.nodeChanged();\n      } else {\n        removeCaretFormat(ed, name, vars, similar);\n      }\n      removeListStyleFormats(ed, name, vars);\n      fireFormatRemove(ed, name, node, vars);\n    };\n    const removeFormat$1 = (ed, name, vars, node, similar) => {\n      if (node || ed.selection.isEditable()) {\n        removeFormatInternal(ed, name, vars, node, similar);\n      }\n    };\n    const removeNodeFormat = (editor, format, vars, node, compareNode) => {\n      return removeNodeFormatInternal(editor, format, vars, node, compareNode).fold(never, newName => {\n        editor.dom.rename(node, newName);\n        return true;\n      }, always);\n    };\n\n    const each$6 = Tools.each;\n    const mergeTextDecorationsAndColor = (dom, format, vars, node) => {\n      const processTextDecorationsAndColor = n => {\n        if (isHTMLElement(n) && isElement$6(n.parentNode) && dom.isEditable(n)) {\n          const parentTextDecoration = getTextDecoration(dom, n.parentNode);\n          if (dom.getStyle(n, 'color') && parentTextDecoration) {\n            dom.setStyle(n, 'text-decoration', parentTextDecoration);\n          } else if (dom.getStyle(n, 'text-decoration') === parentTextDecoration) {\n            dom.setStyle(n, 'text-decoration', null);\n          }\n        }\n      };\n      if (format.styles && (format.styles.color || format.styles.textDecoration)) {\n        Tools.walk(node, processTextDecorationsAndColor, 'childNodes');\n        processTextDecorationsAndColor(node);\n      }\n    };\n    const mergeBackgroundColorAndFontSize = (dom, format, vars, node) => {\n      if (format.styles && format.styles.backgroundColor) {\n        const hasFontSize = hasStyle(dom, 'fontSize');\n        processChildElements(node, elm => hasFontSize(elm) && dom.isEditable(elm), applyStyle(dom, 'backgroundColor', replaceVars(format.styles.backgroundColor, vars)));\n      }\n    };\n    const mergeSubSup = (dom, format, vars, node) => {\n      if (isInlineFormat(format) && (format.inline === 'sub' || format.inline === 'sup')) {\n        const hasFontSize = hasStyle(dom, 'fontSize');\n        processChildElements(node, elm => hasFontSize(elm) && dom.isEditable(elm), applyStyle(dom, 'fontSize', ''));\n        const inverseTagDescendants = filter$5(dom.select(format.inline === 'sup' ? 'sub' : 'sup', node), dom.isEditable);\n        dom.remove(inverseTagDescendants, true);\n      }\n    };\n    const mergeWithChildren = (editor, formatList, vars, node) => {\n      each$6(formatList, format => {\n        if (isInlineFormat(format)) {\n          each$6(editor.dom.select(format.inline, node), child => {\n            if (isElementNode(child)) {\n              removeNodeFormat(editor, format, vars, child, format.exact ? child : null);\n            }\n          });\n        }\n        clearChildStyles(editor.dom, format, node);\n      });\n    };\n    const mergeWithParents = (editor, format, name, vars, node) => {\n      const parentNode = node.parentNode;\n      if (matchNode(editor, parentNode, name, vars)) {\n        if (removeNodeFormat(editor, format, vars, node)) {\n          return;\n        }\n      }\n      if (format.merge_with_parents && parentNode) {\n        editor.dom.getParent(parentNode, parent => {\n          if (matchNode(editor, parent, name, vars)) {\n            removeNodeFormat(editor, format, vars, node);\n            return true;\n          } else {\n            return false;\n          }\n        });\n      }\n    };\n\n    const each$5 = Tools.each;\n    const canFormatBR = (editor, format, node, parentName) => {\n      if (canFormatEmptyLines(editor) && isInlineFormat(format) && node.parentNode) {\n        const validBRParentElements = getTextRootBlockElements(editor.schema);\n        const hasCaretNodeSibling = sibling(SugarElement.fromDom(node), sibling => isCaretNode(sibling.dom));\n        return hasNonNullableKey(validBRParentElements, parentName) && isEmptyNode(editor.schema, node.parentNode, {\n          skipBogus: false,\n          includeZwsp: true\n        }) && !hasCaretNodeSibling;\n      } else {\n        return false;\n      }\n    };\n    const applyStyles = (dom, elm, format, vars) => {\n      each$5(format.styles, (value, name) => {\n        dom.setStyle(elm, name, replaceVars(value, vars));\n      });\n      if (format.styles) {\n        const styleVal = dom.getAttrib(elm, 'style');\n        if (styleVal) {\n          dom.setAttrib(elm, 'data-mce-style', styleVal);\n        }\n      }\n    };\n    const applyFormatAction = (ed, name, vars, node) => {\n      const formatList = ed.formatter.get(name);\n      const format = formatList[0];\n      const isCollapsed = !node && ed.selection.isCollapsed();\n      const dom = ed.dom;\n      const selection = ed.selection;\n      const setElementFormat = (elm, fmt = format) => {\n        if (isFunction(fmt.onformat)) {\n          fmt.onformat(elm, fmt, vars, node);\n        }\n        applyStyles(dom, elm, fmt, vars);\n        each$5(fmt.attributes, (value, name) => {\n          dom.setAttrib(elm, name, replaceVars(value, vars));\n        });\n        each$5(fmt.classes, value => {\n          const newValue = replaceVars(value, vars);\n          if (!dom.hasClass(elm, newValue)) {\n            dom.addClass(elm, newValue);\n          }\n        });\n      };\n      const applyNodeStyle = (formatList, node) => {\n        let found = false;\n        each$5(formatList, format => {\n          if (!isSelectorFormat(format)) {\n            return false;\n          }\n          if (dom.getContentEditable(node) === 'false' && !format.ceFalseOverride) {\n            return true;\n          }\n          if (isNonNullable(format.collapsed) && format.collapsed !== isCollapsed) {\n            return true;\n          }\n          if (dom.is(node, format.selector) && !isCaretNode(node)) {\n            setElementFormat(node, format);\n            found = true;\n            return false;\n          }\n          return true;\n        });\n        return found;\n      };\n      const createWrapElement = wrapName => {\n        if (isString(wrapName)) {\n          const wrapElm = dom.create(wrapName);\n          setElementFormat(wrapElm);\n          return wrapElm;\n        } else {\n          return null;\n        }\n      };\n      const applyRngStyle = (dom, rng, nodeSpecific) => {\n        const newWrappers = [];\n        let contentEditable = true;\n        const wrapName = format.inline || format.block;\n        const wrapElm = createWrapElement(wrapName);\n        const isMatchingWrappingBlock = node => isWrappingBlockFormat(format) && matchNode(ed, node, name, vars);\n        const canRenameBlock = (node, parentName, isEditableDescendant) => {\n          const isValidBlockFormatForNode = isNonWrappingBlockFormat(format) && isTextBlock$1(ed.schema, node) && isValid(ed, parentName, wrapName);\n          return isEditableDescendant && isValidBlockFormatForNode;\n        };\n        const canWrapNode = (node, parentName, isEditableDescendant, isWrappableNoneditableElm) => {\n          const nodeName = node.nodeName.toLowerCase();\n          const isValidWrapNode = isValid(ed, wrapName, nodeName) && isValid(ed, parentName, wrapName);\n          const isZwsp$1 = !nodeSpecific && isText$b(node) && isZwsp(node.data);\n          const isCaret = isCaretNode(node);\n          const isCorrectFormatForNode = !isInlineFormat(format) || !dom.isBlock(node);\n          return (isEditableDescendant || isWrappableNoneditableElm) && isValidWrapNode && !isZwsp$1 && !isCaret && isCorrectFormatForNode;\n        };\n        walk$3(dom, rng, nodes => {\n          let currentWrapElm;\n          const process = node => {\n            let hasContentEditableState = false;\n            let lastContentEditable = contentEditable;\n            let isWrappableNoneditableElm = false;\n            const parentNode = node.parentNode;\n            const parentName = parentNode.nodeName.toLowerCase();\n            const contentEditableValue = dom.getContentEditable(node);\n            if (isNonNullable(contentEditableValue)) {\n              lastContentEditable = contentEditable;\n              contentEditable = contentEditableValue === 'true';\n              hasContentEditableState = true;\n              isWrappableNoneditableElm = isWrappableNoneditable(ed, node);\n            }\n            const isEditableDescendant = contentEditable && !hasContentEditableState;\n            if (isBr$6(node) && !canFormatBR(ed, format, node, parentName)) {\n              currentWrapElm = null;\n              if (isBlockFormat(format)) {\n                dom.remove(node);\n              }\n              return;\n            }\n            if (isMatchingWrappingBlock(node)) {\n              currentWrapElm = null;\n              return;\n            }\n            if (canRenameBlock(node, parentName, isEditableDescendant)) {\n              const elm = dom.rename(node, wrapName);\n              setElementFormat(elm);\n              newWrappers.push(elm);\n              currentWrapElm = null;\n              return;\n            }\n            if (isSelectorFormat(format)) {\n              let found = applyNodeStyle(formatList, node);\n              if (!found && isNonNullable(parentNode) && shouldExpandToSelector(format)) {\n                found = applyNodeStyle(formatList, parentNode);\n              }\n              if (!isInlineFormat(format) || found) {\n                currentWrapElm = null;\n                return;\n              }\n            }\n            if (isNonNullable(wrapElm) && canWrapNode(node, parentName, isEditableDescendant, isWrappableNoneditableElm)) {\n              if (!currentWrapElm) {\n                currentWrapElm = dom.clone(wrapElm, false);\n                parentNode.insertBefore(currentWrapElm, node);\n                newWrappers.push(currentWrapElm);\n              }\n              if (isWrappableNoneditableElm && hasContentEditableState) {\n                contentEditable = lastContentEditable;\n              }\n              currentWrapElm.appendChild(node);\n            } else {\n              currentWrapElm = null;\n              each$e(from(node.childNodes), process);\n              if (hasContentEditableState) {\n                contentEditable = lastContentEditable;\n              }\n              currentWrapElm = null;\n            }\n          };\n          each$e(nodes, process);\n        });\n        if (format.links === true) {\n          each$e(newWrappers, node => {\n            const process = node => {\n              if (node.nodeName === 'A') {\n                setElementFormat(node, format);\n              }\n              each$e(from(node.childNodes), process);\n            };\n            process(node);\n          });\n        }\n        each$e(newWrappers, node => {\n          const getChildCount = node => {\n            let count = 0;\n            each$e(node.childNodes, node => {\n              if (!isEmptyTextNode$1(node) && !isBookmarkNode$1(node)) {\n                count++;\n              }\n            });\n            return count;\n          };\n          const mergeStyles = node => {\n            const childElement = find$2(node.childNodes, isElementNode$1).filter(child => dom.getContentEditable(child) !== 'false' && matchName(dom, child, format));\n            return childElement.map(child => {\n              const clone = dom.clone(child, false);\n              setElementFormat(clone);\n              dom.replace(clone, node, true);\n              dom.remove(child, true);\n              return clone;\n            }).getOr(node);\n          };\n          const childCount = getChildCount(node);\n          if ((newWrappers.length > 1 || !dom.isBlock(node)) && childCount === 0) {\n            dom.remove(node, true);\n            return;\n          }\n          if (isInlineFormat(format) || isBlockFormat(format) && format.wrapper) {\n            if (!format.exact && childCount === 1) {\n              node = mergeStyles(node);\n            }\n            mergeWithChildren(ed, formatList, vars, node);\n            mergeWithParents(ed, format, name, vars, node);\n            mergeBackgroundColorAndFontSize(dom, format, vars, node);\n            mergeTextDecorationsAndColor(dom, format, vars, node);\n            mergeSubSup(dom, format, vars, node);\n            mergeSiblings(ed, format, vars, node);\n          }\n        });\n      };\n      const targetNode = isNode(node) ? node : selection.getNode();\n      if (dom.getContentEditable(targetNode) === 'false' && !isWrappableNoneditable(ed, targetNode)) {\n        node = targetNode;\n        applyNodeStyle(formatList, node);\n        fireFormatApply(ed, name, node, vars);\n        return;\n      }\n      if (format) {\n        if (node) {\n          if (isNode(node)) {\n            if (!applyNodeStyle(formatList, node)) {\n              const rng = dom.createRng();\n              rng.setStartBefore(node);\n              rng.setEndAfter(node);\n              applyRngStyle(dom, expandRng(dom, rng, formatList), true);\n            }\n          } else {\n            applyRngStyle(dom, node, true);\n          }\n        } else {\n          if (!isCollapsed || !isInlineFormat(format) || getCellsFromEditor(ed).length) {\n            selection.setRng(normalize(selection.getRng()));\n            preserveSelection(ed, () => {\n              runOnRanges(ed, (selectionRng, fake) => {\n                const expandedRng = fake ? selectionRng : expandRng(dom, selectionRng, formatList);\n                applyRngStyle(dom, expandedRng, false);\n              });\n            }, always);\n            ed.nodeChanged();\n          } else {\n            applyCaretFormat(ed, name, vars);\n          }\n          getExpandedListItemFormat(ed.formatter, name).each(liFmt => {\n            each$e(getFullySelectedListItems(ed.selection), li => applyStyles(dom, li, liFmt, vars));\n          });\n        }\n        postProcess$1(name, ed);\n      }\n      fireFormatApply(ed, name, node, vars);\n    };\n    const applyFormat$1 = (editor, name, vars, node) => {\n      if (node || editor.selection.isEditable()) {\n        applyFormatAction(editor, name, vars, node);\n      }\n    };\n\n    const hasVars = value => has$2(value, 'vars');\n    const setup$u = (registeredFormatListeners, editor) => {\n      registeredFormatListeners.set({});\n      editor.on('NodeChange', e => {\n        updateAndFireChangeCallbacks(editor, e.element, registeredFormatListeners.get());\n      });\n      editor.on('FormatApply FormatRemove', e => {\n        const element = Optional.from(e.node).map(nodeOrRange => isNode(nodeOrRange) ? nodeOrRange : nodeOrRange.startContainer).bind(node => isElement$6(node) ? Optional.some(node) : Optional.from(node.parentElement)).getOrThunk(() => fallbackElement(editor));\n        updateAndFireChangeCallbacks(editor, element, registeredFormatListeners.get());\n      });\n    };\n    const fallbackElement = editor => editor.selection.getStart();\n    const matchingNode = (editor, parents, format, similar, vars) => {\n      const isMatchingNode = node => {\n        const matchingFormat = editor.formatter.matchNode(node, format, vars !== null && vars !== void 0 ? vars : {}, similar);\n        return !isUndefined(matchingFormat);\n      };\n      const isUnableToMatch = node => {\n        if (matchesUnInheritedFormatSelector(editor, node, format)) {\n          return true;\n        } else {\n          if (!similar) {\n            return isNonNullable(editor.formatter.matchNode(node, format, vars, true));\n          } else {\n            return false;\n          }\n        }\n      };\n      return findUntil$1(parents, isMatchingNode, isUnableToMatch);\n    };\n    const getParents = (editor, elm) => {\n      const element = elm !== null && elm !== void 0 ? elm : fallbackElement(editor);\n      return filter$5(getParents$2(editor.dom, element), node => isElement$6(node) && !isBogus$1(node));\n    };\n    const updateAndFireChangeCallbacks = (editor, elm, registeredCallbacks) => {\n      const parents = getParents(editor, elm);\n      each$d(registeredCallbacks, (data, format) => {\n        const runIfChanged = spec => {\n          const match = matchingNode(editor, parents, format, spec.similar, hasVars(spec) ? spec.vars : undefined);\n          const isSet = match.isSome();\n          if (spec.state.get() !== isSet) {\n            spec.state.set(isSet);\n            const node = match.getOr(elm);\n            if (hasVars(spec)) {\n              spec.callback(isSet, {\n                node,\n                format,\n                parents\n              });\n            } else {\n              each$e(spec.callbacks, callback => callback(isSet, {\n                node,\n                format,\n                parents\n              }));\n            }\n          }\n        };\n        each$e([\n          data.withSimilar,\n          data.withoutSimilar\n        ], runIfChanged);\n        each$e(data.withVars, runIfChanged);\n      });\n    };\n    const addListeners = (editor, registeredFormatListeners, formats, callback, similar, vars) => {\n      const formatChangeItems = registeredFormatListeners.get();\n      each$e(formats.split(','), format => {\n        const group = get$a(formatChangeItems, format).getOrThunk(() => {\n          const base = {\n            withSimilar: {\n              state: Cell(false),\n              similar: true,\n              callbacks: []\n            },\n            withoutSimilar: {\n              state: Cell(false),\n              similar: false,\n              callbacks: []\n            },\n            withVars: []\n          };\n          formatChangeItems[format] = base;\n          return base;\n        });\n        const getCurrent = () => {\n          const parents = getParents(editor);\n          return matchingNode(editor, parents, format, similar, vars).isSome();\n        };\n        if (isUndefined(vars)) {\n          const toAppendTo = similar ? group.withSimilar : group.withoutSimilar;\n          toAppendTo.callbacks.push(callback);\n          if (toAppendTo.callbacks.length === 1) {\n            toAppendTo.state.set(getCurrent());\n          }\n        } else {\n          group.withVars.push({\n            state: Cell(getCurrent()),\n            similar,\n            vars,\n            callback\n          });\n        }\n      });\n      registeredFormatListeners.set(formatChangeItems);\n    };\n    const removeListeners = (registeredFormatListeners, formats, callback) => {\n      const formatChangeItems = registeredFormatListeners.get();\n      each$e(formats.split(','), format => get$a(formatChangeItems, format).each(group => {\n        formatChangeItems[format] = {\n          withSimilar: {\n            ...group.withSimilar,\n            callbacks: filter$5(group.withSimilar.callbacks, cb => cb !== callback)\n          },\n          withoutSimilar: {\n            ...group.withoutSimilar,\n            callbacks: filter$5(group.withoutSimilar.callbacks, cb => cb !== callback)\n          },\n          withVars: filter$5(group.withVars, item => item.callback !== callback)\n        };\n      }));\n      registeredFormatListeners.set(formatChangeItems);\n    };\n    const formatChangedInternal = (editor, registeredFormatListeners, formats, callback, similar, vars) => {\n      addListeners(editor, registeredFormatListeners, formats, callback, similar, vars);\n      return { unbind: () => removeListeners(registeredFormatListeners, formats, callback) };\n    };\n\n    const toggle = (editor, name, vars, node) => {\n      const fmt = editor.formatter.get(name);\n      if (fmt) {\n        if (match$2(editor, name, vars, node) && (!('toggle' in fmt[0]) || fmt[0].toggle)) {\n          removeFormat$1(editor, name, vars, node);\n        } else {\n          applyFormat$1(editor, name, vars, node);\n        }\n      }\n    };\n\n    const explode$1 = Tools.explode;\n    const create$8 = () => {\n      const filters = {};\n      const addFilter = (name, callback) => {\n        each$e(explode$1(name), name => {\n          if (!has$2(filters, name)) {\n            filters[name] = {\n              name,\n              callbacks: []\n            };\n          }\n          filters[name].callbacks.push(callback);\n        });\n      };\n      const getFilters = () => values(filters);\n      const removeFilter = (name, callback) => {\n        each$e(explode$1(name), name => {\n          if (has$2(filters, name)) {\n            if (isNonNullable(callback)) {\n              const filter = filters[name];\n              const newCallbacks = filter$5(filter.callbacks, c => c !== callback);\n              if (newCallbacks.length > 0) {\n                filter.callbacks = newCallbacks;\n              } else {\n                delete filters[name];\n              }\n            } else {\n              delete filters[name];\n            }\n          }\n        });\n      };\n      return {\n        addFilter,\n        getFilters,\n        removeFilter\n      };\n    };\n\n    const removeAttrs = (node, names) => {\n      each$e(names, name => {\n        node.attr(name, null);\n      });\n    };\n    const addFontToSpansFilter = (domParser, styles, fontSizes) => {\n      domParser.addNodeFilter('font', nodes => {\n        each$e(nodes, node => {\n          const props = styles.parse(node.attr('style'));\n          const color = node.attr('color');\n          const face = node.attr('face');\n          const size = node.attr('size');\n          if (color) {\n            props.color = color;\n          }\n          if (face) {\n            props['font-family'] = face;\n          }\n          if (size) {\n            toInt(size).each(num => {\n              props['font-size'] = fontSizes[num - 1];\n            });\n          }\n          node.name = 'span';\n          node.attr('style', styles.serialize(props));\n          removeAttrs(node, [\n            'color',\n            'face',\n            'size'\n          ]);\n        });\n      });\n    };\n    const addStrikeFilter = (domParser, schema, styles) => {\n      domParser.addNodeFilter('strike', nodes => {\n        const convertToSTag = schema.type !== 'html4';\n        each$e(nodes, node => {\n          if (convertToSTag) {\n            node.name = 's';\n          } else {\n            const props = styles.parse(node.attr('style'));\n            props['text-decoration'] = 'line-through';\n            node.name = 'span';\n            node.attr('style', styles.serialize(props));\n          }\n        });\n      });\n    };\n    const addFilters = (domParser, settings, schema) => {\n      var _a;\n      const styles = Styles();\n      if (settings.convert_fonts_to_spans) {\n        addFontToSpansFilter(domParser, styles, Tools.explode((_a = settings.font_size_legacy_values) !== null && _a !== void 0 ? _a : ''));\n      }\n      addStrikeFilter(domParser, schema, styles);\n    };\n    const register$5 = (domParser, settings, schema) => {\n      if (settings.inline_styles) {\n        addFilters(domParser, settings, schema);\n      }\n    };\n\n    const blobUriToBlob = url => fetch(url).then(res => res.ok ? res.blob() : Promise.reject()).catch(() => Promise.reject({\n      message: `Cannot convert ${ url } to Blob. Resource might not exist or is inaccessible.`,\n      uriType: 'blob'\n    }));\n    const extractBase64Data = data => {\n      const matches = /([a-z0-9+\\/=\\s]+)/i.exec(data);\n      return matches ? matches[1] : '';\n    };\n    const parseDataUri = uri => {\n      const [type, ...rest] = uri.split(',');\n      const data = rest.join(',');\n      const matches = /data:([^/]+\\/[^;]+)(;.+)?/.exec(type);\n      if (matches) {\n        const base64Encoded = matches[2] === ';base64';\n        const extractedData = base64Encoded ? extractBase64Data(data) : decodeURIComponent(data);\n        return Optional.some({\n          type: matches[1],\n          data: extractedData,\n          base64Encoded\n        });\n      } else {\n        return Optional.none();\n      }\n    };\n    const buildBlob = (type, data, base64Encoded = true) => {\n      let str = data;\n      if (base64Encoded) {\n        try {\n          str = atob(data);\n        } catch (e) {\n          return Optional.none();\n        }\n      }\n      const arr = new Uint8Array(str.length);\n      for (let i = 0; i < arr.length; i++) {\n        arr[i] = str.charCodeAt(i);\n      }\n      return Optional.some(new Blob([arr], { type }));\n    };\n    const dataUriToBlob = uri => {\n      return new Promise((resolve, reject) => {\n        parseDataUri(uri).bind(({type, data, base64Encoded}) => buildBlob(type, data, base64Encoded)).fold(() => reject('Invalid data URI'), resolve);\n      });\n    };\n    const uriToBlob = url => {\n      if (startsWith(url, 'blob:')) {\n        return blobUriToBlob(url);\n      } else if (startsWith(url, 'data:')) {\n        return dataUriToBlob(url);\n      } else {\n        return Promise.reject('Unknown URI format');\n      }\n    };\n    const blobToDataUri = blob => {\n      return new Promise((resolve, reject) => {\n        const reader = new FileReader();\n        reader.onloadend = () => {\n          resolve(reader.result);\n        };\n        reader.onerror = () => {\n          var _a;\n          reject((_a = reader.error) === null || _a === void 0 ? void 0 : _a.message);\n        };\n        reader.readAsDataURL(blob);\n      });\n    };\n\n    let count$1 = 0;\n    const uniqueId$1 = prefix => {\n      return (prefix || 'blobid') + count$1++;\n    };\n    const processDataUri = (dataUri, base64Only, generateBlobInfo) => {\n      return parseDataUri(dataUri).bind(({data, type, base64Encoded}) => {\n        if (base64Only && !base64Encoded) {\n          return Optional.none();\n        } else {\n          const base64 = base64Encoded ? data : btoa(data);\n          return generateBlobInfo(base64, type);\n        }\n      });\n    };\n    const createBlobInfo$1 = (blobCache, blob, base64) => {\n      const blobInfo = blobCache.create(uniqueId$1(), blob, base64);\n      blobCache.add(blobInfo);\n      return blobInfo;\n    };\n    const dataUriToBlobInfo = (blobCache, dataUri, base64Only = false) => {\n      return processDataUri(dataUri, base64Only, (base64, type) => Optional.from(blobCache.getByData(base64, type)).orThunk(() => buildBlob(type, base64).map(blob => createBlobInfo$1(blobCache, blob, base64))));\n    };\n    const imageToBlobInfo = (blobCache, imageSrc) => {\n      const invalidDataUri = () => Promise.reject('Invalid data URI');\n      if (startsWith(imageSrc, 'blob:')) {\n        const blobInfo = blobCache.getByUri(imageSrc);\n        if (isNonNullable(blobInfo)) {\n          return Promise.resolve(blobInfo);\n        } else {\n          return uriToBlob(imageSrc).then(blob => {\n            return blobToDataUri(blob).then(dataUri => {\n              return processDataUri(dataUri, false, base64 => {\n                return Optional.some(createBlobInfo$1(blobCache, blob, base64));\n              }).getOrThunk(invalidDataUri);\n            });\n          });\n        }\n      } else if (startsWith(imageSrc, 'data:')) {\n        return dataUriToBlobInfo(blobCache, imageSrc).fold(invalidDataUri, blobInfo => Promise.resolve(blobInfo));\n      } else {\n        return Promise.reject('Unknown image data format');\n      }\n    };\n\n    const hostCaptureRegex = /^(?:(?:(?:[A-Za-z][A-Za-z\\d.+-]{0,14}:\\/\\/(?:[-.~*+=!&;:'%@?^${}(),\\w]+@)?|www\\.|[-;:&=+$,.\\w]+@)([A-Za-z\\d-]+(?:\\.[A-Za-z\\d-]+)*))(?::\\d+)?(?:\\/(?:[-.~*+=!;:'%@$(),\\/\\w]*[-~*+=%@$()\\/\\w])?)?(?:\\?(?:[-.~*+=!&;:'%@?^${}(),\\/\\w]+)?)?(?:#(?:[-.~*+=!&;:'%@?^${}(),\\/\\w]+)?)?)$/;\n    const extractHost = url => Optional.from(url.match(hostCaptureRegex)).bind(ms => get$b(ms, 1)).map(h => startsWith(h, 'www.') ? h.substring(4) : h);\n\n    const sandboxIframe = (iframeNode, exclusions) => {\n      if (Optional.from(iframeNode.attr('src')).bind(extractHost).forall(host => !contains$2(exclusions, host))) {\n        iframeNode.attr('sandbox', '');\n      }\n    };\n    const isMimeType = (mime, type) => startsWith(mime, `${ type }/`);\n    const getEmbedType = type => {\n      if (isUndefined(type)) {\n        return 'iframe';\n      } else if (isMimeType(type, 'image')) {\n        return 'img';\n      } else if (isMimeType(type, 'video')) {\n        return 'video';\n      } else if (isMimeType(type, 'audio')) {\n        return 'audio';\n      } else {\n        return 'iframe';\n      }\n    };\n    const createSafeEmbed = ({type, src, width, height} = {}, sandboxIframes, sandboxIframesExclusions) => {\n      const name = getEmbedType(type);\n      const embed = new AstNode(name, 1);\n      embed.attr(name === 'audio' ? { src } : {\n        src,\n        width,\n        height\n      });\n      if (name === 'audio' || name === 'video') {\n        embed.attr('controls', '');\n      }\n      if (name === 'iframe' && sandboxIframes) {\n        sandboxIframe(embed, sandboxIframesExclusions);\n      }\n      return embed;\n    };\n\n    const isBogusImage = img => isNonNullable(img.attr('data-mce-bogus'));\n    const isInternalImageSource = img => img.attr('src') === Env.transparentSrc || isNonNullable(img.attr('data-mce-placeholder'));\n    const registerBase64ImageFilter = (parser, settings) => {\n      const {blob_cache: blobCache} = settings;\n      if (blobCache) {\n        const processImage = img => {\n          const inputSrc = img.attr('src');\n          if (isInternalImageSource(img) || isBogusImage(img) || isNullable(inputSrc)) {\n            return;\n          }\n          dataUriToBlobInfo(blobCache, inputSrc, true).each(blobInfo => {\n            img.attr('src', blobInfo.blobUri());\n          });\n        };\n        parser.addAttributeFilter('src', nodes => each$e(nodes, processImage));\n      }\n    };\n    const register$4 = (parser, settings) => {\n      var _a, _b;\n      const schema = parser.schema;\n      parser.addAttributeFilter('href', nodes => {\n        let i = nodes.length;\n        const appendRel = rel => {\n          const parts = rel.split(' ').filter(p => p.length > 0);\n          return parts.concat(['noopener']).sort().join(' ');\n        };\n        const addNoOpener = rel => {\n          const newRel = rel ? Tools.trim(rel) : '';\n          if (!/\\b(noopener)\\b/g.test(newRel)) {\n            return appendRel(newRel);\n          } else {\n            return newRel;\n          }\n        };\n        if (!settings.allow_unsafe_link_target) {\n          while (i--) {\n            const node = nodes[i];\n            if (node.name === 'a' && node.attr('target') === '_blank') {\n              node.attr('rel', addNoOpener(node.attr('rel')));\n            }\n          }\n        }\n      });\n      if (!settings.allow_html_in_named_anchor) {\n        parser.addAttributeFilter('id,name', nodes => {\n          let i = nodes.length, sibling, prevSibling, parent, node;\n          while (i--) {\n            node = nodes[i];\n            if (node.name === 'a' && node.firstChild && !node.attr('href')) {\n              parent = node.parent;\n              sibling = node.lastChild;\n              while (sibling && parent) {\n                prevSibling = sibling.prev;\n                parent.insert(sibling, node);\n                sibling = prevSibling;\n              }\n            }\n          }\n        });\n      }\n      if (settings.fix_list_elements) {\n        parser.addNodeFilter('ul,ol', nodes => {\n          let i = nodes.length, node, parentNode;\n          while (i--) {\n            node = nodes[i];\n            parentNode = node.parent;\n            if (parentNode && (parentNode.name === 'ul' || parentNode.name === 'ol')) {\n              if (node.prev && node.prev.name === 'li') {\n                node.prev.append(node);\n              } else {\n                const li = new AstNode('li', 1);\n                li.attr('style', 'list-style-type: none');\n                node.wrap(li);\n              }\n            }\n          }\n        });\n      }\n      const validClasses = schema.getValidClasses();\n      if (settings.validate && validClasses) {\n        parser.addAttributeFilter('class', nodes => {\n          var _a;\n          let i = nodes.length;\n          while (i--) {\n            const node = nodes[i];\n            const clazz = (_a = node.attr('class')) !== null && _a !== void 0 ? _a : '';\n            const classList = Tools.explode(clazz, ' ');\n            let classValue = '';\n            for (let ci = 0; ci < classList.length; ci++) {\n              const className = classList[ci];\n              let valid = false;\n              let validClassesMap = validClasses['*'];\n              if (validClassesMap && validClassesMap[className]) {\n                valid = true;\n              }\n              validClassesMap = validClasses[node.name];\n              if (!valid && validClassesMap && validClassesMap[className]) {\n                valid = true;\n              }\n              if (valid) {\n                if (classValue) {\n                  classValue += ' ';\n                }\n                classValue += className;\n              }\n            }\n            if (!classValue.length) {\n              classValue = null;\n            }\n            node.attr('class', classValue);\n          }\n        });\n      }\n      registerBase64ImageFilter(parser, settings);\n      const shouldSandboxIframes = (_a = settings.sandbox_iframes) !== null && _a !== void 0 ? _a : false;\n      const sandboxIframesExclusions = unique$1((_b = settings.sandbox_iframes_exclusions) !== null && _b !== void 0 ? _b : []);\n      if (settings.convert_unsafe_embeds) {\n        parser.addNodeFilter('object,embed', nodes => each$e(nodes, node => {\n          node.replace(createSafeEmbed({\n            type: node.attr('type'),\n            src: node.name === 'object' ? node.attr('data') : node.attr('src'),\n            width: node.attr('width'),\n            height: node.attr('height')\n          }, shouldSandboxIframes, sandboxIframesExclusions));\n        }));\n      }\n      if (shouldSandboxIframes) {\n        parser.addNodeFilter('iframe', nodes => each$e(nodes, node => sandboxIframe(node, sandboxIframesExclusions)));\n      }\n    };\n\n    /*! @license DOMPurify 3.2.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.4/LICENSE */\n\n    const {\n      entries,\n      setPrototypeOf,\n      isFrozen,\n      getPrototypeOf,\n      getOwnPropertyDescriptor\n    } = Object;\n    let {\n      freeze,\n      seal,\n      create: create$7\n    } = Object; // eslint-disable-line import/no-mutable-exports\n    let {\n      apply,\n      construct\n    } = typeof Reflect !== 'undefined' && Reflect;\n    if (!freeze) {\n      freeze = function freeze(x) {\n        return x;\n      };\n    }\n    if (!seal) {\n      seal = function seal(x) {\n        return x;\n      };\n    }\n    if (!apply) {\n      apply = function apply(fun, thisValue, args) {\n        return fun.apply(thisValue, args);\n      };\n    }\n    if (!construct) {\n      construct = function construct(Func, args) {\n        return new Func(...args);\n      };\n    }\n    const arrayForEach = unapply(Array.prototype.forEach);\n    const arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\n    const arrayPop = unapply(Array.prototype.pop);\n    const arrayPush = unapply(Array.prototype.push);\n    const arraySplice = unapply(Array.prototype.splice);\n    const stringToLowerCase = unapply(String.prototype.toLowerCase);\n    const stringToString = unapply(String.prototype.toString);\n    const stringMatch = unapply(String.prototype.match);\n    const stringReplace = unapply(String.prototype.replace);\n    const stringIndexOf = unapply(String.prototype.indexOf);\n    const stringTrim = unapply(String.prototype.trim);\n    const objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\n    const regExpTest = unapply(RegExp.prototype.test);\n    const typeErrorCreate = unconstruct(TypeError);\n    /**\n     * Creates a new function that calls the given function with a specified thisArg and arguments.\n     *\n     * @param func - The function to be wrapped and called.\n     * @returns A new function that calls the given function with a specified thisArg and arguments.\n     */\n    function unapply(func) {\n      return function (thisArg) {\n        for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n          args[_key - 1] = arguments[_key];\n        }\n        return apply(func, thisArg, args);\n      };\n    }\n    /**\n     * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n     *\n     * @param func - The constructor function to be wrapped and called.\n     * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n     */\n    function unconstruct(func) {\n      return function () {\n        for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n          args[_key2] = arguments[_key2];\n        }\n        return construct(func, args);\n      };\n    }\n    /**\n     * Add properties to a lookup table\n     *\n     * @param set - The set to which elements will be added.\n     * @param array - The array containing elements to be added to the set.\n     * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n     * @returns The modified set with added elements.\n     */\n    function addToSet(set, array) {\n      let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n      if (setPrototypeOf) {\n        // Make 'in' and truthy checks like Boolean(set.constructor)\n        // independent of any properties defined on Object.prototype.\n        // Prevent prototype setters from intercepting set as a this value.\n        setPrototypeOf(set, null);\n      }\n      let l = array.length;\n      while (l--) {\n        let element = array[l];\n        if (typeof element === 'string') {\n          const lcElement = transformCaseFunc(element);\n          if (lcElement !== element) {\n            // Config presets (e.g. tags.js, attrs.js) are immutable.\n            if (!isFrozen(array)) {\n              array[l] = lcElement;\n            }\n            element = lcElement;\n          }\n        }\n        set[element] = true;\n      }\n      return set;\n    }\n    /**\n     * Clean up an array to harden against CSPP\n     *\n     * @param array - The array to be cleaned.\n     * @returns The cleaned version of the array\n     */\n    function cleanArray(array) {\n      for (let index = 0; index < array.length; index++) {\n        const isPropertyExist = objectHasOwnProperty(array, index);\n        if (!isPropertyExist) {\n          array[index] = null;\n        }\n      }\n      return array;\n    }\n    /**\n     * Shallow clone an object\n     *\n     * @param object - The object to be cloned.\n     * @returns A new object that copies the original.\n     */\n    function clone(object) {\n      const newObject = create$7(null);\n      for (const [property, value] of entries(object)) {\n        const isPropertyExist = objectHasOwnProperty(object, property);\n        if (isPropertyExist) {\n          if (Array.isArray(value)) {\n            newObject[property] = cleanArray(value);\n          } else if (value && typeof value === 'object' && value.constructor === Object) {\n            newObject[property] = clone(value);\n          } else {\n            newObject[property] = value;\n          }\n        }\n      }\n      return newObject;\n    }\n    /**\n     * This method automatically checks if the prop is function or getter and behaves accordingly.\n     *\n     * @param object - The object to look up the getter function in its prototype chain.\n     * @param prop - The property name for which to find the getter function.\n     * @returns The getter function found in the prototype chain or a fallback function.\n     */\n    function lookupGetter(object, prop) {\n      while (object !== null) {\n        const desc = getOwnPropertyDescriptor(object, prop);\n        if (desc) {\n          if (desc.get) {\n            return unapply(desc.get);\n          }\n          if (typeof desc.value === 'function') {\n            return unapply(desc.value);\n          }\n        }\n        object = getPrototypeOf(object);\n      }\n      function fallbackValue() {\n        return null;\n      }\n      return fallbackValue;\n    }\n\n    const html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\n    const svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\n    const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n    // List of SVG elements that are disallowed by default.\n    // We still need to know them so that we can do namespace\n    // checks properly in case one wants to add them to\n    // allow-list.\n    const svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\n    const mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n    // Similarly to SVG, we want to know all MathML elements,\n    // even those that we disallow by default.\n    const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\n    const text = freeze(['#text']);\n\n    const html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);\n    const svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\n    const mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\n    const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n    // eslint-disable-next-line unicorn/better-regex\n    const MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\n    const ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\n    const TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\n    const DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\n    const ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\n    const IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n    );\n    const IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\n    const ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n    );\n    const DOCTYPE_NAME = seal(/^html$/i);\n    const CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\n    var EXPRESSIONS = /*#__PURE__*/Object.freeze({\n      __proto__: null,\n      ARIA_ATTR: ARIA_ATTR,\n      ATTR_WHITESPACE: ATTR_WHITESPACE,\n      CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n      DATA_ATTR: DATA_ATTR,\n      DOCTYPE_NAME: DOCTYPE_NAME,\n      ERB_EXPR: ERB_EXPR,\n      IS_ALLOWED_URI: IS_ALLOWED_URI,\n      IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n      MUSTACHE_EXPR: MUSTACHE_EXPR,\n      TMPLIT_EXPR: TMPLIT_EXPR\n    });\n\n    /* eslint-disable @typescript-eslint/indent */\n    // https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n    const NODE_TYPE = {\n      element: 1,\n      attribute: 2,\n      text: 3,\n      cdataSection: 4,\n      entityReference: 5,\n      // Deprecated\n      entityNode: 6,\n      // Deprecated\n      progressingInstruction: 7,\n      comment: 8,\n      document: 9,\n      documentType: 10,\n      documentFragment: 11,\n      notation: 12 // Deprecated\n    };\n    const getGlobal = function getGlobal() {\n      return typeof window === 'undefined' ? null : window;\n    };\n    /**\n     * Creates a no-op policy for internal use only.\n     * Don't export this function outside this module!\n     * @param trustedTypes The policy factory.\n     * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n     * @return The policy created (or null, if Trusted Types\n     * are not supported or creating the policy failed).\n     */\n    const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n      if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n        return null;\n      }\n      // Allow the callers to control the unique policy name\n      // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n      // Policy creation with duplicate names throws in Trusted Types.\n      let suffix = null;\n      const ATTR_NAME = 'data-tt-policy-suffix';\n      if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n        suffix = purifyHostElement.getAttribute(ATTR_NAME);\n      }\n      const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n      try {\n        return trustedTypes.createPolicy(policyName, {\n          createHTML(html) {\n            return html;\n          },\n          createScriptURL(scriptUrl) {\n            return scriptUrl;\n          }\n        });\n      } catch (_) {\n        // Policy creation failed (most likely another DOMPurify script has\n        // already run). Skip creating the policy, as this will only cause errors\n        // if TT are enforced.\n        console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n        return null;\n      }\n    };\n    const _createHooksMap = function _createHooksMap() {\n      return {\n        afterSanitizeAttributes: [],\n        afterSanitizeElements: [],\n        afterSanitizeShadowDOM: [],\n        beforeSanitizeAttributes: [],\n        beforeSanitizeElements: [],\n        beforeSanitizeShadowDOM: [],\n        uponSanitizeAttribute: [],\n        uponSanitizeElement: [],\n        uponSanitizeShadowNode: []\n      };\n    };\n    function createDOMPurify() {\n      let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n      const DOMPurify = root => createDOMPurify(root);\n      DOMPurify.version = '3.2.4';\n      DOMPurify.removed = [];\n      if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n        // Not running in a browser, provide a factory function\n        // so that you can pass your own Window\n        DOMPurify.isSupported = false;\n        return DOMPurify;\n      }\n      let {\n        document\n      } = window;\n      const originalDocument = document;\n      const currentScript = originalDocument.currentScript;\n      const {\n        DocumentFragment,\n        HTMLTemplateElement,\n        Node,\n        Element,\n        NodeFilter,\n        NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n        HTMLFormElement,\n        DOMParser,\n        trustedTypes\n      } = window;\n      const ElementPrototype = Element.prototype;\n      const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n      const remove = lookupGetter(ElementPrototype, 'remove');\n      const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n      const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n      const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n      // As per issue #47, the web-components registry is inherited by a\n      // new document created via createHTMLDocument. As per the spec\n      // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n      // a new empty registry is used when creating a template contents owner\n      // document, so we use that as our parent document to ensure nothing\n      // is inherited.\n      if (typeof HTMLTemplateElement === 'function') {\n        const template = document.createElement('template');\n        if (template.content && template.content.ownerDocument) {\n          document = template.content.ownerDocument;\n        }\n      }\n      let trustedTypesPolicy;\n      let emptyHTML = '';\n      const {\n        implementation,\n        createNodeIterator,\n        createDocumentFragment,\n        getElementsByTagName\n      } = document;\n      const {\n        importNode\n      } = originalDocument;\n      let hooks = _createHooksMap();\n      /**\n       * Expose whether this browser supports running the full DOMPurify.\n       */\n      DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n      const {\n        MUSTACHE_EXPR,\n        ERB_EXPR,\n        TMPLIT_EXPR,\n        DATA_ATTR,\n        ARIA_ATTR,\n        IS_SCRIPT_OR_DATA,\n        ATTR_WHITESPACE,\n        CUSTOM_ELEMENT\n      } = EXPRESSIONS;\n      let {\n        IS_ALLOWED_URI: IS_ALLOWED_URI$1\n      } = EXPRESSIONS;\n      /**\n       * We consider the elements and attributes below to be safe. Ideally\n       * don't add any new ones but feel free to remove unwanted ones.\n       */\n      /* allowed element names */\n      let ALLOWED_TAGS = null;\n      const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n      /* Allowed attribute names */\n      let ALLOWED_ATTR = null;\n      const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n      /*\n       * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n       * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n       * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n       * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n       */\n      let CUSTOM_ELEMENT_HANDLING = Object.seal(create$7(null, {\n        tagNameCheck: {\n          writable: true,\n          configurable: false,\n          enumerable: true,\n          value: null\n        },\n        attributeNameCheck: {\n          writable: true,\n          configurable: false,\n          enumerable: true,\n          value: null\n        },\n        allowCustomizedBuiltInElements: {\n          writable: true,\n          configurable: false,\n          enumerable: true,\n          value: false\n        }\n      }));\n      /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n      let FORBID_TAGS = null;\n      /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n      let FORBID_ATTR = null;\n      /* Decide if ARIA attributes are okay */\n      let ALLOW_ARIA_ATTR = true;\n      /* Decide if custom data attributes are okay */\n      let ALLOW_DATA_ATTR = true;\n      /* Decide if unknown protocols are okay */\n      let ALLOW_UNKNOWN_PROTOCOLS = false;\n      /* Decide if self-closing tags in attributes are allowed.\n       * Usually removed due to a mXSS issue in jQuery 3.0 */\n      let ALLOW_SELF_CLOSE_IN_ATTR = true;\n      /* Output should be safe for common template engines.\n       * This means, DOMPurify removes data attributes, mustaches and ERB\n       */\n      let SAFE_FOR_TEMPLATES = false;\n      /* Output should be safe even for XML used within HTML and alike.\n       * This means, DOMPurify removes comments when containing risky content.\n       */\n      let SAFE_FOR_XML = true;\n      /* Decide if document with <html>... should be returned */\n      let WHOLE_DOCUMENT = false;\n      /* Track whether config is already set on this instance of DOMPurify. */\n      let SET_CONFIG = false;\n      /* Decide if all elements (e.g. style, script) must be children of\n       * document.body. By default, browsers might move them to document.head */\n      let FORCE_BODY = false;\n      /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n       * string (or a TrustedHTML object if Trusted Types are supported).\n       * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n       */\n      let RETURN_DOM = false;\n      /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n       * string  (or a TrustedHTML object if Trusted Types are supported) */\n      let RETURN_DOM_FRAGMENT = false;\n      /* Try to return a Trusted Type object instead of a string, return a string in\n       * case Trusted Types are not supported  */\n      let RETURN_TRUSTED_TYPE = false;\n      /* Output should be free from DOM clobbering attacks?\n       * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n       */\n      let SANITIZE_DOM = true;\n      /* Achieve full DOM Clobbering protection by isolating the namespace of named\n       * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n       *\n       * HTML/DOM spec rules that enable DOM Clobbering:\n       *   - Named Access on Window (§7.3.3)\n       *   - DOM Tree Accessors (§3.1.5)\n       *   - Form Element Parent-Child Relations (§4.10.3)\n       *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n       *   - HTMLCollection (§4.2.10.2)\n       *\n       * Namespace isolation is implemented by prefixing `id` and `name` attributes\n       * with a constant string, i.e., `user-content-`\n       */\n      let SANITIZE_NAMED_PROPS = false;\n      const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n      /* Keep element content when removing element? */\n      let KEEP_CONTENT = true;\n      /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n       * of importing it into a new Document and returning a sanitized copy */\n      let IN_PLACE = false;\n      /* Allow usage of profiles like html, svg and mathMl */\n      let USE_PROFILES = {};\n      /* Tags to ignore content of when KEEP_CONTENT is true */\n      let FORBID_CONTENTS = null;\n      const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n      /* Tags that are safe for data: URIs */\n      let DATA_URI_TAGS = null;\n      const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n      /* Attributes safe for values like \"javascript:\" */\n      let URI_SAFE_ATTRIBUTES = null;\n      const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n      const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n      const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n      const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n      /* Document namespace */\n      let NAMESPACE = HTML_NAMESPACE;\n      let IS_EMPTY_INPUT = false;\n      /* Allowed XHTML+XML namespaces */\n      let ALLOWED_NAMESPACES = null;\n      const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n      let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n      let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n      // Certain elements are allowed in both SVG and HTML\n      // namespace. We need to specify them explicitly\n      // so that they don't get erroneously deleted from\n      // HTML namespace.\n      const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n      /* Parsing of strict XHTML documents */\n      let PARSER_MEDIA_TYPE = null;\n      const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n      const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n      let transformCaseFunc = null;\n      /* Keep a reference to config to pass to hooks */\n      let CONFIG = null;\n      /* Ideally, do not touch anything below this line */\n      /* ______________________________________________ */\n      const formElement = document.createElement('form');\n      const isRegexOrFunction = function isRegexOrFunction(testValue) {\n        return testValue instanceof RegExp || testValue instanceof Function;\n      };\n      /**\n       * _parseConfig\n       *\n       * @param cfg optional config literal\n       */\n      // eslint-disable-next-line complexity\n      const _parseConfig = function _parseConfig() {\n        let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        if (CONFIG && CONFIG === cfg) {\n          return;\n        }\n        /* Shield configuration object from tampering */\n        if (!cfg || typeof cfg !== 'object') {\n          cfg = {};\n        }\n        /* Shield configuration object from prototype pollution */\n        cfg = clone(cfg);\n        PARSER_MEDIA_TYPE =\n        // eslint-disable-next-line unicorn/prefer-includes\n        SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n        // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n        transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n        /* Set configuration parameters */\n        ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n        ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n        ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n        URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n        DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n        FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n        FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};\n        FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};\n        USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n        ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n        ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n        ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n        ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n        SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n        SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n        WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n        RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n        RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n        RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n        FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n        SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n        SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n        KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n        IN_PLACE = cfg.IN_PLACE || false; // Default false\n        IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n        NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n        MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;\n        HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;\n        CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n        if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n          CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n        }\n        if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n          CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n        }\n        if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n          CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n        }\n        if (SAFE_FOR_TEMPLATES) {\n          ALLOW_DATA_ATTR = false;\n        }\n        if (RETURN_DOM_FRAGMENT) {\n          RETURN_DOM = true;\n        }\n        /* Parse profile info */\n        if (USE_PROFILES) {\n          ALLOWED_TAGS = addToSet({}, text);\n          ALLOWED_ATTR = [];\n          if (USE_PROFILES.html === true) {\n            addToSet(ALLOWED_TAGS, html$1);\n            addToSet(ALLOWED_ATTR, html);\n          }\n          if (USE_PROFILES.svg === true) {\n            addToSet(ALLOWED_TAGS, svg$1);\n            addToSet(ALLOWED_ATTR, svg);\n            addToSet(ALLOWED_ATTR, xml);\n          }\n          if (USE_PROFILES.svgFilters === true) {\n            addToSet(ALLOWED_TAGS, svgFilters);\n            addToSet(ALLOWED_ATTR, svg);\n            addToSet(ALLOWED_ATTR, xml);\n          }\n          if (USE_PROFILES.mathMl === true) {\n            addToSet(ALLOWED_TAGS, mathMl$1);\n            addToSet(ALLOWED_ATTR, mathMl);\n            addToSet(ALLOWED_ATTR, xml);\n          }\n        }\n        /* Merge configuration parameters */\n        if (cfg.ADD_TAGS) {\n          if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n            ALLOWED_TAGS = clone(ALLOWED_TAGS);\n          }\n          addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n        }\n        if (cfg.ADD_ATTR) {\n          if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n            ALLOWED_ATTR = clone(ALLOWED_ATTR);\n          }\n          addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n        }\n        if (cfg.ADD_URI_SAFE_ATTR) {\n          addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n        }\n        if (cfg.FORBID_CONTENTS) {\n          if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n            FORBID_CONTENTS = clone(FORBID_CONTENTS);\n          }\n          addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n        }\n        /* Add #text in case KEEP_CONTENT is set to true */\n        if (KEEP_CONTENT) {\n          ALLOWED_TAGS['#text'] = true;\n        }\n        /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n        if (WHOLE_DOCUMENT) {\n          addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n        }\n        /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n        if (ALLOWED_TAGS.table) {\n          addToSet(ALLOWED_TAGS, ['tbody']);\n          delete FORBID_TAGS.tbody;\n        }\n        if (cfg.TRUSTED_TYPES_POLICY) {\n          if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n            throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n          }\n          if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n            throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n          }\n          // Overwrite existing TrustedTypes policy.\n          trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n          // Sign local variables required by `sanitize`.\n          emptyHTML = trustedTypesPolicy.createHTML('');\n        } else {\n          // Uninitialized policy, attempt to initialize the internal dompurify policy.\n          if (trustedTypesPolicy === undefined) {\n            trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n          }\n          // If creating the internal policy succeeded sign internal variables.\n          if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n            emptyHTML = trustedTypesPolicy.createHTML('');\n          }\n        }\n        // Prevent further manipulation of configuration.\n        // Not available in IE8, Safari 5, etc.\n        if (freeze) {\n          freeze(cfg);\n        }\n        CONFIG = cfg;\n      };\n      /* Keep track of all possible SVG and MathML tags\n       * so that we can perform the namespace checks\n       * correctly. */\n      const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n      const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n      /**\n       * @param element a DOM element whose namespace is being checked\n       * @returns Return false if the element has a\n       *  namespace that a spec-compliant parser would never\n       *  return. Return true otherwise.\n       */\n      const _checkValidNamespace = function _checkValidNamespace(element) {\n        let parent = getParentNode(element);\n        // In JSDOM, if we're inside shadow DOM, then parentNode\n        // can be null. We just simulate parent in this case.\n        if (!parent || !parent.tagName) {\n          parent = {\n            namespaceURI: NAMESPACE,\n            tagName: 'template'\n          };\n        }\n        const tagName = stringToLowerCase(element.tagName);\n        const parentTagName = stringToLowerCase(parent.tagName);\n        if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n          return false;\n        }\n        if (element.namespaceURI === SVG_NAMESPACE) {\n          // The only way to switch from HTML namespace to SVG\n          // is via <svg>. If it happens via any other tag, then\n          // it should be killed.\n          if (parent.namespaceURI === HTML_NAMESPACE) {\n            return tagName === 'svg';\n          }\n          // The only way to switch from MathML to SVG is via`\n          // svg if parent is either <annotation-xml> or MathML\n          // text integration points.\n          if (parent.namespaceURI === MATHML_NAMESPACE) {\n            return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n          }\n          // We only allow elements that are defined in SVG\n          // spec. All others are disallowed in SVG namespace.\n          return Boolean(ALL_SVG_TAGS[tagName]);\n        }\n        if (element.namespaceURI === MATHML_NAMESPACE) {\n          // The only way to switch from HTML namespace to MathML\n          // is via <math>. If it happens via any other tag, then\n          // it should be killed.\n          if (parent.namespaceURI === HTML_NAMESPACE) {\n            return tagName === 'math';\n          }\n          // The only way to switch from SVG to MathML is via\n          // <math> and HTML integration points\n          if (parent.namespaceURI === SVG_NAMESPACE) {\n            return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n          }\n          // We only allow elements that are defined in MathML\n          // spec. All others are disallowed in MathML namespace.\n          return Boolean(ALL_MATHML_TAGS[tagName]);\n        }\n        if (element.namespaceURI === HTML_NAMESPACE) {\n          // The only way to switch from SVG to HTML is via\n          // HTML integration points, and from MathML to HTML\n          // is via MathML text integration points\n          if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n            return false;\n          }\n          if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n            return false;\n          }\n          // We disallow tags that are specific for MathML\n          // or SVG and should never appear in HTML namespace\n          return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n        }\n        // For XHTML and XML documents that support custom namespaces\n        if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n          return true;\n        }\n        // The code should never reach this place (this means\n        // that the element somehow got namespace that is not\n        // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n        // Return false just in case.\n        return false;\n      };\n      /**\n       * _forceRemove\n       *\n       * @param node a DOM node\n       */\n      const _forceRemove = function _forceRemove(node) {\n        arrayPush(DOMPurify.removed, {\n          element: node\n        });\n        try {\n          // eslint-disable-next-line unicorn/prefer-dom-node-remove\n          getParentNode(node).removeChild(node);\n        } catch (_) {\n          remove(node);\n        }\n      };\n      /**\n       * _removeAttribute\n       *\n       * @param name an Attribute name\n       * @param element a DOM node\n       */\n      const _removeAttribute = function _removeAttribute(name, element) {\n        try {\n          arrayPush(DOMPurify.removed, {\n            attribute: element.getAttributeNode(name),\n            from: element\n          });\n        } catch (_) {\n          arrayPush(DOMPurify.removed, {\n            attribute: null,\n            from: element\n          });\n        }\n        element.removeAttribute(name);\n        // We void attribute values for unremovable \"is\" attributes\n        if (name === 'is') {\n          if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n            try {\n              _forceRemove(element);\n            } catch (_) {}\n          } else {\n            try {\n              element.setAttribute(name, '');\n            } catch (_) {}\n          }\n        }\n      };\n      /**\n       * _initDocument\n       *\n       * @param dirty - a string of dirty markup\n       * @return a DOM, filled with the dirty markup\n       */\n      const _initDocument = function _initDocument(dirty) {\n        /* Create a HTML document */\n        let doc = null;\n        let leadingWhitespace = null;\n        if (FORCE_BODY) {\n          dirty = '<remove></remove>' + dirty;\n        } else {\n          /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n          const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n          leadingWhitespace = matches && matches[0];\n        }\n        if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n          // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n          dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n        }\n        const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n        /*\n         * Use the DOMParser API by default, fallback later if needs be\n         * DOMParser not work for svg when has multiple root element.\n         */\n        if (NAMESPACE === HTML_NAMESPACE) {\n          try {\n            doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n          } catch (_) {}\n        }\n        /* Use createHTMLDocument in case DOMParser is not available */\n        if (!doc || !doc.documentElement) {\n          doc = implementation.createDocument(NAMESPACE, 'template', null);\n          try {\n            doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n          } catch (_) {\n            // Syntax error if dirtyPayload is invalid xml\n          }\n        }\n        const body = doc.body || doc.documentElement;\n        if (dirty && leadingWhitespace) {\n          body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n        }\n        /* Work on whole document or just its body */\n        if (NAMESPACE === HTML_NAMESPACE) {\n          return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n        }\n        return WHOLE_DOCUMENT ? doc.documentElement : body;\n      };\n      /**\n       * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n       *\n       * @param root The root element or node to start traversing on.\n       * @return The created NodeIterator\n       */\n      const _createNodeIterator = function _createNodeIterator(root) {\n        return createNodeIterator.call(root.ownerDocument || root, root,\n        // eslint-disable-next-line no-bitwise\n        NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n      };\n      /**\n       * _isClobbered\n       *\n       * @param element element to check for clobbering attacks\n       * @return true if clobbered, false if safe\n       */\n      const _isClobbered = function _isClobbered(element) {\n        return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n      };\n      /**\n       * Checks whether the given object is a DOM node.\n       *\n       * @param value object to check whether it's a DOM node\n       * @return true is object is a DOM node\n       */\n      const _isNode = function _isNode(value) {\n        return typeof Node === 'function' && value instanceof Node;\n      };\n      function _executeHooks(hooks, currentNode, data) {\n        arrayForEach(hooks, hook => {\n          hook.call(DOMPurify, currentNode, data, CONFIG);\n        });\n      }\n      /**\n       * _sanitizeElements\n       *\n       * @protect nodeName\n       * @protect textContent\n       * @protect removeChild\n       * @param currentNode to check for permission to exist\n       * @return true if node was killed, false if left alive\n       */\n      const _sanitizeElements = function _sanitizeElements(currentNode) {\n        let content = null;\n        /* Execute a hook if present */\n        _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n        /* Check if element is clobbered or can clobber */\n        if (_isClobbered(currentNode)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Now let's check the element's type and name */\n        const tagName = transformCaseFunc(currentNode.nodeName);\n        /* Execute a hook if present */\n        _executeHooks(hooks.uponSanitizeElement, currentNode, {\n          tagName,\n          allowedTags: ALLOWED_TAGS\n        });\n        /* Detect mXSS attempts abusing namespace confusion */\n        if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Remove any occurrence of processing instructions */\n        if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Remove any kind of possibly harmful comments */\n        if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Remove element if anything forbids its presence */\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          /* Check if we have a custom element to handle */\n          if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n            if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n              return false;\n            }\n            if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n              return false;\n            }\n          }\n          /* Keep content except for bad-listed elements */\n          if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n            const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n            const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n            if (childNodes && parentNode) {\n              const childCount = childNodes.length;\n              for (let i = childCount - 1; i >= 0; --i) {\n                const childClone = cloneNode(childNodes[i], true);\n                childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n                parentNode.insertBefore(childClone, getNextSibling(currentNode));\n              }\n            }\n          }\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Check whether element has a valid namespace */\n        if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Make sure that older browsers don't get fallback-tag mXSS */\n        if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        /* Sanitize element content to be template-safe */\n        if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n          /* Get the element's text content */\n          content = currentNode.textContent;\n          arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n            content = stringReplace(content, expr, ' ');\n          });\n          if (currentNode.textContent !== content) {\n            arrayPush(DOMPurify.removed, {\n              element: currentNode.cloneNode()\n            });\n            currentNode.textContent = content;\n          }\n        }\n        /* Execute a hook if present */\n        _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n        return false;\n      };\n      /**\n       * _isValidAttribute\n       *\n       * @param lcTag Lowercase tag name of containing element.\n       * @param lcName Lowercase attribute name.\n       * @param value Attribute value.\n       * @return Returns true if `value` is valid, otherwise false.\n       */\n      // eslint-disable-next-line complexity\n      const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n        /* Make sure attribute cannot clobber */\n        if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n          return false;\n        }\n        /* Allow valid data-* attributes: At least one character after \"-\"\n            (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n            XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n            We don't need to check the value; it's always URI safe. */\n        if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n          if (\n          // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n          // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n          // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n          _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) ||\n          // Alternative, second condition checks if it's an `is`-attribute, AND\n          // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n          lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n            return false;\n          }\n          /* Check value is safe. First, is attr inert? If so, is safe */\n        } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n          return false;\n        } else ;\n        return true;\n      };\n      /**\n       * _isBasicCustomElement\n       * checks if at least one dash is included in tagName, and it's not the first char\n       * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n       *\n       * @param tagName name of the tag of the node to sanitize\n       * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n       */\n      const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n        return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n      };\n      /**\n       * _sanitizeAttributes\n       *\n       * @protect attributes\n       * @protect nodeName\n       * @protect removeAttribute\n       * @protect setAttribute\n       *\n       * @param currentNode to sanitize\n       */\n      const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n        /* Execute a hook if present */\n        _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n        const {\n          attributes\n        } = currentNode;\n        /* Check if we have attributes; if not we might have a text node */\n        if (!attributes || _isClobbered(currentNode)) {\n          return;\n        }\n        const hookEvent = {\n          attrName: '',\n          attrValue: '',\n          keepAttr: true,\n          allowedAttributes: ALLOWED_ATTR,\n          forceKeepAttr: undefined\n        };\n        let l = attributes.length;\n        /* Go backwards over all attributes; safely remove bad ones */\n        while (l--) {\n          const attr = attributes[l];\n          const {\n            name,\n            namespaceURI,\n            value: attrValue\n          } = attr;\n          const lcName = transformCaseFunc(name);\n          let value = name === 'value' ? attrValue : stringTrim(attrValue);\n          const initValue = value;\n          /* Execute a hook if present */\n          hookEvent.attrName = lcName;\n          hookEvent.attrValue = value;\n          hookEvent.keepAttr = true;\n          hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n          _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n          value = hookEvent.attrValue;\n          /* Full DOM Clobbering protection via namespace isolation,\n           * Prefix id and name attributes with `user-content-`\n           */\n          if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n            // Remove the attribute with this value\n            _removeAttribute(name, currentNode);\n            // Prefix the value and later re-create the attribute with the sanitized value\n            value = SANITIZE_NAMED_PROPS_PREFIX + value;\n          }\n          /* Work around a security issue with comments inside attributes */\n          if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title)/i, value)) {\n            _removeAttribute(name, currentNode);\n            continue;\n          }\n          /* Did the hooks approve of the attribute? */\n          if (hookEvent.forceKeepAttr) {\n            continue;\n          }\n          /* Did the hooks approve of the attribute? */\n          if (!hookEvent.keepAttr) {\n            _removeAttribute(name, currentNode);\n            continue;\n          }\n          /* Work around a security issue in jQuery 3.0 */\n          if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n            _removeAttribute(name, currentNode);\n            continue;\n          }\n          /* Sanitize attribute content to be template-safe */\n          if (SAFE_FOR_TEMPLATES) {\n            arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n              value = stringReplace(value, expr, ' ');\n            });\n          }\n          /* Is `value` valid for this attribute? */\n          const lcTag = transformCaseFunc(currentNode.nodeName);\n          if (!_isValidAttribute(lcTag, lcName, value)) {\n            _removeAttribute(name, currentNode);\n            continue;\n          }\n          /* Handle attributes that require Trusted Types */\n          if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n            if (namespaceURI) ; else {\n              switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n                case 'TrustedHTML':\n                  {\n                    value = trustedTypesPolicy.createHTML(value);\n                    break;\n                  }\n                case 'TrustedScriptURL':\n                  {\n                    value = trustedTypesPolicy.createScriptURL(value);\n                    break;\n                  }\n              }\n            }\n          }\n          /* Handle invalid data-* attribute set by try-catching it */\n          if (value !== initValue) {\n            try {\n              if (namespaceURI) {\n                currentNode.setAttributeNS(namespaceURI, name, value);\n              } else {\n                /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n                currentNode.setAttribute(name, value);\n              }\n              if (_isClobbered(currentNode)) {\n                _forceRemove(currentNode);\n              } else {\n                arrayPop(DOMPurify.removed);\n              }\n            } catch (_) {}\n          }\n        }\n        /* Execute a hook if present */\n        _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n      };\n      /**\n       * _sanitizeShadowDOM\n       *\n       * @param fragment to iterate over recursively\n       */\n      const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n        let shadowNode = null;\n        const shadowIterator = _createNodeIterator(fragment);\n        /* Execute a hook if present */\n        _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n        while (shadowNode = shadowIterator.nextNode()) {\n          /* Execute a hook if present */\n          _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n          /* Sanitize tags and elements */\n          _sanitizeElements(shadowNode);\n          /* Check attributes next */\n          _sanitizeAttributes(shadowNode);\n          /* Deep shadow DOM detected */\n          if (shadowNode.content instanceof DocumentFragment) {\n            _sanitizeShadowDOM(shadowNode.content);\n          }\n        }\n        /* Execute a hook if present */\n        _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n      };\n      // eslint-disable-next-line complexity\n      DOMPurify.sanitize = function (dirty) {\n        let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        let body = null;\n        let importedNode = null;\n        let currentNode = null;\n        let returnNode = null;\n        /* Make sure we have a string to sanitize.\n          DO NOT return early, as this will return the wrong type if\n          the user has requested a DOM object rather than a string */\n        IS_EMPTY_INPUT = !dirty;\n        if (IS_EMPTY_INPUT) {\n          dirty = '<!-->';\n        }\n        /* Stringify, in case dirty is an object */\n        if (typeof dirty !== 'string' && !_isNode(dirty)) {\n          if (typeof dirty.toString === 'function') {\n            dirty = dirty.toString();\n            if (typeof dirty !== 'string') {\n              throw typeErrorCreate('dirty is not a string, aborting');\n            }\n          } else {\n            throw typeErrorCreate('toString is not a function');\n          }\n        }\n        /* Return dirty HTML if DOMPurify cannot run */\n        if (!DOMPurify.isSupported) {\n          return dirty;\n        }\n        /* Assign config vars */\n        if (!SET_CONFIG) {\n          _parseConfig(cfg);\n        }\n        /* Clean up removed elements */\n        DOMPurify.removed = [];\n        /* Check if dirty is correctly typed for IN_PLACE */\n        if (typeof dirty === 'string') {\n          IN_PLACE = false;\n        }\n        if (IN_PLACE) {\n          /* Do some early pre-sanitization to avoid unsafe root nodes */\n          if (dirty.nodeName) {\n            const tagName = transformCaseFunc(dirty.nodeName);\n            if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n              throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n            }\n          }\n        } else if (dirty instanceof Node) {\n          /* If dirty is a DOM element, append to an empty document to avoid\n             elements being stripped by the parser */\n          body = _initDocument('<!---->');\n          importedNode = body.ownerDocument.importNode(dirty, true);\n          if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n            /* Node is already a body, use as is */\n            body = importedNode;\n          } else if (importedNode.nodeName === 'HTML') {\n            body = importedNode;\n          } else {\n            // eslint-disable-next-line unicorn/prefer-dom-node-append\n            body.appendChild(importedNode);\n          }\n        } else {\n          /* Exit directly if we have nothing to do */\n          if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n          // eslint-disable-next-line unicorn/prefer-includes\n          dirty.indexOf('<') === -1) {\n            return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n          }\n          /* Initialize the document to work on */\n          body = _initDocument(dirty);\n          /* Check we have a DOM node from the data */\n          if (!body) {\n            return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n          }\n        }\n        /* Remove first element node (ours) if FORCE_BODY is set */\n        if (body && FORCE_BODY) {\n          _forceRemove(body.firstChild);\n        }\n        /* Get node iterator */\n        const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n        /* Now start iterating over the created document */\n        while (currentNode = nodeIterator.nextNode()) {\n          /* Sanitize tags and elements */\n          _sanitizeElements(currentNode);\n          /* Check attributes next */\n          _sanitizeAttributes(currentNode);\n          /* Shadow DOM detected, sanitize it */\n          if (currentNode.content instanceof DocumentFragment) {\n            _sanitizeShadowDOM(currentNode.content);\n          }\n        }\n        /* If we sanitized `dirty` in-place, return it. */\n        if (IN_PLACE) {\n          return dirty;\n        }\n        /* Return sanitized string or DOM */\n        if (RETURN_DOM) {\n          if (RETURN_DOM_FRAGMENT) {\n            returnNode = createDocumentFragment.call(body.ownerDocument);\n            while (body.firstChild) {\n              // eslint-disable-next-line unicorn/prefer-dom-node-append\n              returnNode.appendChild(body.firstChild);\n            }\n          } else {\n            returnNode = body;\n          }\n          if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n            /*\n              AdoptNode() is not used because internal state is not reset\n              (e.g. the past names map of a HTMLFormElement), this is safe\n              in theory but we would rather not risk another attack vector.\n              The state that is cloned by importNode() is explicitly defined\n              by the specs.\n            */\n            returnNode = importNode.call(originalDocument, returnNode, true);\n          }\n          return returnNode;\n        }\n        let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n        /* Serialize doctype if allowed */\n        if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n          serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n        }\n        /* Sanitize final string template-safe */\n        if (SAFE_FOR_TEMPLATES) {\n          arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n            serializedHTML = stringReplace(serializedHTML, expr, ' ');\n          });\n        }\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n      };\n      DOMPurify.setConfig = function () {\n        let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        _parseConfig(cfg);\n        SET_CONFIG = true;\n      };\n      DOMPurify.clearConfig = function () {\n        CONFIG = null;\n        SET_CONFIG = false;\n      };\n      DOMPurify.isValidAttribute = function (tag, attr, value) {\n        /* Initialize shared config vars if necessary. */\n        if (!CONFIG) {\n          _parseConfig({});\n        }\n        const lcTag = transformCaseFunc(tag);\n        const lcName = transformCaseFunc(attr);\n        return _isValidAttribute(lcTag, lcName, value);\n      };\n      DOMPurify.addHook = function (entryPoint, hookFunction) {\n        if (typeof hookFunction !== 'function') {\n          return;\n        }\n        arrayPush(hooks[entryPoint], hookFunction);\n      };\n      DOMPurify.removeHook = function (entryPoint, hookFunction) {\n        if (hookFunction !== undefined) {\n          const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n          return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n        }\n        return arrayPop(hooks[entryPoint]);\n      };\n      DOMPurify.removeHooks = function (entryPoint) {\n        hooks[entryPoint] = [];\n      };\n      DOMPurify.removeAllHooks = function () {\n        hooks = _createHooksMap();\n      };\n      return DOMPurify;\n    }\n    var purify = createDOMPurify();\n\n    const each$4 = Tools.each, trim = Tools.trim;\n    const queryParts = [\n      'source',\n      'protocol',\n      'authority',\n      'userInfo',\n      'user',\n      'password',\n      'host',\n      'port',\n      'relative',\n      'path',\n      'directory',\n      'file',\n      'query',\n      'anchor'\n    ];\n    const DEFAULT_PORTS = {\n      ftp: 21,\n      http: 80,\n      https: 443,\n      mailto: 25\n    };\n    const safeSvgDataUrlElements = [\n      'img',\n      'video'\n    ];\n    const blockSvgDataUris = (allowSvgDataUrls, tagName) => {\n      if (isNonNullable(allowSvgDataUrls)) {\n        return !allowSvgDataUrls;\n      } else {\n        return isNonNullable(tagName) ? !contains$2(safeSvgDataUrlElements, tagName) : true;\n      }\n    };\n    const decodeUri = encodedUri => {\n      try {\n        return decodeURIComponent(encodedUri);\n      } catch (ex) {\n        return unescape(encodedUri);\n      }\n    };\n    const isInvalidUri = (settings, uri, tagName) => {\n      const decodedUri = decodeUri(uri).replace(/\\s/g, '');\n      if (settings.allow_script_urls) {\n        return false;\n      } else if (/((java|vb)script|mhtml):/i.test(decodedUri)) {\n        return true;\n      } else if (settings.allow_html_data_urls) {\n        return false;\n      } else if (/^data:image\\//i.test(decodedUri)) {\n        return blockSvgDataUris(settings.allow_svg_data_urls, tagName) && /^data:image\\/svg\\+xml/i.test(decodedUri);\n      } else {\n        return /^data:/i.test(decodedUri);\n      }\n    };\n    class URI {\n      static parseDataUri(uri) {\n        let type;\n        const uriComponents = decodeURIComponent(uri).split(',');\n        const matches = /data:([^;]+)/.exec(uriComponents[0]);\n        if (matches) {\n          type = matches[1];\n        }\n        return {\n          type,\n          data: uriComponents[1]\n        };\n      }\n      static isDomSafe(uri, context, options = {}) {\n        if (options.allow_script_urls) {\n          return true;\n        } else {\n          const decodedUri = Entities.decode(uri).replace(/[\\s\\u0000-\\u001F]+/g, '');\n          return !isInvalidUri(options, decodedUri, context);\n        }\n      }\n      static getDocumentBaseUrl(loc) {\n        var _a;\n        let baseUrl;\n        if (loc.protocol.indexOf('http') !== 0 && loc.protocol !== 'file:') {\n          baseUrl = (_a = loc.href) !== null && _a !== void 0 ? _a : '';\n        } else {\n          baseUrl = loc.protocol + '//' + loc.host + loc.pathname;\n        }\n        if (/^[^:]+:\\/\\/\\/?[^\\/]+\\//.test(baseUrl)) {\n          baseUrl = baseUrl.replace(/[\\?#].*$/, '').replace(/[\\/\\\\][^\\/]+$/, '');\n          if (!/[\\/\\\\]$/.test(baseUrl)) {\n            baseUrl += '/';\n          }\n        }\n        return baseUrl;\n      }\n      constructor(url, settings = {}) {\n        this.path = '';\n        this.directory = '';\n        url = trim(url);\n        this.settings = settings;\n        const baseUri = settings.base_uri;\n        const self = this;\n        if (/^([\\w\\-]+):([^\\/]{2})/i.test(url) || /^\\s*#/.test(url)) {\n          self.source = url;\n          return;\n        }\n        const isProtocolRelative = url.indexOf('//') === 0;\n        if (url.indexOf('/') === 0 && !isProtocolRelative) {\n          url = (baseUri ? baseUri.protocol || 'http' : 'http') + '://mce_host' + url;\n        }\n        if (!/^[\\w\\-]*:?\\/\\//.test(url)) {\n          const baseUrl = baseUri ? baseUri.path : new URI(document.location.href).directory;\n          if ((baseUri === null || baseUri === void 0 ? void 0 : baseUri.protocol) === '') {\n            url = '//mce_host' + self.toAbsPath(baseUrl, url);\n          } else {\n            const match = /([^#?]*)([#?]?.*)/.exec(url);\n            if (match) {\n              url = (baseUri && baseUri.protocol || 'http') + '://mce_host' + self.toAbsPath(baseUrl, match[1]) + match[2];\n            }\n          }\n        }\n        url = url.replace(/@@/g, '(mce_at)');\n        const urlMatch = /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@\\/]*):?([^:@\\/]*))?@)?(\\[[a-zA-Z0-9:.%]+\\]|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/.exec(url);\n        if (urlMatch) {\n          each$4(queryParts, (v, i) => {\n            let part = urlMatch[i];\n            if (part) {\n              part = part.replace(/\\(mce_at\\)/g, '@@');\n            }\n            self[v] = part;\n          });\n        }\n        if (baseUri) {\n          if (!self.protocol) {\n            self.protocol = baseUri.protocol;\n          }\n          if (!self.userInfo) {\n            self.userInfo = baseUri.userInfo;\n          }\n          if (!self.port && self.host === 'mce_host') {\n            self.port = baseUri.port;\n          }\n          if (!self.host || self.host === 'mce_host') {\n            self.host = baseUri.host;\n          }\n          self.source = '';\n        }\n        if (isProtocolRelative) {\n          self.protocol = '';\n        }\n      }\n      setPath(path) {\n        const pathMatch = /^(.*?)\\/?(\\w+)?$/.exec(path);\n        if (pathMatch) {\n          this.path = pathMatch[0];\n          this.directory = pathMatch[1];\n          this.file = pathMatch[2];\n        }\n        this.source = '';\n        this.getURI();\n      }\n      toRelative(uri) {\n        if (uri === './') {\n          return uri;\n        }\n        const relativeUri = new URI(uri, { base_uri: this });\n        if (relativeUri.host !== 'mce_host' && this.host !== relativeUri.host && relativeUri.host || this.port !== relativeUri.port || this.protocol !== relativeUri.protocol && relativeUri.protocol !== '') {\n          return relativeUri.getURI();\n        }\n        const tu = this.getURI(), uu = relativeUri.getURI();\n        if (tu === uu || tu.charAt(tu.length - 1) === '/' && tu.substr(0, tu.length - 1) === uu) {\n          return tu;\n        }\n        let output = this.toRelPath(this.path, relativeUri.path);\n        if (relativeUri.query) {\n          output += '?' + relativeUri.query;\n        }\n        if (relativeUri.anchor) {\n          output += '#' + relativeUri.anchor;\n        }\n        return output;\n      }\n      toAbsolute(uri, noHost) {\n        const absoluteUri = new URI(uri, { base_uri: this });\n        return absoluteUri.getURI(noHost && this.isSameOrigin(absoluteUri));\n      }\n      isSameOrigin(uri) {\n        if (this.host == uri.host && this.protocol == uri.protocol) {\n          if (this.port == uri.port) {\n            return true;\n          }\n          const defaultPort = this.protocol ? DEFAULT_PORTS[this.protocol] : null;\n          if (defaultPort && (this.port || defaultPort) == (uri.port || defaultPort)) {\n            return true;\n          }\n        }\n        return false;\n      }\n      toRelPath(base, path) {\n        let breakPoint = 0, out = '', i, l;\n        const normalizedBase = base.substring(0, base.lastIndexOf('/')).split('/');\n        const items = path.split('/');\n        if (normalizedBase.length >= items.length) {\n          for (i = 0, l = normalizedBase.length; i < l; i++) {\n            if (i >= items.length || normalizedBase[i] !== items[i]) {\n              breakPoint = i + 1;\n              break;\n            }\n          }\n        }\n        if (normalizedBase.length < items.length) {\n          for (i = 0, l = items.length; i < l; i++) {\n            if (i >= normalizedBase.length || normalizedBase[i] !== items[i]) {\n              breakPoint = i + 1;\n              break;\n            }\n          }\n        }\n        if (breakPoint === 1) {\n          return path;\n        }\n        for (i = 0, l = normalizedBase.length - (breakPoint - 1); i < l; i++) {\n          out += '../';\n        }\n        for (i = breakPoint - 1, l = items.length; i < l; i++) {\n          if (i !== breakPoint - 1) {\n            out += '/' + items[i];\n          } else {\n            out += items[i];\n          }\n        }\n        return out;\n      }\n      toAbsPath(base, path) {\n        let nb = 0;\n        const tr = /\\/$/.test(path) ? '/' : '';\n        const normalizedBase = base.split('/');\n        const normalizedPath = path.split('/');\n        const baseParts = [];\n        each$4(normalizedBase, k => {\n          if (k) {\n            baseParts.push(k);\n          }\n        });\n        const pathParts = [];\n        for (let i = normalizedPath.length - 1; i >= 0; i--) {\n          if (normalizedPath[i].length === 0 || normalizedPath[i] === '.') {\n            continue;\n          }\n          if (normalizedPath[i] === '..') {\n            nb++;\n            continue;\n          }\n          if (nb > 0) {\n            nb--;\n            continue;\n          }\n          pathParts.push(normalizedPath[i]);\n        }\n        const i = baseParts.length - nb;\n        let outPath;\n        if (i <= 0) {\n          outPath = reverse(pathParts).join('/');\n        } else {\n          outPath = baseParts.slice(0, i).join('/') + '/' + reverse(pathParts).join('/');\n        }\n        if (outPath.indexOf('/') !== 0) {\n          outPath = '/' + outPath;\n        }\n        if (tr && outPath.lastIndexOf('/') !== outPath.length - 1) {\n          outPath += tr;\n        }\n        return outPath;\n      }\n      getURI(noProtoHost = false) {\n        let s;\n        if (!this.source || noProtoHost) {\n          s = '';\n          if (!noProtoHost) {\n            if (this.protocol) {\n              s += this.protocol + '://';\n            } else {\n              s += '//';\n            }\n            if (this.userInfo) {\n              s += this.userInfo + '@';\n            }\n            if (this.host) {\n              s += this.host;\n            }\n            if (this.port) {\n              s += ':' + this.port;\n            }\n          }\n          if (this.path) {\n            s += this.path;\n          }\n          if (this.query) {\n            s += '?' + this.query;\n          }\n          if (this.anchor) {\n            s += '#' + this.anchor;\n          }\n          this.source = s;\n        }\n        return this.source;\n      }\n    }\n\n    const filteredUrlAttrs = Tools.makeMap('src,href,data,background,action,formaction,poster,xlink:href');\n    const internalElementAttr = 'data-mce-type';\n    let uid = 0;\n    const processNode = (node, settings, schema, scope, evt) => {\n      var _a, _b, _c, _d;\n      const validate = settings.validate;\n      const specialElements = schema.getSpecialElements();\n      if (node.nodeType === COMMENT && !settings.allow_conditional_comments && /^\\[if/i.test((_a = node.nodeValue) !== null && _a !== void 0 ? _a : '')) {\n        node.nodeValue = ' ' + node.nodeValue;\n      }\n      const lcTagName = (_b = evt === null || evt === void 0 ? void 0 : evt.tagName) !== null && _b !== void 0 ? _b : node.nodeName.toLowerCase();\n      if (scope !== 'html' && schema.isValid(scope)) {\n        if (isNonNullable(evt)) {\n          evt.allowedTags[lcTagName] = true;\n        }\n        return;\n      }\n      if (node.nodeType !== ELEMENT || lcTagName === 'body') {\n        return;\n      }\n      const element = SugarElement.fromDom(node);\n      const isInternalElement = has$1(element, internalElementAttr);\n      const bogus = get$9(element, 'data-mce-bogus');\n      if (!isInternalElement && isString(bogus)) {\n        if (bogus === 'all') {\n          remove$4(element);\n        } else {\n          unwrap(element);\n        }\n        return;\n      }\n      const rule = schema.getElementRule(lcTagName);\n      if (validate && !rule) {\n        if (has$2(specialElements, lcTagName)) {\n          remove$4(element);\n        } else {\n          unwrap(element);\n        }\n        return;\n      } else {\n        if (isNonNullable(evt)) {\n          evt.allowedTags[lcTagName] = true;\n        }\n      }\n      if (validate && rule && !isInternalElement) {\n        each$e((_c = rule.attributesForced) !== null && _c !== void 0 ? _c : [], attr => {\n          set$3(element, attr.name, attr.value === '{$uid}' ? `mce_${ uid++ }` : attr.value);\n        });\n        each$e((_d = rule.attributesDefault) !== null && _d !== void 0 ? _d : [], attr => {\n          if (!has$1(element, attr.name)) {\n            set$3(element, attr.name, attr.value === '{$uid}' ? `mce_${ uid++ }` : attr.value);\n          }\n        });\n        if (rule.attributesRequired && !exists(rule.attributesRequired, attr => has$1(element, attr))) {\n          unwrap(element);\n          return;\n        }\n        if (rule.removeEmptyAttrs && hasNone(element)) {\n          unwrap(element);\n          return;\n        }\n        if (rule.outputName && rule.outputName !== lcTagName) {\n          mutate(element, rule.outputName);\n        }\n      }\n    };\n    const processAttr = (ele, settings, schema, scope, evt) => {\n      const tagName = ele.tagName.toLowerCase();\n      const {attrName, attrValue} = evt;\n      evt.keepAttr = shouldKeepAttribute(settings, schema, scope, tagName, attrName, attrValue);\n      if (evt.keepAttr) {\n        evt.allowedAttributes[attrName] = true;\n        if (isBooleanAttribute(attrName, schema)) {\n          evt.attrValue = attrName;\n        }\n        if (settings.allow_svg_data_urls && startsWith(attrValue, 'data:image/svg+xml')) {\n          evt.forceKeepAttr = true;\n        }\n      } else if (isRequiredAttributeOfInternalElement(ele, attrName)) {\n        evt.forceKeepAttr = true;\n      }\n    };\n    const shouldKeepAttribute = (settings, schema, scope, tagName, attrName, attrValue) => {\n      if (scope !== 'html' && !isNonHtmlElementRootName(tagName)) {\n        return true;\n      }\n      return !(attrName in filteredUrlAttrs && isInvalidUri(settings, attrValue, tagName)) && (!settings.validate || schema.isValid(tagName, attrName) || startsWith(attrName, 'data-') || startsWith(attrName, 'aria-'));\n    };\n    const isRequiredAttributeOfInternalElement = (ele, attrName) => ele.hasAttribute(internalElementAttr) && (attrName === 'id' || attrName === 'class' || attrName === 'style');\n    const isBooleanAttribute = (attrName, schema) => attrName in schema.getBoolAttrs();\n    const filterAttributes = (ele, settings, schema, scope) => {\n      const {attributes} = ele;\n      for (let i = attributes.length - 1; i >= 0; i--) {\n        const attr = attributes[i];\n        const attrName = attr.name;\n        const attrValue = attr.value;\n        if (!shouldKeepAttribute(settings, schema, scope, ele.tagName.toLowerCase(), attrName, attrValue) && !isRequiredAttributeOfInternalElement(ele, attrName)) {\n          ele.removeAttribute(attrName);\n        } else if (isBooleanAttribute(attrName, schema)) {\n          ele.setAttribute(attrName, attrName);\n        }\n      }\n    };\n    const setupPurify = (settings, schema, namespaceTracker) => {\n      const purify$1 = purify();\n      purify$1.addHook('uponSanitizeElement', (ele, evt) => {\n        processNode(ele, settings, schema, namespaceTracker.track(ele), evt);\n      });\n      purify$1.addHook('uponSanitizeAttribute', (ele, evt) => {\n        processAttr(ele, settings, schema, namespaceTracker.current(), evt);\n      });\n      return purify$1;\n    };\n    const getPurifyConfig = (settings, mimeType) => {\n      const basePurifyConfig = {\n        IN_PLACE: true,\n        ALLOW_UNKNOWN_PROTOCOLS: true,\n        ALLOWED_TAGS: [\n          '#comment',\n          '#cdata-section',\n          'body'\n        ],\n        ALLOWED_ATTR: [],\n        SAFE_FOR_XML: false\n      };\n      const config = { ...basePurifyConfig };\n      config.PARSER_MEDIA_TYPE = mimeType;\n      if (settings.allow_script_urls) {\n        config.ALLOWED_URI_REGEXP = /.*/;\n      } else if (settings.allow_html_data_urls) {\n        config.ALLOWED_URI_REGEXP = /^(?!(\\w+script|mhtml):)/i;\n      }\n      return config;\n    };\n    const sanitizeNamespaceElement = ele => {\n      const xlinkAttrs = [\n        'type',\n        'href',\n        'role',\n        'arcrole',\n        'title',\n        'show',\n        'actuate',\n        'label',\n        'from',\n        'to'\n      ].map(name => `xlink:${ name }`);\n      const config = {\n        IN_PLACE: true,\n        USE_PROFILES: {\n          html: true,\n          svg: true,\n          svgFilters: true\n        },\n        ALLOWED_ATTR: xlinkAttrs\n      };\n      purify().sanitize(ele, config);\n      return ele.innerHTML;\n    };\n    const getSanitizer = (settings, schema) => {\n      const namespaceTracker = createNamespaceTracker();\n      if (settings.sanitize) {\n        const purify = setupPurify(settings, schema, namespaceTracker);\n        const sanitizeHtmlElement = (body, mimeType) => {\n          purify.sanitize(body, getPurifyConfig(settings, mimeType));\n          purify.removed = [];\n          namespaceTracker.reset();\n        };\n        return {\n          sanitizeHtmlElement,\n          sanitizeNamespaceElement\n        };\n      } else {\n        const sanitizeHtmlElement = (body, _mimeType) => {\n          const nodeIterator = document.createNodeIterator(body, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT);\n          let node;\n          while (node = nodeIterator.nextNode()) {\n            const currentScope = namespaceTracker.track(node);\n            processNode(node, settings, schema, currentScope);\n            if (isElement$6(node)) {\n              filterAttributes(node, settings, schema, currentScope);\n            }\n          }\n          namespaceTracker.reset();\n        };\n        const sanitizeNamespaceElement = noop;\n        return {\n          sanitizeHtmlElement,\n          sanitizeNamespaceElement\n        };\n      }\n    };\n\n    const makeMap = Tools.makeMap, extend$1 = Tools.extend;\n    const transferChildren = (parent, nativeParent, specialElements, nsSanitizer) => {\n      const parentName = parent.name;\n      const isSpecial = parentName in specialElements && parentName !== 'title' && parentName !== 'textarea' && parentName !== 'noscript';\n      const childNodes = nativeParent.childNodes;\n      for (let ni = 0, nl = childNodes.length; ni < nl; ni++) {\n        const nativeChild = childNodes[ni];\n        const child = new AstNode(nativeChild.nodeName.toLowerCase(), nativeChild.nodeType);\n        if (isElement$6(nativeChild)) {\n          const attributes = nativeChild.attributes;\n          for (let ai = 0, al = attributes.length; ai < al; ai++) {\n            const attr = attributes[ai];\n            child.attr(attr.name, attr.value);\n          }\n          if (isNonHtmlElementRootName(child.name)) {\n            nsSanitizer(nativeChild);\n            child.value = nativeChild.innerHTML;\n          }\n        } else if (isText$b(nativeChild)) {\n          child.value = nativeChild.data;\n          if (isSpecial) {\n            child.raw = true;\n          }\n        } else if (isComment(nativeChild) || isCData(nativeChild) || isPi(nativeChild)) {\n          child.value = nativeChild.data;\n        }\n        if (!isNonHtmlElementRootName(child.name)) {\n          transferChildren(child, nativeChild, specialElements, nsSanitizer);\n        }\n        parent.append(child);\n      }\n    };\n    const walkTree = (root, preprocessors, postprocessors) => {\n      const traverseOrder = [];\n      for (let node = root, lastNode = node; node; lastNode = node, node = node.walk()) {\n        const tempNode = node;\n        each$e(preprocessors, preprocess => preprocess(tempNode));\n        if (isNullable(tempNode.parent) && tempNode !== root) {\n          node = lastNode;\n        } else {\n          traverseOrder.push(tempNode);\n        }\n      }\n      for (let i = traverseOrder.length - 1; i >= 0; i--) {\n        const node = traverseOrder[i];\n        each$e(postprocessors, postprocess => postprocess(node));\n      }\n    };\n    const whitespaceCleaner = (root, schema, settings, args) => {\n      const validate = settings.validate;\n      const nonEmptyElements = schema.getNonEmptyElements();\n      const whitespaceElements = schema.getWhitespaceElements();\n      const blockElements = extend$1(makeMap('script,style,head,html,body,title,meta,param'), schema.getBlockElements());\n      const textRootBlockElements = getTextRootBlockElements(schema);\n      const allWhiteSpaceRegExp = /[ \\t\\r\\n]+/g;\n      const startWhiteSpaceRegExp = /^[ \\t\\r\\n]+/;\n      const endWhiteSpaceRegExp = /[ \\t\\r\\n]+$/;\n      const hasWhitespaceParent = node => {\n        let tempNode = node.parent;\n        while (isNonNullable(tempNode)) {\n          if (tempNode.name in whitespaceElements) {\n            return true;\n          } else {\n            tempNode = tempNode.parent;\n          }\n        }\n        return false;\n      };\n      const isTextRootBlockEmpty = node => {\n        let tempNode = node;\n        while (isNonNullable(tempNode)) {\n          if (tempNode.name in textRootBlockElements) {\n            return isEmpty(schema, nonEmptyElements, whitespaceElements, tempNode);\n          } else {\n            tempNode = tempNode.parent;\n          }\n        }\n        return false;\n      };\n      const isBlock = node => node.name in blockElements || isTransparentAstBlock(schema, node) || isNonHtmlElementRootName(node.name) && node.parent === root;\n      const isAtEdgeOfBlock = (node, start) => {\n        const neighbour = start ? node.prev : node.next;\n        if (isNonNullable(neighbour) || isNullable(node.parent)) {\n          return false;\n        }\n        return isBlock(node.parent) && (node.parent !== root || args.isRootContent === true);\n      };\n      const preprocess = node => {\n        var _a;\n        if (node.type === 3) {\n          if (!hasWhitespaceParent(node)) {\n            let text = (_a = node.value) !== null && _a !== void 0 ? _a : '';\n            text = text.replace(allWhiteSpaceRegExp, ' ');\n            if (isLineBreakNode(node.prev, isBlock) || isAtEdgeOfBlock(node, true)) {\n              text = text.replace(startWhiteSpaceRegExp, '');\n            }\n            if (text.length === 0) {\n              node.remove();\n            } else {\n              node.value = text;\n            }\n          }\n        }\n      };\n      const postprocess = node => {\n        var _a;\n        if (node.type === 1) {\n          const elementRule = schema.getElementRule(node.name);\n          if (validate && elementRule) {\n            const isNodeEmpty = isEmpty(schema, nonEmptyElements, whitespaceElements, node);\n            if (elementRule.paddInEmptyBlock && isNodeEmpty && isTextRootBlockEmpty(node)) {\n              paddEmptyNode(settings, args, isBlock, node);\n            } else if (elementRule.removeEmpty && isNodeEmpty) {\n              if (isBlock(node)) {\n                node.remove();\n              } else {\n                node.unwrap();\n              }\n            } else if (elementRule.paddEmpty && (isNodeEmpty || isPaddedWithNbsp(node))) {\n              paddEmptyNode(settings, args, isBlock, node);\n            }\n          }\n        } else if (node.type === 3) {\n          if (!hasWhitespaceParent(node)) {\n            let text = (_a = node.value) !== null && _a !== void 0 ? _a : '';\n            if (node.next && isBlock(node.next) || isAtEdgeOfBlock(node, false)) {\n              text = text.replace(endWhiteSpaceRegExp, '');\n            }\n            if (text.length === 0) {\n              node.remove();\n            } else {\n              node.value = text;\n            }\n          }\n        }\n      };\n      return [\n        preprocess,\n        postprocess\n      ];\n    };\n    const getRootBlockName = (settings, args) => {\n      var _a;\n      const name = (_a = args.forced_root_block) !== null && _a !== void 0 ? _a : settings.forced_root_block;\n      if (name === false) {\n        return '';\n      } else if (name === true) {\n        return 'p';\n      } else {\n        return name;\n      }\n    };\n    const DomParser = (settings = {}, schema = Schema()) => {\n      const nodeFilterRegistry = create$8();\n      const attributeFilterRegistry = create$8();\n      const defaultedSettings = {\n        validate: true,\n        root_name: 'body',\n        sanitize: true,\n        ...settings\n      };\n      const parser = new DOMParser();\n      const sanitizer = getSanitizer(defaultedSettings, schema);\n      const parseAndSanitizeWithContext = (html, rootName, format = 'html') => {\n        const mimeType = format === 'xhtml' ? 'application/xhtml+xml' : 'text/html';\n        const isSpecialRoot = has$2(schema.getSpecialElements(), rootName.toLowerCase());\n        const content = isSpecialRoot ? `<${ rootName }>${ html }</${ rootName }>` : html;\n        const wrappedHtml = format === 'xhtml' ? `<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>${ content }</body></html>` : `<body>${ content }</body>`;\n        const body = parser.parseFromString(wrappedHtml, mimeType).body;\n        sanitizer.sanitizeHtmlElement(body, mimeType);\n        return isSpecialRoot ? body.firstChild : body;\n      };\n      const addNodeFilter = nodeFilterRegistry.addFilter;\n      const getNodeFilters = nodeFilterRegistry.getFilters;\n      const removeNodeFilter = nodeFilterRegistry.removeFilter;\n      const addAttributeFilter = attributeFilterRegistry.addFilter;\n      const getAttributeFilters = attributeFilterRegistry.getFilters;\n      const removeAttributeFilter = attributeFilterRegistry.removeFilter;\n      const findInvalidChildren = (node, invalidChildren) => {\n        if (isInvalid(schema, node)) {\n          invalidChildren.push(node);\n        }\n      };\n      const isWrappableNode = (blockElements, node) => {\n        const isInternalElement = isString(node.attr(internalElementAttr));\n        const isInlineElement = node.type === 1 && (!has$2(blockElements, node.name) && !isTransparentAstBlock(schema, node)) && !isNonHtmlElementRootName(node.name);\n        return node.type === 3 || isInlineElement && !isInternalElement;\n      };\n      const addRootBlocks = (rootNode, rootBlockName) => {\n        const blockElements = extend$1(makeMap('script,style,head,html,body,title,meta,param'), schema.getBlockElements());\n        const startWhiteSpaceRegExp = /^[ \\t\\r\\n]+/;\n        const endWhiteSpaceRegExp = /[ \\t\\r\\n]+$/;\n        let node = rootNode.firstChild, rootBlockNode = null;\n        const trim = rootBlock => {\n          var _a, _b;\n          if (rootBlock) {\n            node = rootBlock.firstChild;\n            if (node && node.type === 3) {\n              node.value = (_a = node.value) === null || _a === void 0 ? void 0 : _a.replace(startWhiteSpaceRegExp, '');\n            }\n            node = rootBlock.lastChild;\n            if (node && node.type === 3) {\n              node.value = (_b = node.value) === null || _b === void 0 ? void 0 : _b.replace(endWhiteSpaceRegExp, '');\n            }\n          }\n        };\n        if (!schema.isValidChild(rootNode.name, rootBlockName.toLowerCase())) {\n          return;\n        }\n        while (node) {\n          const next = node.next;\n          if (isWrappableNode(blockElements, node)) {\n            if (!rootBlockNode) {\n              rootBlockNode = new AstNode(rootBlockName, 1);\n              rootBlockNode.attr(defaultedSettings.forced_root_block_attrs);\n              rootNode.insert(rootBlockNode, node);\n              rootBlockNode.append(node);\n            } else {\n              rootBlockNode.append(node);\n            }\n          } else {\n            trim(rootBlockNode);\n            rootBlockNode = null;\n          }\n          node = next;\n        }\n        trim(rootBlockNode);\n      };\n      const parse = (html, args = {}) => {\n        var _a;\n        const validate = defaultedSettings.validate;\n        const rootName = (_a = args.context) !== null && _a !== void 0 ? _a : defaultedSettings.root_name;\n        const element = parseAndSanitizeWithContext(html, rootName, args.format);\n        updateChildren(schema, element);\n        const rootNode = new AstNode(rootName, 11);\n        transferChildren(rootNode, element, schema.getSpecialElements(), sanitizer.sanitizeNamespaceElement);\n        element.innerHTML = '';\n        const [whitespacePre, whitespacePost] = whitespaceCleaner(rootNode, schema, defaultedSettings, args);\n        const invalidChildren = [];\n        const invalidFinder = validate ? node => findInvalidChildren(node, invalidChildren) : noop;\n        const matches = {\n          nodes: {},\n          attributes: {}\n        };\n        const matchFinder = node => matchNode$1(getNodeFilters(), getAttributeFilters(), node, matches);\n        walkTree(rootNode, [\n          whitespacePre,\n          matchFinder\n        ], [\n          whitespacePost,\n          invalidFinder\n        ]);\n        invalidChildren.reverse();\n        if (validate && invalidChildren.length > 0) {\n          if (args.context) {\n            const {\n              pass: topLevelChildren,\n              fail: otherChildren\n            } = partition$2(invalidChildren, child => child.parent === rootNode);\n            cleanInvalidNodes(otherChildren, schema, rootNode, matchFinder);\n            args.invalid = topLevelChildren.length > 0;\n          } else {\n            cleanInvalidNodes(invalidChildren, schema, rootNode, matchFinder);\n          }\n        }\n        const rootBlockName = getRootBlockName(defaultedSettings, args);\n        if (rootBlockName && (rootNode.name === 'body' || args.isRootContent)) {\n          addRootBlocks(rootNode, rootBlockName);\n        }\n        if (!args.invalid) {\n          runFilters(matches, args);\n        }\n        return rootNode;\n      };\n      const exports = {\n        schema,\n        addAttributeFilter,\n        getAttributeFilters,\n        removeAttributeFilter,\n        addNodeFilter,\n        getNodeFilters,\n        removeNodeFilter,\n        parse\n      };\n      register$4(exports, defaultedSettings);\n      register$5(exports, defaultedSettings, schema);\n      return exports;\n    };\n\n    const serializeContent = content => isTreeNode(content) ? HtmlSerializer({ validate: false }).serialize(content) : content;\n    const withSerializedContent = (content, fireEvent, parserSettings) => {\n      const serializedContent = serializeContent(content);\n      const eventArgs = fireEvent(serializedContent);\n      if (eventArgs.isDefaultPrevented()) {\n        return eventArgs;\n      } else if (isTreeNode(content)) {\n        if (eventArgs.content !== serializedContent) {\n          const rootNode = DomParser({\n            validate: false,\n            forced_root_block: false,\n            ...parserSettings\n          }).parse(eventArgs.content, { context: content.name });\n          return {\n            ...eventArgs,\n            content: rootNode\n          };\n        } else {\n          return {\n            ...eventArgs,\n            content\n          };\n        }\n      } else {\n        return eventArgs;\n      }\n    };\n    const makeParserSettings = editor => ({\n      sanitize: shouldSanitizeXss(editor),\n      sandbox_iframes: shouldSandboxIframes(editor),\n      sandbox_iframes_exclusions: getSandboxIframesExclusions(editor)\n    });\n    const preProcessGetContent = (editor, args) => {\n      if (args.no_events) {\n        return Result.value(args);\n      } else {\n        const eventArgs = fireBeforeGetContent(editor, args);\n        if (eventArgs.isDefaultPrevented()) {\n          return Result.error(fireGetContent(editor, {\n            content: '',\n            ...eventArgs\n          }).content);\n        } else {\n          return Result.value(eventArgs);\n        }\n      }\n    };\n    const postProcessGetContent = (editor, content, args) => {\n      if (args.no_events) {\n        return content;\n      } else {\n        const processedEventArgs = withSerializedContent(content, content => fireGetContent(editor, {\n          ...args,\n          content\n        }), makeParserSettings(editor));\n        return processedEventArgs.content;\n      }\n    };\n    const preProcessSetContent = (editor, args) => {\n      if (args.no_events) {\n        return Result.value(args);\n      } else {\n        const processedEventArgs = withSerializedContent(args.content, content => fireBeforeSetContent(editor, {\n          ...args,\n          content\n        }), makeParserSettings(editor));\n        if (processedEventArgs.isDefaultPrevented()) {\n          fireSetContent(editor, processedEventArgs);\n          return Result.error(undefined);\n        } else {\n          return Result.value(processedEventArgs);\n        }\n      }\n    };\n    const postProcessSetContent = (editor, content, args) => {\n      if (!args.no_events) {\n        fireSetContent(editor, {\n          ...args,\n          content\n        });\n      }\n    };\n\n    const tableModel = (element, width, rows) => ({\n      element,\n      width,\n      rows\n    });\n    const tableRow = (element, cells) => ({\n      element,\n      cells\n    });\n    const cellPosition = (x, y) => ({\n      x,\n      y\n    });\n    const getSpan = (td, key) => {\n      return getOpt(td, key).bind(toInt).getOr(1);\n    };\n    const fillout = (table, x, y, tr, td) => {\n      const rowspan = getSpan(td, 'rowspan');\n      const colspan = getSpan(td, 'colspan');\n      const rows = table.rows;\n      for (let y2 = y; y2 < y + rowspan; y2++) {\n        if (!rows[y2]) {\n          rows[y2] = tableRow(deep$1(tr), []);\n        }\n        for (let x2 = x; x2 < x + colspan; x2++) {\n          const cells = rows[y2].cells;\n          cells[x2] = y2 === y && x2 === x ? td : shallow$1(td);\n        }\n      }\n    };\n    const cellExists = (table, x, y) => {\n      const rows = table.rows;\n      const cells = rows[y] ? rows[y].cells : [];\n      return !!cells[x];\n    };\n    const skipCellsX = (table, x, y) => {\n      while (cellExists(table, x, y)) {\n        x++;\n      }\n      return x;\n    };\n    const getWidth = rows => {\n      return foldl(rows, (acc, row) => {\n        return row.cells.length > acc ? row.cells.length : acc;\n      }, 0);\n    };\n    const findElementPos = (table, element) => {\n      const rows = table.rows;\n      for (let y = 0; y < rows.length; y++) {\n        const cells = rows[y].cells;\n        for (let x = 0; x < cells.length; x++) {\n          if (eq(cells[x], element)) {\n            return Optional.some(cellPosition(x, y));\n          }\n        }\n      }\n      return Optional.none();\n    };\n    const extractRows = (table, sx, sy, ex, ey) => {\n      const newRows = [];\n      const rows = table.rows;\n      for (let y = sy; y <= ey; y++) {\n        const cells = rows[y].cells;\n        const slice = sx < ex ? cells.slice(sx, ex + 1) : cells.slice(ex, sx + 1);\n        newRows.push(tableRow(rows[y].element, slice));\n      }\n      return newRows;\n    };\n    const subTable = (table, startPos, endPos) => {\n      const sx = startPos.x, sy = startPos.y;\n      const ex = endPos.x, ey = endPos.y;\n      const newRows = sy < ey ? extractRows(table, sx, sy, ex, ey) : extractRows(table, sx, ey, ex, sy);\n      return tableModel(table.element, getWidth(newRows), newRows);\n    };\n    const createDomTable = (table, rows) => {\n      const tableElement = shallow$1(table.element);\n      const tableBody = SugarElement.fromTag('tbody');\n      append(tableBody, rows);\n      append$1(tableElement, tableBody);\n      return tableElement;\n    };\n    const modelRowsToDomRows = table => {\n      return map$3(table.rows, row => {\n        const cells = map$3(row.cells, cell => {\n          const td = deep$1(cell);\n          remove$9(td, 'colspan');\n          remove$9(td, 'rowspan');\n          return td;\n        });\n        const tr = shallow$1(row.element);\n        append(tr, cells);\n        return tr;\n      });\n    };\n    const fromDom = tableElm => {\n      const table = tableModel(shallow$1(tableElm), 0, []);\n      each$e(descendants(tableElm, 'tr'), (tr, y) => {\n        each$e(descendants(tr, 'td,th'), (td, x) => {\n          fillout(table, skipCellsX(table, x, y), y, tr, td);\n        });\n      });\n      return tableModel(table.element, getWidth(table.rows), table.rows);\n    };\n    const toDom = table => {\n      return createDomTable(table, modelRowsToDomRows(table));\n    };\n    const subsection = (table, startElement, endElement) => {\n      return findElementPos(table, startElement).bind(startPos => {\n        return findElementPos(table, endElement).map(endPos => {\n          return subTable(table, startPos, endPos);\n        });\n      });\n    };\n\n    const findParentListContainer = parents => find$2(parents, elm => name(elm) === 'ul' || name(elm) === 'ol');\n    const getFullySelectedListWrappers = (parents, rng) => find$2(parents, elm => name(elm) === 'li' && hasAllContentsSelected(elm, rng)).fold(constant([]), _li => findParentListContainer(parents).map(listCont => {\n      const listElm = SugarElement.fromTag(name(listCont));\n      const listStyles = filter$4(getAllRaw(listCont), (_style, name) => startsWith(name, 'list-style'));\n      setAll(listElm, listStyles);\n      return [\n        SugarElement.fromTag('li'),\n        listElm\n      ];\n    }).getOr([]));\n    const wrap = (innerElm, elms) => {\n      const wrapped = foldl(elms, (acc, elm) => {\n        append$1(elm, acc);\n        return elm;\n      }, innerElm);\n      return elms.length > 0 ? fromElements([wrapped]) : wrapped;\n    };\n    const directListWrappers = commonAnchorContainer => {\n      if (isListItem$1(commonAnchorContainer)) {\n        return parent(commonAnchorContainer).filter(isList).fold(constant([]), listElm => [\n          commonAnchorContainer,\n          listElm\n        ]);\n      } else {\n        return isList(commonAnchorContainer) ? [commonAnchorContainer] : [];\n      }\n    };\n    const getWrapElements = (rootNode, rng, schema) => {\n      const commonAnchorContainer = SugarElement.fromDom(rng.commonAncestorContainer);\n      const parents = parentsAndSelf(commonAnchorContainer, rootNode);\n      const wrapElements = filter$5(parents, el => schema.isWrapper(name(el)));\n      const listWrappers = getFullySelectedListWrappers(parents, rng);\n      const allWrappers = wrapElements.concat(listWrappers.length ? listWrappers : directListWrappers(commonAnchorContainer));\n      return map$3(allWrappers, shallow$1);\n    };\n    const emptyFragment = () => fromElements([]);\n    const getFragmentFromRange = (rootNode, rng, schema) => wrap(SugarElement.fromDom(rng.cloneContents()), getWrapElements(rootNode, rng, schema));\n    const getParentTable = (rootElm, cell) => ancestor$3(cell, 'table', curry(eq, rootElm));\n    const getTableFragment = (rootNode, selectedTableCells) => getParentTable(rootNode, selectedTableCells[0]).bind(tableElm => {\n      const firstCell = selectedTableCells[0];\n      const lastCell = selectedTableCells[selectedTableCells.length - 1];\n      const fullTableModel = fromDom(tableElm);\n      return subsection(fullTableModel, firstCell, lastCell).map(sectionedTableModel => fromElements([toDom(sectionedTableModel)]));\n    }).getOrThunk(emptyFragment);\n    const getSelectionFragment = (rootNode, ranges, schema) => ranges.length > 0 && ranges[0].collapsed ? emptyFragment() : getFragmentFromRange(rootNode, ranges[0], schema);\n    const read$3 = (rootNode, ranges, schema) => {\n      const selectedCells = getCellsFromElementOrRanges(ranges, rootNode);\n      return selectedCells.length > 0 ? getTableFragment(rootNode, selectedCells) : getSelectionFragment(rootNode, ranges, schema);\n    };\n\n    const isCollapsibleWhitespace = (text, index) => index >= 0 && index < text.length && isWhiteSpace(text.charAt(index));\n    const getInnerText = bin => {\n      return trim$2(bin.innerText);\n    };\n    const getContextNodeName = parentBlockOpt => parentBlockOpt.map(block => block.nodeName).getOr('div').toLowerCase();\n    const getTextContent = editor => Optional.from(editor.selection.getRng()).map(rng => {\n      var _a;\n      const parentBlockOpt = Optional.from(editor.dom.getParent(rng.commonAncestorContainer, editor.dom.isBlock));\n      const body = editor.getBody();\n      const contextNodeName = getContextNodeName(parentBlockOpt);\n      const rangeContentClone = SugarElement.fromDom(rng.cloneContents());\n      cleanupBogusElements(rangeContentClone);\n      cleanupInputNames(rangeContentClone);\n      const bin = editor.dom.add(body, contextNodeName, {\n        'data-mce-bogus': 'all',\n        'style': 'overflow: hidden; opacity: 0;'\n      }, rangeContentClone.dom);\n      const text = getInnerText(bin);\n      const nonRenderedText = trim$2((_a = bin.textContent) !== null && _a !== void 0 ? _a : '');\n      editor.dom.remove(bin);\n      if (isCollapsibleWhitespace(nonRenderedText, 0) || isCollapsibleWhitespace(nonRenderedText, nonRenderedText.length - 1)) {\n        const parentBlock = parentBlockOpt.getOr(body);\n        const parentBlockText = getInnerText(parentBlock);\n        const textIndex = parentBlockText.indexOf(text);\n        if (textIndex === -1) {\n          return text;\n        } else {\n          const hasProceedingSpace = isCollapsibleWhitespace(parentBlockText, textIndex - 1);\n          const hasTrailingSpace = isCollapsibleWhitespace(parentBlockText, textIndex + text.length);\n          return (hasProceedingSpace ? ' ' : '') + text + (hasTrailingSpace ? ' ' : '');\n        }\n      } else {\n        return text;\n      }\n    }).getOr('');\n    const getSerializedContent = (editor, args) => {\n      const rng = editor.selection.getRng(), tmpElm = editor.dom.create('body');\n      const sel = editor.selection.getSel();\n      const ranges = processRanges(editor, getRanges$1(sel));\n      const fragment = args.contextual ? read$3(SugarElement.fromDom(editor.getBody()), ranges, editor.schema).dom : rng.cloneContents();\n      if (fragment) {\n        tmpElm.appendChild(fragment);\n      }\n      return editor.selection.serializer.serialize(tmpElm, args);\n    };\n    const extractSelectedContent = (editor, args) => {\n      if (args.format === 'text') {\n        return getTextContent(editor);\n      } else {\n        const content = getSerializedContent(editor, args);\n        if (args.format === 'tree') {\n          return content;\n        } else {\n          return editor.selection.isCollapsed() ? '' : content;\n        }\n      }\n    };\n    const setupArgs$3 = (args, format) => ({\n      ...args,\n      format,\n      get: true,\n      selection: true,\n      getInner: true\n    });\n    const getSelectedContentInternal = (editor, format, args = {}) => {\n      const defaultedArgs = setupArgs$3(args, format);\n      return preProcessGetContent(editor, defaultedArgs).fold(identity, updatedArgs => {\n        const content = extractSelectedContent(editor, updatedArgs);\n        return postProcessGetContent(editor, content, updatedArgs);\n      });\n    };\n\n    const KEEP = 0, INSERT = 1, DELETE = 2;\n    const diff = (left, right) => {\n      const size = left.length + right.length + 2;\n      const vDown = new Array(size);\n      const vUp = new Array(size);\n      const snake = (start, end, diag) => {\n        return {\n          start,\n          end,\n          diag\n        };\n      };\n      const buildScript = (start1, end1, start2, end2, script) => {\n        const middle = getMiddleSnake(start1, end1, start2, end2);\n        if (middle === null || middle.start === end1 && middle.diag === end1 - end2 || middle.end === start1 && middle.diag === start1 - start2) {\n          let i = start1;\n          let j = start2;\n          while (i < end1 || j < end2) {\n            if (i < end1 && j < end2 && left[i] === right[j]) {\n              script.push([\n                KEEP,\n                left[i]\n              ]);\n              ++i;\n              ++j;\n            } else {\n              if (end1 - start1 > end2 - start2) {\n                script.push([\n                  DELETE,\n                  left[i]\n                ]);\n                ++i;\n              } else {\n                script.push([\n                  INSERT,\n                  right[j]\n                ]);\n                ++j;\n              }\n            }\n          }\n        } else {\n          buildScript(start1, middle.start, start2, middle.start - middle.diag, script);\n          for (let i2 = middle.start; i2 < middle.end; ++i2) {\n            script.push([\n              KEEP,\n              left[i2]\n            ]);\n          }\n          buildScript(middle.end, end1, middle.end - middle.diag, end2, script);\n        }\n      };\n      const buildSnake = (start, diag, end1, end2) => {\n        let end = start;\n        while (end - diag < end2 && end < end1 && left[end] === right[end - diag]) {\n          ++end;\n        }\n        return snake(start, end, diag);\n      };\n      const getMiddleSnake = (start1, end1, start2, end2) => {\n        const m = end1 - start1;\n        const n = end2 - start2;\n        if (m === 0 || n === 0) {\n          return null;\n        }\n        const delta = m - n;\n        const sum = n + m;\n        const offset = (sum % 2 === 0 ? sum : sum + 1) / 2;\n        vDown[1 + offset] = start1;\n        vUp[1 + offset] = end1 + 1;\n        let d, k, i, x, y;\n        for (d = 0; d <= offset; ++d) {\n          for (k = -d; k <= d; k += 2) {\n            i = k + offset;\n            if (k === -d || k !== d && vDown[i - 1] < vDown[i + 1]) {\n              vDown[i] = vDown[i + 1];\n            } else {\n              vDown[i] = vDown[i - 1] + 1;\n            }\n            x = vDown[i];\n            y = x - start1 + start2 - k;\n            while (x < end1 && y < end2 && left[x] === right[y]) {\n              vDown[i] = ++x;\n              ++y;\n            }\n            if (delta % 2 !== 0 && delta - d <= k && k <= delta + d) {\n              if (vUp[i - delta] <= vDown[i]) {\n                return buildSnake(vUp[i - delta], k + start1 - start2, end1, end2);\n              }\n            }\n          }\n          for (k = delta - d; k <= delta + d; k += 2) {\n            i = k + offset - delta;\n            if (k === delta - d || k !== delta + d && vUp[i + 1] <= vUp[i - 1]) {\n              vUp[i] = vUp[i + 1] - 1;\n            } else {\n              vUp[i] = vUp[i - 1];\n            }\n            x = vUp[i] - 1;\n            y = x - start1 + start2 - k;\n            while (x >= start1 && y >= start2 && left[x] === right[y]) {\n              vUp[i] = x--;\n              y--;\n            }\n            if (delta % 2 === 0 && -d <= k && k <= d) {\n              if (vUp[i] <= vDown[i + delta]) {\n                return buildSnake(vUp[i], k + start1 - start2, end1, end2);\n              }\n            }\n          }\n        }\n        return null;\n      };\n      const script = [];\n      buildScript(0, left.length, 0, right.length, script);\n      return script;\n    };\n\n    const getOuterHtml = elm => {\n      if (isElement$6(elm)) {\n        return elm.outerHTML;\n      } else if (isText$b(elm)) {\n        return Entities.encodeRaw(elm.data, false);\n      } else if (isComment(elm)) {\n        return '<!--' + elm.data + '-->';\n      }\n      return '';\n    };\n    const createFragment = html => {\n      let node;\n      const container = document.createElement('div');\n      const frag = document.createDocumentFragment();\n      if (html) {\n        container.innerHTML = html;\n      }\n      while (node = container.firstChild) {\n        frag.appendChild(node);\n      }\n      return frag;\n    };\n    const insertAt = (elm, html, index) => {\n      const fragment = createFragment(html);\n      if (elm.hasChildNodes() && index < elm.childNodes.length) {\n        const target = elm.childNodes[index];\n        elm.insertBefore(fragment, target);\n      } else {\n        elm.appendChild(fragment);\n      }\n    };\n    const removeAt = (elm, index) => {\n      if (elm.hasChildNodes() && index < elm.childNodes.length) {\n        const target = elm.childNodes[index];\n        elm.removeChild(target);\n      }\n    };\n    const applyDiff = (diff, elm) => {\n      let index = 0;\n      each$e(diff, action => {\n        if (action[0] === KEEP) {\n          index++;\n        } else if (action[0] === INSERT) {\n          insertAt(elm, action[1], index);\n          index++;\n        } else if (action[0] === DELETE) {\n          removeAt(elm, index);\n        }\n      });\n    };\n    const read$2 = (elm, trimZwsp) => filter$5(map$3(from(elm.childNodes), trimZwsp ? compose(trim$2, getOuterHtml) : getOuterHtml), item => {\n      return item.length > 0;\n    });\n    const write = (fragments, elm) => {\n      const currentFragments = map$3(from(elm.childNodes), getOuterHtml);\n      applyDiff(diff(currentFragments, fragments), elm);\n      return elm;\n    };\n\n    const lazyTempDocument = cached(() => document.implementation.createHTMLDocument('undo'));\n    const hasIframes = body => body.querySelector('iframe') !== null;\n    const createFragmentedLevel = fragments => {\n      return {\n        type: 'fragmented',\n        fragments,\n        content: '',\n        bookmark: null,\n        beforeBookmark: null\n      };\n    };\n    const createCompleteLevel = content => {\n      return {\n        type: 'complete',\n        fragments: null,\n        content,\n        bookmark: null,\n        beforeBookmark: null\n      };\n    };\n    const createFromEditor = editor => {\n      const tempAttrs = editor.serializer.getTempAttrs();\n      const body = trim$1(editor.getBody(), tempAttrs);\n      return hasIframes(body) ? createFragmentedLevel(read$2(body, true)) : createCompleteLevel(trim$2(body.innerHTML));\n    };\n    const applyToEditor = (editor, level, before) => {\n      const bookmark = before ? level.beforeBookmark : level.bookmark;\n      if (level.type === 'fragmented') {\n        write(level.fragments, editor.getBody());\n      } else {\n        editor.setContent(level.content, {\n          format: 'raw',\n          no_selection: isNonNullable(bookmark) && isPathBookmark(bookmark) ? !bookmark.isFakeCaret : true\n        });\n      }\n      if (bookmark) {\n        editor.selection.moveToBookmark(bookmark);\n        editor.selection.scrollIntoView();\n      }\n    };\n    const getLevelContent = level => {\n      return level.type === 'fragmented' ? level.fragments.join('') : level.content;\n    };\n    const getCleanLevelContent = level => {\n      const elm = SugarElement.fromTag('body', lazyTempDocument());\n      set$1(elm, getLevelContent(level));\n      each$e(descendants(elm, '*[data-mce-bogus]'), unwrap);\n      return get$6(elm);\n    };\n    const hasEqualContent = (level1, level2) => getLevelContent(level1) === getLevelContent(level2);\n    const hasEqualCleanedContent = (level1, level2) => getCleanLevelContent(level1) === getCleanLevelContent(level2);\n    const isEq$1 = (level1, level2) => {\n      if (!level1 || !level2) {\n        return false;\n      } else if (hasEqualContent(level1, level2)) {\n        return true;\n      } else {\n        return hasEqualCleanedContent(level1, level2);\n      }\n    };\n\n    const isUnlocked = locks => locks.get() === 0;\n\n    const setTyping = (undoManager, typing, locks) => {\n      if (isUnlocked(locks)) {\n        undoManager.typing = typing;\n      }\n    };\n    const endTyping = (undoManager, locks) => {\n      if (undoManager.typing) {\n        setTyping(undoManager, false, locks);\n        undoManager.add();\n      }\n    };\n    const endTypingLevelIgnoreLocks = undoManager => {\n      if (undoManager.typing) {\n        undoManager.typing = false;\n        undoManager.add();\n      }\n    };\n\n    const beforeChange$1 = (editor, locks, beforeBookmark) => {\n      if (isUnlocked(locks)) {\n        beforeBookmark.set(getUndoBookmark(editor.selection));\n      }\n    };\n    const addUndoLevel$1 = (editor, undoManager, index, locks, beforeBookmark, level, event) => {\n      const currentLevel = createFromEditor(editor);\n      const newLevel = Tools.extend(level || {}, currentLevel);\n      if (!isUnlocked(locks) || editor.removed) {\n        return null;\n      }\n      const lastLevel = undoManager.data[index.get()];\n      if (editor.dispatch('BeforeAddUndo', {\n          level: newLevel,\n          lastLevel,\n          originalEvent: event\n        }).isDefaultPrevented()) {\n        return null;\n      }\n      if (lastLevel && isEq$1(lastLevel, newLevel)) {\n        return null;\n      }\n      if (undoManager.data[index.get()]) {\n        beforeBookmark.get().each(bm => {\n          undoManager.data[index.get()].beforeBookmark = bm;\n        });\n      }\n      const customUndoRedoLevels = getCustomUndoRedoLevels(editor);\n      if (customUndoRedoLevels) {\n        if (undoManager.data.length > customUndoRedoLevels) {\n          for (let i = 0; i < undoManager.data.length - 1; i++) {\n            undoManager.data[i] = undoManager.data[i + 1];\n          }\n          undoManager.data.length--;\n          index.set(undoManager.data.length);\n        }\n      }\n      newLevel.bookmark = getUndoBookmark(editor.selection);\n      if (index.get() < undoManager.data.length - 1) {\n        undoManager.data.length = index.get() + 1;\n      }\n      undoManager.data.push(newLevel);\n      index.set(undoManager.data.length - 1);\n      const args = {\n        level: newLevel,\n        lastLevel,\n        originalEvent: event\n      };\n      if (index.get() > 0) {\n        editor.setDirty(true);\n        editor.dispatch('AddUndo', args);\n        editor.dispatch('change', args);\n      } else {\n        editor.dispatch('AddUndo', args);\n      }\n      return newLevel;\n    };\n    const clear$1 = (editor, undoManager, index) => {\n      undoManager.data = [];\n      index.set(0);\n      undoManager.typing = false;\n      editor.dispatch('ClearUndos');\n    };\n    const extra$1 = (editor, undoManager, index, callback1, callback2) => {\n      if (undoManager.transact(callback1)) {\n        const bookmark = undoManager.data[index.get()].bookmark;\n        const lastLevel = undoManager.data[index.get() - 1];\n        applyToEditor(editor, lastLevel, true);\n        if (undoManager.transact(callback2)) {\n          undoManager.data[index.get() - 1].beforeBookmark = bookmark;\n        }\n      }\n    };\n    const redo$1 = (editor, index, data) => {\n      let level;\n      if (index.get() < data.length - 1) {\n        index.set(index.get() + 1);\n        level = data[index.get()];\n        applyToEditor(editor, level, false);\n        editor.setDirty(true);\n        editor.dispatch('Redo', { level });\n      }\n      return level;\n    };\n    const undo$1 = (editor, undoManager, locks, index) => {\n      let level;\n      if (undoManager.typing) {\n        undoManager.add();\n        undoManager.typing = false;\n        setTyping(undoManager, false, locks);\n      }\n      if (index.get() > 0) {\n        index.set(index.get() - 1);\n        level = undoManager.data[index.get()];\n        applyToEditor(editor, level, true);\n        editor.setDirty(true);\n        editor.dispatch('Undo', { level });\n      }\n      return level;\n    };\n    const reset$1 = undoManager => {\n      undoManager.clear();\n      undoManager.add();\n    };\n    const hasUndo$1 = (editor, undoManager, index) => index.get() > 0 || undoManager.typing && undoManager.data[0] && !isEq$1(createFromEditor(editor), undoManager.data[0]);\n    const hasRedo$1 = (undoManager, index) => index.get() < undoManager.data.length - 1 && !undoManager.typing;\n    const transact$1 = (undoManager, locks, callback) => {\n      endTyping(undoManager, locks);\n      undoManager.beforeChange();\n      undoManager.ignore(callback);\n      return undoManager.add();\n    };\n    const ignore$1 = (locks, callback) => {\n      try {\n        locks.set(locks.get() + 1);\n        callback();\n      } finally {\n        locks.set(locks.get() - 1);\n      }\n    };\n\n    const addVisualInternal = (editor, elm) => {\n      const dom = editor.dom;\n      const scope = isNonNullable(elm) ? elm : editor.getBody();\n      each$e(dom.select('table,a', scope), matchedElm => {\n        switch (matchedElm.nodeName) {\n        case 'TABLE':\n          const cls = getVisualAidsTableClass(editor);\n          const value = dom.getAttrib(matchedElm, 'border');\n          if ((!value || value === '0') && editor.hasVisual) {\n            dom.addClass(matchedElm, cls);\n          } else {\n            dom.removeClass(matchedElm, cls);\n          }\n          break;\n        case 'A':\n          if (!dom.getAttrib(matchedElm, 'href')) {\n            const value = dom.getAttrib(matchedElm, 'name') || matchedElm.id;\n            const cls = getVisualAidsAnchorClass(editor);\n            if (value && editor.hasVisual) {\n              dom.addClass(matchedElm, cls);\n            } else {\n              dom.removeClass(matchedElm, cls);\n            }\n          }\n          break;\n        }\n      });\n      editor.dispatch('VisualAid', {\n        element: elm,\n        hasVisual: editor.hasVisual\n      });\n    };\n\n    const makePlainAdaptor = editor => ({\n      init: { bindEvents: noop },\n      undoManager: {\n        beforeChange: (locks, beforeBookmark) => beforeChange$1(editor, locks, beforeBookmark),\n        add: (undoManager, index, locks, beforeBookmark, level, event) => addUndoLevel$1(editor, undoManager, index, locks, beforeBookmark, level, event),\n        undo: (undoManager, locks, index) => undo$1(editor, undoManager, locks, index),\n        redo: (index, data) => redo$1(editor, index, data),\n        clear: (undoManager, index) => clear$1(editor, undoManager, index),\n        reset: undoManager => reset$1(undoManager),\n        hasUndo: (undoManager, index) => hasUndo$1(editor, undoManager, index),\n        hasRedo: (undoManager, index) => hasRedo$1(undoManager, index),\n        transact: (undoManager, locks, callback) => transact$1(undoManager, locks, callback),\n        ignore: (locks, callback) => ignore$1(locks, callback),\n        extra: (undoManager, index, callback1, callback2) => extra$1(editor, undoManager, index, callback1, callback2)\n      },\n      formatter: {\n        match: (name, vars, node, similar) => match$2(editor, name, vars, node, similar),\n        matchAll: (names, vars) => matchAll(editor, names, vars),\n        matchNode: (node, name, vars, similar) => matchNode(editor, node, name, vars, similar),\n        canApply: name => canApply(editor, name),\n        closest: names => closest(editor, names),\n        apply: (name, vars, node) => applyFormat$1(editor, name, vars, node),\n        remove: (name, vars, node, similar) => removeFormat$1(editor, name, vars, node, similar),\n        toggle: (name, vars, node) => toggle(editor, name, vars, node),\n        formatChanged: (registeredFormatListeners, formats, callback, similar, vars) => formatChangedInternal(editor, registeredFormatListeners, formats, callback, similar, vars)\n      },\n      editor: {\n        getContent: args => getContentInternal(editor, args),\n        setContent: (content, args) => setContentInternal(editor, content, args),\n        insertContent: (value, details) => insertHtmlAtCaret(editor, value, details),\n        addVisual: elm => addVisualInternal(editor, elm)\n      },\n      selection: { getContent: (format, args) => getSelectedContentInternal(editor, format, args) },\n      autocompleter: {\n        addDecoration: noop,\n        removeDecoration: noop\n      },\n      raw: { getModel: () => Optional.none() }\n    });\n    const makeRtcAdaptor = rtcEditor => {\n      const defaultVars = vars => isObject(vars) ? vars : {};\n      const {init, undoManager, formatter, editor, selection, autocompleter, raw} = rtcEditor;\n      return {\n        init: { bindEvents: init.bindEvents },\n        undoManager: {\n          beforeChange: undoManager.beforeChange,\n          add: undoManager.add,\n          undo: undoManager.undo,\n          redo: undoManager.redo,\n          clear: undoManager.clear,\n          reset: undoManager.reset,\n          hasUndo: undoManager.hasUndo,\n          hasRedo: undoManager.hasRedo,\n          transact: (_undoManager, _locks, fn) => undoManager.transact(fn),\n          ignore: (_locks, callback) => undoManager.ignore(callback),\n          extra: (_undoManager, _index, callback1, callback2) => undoManager.extra(callback1, callback2)\n        },\n        formatter: {\n          match: (name, vars, _node, similar) => formatter.match(name, defaultVars(vars), similar),\n          matchAll: formatter.matchAll,\n          matchNode: formatter.matchNode,\n          canApply: name => formatter.canApply(name),\n          closest: names => formatter.closest(names),\n          apply: (name, vars, _node) => formatter.apply(name, defaultVars(vars)),\n          remove: (name, vars, _node, _similar) => formatter.remove(name, defaultVars(vars)),\n          toggle: (name, vars, _node) => formatter.toggle(name, defaultVars(vars)),\n          formatChanged: (_rfl, formats, callback, similar, vars) => formatter.formatChanged(formats, callback, similar, vars)\n        },\n        editor: {\n          getContent: args => editor.getContent(args),\n          setContent: (content, args) => {\n            return {\n              content: editor.setContent(content, args),\n              html: ''\n            };\n          },\n          insertContent: (content, _details) => {\n            editor.insertContent(content);\n            return '';\n          },\n          addVisual: editor.addVisual\n        },\n        selection: { getContent: (_format, args) => selection.getContent(args) },\n        autocompleter: {\n          addDecoration: autocompleter.addDecoration,\n          removeDecoration: autocompleter.removeDecoration\n        },\n        raw: { getModel: () => Optional.some(raw.getRawModel()) }\n      };\n    };\n    const makeNoopAdaptor = () => {\n      const nul = constant(null);\n      const empty = constant('');\n      return {\n        init: { bindEvents: noop },\n        undoManager: {\n          beforeChange: noop,\n          add: nul,\n          undo: nul,\n          redo: nul,\n          clear: noop,\n          reset: noop,\n          hasUndo: never,\n          hasRedo: never,\n          transact: nul,\n          ignore: noop,\n          extra: noop\n        },\n        formatter: {\n          match: never,\n          matchAll: constant([]),\n          matchNode: constant(undefined),\n          canApply: never,\n          closest: empty,\n          apply: noop,\n          remove: noop,\n          toggle: noop,\n          formatChanged: constant({ unbind: noop })\n        },\n        editor: {\n          getContent: empty,\n          setContent: constant({\n            content: '',\n            html: ''\n          }),\n          insertContent: constant(''),\n          addVisual: noop\n        },\n        selection: { getContent: empty },\n        autocompleter: {\n          addDecoration: noop,\n          removeDecoration: noop\n        },\n        raw: { getModel: constant(Optional.none()) }\n      };\n    };\n    const isRtc = editor => has$2(editor.plugins, 'rtc');\n    const getRtcSetup = editor => get$a(editor.plugins, 'rtc').bind(rtcPlugin => Optional.from(rtcPlugin.setup));\n    const setup$t = editor => {\n      const editorCast = editor;\n      return getRtcSetup(editor).fold(() => {\n        editorCast.rtcInstance = makePlainAdaptor(editor);\n        return Optional.none();\n      }, setup => {\n        editorCast.rtcInstance = makeNoopAdaptor();\n        return Optional.some(() => setup().then(rtcEditor => {\n          editorCast.rtcInstance = makeRtcAdaptor(rtcEditor);\n          return rtcEditor.rtc.isRemote;\n        }));\n      });\n    };\n    const getRtcInstanceWithFallback = editor => editor.rtcInstance ? editor.rtcInstance : makePlainAdaptor(editor);\n    const getRtcInstanceWithError = editor => {\n      const rtcInstance = editor.rtcInstance;\n      if (!rtcInstance) {\n        throw new Error('Failed to get RTC instance not yet initialized.');\n      } else {\n        return rtcInstance;\n      }\n    };\n    const beforeChange = (editor, locks, beforeBookmark) => {\n      getRtcInstanceWithError(editor).undoManager.beforeChange(locks, beforeBookmark);\n    };\n    const addUndoLevel = (editor, undoManager, index, locks, beforeBookmark, level, event) => getRtcInstanceWithError(editor).undoManager.add(undoManager, index, locks, beforeBookmark, level, event);\n    const undo = (editor, undoManager, locks, index) => getRtcInstanceWithError(editor).undoManager.undo(undoManager, locks, index);\n    const redo = (editor, index, data) => getRtcInstanceWithError(editor).undoManager.redo(index, data);\n    const clear = (editor, undoManager, index) => {\n      getRtcInstanceWithError(editor).undoManager.clear(undoManager, index);\n    };\n    const reset = (editor, undoManager) => {\n      getRtcInstanceWithError(editor).undoManager.reset(undoManager);\n    };\n    const hasUndo = (editor, undoManager, index) => getRtcInstanceWithError(editor).undoManager.hasUndo(undoManager, index);\n    const hasRedo = (editor, undoManager, index) => getRtcInstanceWithError(editor).undoManager.hasRedo(undoManager, index);\n    const transact = (editor, undoManager, locks, callback) => getRtcInstanceWithError(editor).undoManager.transact(undoManager, locks, callback);\n    const ignore = (editor, locks, callback) => {\n      getRtcInstanceWithError(editor).undoManager.ignore(locks, callback);\n    };\n    const extra = (editor, undoManager, index, callback1, callback2) => {\n      getRtcInstanceWithError(editor).undoManager.extra(undoManager, index, callback1, callback2);\n    };\n    const matchFormat = (editor, name, vars, node, similar) => getRtcInstanceWithError(editor).formatter.match(name, vars, node, similar);\n    const matchAllFormats = (editor, names, vars) => getRtcInstanceWithError(editor).formatter.matchAll(names, vars);\n    const matchNodeFormat = (editor, node, name, vars, similar) => getRtcInstanceWithError(editor).formatter.matchNode(node, name, vars, similar);\n    const canApplyFormat = (editor, name) => getRtcInstanceWithError(editor).formatter.canApply(name);\n    const closestFormat = (editor, names) => getRtcInstanceWithError(editor).formatter.closest(names);\n    const applyFormat = (editor, name, vars, node) => {\n      getRtcInstanceWithError(editor).formatter.apply(name, vars, node);\n    };\n    const removeFormat = (editor, name, vars, node, similar) => {\n      getRtcInstanceWithError(editor).formatter.remove(name, vars, node, similar);\n    };\n    const toggleFormat = (editor, name, vars, node) => {\n      getRtcInstanceWithError(editor).formatter.toggle(name, vars, node);\n    };\n    const formatChanged = (editor, registeredFormatListeners, formats, callback, similar, vars) => getRtcInstanceWithError(editor).formatter.formatChanged(registeredFormatListeners, formats, callback, similar, vars);\n    const getContent$2 = (editor, args) => getRtcInstanceWithFallback(editor).editor.getContent(args);\n    const setContent$2 = (editor, content, args) => getRtcInstanceWithFallback(editor).editor.setContent(content, args);\n    const insertContent$1 = (editor, value, details) => getRtcInstanceWithFallback(editor).editor.insertContent(value, details);\n    const getSelectedContent = (editor, format, args) => getRtcInstanceWithError(editor).selection.getContent(format, args);\n    const addVisual$1 = (editor, elm) => getRtcInstanceWithError(editor).editor.addVisual(elm);\n    const bindEvents = editor => getRtcInstanceWithError(editor).init.bindEvents();\n\n    const getContent$1 = (editor, args = {}) => {\n      const format = args.format ? args.format : 'html';\n      return getSelectedContent(editor, format, args);\n    };\n\n    const removeEmpty = text => {\n      if (text.dom.length === 0) {\n        remove$4(text);\n        return Optional.none();\n      } else {\n        return Optional.some(text);\n      }\n    };\n    const walkPastBookmark = (node, start) => node.filter(elm => BookmarkManager.isBookmarkNode(elm.dom)).bind(start ? nextSibling : prevSibling);\n    const merge$1 = (outer, inner, rng, start, schema) => {\n      const outerElm = outer.dom;\n      const innerElm = inner.dom;\n      const oldLength = start ? outerElm.length : innerElm.length;\n      if (start) {\n        mergeTextNodes(outerElm, innerElm, schema, false, !start);\n        rng.setStart(innerElm, oldLength);\n      } else {\n        mergeTextNodes(innerElm, outerElm, schema, false, !start);\n        rng.setEnd(innerElm, oldLength);\n      }\n    };\n    const normalizeTextIfRequired = (inner, start, schema) => {\n      parent(inner).each(root => {\n        const text = inner.dom;\n        if (start && needsToBeNbspLeft(root, CaretPosition(text, 0), schema)) {\n          normalizeWhitespaceAfter(text, 0, schema);\n        } else if (!start && needsToBeNbspRight(root, CaretPosition(text, text.length), schema)) {\n          normalizeWhitespaceBefore(text, text.length, schema);\n        }\n      });\n    };\n    const mergeAndNormalizeText = (outerNode, innerNode, rng, start, schema) => {\n      outerNode.bind(outer => {\n        const normalizer = start ? normalizeWhitespaceBefore : normalizeWhitespaceAfter;\n        normalizer(outer.dom, start ? outer.dom.length : 0, schema);\n        return innerNode.filter(isText$c).map(inner => merge$1(outer, inner, rng, start, schema));\n      }).orThunk(() => {\n        const innerTextNode = walkPastBookmark(innerNode, start).or(innerNode).filter(isText$c);\n        return innerTextNode.map(inner => normalizeTextIfRequired(inner, start, schema));\n      });\n    };\n    const rngSetContent = (rng, fragment, schema) => {\n      const firstChild = Optional.from(fragment.firstChild).map(SugarElement.fromDom);\n      const lastChild = Optional.from(fragment.lastChild).map(SugarElement.fromDom);\n      rng.deleteContents();\n      rng.insertNode(fragment);\n      const prevText = firstChild.bind(prevSibling).filter(isText$c).bind(removeEmpty);\n      const nextText = lastChild.bind(nextSibling).filter(isText$c).bind(removeEmpty);\n      mergeAndNormalizeText(prevText, firstChild, rng, true, schema);\n      mergeAndNormalizeText(nextText, lastChild, rng, false, schema);\n      rng.collapse(false);\n    };\n    const setupArgs$2 = (args, content) => ({\n      format: 'html',\n      ...args,\n      set: true,\n      selection: true,\n      content\n    });\n    const cleanContent = (editor, args) => {\n      if (args.format !== 'raw') {\n        const rng = editor.selection.getRng();\n        const contextBlock = editor.dom.getParent(rng.commonAncestorContainer, editor.dom.isBlock);\n        const contextArgs = contextBlock ? { context: contextBlock.nodeName.toLowerCase() } : {};\n        const node = editor.parser.parse(args.content, {\n          forced_root_block: false,\n          ...contextArgs,\n          ...args\n        });\n        return HtmlSerializer({ validate: false }, editor.schema).serialize(node);\n      } else {\n        return args.content;\n      }\n    };\n    const setContent$1 = (editor, content, args = {}) => {\n      const defaultedArgs = setupArgs$2(args, content);\n      preProcessSetContent(editor, defaultedArgs).each(updatedArgs => {\n        const cleanedContent = cleanContent(editor, updatedArgs);\n        const rng = editor.selection.getRng();\n        rngSetContent(rng, rng.createContextualFragment(cleanedContent), editor.schema);\n        editor.selection.setRng(rng);\n        scrollRangeIntoView(editor, rng);\n        postProcessSetContent(editor, cleanedContent, updatedArgs);\n      });\n    };\n\n    const deleteFromCallbackMap = (callbackMap, selector, callback) => {\n      if (has$2(callbackMap, selector)) {\n        const newCallbacks = filter$5(callbackMap[selector], cb => cb !== callback);\n        if (newCallbacks.length === 0) {\n          delete callbackMap[selector];\n        } else {\n          callbackMap[selector] = newCallbacks;\n        }\n      }\n    };\n    var SelectorChanged = (dom, editor) => {\n      let selectorChangedData;\n      let currentSelectors;\n      const findMatchingNode = (selector, nodes) => find$2(nodes, node => dom.is(node, selector));\n      const getParents = elem => dom.getParents(elem, undefined, dom.getRoot());\n      const setup = () => {\n        selectorChangedData = {};\n        currentSelectors = {};\n        editor.on('NodeChange', e => {\n          const node = e.element;\n          const parents = getParents(node);\n          const matchedSelectors = {};\n          each$d(selectorChangedData, (callbacks, selector) => {\n            findMatchingNode(selector, parents).each(node => {\n              if (!currentSelectors[selector]) {\n                each$e(callbacks, callback => {\n                  callback(true, {\n                    node,\n                    selector,\n                    parents\n                  });\n                });\n                currentSelectors[selector] = callbacks;\n              }\n              matchedSelectors[selector] = callbacks;\n            });\n          });\n          each$d(currentSelectors, (callbacks, selector) => {\n            if (!matchedSelectors[selector]) {\n              delete currentSelectors[selector];\n              each$e(callbacks, callback => {\n                callback(false, {\n                  node,\n                  selector,\n                  parents\n                });\n              });\n            }\n          });\n        });\n      };\n      return {\n        selectorChangedWithUnbind: (selector, callback) => {\n          if (!selectorChangedData) {\n            setup();\n          }\n          if (!selectorChangedData[selector]) {\n            selectorChangedData[selector] = [];\n          }\n          selectorChangedData[selector].push(callback);\n          findMatchingNode(selector, getParents(editor.selection.getStart())).each(() => {\n            currentSelectors[selector] = selectorChangedData[selector];\n          });\n          return {\n            unbind: () => {\n              deleteFromCallbackMap(selectorChangedData, selector, callback);\n              deleteFromCallbackMap(currentSelectors, selector, callback);\n            }\n          };\n        }\n      };\n    };\n\n    const isAttachedToDom = node => {\n      return !!(node && node.ownerDocument) && contains(SugarElement.fromDom(node.ownerDocument), SugarElement.fromDom(node));\n    };\n    const isValidRange = rng => {\n      if (!rng) {\n        return false;\n      } else {\n        return isAttachedToDom(rng.startContainer) && isAttachedToDom(rng.endContainer);\n      }\n    };\n    const EditorSelection = (dom, win, serializer, editor) => {\n      let selectedRange;\n      let explicitRange;\n      const {selectorChangedWithUnbind} = SelectorChanged(dom, editor);\n      const setCursorLocation = (node, offset) => {\n        const rng = dom.createRng();\n        if (isNonNullable(node) && isNonNullable(offset)) {\n          rng.setStart(node, offset);\n          rng.setEnd(node, offset);\n          setRng(rng);\n          collapse(false);\n        } else {\n          moveEndPoint(dom, rng, editor.getBody(), true);\n          setRng(rng);\n        }\n      };\n      const getContent = args => getContent$1(editor, args);\n      const setContent = (content, args) => setContent$1(editor, content, args);\n      const getStart$1 = real => getStart(editor.getBody(), getRng$1(), real);\n      const getEnd$1 = real => getEnd(editor.getBody(), getRng$1(), real);\n      const getBookmark = (type, normalized) => bookmarkManager.getBookmark(type, normalized);\n      const moveToBookmark = bookmark => bookmarkManager.moveToBookmark(bookmark);\n      const select$1 = (node, content) => {\n        select(dom, node, content).each(setRng);\n        return node;\n      };\n      const isCollapsed = () => {\n        const rng = getRng$1(), sel = getSel();\n        if (!rng || rng.item) {\n          return false;\n        }\n        if (rng.compareEndPoints) {\n          return rng.compareEndPoints('StartToEnd', rng) === 0;\n        }\n        return !sel || rng.collapsed;\n      };\n      const isEditable = () => {\n        const rng = getRng$1();\n        const fakeSelectedElements = editor.getBody().querySelectorAll('[data-mce-selected=\"1\"]');\n        if (fakeSelectedElements.length > 0) {\n          return forall(fakeSelectedElements, el => dom.isEditable(el.parentElement));\n        } else {\n          return isEditableRange(dom, rng);\n        }\n      };\n      const collapse = toStart => {\n        const rng = getRng$1();\n        rng.collapse(!!toStart);\n        setRng(rng);\n      };\n      const getSel = () => win.getSelection ? win.getSelection() : win.document.selection;\n      const getRng$1 = () => {\n        let rng;\n        const tryCompareBoundaryPoints = (how, sourceRange, destinationRange) => {\n          try {\n            return sourceRange.compareBoundaryPoints(how, destinationRange);\n          } catch (ex) {\n            return -1;\n          }\n        };\n        const doc = win.document;\n        if (isNonNullable(editor.bookmark) && !hasFocus(editor)) {\n          const bookmark = getRng(editor);\n          if (bookmark.isSome()) {\n            return bookmark.map(r => processRanges(editor, [r])[0]).getOr(doc.createRange());\n          }\n        }\n        try {\n          const selection = getSel();\n          if (selection && !isRestrictedNode(selection.anchorNode)) {\n            if (selection.rangeCount > 0) {\n              rng = selection.getRangeAt(0);\n            } else {\n              rng = doc.createRange();\n            }\n            rng = processRanges(editor, [rng])[0];\n          }\n        } catch (ex) {\n        }\n        if (!rng) {\n          rng = doc.createRange();\n        }\n        if (isDocument$1(rng.startContainer) && rng.collapsed) {\n          const elm = dom.getRoot();\n          rng.setStart(elm, 0);\n          rng.setEnd(elm, 0);\n        }\n        if (selectedRange && explicitRange) {\n          if (tryCompareBoundaryPoints(rng.START_TO_START, rng, selectedRange) === 0 && tryCompareBoundaryPoints(rng.END_TO_END, rng, selectedRange) === 0) {\n            rng = explicitRange;\n          } else {\n            selectedRange = null;\n            explicitRange = null;\n          }\n        }\n        return rng;\n      };\n      const setRng = (rng, forward) => {\n        if (!isValidRange(rng)) {\n          return;\n        }\n        const sel = getSel();\n        const evt = editor.dispatch('SetSelectionRange', {\n          range: rng,\n          forward\n        });\n        rng = evt.range;\n        if (sel) {\n          explicitRange = rng;\n          try {\n            sel.removeAllRanges();\n            sel.addRange(rng);\n          } catch (ex) {\n          }\n          if (forward === false && sel.extend) {\n            sel.collapse(rng.endContainer, rng.endOffset);\n            sel.extend(rng.startContainer, rng.startOffset);\n          }\n          selectedRange = sel.rangeCount > 0 ? sel.getRangeAt(0) : null;\n        }\n        if (!rng.collapsed && rng.startContainer === rng.endContainer && (sel === null || sel === void 0 ? void 0 : sel.setBaseAndExtent)) {\n          if (rng.endOffset - rng.startOffset < 2) {\n            if (rng.startContainer.hasChildNodes()) {\n              const node = rng.startContainer.childNodes[rng.startOffset];\n              if (node && node.nodeName === 'IMG') {\n                sel.setBaseAndExtent(rng.startContainer, rng.startOffset, rng.endContainer, rng.endOffset);\n                if (sel.anchorNode !== rng.startContainer || sel.focusNode !== rng.endContainer) {\n                  sel.setBaseAndExtent(node, 0, node, 1);\n                }\n              }\n            }\n          }\n        }\n        editor.dispatch('AfterSetSelectionRange', {\n          range: rng,\n          forward\n        });\n      };\n      const setNode = elm => {\n        setContent(dom.getOuterHTML(elm));\n        return elm;\n      };\n      const getNode$1 = () => getNode(editor.getBody(), getRng$1());\n      const getSelectedBlocks$1 = (startElm, endElm) => getSelectedBlocks(dom, getRng$1(), startElm, endElm);\n      const isForward = () => {\n        const sel = getSel();\n        const anchorNode = sel === null || sel === void 0 ? void 0 : sel.anchorNode;\n        const focusNode = sel === null || sel === void 0 ? void 0 : sel.focusNode;\n        if (!sel || !anchorNode || !focusNode || isRestrictedNode(anchorNode) || isRestrictedNode(focusNode)) {\n          return true;\n        }\n        const anchorRange = dom.createRng();\n        const focusRange = dom.createRng();\n        try {\n          anchorRange.setStart(anchorNode, sel.anchorOffset);\n          anchorRange.collapse(true);\n          focusRange.setStart(focusNode, sel.focusOffset);\n          focusRange.collapse(true);\n        } catch (e) {\n          return true;\n        }\n        return anchorRange.compareBoundaryPoints(anchorRange.START_TO_START, focusRange) <= 0;\n      };\n      const normalize = () => {\n        const rng = getRng$1();\n        const sel = getSel();\n        if (!hasMultipleRanges(sel) && hasAnyRanges(editor)) {\n          const normRng = normalize$2(dom, rng);\n          normRng.each(normRng => {\n            setRng(normRng, isForward());\n          });\n          return normRng.getOr(rng);\n        }\n        return rng;\n      };\n      const selectorChanged = (selector, callback) => {\n        selectorChangedWithUnbind(selector, callback);\n        return exports;\n      };\n      const getScrollContainer = () => {\n        let scrollContainer;\n        let node = dom.getRoot();\n        while (node && node.nodeName !== 'BODY') {\n          if (node.scrollHeight > node.clientHeight) {\n            scrollContainer = node;\n            break;\n          }\n          node = node.parentNode;\n        }\n        return scrollContainer;\n      };\n      const scrollIntoView = (elm, alignToTop) => {\n        if (isNonNullable(elm)) {\n          scrollElementIntoView(editor, elm, alignToTop);\n        } else {\n          scrollRangeIntoView(editor, getRng$1(), alignToTop);\n        }\n      };\n      const placeCaretAt = (clientX, clientY) => setRng(fromPoint(clientX, clientY, editor.getDoc()));\n      const getBoundingClientRect = () => {\n        const rng = getRng$1();\n        return rng.collapsed ? CaretPosition.fromRangeStart(rng).getClientRects()[0] : rng.getBoundingClientRect();\n      };\n      const destroy = () => {\n        win = selectedRange = explicitRange = null;\n        controlSelection.destroy();\n      };\n      const expand = (options = { type: 'word' }) => setRng(RangeUtils(dom).expand(getRng$1(), options));\n      const exports = {\n        dom,\n        win,\n        serializer,\n        editor,\n        expand,\n        collapse,\n        setCursorLocation,\n        getContent,\n        setContent,\n        getBookmark,\n        moveToBookmark,\n        select: select$1,\n        isCollapsed,\n        isEditable,\n        isForward,\n        setNode,\n        getNode: getNode$1,\n        getSel,\n        setRng,\n        getRng: getRng$1,\n        getStart: getStart$1,\n        getEnd: getEnd$1,\n        getSelectedBlocks: getSelectedBlocks$1,\n        normalize,\n        selectorChanged,\n        selectorChangedWithUnbind,\n        getScrollContainer,\n        scrollIntoView,\n        placeCaretAt,\n        getBoundingClientRect,\n        destroy\n      };\n      const bookmarkManager = BookmarkManager(exports);\n      const controlSelection = ControlSelection(exports, editor);\n      exports.bookmarkManager = bookmarkManager;\n      exports.controlSelection = controlSelection;\n      return exports;\n    };\n\n    const addNodeFilter = (settings, htmlParser, schema) => {\n      htmlParser.addNodeFilter('br', (nodes, _, args) => {\n        const blockElements = Tools.extend({}, schema.getBlockElements());\n        const nonEmptyElements = schema.getNonEmptyElements();\n        const whitespaceElements = schema.getWhitespaceElements();\n        blockElements.body = 1;\n        const isBlock = node => node.name in blockElements || isTransparentAstBlock(schema, node);\n        for (let i = 0, l = nodes.length; i < l; i++) {\n          let node = nodes[i];\n          let parent = node.parent;\n          if (parent && isBlock(parent) && node === parent.lastChild) {\n            let prev = node.prev;\n            while (prev) {\n              const prevName = prev.name;\n              if (prevName !== 'span' || prev.attr('data-mce-type') !== 'bookmark') {\n                if (prevName === 'br') {\n                  node = null;\n                }\n                break;\n              }\n              prev = prev.prev;\n            }\n            if (node) {\n              node.remove();\n              if (isEmpty(schema, nonEmptyElements, whitespaceElements, parent)) {\n                const elementRule = schema.getElementRule(parent.name);\n                if (elementRule) {\n                  if (elementRule.removeEmpty) {\n                    parent.remove();\n                  } else if (elementRule.paddEmpty) {\n                    paddEmptyNode(settings, args, isBlock, parent);\n                  }\n                }\n              }\n            }\n          } else {\n            let lastParent = node;\n            while (parent && parent.firstChild === lastParent && parent.lastChild === lastParent) {\n              lastParent = parent;\n              if (blockElements[parent.name]) {\n                break;\n              }\n              parent = parent.parent;\n            }\n            if (lastParent === parent) {\n              const textNode = new AstNode('#text', 3);\n              textNode.value = nbsp;\n              node.replace(textNode);\n            }\n          }\n        }\n      });\n    };\n\n    const register$3 = (htmlParser, settings, dom) => {\n      htmlParser.addAttributeFilter('data-mce-tabindex', (nodes, name) => {\n        let i = nodes.length;\n        while (i--) {\n          const node = nodes[i];\n          node.attr('tabindex', node.attr('data-mce-tabindex'));\n          node.attr(name, null);\n        }\n      });\n      htmlParser.addAttributeFilter('src,href,style', (nodes, name) => {\n        const internalName = 'data-mce-' + name;\n        const urlConverter = settings.url_converter;\n        const urlConverterScope = settings.url_converter_scope;\n        let i = nodes.length;\n        while (i--) {\n          const node = nodes[i];\n          let value = node.attr(internalName);\n          if (value !== undefined) {\n            node.attr(name, value.length > 0 ? value : null);\n            node.attr(internalName, null);\n          } else {\n            value = node.attr(name);\n            if (name === 'style') {\n              value = dom.serializeStyle(dom.parseStyle(value), node.name);\n            } else if (urlConverter) {\n              value = urlConverter.call(urlConverterScope, value, name, node.name);\n            }\n            node.attr(name, value.length > 0 ? value : null);\n          }\n        }\n      });\n      htmlParser.addAttributeFilter('class', nodes => {\n        let i = nodes.length;\n        while (i--) {\n          const node = nodes[i];\n          let value = node.attr('class');\n          if (value) {\n            value = value.replace(/(?:^|\\s)mce-item-\\w+(?!\\S)/g, '');\n            node.attr('class', value.length > 0 ? value : null);\n          }\n        }\n      });\n      htmlParser.addAttributeFilter('data-mce-type', (nodes, name, args) => {\n        let i = nodes.length;\n        while (i--) {\n          const node = nodes[i];\n          if (node.attr('data-mce-type') === 'bookmark' && !args.cleanup) {\n            const hasChildren = Optional.from(node.firstChild).exists(firstChild => {\n              var _a;\n              return !isZwsp((_a = firstChild.value) !== null && _a !== void 0 ? _a : '');\n            });\n            if (hasChildren) {\n              node.unwrap();\n            } else {\n              node.remove();\n            }\n          }\n        }\n      });\n      htmlParser.addNodeFilter('script,style', (nodes, name) => {\n        var _a;\n        const trim = value => {\n          return value.replace(/(<!--\\[CDATA\\[|\\]\\]-->)/g, '\\n').replace(/^[\\r\\n]*|[\\r\\n]*$/g, '').replace(/^\\s*((<!--)?(\\s*\\/\\/)?\\s*<!\\[CDATA\\[|(<!--\\s*)?\\/\\*\\s*<!\\[CDATA\\[\\s*\\*\\/|(\\/\\/)?\\s*<!--|\\/\\*\\s*<!--\\s*\\*\\/)\\s*[\\r\\n]*/gi, '').replace(/\\s*(\\/\\*\\s*\\]\\]>\\s*\\*\\/(-->)?|\\s*\\/\\/\\s*\\]\\]>(-->)?|\\/\\/\\s*(-->)?|\\]\\]>|\\/\\*\\s*-->\\s*\\*\\/|\\s*-->\\s*)\\s*$/g, '');\n        };\n        let i = nodes.length;\n        while (i--) {\n          const node = nodes[i];\n          const firstChild = node.firstChild;\n          const value = (_a = firstChild === null || firstChild === void 0 ? void 0 : firstChild.value) !== null && _a !== void 0 ? _a : '';\n          if (name === 'script') {\n            const type = node.attr('type');\n            if (type) {\n              node.attr('type', type === 'mce-no/type' ? null : type.replace(/^mce\\-/, ''));\n            }\n            if (settings.element_format === 'xhtml' && firstChild && value.length > 0) {\n              firstChild.value = '// <![CDATA[\\n' + trim(value) + '\\n// ]]>';\n            }\n          } else {\n            if (settings.element_format === 'xhtml' && firstChild && value.length > 0) {\n              firstChild.value = '<!--\\n' + trim(value) + '\\n-->';\n            }\n          }\n        }\n      });\n      htmlParser.addNodeFilter('#comment', nodes => {\n        let i = nodes.length;\n        while (i--) {\n          const node = nodes[i];\n          const value = node.value;\n          if (settings.preserve_cdata && (value === null || value === void 0 ? void 0 : value.indexOf('[CDATA[')) === 0) {\n            node.name = '#cdata';\n            node.type = 4;\n            node.value = dom.decode(value.replace(/^\\[CDATA\\[|\\]\\]$/g, ''));\n          } else if ((value === null || value === void 0 ? void 0 : value.indexOf('mce:protected ')) === 0) {\n            node.name = '#text';\n            node.type = 3;\n            node.raw = true;\n            node.value = unescape(value).substr(14);\n          }\n        }\n      });\n      htmlParser.addNodeFilter('xml:namespace,input', (nodes, name) => {\n        let i = nodes.length;\n        while (i--) {\n          const node = nodes[i];\n          if (node.type === 7) {\n            node.remove();\n          } else if (node.type === 1) {\n            if (name === 'input' && !node.attr('type')) {\n              node.attr('type', 'text');\n            }\n          }\n        }\n      });\n      htmlParser.addAttributeFilter('data-mce-type', nodes => {\n        each$e(nodes, node => {\n          if (node.attr('data-mce-type') === 'format-caret') {\n            if (node.isEmpty(htmlParser.schema.getNonEmptyElements())) {\n              node.remove();\n            } else {\n              node.unwrap();\n            }\n          }\n        });\n      });\n      htmlParser.addAttributeFilter('data-mce-src,data-mce-href,data-mce-style,' + 'data-mce-selected,data-mce-expando,data-mce-block,' + 'data-mce-type,data-mce-resize,data-mce-placeholder', (nodes, name) => {\n        let i = nodes.length;\n        while (i--) {\n          nodes[i].attr(name, null);\n        }\n      });\n      if (settings.remove_trailing_brs) {\n        addNodeFilter(settings, htmlParser, htmlParser.schema);\n      }\n    };\n    const trimTrailingBr = rootNode => {\n      const isBr = node => {\n        return (node === null || node === void 0 ? void 0 : node.name) === 'br';\n      };\n      const brNode1 = rootNode.lastChild;\n      if (isBr(brNode1)) {\n        const brNode2 = brNode1.prev;\n        if (isBr(brNode2)) {\n          brNode1.remove();\n          brNode2.remove();\n        }\n      }\n    };\n\n    const preProcess$1 = (editor, node, args) => {\n      let oldDoc;\n      const dom = editor.dom;\n      let clonedNode = node.cloneNode(true);\n      const impl = document.implementation;\n      if (impl.createHTMLDocument) {\n        const doc = impl.createHTMLDocument('');\n        Tools.each(clonedNode.nodeName === 'BODY' ? clonedNode.childNodes : [clonedNode], node => {\n          doc.body.appendChild(doc.importNode(node, true));\n        });\n        if (clonedNode.nodeName !== 'BODY') {\n          clonedNode = doc.body.firstChild;\n        } else {\n          clonedNode = doc.body;\n        }\n        oldDoc = dom.doc;\n        dom.doc = doc;\n      }\n      firePreProcess(editor, {\n        ...args,\n        node: clonedNode\n      });\n      if (oldDoc) {\n        dom.doc = oldDoc;\n      }\n      return clonedNode;\n    };\n    const shouldFireEvent = (editor, args) => {\n      return isNonNullable(editor) && editor.hasEventListeners('PreProcess') && !args.no_events;\n    };\n    const process$1 = (editor, node, args) => {\n      return shouldFireEvent(editor, args) ? preProcess$1(editor, node, args) : node;\n    };\n\n    const addTempAttr = (htmlParser, tempAttrs, name) => {\n      if (Tools.inArray(tempAttrs, name) === -1) {\n        htmlParser.addAttributeFilter(name, (nodes, name) => {\n          let i = nodes.length;\n          while (i--) {\n            nodes[i].attr(name, null);\n          }\n        });\n        tempAttrs.push(name);\n      }\n    };\n    const postProcess = (editor, args, content) => {\n      if (!args.no_events && editor) {\n        const outArgs = firePostProcess(editor, {\n          ...args,\n          content\n        });\n        return outArgs.content;\n      } else {\n        return content;\n      }\n    };\n    const getHtmlFromNode = (dom, node, args) => {\n      const html = trim$2(args.getInner ? node.innerHTML : dom.getOuterHTML(node));\n      return args.selection || isWsPreserveElement(SugarElement.fromDom(node)) ? html : Tools.trim(html);\n    };\n    const parseHtml = (htmlParser, html, args) => {\n      const parserArgs = args.selection ? {\n        forced_root_block: false,\n        ...args\n      } : args;\n      const rootNode = htmlParser.parse(html, parserArgs);\n      trimTrailingBr(rootNode);\n      return rootNode;\n    };\n    const serializeNode = (settings, schema, node) => {\n      const htmlSerializer = HtmlSerializer(settings, schema);\n      return htmlSerializer.serialize(node);\n    };\n    const toHtml = (editor, settings, schema, rootNode, args) => {\n      const content = serializeNode(settings, schema, rootNode);\n      return postProcess(editor, args, content);\n    };\n    const DomSerializerImpl = (settings, editor) => {\n      const tempAttrs = ['data-mce-selected'];\n      const defaultedSettings = {\n        entity_encoding: 'named',\n        remove_trailing_brs: true,\n        pad_empty_with_br: false,\n        ...settings\n      };\n      const dom = editor && editor.dom ? editor.dom : DOMUtils.DOM;\n      const schema = editor && editor.schema ? editor.schema : Schema(defaultedSettings);\n      const htmlParser = DomParser(defaultedSettings, schema);\n      register$3(htmlParser, defaultedSettings, dom);\n      const serialize = (node, parserArgs = {}) => {\n        const args = {\n          format: 'html',\n          ...parserArgs\n        };\n        const targetNode = process$1(editor, node, args);\n        const html = getHtmlFromNode(dom, targetNode, args);\n        const rootNode = parseHtml(htmlParser, html, args);\n        return args.format === 'tree' ? rootNode : toHtml(editor, defaultedSettings, schema, rootNode, args);\n      };\n      return {\n        schema,\n        addNodeFilter: htmlParser.addNodeFilter,\n        addAttributeFilter: htmlParser.addAttributeFilter,\n        serialize: serialize,\n        addRules: schema.addValidElements,\n        setRules: schema.setValidElements,\n        addTempAttr: curry(addTempAttr, htmlParser, tempAttrs),\n        getTempAttrs: constant(tempAttrs),\n        getNodeFilters: htmlParser.getNodeFilters,\n        getAttributeFilters: htmlParser.getAttributeFilters,\n        removeNodeFilter: htmlParser.removeNodeFilter,\n        removeAttributeFilter: htmlParser.removeAttributeFilter\n      };\n    };\n\n    const DomSerializer = (settings, editor) => {\n      const domSerializer = DomSerializerImpl(settings, editor);\n      return {\n        schema: domSerializer.schema,\n        addNodeFilter: domSerializer.addNodeFilter,\n        addAttributeFilter: domSerializer.addAttributeFilter,\n        serialize: domSerializer.serialize,\n        addRules: domSerializer.addRules,\n        setRules: domSerializer.setRules,\n        addTempAttr: domSerializer.addTempAttr,\n        getTempAttrs: domSerializer.getTempAttrs,\n        getNodeFilters: domSerializer.getNodeFilters,\n        getAttributeFilters: domSerializer.getAttributeFilters,\n        removeNodeFilter: domSerializer.removeNodeFilter,\n        removeAttributeFilter: domSerializer.removeAttributeFilter\n      };\n    };\n\n    const defaultFormat$1 = 'html';\n    const setupArgs$1 = (args, format) => ({\n      ...args,\n      format,\n      get: true,\n      getInner: true\n    });\n    const getContent = (editor, args = {}) => {\n      const format = args.format ? args.format : defaultFormat$1;\n      const defaultedArgs = setupArgs$1(args, format);\n      return preProcessGetContent(editor, defaultedArgs).fold(identity, updatedArgs => {\n        const content = getContent$2(editor, updatedArgs);\n        return postProcessGetContent(editor, content, updatedArgs);\n      });\n    };\n\n    const defaultFormat = 'html';\n    const setupArgs = (args, content) => ({\n      format: defaultFormat,\n      ...args,\n      set: true,\n      content\n    });\n    const setContent = (editor, content, args = {}) => {\n      const defaultedArgs = setupArgs(args, content);\n      return preProcessSetContent(editor, defaultedArgs).map(updatedArgs => {\n        const result = setContent$2(editor, updatedArgs.content, updatedArgs);\n        postProcessSetContent(editor, result.html, updatedArgs);\n        return result.content;\n      }).getOr(content);\n    };\n\n    const removedOptions = ('autoresize_on_init,content_editable_state,padd_empty_with_br,block_elements,' + 'boolean_attributes,editor_deselector,editor_selector,elements,file_browser_callback_types,filepicker_validator_handler,' + 'force_hex_style_colors,force_p_newlines,gecko_spellcheck,images_dataimg_filter,media_scripts,mode,move_caret_before_on_enter_elements,' + 'non_empty_elements,self_closing_elements,short_ended_elements,special,spellchecker_select_languages,spellchecker_whitelist,' + 'tab_focus,tabfocus_elements,table_responsive_width,text_block_elements,text_inline_elements,toolbar_drawer,types,validate,whitespace_elements,' + 'paste_enable_default_filters,paste_filter_drop,paste_word_valid_elements,paste_retain_style_properties,paste_convert_word_fake_lists').split(',');\n    const deprecatedOptions = ''.split(',');\n    const removedPlugins = 'bbcode,colorpicker,contextmenu,fullpage,legacyoutput,spellchecker,textcolor'.split(',');\n    const deprecatedPlugins = [{\n        name: 'rtc',\n        replacedWith: false\n      }];\n    const getMatchingOptions = (options, searchingFor) => {\n      const settingNames = filter$5(searchingFor, setting => has$2(options, setting));\n      return sort(settingNames);\n    };\n    const getRemovedOptions = options => {\n      const settingNames = getMatchingOptions(options, removedOptions);\n      const forcedRootBlock = options.forced_root_block;\n      if (forcedRootBlock === false || forcedRootBlock === '') {\n        settingNames.push('forced_root_block (false only)');\n      }\n      return sort(settingNames);\n    };\n    const getDeprecatedOptions = options => getMatchingOptions(options, deprecatedOptions);\n    const getMatchingPlugins = (options, searchingFor) => {\n      const plugins = Tools.makeMap(options.plugins, ' ');\n      const hasPlugin = plugin => has$2(plugins, plugin);\n      const pluginNames = filter$5(searchingFor, hasPlugin);\n      return sort(pluginNames);\n    };\n    const getRemovedPlugins = options => getMatchingPlugins(options, removedPlugins);\n    const getDeprecatedPlugins = options => getMatchingPlugins(options, deprecatedPlugins.map(entry => entry.name));\n    const logRemovedWarnings = (rawOptions, normalizedOptions) => {\n      const removedOptions = getRemovedOptions(rawOptions);\n      const removedPlugins = getRemovedPlugins(normalizedOptions);\n      const hasRemovedPlugins = removedPlugins.length > 0;\n      const hasRemovedOptions = removedOptions.length > 0;\n      const isLegacyMobileTheme = normalizedOptions.theme === 'mobile';\n      if (hasRemovedPlugins || hasRemovedOptions || isLegacyMobileTheme) {\n        const listJoiner = '\\n- ';\n        const themesMessage = isLegacyMobileTheme ? `\\n\\nThemes:${ listJoiner }mobile` : '';\n        const pluginsMessage = hasRemovedPlugins ? `\\n\\nPlugins:${ listJoiner }${ removedPlugins.join(listJoiner) }` : '';\n        const optionsMessage = hasRemovedOptions ? `\\n\\nOptions:${ listJoiner }${ removedOptions.join(listJoiner) }` : '';\n        console.warn('The following deprecated features are currently enabled but have been removed in TinyMCE 6.0 and therefore, they are not present in HugeRTE either. These features will no longer work and should be removed from the HugeRTE configuration. ' + 'See https://www.hugerte.org/docs/hugerte/1/migration-from-5x/ for more information.' + themesMessage + pluginsMessage + optionsMessage);\n      }\n    };\n    const getPluginDescription = name => find$2(deprecatedPlugins, entry => entry.name === name).fold(() => name, entry => {\n      if (entry.replacedWith) {\n        return `${ name }, replaced by ${ entry.replacedWith }`;\n      } else {\n        return name;\n      }\n    });\n    const logDeprecatedWarnings = (rawOptions, normalizedOptions) => {\n      const deprecatedOptions = getDeprecatedOptions(rawOptions);\n      const deprecatedPlugins = getDeprecatedPlugins(normalizedOptions);\n      const hasDeprecatedPlugins = deprecatedPlugins.length > 0;\n      const hasDeprecatedOptions = deprecatedOptions.length > 0;\n      if (hasDeprecatedPlugins || hasDeprecatedOptions) {\n        const listJoiner = '\\n- ';\n        const pluginsMessage = hasDeprecatedPlugins ? `\\n\\nPlugins:${ listJoiner }${ deprecatedPlugins.map(getPluginDescription).join(listJoiner) }` : '';\n        const optionsMessage = hasDeprecatedOptions ? `\\n\\nOptions:${ listJoiner }${ deprecatedOptions.join(listJoiner) }` : '';\n        console.warn('The following deprecated features are currently enabled but will be removed soon.' + pluginsMessage + optionsMessage);\n      }\n    };\n    const logWarnings = (rawOptions, normalizedOptions) => {\n      logRemovedWarnings(rawOptions, normalizedOptions);\n      logDeprecatedWarnings(rawOptions, normalizedOptions);\n    };\n\n    const DOM$8 = DOMUtils.DOM;\n    const restoreOriginalStyles = editor => {\n      DOM$8.setStyle(editor.id, 'display', editor.orgDisplay);\n    };\n    const safeDestroy = x => Optional.from(x).each(x => x.destroy());\n    const clearDomReferences = editor => {\n      const ed = editor;\n      ed.contentAreaContainer = ed.formElement = ed.container = ed.editorContainer = null;\n      ed.bodyElement = ed.contentDocument = ed.contentWindow = null;\n      ed.iframeElement = ed.targetElm = null;\n      const selection = editor.selection;\n      if (selection) {\n        const dom = selection.dom;\n        ed.selection = selection.win = selection.dom = dom.doc = null;\n      }\n    };\n    const restoreForm = editor => {\n      const form = editor.formElement;\n      if (form) {\n        if (form._mceOldSubmit) {\n          form.submit = form._mceOldSubmit;\n          delete form._mceOldSubmit;\n        }\n        DOM$8.unbind(form, 'submit reset', editor.formEventDelegate);\n      }\n    };\n    const remove$1 = editor => {\n      if (!editor.removed) {\n        const {_selectionOverrides, editorUpload} = editor;\n        const body = editor.getBody();\n        const element = editor.getElement();\n        if (body) {\n          editor.save({ is_removing: true });\n        }\n        editor.removed = true;\n        editor.unbindAllNativeEvents();\n        if (editor.hasHiddenInput && isNonNullable(element === null || element === void 0 ? void 0 : element.nextSibling)) {\n          DOM$8.remove(element.nextSibling);\n        }\n        fireRemove(editor);\n        editor.editorManager.remove(editor);\n        if (!editor.inline && body) {\n          restoreOriginalStyles(editor);\n        }\n        fireDetach(editor);\n        DOM$8.remove(editor.getContainer());\n        safeDestroy(_selectionOverrides);\n        safeDestroy(editorUpload);\n        editor.destroy();\n      }\n    };\n    const destroy = (editor, automatic) => {\n      const {selection, dom} = editor;\n      if (editor.destroyed) {\n        return;\n      }\n      if (!automatic && !editor.removed) {\n        editor.remove();\n        return;\n      }\n      if (!automatic) {\n        editor.editorManager.off('beforeunload', editor._beforeUnload);\n        if (editor.theme && editor.theme.destroy) {\n          editor.theme.destroy();\n        }\n        safeDestroy(selection);\n        safeDestroy(dom);\n      }\n      restoreForm(editor);\n      clearDomReferences(editor);\n      editor.destroyed = true;\n    };\n\n    const CreateIconManager = () => {\n      const lookup = {};\n      const add = (id, iconPack) => {\n        lookup[id] = iconPack;\n      };\n      const get = id => {\n        if (lookup[id]) {\n          return lookup[id];\n        } else {\n          return { icons: {} };\n        }\n      };\n      const has = id => has$2(lookup, id);\n      return {\n        add,\n        get,\n        has\n      };\n    };\n    const IconManager = CreateIconManager();\n\n    const ModelManager = AddOnManager.ModelManager;\n\n    const getProp = (propName, elm) => {\n      const rawElm = elm.dom;\n      return rawElm[propName];\n    };\n    const getComputedSizeProp = (propName, elm) => parseInt(get$7(elm, propName), 10);\n    const getClientWidth = curry(getProp, 'clientWidth');\n    const getClientHeight = curry(getProp, 'clientHeight');\n    const getMarginTop = curry(getComputedSizeProp, 'margin-top');\n    const getMarginLeft = curry(getComputedSizeProp, 'margin-left');\n    const getBoundingClientRect = elm => elm.dom.getBoundingClientRect();\n    const isInsideElementContentArea = (bodyElm, clientX, clientY) => {\n      const clientWidth = getClientWidth(bodyElm);\n      const clientHeight = getClientHeight(bodyElm);\n      return clientX >= 0 && clientY >= 0 && clientX <= clientWidth && clientY <= clientHeight;\n    };\n    const transpose = (inline, elm, clientX, clientY) => {\n      const clientRect = getBoundingClientRect(elm);\n      const deltaX = inline ? clientRect.left + elm.dom.clientLeft + getMarginLeft(elm) : 0;\n      const deltaY = inline ? clientRect.top + elm.dom.clientTop + getMarginTop(elm) : 0;\n      const x = clientX - deltaX;\n      const y = clientY - deltaY;\n      return {\n        x,\n        y\n      };\n    };\n    const isXYInContentArea = (editor, clientX, clientY) => {\n      const bodyElm = SugarElement.fromDom(editor.getBody());\n      const targetElm = editor.inline ? bodyElm : documentElement(bodyElm);\n      const transposedPoint = transpose(editor.inline, targetElm, clientX, clientY);\n      return isInsideElementContentArea(targetElm, transposedPoint.x, transposedPoint.y);\n    };\n    const fromDomSafe = node => Optional.from(node).map(SugarElement.fromDom);\n    const isEditorAttachedToDom = editor => {\n      const rawContainer = editor.inline ? editor.getBody() : editor.getContentAreaContainer();\n      return fromDomSafe(rawContainer).map(inBody).getOr(false);\n    };\n\n    var NotificationManagerImpl = () => {\n      const unimplemented = () => {\n        throw new Error('Theme did not provide a NotificationManager implementation.');\n      };\n      return {\n        open: unimplemented,\n        close: unimplemented,\n        getArgs: unimplemented\n      };\n    };\n\n    const NotificationManager = editor => {\n      const notifications = [];\n      const getImplementation = () => {\n        const theme = editor.theme;\n        return theme && theme.getNotificationManagerImpl ? theme.getNotificationManagerImpl() : NotificationManagerImpl();\n      };\n      const getTopNotification = () => {\n        return Optional.from(notifications[0]);\n      };\n      const isEqual = (a, b) => {\n        return a.type === b.type && a.text === b.text && !a.progressBar && !a.timeout && !b.progressBar && !b.timeout;\n      };\n      const reposition = () => {\n        each$e(notifications, notification => {\n          notification.reposition();\n        });\n      };\n      const addNotification = notification => {\n        notifications.push(notification);\n      };\n      const closeNotification = notification => {\n        findIndex$2(notifications, otherNotification => {\n          return otherNotification === notification;\n        }).each(index => {\n          notifications.splice(index, 1);\n        });\n      };\n      const open = (spec, fireEvent = true) => {\n        if (editor.removed || !isEditorAttachedToDom(editor)) {\n          return {};\n        }\n        if (fireEvent) {\n          editor.dispatch('BeforeOpenNotification', { notification: spec });\n        }\n        return find$2(notifications, notification => {\n          return isEqual(getImplementation().getArgs(notification), spec);\n        }).getOrThunk(() => {\n          editor.editorManager.setActive(editor);\n          const notification = getImplementation().open(spec, () => {\n            closeNotification(notification);\n            reposition();\n            if (hasEditorOrUiFocus(editor)) {\n              getTopNotification().fold(() => editor.focus(), top => focus$1(SugarElement.fromDom(top.getEl())));\n            }\n          });\n          addNotification(notification);\n          reposition();\n          editor.dispatch('OpenNotification', { notification: { ...notification } });\n          return notification;\n        });\n      };\n      const close = () => {\n        getTopNotification().each(notification => {\n          getImplementation().close(notification);\n          closeNotification(notification);\n          reposition();\n        });\n      };\n      const getNotifications = constant(notifications);\n      const registerEvents = editor => {\n        editor.on('SkinLoaded', () => {\n          const serviceMessage = getServiceMessage(editor);\n          if (serviceMessage) {\n            open({\n              text: serviceMessage,\n              type: 'warning',\n              timeout: 0\n            }, false);\n          }\n          reposition();\n        });\n        editor.on('show ResizeEditor ResizeWindow NodeChange', () => {\n          requestAnimationFrame(reposition);\n        });\n        editor.on('remove', () => {\n          each$e(notifications.slice(), notification => {\n            getImplementation().close(notification);\n          });\n        });\n      };\n      registerEvents(editor);\n      return {\n        open,\n        close,\n        getNotifications\n      };\n    };\n\n    const PluginManager = AddOnManager.PluginManager;\n\n    const ThemeManager = AddOnManager.ThemeManager;\n\n    var WindowManagerImpl = () => {\n      const unimplemented = () => {\n        throw new Error('Theme did not provide a WindowManager implementation.');\n      };\n      return {\n        open: unimplemented,\n        openUrl: unimplemented,\n        alert: unimplemented,\n        confirm: unimplemented,\n        close: unimplemented\n      };\n    };\n\n    const WindowManager = editor => {\n      let dialogs = [];\n      const getImplementation = () => {\n        const theme = editor.theme;\n        return theme && theme.getWindowManagerImpl ? theme.getWindowManagerImpl() : WindowManagerImpl();\n      };\n      const funcBind = (scope, f) => {\n        return (...args) => {\n          return f ? f.apply(scope, args) : undefined;\n        };\n      };\n      const fireOpenEvent = dialog => {\n        editor.dispatch('OpenWindow', { dialog });\n      };\n      const fireCloseEvent = dialog => {\n        editor.dispatch('CloseWindow', { dialog });\n      };\n      const addDialog = dialog => {\n        dialogs.push(dialog);\n        fireOpenEvent(dialog);\n      };\n      const closeDialog = dialog => {\n        fireCloseEvent(dialog);\n        dialogs = filter$5(dialogs, otherDialog => {\n          return otherDialog !== dialog;\n        });\n        if (dialogs.length === 0) {\n          editor.focus();\n        }\n      };\n      const getTopDialog = () => {\n        return Optional.from(dialogs[dialogs.length - 1]);\n      };\n      const storeSelectionAndOpenDialog = openDialog => {\n        editor.editorManager.setActive(editor);\n        store(editor);\n        editor.ui.show();\n        const dialog = openDialog();\n        addDialog(dialog);\n        return dialog;\n      };\n      const open = (args, params) => {\n        return storeSelectionAndOpenDialog(() => getImplementation().open(args, params, closeDialog));\n      };\n      const openUrl = args => {\n        return storeSelectionAndOpenDialog(() => getImplementation().openUrl(args, closeDialog));\n      };\n      const alert = (message, callback, scope) => {\n        const windowManagerImpl = getImplementation();\n        windowManagerImpl.alert(message, funcBind(scope ? scope : windowManagerImpl, callback));\n      };\n      const confirm = (message, callback, scope) => {\n        const windowManagerImpl = getImplementation();\n        windowManagerImpl.confirm(message, funcBind(scope ? scope : windowManagerImpl, callback));\n      };\n      const close = () => {\n        getTopDialog().each(dialog => {\n          getImplementation().close(dialog);\n          closeDialog(dialog);\n        });\n      };\n      editor.on('remove', () => {\n        each$e(dialogs, dialog => {\n          getImplementation().close(dialog);\n        });\n      });\n      return {\n        open,\n        openUrl,\n        alert,\n        confirm,\n        close\n      };\n    };\n\n    const displayNotification = (editor, message) => {\n      editor.notificationManager.open({\n        type: 'error',\n        text: message\n      });\n    };\n    const displayError = (editor, message) => {\n      if (editor._skinLoaded) {\n        displayNotification(editor, message);\n      } else {\n        editor.on('SkinLoaded', () => {\n          displayNotification(editor, message);\n        });\n      }\n    };\n    const uploadError = (editor, message) => {\n      displayError(editor, I18n.translate([\n        'Failed to upload image: {0}',\n        message\n      ]));\n    };\n    const logError = (editor, errorType, msg) => {\n      fireError(editor, errorType, { message: msg });\n      console.error(msg);\n    };\n    const createLoadError = (type, url, name) => name ? `Failed to load ${ type }: ${ name } from url ${ url }` : `Failed to load ${ type } url: ${ url }`;\n    const pluginLoadError = (editor, url, name) => {\n      logError(editor, 'PluginLoadError', createLoadError('plugin', url, name));\n    };\n    const iconsLoadError = (editor, url, name) => {\n      logError(editor, 'IconsLoadError', createLoadError('icons', url, name));\n    };\n    const languageLoadError = (editor, url, name) => {\n      logError(editor, 'LanguageLoadError', createLoadError('language', url, name));\n    };\n    const themeLoadError = (editor, url, name) => {\n      logError(editor, 'ThemeLoadError', createLoadError('theme', url, name));\n    };\n    const modelLoadError = (editor, url, name) => {\n      logError(editor, 'ModelLoadError', createLoadError('model', url, name));\n    };\n    const pluginInitError = (editor, name, err) => {\n      const message = I18n.translate([\n        'Failed to initialize plugin: {0}',\n        name\n      ]);\n      fireError(editor, 'PluginLoadError', { message });\n      initError(message, err);\n      displayError(editor, message);\n    };\n    const initError = (message, ...x) => {\n      const console = window.console;\n      if (console) {\n        if (console.error) {\n          console.error(message, ...x);\n        } else {\n          console.log(message, ...x);\n        }\n      }\n    };\n\n    const isContentCssSkinName = url => /^[a-z0-9\\-]+$/i.test(url);\n    const toContentSkinResourceName = url => 'content/' + url + '/content.css';\n    const isBundledCssSkinName = url => hugerte.Resource.has(toContentSkinResourceName(url));\n    const getContentCssUrls = editor => {\n      return transformToUrls(editor, getContentCss(editor));\n    };\n    const getFontCssUrls = editor => {\n      return transformToUrls(editor, getFontCss(editor));\n    };\n    const transformToUrls = (editor, cssLinks) => {\n      const skinUrl = editor.editorManager.baseURL + '/skins/content';\n      const suffix = editor.editorManager.suffix;\n      const contentCssFile = `content${ suffix }.css`;\n      return map$3(cssLinks, url => {\n        if (isBundledCssSkinName(url)) {\n          return toContentSkinResourceName(url);\n        } else if (isContentCssSkinName(url) && !editor.inline) {\n          return `${ skinUrl }/${ url }/${ contentCssFile }`;\n        } else {\n          return editor.documentBaseURI.toAbsolute(url);\n        }\n      });\n    };\n    const appendContentCssFromSettings = editor => {\n      editor.contentCSS = editor.contentCSS.concat(getContentCssUrls(editor), getFontCssUrls(editor));\n    };\n\n    const getAllImages = elm => {\n      return elm ? from(elm.getElementsByTagName('img')) : [];\n    };\n    const ImageScanner = (uploadStatus, blobCache) => {\n      const cachedPromises = {};\n      const findAll = (elm, predicate = always) => {\n        const images = filter$5(getAllImages(elm), img => {\n          const src = img.src;\n          if (img.hasAttribute('data-mce-bogus')) {\n            return false;\n          }\n          if (img.hasAttribute('data-mce-placeholder')) {\n            return false;\n          }\n          if (!src || src === Env.transparentSrc) {\n            return false;\n          }\n          if (startsWith(src, 'blob:')) {\n            return !uploadStatus.isUploaded(src) && predicate(img);\n          }\n          if (startsWith(src, 'data:')) {\n            return predicate(img);\n          }\n          return false;\n        });\n        const promises = map$3(images, img => {\n          const imageSrc = img.src;\n          if (has$2(cachedPromises, imageSrc)) {\n            return cachedPromises[imageSrc].then(imageInfo => {\n              if (isString(imageInfo)) {\n                return imageInfo;\n              } else {\n                return {\n                  image: img,\n                  blobInfo: imageInfo.blobInfo\n                };\n              }\n            });\n          } else {\n            const newPromise = imageToBlobInfo(blobCache, imageSrc).then(blobInfo => {\n              delete cachedPromises[imageSrc];\n              return {\n                image: img,\n                blobInfo\n              };\n            }).catch(error => {\n              delete cachedPromises[imageSrc];\n              return error;\n            });\n            cachedPromises[imageSrc] = newPromise;\n            return newPromise;\n          }\n        });\n        return Promise.all(promises);\n      };\n      return { findAll };\n    };\n\n    const UploadStatus = () => {\n      const PENDING = 1, UPLOADED = 2;\n      let blobUriStatuses = {};\n      const createStatus = (status, resultUri) => {\n        return {\n          status,\n          resultUri\n        };\n      };\n      const hasBlobUri = blobUri => {\n        return blobUri in blobUriStatuses;\n      };\n      const getResultUri = blobUri => {\n        const result = blobUriStatuses[blobUri];\n        return result ? result.resultUri : null;\n      };\n      const isPending = blobUri => {\n        return hasBlobUri(blobUri) ? blobUriStatuses[blobUri].status === PENDING : false;\n      };\n      const isUploaded = blobUri => {\n        return hasBlobUri(blobUri) ? blobUriStatuses[blobUri].status === UPLOADED : false;\n      };\n      const markPending = blobUri => {\n        blobUriStatuses[blobUri] = createStatus(PENDING, null);\n      };\n      const markUploaded = (blobUri, resultUri) => {\n        blobUriStatuses[blobUri] = createStatus(UPLOADED, resultUri);\n      };\n      const removeFailed = blobUri => {\n        delete blobUriStatuses[blobUri];\n      };\n      const destroy = () => {\n        blobUriStatuses = {};\n      };\n      return {\n        hasBlobUri,\n        getResultUri,\n        isPending,\n        isUploaded,\n        markPending,\n        markUploaded,\n        removeFailed,\n        destroy\n      };\n    };\n\n    let count = 0;\n    const seed = () => {\n      const rnd = () => {\n        return Math.round(Math.random() * 4294967295).toString(36);\n      };\n      const now = new Date().getTime();\n      return 's' + now.toString(36) + rnd() + rnd() + rnd();\n    };\n    const uuid = prefix => {\n      return prefix + count++ + seed();\n    };\n\n    const BlobCache = () => {\n      let cache = [];\n      const mimeToExt = mime => {\n        const mimes = {\n          'image/jpeg': 'jpg',\n          'image/jpg': 'jpg',\n          'image/gif': 'gif',\n          'image/png': 'png',\n          'image/apng': 'apng',\n          'image/avif': 'avif',\n          'image/svg+xml': 'svg',\n          'image/webp': 'webp',\n          'image/bmp': 'bmp',\n          'image/tiff': 'tiff'\n        };\n        return mimes[mime.toLowerCase()] || 'dat';\n      };\n      const create = (o, blob, base64, name, filename) => {\n        if (isString(o)) {\n          const id = o;\n          return toBlobInfo({\n            id,\n            name,\n            filename,\n            blob: blob,\n            base64: base64\n          });\n        } else if (isObject(o)) {\n          return toBlobInfo(o);\n        } else {\n          throw new Error('Unknown input type');\n        }\n      };\n      const toBlobInfo = o => {\n        if (!o.blob || !o.base64) {\n          throw new Error('blob and base64 representations of the image are required for BlobInfo to be created');\n        }\n        const id = o.id || uuid('blobid');\n        const name = o.name || id;\n        const blob = o.blob;\n        return {\n          id: constant(id),\n          name: constant(name),\n          filename: constant(o.filename || name + '.' + mimeToExt(blob.type)),\n          blob: constant(blob),\n          base64: constant(o.base64),\n          blobUri: constant(o.blobUri || URL.createObjectURL(blob)),\n          uri: constant(o.uri)\n        };\n      };\n      const add = blobInfo => {\n        if (!get(blobInfo.id())) {\n          cache.push(blobInfo);\n        }\n      };\n      const findFirst = predicate => find$2(cache, predicate).getOrUndefined();\n      const get = id => findFirst(cachedBlobInfo => cachedBlobInfo.id() === id);\n      const getByUri = blobUri => findFirst(blobInfo => blobInfo.blobUri() === blobUri);\n      const getByData = (base64, type) => findFirst(blobInfo => blobInfo.base64() === base64 && blobInfo.blob().type === type);\n      const removeByUri = blobUri => {\n        cache = filter$5(cache, blobInfo => {\n          if (blobInfo.blobUri() === blobUri) {\n            URL.revokeObjectURL(blobInfo.blobUri());\n            return false;\n          }\n          return true;\n        });\n      };\n      const destroy = () => {\n        each$e(cache, cachedBlobInfo => {\n          URL.revokeObjectURL(cachedBlobInfo.blobUri());\n        });\n        cache = [];\n      };\n      return {\n        create,\n        add,\n        get,\n        getByUri,\n        getByData,\n        findFirst,\n        removeByUri,\n        destroy\n      };\n    };\n\n    const Uploader = (uploadStatus, settings) => {\n      const pendingPromises = {};\n      const pathJoin = (path1, path2) => {\n        if (path1) {\n          return path1.replace(/\\/$/, '') + '/' + path2.replace(/^\\//, '');\n        }\n        return path2;\n      };\n      const defaultHandler = (blobInfo, progress) => new Promise((success, failure) => {\n        const xhr = new XMLHttpRequest();\n        xhr.open('POST', settings.url);\n        xhr.withCredentials = settings.credentials;\n        xhr.upload.onprogress = e => {\n          progress(e.loaded / e.total * 100);\n        };\n        xhr.onerror = () => {\n          failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status);\n        };\n        xhr.onload = () => {\n          if (xhr.status < 200 || xhr.status >= 300) {\n            failure('HTTP Error: ' + xhr.status);\n            return;\n          }\n          const json = JSON.parse(xhr.responseText);\n          if (!json || !isString(json.location)) {\n            failure('Invalid JSON: ' + xhr.responseText);\n            return;\n          }\n          success(pathJoin(settings.basePath, json.location));\n        };\n        const formData = new FormData();\n        formData.append('file', blobInfo.blob(), blobInfo.filename());\n        xhr.send(formData);\n      });\n      const uploadHandler = isFunction(settings.handler) ? settings.handler : defaultHandler;\n      const noUpload = () => new Promise(resolve => {\n        resolve([]);\n      });\n      const handlerSuccess = (blobInfo, url) => ({\n        url,\n        blobInfo,\n        status: true\n      });\n      const handlerFailure = (blobInfo, error) => ({\n        url: '',\n        blobInfo,\n        status: false,\n        error\n      });\n      const resolvePending = (blobUri, result) => {\n        Tools.each(pendingPromises[blobUri], resolve => {\n          resolve(result);\n        });\n        delete pendingPromises[blobUri];\n      };\n      const uploadBlobInfo = (blobInfo, handler, openNotification) => {\n        uploadStatus.markPending(blobInfo.blobUri());\n        return new Promise(resolve => {\n          let notification;\n          let progress;\n          try {\n            const closeNotification = () => {\n              if (notification) {\n                notification.close();\n                progress = noop;\n              }\n            };\n            const success = url => {\n              closeNotification();\n              uploadStatus.markUploaded(blobInfo.blobUri(), url);\n              resolvePending(blobInfo.blobUri(), handlerSuccess(blobInfo, url));\n              resolve(handlerSuccess(blobInfo, url));\n            };\n            const failure = error => {\n              closeNotification();\n              uploadStatus.removeFailed(blobInfo.blobUri());\n              resolvePending(blobInfo.blobUri(), handlerFailure(blobInfo, error));\n              resolve(handlerFailure(blobInfo, error));\n            };\n            progress = percent => {\n              if (percent < 0 || percent > 100) {\n                return;\n              }\n              Optional.from(notification).orThunk(() => Optional.from(openNotification).map(apply$1)).each(n => {\n                notification = n;\n                n.progressBar.value(percent);\n              });\n            };\n            handler(blobInfo, progress).then(success, err => {\n              failure(isString(err) ? { message: err } : err);\n            });\n          } catch (ex) {\n            resolve(handlerFailure(blobInfo, ex));\n          }\n        });\n      };\n      const isDefaultHandler = handler => handler === defaultHandler;\n      const pendingUploadBlobInfo = blobInfo => {\n        const blobUri = blobInfo.blobUri();\n        return new Promise(resolve => {\n          pendingPromises[blobUri] = pendingPromises[blobUri] || [];\n          pendingPromises[blobUri].push(resolve);\n        });\n      };\n      const uploadBlobs = (blobInfos, openNotification) => {\n        blobInfos = Tools.grep(blobInfos, blobInfo => !uploadStatus.isUploaded(blobInfo.blobUri()));\n        return Promise.all(Tools.map(blobInfos, blobInfo => uploadStatus.isPending(blobInfo.blobUri()) ? pendingUploadBlobInfo(blobInfo) : uploadBlobInfo(blobInfo, uploadHandler, openNotification)));\n      };\n      const upload = (blobInfos, openNotification) => !settings.url && isDefaultHandler(uploadHandler) ? noUpload() : uploadBlobs(blobInfos, openNotification);\n      return { upload };\n    };\n\n    const openNotification = editor => () => editor.notificationManager.open({\n      text: editor.translate('Image uploading...'),\n      type: 'info',\n      timeout: -1,\n      progressBar: true\n    });\n    const createUploader = (editor, uploadStatus) => Uploader(uploadStatus, {\n      url: getImageUploadUrl(editor),\n      basePath: getImageUploadBasePath(editor),\n      credentials: getImagesUploadCredentials(editor),\n      handler: getImagesUploadHandler(editor)\n    });\n    const ImageUploader = editor => {\n      const uploadStatus = UploadStatus();\n      const uploader = createUploader(editor, uploadStatus);\n      return { upload: (blobInfos, showNotification = true) => uploader.upload(blobInfos, showNotification ? openNotification(editor) : undefined) };\n    };\n\n    const isEmptyForPadding = (editor, element) => editor.dom.isEmpty(element.dom) && isNonNullable(editor.schema.getTextBlockElements()[name(element)]);\n    const addPaddingToEmpty = editor => element => {\n      if (isEmptyForPadding(editor, element)) {\n        append$1(element, SugarElement.fromHtml('<br data-mce-bogus=\"1\" />'));\n      }\n    };\n    const EditorUpload = editor => {\n      const blobCache = BlobCache();\n      let uploader, imageScanner;\n      const uploadStatus = UploadStatus();\n      const urlFilters = [];\n      const aliveGuard = callback => {\n        return result => {\n          if (editor.selection) {\n            return callback(result);\n          }\n          return [];\n        };\n      };\n      const cacheInvalidator = url => url + (url.indexOf('?') === -1 ? '?' : '&') + new Date().getTime();\n      const replaceString = (content, search, replace) => {\n        let index = 0;\n        do {\n          index = content.indexOf(search, index);\n          if (index !== -1) {\n            content = content.substring(0, index) + replace + content.substr(index + search.length);\n            index += replace.length - search.length + 1;\n          }\n        } while (index !== -1);\n        return content;\n      };\n      const replaceImageUrl = (content, targetUrl, replacementUrl) => {\n        const replacementString = `src=\"${ replacementUrl }\"${ replacementUrl === Env.transparentSrc ? ' data-mce-placeholder=\"1\"' : '' }`;\n        content = replaceString(content, `src=\"${ targetUrl }\"`, replacementString);\n        content = replaceString(content, 'data-mce-src=\"' + targetUrl + '\"', 'data-mce-src=\"' + replacementUrl + '\"');\n        return content;\n      };\n      const replaceUrlInUndoStack = (targetUrl, replacementUrl) => {\n        each$e(editor.undoManager.data, level => {\n          if (level.type === 'fragmented') {\n            level.fragments = map$3(level.fragments, fragment => replaceImageUrl(fragment, targetUrl, replacementUrl));\n          } else {\n            level.content = replaceImageUrl(level.content, targetUrl, replacementUrl);\n          }\n        });\n      };\n      const replaceImageUriInView = (image, resultUri) => {\n        const src = editor.convertURL(resultUri, 'src');\n        replaceUrlInUndoStack(image.src, resultUri);\n        setAll$1(SugarElement.fromDom(image), {\n          'src': shouldReuseFileName(editor) ? cacheInvalidator(resultUri) : resultUri,\n          'data-mce-src': src\n        });\n      };\n      const uploadImages = () => {\n        if (!uploader) {\n          uploader = createUploader(editor, uploadStatus);\n        }\n        return scanForImages().then(aliveGuard(imageInfos => {\n          const blobInfos = map$3(imageInfos, imageInfo => imageInfo.blobInfo);\n          return uploader.upload(blobInfos, openNotification(editor)).then(aliveGuard(result => {\n            const imagesToRemove = [];\n            let shouldDispatchChange = false;\n            const filteredResult = map$3(result, (uploadInfo, index) => {\n              const {blobInfo, image} = imageInfos[index];\n              let removed = false;\n              if (uploadInfo.status && shouldReplaceBlobUris(editor)) {\n                if (uploadInfo.url && !contains$1(image.src, uploadInfo.url)) {\n                  shouldDispatchChange = true;\n                }\n                blobCache.removeByUri(image.src);\n                if (isRtc(editor)) ; else {\n                  replaceImageUriInView(image, uploadInfo.url);\n                }\n              } else if (uploadInfo.error) {\n                if (uploadInfo.error.remove) {\n                  replaceUrlInUndoStack(image.src, Env.transparentSrc);\n                  imagesToRemove.push(image);\n                  removed = true;\n                }\n                uploadError(editor, uploadInfo.error.message);\n              }\n              return {\n                element: image,\n                status: uploadInfo.status,\n                uploadUri: uploadInfo.url,\n                blobInfo,\n                removed\n              };\n            });\n            if (imagesToRemove.length > 0 && !isRtc(editor)) {\n              editor.undoManager.transact(() => {\n                each$e(fromDom$1(imagesToRemove), sugarElement => {\n                  const parentOpt = parent(sugarElement);\n                  remove$4(sugarElement);\n                  parentOpt.each(addPaddingToEmpty(editor));\n                  blobCache.removeByUri(sugarElement.dom.src);\n                });\n              });\n            } else if (shouldDispatchChange) {\n              editor.undoManager.dispatchChange();\n            }\n            return filteredResult;\n          }));\n        }));\n      };\n      const uploadImagesAuto = () => isAutomaticUploadsEnabled(editor) ? uploadImages() : Promise.resolve([]);\n      const isValidDataUriImage = imgElm => forall(urlFilters, filter => filter(imgElm));\n      const addFilter = filter => {\n        urlFilters.push(filter);\n      };\n      const scanForImages = () => {\n        if (!imageScanner) {\n          imageScanner = ImageScanner(uploadStatus, blobCache);\n        }\n        return imageScanner.findAll(editor.getBody(), isValidDataUriImage).then(aliveGuard(result => {\n          const filteredResult = filter$5(result, resultItem => {\n            if (isString(resultItem)) {\n              displayError(editor, resultItem);\n              return false;\n            } else if (resultItem.uriType === 'blob') {\n              return false;\n            } else {\n              return true;\n            }\n          });\n          if (isRtc(editor)) ; else {\n            each$e(filteredResult, resultItem => {\n              replaceUrlInUndoStack(resultItem.image.src, resultItem.blobInfo.blobUri());\n              resultItem.image.src = resultItem.blobInfo.blobUri();\n              resultItem.image.removeAttribute('data-mce-src');\n            });\n          }\n          return filteredResult;\n        }));\n      };\n      const destroy = () => {\n        blobCache.destroy();\n        uploadStatus.destroy();\n        imageScanner = uploader = null;\n      };\n      const replaceBlobUris = content => {\n        return content.replace(/src=\"(blob:[^\"]+)\"/g, (match, blobUri) => {\n          const resultUri = uploadStatus.getResultUri(blobUri);\n          if (resultUri) {\n            return 'src=\"' + resultUri + '\"';\n          }\n          let blobInfo = blobCache.getByUri(blobUri);\n          if (!blobInfo) {\n            blobInfo = foldl(editor.editorManager.get(), (result, editor) => {\n              return result || editor.editorUpload && editor.editorUpload.blobCache.getByUri(blobUri);\n            }, undefined);\n          }\n          if (blobInfo) {\n            const blob = blobInfo.blob();\n            return 'src=\"data:' + blob.type + ';base64,' + blobInfo.base64() + '\"';\n          }\n          return match;\n        });\n      };\n      editor.on('SetContent', () => {\n        if (isAutomaticUploadsEnabled(editor)) {\n          uploadImagesAuto();\n        } else {\n          scanForImages();\n        }\n      });\n      editor.on('RawSaveContent', e => {\n        e.content = replaceBlobUris(e.content);\n      });\n      editor.on('GetContent', e => {\n        if (e.source_view || e.format === 'raw' || e.format === 'tree') {\n          return;\n        }\n        e.content = replaceBlobUris(e.content);\n      });\n      editor.on('PostRender', () => {\n        editor.parser.addNodeFilter('img', images => {\n          each$e(images, img => {\n            const src = img.attr('src');\n            if (!src || blobCache.getByUri(src)) {\n              return;\n            }\n            const resultUri = uploadStatus.getResultUri(src);\n            if (resultUri) {\n              img.attr('src', resultUri);\n            }\n          });\n        });\n      });\n      return {\n        blobCache,\n        addFilter,\n        uploadImages,\n        uploadImagesAuto,\n        scanForImages,\n        destroy\n      };\n    };\n\n    const get$1 = editor => {\n      const dom = editor.dom;\n      const schemaType = editor.schema.type;\n      const formats = {\n        valigntop: [{\n            selector: 'td,th',\n            styles: { verticalAlign: 'top' }\n          }],\n        valignmiddle: [{\n            selector: 'td,th',\n            styles: { verticalAlign: 'middle' }\n          }],\n        valignbottom: [{\n            selector: 'td,th',\n            styles: { verticalAlign: 'bottom' }\n          }],\n        alignleft: [\n          {\n            selector: 'figure.image',\n            collapsed: false,\n            classes: 'align-left',\n            ceFalseOverride: true,\n            preview: 'font-family font-size'\n          },\n          {\n            selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li,pre',\n            styles: { textAlign: 'left' },\n            inherit: false,\n            preview: false\n          },\n          {\n            selector: 'img,audio,video',\n            collapsed: false,\n            styles: { float: 'left' },\n            preview: 'font-family font-size'\n          },\n          {\n            selector: 'table',\n            collapsed: false,\n            styles: {\n              marginLeft: '0px',\n              marginRight: 'auto'\n            },\n            onformat: table => {\n              dom.setStyle(table, 'float', null);\n            },\n            preview: 'font-family font-size'\n          },\n          {\n            selector: '.mce-preview-object,[data-ephox-embed-iri]',\n            ceFalseOverride: true,\n            styles: { float: 'left' }\n          }\n        ],\n        aligncenter: [\n          {\n            selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li,pre',\n            styles: { textAlign: 'center' },\n            inherit: false,\n            preview: 'font-family font-size'\n          },\n          {\n            selector: 'figure.image',\n            collapsed: false,\n            classes: 'align-center',\n            ceFalseOverride: true,\n            preview: 'font-family font-size'\n          },\n          {\n            selector: 'img,audio,video',\n            collapsed: false,\n            styles: {\n              display: 'block',\n              marginLeft: 'auto',\n              marginRight: 'auto'\n            },\n            preview: false\n          },\n          {\n            selector: 'table',\n            collapsed: false,\n            styles: {\n              marginLeft: 'auto',\n              marginRight: 'auto'\n            },\n            preview: 'font-family font-size'\n          },\n          {\n            selector: '.mce-preview-object',\n            ceFalseOverride: true,\n            styles: {\n              display: 'table',\n              marginLeft: 'auto',\n              marginRight: 'auto'\n            },\n            preview: false\n          },\n          {\n            selector: '[data-ephox-embed-iri]',\n            ceFalseOverride: true,\n            styles: {\n              marginLeft: 'auto',\n              marginRight: 'auto'\n            },\n            preview: false\n          }\n        ],\n        alignright: [\n          {\n            selector: 'figure.image',\n            collapsed: false,\n            classes: 'align-right',\n            ceFalseOverride: true,\n            preview: 'font-family font-size'\n          },\n          {\n            selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li,pre',\n            styles: { textAlign: 'right' },\n            inherit: false,\n            preview: 'font-family font-size'\n          },\n          {\n            selector: 'img,audio,video',\n            collapsed: false,\n            styles: { float: 'right' },\n            preview: 'font-family font-size'\n          },\n          {\n            selector: 'table',\n            collapsed: false,\n            styles: {\n              marginRight: '0px',\n              marginLeft: 'auto'\n            },\n            onformat: table => {\n              dom.setStyle(table, 'float', null);\n            },\n            preview: 'font-family font-size'\n          },\n          {\n            selector: '.mce-preview-object,[data-ephox-embed-iri]',\n            ceFalseOverride: true,\n            styles: { float: 'right' },\n            preview: false\n          }\n        ],\n        alignjustify: [{\n            selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li,pre',\n            styles: { textAlign: 'justify' },\n            inherit: false,\n            preview: 'font-family font-size'\n          }],\n        bold: [\n          {\n            inline: 'strong',\n            remove: 'all',\n            preserve_attributes: [\n              'class',\n              'style'\n            ]\n          },\n          {\n            inline: 'span',\n            styles: { fontWeight: 'bold' }\n          },\n          {\n            inline: 'b',\n            remove: 'all',\n            preserve_attributes: [\n              'class',\n              'style'\n            ]\n          }\n        ],\n        italic: [\n          {\n            inline: 'em',\n            remove: 'all',\n            preserve_attributes: [\n              'class',\n              'style'\n            ]\n          },\n          {\n            inline: 'span',\n            styles: { fontStyle: 'italic' }\n          },\n          {\n            inline: 'i',\n            remove: 'all',\n            preserve_attributes: [\n              'class',\n              'style'\n            ]\n          }\n        ],\n        underline: [\n          {\n            inline: 'span',\n            styles: { textDecoration: 'underline' },\n            exact: true\n          },\n          {\n            inline: 'u',\n            remove: 'all',\n            preserve_attributes: [\n              'class',\n              'style'\n            ]\n          }\n        ],\n        strikethrough: (() => {\n          const span = {\n            inline: 'span',\n            styles: { textDecoration: 'line-through' },\n            exact: true\n          };\n          const strike = {\n            inline: 'strike',\n            remove: 'all',\n            preserve_attributes: [\n              'class',\n              'style'\n            ]\n          };\n          const s = {\n            inline: 's',\n            remove: 'all',\n            preserve_attributes: [\n              'class',\n              'style'\n            ]\n          };\n          return schemaType !== 'html4' ? [\n            s,\n            span,\n            strike\n          ] : [\n            span,\n            s,\n            strike\n          ];\n        })(),\n        forecolor: {\n          inline: 'span',\n          styles: { color: '%value' },\n          links: true,\n          remove_similar: true,\n          clear_child_styles: true\n        },\n        hilitecolor: {\n          inline: 'span',\n          styles: { backgroundColor: '%value' },\n          links: true,\n          remove_similar: true,\n          clear_child_styles: true\n        },\n        fontname: {\n          inline: 'span',\n          toggle: false,\n          styles: { fontFamily: '%value' },\n          clear_child_styles: true\n        },\n        fontsize: {\n          inline: 'span',\n          toggle: false,\n          styles: { fontSize: '%value' },\n          clear_child_styles: true\n        },\n        lineheight: {\n          selector: 'h1,h2,h3,h4,h5,h6,p,li,td,th,div',\n          styles: { lineHeight: '%value' }\n        },\n        fontsize_class: {\n          inline: 'span',\n          attributes: { class: '%value' }\n        },\n        blockquote: {\n          block: 'blockquote',\n          wrapper: true,\n          remove: 'all'\n        },\n        subscript: { inline: 'sub' },\n        superscript: { inline: 'sup' },\n        code: { inline: 'code' },\n        link: {\n          inline: 'a',\n          selector: 'a',\n          remove: 'all',\n          split: true,\n          deep: true,\n          onmatch: (node, _fmt, _itemName) => {\n            return isElement$6(node) && node.hasAttribute('href');\n          },\n          onformat: (elm, _fmt, vars) => {\n            Tools.each(vars, (value, key) => {\n              dom.setAttrib(elm, key, value);\n            });\n          }\n        },\n        lang: {\n          inline: 'span',\n          clear_child_styles: true,\n          remove_similar: true,\n          attributes: {\n            'lang': '%value',\n            'data-mce-lang': vars => {\n              var _a;\n              return (_a = vars === null || vars === void 0 ? void 0 : vars.customValue) !== null && _a !== void 0 ? _a : null;\n            }\n          }\n        },\n        removeformat: [\n          {\n            selector: 'b,strong,em,i,font,u,strike,s,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins,small',\n            remove: 'all',\n            split: true,\n            expand: false,\n            block_expand: true,\n            deep: true\n          },\n          {\n            selector: 'span',\n            attributes: [\n              'style',\n              'class'\n            ],\n            remove: 'empty',\n            split: true,\n            expand: false,\n            deep: true\n          },\n          {\n            selector: '*',\n            attributes: [\n              'style',\n              'class'\n            ],\n            split: false,\n            expand: false,\n            deep: true\n          }\n        ]\n      };\n      Tools.each('p h1 h2 h3 h4 h5 h6 div address pre dt dd samp'.split(/\\s/), name => {\n        formats[name] = {\n          block: name,\n          remove: 'all'\n        };\n      });\n      return formats;\n    };\n\n    const genericBase = {\n      remove_similar: true,\n      inherit: false\n    };\n    const cellBase = {\n      selector: 'td,th',\n      ...genericBase\n    };\n    const cellFormats = {\n      tablecellbackgroundcolor: {\n        styles: { backgroundColor: '%value' },\n        ...cellBase\n      },\n      tablecellverticalalign: {\n        styles: { 'vertical-align': '%value' },\n        ...cellBase\n      },\n      tablecellbordercolor: {\n        styles: { borderColor: '%value' },\n        ...cellBase\n      },\n      tablecellclass: {\n        classes: ['%value'],\n        ...cellBase\n      },\n      tableclass: {\n        selector: 'table',\n        classes: ['%value'],\n        ...genericBase\n      },\n      tablecellborderstyle: {\n        styles: { borderStyle: '%value' },\n        ...cellBase\n      },\n      tablecellborderwidth: {\n        styles: { borderWidth: '%value' },\n        ...cellBase\n      }\n    };\n    const get = constant(cellFormats);\n\n    const FormatRegistry = editor => {\n      const formats = {};\n      const get$2 = name => isNonNullable(name) ? formats[name] : formats;\n      const has = name => has$2(formats, name);\n      const register = (name, format) => {\n        if (name) {\n          if (!isString(name)) {\n            each$d(name, (format, name) => {\n              register(name, format);\n            });\n          } else {\n            if (!isArray$1(format)) {\n              format = [format];\n            }\n            each$e(format, format => {\n              if (isUndefined(format.deep)) {\n                format.deep = !isSelectorFormat(format);\n              }\n              if (isUndefined(format.split)) {\n                format.split = !isSelectorFormat(format) || isInlineFormat(format);\n              }\n              if (isUndefined(format.remove) && isSelectorFormat(format) && !isInlineFormat(format)) {\n                format.remove = 'none';\n              }\n              if (isSelectorFormat(format) && isInlineFormat(format)) {\n                format.mixed = true;\n                format.block_expand = true;\n              }\n              if (isString(format.classes)) {\n                format.classes = format.classes.split(/\\s+/);\n              }\n            });\n            formats[name] = format;\n          }\n        }\n      };\n      const unregister = name => {\n        if (name && formats[name]) {\n          delete formats[name];\n        }\n        return formats;\n      };\n      register(get$1(editor));\n      register(get());\n      register(getFormats(editor));\n      return {\n        get: get$2,\n        has,\n        register,\n        unregister\n      };\n    };\n\n    const each$3 = Tools.each;\n    const dom = DOMUtils.DOM;\n    const isPreviewItem = item => isNonNullable(item) && isObject(item);\n    const parsedSelectorToHtml = (ancestry, editor) => {\n      const schema = editor && editor.schema || Schema({});\n      const decorate = (elm, item) => {\n        if (item.classes.length > 0) {\n          dom.addClass(elm, item.classes.join(' '));\n        }\n        dom.setAttribs(elm, item.attrs);\n      };\n      const createElement = sItem => {\n        const item = isString(sItem) ? {\n          name: sItem,\n          classes: [],\n          attrs: {}\n        } : sItem;\n        const elm = dom.create(item.name);\n        decorate(elm, item);\n        return elm;\n      };\n      const getRequiredParent = (elm, candidate) => {\n        const elmRule = schema.getElementRule(elm.nodeName.toLowerCase());\n        const parentsRequired = elmRule === null || elmRule === void 0 ? void 0 : elmRule.parentsRequired;\n        if (parentsRequired && parentsRequired.length) {\n          return candidate && contains$2(parentsRequired, candidate) ? candidate : parentsRequired[0];\n        } else {\n          return false;\n        }\n      };\n      const wrapInHtml = (elm, ancestors, siblings) => {\n        let parentCandidate;\n        const ancestor = ancestors[0];\n        const ancestorName = isPreviewItem(ancestor) ? ancestor.name : undefined;\n        const parentRequired = getRequiredParent(elm, ancestorName);\n        if (parentRequired) {\n          if (ancestorName === parentRequired) {\n            parentCandidate = ancestor;\n            ancestors = ancestors.slice(1);\n          } else {\n            parentCandidate = parentRequired;\n          }\n        } else if (ancestor) {\n          parentCandidate = ancestor;\n          ancestors = ancestors.slice(1);\n        } else if (!siblings) {\n          return elm;\n        }\n        const parent = parentCandidate ? createElement(parentCandidate) : dom.create('div');\n        parent.appendChild(elm);\n        if (siblings) {\n          Tools.each(siblings, sibling => {\n            const siblingElm = createElement(sibling);\n            parent.insertBefore(siblingElm, elm);\n          });\n        }\n        const parentSiblings = isPreviewItem(parentCandidate) ? parentCandidate.siblings : undefined;\n        return wrapInHtml(parent, ancestors, parentSiblings);\n      };\n      const fragment = dom.create('div');\n      if (ancestry.length > 0) {\n        const item = ancestry[0];\n        const elm = createElement(item);\n        const siblings = isPreviewItem(item) ? item.siblings : undefined;\n        fragment.appendChild(wrapInHtml(elm, ancestry.slice(1), siblings));\n      }\n      return fragment;\n    };\n    const parseSelectorItem = item => {\n      item = Tools.trim(item);\n      let tagName = 'div';\n      const obj = {\n        name: tagName,\n        classes: [],\n        attrs: {},\n        selector: item\n      };\n      if (item !== '*') {\n        tagName = item.replace(/(?:([#\\.]|::?)([\\w\\-]+)|(\\[)([^\\]]+)\\]?)/g, ($0, $1, $2, $3, $4) => {\n          switch ($1) {\n          case '#':\n            obj.attrs.id = $2;\n            break;\n          case '.':\n            obj.classes.push($2);\n            break;\n          case ':':\n            if (Tools.inArray('checked disabled enabled read-only required'.split(' '), $2) !== -1) {\n              obj.attrs[$2] = $2;\n            }\n            break;\n          }\n          if ($3 === '[') {\n            const m = $4.match(/([\\w\\-]+)(?:\\=\\\"([^\\\"]+))?/);\n            if (m) {\n              obj.attrs[m[1]] = m[2];\n            }\n          }\n          return '';\n        });\n      }\n      obj.name = tagName || 'div';\n      return obj;\n    };\n    const parseSelector = selector => {\n      if (!isString(selector)) {\n        return [];\n      }\n      selector = selector.split(/\\s*,\\s*/)[0];\n      selector = selector.replace(/\\s*(~\\+|~|\\+|>)\\s*/g, '$1');\n      return Tools.map(selector.split(/(?:>|\\s+(?![^\\[\\]]+\\]))/), item => {\n        const siblings = Tools.map(item.split(/(?:~\\+|~|\\+)/), parseSelectorItem);\n        const obj = siblings.pop();\n        if (siblings.length) {\n          obj.siblings = siblings;\n        }\n        return obj;\n      }).reverse();\n    };\n    const getCssText = (editor, format) => {\n      let previewCss = '';\n      let previewStyles = getPreviewStyles(editor);\n      if (previewStyles === '') {\n        return '';\n      }\n      const removeVars = val => {\n        return isString(val) ? val.replace(/%(\\w+)/g, '') : '';\n      };\n      const getComputedStyle = (name, elm) => {\n        return dom.getStyle(elm !== null && elm !== void 0 ? elm : editor.getBody(), name, true);\n      };\n      if (isString(format)) {\n        const formats = editor.formatter.get(format);\n        if (!formats) {\n          return '';\n        }\n        format = formats[0];\n      }\n      if ('preview' in format) {\n        const preview = format.preview;\n        if (preview === false) {\n          return '';\n        } else {\n          previewStyles = preview || previewStyles;\n        }\n      }\n      let name = format.block || format.inline || 'span';\n      let previewFrag;\n      const items = parseSelector(format.selector);\n      if (items.length > 0) {\n        if (!items[0].name) {\n          items[0].name = name;\n        }\n        name = format.selector;\n        previewFrag = parsedSelectorToHtml(items, editor);\n      } else {\n        previewFrag = parsedSelectorToHtml([name], editor);\n      }\n      const previewElm = dom.select(name, previewFrag)[0] || previewFrag.firstChild;\n      each$3(format.styles, (value, name) => {\n        const newValue = removeVars(value);\n        if (newValue) {\n          dom.setStyle(previewElm, name, newValue);\n        }\n      });\n      each$3(format.attributes, (value, name) => {\n        const newValue = removeVars(value);\n        if (newValue) {\n          dom.setAttrib(previewElm, name, newValue);\n        }\n      });\n      each$3(format.classes, value => {\n        const newValue = removeVars(value);\n        if (!dom.hasClass(previewElm, newValue)) {\n          dom.addClass(previewElm, newValue);\n        }\n      });\n      editor.dispatch('PreviewFormats');\n      dom.setStyles(previewFrag, {\n        position: 'absolute',\n        left: -65535\n      });\n      editor.getBody().appendChild(previewFrag);\n      const rawParentFontSize = getComputedStyle('fontSize');\n      const parentFontSize = /px$/.test(rawParentFontSize) ? parseInt(rawParentFontSize, 10) : 0;\n      each$3(previewStyles.split(' '), name => {\n        let value = getComputedStyle(name, previewElm);\n        if (name === 'background-color' && /transparent|rgba\\s*\\([^)]+,\\s*0\\)/.test(value)) {\n          value = getComputedStyle(name);\n          if (rgbaToHexString(value).toLowerCase() === '#ffffff') {\n            return;\n          }\n        }\n        if (name === 'color') {\n          if (rgbaToHexString(value).toLowerCase() === '#000000') {\n            return;\n          }\n        }\n        if (name === 'font-size') {\n          if (/em|%$/.test(value)) {\n            if (parentFontSize === 0) {\n              return;\n            }\n            const numValue = parseFloat(value) / (/%$/.test(value) ? 100 : 1);\n            value = numValue * parentFontSize + 'px';\n          }\n        }\n        if (name === 'border' && value) {\n          previewCss += 'padding:0 2px;';\n        }\n        previewCss += name + ':' + value + ';';\n      });\n      editor.dispatch('AfterPreviewFormats');\n      dom.remove(previewFrag);\n      return previewCss;\n    };\n\n    const setup$s = editor => {\n      editor.addShortcut('meta+b', '', 'Bold');\n      editor.addShortcut('meta+i', '', 'Italic');\n      editor.addShortcut('meta+u', '', 'Underline');\n      for (let i = 1; i <= 6; i++) {\n        editor.addShortcut('access+' + i, '', [\n          'FormatBlock',\n          false,\n          'h' + i\n        ]);\n      }\n      editor.addShortcut('access+7', '', [\n        'FormatBlock',\n        false,\n        'p'\n      ]);\n      editor.addShortcut('access+8', '', [\n        'FormatBlock',\n        false,\n        'div'\n      ]);\n      editor.addShortcut('access+9', '', [\n        'FormatBlock',\n        false,\n        'address'\n      ]);\n    };\n\n    const Formatter = editor => {\n      const formats = FormatRegistry(editor);\n      const formatChangeState = Cell({});\n      setup$s(editor);\n      setup$v(editor);\n      if (!isRtc(editor)) {\n        setup$u(formatChangeState, editor);\n      }\n      return {\n        get: formats.get,\n        has: formats.has,\n        register: formats.register,\n        unregister: formats.unregister,\n        apply: (name, vars, node) => {\n          applyFormat(editor, name, vars, node);\n        },\n        remove: (name, vars, node, similar) => {\n          removeFormat(editor, name, vars, node, similar);\n        },\n        toggle: (name, vars, node) => {\n          toggleFormat(editor, name, vars, node);\n        },\n        match: (name, vars, node, similar) => matchFormat(editor, name, vars, node, similar),\n        closest: names => closestFormat(editor, names),\n        matchAll: (names, vars) => matchAllFormats(editor, names, vars),\n        matchNode: (node, name, vars, similar) => matchNodeFormat(editor, node, name, vars, similar),\n        canApply: name => canApplyFormat(editor, name),\n        formatChanged: (formats, callback, similar, vars) => formatChanged(editor, formatChangeState, formats, callback, similar, vars),\n        getCssText: curry(getCssText, editor)\n      };\n    };\n\n    const shouldIgnoreCommand = cmd => {\n      switch (cmd.toLowerCase()) {\n      case 'undo':\n      case 'redo':\n      case 'mcefocus':\n        return true;\n      default:\n        return false;\n      }\n    };\n    const registerEvents = (editor, undoManager, locks) => {\n      const isFirstTypedCharacter = Cell(false);\n      const addNonTypingUndoLevel = e => {\n        setTyping(undoManager, false, locks);\n        undoManager.add({}, e);\n      };\n      editor.on('init', () => {\n        undoManager.add();\n      });\n      editor.on('BeforeExecCommand', e => {\n        const cmd = e.command;\n        if (!shouldIgnoreCommand(cmd)) {\n          endTyping(undoManager, locks);\n          undoManager.beforeChange();\n        }\n      });\n      editor.on('ExecCommand', e => {\n        const cmd = e.command;\n        if (!shouldIgnoreCommand(cmd)) {\n          addNonTypingUndoLevel(e);\n        }\n      });\n      editor.on('ObjectResizeStart cut', () => {\n        undoManager.beforeChange();\n      });\n      editor.on('SaveContent ObjectResized blur', addNonTypingUndoLevel);\n      editor.on('dragend', addNonTypingUndoLevel);\n      editor.on('keyup', e => {\n        const keyCode = e.keyCode;\n        if (e.isDefaultPrevented()) {\n          return;\n        }\n        const isMeta = Env.os.isMacOS() && e.key === 'Meta';\n        if (keyCode >= 33 && keyCode <= 36 || keyCode >= 37 && keyCode <= 40 || keyCode === 45 || e.ctrlKey || isMeta) {\n          addNonTypingUndoLevel();\n          editor.nodeChanged();\n        }\n        if (keyCode === 46 || keyCode === 8) {\n          editor.nodeChanged();\n        }\n        if (isFirstTypedCharacter.get() && undoManager.typing && !isEq$1(createFromEditor(editor), undoManager.data[0])) {\n          if (!editor.isDirty()) {\n            editor.setDirty(true);\n          }\n          editor.dispatch('TypingUndo');\n          isFirstTypedCharacter.set(false);\n          editor.nodeChanged();\n        }\n      });\n      editor.on('keydown', e => {\n        const keyCode = e.keyCode;\n        if (e.isDefaultPrevented()) {\n          return;\n        }\n        if (keyCode >= 33 && keyCode <= 36 || keyCode >= 37 && keyCode <= 40 || keyCode === 45) {\n          if (undoManager.typing) {\n            addNonTypingUndoLevel(e);\n          }\n          return;\n        }\n        const modKey = e.ctrlKey && !e.altKey || e.metaKey;\n        if ((keyCode < 16 || keyCode > 20) && keyCode !== 224 && keyCode !== 91 && !undoManager.typing && !modKey) {\n          undoManager.beforeChange();\n          setTyping(undoManager, true, locks);\n          undoManager.add({}, e);\n          isFirstTypedCharacter.set(true);\n          return;\n        }\n        const hasOnlyMetaOrCtrlModifier = Env.os.isMacOS() ? e.metaKey : e.ctrlKey && !e.altKey;\n        if (hasOnlyMetaOrCtrlModifier) {\n          undoManager.beforeChange();\n        }\n      });\n      editor.on('mousedown', e => {\n        if (undoManager.typing) {\n          addNonTypingUndoLevel(e);\n        }\n      });\n      const isInsertReplacementText = event => event.inputType === 'insertReplacementText';\n      const isInsertTextDataNull = event => event.inputType === 'insertText' && event.data === null;\n      const isInsertFromPasteOrDrop = event => event.inputType === 'insertFromPaste' || event.inputType === 'insertFromDrop';\n      editor.on('input', e => {\n        if (e.inputType && (isInsertReplacementText(e) || isInsertTextDataNull(e) || isInsertFromPasteOrDrop(e))) {\n          addNonTypingUndoLevel(e);\n        }\n      });\n      editor.on('AddUndo Undo Redo ClearUndos', e => {\n        if (!e.isDefaultPrevented()) {\n          editor.nodeChanged();\n        }\n      });\n    };\n    const addKeyboardShortcuts = editor => {\n      editor.addShortcut('meta+z', '', 'Undo');\n      editor.addShortcut('meta+y,meta+shift+z', '', 'Redo');\n    };\n\n    const UndoManager = editor => {\n      const beforeBookmark = value$2();\n      const locks = Cell(0);\n      const index = Cell(0);\n      const undoManager = {\n        data: [],\n        typing: false,\n        beforeChange: () => {\n          beforeChange(editor, locks, beforeBookmark);\n        },\n        add: (level, event) => {\n          return addUndoLevel(editor, undoManager, index, locks, beforeBookmark, level, event);\n        },\n        dispatchChange: () => {\n          editor.setDirty(true);\n          const level = createFromEditor(editor);\n          level.bookmark = getUndoBookmark(editor.selection);\n          editor.dispatch('change', {\n            level,\n            lastLevel: get$b(undoManager.data, index.get()).getOrUndefined()\n          });\n        },\n        undo: () => {\n          return undo(editor, undoManager, locks, index);\n        },\n        redo: () => {\n          return redo(editor, index, undoManager.data);\n        },\n        clear: () => {\n          clear(editor, undoManager, index);\n        },\n        reset: () => {\n          reset(editor, undoManager);\n        },\n        hasUndo: () => {\n          return hasUndo(editor, undoManager, index);\n        },\n        hasRedo: () => {\n          return hasRedo(editor, undoManager, index);\n        },\n        transact: callback => {\n          return transact(editor, undoManager, locks, callback);\n        },\n        ignore: callback => {\n          ignore(editor, locks, callback);\n        },\n        extra: (callback1, callback2) => {\n          extra(editor, undoManager, index, callback1, callback2);\n        }\n      };\n      if (!isRtc(editor)) {\n        registerEvents(editor, undoManager, locks);\n      }\n      addKeyboardShortcuts(editor);\n      return undoManager;\n    };\n\n    const nonTypingKeycodes = [\n      9,\n      27,\n      VK.HOME,\n      VK.END,\n      19,\n      20,\n      44,\n      144,\n      145,\n      33,\n      34,\n      45,\n      16,\n      17,\n      18,\n      91,\n      92,\n      93,\n      VK.DOWN,\n      VK.UP,\n      VK.LEFT,\n      VK.RIGHT\n    ].concat(Env.browser.isFirefox() ? [224] : []);\n    const placeholderAttr = 'data-mce-placeholder';\n    const isKeyboardEvent = e => e.type === 'keydown' || e.type === 'keyup';\n    const isDeleteEvent = e => {\n      const keyCode = e.keyCode;\n      return keyCode === VK.BACKSPACE || keyCode === VK.DELETE;\n    };\n    const isNonTypingKeyboardEvent = e => {\n      if (isKeyboardEvent(e)) {\n        const keyCode = e.keyCode;\n        return !isDeleteEvent(e) && (VK.metaKeyPressed(e) || e.altKey || keyCode >= 112 && keyCode <= 123 || contains$2(nonTypingKeycodes, keyCode));\n      } else {\n        return false;\n      }\n    };\n    const isTypingKeyboardEvent = e => isKeyboardEvent(e) && !(isDeleteEvent(e) || e.type === 'keyup' && e.keyCode === 229);\n    const isVisuallyEmpty = (dom, rootElm, forcedRootBlock) => {\n      if (dom.isEmpty(rootElm, undefined, {\n          skipBogus: false,\n          includeZwsp: true\n        })) {\n        const firstElement = rootElm.firstElementChild;\n        if (!firstElement) {\n          return true;\n        } else if (dom.getStyle(rootElm.firstElementChild, 'padding-left') || dom.getStyle(rootElm.firstElementChild, 'padding-right')) {\n          return false;\n        } else {\n          return forcedRootBlock === firstElement.nodeName.toLowerCase();\n        }\n      } else {\n        return false;\n      }\n    };\n    const setup$r = editor => {\n      var _a;\n      const dom = editor.dom;\n      const rootBlock = getForcedRootBlock(editor);\n      const placeholder = (_a = getPlaceholder(editor)) !== null && _a !== void 0 ? _a : '';\n      const updatePlaceholder = (e, initial) => {\n        if (isNonTypingKeyboardEvent(e)) {\n          return;\n        }\n        const body = editor.getBody();\n        const showPlaceholder = isTypingKeyboardEvent(e) ? false : isVisuallyEmpty(dom, body, rootBlock);\n        const isPlaceholderShown = dom.getAttrib(body, placeholderAttr) !== '';\n        if (isPlaceholderShown !== showPlaceholder || initial) {\n          dom.setAttrib(body, placeholderAttr, showPlaceholder ? placeholder : null);\n          firePlaceholderToggle(editor, showPlaceholder);\n          editor.on(showPlaceholder ? 'keydown' : 'keyup', updatePlaceholder);\n          editor.off(showPlaceholder ? 'keyup' : 'keydown', updatePlaceholder);\n        }\n      };\n      if (isNotEmpty(placeholder)) {\n        editor.on('init', e => {\n          updatePlaceholder(e, true);\n          editor.on('change SetContent ExecCommand', updatePlaceholder);\n          editor.on('paste', e => Delay.setEditorTimeout(editor, () => updatePlaceholder(e)));\n        });\n      }\n    };\n\n    const blockPosition = (block, position) => ({\n      block,\n      position\n    });\n    const blockBoundary = (from, to) => ({\n      from,\n      to\n    });\n    const getBlockPosition = (rootNode, pos) => {\n      const rootElm = SugarElement.fromDom(rootNode);\n      const containerElm = SugarElement.fromDom(pos.container());\n      return getParentBlock$2(rootElm, containerElm).map(block => blockPosition(block, pos));\n    };\n    const isDifferentBlocks = blockBoundary => !eq(blockBoundary.from.block, blockBoundary.to.block);\n    const getClosestHost = (root, scope) => {\n      const isRoot = node => eq(node, root);\n      const isHost = node => isTableCell$2(node) || isContentEditableTrue$3(node.dom);\n      return closest$4(scope, isHost, isRoot).filter(isElement$7).getOr(root);\n    };\n    const hasSameHost = (rootNode, blockBoundary) => {\n      const root = SugarElement.fromDom(rootNode);\n      return eq(getClosestHost(root, blockBoundary.from.block), getClosestHost(root, blockBoundary.to.block));\n    };\n    const isEditable$1 = blockBoundary => isContentEditableFalse$b(blockBoundary.from.block.dom) === false && isContentEditableFalse$b(blockBoundary.to.block.dom) === false;\n    const hasValidBlocks = blockBoundary => {\n      const isValidBlock = block => isTextBlock$2(block) || hasBlockAttr(block.dom);\n      return isValidBlock(blockBoundary.from.block) && isValidBlock(blockBoundary.to.block);\n    };\n    const skipLastBr = (schema, rootNode, forward, blockPosition) => {\n      if (isBr$6(blockPosition.position.getNode()) && !isEmpty$2(schema, blockPosition.block)) {\n        return positionIn(false, blockPosition.block.dom).bind(lastPositionInBlock => {\n          if (lastPositionInBlock.isEqual(blockPosition.position)) {\n            return fromPosition(forward, rootNode, lastPositionInBlock).bind(to => getBlockPosition(rootNode, to));\n          } else {\n            return Optional.some(blockPosition);\n          }\n        }).getOr(blockPosition);\n      } else {\n        return blockPosition;\n      }\n    };\n    const readFromRange = (schema, rootNode, forward, rng) => {\n      const fromBlockPos = getBlockPosition(rootNode, CaretPosition.fromRangeStart(rng));\n      const toBlockPos = fromBlockPos.bind(blockPos => fromPosition(forward, rootNode, blockPos.position).bind(to => getBlockPosition(rootNode, to).map(blockPos => skipLastBr(schema, rootNode, forward, blockPos))));\n      return lift2(fromBlockPos, toBlockPos, blockBoundary).filter(blockBoundary => isDifferentBlocks(blockBoundary) && hasSameHost(rootNode, blockBoundary) && isEditable$1(blockBoundary) && hasValidBlocks(blockBoundary));\n    };\n    const read$1 = (schema, rootNode, forward, rng) => rng.collapsed ? readFromRange(schema, rootNode, forward, rng) : Optional.none();\n\n    const getChildrenUntilBlockBoundary = (block, schema) => {\n      const children = children$1(block);\n      return findIndex$2(children, el => schema.isBlock(name(el))).fold(constant(children), index => children.slice(0, index));\n    };\n    const extractChildren = (block, schema) => {\n      const children = getChildrenUntilBlockBoundary(block, schema);\n      each$e(children, remove$4);\n      return children;\n    };\n    const removeEmptyRoot = (schema, rootNode, block) => {\n      const parents = parentsAndSelf(block, rootNode);\n      return find$2(parents.reverse(), element => isEmpty$2(schema, element)).each(remove$4);\n    };\n    const isEmptyBefore = (schema, el) => filter$5(prevSiblings(el), el => !isEmpty$2(schema, el)).length === 0;\n    const nestedBlockMerge = (rootNode, fromBlock, toBlock, schema, insertionPoint) => {\n      if (isEmpty$2(schema, toBlock)) {\n        fillWithPaddingBr(toBlock);\n        return firstPositionIn(toBlock.dom);\n      }\n      if (isEmptyBefore(schema, insertionPoint) && isEmpty$2(schema, fromBlock)) {\n        before$3(insertionPoint, SugarElement.fromTag('br'));\n      }\n      const position = prevPosition(toBlock.dom, CaretPosition.before(insertionPoint.dom));\n      each$e(extractChildren(fromBlock, schema), child => {\n        before$3(insertionPoint, child);\n      });\n      removeEmptyRoot(schema, rootNode, fromBlock);\n      return position;\n    };\n    const isInline = (schema, node) => schema.isInline(name(node));\n    const sidelongBlockMerge = (rootNode, fromBlock, toBlock, schema) => {\n      if (isEmpty$2(schema, toBlock)) {\n        if (isEmpty$2(schema, fromBlock)) {\n          const getInlineToBlockDescendants = el => {\n            const helper = (node, elements) => firstChild(node).fold(() => elements, child => isInline(schema, child) ? helper(child, elements.concat(shallow$1(child))) : elements);\n            return helper(el, []);\n          };\n          const newFromBlockDescendants = foldr(getInlineToBlockDescendants(toBlock), (element, descendant) => {\n            wrap$2(element, descendant);\n            return descendant;\n          }, createPaddingBr());\n          empty(fromBlock);\n          append$1(fromBlock, newFromBlockDescendants);\n        }\n        remove$4(toBlock);\n        return firstPositionIn(fromBlock.dom);\n      }\n      const position = lastPositionIn(toBlock.dom);\n      each$e(extractChildren(fromBlock, schema), child => {\n        append$1(toBlock, child);\n      });\n      removeEmptyRoot(schema, rootNode, fromBlock);\n      return position;\n    };\n    const findInsertionPoint = (toBlock, block) => {\n      const parentsAndSelf$1 = parentsAndSelf(block, toBlock);\n      return Optional.from(parentsAndSelf$1[parentsAndSelf$1.length - 1]);\n    };\n    const getInsertionPoint = (fromBlock, toBlock) => contains(toBlock, fromBlock) ? findInsertionPoint(toBlock, fromBlock) : Optional.none();\n    const trimBr = (first, block) => {\n      positionIn(first, block.dom).bind(position => Optional.from(position.getNode())).map(SugarElement.fromDom).filter(isBr$5).each(remove$4);\n    };\n    const mergeBlockInto = (rootNode, fromBlock, toBlock, schema) => {\n      trimBr(true, fromBlock);\n      trimBr(false, toBlock);\n      return getInsertionPoint(fromBlock, toBlock).fold(curry(sidelongBlockMerge, rootNode, fromBlock, toBlock, schema), curry(nestedBlockMerge, rootNode, fromBlock, toBlock, schema));\n    };\n    const mergeBlocks = (rootNode, forward, block1, block2, schema) => forward ? mergeBlockInto(rootNode, block2, block1, schema) : mergeBlockInto(rootNode, block1, block2, schema);\n\n    const backspaceDelete$9 = (editor, forward) => {\n      const rootNode = SugarElement.fromDom(editor.getBody());\n      const position = read$1(editor.schema, rootNode.dom, forward, editor.selection.getRng()).map(blockBoundary => () => {\n        mergeBlocks(rootNode, forward, blockBoundary.from.block, blockBoundary.to.block, editor.schema).each(pos => {\n          editor.selection.setRng(pos.toRange());\n        });\n      });\n      return position;\n    };\n\n    const deleteRangeMergeBlocks = (rootNode, selection, schema) => {\n      const rng = selection.getRng();\n      return lift2(getParentBlock$2(rootNode, SugarElement.fromDom(rng.startContainer)), getParentBlock$2(rootNode, SugarElement.fromDom(rng.endContainer)), (block1, block2) => {\n        if (!eq(block1, block2)) {\n          return Optional.some(() => {\n            rng.deleteContents();\n            mergeBlocks(rootNode, true, block1, block2, schema).each(pos => {\n              selection.setRng(pos.toRange());\n            });\n          });\n        } else {\n          return Optional.none();\n        }\n      }).getOr(Optional.none());\n    };\n    const isRawNodeInTable = (root, rawNode) => {\n      const node = SugarElement.fromDom(rawNode);\n      const isRoot = curry(eq, root);\n      return ancestor$4(node, isTableCell$2, isRoot).isSome();\n    };\n    const isSelectionInTable = (root, rng) => isRawNodeInTable(root, rng.startContainer) || isRawNodeInTable(root, rng.endContainer);\n    const isEverythingSelected = (root, rng) => {\n      const noPrevious = prevPosition(root.dom, CaretPosition.fromRangeStart(rng)).isNone();\n      const noNext = nextPosition(root.dom, CaretPosition.fromRangeEnd(rng)).isNone();\n      return !isSelectionInTable(root, rng) && noPrevious && noNext;\n    };\n    const emptyEditor = editor => {\n      return Optional.some(() => {\n        editor.setContent('');\n        editor.selection.setCursorLocation();\n      });\n    };\n    const deleteRange$2 = editor => {\n      const rootNode = SugarElement.fromDom(editor.getBody());\n      const rng = editor.selection.getRng();\n      return isEverythingSelected(rootNode, rng) ? emptyEditor(editor) : deleteRangeMergeBlocks(rootNode, editor.selection, editor.schema);\n    };\n    const backspaceDelete$8 = (editor, _forward) => editor.selection.isCollapsed() ? Optional.none() : deleteRange$2(editor);\n\n    const showCaret = (direction, editor, node, before, scrollIntoView) => Optional.from(editor._selectionOverrides.showCaret(direction, node, before, scrollIntoView));\n    const getNodeRange = node => {\n      const rng = node.ownerDocument.createRange();\n      rng.selectNode(node);\n      return rng;\n    };\n    const selectNode = (editor, node) => {\n      const e = editor.dispatch('BeforeObjectSelected', { target: node });\n      if (e.isDefaultPrevented()) {\n        return Optional.none();\n      }\n      return Optional.some(getNodeRange(node));\n    };\n    const renderCaretAtRange = (editor, range, scrollIntoView) => {\n      const normalizedRange = normalizeRange(1, editor.getBody(), range);\n      const caretPosition = CaretPosition.fromRangeStart(normalizedRange);\n      const caretPositionNode = caretPosition.getNode();\n      if (isInlineFakeCaretTarget(caretPositionNode)) {\n        return showCaret(1, editor, caretPositionNode, !caretPosition.isAtEnd(), false);\n      }\n      const caretPositionBeforeNode = caretPosition.getNode(true);\n      if (isInlineFakeCaretTarget(caretPositionBeforeNode)) {\n        return showCaret(1, editor, caretPositionBeforeNode, false, false);\n      }\n      const ceRoot = getContentEditableRoot$1(editor.dom.getRoot(), caretPosition.getNode());\n      if (isInlineFakeCaretTarget(ceRoot)) {\n        return showCaret(1, editor, ceRoot, false, scrollIntoView);\n      }\n      return Optional.none();\n    };\n    const renderRangeCaret = (editor, range, scrollIntoView) => range.collapsed ? renderCaretAtRange(editor, range, scrollIntoView).getOr(range) : range;\n\n    const isBeforeBoundary = pos => isBeforeContentEditableFalse(pos) || isBeforeMedia(pos);\n    const isAfterBoundary = pos => isAfterContentEditableFalse(pos) || isAfterMedia(pos);\n    const trimEmptyTextNode = (dom, node) => {\n      if (isText$b(node) && node.data.length === 0) {\n        dom.remove(node);\n      }\n    };\n    const deleteContentAndShowCaret = (editor, range, node, direction, forward, peekCaretPosition) => {\n      showCaret(direction, editor, peekCaretPosition.getNode(!forward), forward, true).each(caretRange => {\n        if (range.collapsed) {\n          const deleteRange = range.cloneRange();\n          if (forward) {\n            deleteRange.setEnd(caretRange.startContainer, caretRange.startOffset);\n          } else {\n            deleteRange.setStart(caretRange.endContainer, caretRange.endOffset);\n          }\n          deleteRange.deleteContents();\n        } else {\n          range.deleteContents();\n        }\n        editor.selection.setRng(caretRange);\n      });\n      trimEmptyTextNode(editor.dom, node);\n    };\n    const deleteBoundaryText = (editor, forward) => {\n      const range = editor.selection.getRng();\n      if (!isText$b(range.commonAncestorContainer)) {\n        return Optional.none();\n      }\n      const direction = forward ? HDirection.Forwards : HDirection.Backwards;\n      const caretWalker = CaretWalker(editor.getBody());\n      const getNextPosFn = curry(getVisualCaretPosition, forward ? caretWalker.next : caretWalker.prev);\n      const isBeforeFn = forward ? isBeforeBoundary : isAfterBoundary;\n      const caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);\n      const nextCaretPosition = getNextPosFn(caretPosition);\n      const normalizedNextCaretPosition = nextCaretPosition ? normalizePosition(forward, nextCaretPosition) : nextCaretPosition;\n      if (!normalizedNextCaretPosition || !isMoveInsideSameBlock(caretPosition, normalizedNextCaretPosition)) {\n        return Optional.none();\n      } else if (isBeforeFn(normalizedNextCaretPosition)) {\n        return Optional.some(() => deleteContentAndShowCaret(editor, range, caretPosition.getNode(), direction, forward, normalizedNextCaretPosition));\n      }\n      const peekCaretPosition = getNextPosFn(normalizedNextCaretPosition);\n      if (peekCaretPosition && isBeforeFn(peekCaretPosition)) {\n        if (isMoveInsideSameBlock(normalizedNextCaretPosition, peekCaretPosition)) {\n          return Optional.some(() => deleteContentAndShowCaret(editor, range, caretPosition.getNode(), direction, forward, peekCaretPosition));\n        }\n      }\n      return Optional.none();\n    };\n    const backspaceDelete$7 = (editor, forward) => deleteBoundaryText(editor, forward);\n\n    const getEdgeCefPosition = (editor, atStart) => {\n      const root = editor.getBody();\n      return atStart ? firstPositionIn(root).filter(isBeforeContentEditableFalse) : lastPositionIn(root).filter(isAfterContentEditableFalse);\n    };\n    const isCefAtEdgeSelected = editor => {\n      const rng = editor.selection.getRng();\n      return !rng.collapsed && (getEdgeCefPosition(editor, true).exists(pos => pos.isEqual(CaretPosition.fromRangeStart(rng))) || getEdgeCefPosition(editor, false).exists(pos => pos.isEqual(CaretPosition.fromRangeEnd(rng))));\n    };\n\n    const isCompoundElement = node => isNonNullable(node) && (isTableCell$2(SugarElement.fromDom(node)) || isListItem$1(SugarElement.fromDom(node)));\n    const DeleteAction = Adt.generate([\n      { remove: ['element'] },\n      { moveToElement: ['element'] },\n      { moveToPosition: ['position'] }\n    ]);\n    const isAtContentEditableBlockCaret = (forward, from) => {\n      const elm = from.getNode(!forward);\n      const caretLocation = forward ? 'after' : 'before';\n      return isElement$6(elm) && elm.getAttribute('data-mce-caret') === caretLocation;\n    };\n    const isDeleteFromCefDifferentBlocks = (root, forward, from, to, schema) => {\n      const inSameBlock = elm => schema.isInline(elm.nodeName.toLowerCase()) && !isInSameBlock(from, to, root);\n      return getRelativeCefElm(!forward, from).fold(() => getRelativeCefElm(forward, to).fold(never, inSameBlock), inSameBlock);\n    };\n    const deleteEmptyBlockOrMoveToCef = (schema, root, forward, from, to) => {\n      const toCefElm = to.getNode(!forward);\n      return getParentBlock$2(SugarElement.fromDom(root), SugarElement.fromDom(from.getNode())).map(blockElm => isEmpty$2(schema, blockElm) ? DeleteAction.remove(blockElm.dom) : DeleteAction.moveToElement(toCefElm)).orThunk(() => Optional.some(DeleteAction.moveToElement(toCefElm)));\n    };\n    const findCefPosition = (root, forward, from, schema) => fromPosition(forward, root, from).bind(to => {\n      if (isCompoundElement(to.getNode())) {\n        return Optional.none();\n      } else if (isDeleteFromCefDifferentBlocks(root, forward, from, to, schema)) {\n        return Optional.none();\n      } else if (forward && isContentEditableFalse$b(to.getNode())) {\n        return deleteEmptyBlockOrMoveToCef(schema, root, forward, from, to);\n      } else if (!forward && isContentEditableFalse$b(to.getNode(true))) {\n        return deleteEmptyBlockOrMoveToCef(schema, root, forward, from, to);\n      } else if (forward && isAfterContentEditableFalse(from)) {\n        return Optional.some(DeleteAction.moveToPosition(to));\n      } else if (!forward && isBeforeContentEditableFalse(from)) {\n        return Optional.some(DeleteAction.moveToPosition(to));\n      } else {\n        return Optional.none();\n      }\n    });\n    const getContentEditableBlockAction = (forward, elm) => {\n      if (isNullable(elm)) {\n        return Optional.none();\n      } else if (forward && isContentEditableFalse$b(elm.nextSibling)) {\n        return Optional.some(DeleteAction.moveToElement(elm.nextSibling));\n      } else if (!forward && isContentEditableFalse$b(elm.previousSibling)) {\n        return Optional.some(DeleteAction.moveToElement(elm.previousSibling));\n      } else {\n        return Optional.none();\n      }\n    };\n    const skipMoveToActionFromInlineCefToContent = (root, from, deleteAction) => deleteAction.fold(elm => Optional.some(DeleteAction.remove(elm)), elm => Optional.some(DeleteAction.moveToElement(elm)), to => {\n      if (isInSameBlock(from, to, root)) {\n        return Optional.none();\n      } else {\n        return Optional.some(DeleteAction.moveToPosition(to));\n      }\n    });\n    const getContentEditableAction = (root, forward, from, schema) => {\n      if (isAtContentEditableBlockCaret(forward, from)) {\n        return getContentEditableBlockAction(forward, from.getNode(!forward)).orThunk(() => findCefPosition(root, forward, from, schema));\n      } else {\n        return findCefPosition(root, forward, from, schema).bind(deleteAction => skipMoveToActionFromInlineCefToContent(root, from, deleteAction));\n      }\n    };\n    const read = (root, forward, rng, schema) => {\n      const normalizedRange = normalizeRange(forward ? 1 : -1, root, rng);\n      const from = CaretPosition.fromRangeStart(normalizedRange);\n      const rootElement = SugarElement.fromDom(root);\n      if (!forward && isAfterContentEditableFalse(from)) {\n        return Optional.some(DeleteAction.remove(from.getNode(true)));\n      } else if (forward && isBeforeContentEditableFalse(from)) {\n        return Optional.some(DeleteAction.remove(from.getNode()));\n      } else if (!forward && isBeforeContentEditableFalse(from) && isAfterBr(rootElement, from, schema)) {\n        return findPreviousBr(rootElement, from, schema).map(br => DeleteAction.remove(br.getNode()));\n      } else if (forward && isAfterContentEditableFalse(from) && isBeforeBr$1(rootElement, from, schema)) {\n        return findNextBr(rootElement, from, schema).map(br => DeleteAction.remove(br.getNode()));\n      } else {\n        return getContentEditableAction(root, forward, from, schema);\n      }\n    };\n\n    const deleteElement$1 = (editor, forward) => element => {\n      editor._selectionOverrides.hideFakeCaret();\n      deleteElement$2(editor, forward, SugarElement.fromDom(element));\n      return true;\n    };\n    const moveToElement = (editor, forward) => element => {\n      const pos = forward ? CaretPosition.before(element) : CaretPosition.after(element);\n      editor.selection.setRng(pos.toRange());\n      return true;\n    };\n    const moveToPosition = editor => pos => {\n      editor.selection.setRng(pos.toRange());\n      return true;\n    };\n    const getAncestorCe = (editor, node) => Optional.from(getContentEditableRoot$1(editor.getBody(), node));\n    const backspaceDeleteCaret = (editor, forward) => {\n      const selectedNode = editor.selection.getNode();\n      return getAncestorCe(editor, selectedNode).filter(isContentEditableFalse$b).fold(() => read(editor.getBody(), forward, editor.selection.getRng(), editor.schema).map(deleteAction => () => deleteAction.fold(deleteElement$1(editor, forward), moveToElement(editor, forward), moveToPosition(editor))), () => Optional.some(noop));\n    };\n    const deleteOffscreenSelection = rootElement => {\n      each$e(descendants(rootElement, '.mce-offscreen-selection'), remove$4);\n    };\n    const backspaceDeleteRange = (editor, forward) => {\n      const selectedNode = editor.selection.getNode();\n      if (isContentEditableFalse$b(selectedNode) && !isTableCell$3(selectedNode)) {\n        const hasCefAncestor = getAncestorCe(editor, selectedNode.parentNode).filter(isContentEditableFalse$b);\n        return hasCefAncestor.fold(() => Optional.some(() => {\n          deleteOffscreenSelection(SugarElement.fromDom(editor.getBody()));\n          deleteElement$2(editor, forward, SugarElement.fromDom(editor.selection.getNode()));\n          paddEmptyBody(editor);\n        }), () => Optional.some(noop));\n      }\n      if (isCefAtEdgeSelected(editor)) {\n        return Optional.some(() => {\n          deleteRangeContents(editor, editor.selection.getRng(), SugarElement.fromDom(editor.getBody()));\n        });\n      }\n      return Optional.none();\n    };\n    const paddEmptyElement = editor => {\n      const dom = editor.dom, selection = editor.selection;\n      const ceRoot = getContentEditableRoot$1(editor.getBody(), selection.getNode());\n      if (isContentEditableTrue$3(ceRoot) && dom.isBlock(ceRoot) && dom.isEmpty(ceRoot)) {\n        const br = dom.create('br', { 'data-mce-bogus': '1' });\n        dom.setHTML(ceRoot, '');\n        ceRoot.appendChild(br);\n        selection.setRng(CaretPosition.before(br).toRange());\n      }\n      return true;\n    };\n    const backspaceDelete$6 = (editor, forward) => {\n      if (editor.selection.isCollapsed()) {\n        return backspaceDeleteCaret(editor, forward);\n      } else {\n        return backspaceDeleteRange(editor, forward);\n      }\n    };\n\n    const deleteCaret$2 = (editor, forward) => {\n      const fromPos = CaretPosition.fromRangeStart(editor.selection.getRng());\n      return fromPosition(forward, editor.getBody(), fromPos).filter(pos => forward ? isBeforeImageBlock(pos) : isAfterImageBlock(pos)).bind(pos => getChildNodeAtRelativeOffset(forward ? 0 : -1, pos)).map(elm => () => editor.selection.select(elm));\n    };\n    const backspaceDelete$5 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret$2(editor, forward) : Optional.none();\n\n    const isText$2 = isText$b;\n    const startsWithCaretContainer = node => isText$2(node) && node.data[0] === ZWSP$1;\n    const endsWithCaretContainer = node => isText$2(node) && node.data[node.data.length - 1] === ZWSP$1;\n    const createZwsp = node => {\n      var _a;\n      const doc = (_a = node.ownerDocument) !== null && _a !== void 0 ? _a : document;\n      return doc.createTextNode(ZWSP$1);\n    };\n    const insertBefore$1 = node => {\n      var _a;\n      if (isText$2(node.previousSibling)) {\n        if (endsWithCaretContainer(node.previousSibling)) {\n          return node.previousSibling;\n        } else {\n          node.previousSibling.appendData(ZWSP$1);\n          return node.previousSibling;\n        }\n      } else if (isText$2(node)) {\n        if (startsWithCaretContainer(node)) {\n          return node;\n        } else {\n          node.insertData(0, ZWSP$1);\n          return node;\n        }\n      } else {\n        const newNode = createZwsp(node);\n        (_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(newNode, node);\n        return newNode;\n      }\n    };\n    const insertAfter$1 = node => {\n      var _a, _b;\n      if (isText$2(node.nextSibling)) {\n        if (startsWithCaretContainer(node.nextSibling)) {\n          return node.nextSibling;\n        } else {\n          node.nextSibling.insertData(0, ZWSP$1);\n          return node.nextSibling;\n        }\n      } else if (isText$2(node)) {\n        if (endsWithCaretContainer(node)) {\n          return node;\n        } else {\n          node.appendData(ZWSP$1);\n          return node;\n        }\n      } else {\n        const newNode = createZwsp(node);\n        if (node.nextSibling) {\n          (_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(newNode, node.nextSibling);\n        } else {\n          (_b = node.parentNode) === null || _b === void 0 ? void 0 : _b.appendChild(newNode);\n        }\n        return newNode;\n      }\n    };\n    const insertInline = (before, node) => before ? insertBefore$1(node) : insertAfter$1(node);\n    const insertInlineBefore = curry(insertInline, true);\n    const insertInlineAfter = curry(insertInline, false);\n\n    const insertInlinePos = (pos, before) => {\n      if (isText$b(pos.container())) {\n        return insertInline(before, pos.container());\n      } else {\n        return insertInline(before, pos.getNode());\n      }\n    };\n    const isPosCaretContainer = (pos, caret) => {\n      const caretNode = caret.get();\n      return caretNode && pos.container() === caretNode && isCaretContainerInline(caretNode);\n    };\n    const renderCaret = (caret, location) => location.fold(element => {\n      remove$2(caret.get());\n      const text = insertInlineBefore(element);\n      caret.set(text);\n      return Optional.some(CaretPosition(text, text.length - 1));\n    }, element => firstPositionIn(element).map(pos => {\n      if (!isPosCaretContainer(pos, caret)) {\n        remove$2(caret.get());\n        const text = insertInlinePos(pos, true);\n        caret.set(text);\n        return CaretPosition(text, 1);\n      } else {\n        const node = caret.get();\n        return CaretPosition(node, 1);\n      }\n    }), element => lastPositionIn(element).map(pos => {\n      if (!isPosCaretContainer(pos, caret)) {\n        remove$2(caret.get());\n        const text = insertInlinePos(pos, false);\n        caret.set(text);\n        return CaretPosition(text, text.length - 1);\n      } else {\n        const node = caret.get();\n        return CaretPosition(node, node.length - 1);\n      }\n    }), element => {\n      remove$2(caret.get());\n      const text = insertInlineAfter(element);\n      caret.set(text);\n      return Optional.some(CaretPosition(text, 1));\n    });\n\n    const evaluateUntil = (fns, args) => {\n      for (let i = 0; i < fns.length; i++) {\n        const result = fns[i].apply(null, args);\n        if (result.isSome()) {\n          return result;\n        }\n      }\n      return Optional.none();\n    };\n\n    const Location = Adt.generate([\n      { before: ['element'] },\n      { start: ['element'] },\n      { end: ['element'] },\n      { after: ['element'] }\n    ]);\n    const rescope$1 = (rootNode, node) => {\n      const parentBlock = getParentBlock$3(node, rootNode);\n      return parentBlock ? parentBlock : rootNode;\n    };\n    const before = (isInlineTarget, rootNode, pos) => {\n      const nPos = normalizeForwards(pos);\n      const scope = rescope$1(rootNode, nPos.container());\n      return findRootInline(isInlineTarget, scope, nPos).fold(() => nextPosition(scope, nPos).bind(curry(findRootInline, isInlineTarget, scope)).map(inline => Location.before(inline)), Optional.none);\n    };\n    const isNotInsideFormatCaretContainer = (rootNode, elm) => getParentCaretContainer(rootNode, elm) === null;\n    const findInsideRootInline = (isInlineTarget, rootNode, pos) => findRootInline(isInlineTarget, rootNode, pos).filter(curry(isNotInsideFormatCaretContainer, rootNode));\n    const start$1 = (isInlineTarget, rootNode, pos) => {\n      const nPos = normalizeBackwards(pos);\n      return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(inline => {\n        const prevPos = prevPosition(inline, nPos);\n        return prevPos.isNone() ? Optional.some(Location.start(inline)) : Optional.none();\n      });\n    };\n    const end = (isInlineTarget, rootNode, pos) => {\n      const nPos = normalizeForwards(pos);\n      return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(inline => {\n        const nextPos = nextPosition(inline, nPos);\n        return nextPos.isNone() ? Optional.some(Location.end(inline)) : Optional.none();\n      });\n    };\n    const after = (isInlineTarget, rootNode, pos) => {\n      const nPos = normalizeBackwards(pos);\n      const scope = rescope$1(rootNode, nPos.container());\n      return findRootInline(isInlineTarget, scope, nPos).fold(() => prevPosition(scope, nPos).bind(curry(findRootInline, isInlineTarget, scope)).map(inline => Location.after(inline)), Optional.none);\n    };\n    const isValidLocation = location => !isRtl(getElement(location));\n    const readLocation = (isInlineTarget, rootNode, pos) => {\n      const location = evaluateUntil([\n        before,\n        start$1,\n        end,\n        after\n      ], [\n        isInlineTarget,\n        rootNode,\n        pos\n      ]);\n      return location.filter(isValidLocation);\n    };\n    const getElement = location => location.fold(identity, identity, identity, identity);\n    const getName = location => location.fold(constant('before'), constant('start'), constant('end'), constant('after'));\n    const outside = location => location.fold(Location.before, Location.before, Location.after, Location.after);\n    const inside = location => location.fold(Location.start, Location.start, Location.end, Location.end);\n    const isEq = (location1, location2) => getName(location1) === getName(location2) && getElement(location1) === getElement(location2);\n    const betweenInlines = (forward, isInlineTarget, rootNode, from, to, location) => lift2(findRootInline(isInlineTarget, rootNode, from), findRootInline(isInlineTarget, rootNode, to), (fromInline, toInline) => {\n      if (fromInline !== toInline && hasSameParentBlock(rootNode, fromInline, toInline)) {\n        return Location.after(forward ? fromInline : toInline);\n      } else {\n        return location;\n      }\n    }).getOr(location);\n    const skipNoMovement = (fromLocation, toLocation) => fromLocation.fold(always, fromLocation => !isEq(fromLocation, toLocation));\n    const findLocationTraverse = (forward, isInlineTarget, rootNode, fromLocation, pos) => {\n      const from = normalizePosition(forward, pos);\n      const to = fromPosition(forward, rootNode, from).map(curry(normalizePosition, forward));\n      const location = to.fold(() => fromLocation.map(outside), to => readLocation(isInlineTarget, rootNode, to).map(curry(betweenInlines, forward, isInlineTarget, rootNode, from, to)).filter(curry(skipNoMovement, fromLocation)));\n      return location.filter(isValidLocation);\n    };\n    const findLocationSimple = (forward, location) => {\n      if (forward) {\n        return location.fold(compose(Optional.some, Location.start), Optional.none, compose(Optional.some, Location.after), Optional.none);\n      } else {\n        return location.fold(Optional.none, compose(Optional.some, Location.before), Optional.none, compose(Optional.some, Location.end));\n      }\n    };\n    const findLocation$1 = (forward, isInlineTarget, rootNode, pos) => {\n      const from = normalizePosition(forward, pos);\n      const fromLocation = readLocation(isInlineTarget, rootNode, from);\n      return readLocation(isInlineTarget, rootNode, from).bind(curry(findLocationSimple, forward)).orThunk(() => findLocationTraverse(forward, isInlineTarget, rootNode, fromLocation, pos));\n    };\n\n    const hasSelectionModifyApi = editor => {\n      return isFunction(editor.selection.getSel().modify);\n    };\n    const moveRel = (forward, selection, pos) => {\n      const delta = forward ? 1 : -1;\n      selection.setRng(CaretPosition(pos.container(), pos.offset() + delta).toRange());\n      selection.getSel().modify('move', forward ? 'forward' : 'backward', 'word');\n      return true;\n    };\n    const moveByWord = (forward, editor) => {\n      const rng = editor.selection.getRng();\n      const pos = forward ? CaretPosition.fromRangeEnd(rng) : CaretPosition.fromRangeStart(rng);\n      if (!hasSelectionModifyApi(editor)) {\n        return false;\n      } else if (forward && isBeforeInline(pos)) {\n        return moveRel(true, editor.selection, pos);\n      } else if (!forward && isAfterInline(pos)) {\n        return moveRel(false, editor.selection, pos);\n      } else {\n        return false;\n      }\n    };\n\n    var BreakType;\n    (function (BreakType) {\n      BreakType[BreakType['Br'] = 0] = 'Br';\n      BreakType[BreakType['Block'] = 1] = 'Block';\n      BreakType[BreakType['Wrap'] = 2] = 'Wrap';\n      BreakType[BreakType['Eol'] = 3] = 'Eol';\n    }(BreakType || (BreakType = {})));\n    const flip = (direction, positions) => direction === HDirection.Backwards ? reverse(positions) : positions;\n    const walk$1 = (direction, caretWalker, pos) => direction === HDirection.Forwards ? caretWalker.next(pos) : caretWalker.prev(pos);\n    const getBreakType = (scope, direction, currentPos, nextPos) => {\n      if (isBr$6(nextPos.getNode(direction === HDirection.Forwards))) {\n        return BreakType.Br;\n      } else if (isInSameBlock(currentPos, nextPos) === false) {\n        return BreakType.Block;\n      } else {\n        return BreakType.Wrap;\n      }\n    };\n    const getPositionsUntil = (predicate, direction, scope, start) => {\n      const caretWalker = CaretWalker(scope);\n      let currentPos = start;\n      const positions = [];\n      while (currentPos) {\n        const nextPos = walk$1(direction, caretWalker, currentPos);\n        if (!nextPos) {\n          break;\n        }\n        if (isBr$6(nextPos.getNode(false))) {\n          if (direction === HDirection.Forwards) {\n            return {\n              positions: flip(direction, positions).concat([nextPos]),\n              breakType: BreakType.Br,\n              breakAt: Optional.some(nextPos)\n            };\n          } else {\n            return {\n              positions: flip(direction, positions),\n              breakType: BreakType.Br,\n              breakAt: Optional.some(nextPos)\n            };\n          }\n        }\n        if (!nextPos.isVisible()) {\n          currentPos = nextPos;\n          continue;\n        }\n        if (predicate(currentPos, nextPos)) {\n          const breakType = getBreakType(scope, direction, currentPos, nextPos);\n          return {\n            positions: flip(direction, positions),\n            breakType,\n            breakAt: Optional.some(nextPos)\n          };\n        }\n        positions.push(nextPos);\n        currentPos = nextPos;\n      }\n      return {\n        positions: flip(direction, positions),\n        breakType: BreakType.Eol,\n        breakAt: Optional.none()\n      };\n    };\n    const getAdjacentLinePositions = (direction, getPositionsUntilBreak, scope, start) => getPositionsUntilBreak(scope, start).breakAt.map(pos => {\n      const positions = getPositionsUntilBreak(scope, pos).positions;\n      return direction === HDirection.Backwards ? positions.concat(pos) : [pos].concat(positions);\n    }).getOr([]);\n    const findClosestHorizontalPositionFromPoint = (positions, x) => foldl(positions, (acc, newPos) => acc.fold(() => Optional.some(newPos), lastPos => lift2(head(lastPos.getClientRects()), head(newPos.getClientRects()), (lastRect, newRect) => {\n      const lastDist = Math.abs(x - lastRect.left);\n      const newDist = Math.abs(x - newRect.left);\n      return newDist <= lastDist ? newPos : lastPos;\n    }).or(acc)), Optional.none());\n    const findClosestHorizontalPosition = (positions, pos) => head(pos.getClientRects()).bind(targetRect => findClosestHorizontalPositionFromPoint(positions, targetRect.left));\n    const getPositionsUntilPreviousLine = curry(getPositionsUntil, CaretPosition.isAbove, -1);\n    const getPositionsUntilNextLine = curry(getPositionsUntil, CaretPosition.isBelow, 1);\n    const getPositionsAbove = curry(getAdjacentLinePositions, -1, getPositionsUntilPreviousLine);\n    const getPositionsBelow = curry(getAdjacentLinePositions, 1, getPositionsUntilNextLine);\n    const isAtFirstLine = (scope, pos) => getPositionsUntilPreviousLine(scope, pos).breakAt.isNone();\n    const isAtLastLine = (scope, pos) => getPositionsUntilNextLine(scope, pos).breakAt.isNone();\n    const getFirstLinePositions = scope => firstPositionIn(scope).map(pos => [pos].concat(getPositionsUntilNextLine(scope, pos).positions)).getOr([]);\n    const getLastLinePositions = scope => lastPositionIn(scope).map(pos => getPositionsUntilPreviousLine(scope, pos).positions.concat(pos)).getOr([]);\n    const getClosestPositionAbove = (scope, pos) => findClosestHorizontalPosition(getPositionsAbove(scope, pos), pos);\n    const getClosestPositionBelow = (scope, pos) => findClosestHorizontalPosition(getPositionsBelow(scope, pos), pos);\n\n    const isContentEditableFalse$5 = isContentEditableFalse$b;\n    const distanceToRectLeft$1 = (clientRect, clientX) => Math.abs(clientRect.left - clientX);\n    const distanceToRectRight$1 = (clientRect, clientX) => Math.abs(clientRect.right - clientX);\n    const isNodeClientRect = rect => hasNonNullableKey(rect, 'node');\n    const findClosestClientRect = (clientRects, clientX) => reduce(clientRects, (oldClientRect, clientRect) => {\n      const oldDistance = Math.min(distanceToRectLeft$1(oldClientRect, clientX), distanceToRectRight$1(oldClientRect, clientX));\n      const newDistance = Math.min(distanceToRectLeft$1(clientRect, clientX), distanceToRectRight$1(clientRect, clientX));\n      if (newDistance === oldDistance && isNodeClientRect(clientRect) && isContentEditableFalse$5(clientRect.node)) {\n        return clientRect;\n      }\n      if (newDistance < oldDistance) {\n        return clientRect;\n      }\n      return oldClientRect;\n    });\n\n    const getNodeClientRects = node => {\n      const toArrayWithNode = clientRects => {\n        return map$3(clientRects, rect => {\n          const clientRect = clone$1(rect);\n          clientRect.node = node;\n          return clientRect;\n        });\n      };\n      if (isElement$6(node)) {\n        return toArrayWithNode(node.getClientRects());\n      } else if (isText$b(node)) {\n        const rng = node.ownerDocument.createRange();\n        rng.setStart(node, 0);\n        rng.setEnd(node, node.data.length);\n        return toArrayWithNode(rng.getClientRects());\n      } else {\n        return [];\n      }\n    };\n    const getClientRects = nodes => bind$3(nodes, getNodeClientRects);\n\n    var VDirection;\n    (function (VDirection) {\n      VDirection[VDirection['Up'] = -1] = 'Up';\n      VDirection[VDirection['Down'] = 1] = 'Down';\n    }(VDirection || (VDirection = {})));\n    const findUntil = (direction, root, predicateFn, node) => {\n      let currentNode = node;\n      while (currentNode = findNode(currentNode, direction, isEditableCaretCandidate$1, root)) {\n        if (predicateFn(currentNode)) {\n          return;\n        }\n      }\n    };\n    const walkUntil = (direction, isAboveFn, isBeflowFn, root, predicateFn, caretPosition) => {\n      let line = 0;\n      const result = [];\n      const add = node => {\n        let clientRects = getClientRects([node]);\n        if (direction === -1) {\n          clientRects = clientRects.reverse();\n        }\n        for (let i = 0; i < clientRects.length; i++) {\n          const clientRect = clientRects[i];\n          if (isBeflowFn(clientRect, targetClientRect)) {\n            continue;\n          }\n          if (result.length > 0 && isAboveFn(clientRect, last$1(result))) {\n            line++;\n          }\n          clientRect.line = line;\n          if (predicateFn(clientRect)) {\n            return true;\n          }\n          result.push(clientRect);\n        }\n        return false;\n      };\n      const targetClientRect = last$1(caretPosition.getClientRects());\n      if (!targetClientRect) {\n        return result;\n      }\n      const node = caretPosition.getNode();\n      if (node) {\n        add(node);\n        findUntil(direction, root, add, node);\n      }\n      return result;\n    };\n    const aboveLineNumber = (lineNumber, clientRect) => clientRect.line > lineNumber;\n    const isLineNumber = (lineNumber, clientRect) => clientRect.line === lineNumber;\n    const upUntil = curry(walkUntil, VDirection.Up, isAbove$1, isBelow$1);\n    const downUntil = curry(walkUntil, VDirection.Down, isBelow$1, isAbove$1);\n    const getLastClientRect = caretPosition => {\n      return last$1(caretPosition.getClientRects());\n    };\n    const positionsUntil = (direction, root, predicateFn, node) => {\n      const caretWalker = CaretWalker(root);\n      let walkFn;\n      let isBelowFn;\n      let isAboveFn;\n      let caretPosition;\n      const result = [];\n      let line = 0;\n      if (direction === 1) {\n        walkFn = caretWalker.next;\n        isBelowFn = isBelow$1;\n        isAboveFn = isAbove$1;\n        caretPosition = CaretPosition.after(node);\n      } else {\n        walkFn = caretWalker.prev;\n        isBelowFn = isAbove$1;\n        isAboveFn = isBelow$1;\n        caretPosition = CaretPosition.before(node);\n      }\n      const targetClientRect = getLastClientRect(caretPosition);\n      do {\n        if (!caretPosition.isVisible()) {\n          continue;\n        }\n        const rect = getLastClientRect(caretPosition);\n        if (isAboveFn(rect, targetClientRect)) {\n          continue;\n        }\n        if (result.length > 0 && isBelowFn(rect, last$1(result))) {\n          line++;\n        }\n        const clientRect = clone$1(rect);\n        clientRect.position = caretPosition;\n        clientRect.line = line;\n        if (predicateFn(clientRect)) {\n          return result;\n        }\n        result.push(clientRect);\n      } while (caretPosition = walkFn(caretPosition));\n      return result;\n    };\n    const isAboveLine = lineNumber => clientRect => aboveLineNumber(lineNumber, clientRect);\n    const isLine = lineNumber => clientRect => isLineNumber(lineNumber, clientRect);\n\n    const moveToRange = (editor, rng) => {\n      editor.selection.setRng(rng);\n      scrollRangeIntoView(editor, editor.selection.getRng());\n    };\n    const renderRangeCaretOpt = (editor, range, scrollIntoView) => Optional.some(renderRangeCaret(editor, range, scrollIntoView));\n    const moveHorizontally = (editor, direction, range, isBefore, isAfter, isElement) => {\n      const forwards = direction === HDirection.Forwards;\n      const caretWalker = CaretWalker(editor.getBody());\n      const getNextPosFn = curry(getVisualCaretPosition, forwards ? caretWalker.next : caretWalker.prev);\n      const isBeforeFn = forwards ? isBefore : isAfter;\n      if (!range.collapsed) {\n        const node = getSelectedNode(range);\n        if (isElement(node)) {\n          return showCaret(direction, editor, node, direction === HDirection.Backwards, false);\n        } else if (isCefAtEdgeSelected(editor)) {\n          const newRange = range.cloneRange();\n          newRange.collapse(direction === HDirection.Backwards);\n          return Optional.from(newRange);\n        }\n      }\n      const caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);\n      if (isBeforeFn(caretPosition)) {\n        return selectNode(editor, caretPosition.getNode(!forwards));\n      }\n      let nextCaretPosition = getNextPosFn(caretPosition);\n      const rangeIsInContainerBlock = isRangeInCaretContainerBlock(range);\n      if (!nextCaretPosition) {\n        return rangeIsInContainerBlock ? Optional.some(range) : Optional.none();\n      } else {\n        nextCaretPosition = normalizePosition(forwards, nextCaretPosition);\n      }\n      if (isBeforeFn(nextCaretPosition)) {\n        return showCaret(direction, editor, nextCaretPosition.getNode(!forwards), forwards, false);\n      }\n      const peekCaretPosition = getNextPosFn(nextCaretPosition);\n      if (peekCaretPosition && isBeforeFn(peekCaretPosition)) {\n        if (isMoveInsideSameBlock(nextCaretPosition, peekCaretPosition)) {\n          return showCaret(direction, editor, peekCaretPosition.getNode(!forwards), forwards, false);\n        }\n      }\n      if (rangeIsInContainerBlock) {\n        return renderRangeCaretOpt(editor, nextCaretPosition.toRange(), false);\n      }\n      return Optional.none();\n    };\n    const moveVertically = (editor, direction, range, isBefore, isAfter, isElement) => {\n      const caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);\n      const caretClientRect = last$1(caretPosition.getClientRects());\n      const forwards = direction === VDirection.Down;\n      const root = editor.getBody();\n      if (!caretClientRect) {\n        return Optional.none();\n      }\n      if (isCefAtEdgeSelected(editor)) {\n        const caretPosition = forwards ? CaretPosition.fromRangeEnd(range) : CaretPosition.fromRangeStart(range);\n        const getClosestFn = !forwards ? getClosestPositionAbove : getClosestPositionBelow;\n        return getClosestFn(root, caretPosition).orThunk(() => Optional.from(caretPosition)).map(pos => pos.toRange());\n      }\n      const walkerFn = forwards ? downUntil : upUntil;\n      const linePositions = walkerFn(root, isAboveLine(1), caretPosition);\n      const nextLinePositions = filter$5(linePositions, isLine(1));\n      const clientX = caretClientRect.left;\n      const nextLineRect = findClosestClientRect(nextLinePositions, clientX);\n      if (nextLineRect && isElement(nextLineRect.node)) {\n        const dist1 = Math.abs(clientX - nextLineRect.left);\n        const dist2 = Math.abs(clientX - nextLineRect.right);\n        return showCaret(direction, editor, nextLineRect.node, dist1 < dist2, false);\n      }\n      let currentNode;\n      if (isBefore(caretPosition)) {\n        currentNode = caretPosition.getNode();\n      } else if (isAfter(caretPosition)) {\n        currentNode = caretPosition.getNode(true);\n      } else {\n        currentNode = getSelectedNode(range);\n      }\n      if (currentNode) {\n        const caretPositions = positionsUntil(direction, root, isAboveLine(1), currentNode);\n        let closestNextLineRect = findClosestClientRect(filter$5(caretPositions, isLine(1)), clientX);\n        if (closestNextLineRect) {\n          return renderRangeCaretOpt(editor, closestNextLineRect.position.toRange(), false);\n        }\n        closestNextLineRect = last$1(filter$5(caretPositions, isLine(0)));\n        if (closestNextLineRect) {\n          return renderRangeCaretOpt(editor, closestNextLineRect.position.toRange(), false);\n        }\n      }\n      if (nextLinePositions.length === 0) {\n        return getLineEndPoint(editor, forwards).filter(forwards ? isAfter : isBefore).map(pos => renderRangeCaret(editor, pos.toRange(), false));\n      }\n      return Optional.none();\n    };\n    const getLineEndPoint = (editor, forward) => {\n      const rng = editor.selection.getRng();\n      const from = forward ? CaretPosition.fromRangeEnd(rng) : CaretPosition.fromRangeStart(rng);\n      const host = getEditingHost(from.container(), editor.getBody());\n      if (forward) {\n        const lineInfo = getPositionsUntilNextLine(host, from);\n        return last$2(lineInfo.positions);\n      } else {\n        const lineInfo = getPositionsUntilPreviousLine(host, from);\n        return head(lineInfo.positions);\n      }\n    };\n    const moveToLineEndPoint$3 = (editor, forward, isElementPosition) => getLineEndPoint(editor, forward).filter(isElementPosition).exists(pos => {\n      editor.selection.setRng(pos.toRange());\n      return true;\n    });\n\n    const setCaretPosition = (editor, pos) => {\n      const rng = editor.dom.createRng();\n      rng.setStart(pos.container(), pos.offset());\n      rng.setEnd(pos.container(), pos.offset());\n      editor.selection.setRng(rng);\n    };\n    const setSelected = (state, elm) => {\n      if (state) {\n        elm.setAttribute('data-mce-selected', 'inline-boundary');\n      } else {\n        elm.removeAttribute('data-mce-selected');\n      }\n    };\n    const renderCaretLocation = (editor, caret, location) => renderCaret(caret, location).map(pos => {\n      setCaretPosition(editor, pos);\n      return location;\n    });\n    const getPositionFromRange = (range, root, forward) => {\n      const start = CaretPosition.fromRangeStart(range);\n      if (range.collapsed) {\n        return start;\n      } else {\n        const end = CaretPosition.fromRangeEnd(range);\n        return forward ? prevPosition(root, end).getOr(end) : nextPosition(root, start).getOr(start);\n      }\n    };\n    const findLocation = (editor, caret, forward) => {\n      const rootNode = editor.getBody();\n      const from = getPositionFromRange(editor.selection.getRng(), rootNode, forward);\n      const isInlineTarget$1 = curry(isInlineTarget, editor);\n      const location = findLocation$1(forward, isInlineTarget$1, rootNode, from);\n      return location.bind(location => renderCaretLocation(editor, caret, location));\n    };\n    const toggleInlines = (isInlineTarget, dom, elms) => {\n      const inlineBoundaries = map$3(descendants(SugarElement.fromDom(dom.getRoot()), '*[data-mce-selected=\"inline-boundary\"]'), e => e.dom);\n      const selectedInlines = filter$5(inlineBoundaries, isInlineTarget);\n      const targetInlines = filter$5(elms, isInlineTarget);\n      each$e(difference(selectedInlines, targetInlines), curry(setSelected, false));\n      each$e(difference(targetInlines, selectedInlines), curry(setSelected, true));\n    };\n    const safeRemoveCaretContainer = (editor, caret) => {\n      const caretValue = caret.get();\n      if (editor.selection.isCollapsed() && !editor.composing && caretValue) {\n        const pos = CaretPosition.fromRangeStart(editor.selection.getRng());\n        if (CaretPosition.isTextPosition(pos) && !isAtZwsp(pos)) {\n          setCaretPosition(editor, removeAndReposition(caretValue, pos));\n          caret.set(null);\n        }\n      }\n    };\n    const renderInsideInlineCaret = (isInlineTarget, editor, caret, elms) => {\n      if (editor.selection.isCollapsed()) {\n        const inlines = filter$5(elms, isInlineTarget);\n        each$e(inlines, _inline => {\n          const pos = CaretPosition.fromRangeStart(editor.selection.getRng());\n          readLocation(isInlineTarget, editor.getBody(), pos).bind(location => renderCaretLocation(editor, caret, location));\n        });\n      }\n    };\n    const move$3 = (editor, caret, forward) => isInlineBoundariesEnabled(editor) ? findLocation(editor, caret, forward).isSome() : false;\n    const moveWord = (forward, editor, _caret) => isInlineBoundariesEnabled(editor) ? moveByWord(forward, editor) : false;\n    const setupSelectedState = editor => {\n      const caret = Cell(null);\n      const isInlineTarget$1 = curry(isInlineTarget, editor);\n      editor.on('NodeChange', e => {\n        if (isInlineBoundariesEnabled(editor)) {\n          toggleInlines(isInlineTarget$1, editor.dom, e.parents);\n          safeRemoveCaretContainer(editor, caret);\n          renderInsideInlineCaret(isInlineTarget$1, editor, caret, e.parents);\n        }\n      });\n      return caret;\n    };\n    const moveNextWord = curry(moveWord, true);\n    const movePrevWord = curry(moveWord, false);\n    const moveToLineEndPoint$2 = (editor, forward, caret) => {\n      if (isInlineBoundariesEnabled(editor)) {\n        const linePoint = getLineEndPoint(editor, forward).getOrThunk(() => {\n          const rng = editor.selection.getRng();\n          return forward ? CaretPosition.fromRangeEnd(rng) : CaretPosition.fromRangeStart(rng);\n        });\n        return readLocation(curry(isInlineTarget, editor), editor.getBody(), linePoint).exists(loc => {\n          const outsideLoc = outside(loc);\n          return renderCaret(caret, outsideLoc).exists(pos => {\n            setCaretPosition(editor, pos);\n            return true;\n          });\n        });\n      } else {\n        return false;\n      }\n    };\n\n    const rangeFromPositions = (from, to) => {\n      const range = document.createRange();\n      range.setStart(from.container(), from.offset());\n      range.setEnd(to.container(), to.offset());\n      return range;\n    };\n    const hasOnlyTwoOrLessPositionsLeft = elm => lift2(firstPositionIn(elm), lastPositionIn(elm), (firstPos, lastPos) => {\n      const normalizedFirstPos = normalizePosition(true, firstPos);\n      const normalizedLastPos = normalizePosition(false, lastPos);\n      return nextPosition(elm, normalizedFirstPos).forall(pos => pos.isEqual(normalizedLastPos));\n    }).getOr(true);\n    const setCaretLocation = (editor, caret) => location => renderCaret(caret, location).map(pos => () => setCaretPosition(editor, pos));\n    const deleteFromTo = (editor, caret, from, to) => {\n      const rootNode = editor.getBody();\n      const isInlineTarget$1 = curry(isInlineTarget, editor);\n      editor.undoManager.ignore(() => {\n        editor.selection.setRng(rangeFromPositions(from, to));\n        execNativeDeleteCommand(editor);\n        readLocation(isInlineTarget$1, rootNode, CaretPosition.fromRangeStart(editor.selection.getRng())).map(inside).bind(setCaretLocation(editor, caret)).each(call);\n      });\n      editor.nodeChanged();\n    };\n    const rescope = (rootNode, node) => {\n      const parentBlock = getParentBlock$3(node, rootNode);\n      return parentBlock ? parentBlock : rootNode;\n    };\n    const backspaceDeleteCollapsed = (editor, caret, forward, from) => {\n      const rootNode = rescope(editor.getBody(), from.container());\n      const isInlineTarget$1 = curry(isInlineTarget, editor);\n      const fromLocation = readLocation(isInlineTarget$1, rootNode, from);\n      const location = fromLocation.bind(location => {\n        if (forward) {\n          return location.fold(constant(Optional.some(inside(location))), Optional.none, constant(Optional.some(outside(location))), Optional.none);\n        } else {\n          return location.fold(Optional.none, constant(Optional.some(outside(location))), Optional.none, constant(Optional.some(inside(location))));\n        }\n      });\n      return location.map(setCaretLocation(editor, caret)).getOrThunk(() => {\n        const toPosition = navigate(forward, rootNode, from);\n        const toLocation = toPosition.bind(pos => readLocation(isInlineTarget$1, rootNode, pos));\n        return lift2(fromLocation, toLocation, () => findRootInline(isInlineTarget$1, rootNode, from).bind(elm => {\n          if (hasOnlyTwoOrLessPositionsLeft(elm)) {\n            return Optional.some(() => {\n              deleteElement$2(editor, forward, SugarElement.fromDom(elm));\n            });\n          } else {\n            return Optional.none();\n          }\n        })).getOrThunk(() => toLocation.bind(() => toPosition.map(to => {\n          return () => {\n            if (forward) {\n              deleteFromTo(editor, caret, from, to);\n            } else {\n              deleteFromTo(editor, caret, to, from);\n            }\n          };\n        })));\n      });\n    };\n    const backspaceDelete$4 = (editor, caret, forward) => {\n      if (editor.selection.isCollapsed() && isInlineBoundariesEnabled(editor)) {\n        const from = CaretPosition.fromRangeStart(editor.selection.getRng());\n        return backspaceDeleteCollapsed(editor, caret, forward, from);\n      }\n      return Optional.none();\n    };\n\n    const hasMultipleChildren = elm => childNodesCount(elm) > 1;\n    const getParentsUntil = (editor, pred) => {\n      const rootElm = SugarElement.fromDom(editor.getBody());\n      const startElm = SugarElement.fromDom(editor.selection.getStart());\n      const parents = parentsAndSelf(startElm, rootElm);\n      return findIndex$2(parents, pred).fold(constant(parents), index => parents.slice(0, index));\n    };\n    const hasOnlyOneChild = elm => childNodesCount(elm) === 1;\n    const getParentInlinesUntilMultichildInline = editor => getParentsUntil(editor, elm => editor.schema.isBlock(name(elm)) || hasMultipleChildren(elm));\n    const getParentInlines = editor => getParentsUntil(editor, el => editor.schema.isBlock(name(el)));\n    const getFormatNodes = (editor, parentInlines) => {\n      const isFormatElement$1 = curry(isFormatElement, editor);\n      return bind$3(parentInlines, elm => isFormatElement$1(elm) ? [elm.dom] : []);\n    };\n    const getFormatNodesAtStart = editor => {\n      const parentInlines = getParentInlines(editor);\n      return getFormatNodes(editor, parentInlines);\n    };\n    const deleteLastPosition = (forward, editor, target, parentInlines) => {\n      const formatNodes = getFormatNodes(editor, parentInlines);\n      if (formatNodes.length === 0) {\n        deleteElement$2(editor, forward, target);\n      } else {\n        const pos = replaceWithCaretFormat(target.dom, formatNodes);\n        editor.selection.setRng(pos.toRange());\n      }\n    };\n    const deleteCaret$1 = (editor, forward) => {\n      const parentInlines = filter$5(getParentInlinesUntilMultichildInline(editor), hasOnlyOneChild);\n      return last$2(parentInlines).bind(target => {\n        const fromPos = CaretPosition.fromRangeStart(editor.selection.getRng());\n        if (willDeleteLastPositionInElement(forward, fromPos, target.dom) && !isEmptyCaretFormatElement(target)) {\n          return Optional.some(() => deleteLastPosition(forward, editor, target, parentInlines));\n        } else {\n          return Optional.none();\n        }\n      });\n    };\n    const isBrInEmptyElement = (editor, elm) => {\n      const parentElm = elm.parentElement;\n      return isBr$6(elm) && !isNull(parentElm) && editor.dom.isEmpty(parentElm);\n    };\n    const isEmptyCaret = elm => isEmptyCaretFormatElement(SugarElement.fromDom(elm));\n    const createCaretFormatAtStart = (editor, formatNodes) => {\n      const startElm = editor.selection.getStart();\n      const pos = isBrInEmptyElement(editor, startElm) || isEmptyCaret(startElm) ? replaceWithCaretFormat(startElm, formatNodes) : createCaretFormatAtStart$1(editor.selection.getRng(), formatNodes);\n      editor.selection.setRng(pos.toRange());\n    };\n    const updateCaretFormat = (editor, updateFormats) => {\n      const missingFormats = difference(updateFormats, getFormatNodesAtStart(editor));\n      if (missingFormats.length > 0) {\n        createCaretFormatAtStart(editor, missingFormats);\n      }\n    };\n    const rangeStartsAtTextContainer = rng => isText$b(rng.startContainer);\n    const rangeStartsAtStartOfTextContainer = rng => rng.startOffset === 0 && rangeStartsAtTextContainer(rng);\n    const rangeStartParentIsFormatElement = (editor, rng) => {\n      const startParent = rng.startContainer.parentElement;\n      return !isNull(startParent) && isFormatElement(editor, SugarElement.fromDom(startParent));\n    };\n    const rangeStartAndEndHaveSameParent = rng => {\n      const startParent = rng.startContainer.parentNode;\n      const endParent = rng.endContainer.parentNode;\n      return !isNull(startParent) && !isNull(endParent) && startParent.isEqualNode(endParent);\n    };\n    const rangeEndsAtEndOfEndContainer = rng => {\n      const endContainer = rng.endContainer;\n      return rng.endOffset === (isText$b(endContainer) ? endContainer.length : endContainer.childNodes.length);\n    };\n    const rangeEndsAtEndOfStartContainer = rng => rangeStartAndEndHaveSameParent(rng) && rangeEndsAtEndOfEndContainer(rng);\n    const rangeEndsAfterEndOfStartContainer = rng => !rng.endContainer.isEqualNode(rng.commonAncestorContainer);\n    const rangeEndsAtOrAfterEndOfStartContainer = rng => rangeEndsAtEndOfStartContainer(rng) || rangeEndsAfterEndOfStartContainer(rng);\n    const requiresDeleteRangeOverride = editor => {\n      const rng = editor.selection.getRng();\n      return rangeStartsAtStartOfTextContainer(rng) && rangeStartParentIsFormatElement(editor, rng) && rangeEndsAtOrAfterEndOfStartContainer(rng);\n    };\n    const deleteRange$1 = editor => {\n      if (requiresDeleteRangeOverride(editor)) {\n        const formatNodes = getFormatNodesAtStart(editor);\n        return Optional.some(() => {\n          execNativeDeleteCommand(editor);\n          updateCaretFormat(editor, formatNodes);\n        });\n      } else {\n        return Optional.none();\n      }\n    };\n    const backspaceDelete$3 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret$1(editor, forward) : deleteRange$1(editor);\n    const hasAncestorInlineCaret = (elm, schema) => ancestor$2(elm, node => isCaretNode(node.dom), el => schema.isBlock(name(el)));\n    const hasAncestorInlineCaretAtStart = editor => hasAncestorInlineCaret(SugarElement.fromDom(editor.selection.getStart()), editor.schema);\n    const requiresRefreshCaretOverride = editor => {\n      const rng = editor.selection.getRng();\n      return rng.collapsed && (rangeStartsAtTextContainer(rng) || editor.dom.isEmpty(rng.startContainer)) && !hasAncestorInlineCaretAtStart(editor);\n    };\n    const refreshCaret = editor => {\n      if (requiresRefreshCaretOverride(editor)) {\n        createCaretFormatAtStart(editor, []);\n      }\n      return true;\n    };\n\n    const deleteElement = (editor, forward, element) => {\n      if (isNonNullable(element)) {\n        return Optional.some(() => {\n          editor._selectionOverrides.hideFakeCaret();\n          deleteElement$2(editor, forward, SugarElement.fromDom(element));\n        });\n      } else {\n        return Optional.none();\n      }\n    };\n    const deleteCaret = (editor, forward) => {\n      const isNearMedia = forward ? isBeforeMedia : isAfterMedia;\n      const direction = forward ? HDirection.Forwards : HDirection.Backwards;\n      const fromPos = getNormalizedRangeEndPoint(direction, editor.getBody(), editor.selection.getRng());\n      if (isNearMedia(fromPos)) {\n        return deleteElement(editor, forward, fromPos.getNode(!forward));\n      } else {\n        return Optional.from(normalizePosition(forward, fromPos)).filter(pos => isNearMedia(pos) && isMoveInsideSameBlock(fromPos, pos)).bind(pos => deleteElement(editor, forward, pos.getNode(!forward)));\n      }\n    };\n    const deleteRange = (editor, forward) => {\n      const selectedNode = editor.selection.getNode();\n      return isMedia$2(selectedNode) ? deleteElement(editor, forward, selectedNode) : Optional.none();\n    };\n    const backspaceDelete$2 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret(editor, forward) : deleteRange(editor, forward);\n\n    const isEditable = target => closest$4(target, elm => isContentEditableTrue$3(elm.dom) || isContentEditableFalse$b(elm.dom)).exists(elm => isContentEditableTrue$3(elm.dom));\n    const parseIndentValue = value => toInt(value !== null && value !== void 0 ? value : '').getOr(0);\n    const getIndentStyleName = (useMargin, element) => {\n      const indentStyleName = useMargin || isTable$1(element) ? 'margin' : 'padding';\n      const suffix = get$7(element, 'direction') === 'rtl' ? '-right' : '-left';\n      return indentStyleName + suffix;\n    };\n    const indentElement = (dom, command, useMargin, value, unit, element) => {\n      const indentStyleName = getIndentStyleName(useMargin, SugarElement.fromDom(element));\n      const parsedValue = parseIndentValue(dom.getStyle(element, indentStyleName));\n      if (command === 'outdent') {\n        const styleValue = Math.max(0, parsedValue - value);\n        dom.setStyle(element, indentStyleName, styleValue ? styleValue + unit : '');\n      } else {\n        const styleValue = parsedValue + value + unit;\n        dom.setStyle(element, indentStyleName, styleValue);\n      }\n    };\n    const validateBlocks = (editor, blocks) => forall(blocks, block => {\n      const indentStyleName = getIndentStyleName(shouldIndentUseMargin(editor), block);\n      const intentValue = getRaw(block, indentStyleName).map(parseIndentValue).getOr(0);\n      const contentEditable = editor.dom.getContentEditable(block.dom);\n      return contentEditable !== 'false' && intentValue > 0;\n    });\n    const canOutdent = editor => {\n      const blocks = getBlocksToIndent(editor);\n      return !editor.mode.isReadOnly() && (blocks.length > 1 || validateBlocks(editor, blocks));\n    };\n    const isListComponent = el => isList(el) || isListItem$1(el);\n    const parentIsListComponent = el => parent(el).exists(isListComponent);\n    const getBlocksToIndent = editor => filter$5(fromDom$1(editor.selection.getSelectedBlocks()), el => !isListComponent(el) && !parentIsListComponent(el) && isEditable(el));\n    const handle = (editor, command) => {\n      var _a, _b;\n      const {dom} = editor;\n      const indentation = getIndentation(editor);\n      const indentUnit = (_b = (_a = /[a-z%]+$/i.exec(indentation)) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : 'px';\n      const indentValue = parseIndentValue(indentation);\n      const useMargin = shouldIndentUseMargin(editor);\n      each$e(getBlocksToIndent(editor), block => {\n        indentElement(dom, command, useMargin, indentValue, indentUnit, block.dom);\n      });\n    };\n    const indent = editor => handle(editor, 'indent');\n    const outdent = editor => handle(editor, 'outdent');\n\n    const backspaceDelete$1 = editor => {\n      if (editor.selection.isCollapsed() && canOutdent(editor)) {\n        const dom = editor.dom;\n        const rng = editor.selection.getRng();\n        const pos = CaretPosition.fromRangeStart(rng);\n        const block = dom.getParent(rng.startContainer, dom.isBlock);\n        if (block !== null && isAtStartOfBlock(SugarElement.fromDom(block), pos, editor.schema)) {\n          return Optional.some(() => outdent(editor));\n        }\n      }\n      return Optional.none();\n    };\n\n    const findAction = (editor, caret, forward) => findMap([\n      backspaceDelete$1,\n      backspaceDelete$6,\n      backspaceDelete$7,\n      (editor, forward) => backspaceDelete$4(editor, caret, forward),\n      backspaceDelete$9,\n      backspaceDelete$a,\n      backspaceDelete$5,\n      backspaceDelete$2,\n      backspaceDelete$8,\n      backspaceDelete$3\n    ], item => item(editor, forward)).filter(_ => editor.selection.isEditable());\n    const deleteCommand = (editor, caret) => {\n      const result = findAction(editor, caret, false);\n      result.fold(() => {\n        if (editor.selection.isEditable()) {\n          execNativeDeleteCommand(editor);\n          paddEmptyBody(editor);\n        }\n      }, call);\n    };\n    const forwardDeleteCommand = (editor, caret) => {\n      const result = findAction(editor, caret, true);\n      result.fold(() => {\n        if (editor.selection.isEditable()) {\n          execNativeForwardDeleteCommand(editor);\n        }\n      }, call);\n    };\n    const setup$q = (editor, caret) => {\n      editor.addCommand('delete', () => {\n        deleteCommand(editor, caret);\n      });\n      editor.addCommand('forwardDelete', () => {\n        forwardDeleteCommand(editor, caret);\n      });\n    };\n\n    const SIGNIFICANT_MOVE = 5;\n    const LONGPRESS_DELAY = 400;\n    const getTouch = event => {\n      if (event.touches === undefined || event.touches.length !== 1) {\n        return Optional.none();\n      }\n      return Optional.some(event.touches[0]);\n    };\n    const isFarEnough = (touch, data) => {\n      const distX = Math.abs(touch.clientX - data.x);\n      const distY = Math.abs(touch.clientY - data.y);\n      return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE;\n    };\n    const setup$p = editor => {\n      const startData = value$2();\n      const longpressFired = Cell(false);\n      const debounceLongpress = last(e => {\n        editor.dispatch('longpress', {\n          ...e,\n          type: 'longpress'\n        });\n        longpressFired.set(true);\n      }, LONGPRESS_DELAY);\n      editor.on('touchstart', e => {\n        getTouch(e).each(touch => {\n          debounceLongpress.cancel();\n          const data = {\n            x: touch.clientX,\n            y: touch.clientY,\n            target: e.target\n          };\n          debounceLongpress.throttle(e);\n          longpressFired.set(false);\n          startData.set(data);\n        });\n      }, true);\n      editor.on('touchmove', e => {\n        debounceLongpress.cancel();\n        getTouch(e).each(touch => {\n          startData.on(data => {\n            if (isFarEnough(touch, data)) {\n              startData.clear();\n              longpressFired.set(false);\n              editor.dispatch('longpresscancel');\n            }\n          });\n        });\n      }, true);\n      editor.on('touchend touchcancel', e => {\n        debounceLongpress.cancel();\n        if (e.type === 'touchcancel') {\n          return;\n        }\n        startData.get().filter(data => data.target.isEqualNode(e.target)).each(() => {\n          if (longpressFired.get()) {\n            e.preventDefault();\n          } else {\n            editor.dispatch('tap', {\n              ...e,\n              type: 'tap'\n            });\n          }\n        });\n      }, true);\n    };\n\n    const isBlockElement = (blockElements, node) => has$2(blockElements, node.nodeName);\n    const isValidTarget = (schema, node) => {\n      if (isText$b(node)) {\n        return true;\n      } else if (isElement$6(node)) {\n        return !isBlockElement(schema.getBlockElements(), node) && !isBookmarkNode$1(node) && !isTransparentBlock(schema, node) && !isNonHtmlElementRoot(node);\n      } else {\n        return false;\n      }\n    };\n    const hasBlockParent = (blockElements, root, node) => {\n      return exists(parents(SugarElement.fromDom(node), SugarElement.fromDom(root)), elm => {\n        return isBlockElement(blockElements, elm.dom);\n      });\n    };\n    const shouldRemoveTextNode = (blockElements, node) => {\n      if (isText$b(node)) {\n        if (node.data.length === 0) {\n          return true;\n        } else if (/^\\s+$/.test(node.data)) {\n          return !node.nextSibling || isBlockElement(blockElements, node.nextSibling) || isNonHtmlElementRoot(node.nextSibling);\n        }\n      }\n      return false;\n    };\n    const createRootBlock = editor => editor.dom.create(getForcedRootBlock(editor), getForcedRootBlockAttrs(editor));\n    const addRootBlocks = editor => {\n      const dom = editor.dom, selection = editor.selection;\n      const schema = editor.schema;\n      const blockElements = schema.getBlockElements();\n      const startNode = selection.getStart();\n      const rootNode = editor.getBody();\n      let rootBlockNode;\n      let tempNode;\n      let wrapped = false;\n      const forcedRootBlock = getForcedRootBlock(editor);\n      if (!startNode || !isElement$6(startNode)) {\n        return;\n      }\n      const rootNodeName = rootNode.nodeName.toLowerCase();\n      if (!schema.isValidChild(rootNodeName, forcedRootBlock.toLowerCase()) || hasBlockParent(blockElements, rootNode, startNode)) {\n        return;\n      }\n      const rng = selection.getRng();\n      const {startContainer, startOffset, endContainer, endOffset} = rng;\n      const restoreSelection = hasFocus(editor);\n      let node = rootNode.firstChild;\n      while (node) {\n        if (isElement$6(node)) {\n          updateElement(schema, node);\n        }\n        if (isValidTarget(schema, node)) {\n          if (shouldRemoveTextNode(blockElements, node)) {\n            tempNode = node;\n            node = node.nextSibling;\n            dom.remove(tempNode);\n            continue;\n          }\n          if (!rootBlockNode) {\n            rootBlockNode = createRootBlock(editor);\n            rootNode.insertBefore(rootBlockNode, node);\n            wrapped = true;\n          }\n          tempNode = node;\n          node = node.nextSibling;\n          rootBlockNode.appendChild(tempNode);\n        } else {\n          rootBlockNode = null;\n          node = node.nextSibling;\n        }\n      }\n      if (wrapped && restoreSelection) {\n        rng.setStart(startContainer, startOffset);\n        rng.setEnd(endContainer, endOffset);\n        selection.setRng(rng);\n        editor.nodeChanged();\n      }\n    };\n    const insertEmptyLine = (editor, root, insertBlock) => {\n      const block = SugarElement.fromDom(createRootBlock(editor));\n      const br = createPaddingBr();\n      append$1(block, br);\n      insertBlock(root, block);\n      const rng = document.createRange();\n      rng.setStartBefore(br.dom);\n      rng.setEndBefore(br.dom);\n      return rng;\n    };\n    const setup$o = editor => {\n      editor.on('NodeChange', curry(addRootBlocks, editor));\n    };\n\n    const hasClass = checkClassName => node => (' ' + node.attr('class') + ' ').indexOf(checkClassName) !== -1;\n    const replaceMatchWithSpan = (editor, content, cls) => {\n      return function (match) {\n        const args = arguments, index = args[args.length - 2];\n        const prevChar = index > 0 ? content.charAt(index - 1) : '';\n        if (prevChar === '\"') {\n          return match;\n        }\n        if (prevChar === '>') {\n          const findStartTagIndex = content.lastIndexOf('<', index);\n          if (findStartTagIndex !== -1) {\n            const tagHtml = content.substring(findStartTagIndex, index);\n            if (tagHtml.indexOf('contenteditable=\"false\"') !== -1) {\n              return match;\n            }\n          }\n        }\n        return '<span class=\"' + cls + '\" data-mce-content=\"' + editor.dom.encode(args[0]) + '\">' + editor.dom.encode(typeof args[1] === 'string' ? args[1] : args[0]) + '</span>';\n      };\n    };\n    const convertRegExpsToNonEditable = (editor, nonEditableRegExps, e) => {\n      let i = nonEditableRegExps.length, content = e.content;\n      if (e.format === 'raw') {\n        return;\n      }\n      while (i--) {\n        content = content.replace(nonEditableRegExps[i], replaceMatchWithSpan(editor, content, getNonEditableClass(editor)));\n      }\n      e.content = content;\n    };\n    const isValidContent = (nonEditableRegExps, content) => {\n      return forall(nonEditableRegExps, re => {\n        const matches = content.match(re);\n        return matches !== null && matches[0].length === content.length;\n      });\n    };\n    const setup$n = editor => {\n      const contentEditableAttrName = 'contenteditable';\n      const editClass = ' ' + Tools.trim(getEditableClass(editor)) + ' ';\n      const nonEditClass = ' ' + Tools.trim(getNonEditableClass(editor)) + ' ';\n      const hasEditClass = hasClass(editClass);\n      const hasNonEditClass = hasClass(nonEditClass);\n      const nonEditableRegExps = getNonEditableRegExps(editor);\n      if (nonEditableRegExps.length > 0) {\n        editor.on('BeforeSetContent', e => {\n          convertRegExpsToNonEditable(editor, nonEditableRegExps, e);\n        });\n      }\n      editor.parser.addAttributeFilter('class', nodes => {\n        let i = nodes.length;\n        while (i--) {\n          const node = nodes[i];\n          if (hasEditClass(node)) {\n            node.attr(contentEditableAttrName, 'true');\n          } else if (hasNonEditClass(node)) {\n            node.attr(contentEditableAttrName, 'false');\n          }\n        }\n      });\n      editor.serializer.addAttributeFilter(contentEditableAttrName, nodes => {\n        let i = nodes.length;\n        while (i--) {\n          const node = nodes[i];\n          if (!hasEditClass(node) && !hasNonEditClass(node)) {\n            continue;\n          }\n          const content = node.attr('data-mce-content');\n          if (nonEditableRegExps.length > 0 && content) {\n            if (isValidContent(nonEditableRegExps, content)) {\n              node.name = '#text';\n              node.type = 3;\n              node.raw = true;\n              node.value = content;\n            } else {\n              node.remove();\n            }\n          } else {\n            node.attr(contentEditableAttrName, null);\n          }\n        }\n      });\n    };\n\n    const findBlockCaretContainer = editor => descendant$1(SugarElement.fromDom(editor.getBody()), '*[data-mce-caret]').map(elm => elm.dom).getOrNull();\n    const showBlockCaretContainer = (editor, blockCaretContainer) => {\n      if (blockCaretContainer.hasAttribute('data-mce-caret')) {\n        showCaretContainerBlock(blockCaretContainer);\n        editor.selection.setRng(editor.selection.getRng());\n        editor.selection.scrollIntoView(blockCaretContainer);\n      }\n    };\n    const handleBlockContainer = (editor, e) => {\n      const blockCaretContainer = findBlockCaretContainer(editor);\n      if (!blockCaretContainer) {\n        return;\n      }\n      if (e.type === 'compositionstart') {\n        e.preventDefault();\n        e.stopPropagation();\n        showBlockCaretContainer(editor, blockCaretContainer);\n        return;\n      }\n      if (hasContent(blockCaretContainer)) {\n        showBlockCaretContainer(editor, blockCaretContainer);\n        editor.undoManager.add();\n      }\n    };\n    const setup$m = editor => {\n      editor.on('keyup compositionstart', curry(handleBlockContainer, editor));\n    };\n\n    const isContentEditableFalse$4 = isContentEditableFalse$b;\n    const moveToCeFalseHorizontally = (direction, editor, range) => moveHorizontally(editor, direction, range, isBeforeContentEditableFalse, isAfterContentEditableFalse, isContentEditableFalse$4);\n    const moveToCeFalseVertically = (direction, editor, range) => {\n      const isBefore = caretPosition => isBeforeContentEditableFalse(caretPosition) || isBeforeTable(caretPosition);\n      const isAfter = caretPosition => isAfterContentEditableFalse(caretPosition) || isAfterTable(caretPosition);\n      return moveVertically(editor, direction, range, isBefore, isAfter, isContentEditableFalse$4);\n    };\n    const createTextBlock = editor => {\n      const textBlock = editor.dom.create(getForcedRootBlock(editor));\n      textBlock.innerHTML = '<br data-mce-bogus=\"1\">';\n      return textBlock;\n    };\n    const exitPreBlock = (editor, direction, range) => {\n      const caretWalker = CaretWalker(editor.getBody());\n      const getVisualCaretPosition$1 = curry(getVisualCaretPosition, direction === 1 ? caretWalker.next : caretWalker.prev);\n      if (range.collapsed) {\n        const pre = editor.dom.getParent(range.startContainer, 'PRE');\n        if (!pre) {\n          return;\n        }\n        const caretPos = getVisualCaretPosition$1(CaretPosition.fromRangeStart(range));\n        if (!caretPos) {\n          const newBlock = SugarElement.fromDom(createTextBlock(editor));\n          if (direction === 1) {\n            after$4(SugarElement.fromDom(pre), newBlock);\n          } else {\n            before$3(SugarElement.fromDom(pre), newBlock);\n          }\n          editor.selection.select(newBlock.dom, true);\n          editor.selection.collapse();\n        }\n      }\n    };\n    const getHorizontalRange = (editor, forward) => {\n      const direction = forward ? HDirection.Forwards : HDirection.Backwards;\n      const range = editor.selection.getRng();\n      return moveToCeFalseHorizontally(direction, editor, range).orThunk(() => {\n        exitPreBlock(editor, direction, range);\n        return Optional.none();\n      });\n    };\n    const getVerticalRange = (editor, down) => {\n      const direction = down ? 1 : -1;\n      const range = editor.selection.getRng();\n      return moveToCeFalseVertically(direction, editor, range).orThunk(() => {\n        exitPreBlock(editor, direction, range);\n        return Optional.none();\n      });\n    };\n    const flipDirection = (selection, forward) => {\n      const elm = forward ? selection.getEnd(true) : selection.getStart(true);\n      return isRtl(elm) ? !forward : forward;\n    };\n    const moveH$2 = (editor, forward) => getHorizontalRange(editor, flipDirection(editor.selection, forward)).exists(newRange => {\n      moveToRange(editor, newRange);\n      return true;\n    });\n    const moveV$4 = (editor, down) => getVerticalRange(editor, down).exists(newRange => {\n      moveToRange(editor, newRange);\n      return true;\n    });\n    const moveToLineEndPoint$1 = (editor, forward) => {\n      const isCefPosition = forward ? isAfterContentEditableFalse : isBeforeContentEditableFalse;\n      return moveToLineEndPoint$3(editor, forward, isCefPosition);\n    };\n    const selectToEndPoint = (editor, forward) => getEdgeCefPosition(editor, !forward).map(pos => {\n      const rng = pos.toRange();\n      const curRng = editor.selection.getRng();\n      if (forward) {\n        rng.setStart(curRng.startContainer, curRng.startOffset);\n      } else {\n        rng.setEnd(curRng.endContainer, curRng.endOffset);\n      }\n      return rng;\n    }).exists(rng => {\n      moveToRange(editor, rng);\n      return true;\n    });\n\n    const isTarget = node => contains$2(['figcaption'], name(node));\n    const getClosestTargetBlock = (pos, root, schema) => {\n      const isRoot = curry(eq, root);\n      return closest$4(SugarElement.fromDom(pos.container()), el => schema.isBlock(name(el)), isRoot).filter(isTarget);\n    };\n    const isAtFirstOrLastLine = (root, forward, pos) => forward ? isAtLastLine(root.dom, pos) : isAtFirstLine(root.dom, pos);\n    const moveCaretToNewEmptyLine = (editor, forward) => {\n      const root = SugarElement.fromDom(editor.getBody());\n      const pos = CaretPosition.fromRangeStart(editor.selection.getRng());\n      return getClosestTargetBlock(pos, root, editor.schema).exists(() => {\n        if (isAtFirstOrLastLine(root, forward, pos)) {\n          const insertFn = forward ? append$1 : prepend;\n          const rng = insertEmptyLine(editor, root, insertFn);\n          editor.selection.setRng(rng);\n          return true;\n        } else {\n          return false;\n        }\n      });\n    };\n    const moveV$3 = (editor, forward) => {\n      if (editor.selection.isCollapsed()) {\n        return moveCaretToNewEmptyLine(editor, forward);\n      } else {\n        return false;\n      }\n    };\n\n    const moveUp = (editor, details, summary) => {\n      const rng = editor.selection.getRng();\n      const pos = CaretPosition.fromRangeStart(rng);\n      const root = editor.getBody();\n      if (root.firstChild === details && isAtFirstLine(summary, pos)) {\n        editor.execCommand('InsertNewBlockBefore');\n        return true;\n      } else {\n        return false;\n      }\n    };\n    const moveDown = (editor, details) => {\n      const rng = editor.selection.getRng();\n      const pos = CaretPosition.fromRangeStart(rng);\n      const root = editor.getBody();\n      if (root.lastChild === details && isAtLastLine(details, pos)) {\n        editor.execCommand('InsertNewBlockAfter');\n        return true;\n      } else {\n        return false;\n      }\n    };\n    const move$2 = (editor, forward) => {\n      if (forward) {\n        return Optional.from(editor.dom.getParent(editor.selection.getNode(), 'details')).map(details => moveDown(editor, details)).getOr(false);\n      } else {\n        return Optional.from(editor.dom.getParent(editor.selection.getNode(), 'summary')).bind(summary => Optional.from(editor.dom.getParent(summary, 'details')).map(details => moveUp(editor, details, summary))).getOr(false);\n      }\n    };\n    const moveV$2 = (editor, forward) => move$2(editor, forward);\n\n    const baseKeyPattern = {\n      shiftKey: false,\n      altKey: false,\n      ctrlKey: false,\n      metaKey: false,\n      keyCode: 0\n    };\n    const defaultPatterns = patterns => map$3(patterns, pattern => ({\n      ...baseKeyPattern,\n      ...pattern\n    }));\n    const defaultDelayedPatterns = patterns => map$3(patterns, pattern => ({\n      ...baseKeyPattern,\n      ...pattern\n    }));\n    const matchesEvent = (pattern, evt) => evt.keyCode === pattern.keyCode && evt.shiftKey === pattern.shiftKey && evt.altKey === pattern.altKey && evt.ctrlKey === pattern.ctrlKey && evt.metaKey === pattern.metaKey;\n    const match$1 = (patterns, evt) => bind$3(defaultPatterns(patterns), pattern => matchesEvent(pattern, evt) ? [pattern] : []);\n    const matchDelayed = (patterns, evt) => bind$3(defaultDelayedPatterns(patterns), pattern => matchesEvent(pattern, evt) ? [pattern] : []);\n    const action = (f, ...x) => () => f.apply(null, x);\n    const execute = (patterns, evt) => find$2(match$1(patterns, evt), pattern => pattern.action());\n    const executeWithDelayedAction = (patterns, evt) => findMap(matchDelayed(patterns, evt), pattern => pattern.action());\n\n    const moveH$1 = (editor, forward) => {\n      const direction = forward ? HDirection.Forwards : HDirection.Backwards;\n      const range = editor.selection.getRng();\n      return moveHorizontally(editor, direction, range, isBeforeMedia, isAfterMedia, isMedia$2).exists(newRange => {\n        moveToRange(editor, newRange);\n        return true;\n      });\n    };\n    const moveV$1 = (editor, down) => {\n      const direction = down ? 1 : -1;\n      const range = editor.selection.getRng();\n      return moveVertically(editor, direction, range, isBeforeMedia, isAfterMedia, isMedia$2).exists(newRange => {\n        moveToRange(editor, newRange);\n        return true;\n      });\n    };\n    const moveToLineEndPoint = (editor, forward) => {\n      const isNearMedia = forward ? isAfterMedia : isBeforeMedia;\n      return moveToLineEndPoint$3(editor, forward, isNearMedia);\n    };\n\n    const adt = Adt.generate([\n      { none: ['current'] },\n      { first: ['current'] },\n      {\n        middle: [\n          'current',\n          'target'\n        ]\n      },\n      { last: ['current'] }\n    ]);\n    const none = current => adt.none(current);\n    const CellLocation = {\n      ...adt,\n      none\n    };\n\n    const firstLayer = (scope, selector) => {\n      return filterFirstLayer(scope, selector, always);\n    };\n    const filterFirstLayer = (scope, selector, predicate) => {\n      return bind$3(children$1(scope), x => {\n        if (is$1(x, selector)) {\n          return predicate(x) ? [x] : [];\n        } else {\n          return filterFirstLayer(x, selector, predicate);\n        }\n      });\n    };\n\n    const lookup$1 = (tags, element, isRoot = never) => {\n      if (isRoot(element)) {\n        return Optional.none();\n      }\n      if (contains$2(tags, name(element))) {\n        return Optional.some(element);\n      }\n      const isRootOrUpperTable = elm => is$1(elm, 'table') || isRoot(elm);\n      return ancestor$3(element, tags.join(','), isRootOrUpperTable);\n    };\n    const cell = (element, isRoot) => lookup$1([\n      'td',\n      'th'\n    ], element, isRoot);\n    const cells = ancestor => firstLayer(ancestor, 'th,td');\n    const table = (element, isRoot) => closest$3(element, 'table', isRoot);\n\n    const walk = (all, current, index, direction, isEligible = always) => {\n      const forwards = direction === 1;\n      if (!forwards && index <= 0) {\n        return CellLocation.first(all[0]);\n      } else if (forwards && index >= all.length - 1) {\n        return CellLocation.last(all[all.length - 1]);\n      } else {\n        const newIndex = index + direction;\n        const elem = all[newIndex];\n        return isEligible(elem) ? CellLocation.middle(current, elem) : walk(all, current, newIndex, direction, isEligible);\n      }\n    };\n    const detect = (current, isRoot) => {\n      return table(current, isRoot).bind(table => {\n        const all = cells(table);\n        const index = findIndex$2(all, x => eq(current, x));\n        return index.map(index => ({\n          index,\n          all\n        }));\n      });\n    };\n    const next = (current, isEligible, isRoot) => {\n      const detection = detect(current, isRoot);\n      return detection.fold(() => {\n        return CellLocation.none(current);\n      }, info => {\n        return walk(info.all, current, info.index, 1, isEligible);\n      });\n    };\n    const prev = (current, isEligible, isRoot) => {\n      const detection = detect(current, isRoot);\n      return detection.fold(() => {\n        return CellLocation.none();\n      }, info => {\n        return walk(info.all, current, info.index, -1, isEligible);\n      });\n    };\n\n    const isTextNodeWithCursorPosition = el => getOption(el).filter(text => text.trim().length !== 0 || text.indexOf(nbsp) > -1).isSome();\n    const isContentEditableFalse$3 = elem => isHTMLElement$1(elem) && get$9(elem, 'contenteditable') === 'false';\n    const elementsWithCursorPosition = [\n      'img',\n      'br'\n    ];\n    const isCursorPosition = elem => {\n      const hasCursorPosition = isTextNodeWithCursorPosition(elem);\n      return hasCursorPosition || contains$2(elementsWithCursorPosition, name(elem)) || isContentEditableFalse$3(elem);\n    };\n\n    const first = element => descendant$2(element, isCursorPosition);\n\n    const deflate = (rect, delta) => ({\n      left: rect.left - delta,\n      top: rect.top - delta,\n      right: rect.right + delta * 2,\n      bottom: rect.bottom + delta * 2,\n      width: rect.width + delta,\n      height: rect.height + delta\n    });\n    const getCorners = (getYAxisValue, tds) => bind$3(tds, td => {\n      const rect = deflate(clone$1(td.getBoundingClientRect()), -1);\n      return [\n        {\n          x: rect.left,\n          y: getYAxisValue(rect),\n          cell: td\n        },\n        {\n          x: rect.right,\n          y: getYAxisValue(rect),\n          cell: td\n        }\n      ];\n    });\n    const findClosestCorner = (corners, x, y) => foldl(corners, (acc, newCorner) => acc.fold(() => Optional.some(newCorner), oldCorner => {\n      const oldDist = Math.sqrt(Math.abs(oldCorner.x - x) + Math.abs(oldCorner.y - y));\n      const newDist = Math.sqrt(Math.abs(newCorner.x - x) + Math.abs(newCorner.y - y));\n      return Optional.some(newDist < oldDist ? newCorner : oldCorner);\n    }), Optional.none());\n    const getClosestCell = (getYAxisValue, isTargetCorner, table, x, y) => {\n      const cells = descendants(SugarElement.fromDom(table), 'td,th,caption').map(e => e.dom);\n      const corners = filter$5(getCorners(getYAxisValue, cells), corner => isTargetCorner(corner, y));\n      return findClosestCorner(corners, x, y).map(corner => corner.cell);\n    };\n    const getBottomValue = rect => rect.bottom;\n    const getTopValue = rect => rect.top;\n    const isAbove = (corner, y) => corner.y < y;\n    const isBelow = (corner, y) => corner.y > y;\n    const getClosestCellAbove = curry(getClosestCell, getBottomValue, isAbove);\n    const getClosestCellBelow = curry(getClosestCell, getTopValue, isBelow);\n    const findClosestPositionInAboveCell = (table, pos) => head(pos.getClientRects()).bind(rect => getClosestCellAbove(table, rect.left, rect.top)).bind(cell => findClosestHorizontalPosition(getLastLinePositions(cell), pos));\n    const findClosestPositionInBelowCell = (table, pos) => last$2(pos.getClientRects()).bind(rect => getClosestCellBelow(table, rect.left, rect.top)).bind(cell => findClosestHorizontalPosition(getFirstLinePositions(cell), pos));\n\n    const hasNextBreak = (getPositionsUntil, scope, lineInfo) => lineInfo.breakAt.exists(breakPos => getPositionsUntil(scope, breakPos).breakAt.isSome());\n    const startsWithWrapBreak = lineInfo => lineInfo.breakType === BreakType.Wrap && lineInfo.positions.length === 0;\n    const startsWithBrBreak = lineInfo => lineInfo.breakType === BreakType.Br && lineInfo.positions.length === 1;\n    const isAtTableCellLine = (getPositionsUntil, scope, pos) => {\n      const lineInfo = getPositionsUntil(scope, pos);\n      if (startsWithWrapBreak(lineInfo) || !isBr$6(pos.getNode()) && startsWithBrBreak(lineInfo)) {\n        return !hasNextBreak(getPositionsUntil, scope, lineInfo);\n      } else {\n        return lineInfo.breakAt.isNone();\n      }\n    };\n    const isAtFirstTableCellLine = curry(isAtTableCellLine, getPositionsUntilPreviousLine);\n    const isAtLastTableCellLine = curry(isAtTableCellLine, getPositionsUntilNextLine);\n    const isCaretAtStartOrEndOfTable = (forward, rng, table) => {\n      const caretPos = CaretPosition.fromRangeStart(rng);\n      return positionIn(!forward, table).exists(pos => pos.isEqual(caretPos));\n    };\n    const navigateHorizontally = (editor, forward, table, _td) => {\n      const rng = editor.selection.getRng();\n      const direction = forward ? 1 : -1;\n      if (isFakeCaretTableBrowser() && isCaretAtStartOrEndOfTable(forward, rng, table)) {\n        showCaret(direction, editor, table, !forward, false).each(newRng => {\n          moveToRange(editor, newRng);\n        });\n        return true;\n      }\n      return false;\n    };\n    const getClosestAbovePosition = (root, table, start) => findClosestPositionInAboveCell(table, start).orThunk(() => head(start.getClientRects()).bind(rect => findClosestHorizontalPositionFromPoint(getPositionsAbove(root, CaretPosition.before(table)), rect.left))).getOr(CaretPosition.before(table));\n    const getClosestBelowPosition = (root, table, start) => findClosestPositionInBelowCell(table, start).orThunk(() => head(start.getClientRects()).bind(rect => findClosestHorizontalPositionFromPoint(getPositionsBelow(root, CaretPosition.after(table)), rect.left))).getOr(CaretPosition.after(table));\n    const getTable = (previous, pos) => {\n      const node = pos.getNode(previous);\n      return isTable$2(node) ? Optional.some(node) : Optional.none();\n    };\n    const renderBlock = (down, editor, table) => {\n      editor.undoManager.transact(() => {\n        const insertFn = down ? after$4 : before$3;\n        const rng = insertEmptyLine(editor, SugarElement.fromDom(table), insertFn);\n        moveToRange(editor, rng);\n      });\n    };\n    const moveCaret = (editor, down, pos) => {\n      const table = down ? getTable(true, pos) : getTable(false, pos);\n      const last = down === false;\n      table.fold(() => moveToRange(editor, pos.toRange()), table => positionIn(last, editor.getBody()).filter(lastPos => lastPos.isEqual(pos)).fold(() => moveToRange(editor, pos.toRange()), _ => renderBlock(down, editor, table)));\n    };\n    const navigateVertically = (editor, down, table, td) => {\n      const rng = editor.selection.getRng();\n      const pos = CaretPosition.fromRangeStart(rng);\n      const root = editor.getBody();\n      if (!down && isAtFirstTableCellLine(td, pos)) {\n        const newPos = getClosestAbovePosition(root, table, pos);\n        moveCaret(editor, down, newPos);\n        return true;\n      } else if (down && isAtLastTableCellLine(td, pos)) {\n        const newPos = getClosestBelowPosition(root, table, pos);\n        moveCaret(editor, down, newPos);\n        return true;\n      } else {\n        return false;\n      }\n    };\n    const move$1 = (editor, forward, mover) => Optional.from(editor.dom.getParent(editor.selection.getNode(), 'td,th')).bind(td => Optional.from(editor.dom.getParent(td, 'table')).map(table => mover(editor, forward, table, td))).getOr(false);\n    const moveH = (editor, forward) => move$1(editor, forward, navigateHorizontally);\n    const moveV = (editor, forward) => move$1(editor, forward, navigateVertically);\n    const getCellFirstCursorPosition = cell => {\n      const selection = SimSelection.exact(cell, 0, cell, 0);\n      return toNative(selection);\n    };\n    const tabGo = (editor, isRoot, cell) => {\n      return cell.fold(Optional.none, Optional.none, (_current, next) => {\n        return first(next).map(cell => {\n          return getCellFirstCursorPosition(cell);\n        });\n      }, current => {\n        editor.execCommand('mceTableInsertRowAfter');\n        return tabForward(editor, isRoot, current);\n      });\n    };\n    const tabForward = (editor, isRoot, cell) => tabGo(editor, isRoot, next(cell, isEditable$2));\n    const tabBackward = (editor, isRoot, cell) => tabGo(editor, isRoot, prev(cell, isEditable$2));\n    const handleTab = (editor, forward) => {\n      const rootElements = [\n        'table',\n        'li',\n        'dl'\n      ];\n      const body = SugarElement.fromDom(editor.getBody());\n      const isRoot = element => {\n        const name$1 = name(element);\n        return eq(element, body) || contains$2(rootElements, name$1);\n      };\n      const rng = editor.selection.getRng();\n      const container = SugarElement.fromDom(!forward ? rng.startContainer : rng.endContainer);\n      return cell(container, isRoot).map(cell => {\n        table(cell, isRoot).each(table => {\n          editor.model.table.clearSelectedCells(table.dom);\n        });\n        editor.selection.collapse(!forward);\n        const navigation = !forward ? tabBackward : tabForward;\n        const rng = navigation(editor, isRoot, cell);\n        rng.each(range => {\n          editor.selection.setRng(range);\n        });\n        return true;\n      }).getOr(false);\n    };\n\n    const executeKeydownOverride$4 = (editor, caret, evt) => {\n      const isMac = Env.os.isMacOS() || Env.os.isiOS();\n      execute([\n        {\n          keyCode: VK.RIGHT,\n          action: action(moveH$2, editor, true)\n        },\n        {\n          keyCode: VK.LEFT,\n          action: action(moveH$2, editor, false)\n        },\n        {\n          keyCode: VK.UP,\n          action: action(moveV$4, editor, false)\n        },\n        {\n          keyCode: VK.DOWN,\n          action: action(moveV$4, editor, true)\n        },\n        ...isMac ? [\n          {\n            keyCode: VK.UP,\n            action: action(selectToEndPoint, editor, false),\n            metaKey: true,\n            shiftKey: true\n          },\n          {\n            keyCode: VK.DOWN,\n            action: action(selectToEndPoint, editor, true),\n            metaKey: true,\n            shiftKey: true\n          }\n        ] : [],\n        {\n          keyCode: VK.RIGHT,\n          action: action(moveH, editor, true)\n        },\n        {\n          keyCode: VK.LEFT,\n          action: action(moveH, editor, false)\n        },\n        {\n          keyCode: VK.UP,\n          action: action(moveV, editor, false)\n        },\n        {\n          keyCode: VK.DOWN,\n          action: action(moveV, editor, true)\n        },\n        {\n          keyCode: VK.UP,\n          action: action(moveV, editor, false)\n        },\n        {\n          keyCode: VK.UP,\n          action: action(moveV$2, editor, false)\n        },\n        {\n          keyCode: VK.DOWN,\n          action: action(moveV$2, editor, true)\n        },\n        {\n          keyCode: VK.RIGHT,\n          action: action(moveH$1, editor, true)\n        },\n        {\n          keyCode: VK.LEFT,\n          action: action(moveH$1, editor, false)\n        },\n        {\n          keyCode: VK.UP,\n          action: action(moveV$1, editor, false)\n        },\n        {\n          keyCode: VK.DOWN,\n          action: action(moveV$1, editor, true)\n        },\n        {\n          keyCode: VK.RIGHT,\n          action: action(move$3, editor, caret, true)\n        },\n        {\n          keyCode: VK.LEFT,\n          action: action(move$3, editor, caret, false)\n        },\n        {\n          keyCode: VK.RIGHT,\n          ctrlKey: !isMac,\n          altKey: isMac,\n          action: action(moveNextWord, editor, caret)\n        },\n        {\n          keyCode: VK.LEFT,\n          ctrlKey: !isMac,\n          altKey: isMac,\n          action: action(movePrevWord, editor, caret)\n        },\n        {\n          keyCode: VK.UP,\n          action: action(moveV$3, editor, false)\n        },\n        {\n          keyCode: VK.DOWN,\n          action: action(moveV$3, editor, true)\n        }\n      ], evt).each(_ => {\n        evt.preventDefault();\n      });\n    };\n    const setup$l = (editor, caret) => {\n      editor.on('keydown', evt => {\n        if (!evt.isDefaultPrevented()) {\n          executeKeydownOverride$4(editor, caret, evt);\n        }\n      });\n    };\n\n    const point = (container, offset) => ({\n      container,\n      offset\n    });\n\n    const DOM$7 = DOMUtils.DOM;\n    const alwaysNext = startNode => node => startNode === node ? -1 : 0;\n    const isBoundary = dom => node => dom.isBlock(node) || contains$2([\n      'BR',\n      'IMG',\n      'HR',\n      'INPUT'\n    ], node.nodeName) || dom.getContentEditable(node) === 'false';\n    const textBefore = (node, offset, rootNode) => {\n      if (isText$b(node) && offset >= 0) {\n        return Optional.some(point(node, offset));\n      } else {\n        const textSeeker = TextSeeker(DOM$7);\n        return Optional.from(textSeeker.backwards(node, offset, alwaysNext(node), rootNode)).map(prev => point(prev.container, prev.container.data.length));\n      }\n    };\n    const textAfter = (node, offset, rootNode) => {\n      if (isText$b(node) && offset >= node.length) {\n        return Optional.some(point(node, offset));\n      } else {\n        const textSeeker = TextSeeker(DOM$7);\n        return Optional.from(textSeeker.forwards(node, offset, alwaysNext(node), rootNode)).map(prev => point(prev.container, 0));\n      }\n    };\n    const scanLeft = (node, offset, rootNode) => {\n      if (!isText$b(node)) {\n        return Optional.none();\n      }\n      const text = node.data;\n      if (offset >= 0 && offset <= text.length) {\n        return Optional.some(point(node, offset));\n      } else {\n        const textSeeker = TextSeeker(DOM$7);\n        return Optional.from(textSeeker.backwards(node, offset, alwaysNext(node), rootNode)).bind(prev => {\n          const prevText = prev.container.data;\n          return scanLeft(prev.container, offset + prevText.length, rootNode);\n        });\n      }\n    };\n    const scanRight = (node, offset, rootNode) => {\n      if (!isText$b(node)) {\n        return Optional.none();\n      }\n      const text = node.data;\n      if (offset <= text.length) {\n        return Optional.some(point(node, offset));\n      } else {\n        const textSeeker = TextSeeker(DOM$7);\n        return Optional.from(textSeeker.forwards(node, offset, alwaysNext(node), rootNode)).bind(next => scanRight(next.container, offset - text.length, rootNode));\n      }\n    };\n    const repeatLeft = (dom, node, offset, process, rootNode) => {\n      const search = TextSeeker(dom, isBoundary(dom));\n      return Optional.from(search.backwards(node, offset, process, rootNode));\n    };\n\n    const isValidTextRange = rng => rng.collapsed && isText$b(rng.startContainer);\n    const getText = rng => trim$2(rng.toString().replace(/\\u00A0/g, ' '));\n    const isWhitespace = chr => chr !== '' && ' \\xA0\\f\\n\\r\\t\\x0B'.indexOf(chr) !== -1;\n\n    const stripTrigger = (text, trigger) => text.substring(trigger.length);\n    const findTrigger = (text, index, trigger, includeWhitespace = false) => {\n      let i;\n      const firstChar = trigger.charAt(0);\n      for (i = index - 1; i >= 0; i--) {\n        const char = text.charAt(i);\n        if (!includeWhitespace && isWhitespace(char)) {\n          return Optional.none();\n        }\n        if (firstChar === char && contains$1(text, trigger, i, index)) {\n          break;\n        }\n      }\n      return Optional.some(i);\n    };\n    const getContext = (dom, initRange, trigger, includeWhitespace = false) => {\n      if (!isValidTextRange(initRange)) {\n        return Optional.none();\n      }\n      const buffer = {\n        text: '',\n        offset: 0\n      };\n      const findTriggerIndex = (element, offset, text) => {\n        buffer.text = text + buffer.text;\n        buffer.offset += offset;\n        return findTrigger(buffer.text, buffer.offset, trigger, includeWhitespace).getOr(offset);\n      };\n      const root = dom.getParent(initRange.startContainer, dom.isBlock) || dom.getRoot();\n      return repeatLeft(dom, initRange.startContainer, initRange.startOffset, findTriggerIndex, root).bind(spot => {\n        const range = initRange.cloneRange();\n        range.setStart(spot.container, spot.offset);\n        range.setEnd(initRange.endContainer, initRange.endOffset);\n        if (range.collapsed) {\n          return Optional.none();\n        }\n        const text = getText(range);\n        const triggerIndex = text.lastIndexOf(trigger);\n        if (triggerIndex !== 0) {\n          return Optional.none();\n        } else {\n          return Optional.some({\n            text: stripTrigger(text, trigger),\n            range,\n            trigger\n          });\n        }\n      });\n    };\n\n    const isText$1 = node => node.nodeType === TEXT;\n    const isElement = node => node.nodeType === ELEMENT;\n    const toLast = node => {\n      if (isText$1(node)) {\n        return point(node, node.data.length);\n      } else {\n        const children = node.childNodes;\n        return children.length > 0 ? toLast(children[children.length - 1]) : point(node, children.length);\n      }\n    };\n    const toLeaf = (node, offset) => {\n      const children = node.childNodes;\n      if (children.length > 0 && offset < children.length) {\n        return toLeaf(children[offset], 0);\n      } else if (children.length > 0 && isElement(node) && children.length === offset) {\n        return toLast(children[children.length - 1]);\n      } else {\n        return point(node, offset);\n      }\n    };\n\n    const isPreviousCharContent = (dom, leaf) => {\n      var _a;\n      const root = (_a = dom.getParent(leaf.container, dom.isBlock)) !== null && _a !== void 0 ? _a : dom.getRoot();\n      return repeatLeft(dom, leaf.container, leaf.offset, (_element, offset) => offset === 0 ? -1 : offset, root).filter(spot => {\n        const char = spot.container.data.charAt(spot.offset - 1);\n        return !isWhitespace(char);\n      }).isSome();\n    };\n    const isStartOfWord = dom => rng => {\n      const leaf = toLeaf(rng.startContainer, rng.startOffset);\n      return !isPreviousCharContent(dom, leaf);\n    };\n    const getTriggerContext = (dom, initRange, database) => findMap(database.triggers, trigger => getContext(dom, initRange, trigger));\n    const lookup = (editor, getDatabase) => {\n      const database = getDatabase();\n      const rng = editor.selection.getRng();\n      return getTriggerContext(editor.dom, rng, database).bind(context => lookupWithContext(editor, getDatabase, context));\n    };\n    const lookupWithContext = (editor, getDatabase, context, fetchOptions = {}) => {\n      var _a;\n      const database = getDatabase();\n      const rng = editor.selection.getRng();\n      const startText = (_a = rng.startContainer.nodeValue) !== null && _a !== void 0 ? _a : '';\n      const autocompleters = filter$5(database.lookupByTrigger(context.trigger), autocompleter => context.text.length >= autocompleter.minChars && autocompleter.matches.getOrThunk(() => isStartOfWord(editor.dom))(context.range, startText, context.text));\n      if (autocompleters.length === 0) {\n        return Optional.none();\n      }\n      const lookupData = Promise.all(map$3(autocompleters, ac => {\n        const fetchResult = ac.fetch(context.text, ac.maxResults, fetchOptions);\n        return fetchResult.then(results => ({\n          matchText: context.text,\n          items: results,\n          columns: ac.columns,\n          onAction: ac.onAction,\n          highlightOn: ac.highlightOn\n        }));\n      }));\n      return Optional.some({\n        lookupData,\n        context\n      });\n    };\n\n    var SimpleResultType;\n    (function (SimpleResultType) {\n      SimpleResultType[SimpleResultType['Error'] = 0] = 'Error';\n      SimpleResultType[SimpleResultType['Value'] = 1] = 'Value';\n    }(SimpleResultType || (SimpleResultType = {})));\n    const fold$1 = (res, onError, onValue) => res.stype === SimpleResultType.Error ? onError(res.serror) : onValue(res.svalue);\n    const partition = results => {\n      const values = [];\n      const errors = [];\n      each$e(results, obj => {\n        fold$1(obj, err => errors.push(err), val => values.push(val));\n      });\n      return {\n        values,\n        errors\n      };\n    };\n    const mapError = (res, f) => {\n      if (res.stype === SimpleResultType.Error) {\n        return {\n          stype: SimpleResultType.Error,\n          serror: f(res.serror)\n        };\n      } else {\n        return res;\n      }\n    };\n    const map = (res, f) => {\n      if (res.stype === SimpleResultType.Value) {\n        return {\n          stype: SimpleResultType.Value,\n          svalue: f(res.svalue)\n        };\n      } else {\n        return res;\n      }\n    };\n    const bind$1 = (res, f) => {\n      if (res.stype === SimpleResultType.Value) {\n        return f(res.svalue);\n      } else {\n        return res;\n      }\n    };\n    const bindError = (res, f) => {\n      if (res.stype === SimpleResultType.Error) {\n        return f(res.serror);\n      } else {\n        return res;\n      }\n    };\n    const svalue = v => ({\n      stype: SimpleResultType.Value,\n      svalue: v\n    });\n    const serror = e => ({\n      stype: SimpleResultType.Error,\n      serror: e\n    });\n    const toResult = res => fold$1(res, Result.error, Result.value);\n    const fromResult = res => res.fold(serror, svalue);\n    const SimpleResult = {\n      fromResult,\n      toResult,\n      svalue,\n      partition,\n      serror,\n      bind: bind$1,\n      bindError,\n      map,\n      mapError,\n      fold: fold$1\n    };\n\n    const formatObj = input => {\n      return isObject(input) && keys(input).length > 100 ? ' removed due to size' : JSON.stringify(input, null, 2);\n    };\n    const formatErrors = errors => {\n      const es = errors.length > 10 ? errors.slice(0, 10).concat([{\n          path: [],\n          getErrorInfo: constant('... (only showing first ten failures)')\n        }]) : errors;\n      return map$3(es, e => {\n        return 'Failed path: (' + e.path.join(' > ') + ')\\n' + e.getErrorInfo();\n      });\n    };\n\n    const nu = (path, getErrorInfo) => {\n      return SimpleResult.serror([{\n          path,\n          getErrorInfo\n        }]);\n    };\n    const missingRequired = (path, key, obj) => nu(path, () => 'Could not find valid *required* value for \"' + key + '\" in ' + formatObj(obj));\n    const missingKey = (path, key) => nu(path, () => 'Choice schema did not contain choice key: \"' + key + '\"');\n    const missingBranch = (path, branches, branch) => nu(path, () => 'The chosen schema: \"' + branch + '\" did not exist in branches: ' + formatObj(branches));\n    const custom = (path, err) => nu(path, constant(err));\n\n    const chooseFrom = (path, input, branches, ch) => {\n      const fields = get$a(branches, ch);\n      return fields.fold(() => missingBranch(path, branches, ch), vp => vp.extract(path.concat(['branch: ' + ch]), input));\n    };\n    const choose$1 = (key, branches) => {\n      const extract = (path, input) => {\n        const choice = get$a(input, key);\n        return choice.fold(() => missingKey(path, key), chosen => chooseFrom(path, input, branches, chosen));\n      };\n      const toString = () => 'chooseOn(' + key + '). Possible values: ' + keys(branches);\n      return {\n        extract,\n        toString\n      };\n    };\n\n    const shallow = (old, nu) => {\n      return nu;\n    };\n    const deep = (old, nu) => {\n      const bothObjects = isPlainObject(old) && isPlainObject(nu);\n      return bothObjects ? deepMerge(old, nu) : nu;\n    };\n    const baseMerge = merger => {\n      return (...objects) => {\n        if (objects.length === 0) {\n          throw new Error(`Can't merge zero objects`);\n        }\n        const ret = {};\n        for (let j = 0; j < objects.length; j++) {\n          const curObject = objects[j];\n          for (const key in curObject) {\n            if (has$2(curObject, key)) {\n              ret[key] = merger(ret[key], curObject[key]);\n            }\n          }\n        }\n        return ret;\n      };\n    };\n    const deepMerge = baseMerge(deep);\n    const merge = baseMerge(shallow);\n\n    const required = () => ({\n      tag: 'required',\n      process: {}\n    });\n    const defaultedThunk = fallbackThunk => ({\n      tag: 'defaultedThunk',\n      process: fallbackThunk\n    });\n    const defaulted$1 = fallback => defaultedThunk(constant(fallback));\n    const asOption = () => ({\n      tag: 'option',\n      process: {}\n    });\n\n    const mergeValues = (values, base) => values.length > 0 ? SimpleResult.svalue(deepMerge(base, merge.apply(undefined, values))) : SimpleResult.svalue(base);\n    const mergeErrors = errors => compose(SimpleResult.serror, flatten)(errors);\n    const consolidateObj = (objects, base) => {\n      const partition = SimpleResult.partition(objects);\n      return partition.errors.length > 0 ? mergeErrors(partition.errors) : mergeValues(partition.values, base);\n    };\n    const consolidateArr = objects => {\n      const partitions = SimpleResult.partition(objects);\n      return partitions.errors.length > 0 ? mergeErrors(partitions.errors) : SimpleResult.svalue(partitions.values);\n    };\n    const ResultCombine = {\n      consolidateObj,\n      consolidateArr\n    };\n\n    const field$1 = (key, newKey, presence, prop) => ({\n      tag: 'field',\n      key,\n      newKey,\n      presence,\n      prop\n    });\n    const customField$1 = (newKey, instantiator) => ({\n      tag: 'custom',\n      newKey,\n      instantiator\n    });\n    const fold = (value, ifField, ifCustom) => {\n      switch (value.tag) {\n      case 'field':\n        return ifField(value.key, value.newKey, value.presence, value.prop);\n      case 'custom':\n        return ifCustom(value.newKey, value.instantiator);\n      }\n    };\n\n    const value = validator => {\n      const extract = (path, val) => {\n        return SimpleResult.bindError(validator(val), err => custom(path, err));\n      };\n      const toString = constant('val');\n      return {\n        extract,\n        toString\n      };\n    };\n    const anyValue$1 = value(SimpleResult.svalue);\n\n    const requiredAccess = (path, obj, key, bundle) => get$a(obj, key).fold(() => missingRequired(path, key, obj), bundle);\n    const fallbackAccess = (obj, key, fallback, bundle) => {\n      const v = get$a(obj, key).getOrThunk(() => fallback(obj));\n      return bundle(v);\n    };\n    const optionAccess = (obj, key, bundle) => bundle(get$a(obj, key));\n    const optionDefaultedAccess = (obj, key, fallback, bundle) => {\n      const opt = get$a(obj, key).map(val => val === true ? fallback(obj) : val);\n      return bundle(opt);\n    };\n    const extractField = (field, path, obj, key, prop) => {\n      const bundle = av => prop.extract(path.concat([key]), av);\n      const bundleAsOption = optValue => optValue.fold(() => SimpleResult.svalue(Optional.none()), ov => {\n        const result = prop.extract(path.concat([key]), ov);\n        return SimpleResult.map(result, Optional.some);\n      });\n      switch (field.tag) {\n      case 'required':\n        return requiredAccess(path, obj, key, bundle);\n      case 'defaultedThunk':\n        return fallbackAccess(obj, key, field.process, bundle);\n      case 'option':\n        return optionAccess(obj, key, bundleAsOption);\n      case 'defaultedOptionThunk':\n        return optionDefaultedAccess(obj, key, field.process, bundleAsOption);\n      case 'mergeWithThunk': {\n          return fallbackAccess(obj, key, constant({}), v => {\n            const result = deepMerge(field.process(obj), v);\n            return bundle(result);\n          });\n        }\n      }\n    };\n    const extractFields = (path, obj, fields) => {\n      const success = {};\n      const errors = [];\n      for (const field of fields) {\n        fold(field, (key, newKey, presence, prop) => {\n          const result = extractField(presence, path, obj, key, prop);\n          SimpleResult.fold(result, err => {\n            errors.push(...err);\n          }, res => {\n            success[newKey] = res;\n          });\n        }, (newKey, instantiator) => {\n          success[newKey] = instantiator(obj);\n        });\n      }\n      return errors.length > 0 ? SimpleResult.serror(errors) : SimpleResult.svalue(success);\n    };\n    const objOf = values => {\n      const extract = (path, o) => extractFields(path, o, values);\n      const toString = () => {\n        const fieldStrings = map$3(values, value => fold(value, (key, _okey, _presence, prop) => key + ' -> ' + prop.toString(), (newKey, _instantiator) => 'state(' + newKey + ')'));\n        return 'obj{\\n' + fieldStrings.join('\\n') + '}';\n      };\n      return {\n        extract,\n        toString\n      };\n    };\n    const arrOf = prop => {\n      const extract = (path, array) => {\n        const results = map$3(array, (a, i) => prop.extract(path.concat(['[' + i + ']']), a));\n        return ResultCombine.consolidateArr(results);\n      };\n      const toString = () => 'array(' + prop.toString() + ')';\n      return {\n        extract,\n        toString\n      };\n    };\n\n    const valueOf = validator => value(v => validator(v).fold(SimpleResult.serror, SimpleResult.svalue));\n    const extractValue = (label, prop, obj) => {\n      const res = prop.extract([label], obj);\n      return SimpleResult.mapError(res, errs => ({\n        input: obj,\n        errors: errs\n      }));\n    };\n    const asRaw = (label, prop, obj) => SimpleResult.toResult(extractValue(label, prop, obj));\n    const formatError = errInfo => {\n      return 'Errors: \\n' + formatErrors(errInfo.errors).join('\\n') + '\\n\\nInput object: ' + formatObj(errInfo.input);\n    };\n    const choose = (key, branches) => choose$1(key, map$2(branches, objOf));\n\n    const anyValue = constant(anyValue$1);\n    const typedValue = (validator, expectedType) => value(a => {\n      const actualType = typeof a;\n      return validator(a) ? SimpleResult.svalue(a) : SimpleResult.serror(`Expected type: ${ expectedType } but got: ${ actualType }`);\n    });\n    const number = typedValue(isNumber, 'number');\n    const string = typedValue(isString, 'string');\n    const boolean = typedValue(isBoolean, 'boolean');\n    const functionProcessor = typedValue(isFunction, 'function');\n\n    const field = field$1;\n    const customField = customField$1;\n    const validateEnum = values => valueOf(value => contains$2(values, value) ? Result.value(value) : Result.error(`Unsupported value: \"${ value }\", choose one of \"${ values.join(', ') }\".`));\n    const requiredOf = (key, schema) => field(key, key, required(), schema);\n    const requiredString = key => requiredOf(key, string);\n    const requiredFunction = key => requiredOf(key, functionProcessor);\n    const requiredArrayOf = (key, schema) => field(key, key, required(), arrOf(schema));\n    const optionOf = (key, schema) => field(key, key, asOption(), schema);\n    const optionString = key => optionOf(key, string);\n    const optionFunction = key => optionOf(key, functionProcessor);\n    const defaulted = (key, fallback) => field(key, key, defaulted$1(fallback), anyValue());\n    const defaultedOf = (key, fallback, schema) => field(key, key, defaulted$1(fallback), schema);\n    const defaultedNumber = (key, fallback) => defaultedOf(key, fallback, number);\n    const defaultedString = (key, fallback) => defaultedOf(key, fallback, string);\n    const defaultedStringEnum = (key, fallback, values) => defaultedOf(key, fallback, validateEnum(values));\n    const defaultedBoolean = (key, fallback) => defaultedOf(key, fallback, boolean);\n    const defaultedFunction = (key, fallback) => defaultedOf(key, fallback, functionProcessor);\n    const defaultedArrayOf = (key, fallback, schema) => defaultedOf(key, fallback, arrOf(schema));\n\n    const type = requiredString('type');\n    const fetch$1 = requiredFunction('fetch');\n    const onAction = requiredFunction('onAction');\n    const onSetup = defaultedFunction('onSetup', () => noop);\n    const optionalText = optionString('text');\n    const optionalIcon = optionString('icon');\n    const optionalTooltip = optionString('tooltip');\n    const optionalLabel = optionString('label');\n    const active = defaultedBoolean('active', false);\n    const enabled = defaultedBoolean('enabled', true);\n    const primary = defaultedBoolean('primary', false);\n    const defaultedColumns = num => defaulted('columns', num);\n    const defaultedType = type => defaultedString('type', type);\n\n    const autocompleterSchema = objOf([\n      type,\n      requiredString('trigger'),\n      defaultedNumber('minChars', 1),\n      defaultedColumns(1),\n      defaultedNumber('maxResults', 10),\n      optionFunction('matches'),\n      fetch$1,\n      onAction,\n      defaultedArrayOf('highlightOn', [], string)\n    ]);\n    const createAutocompleter = spec => asRaw('Autocompleter', autocompleterSchema, spec);\n\n    const baseToolbarButtonFields = [\n      enabled,\n      optionalTooltip,\n      optionalIcon,\n      optionalText,\n      onSetup\n    ];\n\n    const baseToolbarToggleButtonFields = [active].concat(baseToolbarButtonFields);\n\n    const contextBarFields = [\n      defaultedFunction('predicate', never),\n      defaultedStringEnum('scope', 'node', [\n        'node',\n        'editor'\n      ]),\n      defaultedStringEnum('position', 'selection', [\n        'node',\n        'selection',\n        'line'\n      ])\n    ];\n\n    const contextButtonFields = baseToolbarButtonFields.concat([\n      defaultedType('contextformbutton'),\n      primary,\n      onAction,\n      customField('original', identity)\n    ]);\n    const contextToggleButtonFields = baseToolbarToggleButtonFields.concat([\n      defaultedType('contextformbutton'),\n      primary,\n      onAction,\n      customField('original', identity)\n    ]);\n    const launchButtonFields = baseToolbarButtonFields.concat([defaultedType('contextformbutton')]);\n    const launchToggleButtonFields = baseToolbarToggleButtonFields.concat([defaultedType('contextformtogglebutton')]);\n    const toggleOrNormal = choose('type', {\n      contextformbutton: contextButtonFields,\n      contextformtogglebutton: contextToggleButtonFields\n    });\n    objOf([\n      defaultedType('contextform'),\n      defaultedFunction('initValue', constant('')),\n      optionalLabel,\n      requiredArrayOf('commands', toggleOrNormal),\n      optionOf('launch', choose('type', {\n        contextformbutton: launchButtonFields,\n        contextformtogglebutton: launchToggleButtonFields\n      }))\n    ].concat(contextBarFields));\n\n    const register$2 = editor => {\n      const popups = editor.ui.registry.getAll().popups;\n      const dataset = map$2(popups, popup => createAutocompleter(popup).fold(err => {\n        throw new Error(formatError(err));\n      }, identity));\n      const triggers = stringArray(mapToArray(dataset, v => v.trigger));\n      const datasetValues = values(dataset);\n      const lookupByTrigger = trigger => filter$5(datasetValues, dv => dv.trigger === trigger);\n      return {\n        dataset,\n        triggers,\n        lookupByTrigger\n      };\n    };\n\n    const setupEditorInput = (editor, api) => {\n      const update = last(api.load, 50);\n      editor.on('input', () => {\n        update.throttle();\n      });\n      editor.on('keydown', e => {\n        const keyCode = e.which;\n        if (keyCode === 8) {\n          update.throttle();\n        } else if (keyCode === 27) {\n          api.cancelIfNecessary();\n        } else if (keyCode === 38 || keyCode === 40) {\n          update.cancel();\n        }\n      });\n      editor.on('remove', update.cancel);\n    };\n    const setup$k = editor => {\n      const activeAutocompleter = value$2();\n      const uiActive = Cell(false);\n      const isActive = activeAutocompleter.isSet;\n      const cancelIfNecessary = () => {\n        if (isActive()) {\n          fireAutocompleterEnd(editor);\n          uiActive.set(false);\n          activeAutocompleter.clear();\n        }\n      };\n      const commenceIfNecessary = context => {\n        if (!isActive() && !editor.composing) {\n          activeAutocompleter.set({\n            trigger: context.trigger,\n            matchLength: context.text.length\n          });\n        }\n      };\n      const getAutocompleters = cached(() => register$2(editor));\n      const doLookup = fetchOptions => activeAutocompleter.get().map(ac => getContext(editor.dom, editor.selection.getRng(), ac.trigger, true).bind(newContext => lookupWithContext(editor, getAutocompleters, newContext, fetchOptions))).getOrThunk(() => lookup(editor, getAutocompleters));\n      const load = fetchOptions => {\n        doLookup(fetchOptions).fold(cancelIfNecessary, lookupInfo => {\n          commenceIfNecessary(lookupInfo.context);\n          lookupInfo.lookupData.then(lookupData => {\n            activeAutocompleter.get().map(ac => {\n              const context = lookupInfo.context;\n              if (ac.trigger === context.trigger) {\n                if (context.text.length - ac.matchLength >= 10) {\n                  cancelIfNecessary();\n                } else {\n                  activeAutocompleter.set({\n                    ...ac,\n                    matchLength: context.text.length\n                  });\n                  if (uiActive.get()) {\n                    fireAutocompleterUpdateActiveRange(editor, { range: context.range });\n                    fireAutocompleterUpdate(editor, { lookupData });\n                  } else {\n                    uiActive.set(true);\n                    fireAutocompleterUpdateActiveRange(editor, { range: context.range });\n                    fireAutocompleterStart(editor, { lookupData });\n                  }\n                }\n              }\n            });\n          });\n        });\n      };\n      const isRangeInsideOrEqual = (innerRange, outerRange) => {\n        const startComparison = innerRange.compareBoundaryPoints(window.Range.START_TO_START, outerRange);\n        const endComparison = innerRange.compareBoundaryPoints(window.Range.END_TO_END, outerRange);\n        return startComparison >= 0 && endComparison <= 0;\n      };\n      const readActiveRange = () => {\n        return activeAutocompleter.get().bind(({trigger}) => {\n          const selRange = editor.selection.getRng();\n          return getContext(editor.dom, selRange, trigger, uiActive.get()).filter(({range}) => isRangeInsideOrEqual(selRange, range)).map(({range}) => range);\n        });\n      };\n      editor.addCommand('mceAutocompleterReload', (_ui, value) => {\n        const fetchOptions = isObject(value) ? value.fetchOptions : {};\n        load(fetchOptions);\n      });\n      editor.addCommand('mceAutocompleterClose', cancelIfNecessary);\n      editor.addCommand('mceAutocompleterRefreshActiveRange', () => {\n        readActiveRange().each(range => {\n          fireAutocompleterUpdateActiveRange(editor, { range });\n        });\n      });\n      editor.editorCommands.addQueryStateHandler('mceAutoCompleterInRange', () => readActiveRange().isSome());\n      setupEditorInput(editor, {\n        cancelIfNecessary,\n        load\n      });\n    };\n\n    const browser$1 = detect$1().browser;\n    const isSafari = browser$1.isSafari();\n    const emptyNodeContents = node => fillWithPaddingBr(SugarElement.fromDom(node));\n    const isEntireNodeSelected = (rng, node) => {\n      var _a;\n      return rng.startOffset === 0 && rng.endOffset === ((_a = node.textContent) === null || _a === void 0 ? void 0 : _a.length);\n    };\n    const getParentDetailsElementAtPos = (dom, pos) => Optional.from(dom.getParent(pos.container(), 'details'));\n    const isInDetailsElement = (dom, pos) => getParentDetailsElementAtPos(dom, pos).isSome();\n    const getDetailsElements = (dom, rng) => {\n      const startDetails = Optional.from(dom.getParent(rng.startContainer, 'details'));\n      const endDetails = Optional.from(dom.getParent(rng.endContainer, 'details'));\n      if (startDetails.isSome() || endDetails.isSome()) {\n        const startSummary = startDetails.bind(details => Optional.from(dom.select('summary', details)[0]));\n        return Optional.some({\n          startSummary,\n          startDetails,\n          endDetails\n        });\n      } else {\n        return Optional.none();\n      }\n    };\n    const isCaretInTheBeginningOf = (caretPos, element) => firstPositionIn(element).exists(pos => pos.isEqual(caretPos));\n    const isCaretInTheEndOf = (caretPos, element) => {\n      return lastPositionIn(element).exists(pos => {\n        if (isBr$6(pos.getNode())) {\n          return prevPosition(element, pos).exists(pos2 => pos2.isEqual(caretPos)) || pos.isEqual(caretPos);\n        } else {\n          return pos.isEqual(caretPos);\n        }\n      });\n    };\n    const isCaretAtStartOfSummary = (caretPos, detailsElements) => detailsElements.startSummary.exists(summary => isCaretInTheBeginningOf(caretPos, summary));\n    const isCaretAtEndOfSummary = (caretPos, detailsElements) => detailsElements.startSummary.exists(summary => isCaretInTheEndOf(caretPos, summary));\n    const isCaretInFirstPositionInBody = (caretPos, detailsElements) => detailsElements.startDetails.exists(details => prevPosition(details, caretPos).forall(pos => detailsElements.startSummary.exists(summary => !summary.contains(caretPos.container()) && summary.contains(pos.container()))));\n    const isCaretInLastPositionInBody = (root, caretPos, detailsElements) => detailsElements.startDetails.exists(details => nextPosition(root, caretPos).forall(pos => !details.contains(pos.container())));\n    const setCaretToPosition = (editor, position) => {\n      const node = position.getNode();\n      if (!isUndefined(node)) {\n        editor.selection.setCursorLocation(node, position.offset());\n      }\n    };\n    const moveCaretToDetailsPos = (editor, pos, forward) => {\n      const details = editor.dom.getParent(pos.container(), 'details');\n      if (details && !details.open) {\n        const summary = editor.dom.select('summary', details)[0];\n        if (summary) {\n          const newPos = forward ? firstPositionIn(summary) : lastPositionIn(summary);\n          newPos.each(pos => setCaretToPosition(editor, pos));\n        }\n      } else {\n        setCaretToPosition(editor, pos);\n      }\n    };\n    const isPartialDelete = (rng, detailsElements) => {\n      const containsStart = element => element.contains(rng.startContainer);\n      const containsEnd = element => element.contains(rng.endContainer);\n      const startInSummary = detailsElements.startSummary.exists(containsStart);\n      const endInSummary = detailsElements.startSummary.exists(containsEnd);\n      const isPartiallySelectedDetailsElements = detailsElements.startDetails.forall(startDetails => detailsElements.endDetails.forall(endDetails => startDetails !== endDetails));\n      const isInPartiallySelectedSummary = (startInSummary || endInSummary) && !(startInSummary && endInSummary);\n      return isInPartiallySelectedSummary || isPartiallySelectedDetailsElements;\n    };\n    const shouldPreventDeleteIntoDetails = (editor, forward, granularity) => {\n      const {dom, selection} = editor;\n      const root = editor.getBody();\n      if (granularity === 'character') {\n        const caretPos = CaretPosition.fromRangeStart(selection.getRng());\n        const parentBlock = dom.getParent(caretPos.container(), dom.isBlock);\n        const parentDetailsAtCaret = getParentDetailsElementAtPos(dom, caretPos);\n        const inEmptyParentBlock = parentBlock && dom.isEmpty(parentBlock);\n        const isFirstBlock = isNull(parentBlock === null || parentBlock === void 0 ? void 0 : parentBlock.previousSibling);\n        const isLastBlock = isNull(parentBlock === null || parentBlock === void 0 ? void 0 : parentBlock.nextSibling);\n        if (inEmptyParentBlock) {\n          const firstOrLast = forward ? isLastBlock : isFirstBlock;\n          if (firstOrLast) {\n            const isBeforeAfterDetails = navigate(!forward, root, caretPos).exists(pos => {\n              return isInDetailsElement(dom, pos) && !equals(parentDetailsAtCaret, getParentDetailsElementAtPos(dom, pos));\n            });\n            if (isBeforeAfterDetails) {\n              return true;\n            }\n          }\n        }\n        return navigate(forward, root, caretPos).fold(never, pos => {\n          const parentDetailsAtNewPos = getParentDetailsElementAtPos(dom, pos);\n          if (isInDetailsElement(dom, pos) && !equals(parentDetailsAtCaret, parentDetailsAtNewPos)) {\n            if (!forward) {\n              moveCaretToDetailsPos(editor, pos, false);\n            }\n            if (parentBlock && inEmptyParentBlock) {\n              if (forward && isFirstBlock) {\n                return true;\n              } else if (!forward && isLastBlock) {\n                return true;\n              }\n              moveCaretToDetailsPos(editor, pos, forward);\n              editor.dom.remove(parentBlock);\n            }\n            return true;\n          } else {\n            return false;\n          }\n        });\n      } else {\n        return false;\n      }\n    };\n    const shouldPreventDeleteSummaryAction = (editor, detailElements, forward, granularity) => {\n      const selection = editor.selection;\n      const rng = selection.getRng();\n      const caretPos = CaretPosition.fromRangeStart(rng);\n      const root = editor.getBody();\n      if (granularity === 'selection') {\n        return isPartialDelete(rng, detailElements);\n      } else if (forward) {\n        return isCaretAtEndOfSummary(caretPos, detailElements) || isCaretInLastPositionInBody(root, caretPos, detailElements);\n      } else {\n        return isCaretAtStartOfSummary(caretPos, detailElements) || isCaretInFirstPositionInBody(caretPos, detailElements);\n      }\n    };\n    const shouldPreventDeleteAction = (editor, forward, granularity) => getDetailsElements(editor.dom, editor.selection.getRng()).fold(() => shouldPreventDeleteIntoDetails(editor, forward, granularity), detailsElements => shouldPreventDeleteSummaryAction(editor, detailsElements, forward, granularity) || shouldPreventDeleteIntoDetails(editor, forward, granularity));\n    const handleDeleteActionSafari = (editor, forward, granularity) => {\n      const selection = editor.selection;\n      const node = selection.getNode();\n      const rng = selection.getRng();\n      const caretPos = CaretPosition.fromRangeStart(rng);\n      if (isSummary$1(node)) {\n        if (granularity === 'selection' && isEntireNodeSelected(rng, node) || willDeleteLastPositionInElement(forward, caretPos, node)) {\n          emptyNodeContents(node);\n        } else {\n          editor.undoManager.transact(() => {\n            const sel = selection.getSel();\n            let {anchorNode, anchorOffset, focusNode, focusOffset} = sel !== null && sel !== void 0 ? sel : {};\n            const applySelection = () => {\n              if (isNonNullable(anchorNode) && isNonNullable(anchorOffset) && isNonNullable(focusNode) && isNonNullable(focusOffset)) {\n                sel === null || sel === void 0 ? void 0 : sel.setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset);\n              }\n            };\n            const updateSelection = () => {\n              anchorNode = sel === null || sel === void 0 ? void 0 : sel.anchorNode;\n              anchorOffset = sel === null || sel === void 0 ? void 0 : sel.anchorOffset;\n              focusNode = sel === null || sel === void 0 ? void 0 : sel.focusNode;\n              focusOffset = sel === null || sel === void 0 ? void 0 : sel.focusOffset;\n            };\n            const appendAllChildNodes = (from, to) => {\n              each$e(from.childNodes, child => {\n                if (isNode(child)) {\n                  to.appendChild(child);\n                }\n              });\n            };\n            const container = editor.dom.create('span', { 'data-mce-bogus': '1' });\n            appendAllChildNodes(node, container);\n            node.appendChild(container);\n            applySelection();\n            if (granularity === 'word' || granularity === 'line') {\n              sel === null || sel === void 0 ? void 0 : sel.modify('extend', forward ? 'right' : 'left', granularity);\n            }\n            if (!selection.isCollapsed() && isEntireNodeSelected(selection.getRng(), container)) {\n              emptyNodeContents(node);\n            } else {\n              editor.execCommand(forward ? 'ForwardDelete' : 'Delete');\n              updateSelection();\n              appendAllChildNodes(container, node);\n              applySelection();\n            }\n            editor.dom.remove(container);\n          });\n        }\n        return true;\n      } else {\n        return false;\n      }\n    };\n    const backspaceDelete = (editor, forward, granularity) => shouldPreventDeleteAction(editor, forward, granularity) || isSafari && handleDeleteActionSafari(editor, forward, granularity) ? Optional.some(noop) : Optional.none();\n\n    const createAndFireInputEvent = eventType => (editor, inputType, specifics = {}) => {\n      const target = editor.getBody();\n      const overrides = {\n        bubbles: true,\n        composed: true,\n        data: null,\n        isComposing: false,\n        detail: 0,\n        view: null,\n        target,\n        currentTarget: target,\n        eventPhase: Event.AT_TARGET,\n        originalTarget: target,\n        explicitOriginalTarget: target,\n        isTrusted: false,\n        srcElement: target,\n        cancelable: false,\n        preventDefault: noop,\n        inputType\n      };\n      const input = clone$3(new InputEvent(eventType));\n      return editor.dispatch(eventType, {\n        ...input,\n        ...overrides,\n        ...specifics\n      });\n    };\n    const fireInputEvent = createAndFireInputEvent('input');\n    const fireBeforeInputEvent = createAndFireInputEvent('beforeinput');\n\n    const platform$2 = detect$1();\n    const os = platform$2.os;\n    const isMacOSOriOS = os.isMacOS() || os.isiOS();\n    const browser = platform$2.browser;\n    const isFirefox = browser.isFirefox();\n    const executeKeydownOverride$3 = (editor, caret, evt) => {\n      const inputType = evt.keyCode === VK.BACKSPACE ? 'deleteContentBackward' : 'deleteContentForward';\n      const isCollapsed = editor.selection.isCollapsed();\n      const unmodifiedGranularity = isCollapsed ? 'character' : 'selection';\n      const getModifiedGranularity = isWord => {\n        if (isCollapsed) {\n          return isWord ? 'word' : 'line';\n        } else {\n          return 'selection';\n        }\n      };\n      executeWithDelayedAction([\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(backspaceDelete$1, editor)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(backspaceDelete$6, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete$6, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(backspaceDelete$7, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete$7, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(backspaceDelete$4, editor, caret, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete$4, editor, caret, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(backspaceDelete$a, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete$a, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(backspaceDelete, editor, false, unmodifiedGranularity)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete, editor, true, unmodifiedGranularity)\n        },\n        ...isMacOSOriOS ? [\n          {\n            keyCode: VK.BACKSPACE,\n            altKey: true,\n            action: action(backspaceDelete, editor, false, getModifiedGranularity(true))\n          },\n          {\n            keyCode: VK.DELETE,\n            altKey: true,\n            action: action(backspaceDelete, editor, true, getModifiedGranularity(true))\n          },\n          {\n            keyCode: VK.BACKSPACE,\n            metaKey: true,\n            action: action(backspaceDelete, editor, false, getModifiedGranularity(false))\n          }\n        ] : [\n          {\n            keyCode: VK.BACKSPACE,\n            ctrlKey: true,\n            action: action(backspaceDelete, editor, false, getModifiedGranularity(true))\n          },\n          {\n            keyCode: VK.DELETE,\n            ctrlKey: true,\n            action: action(backspaceDelete, editor, true, getModifiedGranularity(true))\n          }\n        ],\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(backspaceDelete$5, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete$5, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(backspaceDelete$2, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete$2, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(backspaceDelete$8, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete$8, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(backspaceDelete$9, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete$9, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(backspaceDelete$3, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete$3, editor, true)\n        }\n      ], evt).filter(_ => editor.selection.isEditable()).each(applyAction => {\n        evt.preventDefault();\n        const beforeInput = fireBeforeInputEvent(editor, inputType);\n        if (!beforeInput.isDefaultPrevented()) {\n          applyAction();\n          fireInputEvent(editor, inputType);\n        }\n      });\n    };\n    const executeKeyupOverride = (editor, evt, isBackspaceKeydown) => execute([\n      {\n        keyCode: VK.BACKSPACE,\n        action: action(paddEmptyElement, editor)\n      },\n      {\n        keyCode: VK.DELETE,\n        action: action(paddEmptyElement, editor)\n      },\n      ...isMacOSOriOS ? [\n        {\n          keyCode: VK.BACKSPACE,\n          altKey: true,\n          action: action(refreshCaret, editor)\n        },\n        {\n          keyCode: VK.DELETE,\n          altKey: true,\n          action: action(refreshCaret, editor)\n        },\n        ...isBackspaceKeydown ? [{\n            keyCode: isFirefox ? 224 : 91,\n            action: action(refreshCaret, editor)\n          }] : []\n      ] : [\n        {\n          keyCode: VK.BACKSPACE,\n          ctrlKey: true,\n          action: action(refreshCaret, editor)\n        },\n        {\n          keyCode: VK.DELETE,\n          ctrlKey: true,\n          action: action(refreshCaret, editor)\n        }\n      ]\n    ], evt);\n    const setup$j = (editor, caret) => {\n      let isBackspaceKeydown = false;\n      editor.on('keydown', evt => {\n        isBackspaceKeydown = evt.keyCode === VK.BACKSPACE;\n        if (!evt.isDefaultPrevented()) {\n          executeKeydownOverride$3(editor, caret, evt);\n        }\n      });\n      editor.on('keyup', evt => {\n        if (!evt.isDefaultPrevented()) {\n          executeKeyupOverride(editor, evt, isBackspaceKeydown);\n        }\n        isBackspaceKeydown = false;\n      });\n    };\n\n    const firstNonWhiteSpaceNodeSibling = node => {\n      while (node) {\n        if (isElement$6(node) || isText$b(node) && node.data && /[\\r\\n\\s]/.test(node.data)) {\n          return node;\n        }\n        node = node.nextSibling;\n      }\n      return null;\n    };\n    const moveToCaretPosition = (editor, root) => {\n      const dom = editor.dom;\n      const moveCaretBeforeOnEnterElementsMap = editor.schema.getMoveCaretBeforeOnEnterElements();\n      if (!root) {\n        return;\n      }\n      if (/^(LI|DT|DD)$/.test(root.nodeName)) {\n        const firstChild = firstNonWhiteSpaceNodeSibling(root.firstChild);\n        if (firstChild && /^(UL|OL|DL)$/.test(firstChild.nodeName)) {\n          root.insertBefore(dom.doc.createTextNode(nbsp), root.firstChild);\n        }\n      }\n      const rng = dom.createRng();\n      root.normalize();\n      if (root.hasChildNodes()) {\n        const walker = new DomTreeWalker(root, root);\n        let lastNode = root;\n        let node;\n        while (node = walker.current()) {\n          if (isText$b(node)) {\n            rng.setStart(node, 0);\n            rng.setEnd(node, 0);\n            break;\n          }\n          if (moveCaretBeforeOnEnterElementsMap[node.nodeName.toLowerCase()]) {\n            rng.setStartBefore(node);\n            rng.setEndBefore(node);\n            break;\n          }\n          lastNode = node;\n          node = walker.next();\n        }\n        if (!node) {\n          rng.setStart(lastNode, 0);\n          rng.setEnd(lastNode, 0);\n        }\n      } else {\n        if (isBr$6(root)) {\n          if (root.nextSibling && dom.isBlock(root.nextSibling)) {\n            rng.setStartBefore(root);\n            rng.setEndBefore(root);\n          } else {\n            rng.setStartAfter(root);\n            rng.setEndAfter(root);\n          }\n        } else {\n          rng.setStart(root, 0);\n          rng.setEnd(root, 0);\n        }\n      }\n      editor.selection.setRng(rng);\n      scrollRangeIntoView(editor, rng);\n    };\n    const getEditableRoot = (dom, node) => {\n      const root = dom.getRoot();\n      let editableRoot;\n      let parent = node;\n      while (parent !== root && parent && dom.getContentEditable(parent) !== 'false') {\n        if (dom.getContentEditable(parent) === 'true') {\n          editableRoot = parent;\n          break;\n        }\n        parent = parent.parentNode;\n      }\n      return parent !== root ? editableRoot : root;\n    };\n    const getParentBlock$1 = editor => {\n      return Optional.from(editor.dom.getParent(editor.selection.getStart(true), editor.dom.isBlock));\n    };\n    const getParentBlockName = editor => {\n      return getParentBlock$1(editor).fold(constant(''), parentBlock => {\n        return parentBlock.nodeName.toUpperCase();\n      });\n    };\n    const isListItemParentBlock = editor => {\n      return getParentBlock$1(editor).filter(elm => {\n        return isListItem$1(SugarElement.fromDom(elm));\n      }).isSome();\n    };\n    const emptyBlock = elm => {\n      elm.innerHTML = '<br data-mce-bogus=\"1\">';\n    };\n    const applyAttributes = (editor, node, forcedRootBlockAttrs) => {\n      const dom = editor.dom;\n      Optional.from(forcedRootBlockAttrs.style).map(dom.parseStyle).each(attrStyles => {\n        const currentStyles = getAllRaw(SugarElement.fromDom(node));\n        const newStyles = {\n          ...currentStyles,\n          ...attrStyles\n        };\n        dom.setStyles(node, newStyles);\n      });\n      const attrClassesOpt = Optional.from(forcedRootBlockAttrs.class).map(attrClasses => attrClasses.split(/\\s+/));\n      const currentClassesOpt = Optional.from(node.className).map(currentClasses => filter$5(currentClasses.split(/\\s+/), clazz => clazz !== ''));\n      lift2(attrClassesOpt, currentClassesOpt, (attrClasses, currentClasses) => {\n        const filteredClasses = filter$5(currentClasses, clazz => !contains$2(attrClasses, clazz));\n        const newClasses = [\n          ...attrClasses,\n          ...filteredClasses\n        ];\n        dom.setAttrib(node, 'class', newClasses.join(' '));\n      });\n      const appliedAttrs = [\n        'style',\n        'class'\n      ];\n      const remainingAttrs = filter$4(forcedRootBlockAttrs, (_, attrs) => !contains$2(appliedAttrs, attrs));\n      dom.setAttribs(node, remainingAttrs);\n    };\n    const setForcedBlockAttrs = (editor, node) => {\n      const forcedRootBlockName = getForcedRootBlock(editor);\n      if (forcedRootBlockName.toLowerCase() === node.tagName.toLowerCase()) {\n        const forcedRootBlockAttrs = getForcedRootBlockAttrs(editor);\n        applyAttributes(editor, node, forcedRootBlockAttrs);\n      }\n    };\n    const createNewBlock = (editor, container, parentBlock, editableRoot, keepStyles = true, name, styles) => {\n      const dom = editor.dom;\n      const schema = editor.schema;\n      const newBlockName = getForcedRootBlock(editor);\n      const parentBlockName = parentBlock ? parentBlock.nodeName.toUpperCase() : '';\n      let node = container;\n      const textInlineElements = schema.getTextInlineElements();\n      let block;\n      if (name || parentBlockName === 'TABLE' || parentBlockName === 'HR') {\n        block = dom.create(name || newBlockName, styles || {});\n      } else {\n        block = parentBlock.cloneNode(false);\n      }\n      let caretNode = block;\n      if (!keepStyles) {\n        dom.setAttrib(block, 'style', null);\n        dom.setAttrib(block, 'class', null);\n      } else {\n        do {\n          if (textInlineElements[node.nodeName]) {\n            if (isCaretNode(node) || isBookmarkNode$1(node)) {\n              continue;\n            }\n            const clonedNode = node.cloneNode(false);\n            dom.setAttrib(clonedNode, 'id', '');\n            if (block.hasChildNodes()) {\n              clonedNode.appendChild(block.firstChild);\n              block.appendChild(clonedNode);\n            } else {\n              caretNode = clonedNode;\n              block.appendChild(clonedNode);\n            }\n          }\n        } while ((node = node.parentNode) && node !== editableRoot);\n      }\n      setForcedBlockAttrs(editor, block);\n      emptyBlock(caretNode);\n      return block;\n    };\n\n    const getDetailsRoot = (editor, element) => editor.dom.getParent(element, isDetails);\n    const isAtDetailsEdge = (root, element, isTextBlock) => {\n      let node = element;\n      while (node && node !== root && isNull(node.nextSibling)) {\n        const parent = node.parentElement;\n        if (!parent || !isTextBlock(parent)) {\n          return isDetails(parent);\n        }\n        node = parent;\n      }\n      return false;\n    };\n    const isLastEmptyBlockInDetails = (editor, shiftKey, element) => !shiftKey && element.nodeName.toLowerCase() === getForcedRootBlock(editor) && editor.dom.isEmpty(element) && isAtDetailsEdge(editor.getBody(), element, el => has$2(editor.schema.getTextBlockElements(), el.nodeName.toLowerCase()));\n    const insertNewLine = (editor, createNewBlock, parentBlock) => {\n      var _a, _b, _c;\n      const newBlock = createNewBlock(getForcedRootBlock(editor));\n      const root = getDetailsRoot(editor, parentBlock);\n      if (!root) {\n        return;\n      }\n      editor.dom.insertAfter(newBlock, root);\n      moveToCaretPosition(editor, newBlock);\n      if (((_c = (_b = (_a = parentBlock.parentElement) === null || _a === void 0 ? void 0 : _a.childNodes) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0) > 1) {\n        editor.dom.remove(parentBlock);\n      }\n    };\n\n    const hasFirstChild = (elm, name) => {\n      return elm.firstChild && elm.firstChild.nodeName === name;\n    };\n    const isFirstChild = elm => {\n      var _a;\n      return ((_a = elm.parentNode) === null || _a === void 0 ? void 0 : _a.firstChild) === elm;\n    };\n    const hasParent = (elm, parentName) => {\n      const parentNode = elm === null || elm === void 0 ? void 0 : elm.parentNode;\n      return isNonNullable(parentNode) && parentNode.nodeName === parentName;\n    };\n    const isListBlock = elm => {\n      return isNonNullable(elm) && /^(OL|UL|LI)$/.test(elm.nodeName);\n    };\n    const isListItem = elm => {\n      return isNonNullable(elm) && /^(LI|DT|DD)$/.test(elm.nodeName);\n    };\n    const isNestedList = elm => {\n      return isListBlock(elm) && isListBlock(elm.parentNode);\n    };\n    const getContainerBlock = containerBlock => {\n      const containerBlockParent = containerBlock.parentNode;\n      return isListItem(containerBlockParent) ? containerBlockParent : containerBlock;\n    };\n    const isFirstOrLastLi = (containerBlock, parentBlock, first) => {\n      let node = containerBlock[first ? 'firstChild' : 'lastChild'];\n      while (node) {\n        if (isElement$6(node)) {\n          break;\n        }\n        node = node[first ? 'nextSibling' : 'previousSibling'];\n      }\n      return node === parentBlock;\n    };\n    const getStyles = elm => foldl(mapToArray(getAllRaw(SugarElement.fromDom(elm)), (style, styleName) => `${ styleName }: ${ style };`), (acc, s) => acc + s, '');\n    const insert$4 = (editor, createNewBlock, containerBlock, parentBlock, newBlockName) => {\n      const dom = editor.dom;\n      const rng = editor.selection.getRng();\n      const containerParent = containerBlock.parentNode;\n      if (containerBlock === editor.getBody() || !containerParent) {\n        return;\n      }\n      if (isNestedList(containerBlock)) {\n        newBlockName = 'LI';\n      }\n      const parentBlockStyles = isListItem(parentBlock) ? getStyles(parentBlock) : undefined;\n      let newBlock = isListItem(parentBlock) && parentBlockStyles ? createNewBlock(newBlockName, { style: getStyles(parentBlock) }) : createNewBlock(newBlockName);\n      if (isFirstOrLastLi(containerBlock, parentBlock, true) && isFirstOrLastLi(containerBlock, parentBlock, false)) {\n        if (hasParent(containerBlock, 'LI')) {\n          const containerBlockParent = getContainerBlock(containerBlock);\n          dom.insertAfter(newBlock, containerBlockParent);\n          if (isFirstChild(containerBlock)) {\n            dom.remove(containerBlockParent);\n          } else {\n            dom.remove(containerBlock);\n          }\n        } else {\n          dom.replace(newBlock, containerBlock);\n        }\n      } else if (isFirstOrLastLi(containerBlock, parentBlock, true)) {\n        if (hasParent(containerBlock, 'LI')) {\n          dom.insertAfter(newBlock, getContainerBlock(containerBlock));\n          newBlock.appendChild(dom.doc.createTextNode(' '));\n          newBlock.appendChild(containerBlock);\n        } else {\n          containerParent.insertBefore(newBlock, containerBlock);\n        }\n        dom.remove(parentBlock);\n      } else if (isFirstOrLastLi(containerBlock, parentBlock, false)) {\n        dom.insertAfter(newBlock, getContainerBlock(containerBlock));\n        dom.remove(parentBlock);\n      } else {\n        containerBlock = getContainerBlock(containerBlock);\n        const tmpRng = rng.cloneRange();\n        tmpRng.setStartAfter(parentBlock);\n        tmpRng.setEndAfter(containerBlock);\n        const fragment = tmpRng.extractContents();\n        if (newBlockName === 'LI' && hasFirstChild(fragment, 'LI')) {\n          const previousChildren = filter$5(map$3(newBlock.children, SugarElement.fromDom), not(isTag('br')));\n          newBlock = fragment.firstChild;\n          dom.insertAfter(fragment, containerBlock);\n          each$e(previousChildren, child => prepend(SugarElement.fromDom(newBlock), child));\n          if (parentBlockStyles) {\n            newBlock.setAttribute('style', parentBlockStyles);\n          }\n        } else {\n          dom.insertAfter(fragment, containerBlock);\n          dom.insertAfter(newBlock, containerBlock);\n        }\n        dom.remove(parentBlock);\n      }\n      moveToCaretPosition(editor, newBlock);\n    };\n\n    const trimZwsp = fragment => {\n      each$e(descendants$1(SugarElement.fromDom(fragment), isText$c), text => {\n        const rawNode = text.dom;\n        rawNode.nodeValue = trim$2(rawNode.data);\n      });\n    };\n    const isWithinNonEditableList = (editor, node) => {\n      const parentList = editor.dom.getParent(node, 'ol,ul,dl');\n      return parentList !== null && editor.dom.getContentEditableParent(parentList) === 'false';\n    };\n    const isEmptyAnchor = (dom, elm) => {\n      return elm && elm.nodeName === 'A' && dom.isEmpty(elm);\n    };\n    const containerAndSiblingName = (container, nodeName) => {\n      return container.nodeName === nodeName || container.previousSibling && container.previousSibling.nodeName === nodeName;\n    };\n    const canSplitBlock = (dom, node) => {\n      return isNonNullable(node) && dom.isBlock(node) && !/^(TD|TH|CAPTION|FORM)$/.test(node.nodeName) && !/^(fixed|absolute)/i.test(node.style.position) && dom.isEditable(node.parentNode) && dom.getContentEditable(node) !== 'false';\n    };\n    const trimInlineElementsOnLeftSideOfBlock = (dom, nonEmptyElementsMap, block) => {\n      var _a;\n      const firstChilds = [];\n      if (!block) {\n        return;\n      }\n      let currentNode = block;\n      while (currentNode = currentNode.firstChild) {\n        if (dom.isBlock(currentNode)) {\n          return;\n        }\n        if (isElement$6(currentNode) && !nonEmptyElementsMap[currentNode.nodeName.toLowerCase()]) {\n          firstChilds.push(currentNode);\n        }\n      }\n      let i = firstChilds.length;\n      while (i--) {\n        currentNode = firstChilds[i];\n        if (!currentNode.hasChildNodes() || currentNode.firstChild === currentNode.lastChild && ((_a = currentNode.firstChild) === null || _a === void 0 ? void 0 : _a.nodeValue) === '') {\n          dom.remove(currentNode);\n        } else {\n          if (isEmptyAnchor(dom, currentNode)) {\n            dom.remove(currentNode);\n          }\n        }\n      }\n    };\n    const normalizeZwspOffset = (start, container, offset) => {\n      if (!isText$b(container)) {\n        return offset;\n      } else if (start) {\n        return offset === 1 && container.data.charAt(offset - 1) === ZWSP$1 ? 0 : offset;\n      } else {\n        return offset === container.data.length - 1 && container.data.charAt(offset) === ZWSP$1 ? container.data.length : offset;\n      }\n    };\n    const includeZwspInRange = rng => {\n      const newRng = rng.cloneRange();\n      newRng.setStart(rng.startContainer, normalizeZwspOffset(true, rng.startContainer, rng.startOffset));\n      newRng.setEnd(rng.endContainer, normalizeZwspOffset(false, rng.endContainer, rng.endOffset));\n      return newRng;\n    };\n    const trimLeadingLineBreaks = node => {\n      let currentNode = node;\n      do {\n        if (isText$b(currentNode)) {\n          currentNode.data = currentNode.data.replace(/^[\\r\\n]+/, '');\n        }\n        currentNode = currentNode.firstChild;\n      } while (currentNode);\n    };\n    const wrapSelfAndSiblingsInDefaultBlock = (editor, newBlockName, rng, container, offset) => {\n      var _a, _b;\n      const dom = editor.dom;\n      const editableRoot = (_a = getEditableRoot(dom, container)) !== null && _a !== void 0 ? _a : dom.getRoot();\n      let parentBlock = dom.getParent(container, dom.isBlock);\n      if (!parentBlock || !canSplitBlock(dom, parentBlock)) {\n        parentBlock = parentBlock || editableRoot;\n        if (!parentBlock.hasChildNodes()) {\n          const newBlock = dom.create(newBlockName);\n          setForcedBlockAttrs(editor, newBlock);\n          parentBlock.appendChild(newBlock);\n          rng.setStart(newBlock, 0);\n          rng.setEnd(newBlock, 0);\n          return newBlock;\n        }\n        let node = container;\n        while (node && node.parentNode !== parentBlock) {\n          node = node.parentNode;\n        }\n        let startNode;\n        while (node && !dom.isBlock(node)) {\n          startNode = node;\n          node = node.previousSibling;\n        }\n        const startNodeName = (_b = startNode === null || startNode === void 0 ? void 0 : startNode.parentElement) === null || _b === void 0 ? void 0 : _b.nodeName;\n        if (startNode && startNodeName && editor.schema.isValidChild(startNodeName, newBlockName.toLowerCase())) {\n          const startNodeParent = startNode.parentNode;\n          const newBlock = dom.create(newBlockName);\n          setForcedBlockAttrs(editor, newBlock);\n          startNodeParent.insertBefore(newBlock, startNode);\n          node = startNode;\n          while (node && !dom.isBlock(node)) {\n            const next = node.nextSibling;\n            newBlock.appendChild(node);\n            node = next;\n          }\n          rng.setStart(container, offset);\n          rng.setEnd(container, offset);\n        }\n      }\n      return container;\n    };\n    const addBrToBlockIfNeeded = (dom, block) => {\n      block.normalize();\n      const lastChild = block.lastChild;\n      if (!lastChild || isElement$6(lastChild) && /^(left|right)$/gi.test(dom.getStyle(lastChild, 'float', true))) {\n        dom.add(block, 'br');\n      }\n    };\n    const shouldEndContainer = (editor, container) => {\n      const optionValue = shouldEndContainerOnEmptyBlock(editor);\n      if (isNullable(container)) {\n        return false;\n      } else if (isString(optionValue)) {\n        return contains$2(Tools.explode(optionValue), container.nodeName.toLowerCase());\n      } else {\n        return optionValue;\n      }\n    };\n    const insert$3 = (editor, evt) => {\n      let container;\n      let offset;\n      let parentBlockName;\n      let containerBlock;\n      let isAfterLastNodeInContainer = false;\n      const dom = editor.dom;\n      const schema = editor.schema, nonEmptyElementsMap = schema.getNonEmptyElements();\n      const rng = editor.selection.getRng();\n      const newBlockName = getForcedRootBlock(editor);\n      const start = SugarElement.fromDom(rng.startContainer);\n      const child = child$1(start, rng.startOffset);\n      const isCef = child.exists(element => isHTMLElement$1(element) && !isEditable$2(element));\n      const collapsedAndCef = rng.collapsed && isCef;\n      const createNewBlock$1 = (name, styles) => {\n        return createNewBlock(editor, container, parentBlock, editableRoot, shouldKeepStyles(editor), name, styles);\n      };\n      const isCaretAtStartOrEndOfBlock = start => {\n        const normalizedOffset = normalizeZwspOffset(start, container, offset);\n        if (isText$b(container) && (start ? normalizedOffset > 0 : normalizedOffset < container.data.length)) {\n          return false;\n        }\n        if ((container.parentNode === parentBlock || container === parentBlock) && isAfterLastNodeInContainer && !start) {\n          return true;\n        }\n        if (start && isElement$6(container) && container === parentBlock.firstChild) {\n          return true;\n        }\n        if (containerAndSiblingName(container, 'TABLE') || containerAndSiblingName(container, 'HR')) {\n          return isAfterLastNodeInContainer && !start || !isAfterLastNodeInContainer && start;\n        }\n        const walker = new DomTreeWalker(container, parentBlock);\n        if (isText$b(container)) {\n          if (start && normalizedOffset === 0) {\n            walker.prev();\n          } else if (!start && normalizedOffset === container.data.length) {\n            walker.next();\n          }\n        }\n        let node;\n        while (node = walker.current()) {\n          if (isElement$6(node)) {\n            if (!node.getAttribute('data-mce-bogus')) {\n              const name = node.nodeName.toLowerCase();\n              if (nonEmptyElementsMap[name] && name !== 'br') {\n                return false;\n              }\n            }\n          } else if (isText$b(node) && !isWhitespaceText(node.data)) {\n            return false;\n          }\n          if (start) {\n            walker.prev();\n          } else {\n            walker.next();\n          }\n        }\n        return true;\n      };\n      const insertNewBlockAfter = () => {\n        let block;\n        if (/^(H[1-6]|PRE|FIGURE)$/.test(parentBlockName) && containerBlockName !== 'HGROUP') {\n          block = createNewBlock$1(newBlockName);\n        } else {\n          block = createNewBlock$1();\n        }\n        if (shouldEndContainer(editor, containerBlock) && canSplitBlock(dom, containerBlock) && dom.isEmpty(parentBlock, undefined, { includeZwsp: true })) {\n          block = dom.split(containerBlock, parentBlock);\n        } else {\n          dom.insertAfter(block, parentBlock);\n        }\n        moveToCaretPosition(editor, block);\n        return block;\n      };\n      normalize$2(dom, rng).each(normRng => {\n        rng.setStart(normRng.startContainer, normRng.startOffset);\n        rng.setEnd(normRng.endContainer, normRng.endOffset);\n      });\n      container = rng.startContainer;\n      offset = rng.startOffset;\n      const shiftKey = !!(evt && evt.shiftKey);\n      const ctrlKey = !!(evt && evt.ctrlKey);\n      if (isElement$6(container) && container.hasChildNodes() && !collapsedAndCef) {\n        isAfterLastNodeInContainer = offset > container.childNodes.length - 1;\n        container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;\n        if (isAfterLastNodeInContainer && isText$b(container)) {\n          offset = container.data.length;\n        } else {\n          offset = 0;\n        }\n      }\n      const editableRoot = getEditableRoot(dom, container);\n      if (!editableRoot || isWithinNonEditableList(editor, container)) {\n        return;\n      }\n      if (!shiftKey) {\n        container = wrapSelfAndSiblingsInDefaultBlock(editor, newBlockName, rng, container, offset);\n      }\n      let parentBlock = dom.getParent(container, dom.isBlock) || dom.getRoot();\n      containerBlock = isNonNullable(parentBlock === null || parentBlock === void 0 ? void 0 : parentBlock.parentNode) ? dom.getParent(parentBlock.parentNode, dom.isBlock) : null;\n      parentBlockName = parentBlock ? parentBlock.nodeName.toUpperCase() : '';\n      const containerBlockName = containerBlock ? containerBlock.nodeName.toUpperCase() : '';\n      if (containerBlockName === 'LI' && !ctrlKey) {\n        const liBlock = containerBlock;\n        parentBlock = liBlock;\n        containerBlock = liBlock.parentNode;\n        parentBlockName = containerBlockName;\n      }\n      if (isElement$6(containerBlock) && isLastEmptyBlockInDetails(editor, shiftKey, parentBlock)) {\n        return insertNewLine(editor, createNewBlock$1, parentBlock);\n      }\n      if (/^(LI|DT|DD)$/.test(parentBlockName) && isElement$6(containerBlock)) {\n        if (dom.isEmpty(parentBlock)) {\n          insert$4(editor, createNewBlock$1, containerBlock, parentBlock, newBlockName);\n          return;\n        }\n      }\n      if (!collapsedAndCef && (parentBlock === editor.getBody() || !canSplitBlock(dom, parentBlock))) {\n        return;\n      }\n      const parentBlockParent = parentBlock.parentNode;\n      let newBlock;\n      if (collapsedAndCef) {\n        newBlock = createNewBlock$1(newBlockName);\n        child.fold(() => {\n          append$1(start, SugarElement.fromDom(newBlock));\n        }, child => {\n          before$3(child, SugarElement.fromDom(newBlock));\n        });\n        editor.selection.setCursorLocation(newBlock, 0);\n      } else if (isCaretContainerBlock$1(parentBlock)) {\n        newBlock = showCaretContainerBlock(parentBlock);\n        if (dom.isEmpty(parentBlock)) {\n          emptyBlock(parentBlock);\n        }\n        setForcedBlockAttrs(editor, newBlock);\n        moveToCaretPosition(editor, newBlock);\n      } else if (isCaretAtStartOrEndOfBlock(false)) {\n        newBlock = insertNewBlockAfter();\n      } else if (isCaretAtStartOrEndOfBlock(true) && parentBlockParent) {\n        newBlock = parentBlockParent.insertBefore(createNewBlock$1(), parentBlock);\n        const isNearChildren = hasChildNodes(SugarElement.fromDom(rng.startContainer)) && rng.collapsed;\n        moveToCaretPosition(editor, containerAndSiblingName(parentBlock, 'HR') || isNearChildren ? newBlock : parentBlock);\n      } else {\n        const tmpRng = includeZwspInRange(rng).cloneRange();\n        tmpRng.setEndAfter(parentBlock);\n        const fragment = tmpRng.extractContents();\n        trimZwsp(fragment);\n        trimLeadingLineBreaks(fragment);\n        newBlock = fragment.firstChild;\n        dom.insertAfter(fragment, parentBlock);\n        trimInlineElementsOnLeftSideOfBlock(dom, nonEmptyElementsMap, newBlock);\n        addBrToBlockIfNeeded(dom, parentBlock);\n        if (dom.isEmpty(parentBlock)) {\n          emptyBlock(parentBlock);\n        }\n        newBlock.normalize();\n        if (dom.isEmpty(newBlock)) {\n          dom.remove(newBlock);\n          insertNewBlockAfter();\n        } else {\n          setForcedBlockAttrs(editor, newBlock);\n          moveToCaretPosition(editor, newBlock);\n        }\n      }\n      dom.setAttrib(newBlock, 'id', '');\n      editor.dispatch('NewBlock', { newBlock });\n    };\n    const fakeEventName$1 = 'insertParagraph';\n    const blockbreak = {\n      insert: insert$3,\n      fakeEventName: fakeEventName$1\n    };\n\n    const hasRightSideContent = (schema, container, parentBlock) => {\n      const walker = new DomTreeWalker(container, parentBlock);\n      let node;\n      const nonEmptyElementsMap = schema.getNonEmptyElements();\n      while (node = walker.next()) {\n        if (nonEmptyElementsMap[node.nodeName.toLowerCase()] || isText$b(node) && node.length > 0) {\n          return true;\n        }\n      }\n      return false;\n    };\n    const moveSelectionToBr = (editor, brElm, extraBr) => {\n      const rng = editor.dom.createRng();\n      if (!extraBr) {\n        rng.setStartAfter(brElm);\n        rng.setEndAfter(brElm);\n      } else {\n        rng.setStartBefore(brElm);\n        rng.setEndBefore(brElm);\n      }\n      editor.selection.setRng(rng);\n      scrollRangeIntoView(editor, rng);\n    };\n    const insertBrAtCaret = (editor, evt) => {\n      const selection = editor.selection;\n      const dom = editor.dom;\n      const rng = selection.getRng();\n      let brElm;\n      let extraBr = false;\n      normalize$2(dom, rng).each(normRng => {\n        rng.setStart(normRng.startContainer, normRng.startOffset);\n        rng.setEnd(normRng.endContainer, normRng.endOffset);\n      });\n      let offset = rng.startOffset;\n      let container = rng.startContainer;\n      if (isElement$6(container) && container.hasChildNodes()) {\n        const isAfterLastNodeInContainer = offset > container.childNodes.length - 1;\n        container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;\n        if (isAfterLastNodeInContainer && isText$b(container)) {\n          offset = container.data.length;\n        } else {\n          offset = 0;\n        }\n      }\n      let parentBlock = dom.getParent(container, dom.isBlock);\n      const containerBlock = parentBlock && parentBlock.parentNode ? dom.getParent(parentBlock.parentNode, dom.isBlock) : null;\n      const containerBlockName = containerBlock ? containerBlock.nodeName.toUpperCase() : '';\n      const isControlKey = !!(evt && evt.ctrlKey);\n      if (containerBlockName === 'LI' && !isControlKey) {\n        parentBlock = containerBlock;\n      }\n      if (isText$b(container) && offset >= container.data.length) {\n        if (!hasRightSideContent(editor.schema, container, parentBlock || dom.getRoot())) {\n          brElm = dom.create('br');\n          rng.insertNode(brElm);\n          rng.setStartAfter(brElm);\n          rng.setEndAfter(brElm);\n          extraBr = true;\n        }\n      }\n      brElm = dom.create('br');\n      rangeInsertNode(dom, rng, brElm);\n      moveSelectionToBr(editor, brElm, extraBr);\n      editor.undoManager.add();\n    };\n    const insertBrBefore = (editor, inline) => {\n      const br = SugarElement.fromTag('br');\n      before$3(SugarElement.fromDom(inline), br);\n      editor.undoManager.add();\n    };\n    const insertBrAfter = (editor, inline) => {\n      if (!hasBrAfter(editor.getBody(), inline)) {\n        after$4(SugarElement.fromDom(inline), SugarElement.fromTag('br'));\n      }\n      const br = SugarElement.fromTag('br');\n      after$4(SugarElement.fromDom(inline), br);\n      moveSelectionToBr(editor, br.dom, false);\n      editor.undoManager.add();\n    };\n    const isBeforeBr = pos => {\n      return isBr$6(pos.getNode());\n    };\n    const hasBrAfter = (rootNode, startNode) => {\n      if (isBeforeBr(CaretPosition.after(startNode))) {\n        return true;\n      } else {\n        return nextPosition(rootNode, CaretPosition.after(startNode)).map(pos => {\n          return isBr$6(pos.getNode());\n        }).getOr(false);\n      }\n    };\n    const isAnchorLink = elm => {\n      return elm && elm.nodeName === 'A' && 'href' in elm;\n    };\n    const isInsideAnchor = location => {\n      return location.fold(never, isAnchorLink, isAnchorLink, never);\n    };\n    const readInlineAnchorLocation = editor => {\n      const isInlineTarget$1 = curry(isInlineTarget, editor);\n      const position = CaretPosition.fromRangeStart(editor.selection.getRng());\n      return readLocation(isInlineTarget$1, editor.getBody(), position).filter(isInsideAnchor);\n    };\n    const insertBrOutsideAnchor = (editor, location) => {\n      location.fold(noop, curry(insertBrBefore, editor), curry(insertBrAfter, editor), noop);\n    };\n    const insert$2 = (editor, evt) => {\n      const anchorLocation = readInlineAnchorLocation(editor);\n      if (anchorLocation.isSome()) {\n        anchorLocation.each(curry(insertBrOutsideAnchor, editor));\n      } else {\n        insertBrAtCaret(editor, evt);\n      }\n    };\n    const fakeEventName = 'insertLineBreak';\n    const linebreak = {\n      insert: insert$2,\n      fakeEventName\n    };\n\n    const matchesSelector = (editor, selector) => {\n      return getParentBlock$1(editor).filter(parentBlock => {\n        return selector.length > 0 && is$1(SugarElement.fromDom(parentBlock), selector);\n      }).isSome();\n    };\n    const shouldInsertBr = editor => {\n      return matchesSelector(editor, getBrNewLineSelector(editor));\n    };\n    const shouldBlockNewLine$1 = editor => {\n      return matchesSelector(editor, getNoNewLineSelector(editor));\n    };\n\n    const newLineAction = Adt.generate([\n      { br: [] },\n      { block: [] },\n      { none: [] }\n    ]);\n    const shouldBlockNewLine = (editor, _shiftKey) => {\n      return shouldBlockNewLine$1(editor);\n    };\n    const inListBlock = requiredState => {\n      return (editor, _shiftKey) => {\n        return isListItemParentBlock(editor) === requiredState;\n      };\n    };\n    const inBlock = (blockName, requiredState) => (editor, _shiftKey) => {\n      const state = getParentBlockName(editor) === blockName.toUpperCase();\n      return state === requiredState;\n    };\n    const inCefBlock = editor => {\n      const editableRoot = getEditableRoot(editor.dom, editor.selection.getStart());\n      return isNullable(editableRoot);\n    };\n    const inPreBlock = requiredState => inBlock('pre', requiredState);\n    const inSummaryBlock = () => inBlock('summary', true);\n    const shouldPutBrInPre = requiredState => {\n      return (editor, _shiftKey) => {\n        return shouldPutBrInPre$1(editor) === requiredState;\n      };\n    };\n    const inBrContext = (editor, _shiftKey) => {\n      return shouldInsertBr(editor);\n    };\n    const hasShiftKey = (_editor, shiftKey) => {\n      return shiftKey;\n    };\n    const canInsertIntoEditableRoot = editor => {\n      const forcedRootBlock = getForcedRootBlock(editor);\n      const rootEditable = getEditableRoot(editor.dom, editor.selection.getStart());\n      return isNonNullable(rootEditable) && editor.schema.isValidChild(rootEditable.nodeName, forcedRootBlock);\n    };\n    const isInRootWithEmptyOrCEF = editor => {\n      const rng = editor.selection.getRng();\n      const start = SugarElement.fromDom(rng.startContainer);\n      const child = child$1(start, rng.startOffset);\n      const isCefOpt = child.map(element => isHTMLElement$1(element) && !isEditable$2(element));\n      return rng.collapsed && isCefOpt.getOr(true);\n    };\n    const match = (predicates, action) => {\n      return (editor, shiftKey) => {\n        const isMatch = foldl(predicates, (res, p) => {\n          return res && p(editor, shiftKey);\n        }, true);\n        return isMatch ? Optional.some(action) : Optional.none();\n      };\n    };\n    const getAction = (editor, evt) => {\n      return evaluateUntil([\n        match([shouldBlockNewLine], newLineAction.none()),\n        match([\n          inPreBlock(true),\n          inCefBlock\n        ], newLineAction.none()),\n        match([inSummaryBlock()], newLineAction.br()),\n        match([\n          inPreBlock(true),\n          shouldPutBrInPre(false),\n          hasShiftKey\n        ], newLineAction.br()),\n        match([\n          inPreBlock(true),\n          shouldPutBrInPre(false)\n        ], newLineAction.block()),\n        match([\n          inPreBlock(true),\n          shouldPutBrInPre(true),\n          hasShiftKey\n        ], newLineAction.block()),\n        match([\n          inPreBlock(true),\n          shouldPutBrInPre(true)\n        ], newLineAction.br()),\n        match([\n          inListBlock(true),\n          hasShiftKey\n        ], newLineAction.br()),\n        match([inListBlock(true)], newLineAction.block()),\n        match([inBrContext], newLineAction.br()),\n        match([hasShiftKey], newLineAction.br()),\n        match([canInsertIntoEditableRoot], newLineAction.block()),\n        match([isInRootWithEmptyOrCEF], newLineAction.block())\n      ], [\n        editor,\n        !!(evt && evt.shiftKey)\n      ]).getOr(newLineAction.none());\n    };\n\n    const insertBreak = (breakType, editor, evt) => {\n      if (!editor.selection.isCollapsed()) {\n        execEditorDeleteCommand(editor);\n      }\n      if (isNonNullable(evt)) {\n        const event = fireBeforeInputEvent(editor, breakType.fakeEventName);\n        if (event.isDefaultPrevented()) {\n          return;\n        }\n      }\n      breakType.insert(editor, evt);\n      if (isNonNullable(evt)) {\n        fireInputEvent(editor, breakType.fakeEventName);\n      }\n    };\n    const insert$1 = (editor, evt) => {\n      const br = () => insertBreak(linebreak, editor, evt);\n      const block = () => insertBreak(blockbreak, editor, evt);\n      const logicalAction = getAction(editor, evt);\n      switch (getNewlineBehavior(editor)) {\n      case 'linebreak':\n        logicalAction.fold(br, br, noop);\n        break;\n      case 'block':\n        logicalAction.fold(block, block, noop);\n        break;\n      case 'invert':\n        logicalAction.fold(block, br, noop);\n        break;\n      default:\n        logicalAction.fold(br, block, noop);\n        break;\n      }\n    };\n\n    const platform$1 = detect$1();\n    const isIOSSafari = platform$1.os.isiOS() && platform$1.browser.isSafari();\n    const handleEnterKeyEvent = (editor, event) => {\n      if (event.isDefaultPrevented()) {\n        return;\n      }\n      event.preventDefault();\n      endTypingLevelIgnoreLocks(editor.undoManager);\n      editor.undoManager.transact(() => {\n        insert$1(editor, event);\n      });\n    };\n    const isCaretAfterKoreanCharacter = rng => {\n      if (!rng.collapsed) {\n        return false;\n      }\n      const startContainer = rng.startContainer;\n      if (isText$b(startContainer)) {\n        const koreanCharRegex = /^[\\uAC00-\\uD7AF\\u1100-\\u11FF\\u3130-\\u318F\\uA960-\\uA97F\\uD7B0-\\uD7FF]$/;\n        const char = startContainer.data.charAt(rng.startOffset - 1);\n        return koreanCharRegex.test(char);\n      } else {\n        return false;\n      }\n    };\n    const setup$i = editor => {\n      let iOSSafariKeydownBookmark = Optional.none();\n      const iOSSafariKeydownOverride = editor => {\n        iOSSafariKeydownBookmark = Optional.some(editor.selection.getBookmark());\n        editor.undoManager.add();\n      };\n      const iOSSafariKeyupOverride = (editor, event) => {\n        editor.undoManager.undo();\n        iOSSafariKeydownBookmark.fold(noop, b => editor.selection.moveToBookmark(b));\n        handleEnterKeyEvent(editor, event);\n        iOSSafariKeydownBookmark = Optional.none();\n      };\n      editor.on('keydown', event => {\n        if (event.keyCode === VK.ENTER) {\n          if (isIOSSafari && isCaretAfterKoreanCharacter(editor.selection.getRng())) {\n            iOSSafariKeydownOverride(editor);\n          } else {\n            handleEnterKeyEvent(editor, event);\n          }\n        }\n      });\n      editor.on('keyup', event => {\n        if (event.keyCode === VK.ENTER) {\n          iOSSafariKeydownBookmark.each(() => iOSSafariKeyupOverride(editor, event));\n        }\n      });\n    };\n\n    const executeKeydownOverride$2 = (editor, caret, evt) => {\n      const isMac = Env.os.isMacOS() || Env.os.isiOS();\n      execute([\n        {\n          keyCode: VK.END,\n          action: action(moveToLineEndPoint$1, editor, true)\n        },\n        {\n          keyCode: VK.HOME,\n          action: action(moveToLineEndPoint$1, editor, false)\n        },\n        ...!isMac ? [\n          {\n            keyCode: VK.HOME,\n            action: action(selectToEndPoint, editor, false),\n            ctrlKey: true,\n            shiftKey: true\n          },\n          {\n            keyCode: VK.END,\n            action: action(selectToEndPoint, editor, true),\n            ctrlKey: true,\n            shiftKey: true\n          }\n        ] : [],\n        {\n          keyCode: VK.END,\n          action: action(moveToLineEndPoint, editor, true)\n        },\n        {\n          keyCode: VK.HOME,\n          action: action(moveToLineEndPoint, editor, false)\n        },\n        {\n          keyCode: VK.END,\n          action: action(moveToLineEndPoint$2, editor, true, caret)\n        },\n        {\n          keyCode: VK.HOME,\n          action: action(moveToLineEndPoint$2, editor, false, caret)\n        }\n      ], evt).each(_ => {\n        evt.preventDefault();\n      });\n    };\n    const setup$h = (editor, caret) => {\n      editor.on('keydown', evt => {\n        if (!evt.isDefaultPrevented()) {\n          executeKeydownOverride$2(editor, caret, evt);\n        }\n      });\n    };\n\n    const setup$g = editor => {\n      editor.on('input', e => {\n        if (!e.isComposing) {\n          normalizeNbspsInEditor(editor);\n        }\n      });\n    };\n\n    const platform = detect$1();\n    const executeKeyupAction = (editor, caret, evt) => {\n      execute([\n        {\n          keyCode: VK.PAGE_UP,\n          action: action(moveToLineEndPoint$2, editor, false, caret)\n        },\n        {\n          keyCode: VK.PAGE_DOWN,\n          action: action(moveToLineEndPoint$2, editor, true, caret)\n        }\n      ], evt);\n    };\n    const stopImmediatePropagation = e => e.stopImmediatePropagation();\n    const isPageUpDown = evt => evt.keyCode === VK.PAGE_UP || evt.keyCode === VK.PAGE_DOWN;\n    const setNodeChangeBlocker = (blocked, editor, block) => {\n      if (block && !blocked.get()) {\n        editor.on('NodeChange', stopImmediatePropagation, true);\n      } else if (!block && blocked.get()) {\n        editor.off('NodeChange', stopImmediatePropagation);\n      }\n      blocked.set(block);\n    };\n    const setup$f = (editor, caret) => {\n      if (platform.os.isMacOS()) {\n        return;\n      }\n      const blocked = Cell(false);\n      editor.on('keydown', evt => {\n        if (isPageUpDown(evt)) {\n          setNodeChangeBlocker(blocked, editor, true);\n        }\n      });\n      editor.on('keyup', evt => {\n        if (!evt.isDefaultPrevented()) {\n          executeKeyupAction(editor, caret, evt);\n        }\n        if (isPageUpDown(evt) && blocked.get()) {\n          setNodeChangeBlocker(blocked, editor, false);\n          editor.nodeChanged();\n        }\n      });\n    };\n\n    const setup$e = editor => {\n      editor.on('beforeinput', e => {\n        if (!editor.selection.isEditable() || exists(e.getTargetRanges(), rng => !isEditableRange(editor.dom, rng))) {\n          e.preventDefault();\n        }\n      });\n    };\n\n    const insertTextAtPosition = (text, pos) => {\n      const container = pos.container();\n      const offset = pos.offset();\n      if (isText$b(container)) {\n        container.insertData(offset, text);\n        return Optional.some(CaretPosition(container, offset + text.length));\n      } else {\n        return getElementFromPosition(pos).map(elm => {\n          const textNode = SugarElement.fromText(text);\n          if (pos.isAtEnd()) {\n            after$4(elm, textNode);\n          } else {\n            before$3(elm, textNode);\n          }\n          return CaretPosition(textNode.dom, text.length);\n        });\n      }\n    };\n    const insertNbspAtPosition = curry(insertTextAtPosition, nbsp);\n    const insertSpaceAtPosition = curry(insertTextAtPosition, ' ');\n\n    const insertSpaceOrNbspAtPosition = (root, pos, schema) => needsToHaveNbsp(root, pos, schema) ? insertNbspAtPosition(pos) : insertSpaceAtPosition(pos);\n    const locationToCaretPosition = root => location => location.fold(element => prevPosition(root.dom, CaretPosition.before(element)), element => firstPositionIn(element), element => lastPositionIn(element), element => nextPosition(root.dom, CaretPosition.after(element)));\n    const insertInlineBoundarySpaceOrNbsp = (root, pos, schema) => checkPos => needsToHaveNbsp(root, checkPos, schema) ? insertNbspAtPosition(pos) : insertSpaceAtPosition(pos);\n    const setSelection = editor => pos => {\n      editor.selection.setRng(pos.toRange());\n      editor.nodeChanged();\n    };\n    const isInsideSummary = (domUtils, node) => domUtils.isEditable(domUtils.getParent(node, 'summary'));\n    const insertSpaceOrNbspAtSelection = editor => {\n      const pos = CaretPosition.fromRangeStart(editor.selection.getRng());\n      const root = SugarElement.fromDom(editor.getBody());\n      if (editor.selection.isCollapsed()) {\n        const isInlineTarget$1 = curry(isInlineTarget, editor);\n        const caretPosition = CaretPosition.fromRangeStart(editor.selection.getRng());\n        return readLocation(isInlineTarget$1, editor.getBody(), caretPosition).bind(locationToCaretPosition(root)).map(checkPos => () => insertInlineBoundarySpaceOrNbsp(root, pos, editor.schema)(checkPos).each(setSelection(editor)));\n      } else {\n        return Optional.none();\n      }\n    };\n    const insertSpaceInSummaryAtSelectionOnFirefox = editor => {\n      const insertSpaceThunk = () => {\n        const root = SugarElement.fromDom(editor.getBody());\n        if (!editor.selection.isCollapsed()) {\n          editor.getDoc().execCommand('Delete');\n        }\n        const pos = CaretPosition.fromRangeStart(editor.selection.getRng());\n        insertSpaceOrNbspAtPosition(root, pos, editor.schema).each(setSelection(editor));\n      };\n      return someIf(Env.browser.isFirefox() && editor.selection.isEditable() && isInsideSummary(editor.dom, editor.selection.getRng().startContainer), insertSpaceThunk);\n    };\n\n    const executeKeydownOverride$1 = (editor, evt) => {\n      executeWithDelayedAction([\n        {\n          keyCode: VK.SPACEBAR,\n          action: action(insertSpaceOrNbspAtSelection, editor)\n        },\n        {\n          keyCode: VK.SPACEBAR,\n          action: action(insertSpaceInSummaryAtSelectionOnFirefox, editor)\n        }\n      ], evt).each(applyAction => {\n        evt.preventDefault();\n        const event = fireBeforeInputEvent(editor, 'insertText', { data: ' ' });\n        if (!event.isDefaultPrevented()) {\n          applyAction();\n          fireInputEvent(editor, 'insertText', { data: ' ' });\n        }\n      });\n    };\n    const setup$d = editor => {\n      editor.on('keydown', evt => {\n        if (!evt.isDefaultPrevented()) {\n          executeKeydownOverride$1(editor, evt);\n        }\n      });\n    };\n\n    const tableTabNavigation = editor => {\n      if (hasTableTabNavigation(editor)) {\n        return [\n          {\n            keyCode: VK.TAB,\n            action: action(handleTab, editor, true)\n          },\n          {\n            keyCode: VK.TAB,\n            shiftKey: true,\n            action: action(handleTab, editor, false)\n          }\n        ];\n      } else {\n        return [];\n      }\n    };\n    const executeKeydownOverride = (editor, evt) => {\n      execute([...tableTabNavigation(editor)], evt).each(_ => {\n        evt.preventDefault();\n      });\n    };\n    const setup$c = editor => {\n      editor.on('keydown', evt => {\n        if (!evt.isDefaultPrevented()) {\n          executeKeydownOverride(editor, evt);\n        }\n      });\n    };\n\n    const setup$b = editor => {\n      editor.addShortcut('Meta+P', '', 'mcePrint');\n      setup$k(editor);\n      if (isRtc(editor)) {\n        return Cell(null);\n      } else {\n        const caret = setupSelectedState(editor);\n        setup$e(editor);\n        setup$m(editor);\n        setup$l(editor, caret);\n        setup$j(editor, caret);\n        setup$i(editor);\n        setup$d(editor);\n        setup$g(editor);\n        setup$c(editor);\n        setup$h(editor, caret);\n        setup$f(editor, caret);\n        return caret;\n      }\n    };\n\n    class NodeChange {\n      constructor(editor) {\n        this.lastPath = [];\n        this.editor = editor;\n        let lastRng;\n        const self = this;\n        if (!('onselectionchange' in editor.getDoc())) {\n          editor.on('NodeChange click mouseup keyup focus', e => {\n            const nativeRng = editor.selection.getRng();\n            const fakeRng = {\n              startContainer: nativeRng.startContainer,\n              startOffset: nativeRng.startOffset,\n              endContainer: nativeRng.endContainer,\n              endOffset: nativeRng.endOffset\n            };\n            if (e.type === 'nodechange' || !isEq$4(fakeRng, lastRng)) {\n              editor.dispatch('SelectionChange');\n            }\n            lastRng = fakeRng;\n          });\n        }\n        editor.on('contextmenu', () => {\n          store(editor);\n          editor.dispatch('SelectionChange');\n        });\n        editor.on('SelectionChange', () => {\n          const startElm = editor.selection.getStart(true);\n          if (!startElm) {\n            return;\n          }\n          if (hasAnyRanges(editor) && !self.isSameElementPath(startElm) && editor.dom.isChildOf(startElm, editor.getBody())) {\n            editor.nodeChanged({ selectionChange: true });\n          }\n        });\n        editor.on('mouseup', e => {\n          if (!e.isDefaultPrevented() && hasAnyRanges(editor)) {\n            if (editor.selection.getNode().nodeName === 'IMG') {\n              Delay.setEditorTimeout(editor, () => {\n                editor.nodeChanged();\n              });\n            } else {\n              editor.nodeChanged();\n            }\n          }\n        });\n      }\n      nodeChanged(args = {}) {\n        const selection = this.editor.selection;\n        let node;\n        if (this.editor.initialized && selection && !shouldDisableNodeChange(this.editor) && !this.editor.mode.isReadOnly()) {\n          const root = this.editor.getBody();\n          node = selection.getStart(true) || root;\n          if (node.ownerDocument !== this.editor.getDoc() || !this.editor.dom.isChildOf(node, root)) {\n            node = root;\n          }\n          const parents = [];\n          this.editor.dom.getParent(node, node => {\n            if (node === root) {\n              return true;\n            } else {\n              parents.push(node);\n              return false;\n            }\n          });\n          this.editor.dispatch('NodeChange', {\n            ...args,\n            element: node,\n            parents\n          });\n        }\n      }\n      isSameElementPath(startElm) {\n        let i;\n        const editor = this.editor;\n        const currentPath = reverse(editor.dom.getParents(startElm, always, editor.getBody()));\n        if (currentPath.length === this.lastPath.length) {\n          for (i = currentPath.length; i >= 0; i--) {\n            if (currentPath[i] !== this.lastPath[i]) {\n              break;\n            }\n          }\n          if (i === -1) {\n            this.lastPath = currentPath;\n            return true;\n          }\n        }\n        this.lastPath = currentPath;\n        return false;\n      }\n    }\n\n    const imageId = generate$1('image');\n    const getDragImage = transfer => {\n      const dt = transfer;\n      return Optional.from(dt[imageId]);\n    };\n    const setDragImage = (transfer, imageData) => {\n      const dt = transfer;\n      dt[imageId] = imageData;\n    };\n\n    const eventId = generate$1('event');\n    const getEvent = transfer => {\n      const dt = transfer;\n      return Optional.from(dt[eventId]);\n    };\n    const mkSetEventFn = type => transfer => {\n      const dt = transfer;\n      dt[eventId] = type;\n    };\n    const setEvent = (transfer, type) => mkSetEventFn(type)(transfer);\n    const setDragstartEvent = mkSetEventFn(0);\n    const setDropEvent = mkSetEventFn(2);\n    const setDragendEvent = mkSetEventFn(1);\n    const checkEvent = expectedType => transfer => {\n      const dt = transfer;\n      return Optional.from(dt[eventId]).exists(type => type === expectedType);\n    };\n    const isInDragStartEvent = checkEvent(0);\n\n    const createEmptyFileList = () => Object.freeze({\n      length: 0,\n      item: _ => null\n    });\n\n    const modeId = generate$1('mode');\n    const getMode = transfer => {\n      const dt = transfer;\n      return Optional.from(dt[modeId]);\n    };\n    const mkSetModeFn = mode => transfer => {\n      const dt = transfer;\n      dt[modeId] = mode;\n    };\n    const setMode$1 = (transfer, mode) => mkSetModeFn(mode)(transfer);\n    const setReadWriteMode = mkSetModeFn(0);\n    const setReadOnlyMode = mkSetModeFn(2);\n    const setProtectedMode = mkSetModeFn(1);\n    const checkMode = expectedMode => transfer => {\n      const dt = transfer;\n      return Optional.from(dt[modeId]).exists(mode => mode === expectedMode);\n    };\n    const isInReadWriteMode = checkMode(0);\n    const isInProtectedMode = checkMode(1);\n\n    const normalizeItems = (dataTransfer, itemsImpl) => ({\n      ...itemsImpl,\n      get length() {\n        return itemsImpl.length;\n      },\n      add: (data, type) => {\n        if (isInReadWriteMode(dataTransfer)) {\n          if (isString(data)) {\n            if (!isUndefined(type)) {\n              return itemsImpl.add(data, type);\n            }\n          } else {\n            return itemsImpl.add(data);\n          }\n        }\n        return null;\n      },\n      remove: idx => {\n        if (isInReadWriteMode(dataTransfer)) {\n          itemsImpl.remove(idx);\n        }\n      },\n      clear: () => {\n        if (isInReadWriteMode(dataTransfer)) {\n          itemsImpl.clear();\n        }\n      }\n    });\n\n    const validDropEffects = [\n      'none',\n      'copy',\n      'link',\n      'move'\n    ];\n    const validEffectAlloweds = [\n      'none',\n      'copy',\n      'copyLink',\n      'copyMove',\n      'link',\n      'linkMove',\n      'move',\n      'all',\n      'uninitialized'\n    ];\n    const createDataTransfer = () => {\n      const dataTransferImpl = new window.DataTransfer();\n      let dropEffect = 'move';\n      let effectAllowed = 'all';\n      const dataTransfer = {\n        get dropEffect() {\n          return dropEffect;\n        },\n        set dropEffect(effect) {\n          if (contains$2(validDropEffects, effect)) {\n            dropEffect = effect;\n          }\n        },\n        get effectAllowed() {\n          return effectAllowed;\n        },\n        set effectAllowed(allowed) {\n          if (isInDragStartEvent(dataTransfer) && contains$2(validEffectAlloweds, allowed)) {\n            effectAllowed = allowed;\n          }\n        },\n        get items() {\n          return normalizeItems(dataTransfer, dataTransferImpl.items);\n        },\n        get files() {\n          if (isInProtectedMode(dataTransfer)) {\n            return createEmptyFileList();\n          } else {\n            return dataTransferImpl.files;\n          }\n        },\n        get types() {\n          return dataTransferImpl.types;\n        },\n        setDragImage: (image, x, y) => {\n          if (isInReadWriteMode(dataTransfer)) {\n            setDragImage(dataTransfer, {\n              image,\n              x,\n              y\n            });\n            dataTransferImpl.setDragImage(image, x, y);\n          }\n        },\n        getData: format => {\n          if (isInProtectedMode(dataTransfer)) {\n            return '';\n          } else {\n            return dataTransferImpl.getData(format);\n          }\n        },\n        setData: (format, data) => {\n          if (isInReadWriteMode(dataTransfer)) {\n            dataTransferImpl.setData(format, data);\n          }\n        },\n        clearData: format => {\n          if (isInReadWriteMode(dataTransfer)) {\n            dataTransferImpl.clearData(format);\n          }\n        }\n      };\n      setReadWriteMode(dataTransfer);\n      return dataTransfer;\n    };\n    const cloneDataTransfer = original => {\n      const clone = createDataTransfer();\n      const originalMode = getMode(original);\n      setReadOnlyMode(original);\n      setDragstartEvent(clone);\n      clone.dropEffect = original.dropEffect;\n      clone.effectAllowed = original.effectAllowed;\n      getDragImage(original).each(imageData => clone.setDragImage(imageData.image, imageData.x, imageData.y));\n      each$e(original.types, type => {\n        if (type !== 'Files') {\n          clone.setData(type, original.getData(type));\n        }\n      });\n      each$e(original.files, file => clone.items.add(file));\n      getEvent(original).each(type => {\n        setEvent(clone, type);\n      });\n      originalMode.each(mode => {\n        setMode$1(original, mode);\n        setMode$1(clone, mode);\n      });\n      return clone;\n    };\n\n    const getHtmlData = dataTransfer => {\n      const html = dataTransfer.getData('text/html');\n      return html === '' ? Optional.none() : Optional.some(html);\n    };\n    const setHtmlData = (dataTransfer, html) => dataTransfer.setData('text/html', html);\n\n    const internalMimeType = 'x-hugerte/html';\n    const internalHtmlMime = constant(internalMimeType);\n    const internalMark = '<!-- ' + internalMimeType + ' -->';\n    const mark = html => internalMark + html;\n    const unmark = html => html.replace(internalMark, '');\n    const isMarked = html => html.indexOf(internalMark) !== -1;\n\n    const isPlainText = text => {\n      return !/<(?:\\/?(?!(?:div|p|br|span)>)\\w+|(?:(?!(?:span style=\"white-space:\\s?pre;?\">)|br\\s?\\/>))\\w+\\s[^>]+)>/i.test(text);\n    };\n    const openContainer = (rootTag, rootAttrs) => {\n      let tag = '<' + rootTag;\n      const attrs = mapToArray(rootAttrs, (value, key) => key + '=\"' + Entities.encodeAllRaw(value) + '\"');\n      if (attrs.length) {\n        tag += ' ' + attrs.join(' ');\n      }\n      return tag + '>';\n    };\n    const toBlockElements = (text, rootTag, rootAttrs) => {\n      const blocks = text.split(/\\n\\n/);\n      const tagOpen = openContainer(rootTag, rootAttrs);\n      const tagClose = '</' + rootTag + '>';\n      const paragraphs = map$3(blocks, p => {\n        return p.split(/\\n/).join('<br />');\n      });\n      const stitch = p => {\n        return tagOpen + p + tagClose;\n      };\n      return paragraphs.length === 1 ? paragraphs[0] : map$3(paragraphs, stitch).join('');\n    };\n\n    const pasteBinDefaultContent = '%MCEPASTEBIN%';\n    const create$6 = (editor, lastRngCell) => {\n      const {dom, selection} = editor;\n      const body = editor.getBody();\n      lastRngCell.set(selection.getRng());\n      const pasteBinElm = dom.add(editor.getBody(), 'div', {\n        'id': 'mcepastebin',\n        'class': 'mce-pastebin',\n        'contentEditable': true,\n        'data-mce-bogus': 'all',\n        'style': 'position: fixed; top: 50%; width: 10px; height: 10px; overflow: hidden; opacity: 0'\n      }, pasteBinDefaultContent);\n      if (Env.browser.isFirefox()) {\n        dom.setStyle(pasteBinElm, 'left', dom.getStyle(body, 'direction', true) === 'rtl' ? 65535 : -65535);\n      }\n      dom.bind(pasteBinElm, 'beforedeactivate focusin focusout', e => {\n        e.stopPropagation();\n      });\n      pasteBinElm.focus();\n      selection.select(pasteBinElm, true);\n    };\n    const remove = (editor, lastRngCell) => {\n      const dom = editor.dom;\n      if (getEl(editor)) {\n        let pasteBinClone;\n        const lastRng = lastRngCell.get();\n        while (pasteBinClone = getEl(editor)) {\n          dom.remove(pasteBinClone);\n          dom.unbind(pasteBinClone);\n        }\n        if (lastRng) {\n          editor.selection.setRng(lastRng);\n        }\n      }\n      lastRngCell.set(null);\n    };\n    const getEl = editor => editor.dom.get('mcepastebin');\n    const isPasteBin = elm => isNonNullable(elm) && elm.id === 'mcepastebin';\n    const getHtml = editor => {\n      const dom = editor.dom;\n      const copyAndRemove = (toElm, fromElm) => {\n        toElm.appendChild(fromElm);\n        dom.remove(fromElm, true);\n      };\n      const [pasteBinElm, ...pasteBinClones] = filter$5(editor.getBody().childNodes, isPasteBin);\n      each$e(pasteBinClones, pasteBinClone => {\n        copyAndRemove(pasteBinElm, pasteBinClone);\n      });\n      const dirtyWrappers = dom.select('div[id=mcepastebin]', pasteBinElm);\n      for (let i = dirtyWrappers.length - 1; i >= 0; i--) {\n        const cleanWrapper = dom.create('div');\n        pasteBinElm.insertBefore(cleanWrapper, dirtyWrappers[i]);\n        copyAndRemove(cleanWrapper, dirtyWrappers[i]);\n      }\n      return pasteBinElm ? pasteBinElm.innerHTML : '';\n    };\n    const isDefaultPasteBinContent = content => content === pasteBinDefaultContent;\n    const PasteBin = editor => {\n      const lastRng = Cell(null);\n      return {\n        create: () => create$6(editor, lastRng),\n        remove: () => remove(editor, lastRng),\n        getEl: () => getEl(editor),\n        getHtml: () => getHtml(editor),\n        getLastRng: lastRng.get\n      };\n    };\n\n    const filter$1 = (content, items) => {\n      Tools.each(items, v => {\n        if (is$4(v, RegExp)) {\n          content = content.replace(v, '');\n        } else {\n          content = content.replace(v[0], v[1]);\n        }\n      });\n      return content;\n    };\n    const innerText = html => {\n      const schema = Schema();\n      const domParser = DomParser({}, schema);\n      let text = '';\n      const voidElements = schema.getVoidElements();\n      const ignoreElements = Tools.makeMap('script noscript style textarea video audio iframe object', ' ');\n      const blockElements = schema.getBlockElements();\n      const walk = node => {\n        const name = node.name, currentNode = node;\n        if (name === 'br') {\n          text += '\\n';\n          return;\n        }\n        if (name === 'wbr') {\n          return;\n        }\n        if (voidElements[name]) {\n          text += ' ';\n        }\n        if (ignoreElements[name]) {\n          text += ' ';\n          return;\n        }\n        if (node.type === 3) {\n          text += node.value;\n        }\n        if (!(node.name in schema.getVoidElements())) {\n          let currentNode = node.firstChild;\n          if (currentNode) {\n            do {\n              walk(currentNode);\n            } while (currentNode = currentNode.next);\n          }\n        }\n        if (blockElements[name] && currentNode.next) {\n          text += '\\n';\n          if (name === 'p') {\n            text += '\\n';\n          }\n        }\n      };\n      html = filter$1(html, [/<!\\[[^\\]]+\\]>/g]);\n      walk(domParser.parse(html));\n      return text;\n    };\n    const trimHtml = html => {\n      const trimSpaces = (all, s1, s2) => {\n        if (!s1 && !s2) {\n          return ' ';\n        }\n        return nbsp;\n      };\n      html = filter$1(html, [\n        /^[\\s\\S]*<body[^>]*>\\s*|\\s*<\\/body[^>]*>[\\s\\S]*$/ig,\n        /<!--StartFragment-->|<!--EndFragment-->/g,\n        [\n          /( ?)<span class=\"Apple-converted-space\">\\u00a0<\\/span>( ?)/g,\n          trimSpaces\n        ],\n        /<br class=\"Apple-interchange-newline\">/g,\n        /<br>$/i\n      ]);\n      return html;\n    };\n    const createIdGenerator = prefix => {\n      let count = 0;\n      return () => {\n        return prefix + count++;\n      };\n    };\n    const getImageMimeType = ext => {\n      const lowerExt = ext.toLowerCase();\n      const mimeOverrides = {\n        jpg: 'jpeg',\n        jpe: 'jpeg',\n        jfi: 'jpeg',\n        jif: 'jpeg',\n        jfif: 'jpeg',\n        pjpeg: 'jpeg',\n        pjp: 'jpeg',\n        svg: 'svg+xml'\n      };\n      return Tools.hasOwn(mimeOverrides, lowerExt) ? 'image/' + mimeOverrides[lowerExt] : 'image/' + lowerExt;\n    };\n\n    const preProcess = (editor, html) => {\n      const parser = DomParser({\n        sanitize: shouldSanitizeXss(editor),\n        sandbox_iframes: shouldSandboxIframes(editor),\n        sandbox_iframes_exclusions: getSandboxIframesExclusions(editor),\n        convert_unsafe_embeds: shouldConvertUnsafeEmbeds(editor)\n      }, editor.schema);\n      parser.addNodeFilter('meta', nodes => {\n        Tools.each(nodes, node => {\n          node.remove();\n        });\n      });\n      const fragment = parser.parse(html, {\n        forced_root_block: false,\n        isRootContent: true\n      });\n      return HtmlSerializer({ validate: true }, editor.schema).serialize(fragment);\n    };\n    const processResult = (content, cancelled) => ({\n      content,\n      cancelled\n    });\n    const postProcessFilter = (editor, html, internal) => {\n      const tempBody = editor.dom.create('div', { style: 'display:none' }, html);\n      const postProcessArgs = firePastePostProcess(editor, tempBody, internal);\n      return processResult(postProcessArgs.node.innerHTML, postProcessArgs.isDefaultPrevented());\n    };\n    const filterContent = (editor, content, internal) => {\n      const preProcessArgs = firePastePreProcess(editor, content, internal);\n      const filteredContent = preProcess(editor, preProcessArgs.content);\n      if (editor.hasEventListeners('PastePostProcess') && !preProcessArgs.isDefaultPrevented()) {\n        return postProcessFilter(editor, filteredContent, internal);\n      } else {\n        return processResult(filteredContent, preProcessArgs.isDefaultPrevented());\n      }\n    };\n    const process = (editor, html, internal) => {\n      return filterContent(editor, html, internal);\n    };\n\n    const pasteHtml$1 = (editor, html) => {\n      editor.insertContent(html, {\n        merge: shouldPasteMergeFormats(editor),\n        paste: true\n      });\n      return true;\n    };\n    const isAbsoluteUrl = url => /^https?:\\/\\/[\\w\\-\\/+=.,!;:&%@^~(){}?#]+$/i.test(url);\n    const isImageUrl = (editor, url) => {\n      return isAbsoluteUrl(url) && exists(getAllowedImageFileTypes(editor), type => endsWith(url.toLowerCase(), `.${ type.toLowerCase() }`));\n    };\n    const createImage = (editor, url, pasteHtmlFn) => {\n      editor.undoManager.extra(() => {\n        pasteHtmlFn(editor, url);\n      }, () => {\n        editor.insertContent('<img src=\"' + url + '\">');\n      });\n      return true;\n    };\n    const createLink = (editor, url, pasteHtmlFn) => {\n      editor.undoManager.extra(() => {\n        pasteHtmlFn(editor, url);\n      }, () => {\n        editor.execCommand('mceInsertLink', false, url);\n      });\n      return true;\n    };\n    const linkSelection = (editor, html, pasteHtmlFn) => !editor.selection.isCollapsed() && isAbsoluteUrl(html) ? createLink(editor, html, pasteHtmlFn) : false;\n    const insertImage = (editor, html, pasteHtmlFn) => isImageUrl(editor, html) ? createImage(editor, html, pasteHtmlFn) : false;\n    const smartInsertContent = (editor, html) => {\n      Tools.each([\n        linkSelection,\n        insertImage,\n        pasteHtml$1\n      ], action => {\n        return !action(editor, html, pasteHtml$1);\n      });\n    };\n    const insertContent = (editor, html, pasteAsText) => {\n      if (pasteAsText || !isSmartPasteEnabled(editor)) {\n        pasteHtml$1(editor, html);\n      } else {\n        smartInsertContent(editor, html);\n      }\n    };\n\n    const uniqueId = createIdGenerator('mceclip');\n    const createPasteDataTransfer = html => {\n      const dataTransfer = createDataTransfer();\n      setHtmlData(dataTransfer, html);\n      setReadOnlyMode(dataTransfer);\n      return dataTransfer;\n    };\n    const doPaste = (editor, content, internal, pasteAsText, shouldSimulateInputEvent) => {\n      const res = process(editor, content, internal);\n      if (!res.cancelled) {\n        const content = res.content;\n        const doPasteAction = () => insertContent(editor, content, pasteAsText);\n        if (shouldSimulateInputEvent) {\n          const args = fireBeforeInputEvent(editor, 'insertFromPaste', { dataTransfer: createPasteDataTransfer(content) });\n          if (!args.isDefaultPrevented()) {\n            doPasteAction();\n            fireInputEvent(editor, 'insertFromPaste');\n          }\n        } else {\n          doPasteAction();\n        }\n      }\n    };\n    const pasteHtml = (editor, html, internalFlag, shouldSimulateInputEvent) => {\n      const internal = internalFlag ? internalFlag : isMarked(html);\n      doPaste(editor, unmark(html), internal, false, shouldSimulateInputEvent);\n    };\n    const pasteText = (editor, text, shouldSimulateInputEvent) => {\n      const encodedText = editor.dom.encode(text).replace(/\\r\\n/g, '\\n');\n      const normalizedText = normalize$4(encodedText, getPasteTabSpaces(editor));\n      const html = toBlockElements(normalizedText, getForcedRootBlock(editor), getForcedRootBlockAttrs(editor));\n      doPaste(editor, html, false, true, shouldSimulateInputEvent);\n    };\n    const getDataTransferItems = dataTransfer => {\n      const items = {};\n      if (dataTransfer && dataTransfer.types) {\n        for (let i = 0; i < dataTransfer.types.length; i++) {\n          const contentType = dataTransfer.types[i];\n          try {\n            items[contentType] = dataTransfer.getData(contentType);\n          } catch (ex) {\n            items[contentType] = '';\n          }\n        }\n      }\n      return items;\n    };\n    const hasContentType = (clipboardContent, mimeType) => mimeType in clipboardContent && clipboardContent[mimeType].length > 0;\n    const hasHtmlOrText = content => hasContentType(content, 'text/html') || hasContentType(content, 'text/plain');\n    const extractFilename = (editor, str) => {\n      const m = str.match(/([\\s\\S]+?)(?:\\.[a-z0-9.]+)$/i);\n      return isNonNullable(m) ? editor.dom.encode(m[1]) : undefined;\n    };\n    const createBlobInfo = (editor, blobCache, file, base64) => {\n      const id = uniqueId();\n      const useFileName = shouldReuseFileName(editor) && isNonNullable(file.name);\n      const name = useFileName ? extractFilename(editor, file.name) : id;\n      const filename = useFileName ? file.name : undefined;\n      const blobInfo = blobCache.create(id, file, base64, name, filename);\n      blobCache.add(blobInfo);\n      return blobInfo;\n    };\n    const pasteImage = (editor, imageItem) => {\n      parseDataUri(imageItem.uri).each(({data, type, base64Encoded}) => {\n        const base64 = base64Encoded ? data : btoa(data);\n        const file = imageItem.file;\n        const blobCache = editor.editorUpload.blobCache;\n        const existingBlobInfo = blobCache.getByData(base64, type);\n        const blobInfo = existingBlobInfo !== null && existingBlobInfo !== void 0 ? existingBlobInfo : createBlobInfo(editor, blobCache, file, base64);\n        pasteHtml(editor, `<img src=\"${ blobInfo.blobUri() }\">`, false, true);\n      });\n    };\n    const isClipboardEvent = event => event.type === 'paste';\n    const readFilesAsDataUris = items => Promise.all(map$3(items, file => {\n      return blobToDataUri(file).then(uri => ({\n        file,\n        uri\n      }));\n    }));\n    const isImage = editor => {\n      const allowedExtensions = getAllowedImageFileTypes(editor);\n      return file => startsWith(file.type, 'image/') && exists(allowedExtensions, extension => {\n        return getImageMimeType(extension) === file.type;\n      });\n    };\n    const getImagesFromDataTransfer = (editor, dataTransfer) => {\n      const items = dataTransfer.items ? bind$3(from(dataTransfer.items), item => {\n        return item.kind === 'file' ? [item.getAsFile()] : [];\n      }) : [];\n      const files = dataTransfer.files ? from(dataTransfer.files) : [];\n      return filter$5(items.length > 0 ? items : files, isImage(editor));\n    };\n    const pasteImageData = (editor, e, rng) => {\n      const dataTransfer = isClipboardEvent(e) ? e.clipboardData : e.dataTransfer;\n      if (shouldPasteDataImages(editor) && dataTransfer) {\n        const images = getImagesFromDataTransfer(editor, dataTransfer);\n        if (images.length > 0) {\n          e.preventDefault();\n          readFilesAsDataUris(images).then(fileResults => {\n            if (rng) {\n              editor.selection.setRng(rng);\n            }\n            each$e(fileResults, result => {\n              pasteImage(editor, result);\n            });\n          });\n          return true;\n        }\n      }\n      return false;\n    };\n    const isBrokenAndroidClipboardEvent = e => {\n      var _a, _b;\n      return Env.os.isAndroid() && ((_b = (_a = e.clipboardData) === null || _a === void 0 ? void 0 : _a.items) === null || _b === void 0 ? void 0 : _b.length) === 0;\n    };\n    const isKeyboardPasteEvent = e => VK.metaKeyPressed(e) && e.keyCode === 86 || e.shiftKey && e.keyCode === 45;\n    const insertClipboardContent = (editor, clipboardContent, html, plainTextMode, shouldSimulateInputEvent) => {\n      let content = trimHtml(html);\n      const isInternal = hasContentType(clipboardContent, internalHtmlMime()) || isMarked(html);\n      const isPlainTextHtml = !isInternal && isPlainText(content);\n      const isAbsoluteUrl$1 = isAbsoluteUrl(content);\n      if (isDefaultPasteBinContent(content) || !content.length || isPlainTextHtml && !isAbsoluteUrl$1) {\n        plainTextMode = true;\n      }\n      if (plainTextMode || isAbsoluteUrl$1) {\n        if (hasContentType(clipboardContent, 'text/plain') && isPlainTextHtml) {\n          content = clipboardContent['text/plain'];\n        } else {\n          content = innerText(content);\n        }\n      }\n      if (isDefaultPasteBinContent(content)) {\n        return;\n      }\n      if (plainTextMode) {\n        pasteText(editor, content, shouldSimulateInputEvent);\n      } else {\n        pasteHtml(editor, content, isInternal, shouldSimulateInputEvent);\n      }\n    };\n    const registerEventHandlers = (editor, pasteBin, pasteFormat) => {\n      let keyboardPastePlainTextState;\n      const getLastRng = () => pasteBin.getLastRng() || editor.selection.getRng();\n      editor.on('keydown', e => {\n        if (isKeyboardPasteEvent(e) && !e.isDefaultPrevented()) {\n          keyboardPastePlainTextState = e.shiftKey && e.keyCode === 86;\n        }\n      });\n      editor.on('paste', e => {\n        if (e.isDefaultPrevented() || isBrokenAndroidClipboardEvent(e)) {\n          return;\n        }\n        const plainTextMode = pasteFormat.get() === 'text' || keyboardPastePlainTextState;\n        keyboardPastePlainTextState = false;\n        const clipboardContent = getDataTransferItems(e.clipboardData);\n        if (!hasHtmlOrText(clipboardContent) && pasteImageData(editor, e, getLastRng())) {\n          return;\n        }\n        if (hasContentType(clipboardContent, 'text/html')) {\n          e.preventDefault();\n          insertClipboardContent(editor, clipboardContent, clipboardContent['text/html'], plainTextMode, true);\n        } else if (hasContentType(clipboardContent, 'text/plain') && hasContentType(clipboardContent, 'text/uri-list')) {\n          e.preventDefault();\n          insertClipboardContent(editor, clipboardContent, clipboardContent['text/plain'], plainTextMode, true);\n        } else {\n          pasteBin.create();\n          Delay.setEditorTimeout(editor, () => {\n            const html = pasteBin.getHtml();\n            pasteBin.remove();\n            insertClipboardContent(editor, clipboardContent, html, plainTextMode, false);\n          }, 0);\n        }\n      });\n    };\n    const registerDataImageFilter = editor => {\n      const isWebKitFakeUrl = src => startsWith(src, 'webkit-fake-url');\n      const isDataUri = src => startsWith(src, 'data:');\n      const isPasteInsert = args => {\n        var _a;\n        return ((_a = args.data) === null || _a === void 0 ? void 0 : _a.paste) === true;\n      };\n      editor.parser.addNodeFilter('img', (nodes, name, args) => {\n        if (!shouldPasteDataImages(editor) && isPasteInsert(args)) {\n          for (const node of nodes) {\n            const src = node.attr('src');\n            if (isString(src) && !node.attr('data-mce-object') && src !== Env.transparentSrc) {\n              if (isWebKitFakeUrl(src)) {\n                node.remove();\n              } else if (!shouldAllowHtmlDataUrls(editor) && isDataUri(src)) {\n                node.remove();\n              }\n            }\n          }\n        }\n      });\n    };\n    const registerEventsAndFilters = (editor, pasteBin, pasteFormat) => {\n      registerEventHandlers(editor, pasteBin, pasteFormat);\n      registerDataImageFilter(editor);\n    };\n\n    const togglePlainTextPaste = (editor, pasteFormat) => {\n      if (pasteFormat.get() === 'text') {\n        pasteFormat.set('html');\n        firePastePlainTextToggle(editor, false);\n      } else {\n        pasteFormat.set('text');\n        firePastePlainTextToggle(editor, true);\n      }\n      editor.focus();\n    };\n    const register$1 = (editor, pasteFormat) => {\n      editor.addCommand('mceTogglePlainTextPaste', () => {\n        togglePlainTextPaste(editor, pasteFormat);\n      });\n      editor.addCommand('mceInsertClipboardContent', (ui, value) => {\n        if (value.html) {\n          pasteHtml(editor, value.html, value.internal, false);\n        }\n        if (value.text) {\n          pasteText(editor, value.text, false);\n        }\n      });\n    };\n\n    const setHtml5Clipboard = (clipboardData, html, text) => {\n      if (clipboardData) {\n        try {\n          clipboardData.clearData();\n          clipboardData.setData('text/html', html);\n          clipboardData.setData('text/plain', text);\n          clipboardData.setData(internalHtmlMime(), html);\n          return true;\n        } catch (e) {\n          return false;\n        }\n      } else {\n        return false;\n      }\n    };\n    const setClipboardData = (evt, data, fallback, done) => {\n      if (setHtml5Clipboard(evt.clipboardData, data.html, data.text)) {\n        evt.preventDefault();\n        done();\n      } else {\n        fallback(data.html, done);\n      }\n    };\n    const fallback = editor => (html, done) => {\n      const {dom, selection} = editor;\n      const outer = dom.create('div', {\n        'contenteditable': 'false',\n        'data-mce-bogus': 'all'\n      });\n      const inner = dom.create('div', { contenteditable: 'true' }, html);\n      dom.setStyles(outer, {\n        position: 'fixed',\n        top: '0',\n        left: '-3000px',\n        width: '1000px',\n        overflow: 'hidden'\n      });\n      outer.appendChild(inner);\n      dom.add(editor.getBody(), outer);\n      const range = selection.getRng();\n      inner.focus();\n      const offscreenRange = dom.createRng();\n      offscreenRange.selectNodeContents(inner);\n      selection.setRng(offscreenRange);\n      Delay.setEditorTimeout(editor, () => {\n        selection.setRng(range);\n        dom.remove(outer);\n        done();\n      }, 0);\n    };\n    const getData = editor => ({\n      html: mark(editor.selection.getContent({ contextual: true })),\n      text: editor.selection.getContent({ format: 'text' })\n    });\n    const isTableSelection = editor => !!editor.dom.getParent(editor.selection.getStart(), 'td[data-mce-selected],th[data-mce-selected]', editor.getBody());\n    const hasSelectedContent = editor => !editor.selection.isCollapsed() || isTableSelection(editor);\n    const cut = editor => evt => {\n      if (!evt.isDefaultPrevented() && hasSelectedContent(editor) && editor.selection.isEditable()) {\n        setClipboardData(evt, getData(editor), fallback(editor), () => {\n          if (Env.browser.isChromium() || Env.browser.isFirefox()) {\n            const rng = editor.selection.getRng();\n            Delay.setEditorTimeout(editor, () => {\n              editor.selection.setRng(rng);\n              editor.execCommand('Delete');\n            }, 0);\n          } else {\n            editor.execCommand('Delete');\n          }\n        });\n      }\n    };\n    const copy = editor => evt => {\n      if (!evt.isDefaultPrevented() && hasSelectedContent(editor)) {\n        setClipboardData(evt, getData(editor), fallback(editor), noop);\n      }\n    };\n    const register = editor => {\n      editor.on('cut', cut(editor));\n      editor.on('copy', copy(editor));\n    };\n\n    const getCaretRangeFromEvent = (editor, e) => {\n      var _a, _b;\n      return RangeUtils.getCaretRangeFromPoint((_a = e.clientX) !== null && _a !== void 0 ? _a : 0, (_b = e.clientY) !== null && _b !== void 0 ? _b : 0, editor.getDoc());\n    };\n    const isPlainTextFileUrl = content => {\n      const plainTextContent = content['text/plain'];\n      return plainTextContent ? plainTextContent.indexOf('file://') === 0 : false;\n    };\n    const setFocusedRange = (editor, rng) => {\n      editor.focus();\n      if (rng) {\n        editor.selection.setRng(rng);\n      }\n    };\n    const hasImage = dataTransfer => exists(dataTransfer.files, file => /^image\\//.test(file.type));\n    const needsCustomInternalDrop = (dom, schema, target, dropContent) => {\n      const parentTransparent = dom.getParent(target, node => isTransparentBlock(schema, node));\n      const inSummary = !isNull(dom.getParent(target, 'summary'));\n      if (inSummary) {\n        return true;\n      } else if (parentTransparent && has$2(dropContent, 'text/html')) {\n        const fragment = new DOMParser().parseFromString(dropContent['text/html'], 'text/html').body;\n        return !isNull(fragment.querySelector(parentTransparent.nodeName.toLowerCase()));\n      } else {\n        return false;\n      }\n    };\n    const setupSummaryDeleteByDragFix = editor => {\n      editor.on('input', e => {\n        const hasNoSummary = el => isNull(el.querySelector('summary'));\n        if (e.inputType === 'deleteByDrag') {\n          const brokenDetailElements = filter$5(editor.dom.select('details'), hasNoSummary);\n          each$e(brokenDetailElements, details => {\n            if (isBr$6(details.firstChild)) {\n              details.firstChild.remove();\n            }\n            const summary = editor.dom.create('summary');\n            summary.appendChild(createPaddingBr().dom);\n            details.prepend(summary);\n          });\n        }\n      });\n    };\n    const setup$a = (editor, draggingInternallyState) => {\n      if (shouldPasteBlockDrop(editor)) {\n        editor.on('dragend dragover draggesture dragdrop drop drag', e => {\n          e.preventDefault();\n          e.stopPropagation();\n        });\n      }\n      if (!shouldPasteDataImages(editor)) {\n        editor.on('drop', e => {\n          const dataTransfer = e.dataTransfer;\n          if (dataTransfer && hasImage(dataTransfer)) {\n            e.preventDefault();\n          }\n        });\n      }\n      editor.on('drop', e => {\n        if (e.isDefaultPrevented()) {\n          return;\n        }\n        const rng = getCaretRangeFromEvent(editor, e);\n        if (isNullable(rng)) {\n          return;\n        }\n        const dropContent = getDataTransferItems(e.dataTransfer);\n        const internal = hasContentType(dropContent, internalHtmlMime());\n        if ((!hasHtmlOrText(dropContent) || isPlainTextFileUrl(dropContent)) && pasteImageData(editor, e, rng)) {\n          return;\n        }\n        const internalContent = dropContent[internalHtmlMime()];\n        const content = internalContent || dropContent['text/html'] || dropContent['text/plain'];\n        const needsInternalDrop = needsCustomInternalDrop(editor.dom, editor.schema, rng.startContainer, dropContent);\n        const isInternalDrop = draggingInternallyState.get();\n        if (isInternalDrop && !needsInternalDrop) {\n          return;\n        }\n        if (content) {\n          e.preventDefault();\n          Delay.setEditorTimeout(editor, () => {\n            editor.undoManager.transact(() => {\n              if (internalContent || isInternalDrop && needsInternalDrop) {\n                editor.execCommand('Delete');\n              }\n              setFocusedRange(editor, rng);\n              const trimmedContent = trimHtml(content);\n              if (dropContent['text/html']) {\n                pasteHtml(editor, trimmedContent, internal, true);\n              } else {\n                pasteText(editor, trimmedContent, true);\n              }\n            });\n          });\n        }\n      });\n      editor.on('dragstart', _e => {\n        draggingInternallyState.set(true);\n      });\n      editor.on('dragover dragend', e => {\n        if (shouldPasteDataImages(editor) && !draggingInternallyState.get()) {\n          e.preventDefault();\n          setFocusedRange(editor, getCaretRangeFromEvent(editor, e));\n        }\n        if (e.type === 'dragend') {\n          draggingInternallyState.set(false);\n        }\n      });\n      setupSummaryDeleteByDragFix(editor);\n    };\n\n    const setup$9 = editor => {\n      const processEvent = f => e => {\n        f(editor, e);\n      };\n      const preProcess = getPastePreProcess(editor);\n      if (isFunction(preProcess)) {\n        editor.on('PastePreProcess', processEvent(preProcess));\n      }\n      const postProcess = getPastePostProcess(editor);\n      if (isFunction(postProcess)) {\n        editor.on('PastePostProcess', processEvent(postProcess));\n      }\n    };\n\n    const addPreProcessFilter = (editor, filterFunc) => {\n      editor.on('PastePreProcess', e => {\n        e.content = filterFunc(editor, e.content, e.internal);\n      });\n    };\n    const rgbRegExp = /rgb\\s*\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)/gi;\n    const rgbToHex = value => Tools.trim(value).replace(rgbRegExp, rgbaToHexString).toLowerCase();\n    const removeWebKitStyles = (editor, content, internal) => {\n      const webKitStylesOption = getPasteWebkitStyles(editor);\n      if (internal || webKitStylesOption === 'all' || !shouldPasteRemoveWebKitStyles(editor)) {\n        return content;\n      }\n      const webKitStyles = webKitStylesOption ? webKitStylesOption.split(/[, ]/) : [];\n      if (webKitStyles && webKitStylesOption !== 'none') {\n        const dom = editor.dom, node = editor.selection.getNode();\n        content = content.replace(/(<[^>]+) style=\"([^\"]*)\"([^>]*>)/gi, (all, before, value, after) => {\n          const inputStyles = dom.parseStyle(dom.decode(value));\n          const outputStyles = {};\n          for (let i = 0; i < webKitStyles.length; i++) {\n            const inputValue = inputStyles[webKitStyles[i]];\n            let compareInput = inputValue;\n            let currentValue = dom.getStyle(node, webKitStyles[i], true);\n            if (/color/.test(webKitStyles[i])) {\n              compareInput = rgbToHex(compareInput);\n              currentValue = rgbToHex(currentValue);\n            }\n            if (currentValue !== compareInput) {\n              outputStyles[webKitStyles[i]] = inputValue;\n            }\n          }\n          const outputStyle = dom.serializeStyle(outputStyles, 'span');\n          if (outputStyle) {\n            return before + ' style=\"' + outputStyle + '\"' + after;\n          }\n          return before + after;\n        });\n      } else {\n        content = content.replace(/(<[^>]+) style=\"([^\"]*)\"([^>]*>)/gi, '$1$3');\n      }\n      content = content.replace(/(<[^>]+) data-mce-style=\"([^\"]+)\"([^>]*>)/gi, (all, before, value, after) => {\n        return before + ' style=\"' + value + '\"' + after;\n      });\n      return content;\n    };\n    const setup$8 = editor => {\n      if (Env.browser.isChromium() || Env.browser.isSafari()) {\n        addPreProcessFilter(editor, removeWebKitStyles);\n      }\n    };\n\n    const setup$7 = editor => {\n      const draggingInternallyState = Cell(false);\n      const pasteFormat = Cell(isPasteAsTextEnabled(editor) ? 'text' : 'html');\n      const pasteBin = PasteBin(editor);\n      setup$8(editor);\n      register$1(editor, pasteFormat);\n      setup$9(editor);\n      editor.on('PreInit', () => {\n        register(editor);\n        setup$a(editor, draggingInternallyState);\n        registerEventsAndFilters(editor, pasteBin, pasteFormat);\n      });\n    };\n\n    const preventSummaryToggle = editor => {\n      editor.on('click', e => {\n        if (editor.dom.getParent(e.target, 'details')) {\n          e.preventDefault();\n        }\n      });\n    };\n    const filterDetails = editor => {\n      editor.parser.addNodeFilter('details', elms => {\n        const initialStateOption = getDetailsInitialState(editor);\n        each$e(elms, details => {\n          if (initialStateOption === 'expanded') {\n            details.attr('open', 'open');\n          } else if (initialStateOption === 'collapsed') {\n            details.attr('open', null);\n          }\n        });\n      });\n      editor.serializer.addNodeFilter('details', elms => {\n        const serializedStateOption = getDetailsSerializedState(editor);\n        each$e(elms, details => {\n          if (serializedStateOption === 'expanded') {\n            details.attr('open', 'open');\n          } else if (serializedStateOption === 'collapsed') {\n            details.attr('open', null);\n          }\n        });\n      });\n    };\n    const setup$6 = editor => {\n      preventSummaryToggle(editor);\n      filterDetails(editor);\n    };\n\n    const isBr = isBr$6;\n    const isText = isText$b;\n    const isContentEditableFalse$2 = elm => isContentEditableFalse$b(elm.dom);\n    const isContentEditableTrue = elm => isContentEditableTrue$3(elm.dom);\n    const isRoot = rootNode => elm => eq(SugarElement.fromDom(rootNode), elm);\n    const getClosestScope = (node, rootNode, schema) => closest$4(SugarElement.fromDom(node), elm => isContentEditableTrue(elm) || schema.isBlock(name(elm)), isRoot(rootNode)).getOr(SugarElement.fromDom(rootNode)).dom;\n    const getClosestCef = (node, rootNode) => closest$4(SugarElement.fromDom(node), isContentEditableFalse$2, isRoot(rootNode));\n    const findEdgeCaretCandidate = (startNode, scope, forward) => {\n      const walker = new DomTreeWalker(startNode, scope);\n      const next = forward ? walker.next.bind(walker) : walker.prev.bind(walker);\n      let result = startNode;\n      for (let current = forward ? startNode : next(); current && !isBr(current); current = next()) {\n        if (isCaretCandidate$3(current)) {\n          result = current;\n        }\n      }\n      return result;\n    };\n    const findClosestBlockRange = (startRng, rootNode, schema) => {\n      const startPos = CaretPosition.fromRangeStart(startRng);\n      const clickNode = startPos.getNode();\n      const scope = getClosestScope(clickNode, rootNode, schema);\n      const startNode = findEdgeCaretCandidate(clickNode, scope, false);\n      const endNode = findEdgeCaretCandidate(clickNode, scope, true);\n      const rng = document.createRange();\n      getClosestCef(startNode, scope).fold(() => {\n        if (isText(startNode)) {\n          rng.setStart(startNode, 0);\n        } else {\n          rng.setStartBefore(startNode);\n        }\n      }, cef => rng.setStartBefore(cef.dom));\n      getClosestCef(endNode, scope).fold(() => {\n        if (isText(endNode)) {\n          rng.setEnd(endNode, endNode.data.length);\n        } else {\n          rng.setEndAfter(endNode);\n        }\n      }, cef => rng.setEndAfter(cef.dom));\n      return rng;\n    };\n    const onTripleClickSelect = editor => {\n      const rng = findClosestBlockRange(editor.selection.getRng(), editor.getBody(), editor.schema);\n      editor.selection.setRng(normalize(rng));\n    };\n    const setup$5 = editor => {\n      editor.on('mousedown', e => {\n        if (e.detail >= 3) {\n          e.preventDefault();\n          onTripleClickSelect(editor);\n        }\n      });\n    };\n\n    var FakeCaretPosition;\n    (function (FakeCaretPosition) {\n      FakeCaretPosition['Before'] = 'before';\n      FakeCaretPosition['After'] = 'after';\n    }(FakeCaretPosition || (FakeCaretPosition = {})));\n    const distanceToRectLeft = (clientRect, clientX) => Math.abs(clientRect.left - clientX);\n    const distanceToRectRight = (clientRect, clientX) => Math.abs(clientRect.right - clientX);\n    const isInsideY = (clientY, clientRect) => clientY >= clientRect.top && clientY <= clientRect.bottom;\n    const collidesY = (r1, r2) => r1.top < r2.bottom && r1.bottom > r2.top;\n    const isOverlapping = (r1, r2) => {\n      const overlap = overlapY(r1, r2) / Math.min(r1.height, r2.height);\n      return collidesY(r1, r2) && overlap > 0.5;\n    };\n    const splitRectsPerAxis = (rects, y) => {\n      const intersectingRects = filter$5(rects, rect => isInsideY(y, rect));\n      return boundingClientRectFromRects(intersectingRects).fold(() => [\n        [],\n        rects\n      ], boundingRect => {\n        const {\n          pass: horizontal,\n          fail: vertical\n        } = partition$2(rects, rect => isOverlapping(rect, boundingRect));\n        return [\n          horizontal,\n          vertical\n        ];\n      });\n    };\n    const clientInfo = (rect, clientX) => {\n      return {\n        node: rect.node,\n        position: distanceToRectLeft(rect, clientX) < distanceToRectRight(rect, clientX) ? FakeCaretPosition.Before : FakeCaretPosition.After\n      };\n    };\n    const horizontalDistance = (rect, x, _y) => x > rect.left && x < rect.right ? 0 : Math.min(Math.abs(rect.left - x), Math.abs(rect.right - x));\n    const closestChildCaretCandidateNodeRect = (children, clientX, clientY, findCloserTextNode) => {\n      const caretCandidateRect = rect => {\n        if (isCaretCandidate$3(rect.node)) {\n          return Optional.some(rect);\n        } else if (isElement$6(rect.node)) {\n          return closestChildCaretCandidateNodeRect(from(rect.node.childNodes), clientX, clientY, false);\n        } else {\n          return Optional.none();\n        }\n      };\n      const tryFindSecondBestTextNode = (closest, sndClosest, distance) => {\n        return caretCandidateRect(sndClosest).filter(rect => {\n          const deltaDistance = Math.abs(distance(closest, clientX, clientY) - distance(rect, clientX, clientY));\n          return deltaDistance < 2 && isText$b(rect.node);\n        });\n      };\n      const findClosestCaretCandidateNodeRect = (rects, distance) => {\n        const sortedRects = sort(rects, (r1, r2) => distance(r1, clientX, clientY) - distance(r2, clientX, clientY));\n        return findMap(sortedRects, caretCandidateRect).map(closest => {\n          if (findCloserTextNode && !isText$b(closest.node) && sortedRects.length > 1) {\n            return tryFindSecondBestTextNode(closest, sortedRects[1], distance).getOr(closest);\n          } else {\n            return closest;\n          }\n        });\n      };\n      const [horizontalRects, verticalRects] = splitRectsPerAxis(getClientRects(children), clientY);\n      const {\n        pass: above,\n        fail: below\n      } = partition$2(verticalRects, rect => rect.top < clientY);\n      return findClosestCaretCandidateNodeRect(horizontalRects, horizontalDistance).orThunk(() => findClosestCaretCandidateNodeRect(below, distanceToRectEdgeFromXY)).orThunk(() => findClosestCaretCandidateNodeRect(above, distanceToRectEdgeFromXY));\n    };\n    const traverseUp = (rootElm, scope, clientX, clientY) => {\n      const helper = (scope, prevScope) => {\n        const isDragGhostContainer = node => isElement$6(node) && node.classList.contains('mce-drag-container');\n        const childNodesWithoutGhost = filter$5(scope.dom.childNodes, not(isDragGhostContainer));\n        return prevScope.fold(() => closestChildCaretCandidateNodeRect(childNodesWithoutGhost, clientX, clientY, true), prevScope => {\n          const uncheckedChildren = filter$5(childNodesWithoutGhost, node => node !== prevScope.dom);\n          return closestChildCaretCandidateNodeRect(uncheckedChildren, clientX, clientY, true);\n        }).orThunk(() => {\n          const parent = eq(scope, rootElm) ? Optional.none() : parentElement(scope);\n          return parent.bind(newScope => helper(newScope, Optional.some(scope)));\n        });\n      };\n      return helper(scope, Optional.none());\n    };\n    const closestCaretCandidateNodeRect = (root, clientX, clientY) => {\n      const rootElm = SugarElement.fromDom(root);\n      const ownerDoc = documentOrOwner(rootElm);\n      const elementAtPoint = SugarElement.fromPoint(ownerDoc, clientX, clientY).filter(elm => contains(rootElm, elm));\n      const element = elementAtPoint.getOr(rootElm);\n      return traverseUp(rootElm, element, clientX, clientY);\n    };\n    const closestFakeCaretCandidate = (root, clientX, clientY) => closestCaretCandidateNodeRect(root, clientX, clientY).filter(rect => isFakeCaretTarget(rect.node)).map(rect => clientInfo(rect, clientX));\n\n    const getAbsolutePosition = elm => {\n      var _a, _b;\n      const clientRect = elm.getBoundingClientRect();\n      const doc = elm.ownerDocument;\n      const docElem = doc.documentElement;\n      const win = doc.defaultView;\n      return {\n        top: clientRect.top + ((_a = win === null || win === void 0 ? void 0 : win.scrollY) !== null && _a !== void 0 ? _a : 0) - docElem.clientTop,\n        left: clientRect.left + ((_b = win === null || win === void 0 ? void 0 : win.scrollX) !== null && _b !== void 0 ? _b : 0) - docElem.clientLeft\n      };\n    };\n    const getBodyPosition = editor => editor.inline ? getAbsolutePosition(editor.getBody()) : {\n      left: 0,\n      top: 0\n    };\n    const getScrollPosition = editor => {\n      const body = editor.getBody();\n      return editor.inline ? {\n        left: body.scrollLeft,\n        top: body.scrollTop\n      } : {\n        left: 0,\n        top: 0\n      };\n    };\n    const getBodyScroll = editor => {\n      const body = editor.getBody(), docElm = editor.getDoc().documentElement;\n      const inlineScroll = {\n        left: body.scrollLeft,\n        top: body.scrollTop\n      };\n      const iframeScroll = {\n        left: body.scrollLeft || docElm.scrollLeft,\n        top: body.scrollTop || docElm.scrollTop\n      };\n      return editor.inline ? inlineScroll : iframeScroll;\n    };\n    const getMousePosition = (editor, event) => {\n      if (event.target.ownerDocument !== editor.getDoc()) {\n        const iframePosition = getAbsolutePosition(editor.getContentAreaContainer());\n        const scrollPosition = getBodyScroll(editor);\n        return {\n          left: event.pageX - iframePosition.left + scrollPosition.left,\n          top: event.pageY - iframePosition.top + scrollPosition.top\n        };\n      }\n      return {\n        left: event.pageX,\n        top: event.pageY\n      };\n    };\n    const calculatePosition = (bodyPosition, scrollPosition, mousePosition) => ({\n      pageX: mousePosition.left - bodyPosition.left + scrollPosition.left,\n      pageY: mousePosition.top - bodyPosition.top + scrollPosition.top\n    });\n    const calc = (editor, event) => calculatePosition(getBodyPosition(editor), getScrollPosition(editor), getMousePosition(editor, event));\n\n    const getTargetProps = target => ({\n      target,\n      srcElement: target\n    });\n    const makeDndEventFromMouseEvent = (type, mouseEvent, target, dataTransfer) => ({\n      ...mouseEvent,\n      dataTransfer,\n      type,\n      ...getTargetProps(target)\n    });\n    const makeDndEvent = (type, target, dataTransfer) => {\n      const fail = die('Function not supported on simulated event.');\n      const event = {\n        bubbles: true,\n        cancelBubble: false,\n        cancelable: true,\n        composed: false,\n        currentTarget: null,\n        defaultPrevented: false,\n        eventPhase: 0,\n        isTrusted: true,\n        returnValue: false,\n        timeStamp: 0,\n        type,\n        composedPath: fail,\n        initEvent: fail,\n        preventDefault: noop,\n        stopImmediatePropagation: noop,\n        stopPropagation: noop,\n        AT_TARGET: window.Event.AT_TARGET,\n        BUBBLING_PHASE: window.Event.BUBBLING_PHASE,\n        CAPTURING_PHASE: window.Event.CAPTURING_PHASE,\n        NONE: window.Event.NONE,\n        altKey: false,\n        button: 0,\n        buttons: 0,\n        clientX: 0,\n        clientY: 0,\n        ctrlKey: false,\n        metaKey: false,\n        movementX: 0,\n        movementY: 0,\n        offsetX: 0,\n        offsetY: 0,\n        pageX: 0,\n        pageY: 0,\n        relatedTarget: null,\n        screenX: 0,\n        screenY: 0,\n        shiftKey: false,\n        x: 0,\n        y: 0,\n        detail: 0,\n        view: null,\n        which: 0,\n        initUIEvent: fail,\n        initMouseEvent: fail,\n        getModifierState: fail,\n        dataTransfer,\n        ...getTargetProps(target)\n      };\n      return event;\n    };\n    const makeDataTransferCopyForDragEvent = (dataTransfer, eventType) => {\n      const copy = cloneDataTransfer(dataTransfer);\n      if (eventType === 'dragstart') {\n        setDragstartEvent(copy);\n        setReadWriteMode(copy);\n      } else if (eventType === 'drop') {\n        setDropEvent(copy);\n        setReadOnlyMode(copy);\n      } else {\n        setDragendEvent(copy);\n        setProtectedMode(copy);\n      }\n      return copy;\n    };\n    const makeDragEvent = (type, target, dataTransfer, mouseEvent) => {\n      const dataTransferForDispatch = makeDataTransferCopyForDragEvent(dataTransfer, type);\n      return isUndefined(mouseEvent) ? makeDndEvent(type, target, dataTransferForDispatch) : makeDndEventFromMouseEvent(type, mouseEvent, target, dataTransferForDispatch);\n    };\n\n    const scrollPixelsPerInterval = 32;\n    const scrollIntervalValue = 100;\n    const mouseRangeToTriggerScrollInsideEditor = 8;\n    const mouseRangeToTriggerScrollOutsideEditor = 16;\n    const isContentEditableFalse$1 = isContentEditableFalse$b;\n    const isContentEditable = or(isContentEditableFalse$1, isContentEditableTrue$3);\n    const isDraggable = (dom, rootElm, elm) => isContentEditableFalse$1(elm) && elm !== rootElm && dom.isEditable(elm.parentElement);\n    const isValidDropTarget = (editor, targetElement, dragElement) => {\n      if (isNullable(targetElement)) {\n        return false;\n      } else if (targetElement === dragElement || editor.dom.isChildOf(targetElement, dragElement)) {\n        return false;\n      } else {\n        return editor.dom.isEditable(targetElement);\n      }\n    };\n    const createGhost = (editor, elm, width, height) => {\n      const dom = editor.dom;\n      const clonedElm = elm.cloneNode(true);\n      dom.setStyles(clonedElm, {\n        width,\n        height\n      });\n      dom.setAttrib(clonedElm, 'data-mce-selected', null);\n      const ghostElm = dom.create('div', {\n        'class': 'mce-drag-container',\n        'data-mce-bogus': 'all',\n        'unselectable': 'on',\n        'contenteditable': 'false'\n      });\n      dom.setStyles(ghostElm, {\n        position: 'absolute',\n        opacity: 0.5,\n        overflow: 'hidden',\n        border: 0,\n        padding: 0,\n        margin: 0,\n        width,\n        height\n      });\n      dom.setStyles(clonedElm, {\n        margin: 0,\n        boxSizing: 'border-box'\n      });\n      ghostElm.appendChild(clonedElm);\n      return ghostElm;\n    };\n    const appendGhostToBody = (ghostElm, bodyElm) => {\n      if (ghostElm.parentNode !== bodyElm) {\n        bodyElm.appendChild(ghostElm);\n      }\n    };\n    const scrollEditor = (direction, amount) => win => () => {\n      const current = direction === 'left' ? win.scrollX : win.scrollY;\n      win.scroll({\n        [direction]: current + amount,\n        behavior: 'smooth'\n      });\n    };\n    const scrollLeft = scrollEditor('left', -scrollPixelsPerInterval);\n    const scrollRight = scrollEditor('left', scrollPixelsPerInterval);\n    const scrollUp = scrollEditor('top', -scrollPixelsPerInterval);\n    const scrollDown = scrollEditor('top', scrollPixelsPerInterval);\n    const moveGhost = (ghostElm, position, width, height, maxX, maxY, mouseY, mouseX, contentAreaContainer, win, state, mouseEventOriginatedFromWithinTheEditor) => {\n      let overflowX = 0, overflowY = 0;\n      ghostElm.style.left = position.pageX + 'px';\n      ghostElm.style.top = position.pageY + 'px';\n      if (position.pageX + width > maxX) {\n        overflowX = position.pageX + width - maxX;\n      }\n      if (position.pageY + height > maxY) {\n        overflowY = position.pageY + height - maxY;\n      }\n      ghostElm.style.width = width - overflowX + 'px';\n      ghostElm.style.height = height - overflowY + 'px';\n      const clientHeight = contentAreaContainer.clientHeight;\n      const clientWidth = contentAreaContainer.clientWidth;\n      const outerMouseY = mouseY + contentAreaContainer.getBoundingClientRect().top;\n      const outerMouseX = mouseX + contentAreaContainer.getBoundingClientRect().left;\n      state.on(state => {\n        state.intervalId.clear();\n        if (state.dragging && mouseEventOriginatedFromWithinTheEditor) {\n          if (mouseY + mouseRangeToTriggerScrollInsideEditor >= clientHeight) {\n            state.intervalId.set(scrollDown(win));\n          } else if (mouseY - mouseRangeToTriggerScrollInsideEditor <= 0) {\n            state.intervalId.set(scrollUp(win));\n          } else if (mouseX + mouseRangeToTriggerScrollInsideEditor >= clientWidth) {\n            state.intervalId.set(scrollRight(win));\n          } else if (mouseX - mouseRangeToTriggerScrollInsideEditor <= 0) {\n            state.intervalId.set(scrollLeft(win));\n          } else if (outerMouseY + mouseRangeToTriggerScrollOutsideEditor >= window.innerHeight) {\n            state.intervalId.set(scrollDown(window));\n          } else if (outerMouseY - mouseRangeToTriggerScrollOutsideEditor <= 0) {\n            state.intervalId.set(scrollUp(window));\n          } else if (outerMouseX + mouseRangeToTriggerScrollOutsideEditor >= window.innerWidth) {\n            state.intervalId.set(scrollRight(window));\n          } else if (outerMouseX - mouseRangeToTriggerScrollOutsideEditor <= 0) {\n            state.intervalId.set(scrollLeft(window));\n          }\n        }\n      });\n    };\n    const removeElement = elm => {\n      if (elm && elm.parentNode) {\n        elm.parentNode.removeChild(elm);\n      }\n    };\n    const removeElementWithPadding = (dom, elm) => {\n      const parentBlock = dom.getParent(elm.parentNode, dom.isBlock);\n      removeElement(elm);\n      if (parentBlock && parentBlock !== dom.getRoot() && dom.isEmpty(parentBlock)) {\n        fillWithPaddingBr(SugarElement.fromDom(parentBlock));\n      }\n    };\n    const isLeftMouseButtonPressed = e => e.button === 0;\n    const applyRelPos = (state, position) => ({\n      pageX: position.pageX - state.relX,\n      pageY: position.pageY + 5\n    });\n    const start = (state, editor) => e => {\n      if (isLeftMouseButtonPressed(e)) {\n        const ceElm = find$2(editor.dom.getParents(e.target), isContentEditable).getOr(null);\n        if (isNonNullable(ceElm) && isDraggable(editor.dom, editor.getBody(), ceElm)) {\n          const elmPos = editor.dom.getPos(ceElm);\n          const bodyElm = editor.getBody();\n          const docElm = editor.getDoc().documentElement;\n          state.set({\n            element: ceElm,\n            dataTransfer: createDataTransfer(),\n            dragging: false,\n            screenX: e.screenX,\n            screenY: e.screenY,\n            maxX: (editor.inline ? bodyElm.scrollWidth : docElm.offsetWidth) - 2,\n            maxY: (editor.inline ? bodyElm.scrollHeight : docElm.offsetHeight) - 2,\n            relX: e.pageX - elmPos.x,\n            relY: e.pageY - elmPos.y,\n            width: ceElm.offsetWidth,\n            height: ceElm.offsetHeight,\n            ghost: createGhost(editor, ceElm, ceElm.offsetWidth, ceElm.offsetHeight),\n            intervalId: repeatable(scrollIntervalValue)\n          });\n        }\n      }\n    };\n    const placeCaretAt = (editor, clientX, clientY) => {\n      editor._selectionOverrides.hideFakeCaret();\n      closestFakeCaretCandidate(editor.getBody(), clientX, clientY).fold(() => editor.selection.placeCaretAt(clientX, clientY), caretInfo => {\n        const range = editor._selectionOverrides.showCaret(1, caretInfo.node, caretInfo.position === FakeCaretPosition.Before, false);\n        if (range) {\n          editor.selection.setRng(range);\n        } else {\n          editor.selection.placeCaretAt(clientX, clientY);\n        }\n      });\n    };\n    const dispatchDragEvent = (editor, type, target, dataTransfer, mouseEvent) => {\n      if (type === 'dragstart') {\n        setHtmlData(dataTransfer, editor.dom.getOuterHTML(target));\n      }\n      const event = makeDragEvent(type, target, dataTransfer, mouseEvent);\n      const args = editor.dispatch(type, event);\n      return args;\n    };\n    const move = (state, editor) => {\n      const throttledPlaceCaretAt = first$1((clientX, clientY) => placeCaretAt(editor, clientX, clientY), 0);\n      editor.on('remove', throttledPlaceCaretAt.cancel);\n      const state_ = state;\n      return e => state.on(state => {\n        const movement = Math.max(Math.abs(e.screenX - state.screenX), Math.abs(e.screenY - state.screenY));\n        if (!state.dragging && movement > 10) {\n          const args = dispatchDragEvent(editor, 'dragstart', state.element, state.dataTransfer, e);\n          if (isNonNullable(args.dataTransfer)) {\n            state.dataTransfer = args.dataTransfer;\n          }\n          if (args.isDefaultPrevented()) {\n            return;\n          }\n          state.dragging = true;\n          editor.focus();\n        }\n        if (state.dragging) {\n          const mouseEventOriginatedFromWithinTheEditor = e.currentTarget === editor.getDoc().documentElement;\n          const targetPos = applyRelPos(state, calc(editor, e));\n          appendGhostToBody(state.ghost, editor.getBody());\n          moveGhost(state.ghost, targetPos, state.width, state.height, state.maxX, state.maxY, e.clientY, e.clientX, editor.getContentAreaContainer(), editor.getWin(), state_, mouseEventOriginatedFromWithinTheEditor);\n          throttledPlaceCaretAt.throttle(e.clientX, e.clientY);\n        }\n      });\n    };\n    const getRawTarget = selection => {\n      const sel = selection.getSel();\n      if (isNonNullable(sel)) {\n        const rng = sel.getRangeAt(0);\n        const startContainer = rng.startContainer;\n        return isText$b(startContainer) ? startContainer.parentNode : startContainer;\n      } else {\n        return null;\n      }\n    };\n    const drop = (state, editor) => e => {\n      state.on(state => {\n        var _a;\n        state.intervalId.clear();\n        if (state.dragging) {\n          if (isValidDropTarget(editor, getRawTarget(editor.selection), state.element)) {\n            const dropTarget = (_a = editor.getDoc().elementFromPoint(e.clientX, e.clientY)) !== null && _a !== void 0 ? _a : editor.getBody();\n            const args = dispatchDragEvent(editor, 'drop', dropTarget, state.dataTransfer, e);\n            if (!args.isDefaultPrevented()) {\n              editor.undoManager.transact(() => {\n                removeElementWithPadding(editor.dom, state.element);\n                getHtmlData(state.dataTransfer).each(content => editor.insertContent(content));\n                editor._selectionOverrides.hideFakeCaret();\n              });\n            }\n          }\n          dispatchDragEvent(editor, 'dragend', editor.getBody(), state.dataTransfer, e);\n        }\n      });\n      removeDragState(state);\n    };\n    const stopDragging = (state, editor, e) => {\n      state.on(state => {\n        state.intervalId.clear();\n        if (state.dragging) {\n          e.fold(() => dispatchDragEvent(editor, 'dragend', state.element, state.dataTransfer), mouseEvent => dispatchDragEvent(editor, 'dragend', state.element, state.dataTransfer, mouseEvent));\n        }\n      });\n      removeDragState(state);\n    };\n    const stop = (state, editor) => e => stopDragging(state, editor, Optional.some(e));\n    const removeDragState = state => {\n      state.on(state => {\n        state.intervalId.clear();\n        removeElement(state.ghost);\n      });\n      state.clear();\n    };\n    const bindFakeDragEvents = editor => {\n      const state = value$2();\n      const pageDom = DOMUtils.DOM;\n      const rootDocument = document;\n      const dragStartHandler = start(state, editor);\n      const dragHandler = move(state, editor);\n      const dropHandler = drop(state, editor);\n      const dragEndHandler = stop(state, editor);\n      editor.on('mousedown', dragStartHandler);\n      editor.on('mousemove', dragHandler);\n      editor.on('mouseup', dropHandler);\n      pageDom.bind(rootDocument, 'mousemove', dragHandler);\n      pageDom.bind(rootDocument, 'mouseup', dragEndHandler);\n      editor.on('remove', () => {\n        pageDom.unbind(rootDocument, 'mousemove', dragHandler);\n        pageDom.unbind(rootDocument, 'mouseup', dragEndHandler);\n      });\n      editor.on('keydown', e => {\n        if (e.keyCode === VK.ESC) {\n          stopDragging(state, editor, Optional.none());\n        }\n      });\n    };\n    const blockUnsupportedFileDrop = editor => {\n      const preventFileDrop = e => {\n        if (!e.isDefaultPrevented()) {\n          const dataTransfer = e.dataTransfer;\n          if (dataTransfer && (contains$2(dataTransfer.types, 'Files') || dataTransfer.files.length > 0)) {\n            e.preventDefault();\n            if (e.type === 'drop') {\n              displayError(editor, 'Dropped file type is not supported');\n            }\n          }\n        }\n      };\n      const preventFileDropIfUIElement = e => {\n        if (isUIElement(editor, e.target)) {\n          preventFileDrop(e);\n        }\n      };\n      const setup = () => {\n        const pageDom = DOMUtils.DOM;\n        const dom = editor.dom;\n        const doc = document;\n        const editorRoot = editor.inline ? editor.getBody() : editor.getDoc();\n        const eventNames = [\n          'drop',\n          'dragover'\n        ];\n        each$e(eventNames, name => {\n          pageDom.bind(doc, name, preventFileDropIfUIElement);\n          dom.bind(editorRoot, name, preventFileDrop);\n        });\n        editor.on('remove', () => {\n          each$e(eventNames, name => {\n            pageDom.unbind(doc, name, preventFileDropIfUIElement);\n            dom.unbind(editorRoot, name, preventFileDrop);\n          });\n        });\n      };\n      editor.on('init', () => {\n        Delay.setEditorTimeout(editor, setup, 0);\n      });\n    };\n    const init$2 = editor => {\n      bindFakeDragEvents(editor);\n      if (shouldBlockUnsupportedDrop(editor)) {\n        blockUnsupportedFileDrop(editor);\n      }\n    };\n\n    const setup$4 = editor => {\n      const renderFocusCaret = first$1(() => {\n        if (!editor.removed && editor.getBody().contains(document.activeElement)) {\n          const rng = editor.selection.getRng();\n          if (rng.collapsed) {\n            const caretRange = renderRangeCaret(editor, rng, false);\n            editor.selection.setRng(caretRange);\n          }\n        }\n      }, 0);\n      editor.on('focus', () => {\n        renderFocusCaret.throttle();\n      });\n      editor.on('blur', () => {\n        renderFocusCaret.cancel();\n      });\n    };\n\n    const setup$3 = editor => {\n      editor.on('init', () => {\n        editor.on('focusin', e => {\n          const target = e.target;\n          if (isMedia$2(target)) {\n            const ceRoot = getContentEditableRoot$1(editor.getBody(), target);\n            const node = isContentEditableFalse$b(ceRoot) ? ceRoot : target;\n            if (editor.selection.getNode() !== node) {\n              selectNode(editor, node).each(rng => editor.selection.setRng(rng));\n            }\n          }\n        });\n      });\n    };\n\n    const isContentEditableFalse = isContentEditableFalse$b;\n    const getContentEditableRoot = (editor, node) => getContentEditableRoot$1(editor.getBody(), node);\n    const SelectionOverrides = editor => {\n      const selection = editor.selection, dom = editor.dom;\n      const rootNode = editor.getBody();\n      const fakeCaret = FakeCaret(editor, rootNode, dom.isBlock, () => hasFocus(editor));\n      const realSelectionId = 'sel-' + dom.uniqueId();\n      const elementSelectionAttr = 'data-mce-selected';\n      let selectedElement;\n      const isFakeSelectionElement = node => isNonNullable(node) && dom.hasClass(node, 'mce-offscreen-selection');\n      const isFakeSelectionTargetElement = node => node !== rootNode && (isContentEditableFalse(node) || isMedia$2(node)) && dom.isChildOf(node, rootNode) && dom.isEditable(node.parentNode);\n      const setRange = range => {\n        if (range) {\n          selection.setRng(range);\n        }\n      };\n      const showCaret = (direction, node, before, scrollIntoView = true) => {\n        const e = editor.dispatch('ShowCaret', {\n          target: node,\n          direction,\n          before\n        });\n        if (e.isDefaultPrevented()) {\n          return null;\n        }\n        if (scrollIntoView) {\n          selection.scrollIntoView(node, direction === -1);\n        }\n        return fakeCaret.show(before, node);\n      };\n      const showBlockCaretContainer = blockCaretContainer => {\n        if (blockCaretContainer.hasAttribute('data-mce-caret')) {\n          showCaretContainerBlock(blockCaretContainer);\n          selection.scrollIntoView(blockCaretContainer);\n        }\n      };\n      const registerEvents = () => {\n        editor.on('click', e => {\n          if (!dom.isEditable(e.target)) {\n            e.preventDefault();\n            editor.focus();\n          }\n        });\n        editor.on('blur NewBlock', removeElementSelection);\n        editor.on('ResizeWindow FullscreenStateChanged', fakeCaret.reposition);\n        editor.on('tap', e => {\n          const targetElm = e.target;\n          const contentEditableRoot = getContentEditableRoot(editor, targetElm);\n          if (isContentEditableFalse(contentEditableRoot)) {\n            e.preventDefault();\n            selectNode(editor, contentEditableRoot).each(setElementSelection);\n          } else if (isFakeSelectionTargetElement(targetElm)) {\n            selectNode(editor, targetElm).each(setElementSelection);\n          }\n        }, true);\n        editor.on('mousedown', e => {\n          const targetElm = e.target;\n          if (targetElm !== rootNode && targetElm.nodeName !== 'HTML' && !dom.isChildOf(targetElm, rootNode)) {\n            return;\n          }\n          if (!isXYInContentArea(editor, e.clientX, e.clientY)) {\n            return;\n          }\n          removeElementSelection();\n          hideFakeCaret();\n          const closestContentEditable = getContentEditableRoot(editor, targetElm);\n          if (isContentEditableFalse(closestContentEditable)) {\n            e.preventDefault();\n            selectNode(editor, closestContentEditable).each(setElementSelection);\n          } else {\n            closestFakeCaretCandidate(rootNode, e.clientX, e.clientY).each(caretInfo => {\n              e.preventDefault();\n              const range = showCaret(1, caretInfo.node, caretInfo.position === FakeCaretPosition.Before, false);\n              setRange(range);\n              if (isHTMLElement(closestContentEditable)) {\n                closestContentEditable.focus();\n              } else {\n                editor.getBody().focus();\n              }\n            });\n          }\n        });\n        editor.on('keypress', e => {\n          if (VK.modifierPressed(e)) {\n            return;\n          }\n          if (isContentEditableFalse(selection.getNode())) {\n            e.preventDefault();\n          }\n        });\n        editor.on('GetSelectionRange', e => {\n          let rng = e.range;\n          if (selectedElement) {\n            if (!selectedElement.parentNode) {\n              selectedElement = null;\n              return;\n            }\n            rng = rng.cloneRange();\n            rng.selectNode(selectedElement);\n            e.range = rng;\n          }\n        });\n        editor.on('SetSelectionRange', e => {\n          e.range = normalizeVoidElementSelection(e.range);\n          const rng = setElementSelection(e.range, e.forward);\n          if (rng) {\n            e.range = rng;\n          }\n        });\n        const isPasteBin = node => isElement$6(node) && node.id === 'mcepastebin';\n        editor.on('AfterSetSelectionRange', e => {\n          const rng = e.range;\n          const parent = rng.startContainer.parentElement;\n          if (!isRangeInCaretContainer(rng) && !isPasteBin(parent)) {\n            hideFakeCaret();\n          }\n          if (!isFakeSelectionElement(parent)) {\n            removeElementSelection();\n          }\n        });\n        init$2(editor);\n        setup$4(editor);\n        setup$3(editor);\n      };\n      const isWithinCaretContainer = node => isCaretContainer$2(node) || startsWithCaretContainer$1(node) || endsWithCaretContainer$1(node);\n      const isRangeInCaretContainer = rng => isWithinCaretContainer(rng.startContainer) || isWithinCaretContainer(rng.endContainer);\n      const normalizeVoidElementSelection = rng => {\n        const voidElements = editor.schema.getVoidElements();\n        const newRng = dom.createRng();\n        const startContainer = rng.startContainer;\n        const startOffset = rng.startOffset;\n        const endContainer = rng.endContainer;\n        const endOffset = rng.endOffset;\n        if (has$2(voidElements, startContainer.nodeName.toLowerCase())) {\n          if (startOffset === 0) {\n            newRng.setStartBefore(startContainer);\n          } else {\n            newRng.setStartAfter(startContainer);\n          }\n        } else {\n          newRng.setStart(startContainer, startOffset);\n        }\n        if (has$2(voidElements, endContainer.nodeName.toLowerCase())) {\n          if (endOffset === 0) {\n            newRng.setEndBefore(endContainer);\n          } else {\n            newRng.setEndAfter(endContainer);\n          }\n        } else {\n          newRng.setEnd(endContainer, endOffset);\n        }\n        return newRng;\n      };\n      const setupOffscreenSelection = (node, targetClone) => {\n        const body = SugarElement.fromDom(editor.getBody());\n        const doc = editor.getDoc();\n        const realSelectionContainer = descendant$1(body, '#' + realSelectionId).getOrThunk(() => {\n          const newContainer = SugarElement.fromHtml('<div data-mce-bogus=\"all\" class=\"mce-offscreen-selection\"></div>', doc);\n          set$3(newContainer, 'id', realSelectionId);\n          append$1(body, newContainer);\n          return newContainer;\n        });\n        const newRange = dom.createRng();\n        empty(realSelectionContainer);\n        append(realSelectionContainer, [\n          SugarElement.fromText(nbsp, doc),\n          SugarElement.fromDom(targetClone),\n          SugarElement.fromText(nbsp, doc)\n        ]);\n        newRange.setStart(realSelectionContainer.dom.firstChild, 1);\n        newRange.setEnd(realSelectionContainer.dom.lastChild, 0);\n        setAll(realSelectionContainer, { top: dom.getPos(node, editor.getBody()).y + 'px' });\n        focus$1(realSelectionContainer);\n        const sel = selection.getSel();\n        if (sel) {\n          sel.removeAllRanges();\n          sel.addRange(newRange);\n        }\n        return newRange;\n      };\n      const selectElement = elm => {\n        const targetClone = elm.cloneNode(true);\n        const e = editor.dispatch('ObjectSelected', {\n          target: elm,\n          targetClone\n        });\n        if (e.isDefaultPrevented()) {\n          return null;\n        }\n        const range = setupOffscreenSelection(elm, e.targetClone);\n        const nodeElm = SugarElement.fromDom(elm);\n        each$e(descendants(SugarElement.fromDom(editor.getBody()), `*[${ elementSelectionAttr }]`), elm => {\n          if (!eq(nodeElm, elm)) {\n            remove$9(elm, elementSelectionAttr);\n          }\n        });\n        if (!dom.getAttrib(elm, elementSelectionAttr)) {\n          elm.setAttribute(elementSelectionAttr, '1');\n        }\n        selectedElement = elm;\n        hideFakeCaret();\n        return range;\n      };\n      const setElementSelection = (range, forward) => {\n        if (!range) {\n          return null;\n        }\n        if (range.collapsed) {\n          if (!isRangeInCaretContainer(range)) {\n            const dir = forward ? 1 : -1;\n            const caretPosition = getNormalizedRangeEndPoint(dir, rootNode, range);\n            const beforeNode = caretPosition.getNode(!forward);\n            if (isNonNullable(beforeNode)) {\n              if (isFakeCaretTarget(beforeNode)) {\n                return showCaret(dir, beforeNode, forward ? !caretPosition.isAtEnd() : false, false);\n              }\n              if (isCaretContainerInline(beforeNode) && isContentEditableFalse$b(beforeNode.nextSibling)) {\n                const rng = dom.createRng();\n                rng.setStart(beforeNode, 0);\n                rng.setEnd(beforeNode, 0);\n                return rng;\n              }\n            }\n            const afterNode = caretPosition.getNode(forward);\n            if (isNonNullable(afterNode)) {\n              if (isFakeCaretTarget(afterNode)) {\n                return showCaret(dir, afterNode, forward ? false : !caretPosition.isAtEnd(), false);\n              }\n              if (isCaretContainerInline(afterNode) && isContentEditableFalse$b(afterNode.previousSibling)) {\n                const rng = dom.createRng();\n                rng.setStart(afterNode, 1);\n                rng.setEnd(afterNode, 1);\n                return rng;\n              }\n            }\n          }\n          return null;\n        }\n        let startContainer = range.startContainer;\n        let startOffset = range.startOffset;\n        const endOffset = range.endOffset;\n        if (isText$b(startContainer) && startOffset === 0 && isContentEditableFalse(startContainer.parentNode)) {\n          startContainer = startContainer.parentNode;\n          startOffset = dom.nodeIndex(startContainer);\n          startContainer = startContainer.parentNode;\n        }\n        if (!isElement$6(startContainer)) {\n          return null;\n        }\n        if (endOffset === startOffset + 1 && startContainer === range.endContainer) {\n          const node = startContainer.childNodes[startOffset];\n          if (isFakeSelectionTargetElement(node)) {\n            return selectElement(node);\n          }\n        }\n        return null;\n      };\n      const removeElementSelection = () => {\n        if (selectedElement) {\n          selectedElement.removeAttribute(elementSelectionAttr);\n        }\n        descendant$1(SugarElement.fromDom(editor.getBody()), '#' + realSelectionId).each(remove$4);\n        selectedElement = null;\n      };\n      const destroy = () => {\n        fakeCaret.destroy();\n        selectedElement = null;\n      };\n      const hideFakeCaret = () => {\n        fakeCaret.hide();\n      };\n      if (!isRtc(editor)) {\n        registerEvents();\n      }\n      return {\n        showCaret,\n        showBlockCaretContainer,\n        hideFakeCaret,\n        destroy\n      };\n    };\n\n    const getNormalizedTextOffset = (container, offset) => {\n      let normalizedOffset = offset;\n      for (let node = container.previousSibling; isText$b(node); node = node.previousSibling) {\n        normalizedOffset += node.data.length;\n      }\n      return normalizedOffset;\n    };\n    const generatePath = (dom, root, node, offset, normalized) => {\n      if (isText$b(node) && (offset < 0 || offset > node.data.length)) {\n        return [];\n      }\n      const p = normalized && isText$b(node) ? [getNormalizedTextOffset(node, offset)] : [offset];\n      let current = node;\n      while (current !== root && current.parentNode) {\n        p.push(dom.nodeIndex(current, normalized));\n        current = current.parentNode;\n      }\n      return current === root ? p.reverse() : [];\n    };\n    const generatePathRange = (dom, root, startNode, startOffset, endNode, endOffset, normalized = false) => {\n      const start = generatePath(dom, root, startNode, startOffset, normalized);\n      const end = generatePath(dom, root, endNode, endOffset, normalized);\n      return {\n        start,\n        end\n      };\n    };\n    const resolvePath = (root, path) => {\n      const nodePath = path.slice();\n      const offset = nodePath.pop();\n      if (!isNumber(offset)) {\n        return Optional.none();\n      } else {\n        const resolvedNode = foldl(nodePath, (optNode, index) => optNode.bind(node => Optional.from(node.childNodes[index])), Optional.some(root));\n        return resolvedNode.bind(node => {\n          if (isText$b(node) && (offset < 0 || offset > node.data.length)) {\n            return Optional.none();\n          } else {\n            return Optional.some({\n              node,\n              offset\n            });\n          }\n        });\n      }\n    };\n    const resolvePathRange = (root, range) => resolvePath(root, range.start).bind(({\n      node: startNode,\n      offset: startOffset\n    }) => resolvePath(root, range.end).map(({\n      node: endNode,\n      offset: endOffset\n    }) => {\n      const rng = document.createRange();\n      rng.setStart(startNode, startOffset);\n      rng.setEnd(endNode, endOffset);\n      return rng;\n    }));\n    const generatePathRangeFromRange = (dom, root, range, normalized = false) => generatePathRange(dom, root, range.startContainer, range.startOffset, range.endContainer, range.endOffset, normalized);\n\n    const cleanEmptyNodes = (dom, node, isRoot) => {\n      if (node && dom.isEmpty(node) && !isRoot(node)) {\n        const parent = node.parentNode;\n        dom.remove(node, isText$b(node.firstChild) && isWhitespaceText(node.firstChild.data));\n        cleanEmptyNodes(dom, parent, isRoot);\n      }\n    };\n    const deleteRng = (dom, rng, isRoot, clean = true) => {\n      const startParent = rng.startContainer.parentNode;\n      const endParent = rng.endContainer.parentNode;\n      rng.deleteContents();\n      if (clean && !isRoot(rng.startContainer)) {\n        if (isText$b(rng.startContainer) && rng.startContainer.data.length === 0) {\n          dom.remove(rng.startContainer);\n        }\n        if (isText$b(rng.endContainer) && rng.endContainer.data.length === 0) {\n          dom.remove(rng.endContainer);\n        }\n        cleanEmptyNodes(dom, startParent, isRoot);\n        if (startParent !== endParent) {\n          cleanEmptyNodes(dom, endParent, isRoot);\n        }\n      }\n    };\n    const getParentBlock = (editor, rng) => Optional.from(editor.dom.getParent(rng.startContainer, editor.dom.isBlock));\n    const resolveFromDynamicPatterns = (patternSet, block, beforeText) => {\n      const dynamicPatterns = patternSet.dynamicPatternsLookup({\n        text: beforeText,\n        block\n      });\n      return {\n        ...patternSet,\n        blockPatterns: getBlockPatterns(dynamicPatterns).concat(patternSet.blockPatterns),\n        inlinePatterns: getInlinePatterns(dynamicPatterns).concat(patternSet.inlinePatterns)\n      };\n    };\n    const getBeforeText = (dom, block, node, offset) => {\n      const rng = dom.createRng();\n      rng.setStart(block, 0);\n      rng.setEnd(node, offset);\n      return rng.toString();\n    };\n\n    const newMarker = (dom, id) => dom.create('span', {\n      'data-mce-type': 'bookmark',\n      id\n    });\n    const rangeFromMarker = (dom, marker) => {\n      const rng = dom.createRng();\n      rng.setStartAfter(marker.start);\n      rng.setEndBefore(marker.end);\n      return rng;\n    };\n    const createMarker = (dom, markerPrefix, pathRange) => {\n      const rng = resolvePathRange(dom.getRoot(), pathRange).getOrDie('Unable to resolve path range');\n      const startNode = rng.startContainer;\n      const endNode = rng.endContainer;\n      const textEnd = rng.endOffset === 0 ? endNode : endNode.splitText(rng.endOffset);\n      const textStart = rng.startOffset === 0 ? startNode : startNode.splitText(rng.startOffset);\n      const startParentNode = textStart.parentNode;\n      const endParentNode = textEnd.parentNode;\n      return {\n        prefix: markerPrefix,\n        end: endParentNode.insertBefore(newMarker(dom, markerPrefix + '-end'), textEnd),\n        start: startParentNode.insertBefore(newMarker(dom, markerPrefix + '-start'), textStart)\n      };\n    };\n    const removeMarker = (dom, marker, isRoot) => {\n      cleanEmptyNodes(dom, dom.get(marker.prefix + '-end'), isRoot);\n      cleanEmptyNodes(dom, dom.get(marker.prefix + '-start'), isRoot);\n    };\n\n    const isReplacementPattern = pattern => pattern.start.length === 0;\n    const matchesPattern = patternContent => (element, offset) => {\n      const text = element.data;\n      const searchText = text.substring(0, offset);\n      const startEndIndex = searchText.lastIndexOf(patternContent.charAt(patternContent.length - 1));\n      const startIndex = searchText.lastIndexOf(patternContent);\n      if (startIndex !== -1) {\n        return startIndex + patternContent.length;\n      } else if (startEndIndex !== -1) {\n        return startEndIndex + 1;\n      } else {\n        return -1;\n      }\n    };\n    const findPatternStartFromSpot = (dom, pattern, block, spot) => {\n      const startPattern = pattern.start;\n      const startSpot = repeatLeft(dom, spot.container, spot.offset, matchesPattern(startPattern), block);\n      return startSpot.bind(spot => {\n        var _a, _b;\n        const startPatternIndex = (_b = (_a = block.textContent) === null || _a === void 0 ? void 0 : _a.indexOf(startPattern)) !== null && _b !== void 0 ? _b : -1;\n        const isCompleteMatch = startPatternIndex !== -1 && spot.offset >= startPatternIndex + startPattern.length;\n        if (isCompleteMatch) {\n          const rng = dom.createRng();\n          rng.setStart(spot.container, spot.offset - startPattern.length);\n          rng.setEnd(spot.container, spot.offset);\n          return Optional.some(rng);\n        } else {\n          const offset = spot.offset - startPattern.length;\n          return scanLeft(spot.container, offset, block).map(nextSpot => {\n            const rng = dom.createRng();\n            rng.setStart(nextSpot.container, nextSpot.offset);\n            rng.setEnd(spot.container, spot.offset);\n            return rng;\n          }).filter(rng => rng.toString() === startPattern).orThunk(() => findPatternStartFromSpot(dom, pattern, block, point(spot.container, 0)));\n        }\n      });\n    };\n    const findPatternStart = (dom, pattern, node, offset, block, requireGap = false) => {\n      if (pattern.start.length === 0 && !requireGap) {\n        const rng = dom.createRng();\n        rng.setStart(node, offset);\n        rng.setEnd(node, offset);\n        return Optional.some(rng);\n      }\n      return textBefore(node, offset, block).bind(spot => {\n        const start = findPatternStartFromSpot(dom, pattern, block, spot);\n        return start.bind(startRange => {\n          var _a;\n          if (requireGap) {\n            if (startRange.endContainer === spot.container && startRange.endOffset === spot.offset) {\n              return Optional.none();\n            } else if (spot.offset === 0 && ((_a = startRange.endContainer.textContent) === null || _a === void 0 ? void 0 : _a.length) === startRange.endOffset) {\n              return Optional.none();\n            }\n          }\n          return Optional.some(startRange);\n        });\n      });\n    };\n    const findPattern$3 = (editor, block, details, normalizedMatches) => {\n      const dom = editor.dom;\n      const root = dom.getRoot();\n      const pattern = details.pattern;\n      const endNode = details.position.container;\n      const endOffset = details.position.offset;\n      return scanLeft(endNode, endOffset - details.pattern.end.length, block).bind(spot => {\n        const endPathRng = generatePathRange(dom, root, spot.container, spot.offset, endNode, endOffset, normalizedMatches);\n        if (isReplacementPattern(pattern)) {\n          return Optional.some({\n            matches: [{\n                pattern,\n                startRng: endPathRng,\n                endRng: endPathRng\n              }],\n            position: spot\n          });\n        } else {\n          const resultsOpt = findPatternsRec(editor, details.remainingPatterns, spot.container, spot.offset, block, normalizedMatches);\n          const results = resultsOpt.getOr({\n            matches: [],\n            position: spot\n          });\n          const pos = results.position;\n          const start = findPatternStart(dom, pattern, pos.container, pos.offset, block, resultsOpt.isNone());\n          return start.map(startRng => {\n            const startPathRng = generatePathRangeFromRange(dom, root, startRng, normalizedMatches);\n            return {\n              matches: results.matches.concat([{\n                  pattern,\n                  startRng: startPathRng,\n                  endRng: endPathRng\n                }]),\n              position: point(startRng.startContainer, startRng.startOffset)\n            };\n          });\n        }\n      });\n    };\n    const findPatternsRec = (editor, patterns, node, offset, block, normalizedMatches) => {\n      const dom = editor.dom;\n      return textBefore(node, offset, dom.getRoot()).bind(endSpot => {\n        const text = getBeforeText(dom, block, node, offset);\n        for (let i = 0; i < patterns.length; i++) {\n          const pattern = patterns[i];\n          if (!endsWith(text, pattern.end)) {\n            continue;\n          }\n          const patternsWithoutCurrent = patterns.slice();\n          patternsWithoutCurrent.splice(i, 1);\n          const result = findPattern$3(editor, block, {\n            pattern,\n            remainingPatterns: patternsWithoutCurrent,\n            position: endSpot\n          }, normalizedMatches);\n          if (result.isNone() && offset > 0) {\n            return findPatternsRec(editor, patterns, node, offset - 1, block, normalizedMatches);\n          }\n          if (result.isSome()) {\n            return result;\n          }\n        }\n        return Optional.none();\n      });\n    };\n    const applyPattern$2 = (editor, pattern, patternRange) => {\n      editor.selection.setRng(patternRange);\n      if (pattern.type === 'inline-format') {\n        each$e(pattern.format, format => {\n          editor.formatter.apply(format);\n        });\n      } else {\n        editor.execCommand(pattern.cmd, false, pattern.value);\n      }\n    };\n    const applyReplacementPattern = (editor, pattern, marker, isRoot) => {\n      const markerRange = rangeFromMarker(editor.dom, marker);\n      deleteRng(editor.dom, markerRange, isRoot);\n      applyPattern$2(editor, pattern, markerRange);\n    };\n    const applyPatternWithContent = (editor, pattern, startMarker, endMarker, isRoot) => {\n      const dom = editor.dom;\n      const markerEndRange = rangeFromMarker(dom, endMarker);\n      const markerStartRange = rangeFromMarker(dom, startMarker);\n      deleteRng(dom, markerStartRange, isRoot);\n      deleteRng(dom, markerEndRange, isRoot);\n      const patternMarker = {\n        prefix: startMarker.prefix,\n        start: startMarker.end,\n        end: endMarker.start\n      };\n      const patternRange = rangeFromMarker(dom, patternMarker);\n      applyPattern$2(editor, pattern, patternRange);\n    };\n    const addMarkers = (dom, matches) => {\n      const markerPrefix = generate$1('mce_textpattern');\n      const matchesWithEnds = foldr(matches, (acc, match) => {\n        const endMarker = createMarker(dom, markerPrefix + `_end${ acc.length }`, match.endRng);\n        return acc.concat([{\n            ...match,\n            endMarker\n          }]);\n      }, []);\n      return foldr(matchesWithEnds, (acc, match) => {\n        const idx = matchesWithEnds.length - acc.length - 1;\n        const startMarker = isReplacementPattern(match.pattern) ? match.endMarker : createMarker(dom, markerPrefix + `_start${ idx }`, match.startRng);\n        return acc.concat([{\n            ...match,\n            startMarker\n          }]);\n      }, []);\n    };\n    const sortPatterns$1 = patterns => sort(patterns, (a, b) => b.end.length - a.end.length);\n    const getBestMatches = (matches, matchesWithSortedPatterns) => {\n      const hasSameMatches = forall(matches, match => exists(matchesWithSortedPatterns, sortedMatch => match.pattern.start === sortedMatch.pattern.start && match.pattern.end === sortedMatch.pattern.end));\n      if (matches.length === matchesWithSortedPatterns.length) {\n        if (hasSameMatches) {\n          return matches;\n        } else {\n          return matchesWithSortedPatterns;\n        }\n      }\n      return matches.length > matchesWithSortedPatterns.length ? matches : matchesWithSortedPatterns;\n    };\n    const findPatterns$2 = (editor, block, node, offset, patternSet, normalizedMatches) => {\n      const matches = findPatternsRec(editor, patternSet.inlinePatterns, node, offset, block, normalizedMatches).fold(() => [], result => result.matches);\n      const matchesWithSortedPatterns = findPatternsRec(editor, sortPatterns$1(patternSet.inlinePatterns), node, offset, block, normalizedMatches).fold(() => [], result => result.matches);\n      return getBestMatches(matches, matchesWithSortedPatterns);\n    };\n    const applyMatches$2 = (editor, matches) => {\n      if (matches.length === 0) {\n        return;\n      }\n      const dom = editor.dom;\n      const bookmark = editor.selection.getBookmark();\n      const matchesWithMarkers = addMarkers(dom, matches);\n      each$e(matchesWithMarkers, match => {\n        const block = dom.getParent(match.startMarker.start, dom.isBlock);\n        const isRoot = node => node === block;\n        if (isReplacementPattern(match.pattern)) {\n          applyReplacementPattern(editor, match.pattern, match.endMarker, isRoot);\n        } else {\n          applyPatternWithContent(editor, match.pattern, match.startMarker, match.endMarker, isRoot);\n        }\n        removeMarker(dom, match.endMarker, isRoot);\n        removeMarker(dom, match.startMarker, isRoot);\n      });\n      editor.selection.moveToBookmark(bookmark);\n    };\n\n    const stripPattern$1 = (dom, block, pattern) => {\n      return textAfter(block, 0, block).map(spot => {\n        const node = spot.container;\n        scanRight(node, pattern.start.length, block).each(end => {\n          const rng = dom.createRng();\n          rng.setStart(node, 0);\n          rng.setEnd(end.container, end.offset);\n          deleteRng(dom, rng, e => e === block);\n        });\n        return node;\n      });\n    };\n    const createApplyPattern = stripPattern => (editor, match) => {\n      const dom = editor.dom;\n      const pattern = match.pattern;\n      const rng = resolvePathRange(dom.getRoot(), match.range).getOrDie('Unable to resolve path range');\n      const isBlockFormatName = (name, formatter) => {\n        const formatSet = formatter.get(name);\n        return isArray$1(formatSet) && head(formatSet).exists(format => has$2(format, 'block'));\n      };\n      getParentBlock(editor, rng).each(block => {\n        if (pattern.type === 'block-format') {\n          if (isBlockFormatName(pattern.format, editor.formatter)) {\n            editor.undoManager.transact(() => {\n              stripPattern(editor.dom, block, pattern);\n              editor.formatter.apply(pattern.format);\n            });\n          }\n        } else if (pattern.type === 'block-command') {\n          editor.undoManager.transact(() => {\n            stripPattern(editor.dom, block, pattern);\n            editor.execCommand(pattern.cmd, false, pattern.value);\n          });\n        }\n      });\n      return true;\n    };\n    const sortPatterns = patterns => sort(patterns, (a, b) => b.start.length - a.start.length);\n    const findPattern$2 = predicate => (patterns, text) => {\n      const sortedPatterns = sortPatterns(patterns);\n      const nuText = text.replace(nbsp, ' ');\n      return find$2(sortedPatterns, pattern => predicate(pattern, text, nuText));\n    };\n    const createFindPatterns = (findPattern, skipFullMatch) => (editor, block, patternSet, normalizedMatches, text) => {\n      var _a;\n      if (text === void 0) {\n        text = (_a = block.textContent) !== null && _a !== void 0 ? _a : '';\n      }\n      const dom = editor.dom;\n      const forcedRootBlock = getForcedRootBlock(editor);\n      if (!dom.is(block, forcedRootBlock)) {\n        return [];\n      }\n      return findPattern(patternSet.blockPatterns, text).map(pattern => {\n        if (skipFullMatch && Tools.trim(text).length === pattern.start.length) {\n          return [];\n        }\n        return [{\n            pattern,\n            range: generatePathRange(dom, dom.getRoot(), block, 0, block, 0, normalizedMatches)\n          }];\n      }).getOr([]);\n    };\n\n    const startsWithSingleSpace = s => /^\\s[^\\s]/.test(s);\n    const stripPattern = (dom, block, pattern) => {\n      stripPattern$1(dom, block, pattern).each(node => {\n        const text = SugarElement.fromDom(node);\n        const textContent = get$3(text);\n        if (startsWithSingleSpace(textContent)) {\n          set(text, textContent.slice(1));\n        }\n      });\n    };\n    const applyPattern$1 = createApplyPattern(stripPattern);\n    const findPattern$1 = findPattern$2((pattern, text, nuText) => text.indexOf(pattern.start) === 0 || nuText.indexOf(pattern.start) === 0);\n    const findPatterns$1 = createFindPatterns(findPattern$1, true);\n    const getMatches$1 = (editor, patternSet) => {\n      const rng = editor.selection.getRng();\n      return getParentBlock(editor, rng).map(block => {\n        var _a;\n        const offset = Math.max(0, rng.startOffset);\n        const dynamicPatternSet = resolveFromDynamicPatterns(patternSet, block, (_a = block.textContent) !== null && _a !== void 0 ? _a : '');\n        const inlineMatches = findPatterns$2(editor, block, rng.startContainer, offset, dynamicPatternSet, true);\n        const blockMatches = findPatterns$1(editor, block, dynamicPatternSet, true);\n        return {\n          inlineMatches,\n          blockMatches\n        };\n      }).filter(({inlineMatches, blockMatches}) => blockMatches.length > 0 || inlineMatches.length > 0);\n    };\n    const applyMatches$1 = (editor, matches) => {\n      if (matches.length === 0) {\n        return;\n      }\n      const bookmark = editor.selection.getBookmark();\n      each$e(matches, match => applyPattern$1(editor, match));\n      editor.selection.moveToBookmark(bookmark);\n    };\n\n    const applyPattern = createApplyPattern(stripPattern$1);\n    const findPattern = findPattern$2((pattern, text, nuText) => text === pattern.start || nuText === pattern.start);\n    const findPatterns = createFindPatterns(findPattern, false);\n    const getMatches = (editor, patternSet) => {\n      const rng = editor.selection.getRng();\n      return getParentBlock(editor, rng).map(block => {\n        const offset = Math.max(0, rng.startOffset);\n        const beforeText = getBeforeText(editor.dom, block, rng.startContainer, offset);\n        const dynamicPatternSet = resolveFromDynamicPatterns(patternSet, block, beforeText);\n        return findPatterns(editor, block, dynamicPatternSet, false, beforeText);\n      }).filter(matches => matches.length > 0);\n    };\n    const applyMatches = (editor, matches) => {\n      each$e(matches, match => applyPattern(editor, match));\n    };\n\n    const handleEnter = (editor, patternSet) => getMatches$1(editor, patternSet).fold(never, ({inlineMatches, blockMatches}) => {\n      editor.undoManager.add();\n      editor.undoManager.extra(() => {\n        editor.execCommand('mceInsertNewLine');\n      }, () => {\n        insert$5(editor);\n        applyMatches$2(editor, inlineMatches);\n        applyMatches$1(editor, blockMatches);\n        const range = editor.selection.getRng();\n        const spot = textBefore(range.startContainer, range.startOffset, editor.dom.getRoot());\n        editor.execCommand('mceInsertNewLine');\n        spot.each(s => {\n          const node = s.container;\n          if (node.data.charAt(s.offset - 1) === zeroWidth) {\n            node.deleteData(s.offset - 1, 1);\n            cleanEmptyNodes(editor.dom, node.parentNode, e => e === editor.dom.getRoot());\n          }\n        });\n      });\n      return true;\n    });\n    const handleInlineKey = (editor, patternSet) => {\n      const rng = editor.selection.getRng();\n      getParentBlock(editor, rng).map(block => {\n        const offset = Math.max(0, rng.startOffset - 1);\n        const beforeText = getBeforeText(editor.dom, block, rng.startContainer, offset);\n        const dynamicPatternSet = resolveFromDynamicPatterns(patternSet, block, beforeText);\n        const inlineMatches = findPatterns$2(editor, block, rng.startContainer, offset, dynamicPatternSet, false);\n        if (inlineMatches.length > 0) {\n          editor.undoManager.transact(() => {\n            applyMatches$2(editor, inlineMatches);\n          });\n        }\n      });\n    };\n    const handleBlockPatternOnSpace = (editor, patternSet) => getMatches(editor, patternSet).fold(never, matches => {\n      editor.undoManager.transact(() => {\n        applyMatches(editor, matches);\n      });\n      return true;\n    });\n    const checkKeyEvent = (codes, event, predicate) => {\n      for (let i = 0; i < codes.length; i++) {\n        if (predicate(codes[i], event)) {\n          return true;\n        }\n      }\n      return false;\n    };\n    const checkKeyCode = (codes, event) => checkKeyEvent(codes, event, (code, event) => {\n      return code === event.keyCode && !VK.modifierPressed(event);\n    });\n    const checkCharCode = (chars, event) => checkKeyEvent(chars, event, (chr, event) => {\n      return chr.charCodeAt(0) === event.charCode;\n    });\n\n    const setup$2 = editor => {\n      const charCodes = [\n        ',',\n        '.',\n        ';',\n        ':',\n        '!',\n        '?'\n      ];\n      const keyCodes = [32];\n      const getPatternSet = () => createPatternSet(getTextPatterns(editor), getTextPatternsLookup(editor));\n      const hasDynamicPatterns = () => hasTextPatternsLookup(editor);\n      editor.on('keydown', e => {\n        if (e.keyCode === 13 && !VK.modifierPressed(e) && editor.selection.isCollapsed()) {\n          const patternSet = filterByTrigger(getPatternSet(), 'enter');\n          const hasPatterns = patternSet.inlinePatterns.length > 0 || patternSet.blockPatterns.length > 0 || hasDynamicPatterns();\n          if (hasPatterns && handleEnter(editor, patternSet)) {\n            e.preventDefault();\n          }\n        }\n      }, true);\n      editor.on('keydown', e => {\n        if (e.keyCode === 32 && editor.selection.isCollapsed()) {\n          const patternSet = filterByTrigger(getPatternSet(), 'space');\n          const hasPatterns = patternSet.blockPatterns.length > 0 || hasDynamicPatterns();\n          if (hasPatterns && handleBlockPatternOnSpace(editor, patternSet)) {\n            e.preventDefault();\n          }\n        }\n      }, true);\n      const handleInlineTrigger = () => {\n        if (editor.selection.isCollapsed()) {\n          const patternSet = filterByTrigger(getPatternSet(), 'space');\n          const hasPatterns = patternSet.inlinePatterns.length > 0 || hasDynamicPatterns();\n          if (hasPatterns) {\n            handleInlineKey(editor, patternSet);\n          }\n        }\n      };\n      editor.on('keyup', e => {\n        if (checkKeyCode(keyCodes, e)) {\n          handleInlineTrigger();\n        }\n      });\n      editor.on('keypress', e => {\n        if (checkCharCode(charCodes, e)) {\n          Delay.setEditorTimeout(editor, handleInlineTrigger);\n        }\n      });\n    };\n\n    const setup$1 = editor => {\n      setup$2(editor);\n    };\n\n    const Quirks = editor => {\n      const each = Tools.each;\n      const BACKSPACE = VK.BACKSPACE, DELETE = VK.DELETE, dom = editor.dom, selection = editor.selection, parser = editor.parser;\n      const browser = Env.browser;\n      const isGecko = browser.isFirefox();\n      const isWebKit = browser.isChromium() || browser.isSafari();\n      const isiOS = Env.deviceType.isiPhone() || Env.deviceType.isiPad();\n      const isMac = Env.os.isMacOS() || Env.os.isiOS();\n      const setEditorCommandState = (cmd, state) => {\n        try {\n          editor.getDoc().execCommand(cmd, false, String(state));\n        } catch (ex) {\n        }\n      };\n      const isDefaultPrevented = e => {\n        return e.isDefaultPrevented();\n      };\n      const emptyEditorWhenDeleting = () => {\n        const serializeRng = rng => {\n          const body = dom.create('body');\n          const contents = rng.cloneContents();\n          body.appendChild(contents);\n          return selection.serializer.serialize(body, { format: 'html' });\n        };\n        const allContentsSelected = rng => {\n          const selection = serializeRng(rng);\n          const allRng = dom.createRng();\n          allRng.selectNode(editor.getBody());\n          const allSelection = serializeRng(allRng);\n          return selection === allSelection;\n        };\n        editor.on('keydown', e => {\n          const keyCode = e.keyCode;\n          if (!isDefaultPrevented(e) && (keyCode === DELETE || keyCode === BACKSPACE) && editor.selection.isEditable()) {\n            const isCollapsed = editor.selection.isCollapsed();\n            const body = editor.getBody();\n            if (isCollapsed && !isEmptyNode(editor.schema, body)) {\n              return;\n            }\n            if (!isCollapsed && !allContentsSelected(editor.selection.getRng())) {\n              return;\n            }\n            e.preventDefault();\n            editor.setContent('');\n            if (body.firstChild && dom.isBlock(body.firstChild)) {\n              editor.selection.setCursorLocation(body.firstChild, 0);\n            } else {\n              editor.selection.setCursorLocation(body, 0);\n            }\n            editor.nodeChanged();\n          }\n        });\n      };\n      const selectAll = () => {\n        editor.shortcuts.add('meta+a', null, 'SelectAll');\n      };\n      const documentElementEditingFocus = () => {\n        if (!editor.inline) {\n          dom.bind(editor.getDoc(), 'mousedown mouseup', e => {\n            let rng;\n            if (e.target === editor.getDoc().documentElement) {\n              rng = selection.getRng();\n              editor.getBody().focus();\n              if (e.type === 'mousedown') {\n                if (isCaretContainer$2(rng.startContainer)) {\n                  return;\n                }\n                selection.placeCaretAt(e.clientX, e.clientY);\n              } else {\n                selection.setRng(rng);\n              }\n            }\n          });\n        }\n      };\n      const removeHrOnBackspace = () => {\n        editor.on('keydown', e => {\n          if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {\n            if (!editor.getBody().getElementsByTagName('hr').length) {\n              return;\n            }\n            if (selection.isCollapsed() && selection.getRng().startOffset === 0) {\n              const node = selection.getNode();\n              const previousSibling = node.previousSibling;\n              if (node.nodeName === 'HR') {\n                dom.remove(node);\n                e.preventDefault();\n                return;\n              }\n              if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === 'hr') {\n                dom.remove(previousSibling);\n                e.preventDefault();\n              }\n            }\n          }\n        });\n      };\n      const focusBody = () => {\n        if (!Range.prototype.getClientRects) {\n          editor.on('mousedown', e => {\n            if (!isDefaultPrevented(e) && e.target.nodeName === 'HTML') {\n              const body = editor.getBody();\n              body.blur();\n              Delay.setEditorTimeout(editor, () => {\n                body.focus();\n              });\n            }\n          });\n        }\n      };\n      const selectControlElements = () => {\n        const visualAidsAnchorClass = getVisualAidsAnchorClass(editor);\n        editor.on('click', e => {\n          const target = e.target;\n          if (/^(IMG|HR)$/.test(target.nodeName) && dom.isEditable(target)) {\n            e.preventDefault();\n            editor.selection.select(target);\n            editor.nodeChanged();\n          }\n          if (target.nodeName === 'A' && dom.hasClass(target, visualAidsAnchorClass) && target.childNodes.length === 0 && dom.isEditable(target.parentNode)) {\n            e.preventDefault();\n            selection.select(target);\n          }\n        });\n      };\n      const removeStylesWhenDeletingAcrossBlockElements = () => {\n        const getAttributeApplyFunction = () => {\n          const template = dom.getAttribs(selection.getStart().cloneNode(false));\n          return () => {\n            const target = selection.getStart();\n            if (target !== editor.getBody()) {\n              dom.setAttrib(target, 'style', null);\n              each(template, attr => {\n                target.setAttributeNode(attr.cloneNode(true));\n              });\n            }\n          };\n        };\n        const isSelectionAcrossElements = () => {\n          return !selection.isCollapsed() && dom.getParent(selection.getStart(), dom.isBlock) !== dom.getParent(selection.getEnd(), dom.isBlock);\n        };\n        editor.on('keypress', e => {\n          let applyAttributes;\n          if (!isDefaultPrevented(e) && (e.keyCode === 8 || e.keyCode === 46) && isSelectionAcrossElements()) {\n            applyAttributes = getAttributeApplyFunction();\n            editor.getDoc().execCommand('delete', false);\n            applyAttributes();\n            e.preventDefault();\n            return false;\n          } else {\n            return true;\n          }\n        });\n        dom.bind(editor.getDoc(), 'cut', e => {\n          if (!isDefaultPrevented(e) && isSelectionAcrossElements()) {\n            const applyAttributes = getAttributeApplyFunction();\n            Delay.setEditorTimeout(editor, () => {\n              applyAttributes();\n            });\n          }\n        });\n      };\n      const disableBackspaceIntoATable = () => {\n        editor.on('keydown', e => {\n          if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {\n            if (selection.isCollapsed() && selection.getRng().startOffset === 0) {\n              const previousSibling = selection.getNode().previousSibling;\n              if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === 'table') {\n                e.preventDefault();\n                return false;\n              }\n            }\n          }\n          return true;\n        });\n      };\n      const removeBlockQuoteOnBackSpace = () => {\n        editor.on('keydown', e => {\n          if (isDefaultPrevented(e) || e.keyCode !== VK.BACKSPACE) {\n            return;\n          }\n          let rng = selection.getRng();\n          const container = rng.startContainer;\n          const offset = rng.startOffset;\n          const root = dom.getRoot();\n          let parent = container;\n          if (!rng.collapsed || offset !== 0) {\n            return;\n          }\n          while (parent.parentNode && parent.parentNode.firstChild === parent && parent.parentNode !== root) {\n            parent = parent.parentNode;\n          }\n          if (parent.nodeName === 'BLOCKQUOTE') {\n            editor.formatter.toggle('blockquote', undefined, parent);\n            rng = dom.createRng();\n            rng.setStart(container, 0);\n            rng.setEnd(container, 0);\n            selection.setRng(rng);\n          }\n        });\n      };\n      const setGeckoEditingOptions = () => {\n        const setOpts = () => {\n          setEditorCommandState('StyleWithCSS', false);\n          setEditorCommandState('enableInlineTableEditing', false);\n          if (!getObjectResizing(editor)) {\n            setEditorCommandState('enableObjectResizing', false);\n          }\n        };\n        if (!isReadOnly$1(editor)) {\n          editor.on('BeforeExecCommand mousedown', setOpts);\n        }\n      };\n      const addBrAfterLastLinks = () => {\n        const fixLinks = () => {\n          each(dom.select('a:not([data-mce-block])'), node => {\n            var _a;\n            let parentNode = node.parentNode;\n            const root = dom.getRoot();\n            if ((parentNode === null || parentNode === void 0 ? void 0 : parentNode.lastChild) === node) {\n              while (parentNode && !dom.isBlock(parentNode)) {\n                if (((_a = parentNode.parentNode) === null || _a === void 0 ? void 0 : _a.lastChild) !== parentNode || parentNode === root) {\n                  return;\n                }\n                parentNode = parentNode.parentNode;\n              }\n              dom.add(parentNode, 'br', { 'data-mce-bogus': 1 });\n            }\n          });\n        };\n        editor.on('SetContent ExecCommand', e => {\n          if (e.type === 'setcontent' || e.command === 'mceInsertLink') {\n            fixLinks();\n          }\n        });\n      };\n      const setDefaultBlockType = () => {\n        editor.on('init', () => {\n          setEditorCommandState('DefaultParagraphSeparator', getForcedRootBlock(editor));\n        });\n      };\n      const isAllContentSelected = editor => {\n        const body = editor.getBody();\n        const rng = editor.selection.getRng();\n        return rng.startContainer === rng.endContainer && rng.startContainer === body && rng.startOffset === 0 && rng.endOffset === body.childNodes.length;\n      };\n      const normalizeSelection = () => {\n        editor.on('keyup focusin mouseup', e => {\n          if (!VK.modifierPressed(e) && !isAllContentSelected(editor)) {\n            selection.normalize();\n          }\n        }, true);\n      };\n      const showBrokenImageIcon = () => {\n        editor.contentStyles.push('img:-moz-broken {' + '-moz-force-broken-image-icon:1;' + 'min-width:24px;' + 'min-height:24px' + '}');\n      };\n      const restoreFocusOnKeyDown = () => {\n        if (!editor.inline) {\n          editor.on('keydown', () => {\n            if (document.activeElement === document.body) {\n              editor.getWin().focus();\n            }\n          });\n        }\n      };\n      const bodyHeight = () => {\n        if (!editor.inline) {\n          editor.contentStyles.push('body {min-height: 150px}');\n          editor.on('click', e => {\n            let rng;\n            if (e.target.nodeName === 'HTML') {\n              rng = editor.selection.getRng();\n              editor.getBody().focus();\n              editor.selection.setRng(rng);\n              editor.selection.normalize();\n              editor.nodeChanged();\n            }\n          });\n        }\n      };\n      const blockCmdArrowNavigation = () => {\n        if (isMac) {\n          editor.on('keydown', e => {\n            if (VK.metaKeyPressed(e) && !e.shiftKey && (e.keyCode === 37 || e.keyCode === 39)) {\n              e.preventDefault();\n              const selection = editor.selection.getSel();\n              selection.modify('move', e.keyCode === 37 ? 'backward' : 'forward', 'lineboundary');\n            }\n          });\n        }\n      };\n      const tapLinksAndImages = () => {\n        editor.on('click', e => {\n          let elm = e.target;\n          do {\n            if (elm.tagName === 'A') {\n              e.preventDefault();\n              return;\n            }\n          } while (elm = elm.parentNode);\n        });\n        editor.contentStyles.push('.mce-content-body {-webkit-touch-callout: none}');\n      };\n      const blockFormSubmitInsideEditor = () => {\n        editor.on('init', () => {\n          editor.dom.bind(editor.getBody(), 'submit', e => {\n            e.preventDefault();\n          });\n        });\n      };\n      const removeAppleInterchangeBrs = () => {\n        parser.addNodeFilter('br', nodes => {\n          let i = nodes.length;\n          while (i--) {\n            if (nodes[i].attr('class') === 'Apple-interchange-newline') {\n              nodes[i].remove();\n            }\n          }\n        });\n      };\n      const refreshContentEditable = noop;\n      const isHidden = () => {\n        if (!isGecko || editor.removed) {\n          return false;\n        }\n        const sel = editor.selection.getSel();\n        return !sel || !sel.rangeCount || sel.rangeCount === 0;\n      };\n      const setupRtc = () => {\n        if (isWebKit) {\n          documentElementEditingFocus();\n          selectControlElements();\n          blockFormSubmitInsideEditor();\n          selectAll();\n          if (isiOS) {\n            restoreFocusOnKeyDown();\n            bodyHeight();\n            tapLinksAndImages();\n          }\n        }\n        if (isGecko) {\n          focusBody();\n          setGeckoEditingOptions();\n          showBrokenImageIcon();\n          blockCmdArrowNavigation();\n        }\n      };\n      const setup = () => {\n        removeBlockQuoteOnBackSpace();\n        emptyEditorWhenDeleting();\n        if (!Env.windowsPhone) {\n          normalizeSelection();\n        }\n        if (isWebKit) {\n          documentElementEditingFocus();\n          selectControlElements();\n          setDefaultBlockType();\n          blockFormSubmitInsideEditor();\n          disableBackspaceIntoATable();\n          removeAppleInterchangeBrs();\n          if (isiOS) {\n            restoreFocusOnKeyDown();\n            bodyHeight();\n            tapLinksAndImages();\n          } else {\n            selectAll();\n          }\n        }\n        if (isGecko) {\n          removeHrOnBackspace();\n          focusBody();\n          removeStylesWhenDeletingAcrossBlockElements();\n          setGeckoEditingOptions();\n          addBrAfterLastLinks();\n          showBrokenImageIcon();\n          blockCmdArrowNavigation();\n          disableBackspaceIntoATable();\n        }\n      };\n      if (isRtc(editor)) {\n        setupRtc();\n      } else {\n        setup();\n      }\n      return {\n        refreshContentEditable,\n        isHidden\n      };\n    };\n\n    const DOM$6 = DOMUtils.DOM;\n    const appendStyle = (editor, text) => {\n      const body = SugarElement.fromDom(editor.getBody());\n      const container = getStyleContainer(getRootNode(body));\n      const style = SugarElement.fromTag('style');\n      set$3(style, 'type', 'text/css');\n      append$1(style, SugarElement.fromText(text));\n      append$1(container, style);\n      editor.on('remove', () => {\n        remove$4(style);\n      });\n    };\n    const getRootName = editor => editor.inline ? editor.getElement().nodeName.toLowerCase() : undefined;\n    const removeUndefined = obj => filter$4(obj, v => isUndefined(v) === false);\n    const mkParserSettings = editor => {\n      const getOption = editor.options.get;\n      const blobCache = editor.editorUpload.blobCache;\n      return removeUndefined({\n        allow_conditional_comments: getOption('allow_conditional_comments'),\n        allow_html_data_urls: getOption('allow_html_data_urls'),\n        allow_svg_data_urls: getOption('allow_svg_data_urls'),\n        allow_html_in_named_anchor: getOption('allow_html_in_named_anchor'),\n        allow_script_urls: getOption('allow_script_urls'),\n        allow_unsafe_link_target: getOption('allow_unsafe_link_target'),\n        convert_unsafe_embeds: getOption('convert_unsafe_embeds'),\n        convert_fonts_to_spans: getOption('convert_fonts_to_spans'),\n        fix_list_elements: getOption('fix_list_elements'),\n        font_size_legacy_values: getOption('font_size_legacy_values'),\n        forced_root_block: getOption('forced_root_block'),\n        forced_root_block_attrs: getOption('forced_root_block_attrs'),\n        preserve_cdata: getOption('preserve_cdata'),\n        inline_styles: getOption('inline_styles'),\n        root_name: getRootName(editor),\n        sandbox_iframes: getOption('sandbox_iframes'),\n        sandbox_iframes_exclusions: getSandboxIframesExclusions(editor),\n        sanitize: getOption('xss_sanitization'),\n        validate: true,\n        blob_cache: blobCache,\n        document: editor.getDoc()\n      });\n    };\n    const mkSchemaSettings = editor => {\n      const getOption = editor.options.get;\n      return removeUndefined({\n        custom_elements: getOption('custom_elements'),\n        extended_valid_elements: getOption('extended_valid_elements'),\n        invalid_elements: getOption('invalid_elements'),\n        invalid_styles: getOption('invalid_styles'),\n        schema: getOption('schema'),\n        valid_children: getOption('valid_children'),\n        valid_classes: getOption('valid_classes'),\n        valid_elements: getOption('valid_elements'),\n        valid_styles: getOption('valid_styles'),\n        verify_html: getOption('verify_html'),\n        padd_empty_block_inline_children: getOption('format_empty_lines')\n      });\n    };\n    const mkSerializerSettings = editor => {\n      const getOption = editor.options.get;\n      return {\n        ...mkParserSettings(editor),\n        ...mkSchemaSettings(editor),\n        ...removeUndefined({\n          remove_trailing_brs: getOption('remove_trailing_brs'),\n          pad_empty_with_br: getOption('pad_empty_with_br'),\n          url_converter: getOption('url_converter'),\n          url_converter_scope: getOption('url_converter_scope'),\n          element_format: getOption('element_format'),\n          entities: getOption('entities'),\n          entity_encoding: getOption('entity_encoding'),\n          indent: getOption('indent'),\n          indent_after: getOption('indent_after'),\n          indent_before: getOption('indent_before')\n        })\n      };\n    };\n    const createParser = editor => {\n      const parser = DomParser(mkParserSettings(editor), editor.schema);\n      parser.addAttributeFilter('src,href,style,tabindex', (nodes, name) => {\n        const dom = editor.dom;\n        const internalName = 'data-mce-' + name;\n        let i = nodes.length;\n        while (i--) {\n          const node = nodes[i];\n          let value = node.attr(name);\n          if (value && !node.attr(internalName)) {\n            if (value.indexOf('data:') === 0 || value.indexOf('blob:') === 0) {\n              continue;\n            }\n            if (name === 'style') {\n              value = dom.serializeStyle(dom.parseStyle(value), node.name);\n              if (!value.length) {\n                value = null;\n              }\n              node.attr(internalName, value);\n              node.attr(name, value);\n            } else if (name === 'tabindex') {\n              node.attr(internalName, value);\n              node.attr(name, null);\n            } else {\n              node.attr(internalName, editor.convertURL(value, name, node.name));\n            }\n          }\n        }\n      });\n      parser.addNodeFilter('script', nodes => {\n        let i = nodes.length;\n        while (i--) {\n          const node = nodes[i];\n          const type = node.attr('type') || 'no/type';\n          if (type.indexOf('mce-') !== 0) {\n            node.attr('type', 'mce-' + type);\n          }\n        }\n      });\n      if (shouldPreserveCData(editor)) {\n        parser.addNodeFilter('#cdata', nodes => {\n          var _a;\n          let i = nodes.length;\n          while (i--) {\n            const node = nodes[i];\n            node.type = 8;\n            node.name = '#comment';\n            node.value = '[CDATA[' + editor.dom.encode((_a = node.value) !== null && _a !== void 0 ? _a : '') + ']]';\n          }\n        });\n      }\n      parser.addNodeFilter('p,h1,h2,h3,h4,h5,h6,div', nodes => {\n        let i = nodes.length;\n        const nonEmptyElements = editor.schema.getNonEmptyElements();\n        while (i--) {\n          const node = nodes[i];\n          if (node.isEmpty(nonEmptyElements) && node.getAll('br').length === 0) {\n            node.append(new AstNode('br', 1));\n          }\n        }\n      });\n      return parser;\n    };\n    const autoFocus = editor => {\n      const autoFocus = getAutoFocus(editor);\n      if (autoFocus) {\n        Delay.setEditorTimeout(editor, () => {\n          let focusEditor;\n          if (autoFocus === true) {\n            focusEditor = editor;\n          } else {\n            focusEditor = editor.editorManager.get(autoFocus);\n          }\n          if (focusEditor && !focusEditor.destroyed) {\n            focusEditor.focus();\n            focusEditor.selection.scrollIntoView();\n          }\n        }, 100);\n      }\n    };\n    const moveSelectionToFirstCaretPosition = editor => {\n      const root = editor.dom.getRoot();\n      if (!editor.inline && (!hasAnyRanges(editor) || editor.selection.getStart(true) === root)) {\n        firstPositionIn(root).each(pos => {\n          const node = pos.getNode();\n          const caretPos = isTable$2(node) ? firstPositionIn(node).getOr(pos) : pos;\n          editor.selection.setRng(caretPos.toRange());\n        });\n      }\n    };\n    const initEditor = editor => {\n      editor.bindPendingEventDelegates();\n      editor.initialized = true;\n      fireInit(editor);\n      editor.focus(true);\n      moveSelectionToFirstCaretPosition(editor);\n      editor.nodeChanged({ initial: true });\n      const initInstanceCallback = getInitInstanceCallback(editor);\n      if (isFunction(initInstanceCallback)) {\n        initInstanceCallback.call(editor, editor);\n      }\n      autoFocus(editor);\n    };\n    const getStyleSheetLoader$1 = editor => editor.inline ? editor.ui.styleSheetLoader : editor.dom.styleSheetLoader;\n    const makeStylesheetLoadingPromises = (editor, css, framedFonts) => {\n      const {\n        pass: bundledCss,\n        fail: normalCss\n      } = partition$2(css, name => hugerte.Resource.has(name));\n      const bundledPromises = bundledCss.map(url => {\n        const css = hugerte.Resource.get(url);\n        if (isString(css)) {\n          return Promise.resolve(getStyleSheetLoader$1(editor).loadRawCss(url, css));\n        }\n        return Promise.resolve();\n      });\n      const promises = [\n        ...bundledPromises,\n        getStyleSheetLoader$1(editor).loadAll(normalCss)\n      ];\n      if (editor.inline) {\n        return promises;\n      } else {\n        return promises.concat([editor.ui.styleSheetLoader.loadAll(framedFonts)]);\n      }\n    };\n    const loadContentCss = editor => {\n      const styleSheetLoader = getStyleSheetLoader$1(editor);\n      const fontCss = getFontCss(editor);\n      const css = editor.contentCSS;\n      const removeCss = () => {\n        styleSheetLoader.unloadAll(css);\n        if (!editor.inline) {\n          editor.ui.styleSheetLoader.unloadAll(fontCss);\n        }\n      };\n      const loaded = () => {\n        if (editor.removed) {\n          removeCss();\n        } else {\n          editor.on('remove', removeCss);\n        }\n      };\n      if (editor.contentStyles.length > 0) {\n        let contentCssText = '';\n        Tools.each(editor.contentStyles, style => {\n          contentCssText += style + '\\r\\n';\n        });\n        editor.dom.addStyle(contentCssText);\n      }\n      const allStylesheets = Promise.all(makeStylesheetLoadingPromises(editor, css, fontCss)).then(loaded).catch(loaded);\n      const contentStyle = getContentStyle(editor);\n      if (contentStyle) {\n        appendStyle(editor, contentStyle);\n      }\n      return allStylesheets;\n    };\n    const preInit = editor => {\n      const doc = editor.getDoc(), body = editor.getBody();\n      firePreInit(editor);\n      if (!shouldBrowserSpellcheck(editor)) {\n        doc.body.spellcheck = false;\n        DOM$6.setAttrib(body, 'spellcheck', 'false');\n      }\n      editor.quirks = Quirks(editor);\n      firePostRender(editor);\n      const directionality = getDirectionality(editor);\n      if (directionality !== undefined) {\n        body.dir = directionality;\n      }\n      const protect = getProtect(editor);\n      if (protect) {\n        editor.on('BeforeSetContent', e => {\n          Tools.each(protect, pattern => {\n            e.content = e.content.replace(pattern, str => {\n              return '<!--mce:protected ' + escape(str) + '-->';\n            });\n          });\n        });\n      }\n      editor.on('SetContent', () => {\n        editor.addVisual(editor.getBody());\n      });\n      editor.on('compositionstart compositionend', e => {\n        editor.composing = e.type === 'compositionstart';\n      });\n    };\n    const loadInitialContent = editor => {\n      if (!isRtc(editor)) {\n        editor.load({\n          initial: true,\n          format: 'html'\n        });\n      }\n      editor.startContent = editor.getContent({ format: 'raw' });\n    };\n    const initEditorWithInitialContent = editor => {\n      if (editor.removed !== true) {\n        loadInitialContent(editor);\n        initEditor(editor);\n      }\n    };\n    const startProgress = editor => {\n      let canceled = false;\n      const progressTimeout = setTimeout(() => {\n        if (!canceled) {\n          editor.setProgressState(true);\n        }\n      }, 500);\n      return () => {\n        clearTimeout(progressTimeout);\n        canceled = true;\n        editor.setProgressState(false);\n      };\n    };\n    const contentBodyLoaded = editor => {\n      const targetElm = editor.getElement();\n      let doc = editor.getDoc();\n      if (editor.inline) {\n        DOM$6.addClass(targetElm, 'mce-content-body');\n        editor.contentDocument = doc = document;\n        editor.contentWindow = window;\n        editor.bodyElement = targetElm;\n        editor.contentAreaContainer = targetElm;\n      }\n      const body = editor.getBody();\n      body.disabled = true;\n      editor.readonly = isReadOnly$1(editor);\n      editor._editableRoot = hasEditableRoot$1(editor);\n      if (!editor.readonly && editor.hasEditableRoot()) {\n        if (editor.inline && DOM$6.getStyle(body, 'position', true) === 'static') {\n          body.style.position = 'relative';\n        }\n        body.contentEditable = 'true';\n      }\n      body.disabled = false;\n      editor.editorUpload = EditorUpload(editor);\n      editor.schema = Schema(mkSchemaSettings(editor));\n      editor.dom = DOMUtils(doc, {\n        keep_values: true,\n        url_converter: editor.convertURL,\n        url_converter_scope: editor,\n        update_styles: true,\n        root_element: editor.inline ? editor.getBody() : null,\n        collect: editor.inline,\n        schema: editor.schema,\n        contentCssCors: shouldUseContentCssCors(editor),\n        referrerPolicy: getReferrerPolicy(editor),\n        onSetAttrib: e => {\n          editor.dispatch('SetAttrib', e);\n        },\n        force_hex_color: shouldForceHexColor(editor)\n      });\n      editor.parser = createParser(editor);\n      editor.serializer = DomSerializer(mkSerializerSettings(editor), editor);\n      editor.selection = EditorSelection(editor.dom, editor.getWin(), editor.serializer, editor);\n      editor.annotator = Annotator(editor);\n      editor.formatter = Formatter(editor);\n      editor.undoManager = UndoManager(editor);\n      editor._nodeChangeDispatcher = new NodeChange(editor);\n      editor._selectionOverrides = SelectionOverrides(editor);\n      setup$p(editor);\n      setup$6(editor);\n      setup$n(editor);\n      if (!isRtc(editor)) {\n        setup$5(editor);\n        setup$1(editor);\n      }\n      const caret = setup$b(editor);\n      setup$q(editor, caret);\n      setup$o(editor);\n      setup$r(editor);\n      setup$7(editor);\n      const setupRtcThunk = setup$t(editor);\n      preInit(editor);\n      setupRtcThunk.fold(() => {\n        const cancelProgress = startProgress(editor);\n        loadContentCss(editor).then(() => {\n          initEditorWithInitialContent(editor);\n          cancelProgress();\n        });\n      }, setupRtc => {\n        editor.setProgressState(true);\n        loadContentCss(editor).then(() => {\n          setupRtc().then(_rtcMode => {\n            editor.setProgressState(false);\n            initEditorWithInitialContent(editor);\n            bindEvents(editor);\n          }, err => {\n            editor.notificationManager.open({\n              type: 'error',\n              text: String(err)\n            });\n            initEditorWithInitialContent(editor);\n            bindEvents(editor);\n          });\n        });\n      });\n    };\n\n    const filter = always;\n    const bind = (element, event, handler) => bind$2(element, event, filter, handler);\n\n    const DOM$5 = DOMUtils.DOM;\n    const createIframeElement = (id, title, customAttrs, tabindex) => {\n      const iframe = SugarElement.fromTag('iframe');\n      tabindex.each(t => set$3(iframe, 'tabindex', t));\n      setAll$1(iframe, customAttrs);\n      setAll$1(iframe, {\n        id: id + '_ifr',\n        frameBorder: '0',\n        allowTransparency: 'true',\n        title\n      });\n      add$2(iframe, 'tox-edit-area__iframe');\n      return iframe;\n    };\n    const getIframeHtml = editor => {\n      let iframeHTML = getDocType(editor) + '<html><head>';\n      if (getDocumentBaseUrl(editor) !== editor.documentBaseUrl) {\n        iframeHTML += '<base href=\"' + editor.documentBaseURI.getURI() + '\" />';\n      }\n      iframeHTML += '<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />';\n      const bodyId = getBodyId(editor);\n      const bodyClass = getBodyClass(editor);\n      const translatedAriaText = editor.translate(getIframeAriaText(editor));\n      if (getContentSecurityPolicy(editor)) {\n        iframeHTML += '<meta http-equiv=\"Content-Security-Policy\" content=\"' + getContentSecurityPolicy(editor) + '\" />';\n      }\n      iframeHTML += '</head>' + `<body id=\"${ bodyId }\" class=\"mce-content-body ${ bodyClass }\" data-id=\"${ editor.id }\" aria-label=\"${ translatedAriaText }\">` + '<br>' + '</body></html>';\n      return iframeHTML;\n    };\n    const createIframe = (editor, boxInfo) => {\n      const iframeTitle = editor.translate('Rich Text Area');\n      const tabindex = getOpt(SugarElement.fromDom(editor.getElement()), 'tabindex').bind(toInt);\n      const ifr = createIframeElement(editor.id, iframeTitle, getIframeAttrs(editor), tabindex).dom;\n      ifr.onload = () => {\n        ifr.onload = null;\n        editor.dispatch('load');\n      };\n      editor.contentAreaContainer = boxInfo.iframeContainer;\n      editor.iframeElement = ifr;\n      editor.iframeHTML = getIframeHtml(editor);\n      DOM$5.add(boxInfo.iframeContainer, ifr);\n    };\n    const setupIframeBody = editor => {\n      const iframe = editor.iframeElement;\n      const ready = () => {\n        editor.contentDocument = iframe.contentDocument;\n        contentBodyLoaded(editor);\n      };\n      if (shouldUseDocumentWrite(editor) || Env.browser.isFirefox()) {\n        const doc = editor.getDoc();\n        doc.open();\n        doc.write(editor.iframeHTML);\n        doc.close();\n        ready();\n      } else {\n        const binder = bind(SugarElement.fromDom(iframe), 'load', () => {\n          binder.unbind();\n          ready();\n        });\n        iframe.srcdoc = editor.iframeHTML;\n      }\n    };\n    const init$1 = (editor, boxInfo) => {\n      createIframe(editor, boxInfo);\n      if (boxInfo.editorContainer) {\n        boxInfo.editorContainer.style.display = editor.orgDisplay;\n        editor.hidden = DOM$5.isHidden(boxInfo.editorContainer);\n      }\n      editor.getElement().style.display = 'none';\n      DOM$5.setAttrib(editor.id, 'aria-hidden', 'true');\n      editor.getElement().style.visibility = editor.orgVisibility;\n      setupIframeBody(editor);\n    };\n\n    const DOM$4 = DOMUtils.DOM;\n    const initPlugin = (editor, initializedPlugins, plugin) => {\n      const Plugin = PluginManager.get(plugin);\n      const pluginUrl = PluginManager.urls[plugin] || editor.documentBaseUrl.replace(/\\/$/, '');\n      plugin = Tools.trim(plugin);\n      if (Plugin && Tools.inArray(initializedPlugins, plugin) === -1) {\n        if (editor.plugins[plugin]) {\n          return;\n        }\n        try {\n          const pluginInstance = Plugin(editor, pluginUrl) || {};\n          editor.plugins[plugin] = pluginInstance;\n          if (isFunction(pluginInstance.init)) {\n            pluginInstance.init(editor, pluginUrl);\n            initializedPlugins.push(plugin);\n          }\n        } catch (e) {\n          pluginInitError(editor, plugin, e);\n        }\n      }\n    };\n    const trimLegacyPrefix = name => {\n      return name.replace(/^\\-/, '');\n    };\n    const initPlugins = editor => {\n      const initializedPlugins = [];\n      each$e(getPlugins(editor), name => {\n        initPlugin(editor, initializedPlugins, trimLegacyPrefix(name));\n      });\n    };\n    const initIcons = editor => {\n      const iconPackName = Tools.trim(getIconPackName(editor));\n      const currentIcons = editor.ui.registry.getAll().icons;\n      const loadIcons = {\n        ...IconManager.get('default').icons,\n        ...IconManager.get(iconPackName).icons\n      };\n      each$d(loadIcons, (svgData, icon) => {\n        if (!has$2(currentIcons, icon)) {\n          editor.ui.registry.addIcon(icon, svgData);\n        }\n      });\n    };\n    const initTheme = editor => {\n      const theme = getTheme(editor);\n      if (isString(theme)) {\n        const Theme = ThemeManager.get(theme);\n        editor.theme = Theme(editor, ThemeManager.urls[theme]) || {};\n        if (isFunction(editor.theme.init)) {\n          editor.theme.init(editor, ThemeManager.urls[theme] || editor.documentBaseUrl.replace(/\\/$/, ''));\n        }\n      } else {\n        editor.theme = {};\n      }\n    };\n    const initModel = editor => {\n      const model = getModel(editor);\n      const Model = ModelManager.get(model);\n      editor.model = Model(editor, ModelManager.urls[model]);\n    };\n    const renderFromLoadedTheme = editor => {\n      const render = editor.theme.renderUI;\n      return render ? render() : renderThemeFalse(editor);\n    };\n    const renderFromThemeFunc = editor => {\n      const elm = editor.getElement();\n      const theme = getTheme(editor);\n      const info = theme(editor, elm);\n      if (info.editorContainer.nodeType) {\n        info.editorContainer.id = info.editorContainer.id || editor.id + '_parent';\n      }\n      if (info.iframeContainer && info.iframeContainer.nodeType) {\n        info.iframeContainer.id = info.iframeContainer.id || editor.id + '_iframecontainer';\n      }\n      info.height = info.iframeHeight ? info.iframeHeight : elm.offsetHeight;\n      return info;\n    };\n    const createThemeFalseResult = (element, iframe) => {\n      return {\n        editorContainer: element,\n        iframeContainer: iframe,\n        api: {}\n      };\n    };\n    const renderThemeFalseIframe = targetElement => {\n      const iframeContainer = DOM$4.create('div');\n      DOM$4.insertAfter(iframeContainer, targetElement);\n      return createThemeFalseResult(iframeContainer, iframeContainer);\n    };\n    const renderThemeFalse = editor => {\n      const targetElement = editor.getElement();\n      return editor.inline ? createThemeFalseResult(null) : renderThemeFalseIframe(targetElement);\n    };\n    const renderThemeUi = editor => {\n      const elm = editor.getElement();\n      editor.orgDisplay = elm.style.display;\n      if (isString(getTheme(editor))) {\n        return renderFromLoadedTheme(editor);\n      } else if (isFunction(getTheme(editor))) {\n        return renderFromThemeFunc(editor);\n      } else {\n        return renderThemeFalse(editor);\n      }\n    };\n    const augmentEditorUiApi = (editor, api) => {\n      const uiApiFacade = {\n        show: Optional.from(api.show).getOr(noop),\n        hide: Optional.from(api.hide).getOr(noop),\n        isEnabled: Optional.from(api.isEnabled).getOr(always),\n        setEnabled: state => {\n          if (!editor.mode.isReadOnly()) {\n            Optional.from(api.setEnabled).each(f => f(state));\n          }\n        }\n      };\n      editor.ui = {\n        ...editor.ui,\n        ...uiApiFacade\n      };\n    };\n    const init = async editor => {\n      editor.dispatch('ScriptsLoaded');\n      initIcons(editor);\n      initTheme(editor);\n      initModel(editor);\n      initPlugins(editor);\n      const renderInfo = await renderThemeUi(editor);\n      augmentEditorUiApi(editor, Optional.from(renderInfo.api).getOr({}));\n      editor.editorContainer = renderInfo.editorContainer;\n      appendContentCssFromSettings(editor);\n      if (editor.inline) {\n        contentBodyLoaded(editor);\n      } else {\n        init$1(editor, {\n          editorContainer: renderInfo.editorContainer,\n          iframeContainer: renderInfo.iframeContainer\n        });\n      }\n    };\n\n    const DOM$3 = DOMUtils.DOM;\n    const hasSkipLoadPrefix = name => name.charAt(0) === '-';\n    const loadLanguage = (scriptLoader, editor) => {\n      const languageCode = getLanguageCode(editor);\n      const languageUrl = getLanguageUrl(editor);\n      if (!I18n.hasCode(languageCode) && languageCode !== 'en') {\n        const url = isNotEmpty(languageUrl) ? languageUrl : `${ editor.editorManager.baseURL }/langs/${ languageCode }.js`;\n        scriptLoader.add(url).catch(() => {\n          languageLoadError(editor, url, languageCode);\n        });\n      }\n    };\n    const loadTheme = (editor, suffix) => {\n      const theme = getTheme(editor);\n      if (isString(theme) && !hasSkipLoadPrefix(theme) && !has$2(ThemeManager.urls, theme)) {\n        const themeUrl = getThemeUrl(editor);\n        const url = themeUrl ? editor.documentBaseURI.toAbsolute(themeUrl) : `themes/${ theme }/theme${ suffix }.js`;\n        ThemeManager.load(theme, url).catch(() => {\n          themeLoadError(editor, url, theme);\n        });\n      }\n    };\n    const loadModel = (editor, suffix) => {\n      const model = getModel(editor);\n      if (model !== 'plugin' && !has$2(ModelManager.urls, model)) {\n        const modelUrl = getModelUrl(editor);\n        const url = isString(modelUrl) ? editor.documentBaseURI.toAbsolute(modelUrl) : `models/${ model }/model${ suffix }.js`;\n        ModelManager.load(model, url).catch(() => {\n          modelLoadError(editor, url, model);\n        });\n      }\n    };\n    const getIconsUrlMetaFromUrl = editor => Optional.from(getIconsUrl(editor)).filter(isNotEmpty).map(url => ({\n      url,\n      name: Optional.none()\n    }));\n    const getIconsUrlMetaFromName = (editor, name, suffix) => Optional.from(name).filter(name => isNotEmpty(name) && !IconManager.has(name)).map(name => ({\n      url: `${ editor.editorManager.baseURL }/icons/${ name }/icons${ suffix }.js`,\n      name: Optional.some(name)\n    }));\n    const loadIcons = (scriptLoader, editor, suffix) => {\n      const defaultIconsUrl = getIconsUrlMetaFromName(editor, 'default', suffix);\n      const customIconsUrl = getIconsUrlMetaFromUrl(editor).orThunk(() => getIconsUrlMetaFromName(editor, getIconPackName(editor), ''));\n      each$e(cat([\n        defaultIconsUrl,\n        customIconsUrl\n      ]), urlMeta => {\n        scriptLoader.add(urlMeta.url).catch(() => {\n          iconsLoadError(editor, urlMeta.url, urlMeta.name.getOrUndefined());\n        });\n      });\n    };\n    const loadPlugins = (editor, suffix) => {\n      const loadPlugin = (name, url) => {\n        PluginManager.load(name, url).catch(() => {\n          pluginLoadError(editor, url, name);\n        });\n      };\n      each$d(getExternalPlugins$1(editor), (url, name) => {\n        loadPlugin(name, url);\n        editor.options.set('plugins', getPlugins(editor).concat(name));\n      });\n      each$e(getPlugins(editor), plugin => {\n        plugin = Tools.trim(plugin);\n        if (plugin && !PluginManager.urls[plugin] && !hasSkipLoadPrefix(plugin)) {\n          loadPlugin(plugin, `plugins/${ plugin }/plugin${ suffix }.js`);\n        }\n      });\n    };\n    const isThemeLoaded = editor => {\n      const theme = getTheme(editor);\n      return !isString(theme) || isNonNullable(ThemeManager.get(theme));\n    };\n    const isModelLoaded = editor => {\n      const model = getModel(editor);\n      return isNonNullable(ModelManager.get(model));\n    };\n    const loadScripts = (editor, suffix) => {\n      const scriptLoader = ScriptLoader.ScriptLoader;\n      const initEditor = () => {\n        if (!editor.removed && isThemeLoaded(editor) && isModelLoaded(editor)) {\n          init(editor);\n        }\n      };\n      loadTheme(editor, suffix);\n      loadModel(editor, suffix);\n      loadLanguage(scriptLoader, editor);\n      loadIcons(scriptLoader, editor, suffix);\n      loadPlugins(editor, suffix);\n      scriptLoader.loadQueue().then(initEditor, initEditor);\n    };\n    const getStyleSheetLoader = (element, editor) => instance.forElement(element, {\n      contentCssCors: hasContentCssCors(editor),\n      referrerPolicy: getReferrerPolicy(editor)\n    });\n    const render = editor => {\n      const id = editor.id;\n      I18n.setCode(getLanguageCode(editor));\n      const readyHandler = () => {\n        DOM$3.unbind(window, 'ready', readyHandler);\n        editor.render();\n      };\n      if (!EventUtils.Event.domLoaded) {\n        DOM$3.bind(window, 'ready', readyHandler);\n        return;\n      }\n      if (!editor.getElement()) {\n        return;\n      }\n      const element = SugarElement.fromDom(editor.getElement());\n      const snapshot = clone$4(element);\n      editor.on('remove', () => {\n        eachr(element.dom.attributes, attr => remove$9(element, attr.name));\n        setAll$1(element, snapshot);\n      });\n      editor.ui.styleSheetLoader = getStyleSheetLoader(element, editor);\n      if (!isInline$1(editor)) {\n        editor.orgVisibility = editor.getElement().style.visibility;\n        editor.getElement().style.visibility = 'hidden';\n      } else {\n        editor.inline = true;\n      }\n      const form = editor.getElement().form || DOM$3.getParent(id, 'form');\n      if (form) {\n        editor.formElement = form;\n        if (hasHiddenInput(editor) && !isTextareaOrInput(editor.getElement())) {\n          DOM$3.insertAfter(DOM$3.create('input', {\n            type: 'hidden',\n            name: id\n          }), id);\n          editor.hasHiddenInput = true;\n        }\n        editor.formEventDelegate = e => {\n          editor.dispatch(e.type, e);\n        };\n        DOM$3.bind(form, 'submit reset', editor.formEventDelegate);\n        editor.on('reset', () => {\n          editor.resetContent();\n        });\n        if (shouldPatchSubmit(editor) && !form.submit.nodeType && !form.submit.length && !form._mceOldSubmit) {\n          form._mceOldSubmit = form.submit;\n          form.submit = () => {\n            editor.editorManager.triggerSave();\n            editor.setDirty(false);\n            return form._mceOldSubmit(form);\n          };\n        }\n      }\n      editor.windowManager = WindowManager(editor);\n      editor.notificationManager = NotificationManager(editor);\n      if (isEncodingXml(editor)) {\n        editor.on('GetContent', e => {\n          if (e.save) {\n            e.content = DOM$3.encode(e.content);\n          }\n        });\n      }\n      if (shouldAddFormSubmitTrigger(editor)) {\n        editor.on('submit', () => {\n          if (editor.initialized) {\n            editor.save();\n          }\n        });\n      }\n      if (shouldAddUnloadTrigger(editor)) {\n        editor._beforeUnload = () => {\n          if (editor.initialized && !editor.destroyed && !editor.isHidden()) {\n            editor.save({\n              format: 'raw',\n              no_events: true,\n              set_dirty: false\n            });\n          }\n        };\n        editor.editorManager.on('BeforeUnload', editor._beforeUnload);\n      }\n      editor.editorManager.add(editor);\n      loadScripts(editor, editor.suffix);\n    };\n\n    const setEditableRoot = (editor, state) => {\n      if (editor._editableRoot !== state) {\n        editor._editableRoot = state;\n        if (!editor.readonly) {\n          editor.getBody().contentEditable = String(editor.hasEditableRoot());\n          editor.nodeChanged();\n        }\n        fireEditableRootStateChange(editor, state);\n      }\n    };\n    const hasEditableRoot = editor => editor._editableRoot;\n\n    const sectionResult = (sections, settings) => ({\n      sections: constant(sections),\n      options: constant(settings)\n    });\n    const deviceDetection = detect$1().deviceType;\n    const isPhone = deviceDetection.isPhone();\n    const isTablet = deviceDetection.isTablet();\n    const normalizePlugins = plugins => {\n      if (isNullable(plugins)) {\n        return [];\n      } else {\n        const pluginNames = isArray$1(plugins) ? plugins : plugins.split(/[ ,]/);\n        const trimmedPlugins = map$3(pluginNames, trim$4);\n        return filter$5(trimmedPlugins, isNotEmpty);\n      }\n    };\n    const extractSections = (keys, options) => {\n      const result = bifilter(options, (value, key) => {\n        return contains$2(keys, key);\n      });\n      return sectionResult(result.t, result.f);\n    };\n    const getSection = (sectionResult, name, defaults = {}) => {\n      const sections = sectionResult.sections();\n      const sectionOptions = get$a(sections, name).getOr({});\n      return Tools.extend({}, defaults, sectionOptions);\n    };\n    const hasSection = (sectionResult, name) => {\n      return has$2(sectionResult.sections(), name);\n    };\n    const getSectionConfig = (sectionResult, name) => {\n      return hasSection(sectionResult, name) ? sectionResult.sections()[name] : {};\n    };\n    const getMobileOverrideOptions = (mobileOptions, isPhone) => {\n      const defaultMobileOptions = {\n        table_grid: false,\n        object_resizing: false,\n        resize: false,\n        toolbar_mode: get$a(mobileOptions, 'toolbar_mode').getOr('scrolling'),\n        toolbar_sticky: false\n      };\n      const defaultPhoneOptions = { menubar: false };\n      return {\n        ...defaultMobileOptions,\n        ...isPhone ? defaultPhoneOptions : {}\n      };\n    };\n    const getExternalPlugins = (overrideOptions, options) => {\n      var _a;\n      const userDefinedExternalPlugins = (_a = options.external_plugins) !== null && _a !== void 0 ? _a : {};\n      if (overrideOptions && overrideOptions.external_plugins) {\n        return Tools.extend({}, overrideOptions.external_plugins, userDefinedExternalPlugins);\n      } else {\n        return userDefinedExternalPlugins;\n      }\n    };\n    const combinePlugins = (forcedPlugins, plugins) => [\n      ...normalizePlugins(forcedPlugins),\n      ...normalizePlugins(plugins)\n    ];\n    const getPlatformPlugins = (isMobileDevice, sectionResult, desktopPlugins, mobilePlugins) => {\n      if (isMobileDevice && hasSection(sectionResult, 'mobile')) {\n        return mobilePlugins;\n      } else {\n        return desktopPlugins;\n      }\n    };\n    const processPlugins = (isMobileDevice, sectionResult, defaultOverrideOptions, options) => {\n      const forcedPlugins = normalizePlugins(defaultOverrideOptions.forced_plugins);\n      const desktopPlugins = normalizePlugins(options.plugins);\n      const mobileConfig = getSectionConfig(sectionResult, 'mobile');\n      const mobilePlugins = mobileConfig.plugins ? normalizePlugins(mobileConfig.plugins) : desktopPlugins;\n      const platformPlugins = getPlatformPlugins(isMobileDevice, sectionResult, desktopPlugins, mobilePlugins);\n      const combinedPlugins = combinePlugins(forcedPlugins, platformPlugins);\n      return Tools.extend(options, {\n        forced_plugins: forcedPlugins,\n        plugins: combinedPlugins\n      });\n    };\n    const isOnMobile = (isMobileDevice, sectionResult) => {\n      return isMobileDevice && hasSection(sectionResult, 'mobile');\n    };\n    const combineOptions = (isMobileDevice, isPhone, defaultOptions, defaultOverrideOptions, options) => {\n      var _a;\n      const deviceOverrideOptions = isMobileDevice ? { mobile: getMobileOverrideOptions((_a = options.mobile) !== null && _a !== void 0 ? _a : {}, isPhone) } : {};\n      const sectionResult = extractSections(['mobile'], deepMerge(deviceOverrideOptions, options));\n      const extendedOptions = Tools.extend(defaultOptions, defaultOverrideOptions, sectionResult.options(), isOnMobile(isMobileDevice, sectionResult) ? getSection(sectionResult, 'mobile') : {}, { external_plugins: getExternalPlugins(defaultOverrideOptions, sectionResult.options()) });\n      return processPlugins(isMobileDevice, sectionResult, defaultOverrideOptions, extendedOptions);\n    };\n    const normalizeOptions = (defaultOverrideOptions, options) => combineOptions(isPhone || isTablet, isPhone, options, defaultOverrideOptions, options);\n\n    const addVisual = (editor, elm) => addVisual$1(editor, elm);\n\n    const registerExecCommands$2 = editor => {\n      const toggleFormat = (name, value) => {\n        editor.formatter.toggle(name, value);\n        editor.nodeChanged();\n      };\n      const toggleAlign = align => () => {\n        each$e('left,center,right,justify'.split(','), name => {\n          if (align !== name) {\n            editor.formatter.remove('align' + name);\n          }\n        });\n        if (align !== 'none') {\n          toggleFormat('align' + align);\n        }\n      };\n      editor.editorCommands.addCommands({\n        JustifyLeft: toggleAlign('left'),\n        JustifyCenter: toggleAlign('center'),\n        JustifyRight: toggleAlign('right'),\n        JustifyFull: toggleAlign('justify'),\n        JustifyNone: toggleAlign('none')\n      });\n    };\n    const registerQueryStateCommands = editor => {\n      const alignStates = name => () => {\n        const selection = editor.selection;\n        const nodes = selection.isCollapsed() ? [editor.dom.getParent(selection.getNode(), editor.dom.isBlock)] : selection.getSelectedBlocks();\n        return exists(nodes, node => isNonNullable(editor.formatter.matchNode(node, name)));\n      };\n      editor.editorCommands.addCommands({\n        JustifyLeft: alignStates('alignleft'),\n        JustifyCenter: alignStates('aligncenter'),\n        JustifyRight: alignStates('alignright'),\n        JustifyFull: alignStates('alignjustify')\n      }, 'state');\n    };\n    const registerCommands$a = editor => {\n      registerExecCommands$2(editor);\n      registerQueryStateCommands(editor);\n    };\n\n    const registerCommands$9 = editor => {\n      editor.editorCommands.addCommands({\n        'Cut,Copy,Paste': command => {\n          const doc = editor.getDoc();\n          let failed;\n          try {\n            doc.execCommand(command);\n          } catch (ex) {\n            failed = true;\n          }\n          if (command === 'paste' && !doc.queryCommandEnabled(command)) {\n            failed = true;\n          }\n          if (failed || !doc.queryCommandSupported(command)) {\n            let msg = editor.translate(`Your browser doesn't support direct access to the clipboard. ` + 'Please use the Ctrl+X/C/V keyboard shortcuts instead.');\n            if (Env.os.isMacOS() || Env.os.isiOS()) {\n              msg = msg.replace(/Ctrl\\+/g, '\\u2318+');\n            }\n            editor.notificationManager.open({\n              text: msg,\n              type: 'error'\n            });\n          }\n        }\n      });\n    };\n\n    const trimOrPadLeftRight = (dom, rng, html, schema) => {\n      const root = SugarElement.fromDom(dom.getRoot());\n      if (needsToBeNbspLeft(root, CaretPosition.fromRangeStart(rng), schema)) {\n        html = html.replace(/^ /, '&nbsp;');\n      } else {\n        html = html.replace(/^&nbsp;/, ' ');\n      }\n      if (needsToBeNbspRight(root, CaretPosition.fromRangeEnd(rng), schema)) {\n        html = html.replace(/(&nbsp;| )(<br( \\/)>)?$/, '&nbsp;');\n      } else {\n        html = html.replace(/&nbsp;(<br( \\/)?>)?$/, ' ');\n      }\n      return html;\n    };\n\n    const processValue$1 = value => {\n      if (typeof value !== 'string') {\n        const details = Tools.extend({\n          paste: value.paste,\n          data: { paste: value.paste }\n        }, value);\n        return {\n          content: value.content,\n          details\n        };\n      }\n      return {\n        content: value,\n        details: {}\n      };\n    };\n    const trimOrPad = (editor, value) => {\n      const selection = editor.selection;\n      const dom = editor.dom;\n      if (/^ | $/.test(value)) {\n        return trimOrPadLeftRight(dom, selection.getRng(), value, editor.schema);\n      } else {\n        return value;\n      }\n    };\n    const insertAtCaret = (editor, value) => {\n      if (editor.selection.isEditable()) {\n        const {content, details} = processValue$1(value);\n        preProcessSetContent(editor, {\n          ...details,\n          content: trimOrPad(editor, content),\n          format: 'html',\n          set: false,\n          selection: true\n        }).each(args => {\n          const insertedContent = insertContent$1(editor, args.content, details);\n          postProcessSetContent(editor, insertedContent, args);\n          editor.addVisual();\n        });\n      }\n    };\n\n    const registerCommands$8 = editor => {\n      editor.editorCommands.addCommands({\n        mceCleanup: () => {\n          const bm = editor.selection.getBookmark();\n          editor.setContent(editor.getContent());\n          editor.selection.moveToBookmark(bm);\n        },\n        insertImage: (_command, _ui, value) => {\n          insertAtCaret(editor, editor.dom.createHTML('img', { src: value }));\n        },\n        insertHorizontalRule: () => {\n          editor.execCommand('mceInsertContent', false, '<hr>');\n        },\n        insertText: (_command, _ui, value) => {\n          insertAtCaret(editor, editor.dom.encode(value));\n        },\n        insertHTML: (_command, _ui, value) => {\n          insertAtCaret(editor, value);\n        },\n        mceInsertContent: (_command, _ui, value) => {\n          insertAtCaret(editor, value);\n        },\n        mceSetContent: (_command, _ui, value) => {\n          editor.setContent(value);\n        },\n        mceReplaceContent: (_command, _ui, value) => {\n          editor.execCommand('mceInsertContent', false, value.replace(/\\{\\$selection\\}/g, editor.selection.getContent({ format: 'text' })));\n        },\n        mceNewDocument: () => {\n          editor.setContent(getNewDocumentContent(editor));\n        }\n      });\n    };\n\n    const legacyPropNames = {\n      'font-size': 'size',\n      'font-family': 'face'\n    };\n    const isFont = isTag('font');\n    const getSpecifiedFontProp = (propName, rootElm, elm) => {\n      const getProperty = elm => getRaw(elm, propName).orThunk(() => {\n        if (isFont(elm)) {\n          return get$a(legacyPropNames, propName).bind(legacyPropName => getOpt(elm, legacyPropName));\n        } else {\n          return Optional.none();\n        }\n      });\n      const isRoot = elm => eq(SugarElement.fromDom(rootElm), elm);\n      return closest$1(SugarElement.fromDom(elm), elm => getProperty(elm), isRoot);\n    };\n    const normalizeFontFamily = fontFamily => fontFamily.replace(/[\\'\\\"\\\\]/g, '').replace(/,\\s+/g, ',');\n    const getComputedFontProp = (propName, elm) => Optional.from(DOMUtils.DOM.getStyle(elm, propName, true));\n    const getFontProp = propName => (rootElm, elm) => Optional.from(elm).map(SugarElement.fromDom).filter(isElement$7).bind(element => getSpecifiedFontProp(propName, rootElm, element.dom).or(getComputedFontProp(propName, element.dom))).getOr('');\n    const getFontSize = getFontProp('font-size');\n    const getFontFamily = compose(normalizeFontFamily, getFontProp('font-family'));\n\n    const findFirstCaretElement = editor => firstPositionIn(editor.getBody()).bind(caret => {\n      const container = caret.container();\n      return Optional.from(isText$b(container) ? container.parentNode : container);\n    });\n    const getCaretElement = editor => Optional.from(editor.selection.getRng()).bind(rng => {\n      const root = editor.getBody();\n      const atStartOfNode = rng.startContainer === root && rng.startOffset === 0;\n      return atStartOfNode ? Optional.none() : Optional.from(editor.selection.getStart(true));\n    });\n    const bindRange = (editor, binder) => getCaretElement(editor).orThunk(curry(findFirstCaretElement, editor)).map(SugarElement.fromDom).filter(isElement$7).bind(binder);\n    const mapRange = (editor, mapper) => bindRange(editor, compose1(Optional.some, mapper));\n\n    const fromFontSizeNumber = (editor, value) => {\n      if (/^[0-9.]+$/.test(value)) {\n        const fontSizeNumber = parseInt(value, 10);\n        if (fontSizeNumber >= 1 && fontSizeNumber <= 7) {\n          const fontSizes = getFontStyleValues(editor);\n          const fontClasses = getFontSizeClasses(editor);\n          if (fontClasses.length > 0) {\n            return fontClasses[fontSizeNumber - 1] || value;\n          } else {\n            return fontSizes[fontSizeNumber - 1] || value;\n          }\n        } else {\n          return value;\n        }\n      } else {\n        return value;\n      }\n    };\n    const normalizeFontNames = font => {\n      const fonts = font.split(/\\s*,\\s*/);\n      return map$3(fonts, font => {\n        if (font.indexOf(' ') !== -1 && !(startsWith(font, '\"') || startsWith(font, `'`))) {\n          return `'${ font }'`;\n        } else {\n          return font;\n        }\n      }).join(',');\n    };\n    const fontNameAction = (editor, value) => {\n      const font = fromFontSizeNumber(editor, value);\n      editor.formatter.toggle('fontname', { value: normalizeFontNames(font) });\n      editor.nodeChanged();\n    };\n    const fontNameQuery = editor => mapRange(editor, elm => getFontFamily(editor.getBody(), elm.dom)).getOr('');\n    const fontSizeAction = (editor, value) => {\n      editor.formatter.toggle('fontsize', { value: fromFontSizeNumber(editor, value) });\n      editor.nodeChanged();\n    };\n    const fontSizeQuery = editor => mapRange(editor, elm => getFontSize(editor.getBody(), elm.dom)).getOr('');\n\n    const lineHeightQuery = editor => mapRange(editor, elm => {\n      const root = SugarElement.fromDom(editor.getBody());\n      const specifiedStyle = closest$1(elm, elm => getRaw(elm, 'line-height'), curry(eq, root));\n      const computedStyle = () => {\n        const lineHeight = parseFloat(get$7(elm, 'line-height'));\n        const fontSize = parseFloat(get$7(elm, 'font-size'));\n        return String(lineHeight / fontSize);\n      };\n      return specifiedStyle.getOrThunk(computedStyle);\n    }).getOr('');\n    const lineHeightAction = (editor, lineHeight) => {\n      editor.formatter.toggle('lineheight', { value: String(lineHeight) });\n      editor.nodeChanged();\n    };\n\n    const registerExecCommands$1 = editor => {\n      const toggleFormat = (name, value) => {\n        editor.formatter.toggle(name, value);\n        editor.nodeChanged();\n      };\n      editor.editorCommands.addCommands({\n        'Bold,Italic,Underline,Strikethrough,Superscript,Subscript': command => {\n          toggleFormat(command);\n        },\n        'ForeColor,HiliteColor': (command, _ui, value) => {\n          toggleFormat(command, { value });\n        },\n        'BackColor': (_command, _ui, value) => {\n          toggleFormat('hilitecolor', { value });\n        },\n        'FontName': (_command, _ui, value) => {\n          fontNameAction(editor, value);\n        },\n        'FontSize': (_command, _ui, value) => {\n          fontSizeAction(editor, value);\n        },\n        'LineHeight': (_command, _ui, value) => {\n          lineHeightAction(editor, value);\n        },\n        'Lang': (command, _ui, lang) => {\n          var _a;\n          toggleFormat(command, {\n            value: lang.code,\n            customValue: (_a = lang.customCode) !== null && _a !== void 0 ? _a : null\n          });\n        },\n        'RemoveFormat': command => {\n          editor.formatter.remove(command);\n        },\n        'mceBlockQuote': () => {\n          toggleFormat('blockquote');\n        },\n        'FormatBlock': (_command, _ui, value) => {\n          toggleFormat(isString(value) ? value : 'p');\n        },\n        'mceToggleFormat': (_command, _ui, value) => {\n          toggleFormat(value);\n        }\n      });\n    };\n    const registerQueryValueCommands = editor => {\n      const isFormatMatch = name => editor.formatter.match(name);\n      editor.editorCommands.addCommands({\n        'Bold,Italic,Underline,Strikethrough,Superscript,Subscript': command => isFormatMatch(command),\n        'mceBlockQuote': () => isFormatMatch('blockquote')\n      }, 'state');\n      editor.editorCommands.addQueryValueHandler('FontName', () => fontNameQuery(editor));\n      editor.editorCommands.addQueryValueHandler('FontSize', () => fontSizeQuery(editor));\n      editor.editorCommands.addQueryValueHandler('LineHeight', () => lineHeightQuery(editor));\n    };\n    const registerCommands$7 = editor => {\n      registerExecCommands$1(editor);\n      registerQueryValueCommands(editor);\n    };\n\n    const registerCommands$6 = editor => {\n      editor.editorCommands.addCommands({\n        mceAddUndoLevel: () => {\n          editor.undoManager.add();\n        },\n        mceEndUndoLevel: () => {\n          editor.undoManager.add();\n        },\n        Undo: () => {\n          editor.undoManager.undo();\n        },\n        Redo: () => {\n          editor.undoManager.redo();\n        }\n      });\n    };\n\n    const registerCommands$5 = editor => {\n      editor.editorCommands.addCommands({\n        Indent: () => {\n          indent(editor);\n        },\n        Outdent: () => {\n          outdent(editor);\n        }\n      });\n      editor.editorCommands.addCommands({ Outdent: () => canOutdent(editor) }, 'state');\n    };\n\n    const registerCommands$4 = editor => {\n      const applyLinkToSelection = (_command, _ui, value) => {\n        const linkDetails = isString(value) ? { href: value } : value;\n        const anchor = editor.dom.getParent(editor.selection.getNode(), 'a');\n        if (isObject(linkDetails) && isString(linkDetails.href)) {\n          linkDetails.href = linkDetails.href.replace(/ /g, '%20');\n          if (!anchor || !linkDetails.href) {\n            editor.formatter.remove('link');\n          }\n          if (linkDetails.href) {\n            editor.formatter.apply('link', linkDetails, anchor);\n          }\n        }\n      };\n      editor.editorCommands.addCommands({\n        unlink: () => {\n          if (editor.selection.isEditable()) {\n            if (editor.selection.isCollapsed()) {\n              const elm = editor.dom.getParent(editor.selection.getStart(), 'a');\n              if (elm) {\n                editor.dom.remove(elm, true);\n              }\n              return;\n            }\n            editor.formatter.remove('link');\n          }\n        },\n        mceInsertLink: applyLinkToSelection,\n        createLink: applyLinkToSelection\n      });\n    };\n\n    const getTopParentBlock = (editor, node, root, container) => {\n      const dom = editor.dom;\n      const selector = node => dom.isBlock(node) && node.parentElement === root;\n      const topParentBlock = selector(node) ? node : dom.getParent(container, selector, root);\n      return Optional.from(topParentBlock).map(SugarElement.fromDom);\n    };\n    const insert = (editor, before) => {\n      const dom = editor.dom;\n      const rng = editor.selection.getRng();\n      const node = before ? editor.selection.getStart() : editor.selection.getEnd();\n      const container = before ? rng.startContainer : rng.endContainer;\n      const root = getEditableRoot(dom, container);\n      if (!root || !root.isContentEditable) {\n        return;\n      }\n      const insertFn = before ? before$3 : after$4;\n      const newBlockName = getForcedRootBlock(editor);\n      getTopParentBlock(editor, node, root, container).each(parentBlock => {\n        const newBlock = createNewBlock(editor, container, parentBlock.dom, root, false, newBlockName);\n        insertFn(parentBlock, SugarElement.fromDom(newBlock));\n        editor.selection.setCursorLocation(newBlock, 0);\n        editor.dispatch('NewBlock', { newBlock });\n        fireInputEvent(editor, 'insertParagraph');\n      });\n    };\n    const insertBefore = editor => insert(editor, true);\n    const insertAfter = editor => insert(editor, false);\n\n    const registerCommands$3 = editor => {\n      editor.editorCommands.addCommands({\n        InsertNewBlockBefore: () => {\n          insertBefore(editor);\n        },\n        InsertNewBlockAfter: () => {\n          insertAfter(editor);\n        }\n      });\n    };\n\n    const registerCommands$2 = editor => {\n      editor.editorCommands.addCommands({\n        insertParagraph: () => {\n          insertBreak(blockbreak, editor);\n        },\n        mceInsertNewLine: (_command, _ui, value) => {\n          insert$1(editor, value);\n        },\n        InsertLineBreak: (_command, _ui, _value) => {\n          insertBreak(linebreak, editor);\n        }\n      });\n    };\n\n    const registerCommands$1 = editor => {\n      editor.editorCommands.addCommands({\n        mceSelectNodeDepth: (_command, _ui, value) => {\n          let counter = 0;\n          editor.dom.getParent(editor.selection.getNode(), node => {\n            if (isElement$6(node) && counter++ === value) {\n              editor.selection.select(node);\n              return false;\n            } else {\n              return true;\n            }\n          }, editor.getBody());\n        },\n        mceSelectNode: (_command, _ui, value) => {\n          editor.selection.select(value);\n        },\n        selectAll: () => {\n          const editingHost = editor.dom.getParent(editor.selection.getStart(), isContentEditableTrue$3);\n          if (editingHost) {\n            const rng = editor.dom.createRng();\n            rng.selectNodeContents(editingHost);\n            editor.selection.setRng(rng);\n          }\n        }\n      });\n    };\n\n    const registerExecCommands = editor => {\n      editor.editorCommands.addCommands({\n        mceRemoveNode: (_command, _ui, value) => {\n          const node = value !== null && value !== void 0 ? value : editor.selection.getNode();\n          if (node !== editor.getBody()) {\n            const bm = editor.selection.getBookmark();\n            editor.dom.remove(node, true);\n            editor.selection.moveToBookmark(bm);\n          }\n        },\n        mcePrint: () => {\n          editor.getWin().print();\n        },\n        mceFocus: (_command, _ui, value) => {\n          focus(editor, value === true);\n        },\n        mceToggleVisualAid: () => {\n          editor.hasVisual = !editor.hasVisual;\n          editor.addVisual();\n        }\n      });\n    };\n    const registerCommands = editor => {\n      registerCommands$a(editor);\n      registerCommands$9(editor);\n      registerCommands$6(editor);\n      registerCommands$1(editor);\n      registerCommands$8(editor);\n      registerCommands$4(editor);\n      registerCommands$5(editor);\n      registerCommands$3(editor);\n      registerCommands$2(editor);\n      registerCommands$7(editor);\n      registerExecCommands(editor);\n    };\n\n    const selectionSafeCommands = ['toggleview'];\n    const isSelectionSafeCommand = command => contains$2(selectionSafeCommands, command.toLowerCase());\n    class EditorCommands {\n      constructor(editor) {\n        this.commands = {\n          state: {},\n          exec: {},\n          value: {}\n        };\n        this.editor = editor;\n      }\n      execCommand(command, ui = false, value, args) {\n        const editor = this.editor;\n        const lowerCaseCommand = command.toLowerCase();\n        const skipFocus = args === null || args === void 0 ? void 0 : args.skip_focus;\n        if (editor.removed) {\n          return false;\n        }\n        if (lowerCaseCommand !== 'mcefocus') {\n          if (!/^(mceAddUndoLevel|mceEndUndoLevel)$/i.test(lowerCaseCommand) && !skipFocus) {\n            editor.focus();\n          } else {\n            restore(editor);\n          }\n        }\n        const eventArgs = editor.dispatch('BeforeExecCommand', {\n          command,\n          ui,\n          value\n        });\n        if (eventArgs.isDefaultPrevented()) {\n          return false;\n        }\n        const func = this.commands.exec[lowerCaseCommand];\n        if (isFunction(func)) {\n          func(lowerCaseCommand, ui, value);\n          editor.dispatch('ExecCommand', {\n            command,\n            ui,\n            value\n          });\n          return true;\n        }\n        return false;\n      }\n      queryCommandState(command) {\n        if (!isSelectionSafeCommand(command) && this.editor.quirks.isHidden() || this.editor.removed) {\n          return false;\n        }\n        const lowerCaseCommand = command.toLowerCase();\n        const func = this.commands.state[lowerCaseCommand];\n        if (isFunction(func)) {\n          return func(lowerCaseCommand);\n        }\n        return false;\n      }\n      queryCommandValue(command) {\n        if (!isSelectionSafeCommand(command) && this.editor.quirks.isHidden() || this.editor.removed) {\n          return '';\n        }\n        const lowerCaseCommand = command.toLowerCase();\n        const func = this.commands.value[lowerCaseCommand];\n        if (isFunction(func)) {\n          return func(lowerCaseCommand);\n        }\n        return '';\n      }\n      addCommands(commandList, type = 'exec') {\n        const commands = this.commands;\n        each$d(commandList, (callback, command) => {\n          each$e(command.toLowerCase().split(','), command => {\n            commands[type][command] = callback;\n          });\n        });\n      }\n      addCommand(command, callback, scope) {\n        const lowerCaseCommand = command.toLowerCase();\n        this.commands.exec[lowerCaseCommand] = (_command, ui, value) => callback.call(scope !== null && scope !== void 0 ? scope : this.editor, ui, value);\n      }\n      queryCommandSupported(command) {\n        const lowerCaseCommand = command.toLowerCase();\n        if (this.commands.exec[lowerCaseCommand]) {\n          return true;\n        } else {\n          return false;\n        }\n      }\n      addQueryStateHandler(command, callback, scope) {\n        this.commands.state[command.toLowerCase()] = () => callback.call(scope !== null && scope !== void 0 ? scope : this.editor);\n      }\n      addQueryValueHandler(command, callback, scope) {\n        this.commands.value[command.toLowerCase()] = () => callback.call(scope !== null && scope !== void 0 ? scope : this.editor);\n      }\n    }\n\n    const internalContentEditableAttr = 'data-mce-contenteditable';\n    const toggleClass = (elm, cls, state) => {\n      if (has(elm, cls) && !state) {\n        remove$6(elm, cls);\n      } else if (state) {\n        add$2(elm, cls);\n      }\n    };\n    const setEditorCommandState = (editor, cmd, state) => {\n      try {\n        editor.getDoc().execCommand(cmd, false, String(state));\n      } catch (ex) {\n      }\n    };\n    const setContentEditable = (elm, state) => {\n      elm.dom.contentEditable = state ? 'true' : 'false';\n    };\n    const switchOffContentEditableTrue = elm => {\n      each$e(descendants(elm, '*[contenteditable=\"true\"]'), elm => {\n        set$3(elm, internalContentEditableAttr, 'true');\n        setContentEditable(elm, false);\n      });\n    };\n    const switchOnContentEditableTrue = elm => {\n      each$e(descendants(elm, `*[${ internalContentEditableAttr }=\"true\"]`), elm => {\n        remove$9(elm, internalContentEditableAttr);\n        setContentEditable(elm, true);\n      });\n    };\n    const removeFakeSelection = editor => {\n      Optional.from(editor.selection.getNode()).each(elm => {\n        elm.removeAttribute('data-mce-selected');\n      });\n    };\n    const restoreFakeSelection = editor => {\n      editor.selection.setRng(editor.selection.getRng());\n    };\n    const toggleReadOnly = (editor, state) => {\n      const body = SugarElement.fromDom(editor.getBody());\n      toggleClass(body, 'mce-content-readonly', state);\n      if (state) {\n        editor.selection.controlSelection.hideResizeRect();\n        editor._selectionOverrides.hideFakeCaret();\n        removeFakeSelection(editor);\n        editor.readonly = true;\n        setContentEditable(body, false);\n        switchOffContentEditableTrue(body);\n      } else {\n        editor.readonly = false;\n        if (editor.hasEditableRoot()) {\n          setContentEditable(body, true);\n        }\n        switchOnContentEditableTrue(body);\n        setEditorCommandState(editor, 'StyleWithCSS', false);\n        setEditorCommandState(editor, 'enableInlineTableEditing', false);\n        setEditorCommandState(editor, 'enableObjectResizing', false);\n        if (hasEditorOrUiFocus(editor)) {\n          editor.focus();\n        }\n        restoreFakeSelection(editor);\n        editor.nodeChanged();\n      }\n    };\n    const isReadOnly = editor => editor.readonly;\n    const registerFilters = editor => {\n      editor.parser.addAttributeFilter('contenteditable', nodes => {\n        if (isReadOnly(editor)) {\n          each$e(nodes, node => {\n            node.attr(internalContentEditableAttr, node.attr('contenteditable'));\n            node.attr('contenteditable', 'false');\n          });\n        }\n      });\n      editor.serializer.addAttributeFilter(internalContentEditableAttr, nodes => {\n        if (isReadOnly(editor)) {\n          each$e(nodes, node => {\n            node.attr('contenteditable', node.attr(internalContentEditableAttr));\n          });\n        }\n      });\n      editor.serializer.addTempAttr(internalContentEditableAttr);\n    };\n    const registerReadOnlyContentFilters = editor => {\n      if (editor.serializer) {\n        registerFilters(editor);\n      } else {\n        editor.on('PreInit', () => {\n          registerFilters(editor);\n        });\n      }\n    };\n    const isClickEvent = e => e.type === 'click';\n    const allowedEvents = ['copy'];\n    const isReadOnlyAllowedEvent = e => contains$2(allowedEvents, e.type);\n    const getAnchorHrefOpt = (editor, elm) => {\n      const isRoot = elm => eq(elm, SugarElement.fromDom(editor.getBody()));\n      return closest$3(elm, 'a', isRoot).bind(a => getOpt(a, 'href'));\n    };\n    const processReadonlyEvents = (editor, e) => {\n      if (isClickEvent(e) && !VK.metaKeyPressed(e)) {\n        const elm = SugarElement.fromDom(e.target);\n        getAnchorHrefOpt(editor, elm).each(href => {\n          e.preventDefault();\n          if (/^#/.test(href)) {\n            const targetEl = editor.dom.select(`${ href },[name=\"${ removeLeading(href, '#') }\"]`);\n            if (targetEl.length) {\n              editor.selection.scrollIntoView(targetEl[0], true);\n            }\n          } else {\n            window.open(href, '_blank', 'rel=noopener noreferrer,menubar=yes,toolbar=yes,location=yes,status=yes,resizable=yes,scrollbars=yes');\n          }\n        });\n      } else if (isReadOnlyAllowedEvent(e)) {\n        editor.dispatch(e.type, e);\n      }\n    };\n    const registerReadOnlySelectionBlockers = editor => {\n      editor.on('ShowCaret', e => {\n        if (isReadOnly(editor)) {\n          e.preventDefault();\n        }\n      });\n      editor.on('ObjectSelected', e => {\n        if (isReadOnly(editor)) {\n          e.preventDefault();\n        }\n      });\n    };\n\n    const nativeEvents = Tools.makeMap('focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange ' + 'mouseout mouseenter mouseleave wheel keydown keypress keyup input beforeinput contextmenu dragstart dragend dragover ' + 'draggesture dragdrop drop drag submit ' + 'compositionstart compositionend compositionupdate touchstart touchmove touchend touchcancel', ' ');\n    class EventDispatcher {\n      static isNative(name) {\n        return !!nativeEvents[name.toLowerCase()];\n      }\n      constructor(settings) {\n        this.bindings = {};\n        this.settings = settings || {};\n        this.scope = this.settings.scope || this;\n        this.toggleEvent = this.settings.toggleEvent || never;\n      }\n      fire(name, args) {\n        return this.dispatch(name, args);\n      }\n      dispatch(name, args) {\n        const lcName = name.toLowerCase();\n        const event = normalize$3(lcName, args !== null && args !== void 0 ? args : {}, this.scope);\n        if (this.settings.beforeFire) {\n          this.settings.beforeFire(event);\n        }\n        const handlers = this.bindings[lcName];\n        if (handlers) {\n          for (let i = 0, l = handlers.length; i < l; i++) {\n            const callback = handlers[i];\n            if (callback.removed) {\n              continue;\n            }\n            if (callback.once) {\n              this.off(lcName, callback.func);\n            }\n            if (event.isImmediatePropagationStopped()) {\n              return event;\n            }\n            if (callback.func.call(this.scope, event) === false) {\n              event.preventDefault();\n              return event;\n            }\n          }\n        }\n        return event;\n      }\n      on(name, callback, prepend, extra) {\n        if (callback === false) {\n          callback = never;\n        }\n        if (callback) {\n          const wrappedCallback = {\n            func: callback,\n            removed: false\n          };\n          if (extra) {\n            Tools.extend(wrappedCallback, extra);\n          }\n          const names = name.toLowerCase().split(' ');\n          let i = names.length;\n          while (i--) {\n            const currentName = names[i];\n            let handlers = this.bindings[currentName];\n            if (!handlers) {\n              handlers = [];\n              this.toggleEvent(currentName, true);\n            }\n            if (prepend) {\n              handlers = [\n                wrappedCallback,\n                ...handlers\n              ];\n            } else {\n              handlers = [\n                ...handlers,\n                wrappedCallback\n              ];\n            }\n            this.bindings[currentName] = handlers;\n          }\n        }\n        return this;\n      }\n      off(name, callback) {\n        if (name) {\n          const names = name.toLowerCase().split(' ');\n          let i = names.length;\n          while (i--) {\n            const currentName = names[i];\n            let handlers = this.bindings[currentName];\n            if (!currentName) {\n              each$d(this.bindings, (_value, bindingName) => {\n                this.toggleEvent(bindingName, false);\n                delete this.bindings[bindingName];\n              });\n              return this;\n            }\n            if (handlers) {\n              if (!callback) {\n                handlers.length = 0;\n              } else {\n                const filteredHandlers = partition$2(handlers, handler => handler.func === callback);\n                handlers = filteredHandlers.fail;\n                this.bindings[currentName] = handlers;\n                each$e(filteredHandlers.pass, handler => {\n                  handler.removed = true;\n                });\n              }\n              if (!handlers.length) {\n                this.toggleEvent(name, false);\n                delete this.bindings[currentName];\n              }\n            }\n          }\n        } else {\n          each$d(this.bindings, (_value, name) => {\n            this.toggleEvent(name, false);\n          });\n          this.bindings = {};\n        }\n        return this;\n      }\n      once(name, callback, prepend) {\n        return this.on(name, callback, prepend, { once: true });\n      }\n      has(name) {\n        name = name.toLowerCase();\n        const binding = this.bindings[name];\n        return !(!binding || binding.length === 0);\n      }\n    }\n\n    const getEventDispatcher = obj => {\n      if (!obj._eventDispatcher) {\n        obj._eventDispatcher = new EventDispatcher({\n          scope: obj,\n          toggleEvent: (name, state) => {\n            if (EventDispatcher.isNative(name) && obj.toggleNativeEvent) {\n              obj.toggleNativeEvent(name, state);\n            }\n          }\n        });\n      }\n      return obj._eventDispatcher;\n    };\n    const Observable = {\n      fire(name, args, bubble) {\n        return this.dispatch(name, args, bubble);\n      },\n      dispatch(name, args, bubble) {\n        const self = this;\n        if (self.removed && name !== 'remove' && name !== 'detach') {\n          return normalize$3(name.toLowerCase(), args !== null && args !== void 0 ? args : {}, self);\n        }\n        const dispatcherArgs = getEventDispatcher(self).dispatch(name, args);\n        if (bubble !== false && self.parent) {\n          let parent = self.parent();\n          while (parent && !dispatcherArgs.isPropagationStopped()) {\n            parent.dispatch(name, dispatcherArgs, false);\n            parent = parent.parent ? parent.parent() : undefined;\n          }\n        }\n        return dispatcherArgs;\n      },\n      on(name, callback, prepend) {\n        return getEventDispatcher(this).on(name, callback, prepend);\n      },\n      off(name, callback) {\n        return getEventDispatcher(this).off(name, callback);\n      },\n      once(name, callback) {\n        return getEventDispatcher(this).once(name, callback);\n      },\n      hasEventListeners(name) {\n        return getEventDispatcher(this).has(name);\n      }\n    };\n\n    const DOM$2 = DOMUtils.DOM;\n    let customEventRootDelegates;\n    const getEventTarget = (editor, eventName) => {\n      if (eventName === 'selectionchange') {\n        return editor.getDoc();\n      }\n      if (!editor.inline && /^(?:mouse|touch|click|contextmenu|drop|dragover|dragend)/.test(eventName)) {\n        return editor.getDoc().documentElement;\n      }\n      const eventRoot = getEventRoot(editor);\n      if (eventRoot) {\n        if (!editor.eventRoot) {\n          editor.eventRoot = DOM$2.select(eventRoot)[0];\n        }\n        return editor.eventRoot;\n      }\n      return editor.getBody();\n    };\n    const isListening = editor => !editor.hidden && !isReadOnly(editor);\n    const fireEvent = (editor, eventName, e) => {\n      if (isListening(editor)) {\n        editor.dispatch(eventName, e);\n      } else if (isReadOnly(editor)) {\n        processReadonlyEvents(editor, e);\n      }\n    };\n    const bindEventDelegate = (editor, eventName) => {\n      if (!editor.delegates) {\n        editor.delegates = {};\n      }\n      if (editor.delegates[eventName] || editor.removed) {\n        return;\n      }\n      const eventRootElm = getEventTarget(editor, eventName);\n      if (getEventRoot(editor)) {\n        if (!customEventRootDelegates) {\n          customEventRootDelegates = {};\n          editor.editorManager.on('removeEditor', () => {\n            if (!editor.editorManager.activeEditor) {\n              if (customEventRootDelegates) {\n                each$d(customEventRootDelegates, (_value, name) => {\n                  editor.dom.unbind(getEventTarget(editor, name));\n                });\n                customEventRootDelegates = null;\n              }\n            }\n          });\n        }\n        if (customEventRootDelegates[eventName]) {\n          return;\n        }\n        const delegate = e => {\n          const target = e.target;\n          const editors = editor.editorManager.get();\n          let i = editors.length;\n          while (i--) {\n            const body = editors[i].getBody();\n            if (body === target || DOM$2.isChildOf(target, body)) {\n              fireEvent(editors[i], eventName, e);\n            }\n          }\n        };\n        customEventRootDelegates[eventName] = delegate;\n        DOM$2.bind(eventRootElm, eventName, delegate);\n      } else {\n        const delegate = e => {\n          fireEvent(editor, eventName, e);\n        };\n        DOM$2.bind(eventRootElm, eventName, delegate);\n        editor.delegates[eventName] = delegate;\n      }\n    };\n    const EditorObservable = {\n      ...Observable,\n      bindPendingEventDelegates() {\n        const self = this;\n        Tools.each(self._pendingNativeEvents, name => {\n          bindEventDelegate(self, name);\n        });\n      },\n      toggleNativeEvent(name, state) {\n        const self = this;\n        if (name === 'focus' || name === 'blur') {\n          return;\n        }\n        if (self.removed) {\n          return;\n        }\n        if (state) {\n          if (self.initialized) {\n            bindEventDelegate(self, name);\n          } else {\n            if (!self._pendingNativeEvents) {\n              self._pendingNativeEvents = [name];\n            } else {\n              self._pendingNativeEvents.push(name);\n            }\n          }\n        } else if (self.initialized && self.delegates) {\n          self.dom.unbind(getEventTarget(self, name), name, self.delegates[name]);\n          delete self.delegates[name];\n        }\n      },\n      unbindAllNativeEvents() {\n        const self = this;\n        const body = self.getBody();\n        const dom = self.dom;\n        if (self.delegates) {\n          each$d(self.delegates, (value, name) => {\n            self.dom.unbind(getEventTarget(self, name), name, value);\n          });\n          delete self.delegates;\n        }\n        if (!self.inline && body && dom) {\n          body.onload = null;\n          dom.unbind(self.getWin());\n          dom.unbind(self.getDoc());\n        }\n        if (dom) {\n          dom.unbind(body);\n          dom.unbind(self.getContainer());\n        }\n      }\n    };\n\n    const stringListProcessor = value => {\n      if (isString(value)) {\n        return {\n          value: value.split(/[ ,]/),\n          valid: true\n        };\n      } else if (isArrayOf(value, isString)) {\n        return {\n          value,\n          valid: true\n        };\n      } else {\n        return {\n          valid: false,\n          message: `The value must be a string[] or a comma/space separated string.`\n        };\n      }\n    };\n    const getBuiltInProcessor = type => {\n      const validator = (() => {\n        switch (type) {\n        case 'array':\n          return isArray$1;\n        case 'boolean':\n          return isBoolean;\n        case 'function':\n          return isFunction;\n        case 'number':\n          return isNumber;\n        case 'object':\n          return isObject;\n        case 'string':\n          return isString;\n        case 'string[]':\n          return stringListProcessor;\n        case 'object[]':\n          return val => isArrayOf(val, isObject);\n        case 'regexp':\n          return val => is$4(val, RegExp);\n        default:\n          return always;\n        }\n      })();\n      return value => processValue(value, validator, `The value must be a ${ type }.`);\n    };\n    const isBuiltInSpec = spec => isString(spec.processor);\n    const getErrorMessage = (message, result) => {\n      const additionalText = isEmpty$3(result.message) ? '' : `. ${ result.message }`;\n      return message + additionalText;\n    };\n    const isValidResult = result => result.valid;\n    const processValue = (value, processor, message = '') => {\n      const result = processor(value);\n      if (isBoolean(result)) {\n        return result ? {\n          value: value,\n          valid: true\n        } : {\n          valid: false,\n          message\n        };\n      } else {\n        return result;\n      }\n    };\n    const processDefaultValue = (name, defaultValue, processor) => {\n      if (!isUndefined(defaultValue)) {\n        const result = processValue(defaultValue, processor);\n        if (isValidResult(result)) {\n          return result.value;\n        } else {\n          console.error(getErrorMessage(`Invalid default value passed for the \"${ name }\" option`, result));\n        }\n      }\n      return undefined;\n    };\n    const create$5 = (editor, initialOptions) => {\n      const registry = {};\n      const values = {};\n      const setValue = (name, value, processor) => {\n        const result = processValue(value, processor);\n        if (isValidResult(result)) {\n          values[name] = result.value;\n          return true;\n        } else {\n          console.warn(getErrorMessage(`Invalid value passed for the ${ name } option`, result));\n          return false;\n        }\n      };\n      const register = (name, spec) => {\n        const processor = isBuiltInSpec(spec) ? getBuiltInProcessor(spec.processor) : spec.processor;\n        const defaultValue = processDefaultValue(name, spec.default, processor);\n        registry[name] = {\n          ...spec,\n          default: defaultValue,\n          processor\n        };\n        const initValue = get$a(values, name).orThunk(() => get$a(initialOptions, name));\n        initValue.each(value => setValue(name, value, processor));\n      };\n      const isRegistered = name => has$2(registry, name);\n      const get = name => get$a(values, name).orThunk(() => get$a(registry, name).map(spec => spec.default)).getOrUndefined();\n      const set = (name, value) => {\n        if (!isRegistered(name)) {\n          console.warn(`\"${ name }\" is not a registered option. Ensure the option has been registered before setting a value.`);\n          return false;\n        } else {\n          const spec = registry[name];\n          if (spec.immutable) {\n            console.error(`\"${ name }\" is an immutable option and cannot be updated`);\n            return false;\n          } else {\n            return setValue(name, value, spec.processor);\n          }\n        }\n      };\n      const unset = name => {\n        const registered = isRegistered(name);\n        if (registered) {\n          delete values[name];\n        }\n        return registered;\n      };\n      const isSet = name => has$2(values, name);\n      return {\n        register,\n        isRegistered,\n        get,\n        set,\n        unset,\n        isSet\n      };\n    };\n\n    const defaultModes = [\n      'design',\n      'readonly'\n    ];\n    const switchToMode = (editor, activeMode, availableModes, mode) => {\n      const oldMode = availableModes[activeMode.get()];\n      const newMode = availableModes[mode];\n      try {\n        newMode.activate();\n      } catch (e) {\n        console.error(`problem while activating editor mode ${ mode }:`, e);\n        return;\n      }\n      oldMode.deactivate();\n      if (oldMode.editorReadOnly !== newMode.editorReadOnly) {\n        toggleReadOnly(editor, newMode.editorReadOnly);\n      }\n      activeMode.set(mode);\n      fireSwitchMode(editor, mode);\n    };\n    const setMode = (editor, availableModes, activeMode, mode) => {\n      if (mode === activeMode.get()) {\n        return;\n      } else if (!has$2(availableModes, mode)) {\n        throw new Error(`Editor mode '${ mode }' is invalid`);\n      }\n      if (editor.initialized) {\n        switchToMode(editor, activeMode, availableModes, mode);\n      } else {\n        editor.on('init', () => switchToMode(editor, activeMode, availableModes, mode));\n      }\n    };\n    const registerMode = (availableModes, mode, api) => {\n      if (contains$2(defaultModes, mode)) {\n        throw new Error(`Cannot override default mode ${ mode }`);\n      }\n      return {\n        ...availableModes,\n        [mode]: {\n          ...api,\n          deactivate: () => {\n            try {\n              api.deactivate();\n            } catch (e) {\n              console.error(`problem while deactivating editor mode ${ mode }:`, e);\n            }\n          }\n        }\n      };\n    };\n\n    const create$4 = editor => {\n      const activeMode = Cell('design');\n      const availableModes = Cell({\n        design: {\n          activate: noop,\n          deactivate: noop,\n          editorReadOnly: false\n        },\n        readonly: {\n          activate: noop,\n          deactivate: noop,\n          editorReadOnly: true\n        }\n      });\n      registerReadOnlyContentFilters(editor);\n      registerReadOnlySelectionBlockers(editor);\n      return {\n        isReadOnly: () => isReadOnly(editor),\n        set: mode => setMode(editor, availableModes.get(), activeMode, mode),\n        get: () => activeMode.get(),\n        register: (mode, api) => {\n          availableModes.set(registerMode(availableModes.get(), mode, api));\n        }\n      };\n    };\n\n    const each$2 = Tools.each, explode = Tools.explode;\n    const keyCodeLookup = {\n      f1: 112,\n      f2: 113,\n      f3: 114,\n      f4: 115,\n      f5: 116,\n      f6: 117,\n      f7: 118,\n      f8: 119,\n      f9: 120,\n      f10: 121,\n      f11: 122,\n      f12: 123\n    };\n    const modifierNames = Tools.makeMap('alt,ctrl,shift,meta,access');\n    const isModifier = key => key in modifierNames;\n    const parseShortcut = pattern => {\n      const shortcut = {};\n      const isMac = Env.os.isMacOS() || Env.os.isiOS();\n      each$2(explode(pattern.toLowerCase(), '+'), value => {\n        if (isModifier(value)) {\n          shortcut[value] = true;\n        } else {\n          if (/^[0-9]{2,}$/.test(value)) {\n            shortcut.keyCode = parseInt(value, 10);\n          } else {\n            shortcut.charCode = value.charCodeAt(0);\n            shortcut.keyCode = keyCodeLookup[value] || value.toUpperCase().charCodeAt(0);\n          }\n        }\n      });\n      const id = [shortcut.keyCode];\n      let key;\n      for (key in modifierNames) {\n        if (shortcut[key]) {\n          id.push(key);\n        } else {\n          shortcut[key] = false;\n        }\n      }\n      shortcut.id = id.join(',');\n      if (shortcut.access) {\n        shortcut.alt = true;\n        if (isMac) {\n          shortcut.ctrl = true;\n        } else {\n          shortcut.shift = true;\n        }\n      }\n      if (shortcut.meta) {\n        if (isMac) {\n          shortcut.meta = true;\n        } else {\n          shortcut.ctrl = true;\n          shortcut.meta = false;\n        }\n      }\n      return shortcut;\n    };\n    class Shortcuts {\n      constructor(editor) {\n        this.shortcuts = {};\n        this.pendingPatterns = [];\n        this.editor = editor;\n        const self = this;\n        editor.on('keyup keypress keydown', e => {\n          if ((self.hasModifier(e) || self.isFunctionKey(e)) && !e.isDefaultPrevented()) {\n            each$2(self.shortcuts, shortcut => {\n              if (self.matchShortcut(e, shortcut)) {\n                self.pendingPatterns = shortcut.subpatterns.slice(0);\n                if (e.type === 'keydown') {\n                  self.executeShortcutAction(shortcut);\n                }\n              }\n            });\n            if (self.matchShortcut(e, self.pendingPatterns[0])) {\n              if (self.pendingPatterns.length === 1) {\n                if (e.type === 'keydown') {\n                  self.executeShortcutAction(self.pendingPatterns[0]);\n                }\n              }\n              self.pendingPatterns.shift();\n            }\n          }\n        });\n      }\n      add(pattern, desc, cmdFunc, scope) {\n        const self = this;\n        const func = self.normalizeCommandFunc(cmdFunc);\n        each$2(explode(Tools.trim(pattern)), pattern => {\n          const shortcut = self.createShortcut(pattern, desc, func, scope);\n          self.shortcuts[shortcut.id] = shortcut;\n        });\n        return true;\n      }\n      remove(pattern) {\n        const shortcut = this.createShortcut(pattern);\n        if (this.shortcuts[shortcut.id]) {\n          delete this.shortcuts[shortcut.id];\n          return true;\n        }\n        return false;\n      }\n      normalizeCommandFunc(cmdFunc) {\n        const self = this;\n        const cmd = cmdFunc;\n        if (typeof cmd === 'string') {\n          return () => {\n            self.editor.execCommand(cmd, false, null);\n          };\n        } else if (Tools.isArray(cmd)) {\n          return () => {\n            self.editor.execCommand(cmd[0], cmd[1], cmd[2]);\n          };\n        } else {\n          return cmd;\n        }\n      }\n      createShortcut(pattern, desc, cmdFunc, scope) {\n        const shortcuts = Tools.map(explode(pattern, '>'), parseShortcut);\n        shortcuts[shortcuts.length - 1] = Tools.extend(shortcuts[shortcuts.length - 1], {\n          func: cmdFunc,\n          scope: scope || this.editor\n        });\n        return Tools.extend(shortcuts[0], {\n          desc: this.editor.translate(desc),\n          subpatterns: shortcuts.slice(1)\n        });\n      }\n      hasModifier(e) {\n        return e.altKey || e.ctrlKey || e.metaKey;\n      }\n      isFunctionKey(e) {\n        return e.type === 'keydown' && e.keyCode >= 112 && e.keyCode <= 123;\n      }\n      matchShortcut(e, shortcut) {\n        if (!shortcut) {\n          return false;\n        }\n        if (shortcut.ctrl !== e.ctrlKey || shortcut.meta !== e.metaKey) {\n          return false;\n        }\n        if (shortcut.alt !== e.altKey || shortcut.shift !== e.shiftKey) {\n          return false;\n        }\n        if (e.keyCode === shortcut.keyCode || e.charCode && e.charCode === shortcut.charCode) {\n          e.preventDefault();\n          return true;\n        }\n        return false;\n      }\n      executeShortcutAction(shortcut) {\n        return shortcut.func ? shortcut.func.call(shortcut.scope) : null;\n      }\n    }\n\n    const create$3 = () => {\n      const buttons = {};\n      const menuItems = {};\n      const popups = {};\n      const icons = {};\n      const contextMenus = {};\n      const contextToolbars = {};\n      const sidebars = {};\n      const views = {};\n      const add = (collection, type) => (name, spec) => {\n        collection[name.toLowerCase()] = {\n          ...spec,\n          type\n        };\n      };\n      const addIcon = (name, svgData) => icons[name.toLowerCase()] = svgData;\n      return {\n        addButton: add(buttons, 'button'),\n        addGroupToolbarButton: add(buttons, 'grouptoolbarbutton'),\n        addToggleButton: add(buttons, 'togglebutton'),\n        addMenuButton: add(buttons, 'menubutton'),\n        addSplitButton: add(buttons, 'splitbutton'),\n        addMenuItem: add(menuItems, 'menuitem'),\n        addNestedMenuItem: add(menuItems, 'nestedmenuitem'),\n        addToggleMenuItem: add(menuItems, 'togglemenuitem'),\n        addAutocompleter: add(popups, 'autocompleter'),\n        addContextMenu: add(contextMenus, 'contextmenu'),\n        addContextToolbar: add(contextToolbars, 'contexttoolbar'),\n        addContextForm: add(contextToolbars, 'contextform'),\n        addSidebar: add(sidebars, 'sidebar'),\n        addView: add(views, 'views'),\n        addIcon,\n        getAll: () => ({\n          buttons,\n          menuItems,\n          icons,\n          popups,\n          contextMenus,\n          contextToolbars,\n          sidebars,\n          views\n        })\n      };\n    };\n\n    const registry = () => {\n      const bridge = create$3();\n      return {\n        addAutocompleter: bridge.addAutocompleter,\n        addButton: bridge.addButton,\n        addContextForm: bridge.addContextForm,\n        addContextMenu: bridge.addContextMenu,\n        addContextToolbar: bridge.addContextToolbar,\n        addIcon: bridge.addIcon,\n        addMenuButton: bridge.addMenuButton,\n        addMenuItem: bridge.addMenuItem,\n        addNestedMenuItem: bridge.addNestedMenuItem,\n        addSidebar: bridge.addSidebar,\n        addSplitButton: bridge.addSplitButton,\n        addToggleButton: bridge.addToggleButton,\n        addGroupToolbarButton: bridge.addGroupToolbarButton,\n        addToggleMenuItem: bridge.addToggleMenuItem,\n        addView: bridge.addView,\n        getAll: bridge.getAll\n      };\n    };\n\n    const DOM$1 = DOMUtils.DOM;\n    const extend = Tools.extend, each$1 = Tools.each;\n    class Editor {\n      constructor(id, options, editorManager) {\n        this.plugins = {};\n        this.contentCSS = [];\n        this.contentStyles = [];\n        this.loadedCSS = {};\n        this.isNotDirty = false;\n        this.composing = false;\n        this.destroyed = false;\n        this.hasHiddenInput = false;\n        this.iframeElement = null;\n        this.initialized = false;\n        this.readonly = false;\n        this.removed = false;\n        this.startContent = '';\n        this._pendingNativeEvents = [];\n        this._skinLoaded = false;\n        this._editableRoot = true;\n        this.editorManager = editorManager;\n        this.documentBaseUrl = editorManager.documentBaseURL;\n        extend(this, EditorObservable);\n        const self = this;\n        this.id = id;\n        this.hidden = false;\n        const normalizedOptions = normalizeOptions(editorManager.defaultOptions, options);\n        this.options = create$5(self, normalizedOptions);\n        register$7(self);\n        const getOption = this.options.get;\n        if (getOption('deprecation_warnings')) {\n          logWarnings(options, normalizedOptions);\n        }\n        const suffix = getOption('suffix');\n        if (suffix) {\n          editorManager.suffix = suffix;\n        }\n        this.suffix = editorManager.suffix;\n        const baseUrl = getOption('base_url');\n        if (baseUrl) {\n          editorManager._setBaseUrl(baseUrl);\n        }\n        this.baseUri = editorManager.baseURI;\n        const referrerPolicy = getReferrerPolicy(self);\n        if (referrerPolicy) {\n          ScriptLoader.ScriptLoader._setReferrerPolicy(referrerPolicy);\n          DOMUtils.DOM.styleSheetLoader._setReferrerPolicy(referrerPolicy);\n        }\n        const contentCssCors = hasContentCssCors(self);\n        if (isNonNullable(contentCssCors)) {\n          DOMUtils.DOM.styleSheetLoader._setContentCssCors(contentCssCors);\n        }\n        AddOnManager.languageLoad = getOption('language_load');\n        AddOnManager.baseURL = editorManager.baseURL;\n        this.setDirty(false);\n        this.documentBaseURI = new URI(getDocumentBaseUrl(self), { base_uri: this.baseUri });\n        this.baseURI = this.baseUri;\n        this.inline = isInline$1(self);\n        this.hasVisual = isVisualAidsEnabled(self);\n        this.shortcuts = new Shortcuts(this);\n        this.editorCommands = new EditorCommands(this);\n        registerCommands(this);\n        const cacheSuffix = getOption('cache_suffix');\n        if (cacheSuffix) {\n          Env.cacheSuffix = cacheSuffix.replace(/^[\\?\\&]+/, '');\n        }\n        this.ui = {\n          registry: registry(),\n          styleSheetLoader: undefined,\n          show: noop,\n          hide: noop,\n          setEnabled: noop,\n          isEnabled: always\n        };\n        this.mode = create$4(self);\n        editorManager.dispatch('SetupEditor', { editor: this });\n        const setupCallback = getSetupCallback(self);\n        if (isFunction(setupCallback)) {\n          setupCallback.call(self, self);\n        }\n      }\n      render() {\n        render(this);\n      }\n      focus(skipFocus) {\n        this.execCommand('mceFocus', false, skipFocus);\n      }\n      hasFocus() {\n        return hasFocus(this);\n      }\n      translate(text) {\n        return I18n.translate(text);\n      }\n      getParam(name, defaultVal, type) {\n        const options = this.options;\n        if (!options.isRegistered(name)) {\n          if (isNonNullable(type)) {\n            options.register(name, {\n              processor: type,\n              default: defaultVal\n            });\n          } else {\n            options.register(name, {\n              processor: always,\n              default: defaultVal\n            });\n          }\n        }\n        return !options.isSet(name) && !isUndefined(defaultVal) ? defaultVal : options.get(name);\n      }\n      hasPlugin(name, loaded) {\n        const hasPlugin = contains$2(getPlugins(this), name);\n        if (hasPlugin) {\n          return loaded ? PluginManager.get(name) !== undefined : true;\n        } else {\n          return false;\n        }\n      }\n      nodeChanged(args) {\n        this._nodeChangeDispatcher.nodeChanged(args);\n      }\n      addCommand(name, callback, scope) {\n        this.editorCommands.addCommand(name, callback, scope);\n      }\n      addQueryStateHandler(name, callback, scope) {\n        this.editorCommands.addQueryStateHandler(name, callback, scope);\n      }\n      addQueryValueHandler(name, callback, scope) {\n        this.editorCommands.addQueryValueHandler(name, callback, scope);\n      }\n      addShortcut(pattern, desc, cmdFunc, scope) {\n        this.shortcuts.add(pattern, desc, cmdFunc, scope);\n      }\n      execCommand(cmd, ui, value, args) {\n        return this.editorCommands.execCommand(cmd, ui, value, args);\n      }\n      queryCommandState(cmd) {\n        return this.editorCommands.queryCommandState(cmd);\n      }\n      queryCommandValue(cmd) {\n        return this.editorCommands.queryCommandValue(cmd);\n      }\n      queryCommandSupported(cmd) {\n        return this.editorCommands.queryCommandSupported(cmd);\n      }\n      show() {\n        const self = this;\n        if (self.hidden) {\n          self.hidden = false;\n          if (self.inline) {\n            self.getBody().contentEditable = 'true';\n          } else {\n            DOM$1.show(self.getContainer());\n            DOM$1.hide(self.id);\n          }\n          self.load();\n          self.dispatch('show');\n        }\n      }\n      hide() {\n        const self = this;\n        if (!self.hidden) {\n          self.save();\n          if (self.inline) {\n            self.getBody().contentEditable = 'false';\n            if (self === self.editorManager.focusedEditor) {\n              self.editorManager.focusedEditor = null;\n            }\n          } else {\n            DOM$1.hide(self.getContainer());\n            DOM$1.setStyle(self.id, 'display', self.orgDisplay);\n          }\n          self.hidden = true;\n          self.dispatch('hide');\n        }\n      }\n      isHidden() {\n        return this.hidden;\n      }\n      setProgressState(state, time) {\n        this.dispatch('ProgressState', {\n          state,\n          time\n        });\n      }\n      load(args = {}) {\n        const self = this;\n        const elm = self.getElement();\n        if (self.removed) {\n          return '';\n        }\n        if (elm) {\n          const loadArgs = {\n            ...args,\n            load: true\n          };\n          const value = isTextareaOrInput(elm) ? elm.value : elm.innerHTML;\n          const html = self.setContent(value, loadArgs);\n          if (!loadArgs.no_events) {\n            self.dispatch('LoadContent', {\n              ...loadArgs,\n              element: elm\n            });\n          }\n          return html;\n        } else {\n          return '';\n        }\n      }\n      save(args = {}) {\n        const self = this;\n        let elm = self.getElement();\n        if (!elm || !self.initialized || self.removed) {\n          return '';\n        }\n        const getArgs = {\n          ...args,\n          save: true,\n          element: elm\n        };\n        let html = self.getContent(getArgs);\n        const saveArgs = {\n          ...getArgs,\n          content: html\n        };\n        if (!saveArgs.no_events) {\n          self.dispatch('SaveContent', saveArgs);\n        }\n        if (saveArgs.format === 'raw') {\n          self.dispatch('RawSaveContent', saveArgs);\n        }\n        html = saveArgs.content;\n        if (!isTextareaOrInput(elm)) {\n          if (args.is_removing || !self.inline) {\n            elm.innerHTML = html;\n          }\n          const form = DOM$1.getParent(self.id, 'form');\n          if (form) {\n            each$1(form.elements, elm => {\n              if (elm.name === self.id) {\n                elm.value = html;\n                return false;\n              } else {\n                return true;\n              }\n            });\n          }\n        } else {\n          elm.value = html;\n        }\n        saveArgs.element = getArgs.element = elm = null;\n        if (saveArgs.set_dirty !== false) {\n          self.setDirty(false);\n        }\n        return html;\n      }\n      setContent(content, args) {\n        return setContent(this, content, args);\n      }\n      getContent(args) {\n        return getContent(this, args);\n      }\n      insertContent(content, args) {\n        if (args) {\n          content = extend({ content }, args);\n        }\n        this.execCommand('mceInsertContent', false, content);\n      }\n      resetContent(initialContent) {\n        if (initialContent === undefined) {\n          setContent(this, this.startContent, { format: 'raw' });\n        } else {\n          setContent(this, initialContent);\n        }\n        this.undoManager.reset();\n        this.setDirty(false);\n        this.nodeChanged();\n      }\n      isDirty() {\n        return !this.isNotDirty;\n      }\n      setDirty(state) {\n        const oldState = !this.isNotDirty;\n        this.isNotDirty = !state;\n        if (state && state !== oldState) {\n          this.dispatch('dirty');\n        }\n      }\n      getContainer() {\n        const self = this;\n        if (!self.container) {\n          self.container = self.editorContainer || DOM$1.get(self.id + '_parent');\n        }\n        return self.container;\n      }\n      getContentAreaContainer() {\n        return this.contentAreaContainer;\n      }\n      getElement() {\n        if (!this.targetElm) {\n          this.targetElm = DOM$1.get(this.id);\n        }\n        return this.targetElm;\n      }\n      getWin() {\n        const self = this;\n        if (!self.contentWindow) {\n          const elm = self.iframeElement;\n          if (elm) {\n            self.contentWindow = elm.contentWindow;\n          }\n        }\n        return self.contentWindow;\n      }\n      getDoc() {\n        const self = this;\n        if (!self.contentDocument) {\n          const win = self.getWin();\n          if (win) {\n            self.contentDocument = win.document;\n          }\n        }\n        return self.contentDocument;\n      }\n      getBody() {\n        var _a, _b;\n        const doc = this.getDoc();\n        return (_b = (_a = this.bodyElement) !== null && _a !== void 0 ? _a : doc === null || doc === void 0 ? void 0 : doc.body) !== null && _b !== void 0 ? _b : null;\n      }\n      convertURL(url, name, elm) {\n        const self = this, getOption = self.options.get;\n        const urlConverterCallback = getUrlConverterCallback(self);\n        if (isFunction(urlConverterCallback)) {\n          return urlConverterCallback.call(self, url, elm, true, name);\n        }\n        if (!getOption('convert_urls') || elm === 'link' || isObject(elm) && elm.nodeName === 'LINK' || url.indexOf('file:') === 0 || url.length === 0) {\n          return url;\n        }\n        const urlObject = new URI(url);\n        if (urlObject.protocol !== 'http' && urlObject.protocol !== 'https' && urlObject.protocol !== '') {\n          return url;\n        }\n        if (getOption('relative_urls')) {\n          return self.documentBaseURI.toRelative(url);\n        }\n        url = self.documentBaseURI.toAbsolute(url, getOption('remove_script_host'));\n        return url;\n      }\n      addVisual(elm) {\n        addVisual(this, elm);\n      }\n      setEditableRoot(state) {\n        setEditableRoot(this, state);\n      }\n      hasEditableRoot() {\n        return hasEditableRoot(this);\n      }\n      remove() {\n        remove$1(this);\n      }\n      destroy(automatic) {\n        destroy(this, automatic);\n      }\n      uploadImages() {\n        return this.editorUpload.uploadImages();\n      }\n      _scanForImages() {\n        return this.editorUpload.scanForImages();\n      }\n    }\n\n    const DOM = DOMUtils.DOM;\n    const each = Tools.each;\n    let boundGlobalEvents = false;\n    let beforeUnloadDelegate;\n    let editors = [];\n    const globalEventDelegate = e => {\n      const type = e.type;\n      each(EditorManager.get(), editor => {\n        switch (type) {\n        case 'scroll':\n          editor.dispatch('ScrollWindow', e);\n          break;\n        case 'resize':\n          editor.dispatch('ResizeWindow', e);\n          break;\n        }\n      });\n    };\n    const toggleGlobalEvents = state => {\n      if (state !== boundGlobalEvents) {\n        const DOM = DOMUtils.DOM;\n        if (state) {\n          DOM.bind(window, 'resize', globalEventDelegate);\n          DOM.bind(window, 'scroll', globalEventDelegate);\n        } else {\n          DOM.unbind(window, 'resize', globalEventDelegate);\n          DOM.unbind(window, 'scroll', globalEventDelegate);\n        }\n        boundGlobalEvents = state;\n      }\n    };\n    const removeEditorFromList = targetEditor => {\n      const oldEditors = editors;\n      editors = filter$5(editors, editor => {\n        return targetEditor !== editor;\n      });\n      if (EditorManager.activeEditor === targetEditor) {\n        EditorManager.activeEditor = editors.length > 0 ? editors[0] : null;\n      }\n      if (EditorManager.focusedEditor === targetEditor) {\n        EditorManager.focusedEditor = null;\n      }\n      return oldEditors.length !== editors.length;\n    };\n    const purgeDestroyedEditor = editor => {\n      if (editor && editor.initialized && !(editor.getContainer() || editor.getBody()).parentNode) {\n        removeEditorFromList(editor);\n        editor.unbindAllNativeEvents();\n        editor.destroy(true);\n        editor.removed = true;\n      }\n    };\n    const isQuirksMode = document.compatMode !== 'CSS1Compat';\n    const EditorManager = {\n      ...Observable,\n      baseURI: null,\n      baseURL: null,\n      defaultOptions: {},\n      documentBaseURL: null,\n      suffix: null,\n      majorVersion: '1',\n      minorVersion: '0.8',\n      releaseDate: '2025-03-11',\n      i18n: I18n,\n      activeEditor: null,\n      focusedEditor: null,\n      setup() {\n        const self = this;\n        let baseURL = '';\n        let suffix = '';\n        let documentBaseURL = URI.getDocumentBaseUrl(document.location);\n        if (/^[^:]+:\\/\\/\\/?[^\\/]+\\//.test(documentBaseURL)) {\n          documentBaseURL = documentBaseURL.replace(/[\\?#].*$/, '').replace(/[\\/\\\\][^\\/]+$/, '');\n          if (!/[\\/\\\\]$/.test(documentBaseURL)) {\n            documentBaseURL += '/';\n          }\n        }\n        const preInit = window.hugerte || window.hugeRTEPreInit;\n        if (preInit) {\n          baseURL = preInit.base || preInit.baseURL;\n          suffix = preInit.suffix;\n        } else {\n          const scripts = document.getElementsByTagName('script');\n          for (let i = 0; i < scripts.length; i++) {\n            const src = scripts[i].src || '';\n            if (src === '') {\n              continue;\n            }\n            const srcScript = src.substring(src.lastIndexOf('/'));\n            if (/hugerte(\\.full|\\.jquery|)(\\.min|\\.dev|)\\.js/.test(src)) {\n              if (srcScript.indexOf('.min') !== -1) {\n                suffix = '.min';\n              }\n              baseURL = src.substring(0, src.lastIndexOf('/'));\n              break;\n            }\n          }\n          if (!baseURL && document.currentScript) {\n            const src = document.currentScript.src;\n            if (src.indexOf('.min') !== -1) {\n              suffix = '.min';\n            }\n            baseURL = src.substring(0, src.lastIndexOf('/'));\n          }\n        }\n        self.baseURL = new URI(documentBaseURL).toAbsolute(baseURL);\n        self.documentBaseURL = documentBaseURL;\n        self.baseURI = new URI(self.baseURL);\n        self.suffix = suffix;\n        setup$w(self);\n      },\n      overrideDefaults(defaultOptions) {\n        const baseUrl = defaultOptions.base_url;\n        if (baseUrl) {\n          this._setBaseUrl(baseUrl);\n        }\n        const suffix = defaultOptions.suffix;\n        if (suffix) {\n          this.suffix = suffix;\n        }\n        this.defaultOptions = defaultOptions;\n        const pluginBaseUrls = defaultOptions.plugin_base_urls;\n        if (pluginBaseUrls !== undefined) {\n          each$d(pluginBaseUrls, (pluginBaseUrl, pluginName) => {\n            AddOnManager.PluginManager.urls[pluginName] = pluginBaseUrl;\n          });\n        }\n      },\n      init(options) {\n        const self = this;\n        let result;\n        const invalidInlineTargets = Tools.makeMap('area base basefont br col frame hr img input isindex link meta param embed source wbr track ' + 'colgroup option table tbody tfoot thead tr th td script noscript style textarea video audio iframe object menu', ' ');\n        const isInvalidInlineTarget = (options, elm) => options.inline && elm.tagName.toLowerCase() in invalidInlineTargets;\n        const createId = elm => {\n          let id = elm.id;\n          if (!id) {\n            id = get$a(elm, 'name').filter(name => !DOM.get(name)).getOrThunk(DOM.uniqueId);\n            elm.setAttribute('id', id);\n          }\n          return id;\n        };\n        const execCallback = name => {\n          const callback = options[name];\n          if (!callback) {\n            return;\n          }\n          return callback.apply(self, []);\n        };\n        const findTargets = options => {\n          if (Env.browser.isIE() || Env.browser.isEdge()) {\n            initError('HugeRTE does not support the browser you are using. For a list of supported' + ' browsers please see: https://www.hugerte.org/docs/hugerte/1/support/#supportedwebbrowsers');\n            return [];\n          } else if (isQuirksMode) {\n            initError('Failed to initialize the editor as the document is not in standards mode. ' + 'HugeRTE requires standards mode.');\n            return [];\n          } else if (isString(options.selector)) {\n            return DOM.select(options.selector);\n          } else if (isNonNullable(options.target)) {\n            return [options.target];\n          } else {\n            return [];\n          }\n        };\n        let provideResults = editors => {\n          result = editors;\n        };\n        const initEditors = () => {\n          let initCount = 0;\n          const editors = [];\n          let targets;\n          const createEditor = (id, options, targetElm) => {\n            const editor = new Editor(id, options, self);\n            editors.push(editor);\n            editor.on('init', () => {\n              if (++initCount === targets.length) {\n                provideResults(editors);\n              }\n            });\n            editor.targetElm = editor.targetElm || targetElm;\n            editor.render();\n          };\n          DOM.unbind(window, 'ready', initEditors);\n          execCallback('onpageload');\n          targets = unique$1(findTargets(options));\n          Tools.each(targets, elm => {\n            purgeDestroyedEditor(self.get(elm.id));\n          });\n          targets = Tools.grep(targets, elm => {\n            return !self.get(elm.id);\n          });\n          if (targets.length === 0) {\n            provideResults([]);\n          } else {\n            each(targets, elm => {\n              if (isInvalidInlineTarget(options, elm)) {\n                initError('Could not initialize inline editor on invalid inline target element', elm);\n              } else {\n                createEditor(createId(elm), options, elm);\n              }\n            });\n          }\n        };\n        DOM.bind(window, 'ready', initEditors);\n        return new Promise(resolve => {\n          if (result) {\n            resolve(result);\n          } else {\n            provideResults = editors => {\n              resolve(editors);\n            };\n          }\n        });\n      },\n      get(id) {\n        if (arguments.length === 0) {\n          return editors.slice(0);\n        } else if (isString(id)) {\n          return find$2(editors, editor => {\n            return editor.id === id;\n          }).getOr(null);\n        } else if (isNumber(id)) {\n          return editors[id] ? editors[id] : null;\n        } else {\n          return null;\n        }\n      },\n      add(editor) {\n        const self = this;\n        const existingEditor = self.get(editor.id);\n        if (existingEditor === editor) {\n          return editor;\n        }\n        if (existingEditor === null) {\n          editors.push(editor);\n        }\n        toggleGlobalEvents(true);\n        self.activeEditor = editor;\n        self.dispatch('AddEditor', { editor });\n        if (!beforeUnloadDelegate) {\n          beforeUnloadDelegate = e => {\n            const event = self.dispatch('BeforeUnload');\n            if (event.returnValue) {\n              e.preventDefault();\n              e.returnValue = event.returnValue;\n              return event.returnValue;\n            }\n          };\n          window.addEventListener('beforeunload', beforeUnloadDelegate);\n        }\n        return editor;\n      },\n      createEditor(id, options) {\n        return this.add(new Editor(id, options, this));\n      },\n      remove(selector) {\n        const self = this;\n        let editor;\n        if (!selector) {\n          for (let i = editors.length - 1; i >= 0; i--) {\n            self.remove(editors[i]);\n          }\n          return;\n        }\n        if (isString(selector)) {\n          each(DOM.select(selector), elm => {\n            editor = self.get(elm.id);\n            if (editor) {\n              self.remove(editor);\n            }\n          });\n          return;\n        }\n        editor = selector;\n        if (isNull(self.get(editor.id))) {\n          return null;\n        }\n        if (removeEditorFromList(editor)) {\n          self.dispatch('RemoveEditor', { editor });\n        }\n        if (editors.length === 0) {\n          window.removeEventListener('beforeunload', beforeUnloadDelegate);\n        }\n        editor.remove();\n        toggleGlobalEvents(editors.length > 0);\n        return editor;\n      },\n      execCommand(cmd, ui, value) {\n        var _a;\n        const self = this;\n        const editorId = isObject(value) ? (_a = value.id) !== null && _a !== void 0 ? _a : value.index : value;\n        switch (cmd) {\n        case 'mceAddEditor': {\n            if (!self.get(editorId)) {\n              const editorOptions = value.options;\n              new Editor(editorId, editorOptions, self).render();\n            }\n            return true;\n          }\n        case 'mceRemoveEditor': {\n            const editor = self.get(editorId);\n            if (editor) {\n              editor.remove();\n            }\n            return true;\n          }\n        case 'mceToggleEditor': {\n            const editor = self.get(editorId);\n            if (!editor) {\n              self.execCommand('mceAddEditor', false, value);\n              return true;\n            }\n            if (editor.isHidden()) {\n              editor.show();\n            } else {\n              editor.hide();\n            }\n            return true;\n          }\n        }\n        if (self.activeEditor) {\n          return self.activeEditor.execCommand(cmd, ui, value);\n        }\n        return false;\n      },\n      triggerSave: () => {\n        each(editors, editor => {\n          editor.save();\n        });\n      },\n      addI18n: (code, items) => {\n        I18n.add(code, items);\n      },\n      translate: text => {\n        return I18n.translate(text);\n      },\n      setActive(editor) {\n        const activeEditor = this.activeEditor;\n        if (this.activeEditor !== editor) {\n          if (activeEditor) {\n            activeEditor.dispatch('deactivate', { relatedTarget: editor });\n          }\n          editor.dispatch('activate', { relatedTarget: activeEditor });\n        }\n        this.activeEditor = editor;\n      },\n      _setBaseUrl(baseUrl) {\n        this.baseURL = new URI(this.documentBaseURL).toAbsolute(baseUrl.replace(/\\/+$/, ''));\n        this.baseURI = new URI(this.baseURL);\n      }\n    };\n    EditorManager.setup();\n\n    const setup = () => {\n      const dataValue = value$2();\n      const FakeClipboardItem = items => ({\n        items,\n        types: keys(items),\n        getType: type => get$a(items, type).getOrUndefined()\n      });\n      const write = data => {\n        dataValue.set(data);\n      };\n      const read = () => dataValue.get().getOrUndefined();\n      const clear = dataValue.clear;\n      return {\n        FakeClipboardItem,\n        write,\n        read,\n        clear\n      };\n    };\n    const FakeClipboard = setup();\n\n    const min = Math.min, max = Math.max, round = Math.round;\n    const relativePosition = (rect, targetRect, rel) => {\n      let x = targetRect.x;\n      let y = targetRect.y;\n      const w = rect.w;\n      const h = rect.h;\n      const targetW = targetRect.w;\n      const targetH = targetRect.h;\n      const relChars = (rel || '').split('');\n      if (relChars[0] === 'b') {\n        y += targetH;\n      }\n      if (relChars[1] === 'r') {\n        x += targetW;\n      }\n      if (relChars[0] === 'c') {\n        y += round(targetH / 2);\n      }\n      if (relChars[1] === 'c') {\n        x += round(targetW / 2);\n      }\n      if (relChars[3] === 'b') {\n        y -= h;\n      }\n      if (relChars[4] === 'r') {\n        x -= w;\n      }\n      if (relChars[3] === 'c') {\n        y -= round(h / 2);\n      }\n      if (relChars[4] === 'c') {\n        x -= round(w / 2);\n      }\n      return create$2(x, y, w, h);\n    };\n    const findBestRelativePosition = (rect, targetRect, constrainRect, rels) => {\n      for (let i = 0; i < rels.length; i++) {\n        const pos = relativePosition(rect, targetRect, rels[i]);\n        if (pos.x >= constrainRect.x && pos.x + pos.w <= constrainRect.w + constrainRect.x && pos.y >= constrainRect.y && pos.y + pos.h <= constrainRect.h + constrainRect.y) {\n          return rels[i];\n        }\n      }\n      return null;\n    };\n    const inflate = (rect, w, h) => {\n      return create$2(rect.x - w, rect.y - h, rect.w + w * 2, rect.h + h * 2);\n    };\n    const intersect = (rect, cropRect) => {\n      const x1 = max(rect.x, cropRect.x);\n      const y1 = max(rect.y, cropRect.y);\n      const x2 = min(rect.x + rect.w, cropRect.x + cropRect.w);\n      const y2 = min(rect.y + rect.h, cropRect.y + cropRect.h);\n      if (x2 - x1 < 0 || y2 - y1 < 0) {\n        return null;\n      }\n      return create$2(x1, y1, x2 - x1, y2 - y1);\n    };\n    const clamp = (rect, clampRect, fixedSize) => {\n      let x1 = rect.x;\n      let y1 = rect.y;\n      let x2 = rect.x + rect.w;\n      let y2 = rect.y + rect.h;\n      const cx2 = clampRect.x + clampRect.w;\n      const cy2 = clampRect.y + clampRect.h;\n      const underflowX1 = max(0, clampRect.x - x1);\n      const underflowY1 = max(0, clampRect.y - y1);\n      const overflowX2 = max(0, x2 - cx2);\n      const overflowY2 = max(0, y2 - cy2);\n      x1 += underflowX1;\n      y1 += underflowY1;\n      if (fixedSize) {\n        x2 += underflowX1;\n        y2 += underflowY1;\n        x1 -= overflowX2;\n        y1 -= overflowY2;\n      }\n      x2 -= overflowX2;\n      y2 -= overflowY2;\n      return create$2(x1, y1, x2 - x1, y2 - y1);\n    };\n    const create$2 = (x, y, w, h) => {\n      return {\n        x,\n        y,\n        w,\n        h\n      };\n    };\n    const fromClientRect = clientRect => {\n      return create$2(clientRect.left, clientRect.top, clientRect.width, clientRect.height);\n    };\n    const Rect = {\n      inflate,\n      relativePosition,\n      findBestRelativePosition,\n      intersect,\n      clamp,\n      create: create$2,\n      fromClientRect\n    };\n\n    const awaiter = (resolveCb, rejectCb, timeout = 1000) => {\n      let done = false;\n      let timer = null;\n      const complete = completer => (...args) => {\n        if (!done) {\n          done = true;\n          if (timer !== null) {\n            clearTimeout(timer);\n            timer = null;\n          }\n          completer.apply(null, args);\n        }\n      };\n      const resolve = complete(resolveCb);\n      const reject = complete(rejectCb);\n      const start = (...args) => {\n        if (!done && timer === null) {\n          timer = setTimeout(() => reject.apply(null, args), timeout);\n        }\n      };\n      return {\n        start,\n        resolve,\n        reject\n      };\n    };\n    const create$1 = () => {\n      const tasks = {};\n      const resultFns = {};\n      const resources = {};\n      const load = (id, url) => {\n        const loadErrMsg = `Script at URL \"${ url }\" failed to load`;\n        const runErrMsg = `Script at URL \"${ url }\" did not call \\`hugerte.Resource.add('${ id }', data)\\` within 1 second`;\n        if (tasks[id] !== undefined) {\n          return tasks[id];\n        } else {\n          const task = new Promise((resolve, reject) => {\n            const waiter = awaiter(resolve, reject);\n            resultFns[id] = waiter.resolve;\n            ScriptLoader.ScriptLoader.loadScript(url).then(() => waiter.start(runErrMsg), () => waiter.reject(loadErrMsg));\n          });\n          tasks[id] = task;\n          return task;\n        }\n      };\n      const add = (id, data) => {\n        if (resultFns[id] !== undefined) {\n          resultFns[id](data);\n          delete resultFns[id];\n        }\n        tasks[id] = Promise.resolve(data);\n        resources[id] = data;\n      };\n      const has = id => {\n        return id in resources;\n      };\n      const unload = id => {\n        delete tasks[id];\n        delete resources[id];\n      };\n      const get = id => resources[id];\n      return {\n        load,\n        add,\n        has,\n        get,\n        unload\n      };\n    };\n    const Resource = create$1();\n\n    const create = () => (() => {\n      let data = {};\n      let keys = [];\n      const storage = {\n        getItem: key => {\n          const item = data[key];\n          return item ? item : null;\n        },\n        setItem: (key, value) => {\n          keys.push(key);\n          data[key] = String(value);\n        },\n        key: index => {\n          return keys[index];\n        },\n        removeItem: key => {\n          keys = keys.filter(k => k === key);\n          delete data[key];\n        },\n        clear: () => {\n          keys = [];\n          data = {};\n        },\n        length: 0\n      };\n      Object.defineProperty(storage, 'length', {\n        get: () => keys.length,\n        configurable: false,\n        enumerable: false\n      });\n      return storage;\n    })();\n\n    let localStorage;\n    try {\n      const test = '__storage_test__';\n      localStorage = window.localStorage;\n      localStorage.setItem(test, test);\n      localStorage.removeItem(test);\n    } catch (e) {\n      localStorage = create();\n    }\n    var LocalStorage = localStorage;\n\n    const publicApi = {\n      geom: { Rect },\n      util: {\n        Delay,\n        Tools,\n        VK,\n        URI,\n        EventDispatcher,\n        Observable,\n        I18n,\n        LocalStorage,\n        ImageUploader\n      },\n      dom: {\n        EventUtils,\n        TreeWalker: DomTreeWalker,\n        TextSeeker,\n        DOMUtils,\n        ScriptLoader,\n        RangeUtils,\n        Serializer: DomSerializer,\n        StyleSheetLoader,\n        ControlSelection,\n        BookmarkManager,\n        Selection: EditorSelection,\n        Event: EventUtils.Event\n      },\n      html: {\n        Styles,\n        Entities,\n        Node: AstNode,\n        Schema,\n        DomParser,\n        Writer,\n        Serializer: HtmlSerializer\n      },\n      Env,\n      AddOnManager,\n      Annotator,\n      Formatter,\n      UndoManager,\n      EditorCommands,\n      WindowManager,\n      NotificationManager,\n      EditorObservable,\n      Shortcuts,\n      Editor,\n      FocusManager,\n      EditorManager,\n      DOM: DOMUtils.DOM,\n      ScriptLoader: ScriptLoader.ScriptLoader,\n      PluginManager,\n      ThemeManager,\n      ModelManager,\n      IconManager,\n      Resource,\n      FakeClipboard,\n      trim: Tools.trim,\n      isArray: Tools.isArray,\n      is: Tools.is,\n      toArray: Tools.toArray,\n      makeMap: Tools.makeMap,\n      each: Tools.each,\n      map: Tools.map,\n      grep: Tools.grep,\n      inArray: Tools.inArray,\n      extend: Tools.extend,\n      walk: Tools.walk,\n      resolve: Tools.resolve,\n      explode: Tools.explode,\n      _addCacheSuffix: Tools._addCacheSuffix\n    };\n    const hugerte$1 = Tools.extend(EditorManager, publicApi);\n\n    const exportToModuleLoaders = hugerte => {\n      if (typeof module === 'object') {\n        try {\n          module.exports = hugerte;\n        } catch (_) {\n        }\n      }\n    };\n    const exportToWindowGlobal = hugerte => {\n      window.hugerte = hugerte;\n      window.hugeRTE = hugerte;\n    };\n    exportToWindowGlobal(hugerte$1);\n    exportToModuleLoaders(hugerte$1);\n\n})();\n","import \"select2\";\nimport \"select2/dist/js/i18n/et.js\";\n\n$.fn.select2.defaults.set(\"theme\", \"bootstrap-5\");\n$.fn.select2.defaults.set(\"allowClear\", true);\n$.fn.select2.defaults.set(\"width\", \"100%\");\n$.fn.select2.defaults.set(\"dropdownAutoWidth\", true);\n$.fn.select2.defaults.set(\"language\", \"et\");\n\nexport const defaultSelectAjaxOptions = {\n  cache: true,\n  dataType: \"json\",\n  delay: 900, // wait 1 seconds before triggering the reques\n  data: function (params) {\n    return { term: params.term };\n  },\n  processResults: function (data) {\n    return data;\n  }\n};\n\nwindow.initSelect2 = function (specificEl, customOptions = {}) {\n  function setup(select) {\n    const options = {\n      placeholder: select[0].attributes.placeholder?.value ?? \"Vali\",\n      multiple: select.data(\"multiple\"),\n\n      ...customOptions\n    };\n\n    if (select.hasClass(\"select-ajax\")) {\n      options.ajax = Object.assign(defaultSelectAjaxOptions, {\n        url: select.data(\"source\")\n      });\n\n      const queryParams = select.data(\"query-params\");\n      if (queryParams) {\n        const queryParamsToSend = {};\n        queryParams.split(\"&\").forEach(param => {\n          const [key, val] = param.split(\"=\");\n          queryParamsToSend[key] = val;\n        });\n        options.ajax.data = function (params) {\n          return { term: params.term, ...queryParamsToSend };\n        };\n      }\n\n      options.placeholder = \"Otsimiseks sisesta esimesed tähed\";\n\n      const minInputLen = select.data(\"minimum-input-length\");\n      options.minimumInputLength = minInputLen > 0 ? minInputLen : 3;\n      if (select.data(\"allownew\")) {\n        // Allow manually entered text in drop down.\n        options.createSearchChoice = function (term, data) {\n          if (\n            $(data).filter(function () {\n              return this.text.localeCompare(term) === 0;\n            }).length === 0\n          ) {\n            return { id: term, text: term };\n          }\n        };\n      }\n    }\n\n    select.select2(options);\n\n    // Clearing reopens the menu and forcefuly selects something else so quickly\n    let clearing = false;\n    select.on(\"select2:clearing\", () => {\n      // See turbo:before-cache for why\n      Array.from(select[0].querySelectorAll(`option`)).forEach(\n        x => (x.defaultSelected = false)\n      );\n      clearing = true;\n    });\n    select.on(\"select2:opening\", e => {\n      if (clearing) {\n        clearing = false;\n        e.preventDefault();\n      }\n    });\n\n    select.on(\"select2:open\", () => {\n      // https://github.com/select2/select2/issues/5993#issuecomment-871662757\n      let allFound = document.querySelectorAll(\n        \".select2-container--open .select2-search__field\"\n      );\n      allFound[allFound.length - 1].focus();\n    });\n\n    // See turbo:before-cache listener here in this file for why\n    select.on(\"select2:unselect\", ({ target, params }) => {\n      target.querySelector(\n        `option[value=\"${params.data.id}\"]`\n      ).defaultSelected = false;\n    });\n\n    if (select[0].form) {\n      // Having \"allowClear\" option is triggering every selected item an seperate change event\n      // Problem occures in events page, causing selected countries total = the amount of queries sent to server\n      // Added 5ms delay to workaround it so it only sends 1 query\n      $(select).on(\"change.select2\", () => {\n        select[0].form.dispatchEvent(new Event(\"change\"));\n      });\n    }\n  }\n\n  if (specificEl) {\n    setup($(specificEl));\n  } else {\n    $(\"select.select2, select[data-behaviour=select2]\").each(function (i, evt) {\n      setup($(evt));\n    });\n  }\n};\n\ndocument.addEventListener(\"turbo:before-cache\", () => {\n  // Remove or duplication/failure to show options again\n  $(\"select.select2, select[data-behaviour=select2]\").each(function (i, evt) {\n    evt = $(evt);\n    if (evt.hasClass(\"select2-hidden-accessible\")) {\n      evt.select2(\"destroy\");\n\n      // When user returns to cached page (browser back button), selected values don't reapper again unless page refresh by user\n      // defaultSelected fixes the problem\n      // Something is just off about <select> and browser\n      const val = evt.val();\n      if (!val) return;\n      if (typeof val === \"string\") {\n        if (evt[0].querySelector(`option[value=\"${val}\"]`)) {\n          evt[0].querySelector(`option[value=\"${val}\"]`).defaultSelected = true;\n        }\n      } else {\n        const vals = Array.from(val);\n        evt[0].querySelectorAll(`option`).forEach(option => {\n          option.selected = vals.includes(option.value);\n          option.defaultSelected = vals.includes(option.value);\n        });\n      }\n    }\n  });\n});\n"],"names":["getPrototypeOf$2","Object","getPrototypeOf","hasProto","v","constructor","predicate","_a","prototype","name","isType$1","type","value","x","t","Array","isArray","String","o","proto","isPrototypeOf","typeOf","isSimpleType","eq$1","a","isString","isObject","isPlainObject","is$2","isNull","isBoolean","isUndefined","undefined","isNullable","isNonNullable","isFunction","isNumber","isArrayOf","pred","i","len","length","noop","noarg","f","compose","fa","fb","args","apply","constant$1","identity","tripleEquals","b","curry","fn","initialArgs","restArgs","all","concat","not","die","msg","Error","apply$1","never","always","Optional","tag","this","some","none","singletonNone","fold","onNone","onSome","isSome","isNone","map","mapper","bind","binder","exists","forall","filter","getOr","replacement","or","getOrThunk","thunk","orThunk","getOrDie","message","from","getOrNull","getOrUndefined","each","worker","toArray","toString","nativeSlice","slice","nativeIndexOf","indexOf","nativePush","push","rawIndexOf","ts","call","xs","r","contains$2","range$2","num","chunk$1","array","size","s","map$2","each$1","partition$3","pass","fail","filter$2","foldr","acc","eachr","foldl","find$5","until","findUntil","findIndex$1","flatten","bind$3","reverse","difference","a1","a2","mapToObject","pure$2","sort","comparator","copy","get$h","head","last$1","findMap","arr","keys","hasOwnProperty","obj","props","k","map$1","tupleMap","tuple","objAcc","internalFilter","onTrue","onFalse","filter$1","mapToArray","find$4","values","get$g","key","has$2","hasNonNullableKey","is$1","lhs","rhs","left","cat","lift2","oa","ob","mapFrom","someIf","checkRange","str","substr","start","removeLeading","prefix","startsWith","numChars","substring","removeFromStart","contains$1","end","idx","endsWith","suffix","trim$1","replace","blank","isNotEmpty","isEmpty","isSupported$1","dom","style","getPropertyValue","fromDom","node","SugarElement","fromHtml","html","scope","div","document","createElement","innerHTML","hasChildNodes","childNodes","console","error","fromTag","fromText","text","createTextNode","fromPoint","docElm","y","elementFromPoint","Global","window","Function","resolve","p","parts","path$1","split","getOrDie$1","actual","unsafe","getPrototypeOf$1","sandHTMLElement","test","name$3","element","nodeName","toLowerCase","isType","nodeType","type$1","isHTMLElement","isElement$1","isText","isDocument","isDocumentFragment","isTag","e","is","selector","elem","matches","msMatchesSelector","webkitMatchesSelector","mozMatchesSelector","bypassSelector","childElementCount","one","base","querySelector","eq","e1","e2","contains","d1","d2","owner$4","ownerDocument","documentOrOwner","dos","documentElement","defaultView","parent","parentNode","parentElement","offsetParent","children","child$2","index","cs","firstChild","spot","offset","leaf","isShadowRoot","host","supported","Element","attachShadow","Node","getRootNode","isSupported","getContentContainer","body","getShadowRoot","getShadowHost","isOpenShadowHost","shadowRoot","inBody","doc","fbc","fab","getBody","rawSet","setAttribute","set$9","setAll$1","attrs","get$f","getAttribute","getOpt","has$1","hasAttribute","remove$7","removeAttribute","internalSet","property","setProperty","internalRemove","removeProperty","set$8","setAll","css","setOptions","get$e","getComputedStyle","getUnsafeProperty","getRaw","raw","getAllRaw","ruleName","item","isValidValue$1","remove$6","reflow","offsetWidth","Dimension","getOffset","get","parseFloat","aggregate","properties","val","parseInt","isNaN","set","h","match","getOuter","max","cumulativeInclusions","api$2","getBoundingClientRect","height","offsetHeight","get$d","getOuter$2","r$1","top","translate","SugarPosition","firstDefinedOrZero","absolute$3","win","offsetLeft","offsetTop","scrollTop","pageYOffset","scrollLeft","pageXOffset","clientTop","clientLeft","viewport$1","box","boxPosition","api$1","get$c","getOuter$1","cached","called","unknown$3","nu$d","major","minor","Version","nu","detect","versionRegexes","agent","cleanedAgent","regexes","firstMatch","group","Number","find$3","unknown","detect$3","candidates","userAgent","candidate","search","normalVersionRegex","checkContains","target","uastring","browsers","brand","oses","PlatformInfo","edge","chromium","opera","firefox","safari","nu$c","info","current","version","isBrowser","isEdge","isChromium","isIE","isOpera","isFirefox","isSafari","Browser","ie","windows","android","linux","macos","solaris","freebsd","chromeos","nu$b","isOS","isWindows","isiOS","isAndroid","isMacOS","isLinux","isSolaris","isFreeBSD","isChromeOS","OperatingSystem","ios","PlatformDetection","userAgentDataOpt","mediaMatch","browser","userAgentData","brands","uaBrand","lcBrand","detectBrowser$1","detectBrowser","os","detectOs","deviceType","isiPad","isiPhone","isMobile","isTouch","isTablet","isPhone","iOSwebview","isDesktop","isWebView","DeviceType","query","matchMedia","platform","navigator","detect$1","fromRawEvent$1","rawEvent","event","el","composed","composedPath","getOriginalEventTarget","stop","stopPropagation","prevent","preventDefault","kill","mkEvent","clientX","clientY","handler","useCapture","wrapped","handle","addEventListener","unbind","removeEventListener","before$1","marker","insertBefore","after$2","sibling","nextSibling","append$2","prepend$1","appendChild","append$1","elements","empty","textContent","rogue","remove$5","removeChild","get$b","_DOC","to","scrollTo","bounds$1","width","right","bottom","getBounds$3","_win","scroll","visualViewport","get$a","clientWidth","clientHeight","Math","pageLeft","pageTop","getDocument","walkUp","navigation","view","owner","rest","Navigation","freeze","__proto__","frameElement","find$2","path","d","paths","pathTo","frames","loc","bounds","box$1","xy","w","absolute$2","position","constrain","original","constraint","min","global$a","hugerte","util","Tools","value$4","applyHelper","constHelper","outputHelper","output","inner","_onError","onValue","isValue","isError","Result","mapError","toOptional","error$1","onError","_onValue","fromOption","optional","err","SimpleResultType","fold$1","res","stype","serror","svalue","Value","SimpleResult","results","errors","field$2","newKey","presence","prop","ifField","ifCustom","instantiator","baseMerge","merger","objects","ret","j","curObject","deepMerge","old","merge$1","defaultedThunk","fallbackThunk","process","defaulted$1","fallback","mergeWithThunk","baseThunk","mergeErrors$1","ResultCombine","partitions","formatObj","input","JSON","stringify","nu$a","getErrorInfo","value$3","validator","extract","custom","anyValue$1","requiredAccess","bundle","missingRequired","fallbackAccess","extractField","field","av","bundleAsOption","optValue","ov","result","optionAccess","optionDefaultedAccess","valueThunk","getDelegate","getSetKeys","objOfOnly","fields","delegate","objOf","fieldNames","extra","unsupported","join","unsupportedFields","success","extractFields","fieldStrings","_okey","_presence","_instantiator","arrOf","oneOf","rawF","setOf$1","keys$1","validatedKeys","validateKeys","validKeys","schema","vk","arrOfObj","anyValue","typedValue","expectedType","actualType","number","string","boolean","functionProcessor","isPostMessageable","every","postMessageable","chooseFrom","branches","ch","branch","missingBranch","vp","choose$2","missingKey","chosen","valueOf","setOf","asRaw","label","errs","extractValue","extraction","errInfo","formatError","asRawOrDie$1","es","formatErrors","choose$1","thunkOf","desc","_desc","processor","getP","field$1","customField","validateEnum","required$1","requiredOf","requiredNumber","requiredString","requiredStringEnum","requiredFunction","requiredObjOf","objSchema","requiredArrayOfObj","objFields","requiredArrayOf","option$3","optionOf","optionNumber","optionString","optionStringEnum","optionFunction","optionArrayOf","optionObjOf","defaulted","defaultedOf","defaultedNumber","defaultedString","defaultedStringEnum","defaultedBoolean","defaultedFunction","defaultedArrayOf","defaultedObjOf","Cell","initial","Adt","cases","constructors","adt","acase","count","argLength","foldArgs","branchKeys","reqKey","log","params","bothErrors","firstError","secondError","bothValues","exclude","exclude$1","wrap$1","wrap$2","wrapAll","keyvalues","kv","wrapAll$1","consolidate","objs","partition$1","mergeValues","ensureIsRoot","isRoot","ancestor$2","transform","transformed","closest$4","isSource","component","simulatedEvent","defaultEventHandler","can","abort","run","nu$9","fuse$1","handlers","all$2","any","constant","touchstart","touchmove","touchend","touchcancel","mousedown","mousemove","mouseout","mouseup","mouseover","focusin","focusout","keydown","keyup","change","click","transitioncancel","transitionend","transitionstart","selectstart","prefixName","alloy","tap","focus$4","postBlur","postPaste","receive","execute$5","focusItem","longpress","sandboxClose","typeaheadCancel","systemInit","documentTouchmove","documentTouchend","windowScroll","windowResize","attachedToDom","detachedFromDom","dismissRequested","repositionRequested","focusShifted","slotVisibility","externalElementScroll","changeTab","dismissTab","highlight$1","dehighlight$1","emit","dispatchWith","emitWith","emitExecute","dispatch","data","getSystem","triggerEvent","dispatchEvent","derive$2","configs","run$1","runActionExtra","action","runOnSourceName","redirectToPart","detail","partName","uid","getByUid","redirectee","redirectToUid","partUids","runWithTarget","ev","getByDom","cutter","cut","stopper","runOnSource","runOnAttached","runOnDetached","runOnInit","runOnExecute$1","runOnName","get$9","set$6","content","docDom","fragment","createDocumentFragment","contentElements","fromHtml$1","clone$1","isDeep","cloneNode","getHtml","clone","shallow","container","events$i","originator","isRecursive","warn","DefaultEvents","events","unique","generate$6","time","Date","getTime","random","floor","prefix$1","idAttr$1","idAttr","writeOnly","defineProperty","writable","read$1","id","generate$5","make$8","NoContextApi","getComp","getMessage","debugInfo","triggerFocus","triggerEscape","broadcast","broadcastOn","broadcastEvent","build","buildOrPatch","addToWorld","removeFromWorld","addToGui","removeFromGui","isConnected","singleton$1","cleanParameters","parameters","markAsExtraApi","extraName","endIndex","openBracketIndex","toFunctionAnnotation","premadeTag","premade$1","comp","getPremade","spec","makeApi","apiFunction","markAsSketchApi","getApis","NoState","init","nu$8","readState","byInnerKey","indexKey","chain","nu$7","classes","attributes","styles","getCurried","descHandler","cHandler","behaviourTuple","nameToHandlers","behaviours","behaviour","combine$1","eventOrder","byEventName","behaviourEvents","groupByEvents","combineGroups","assemble","rawHandler","read$2","fuse","tuples","eventName","order","keyName","sorted","aKey","bKey","aIndex","bIndex","sortKeys","sortedTuples","c","missingOrderError","assembled","purpose","uncurried","baseBehaviour","schema$z","mergeWith","toEvents","read","attr","supports","classList","get$8","add$3","clazz","add$4","remove$3","remove$4","add$2","add","cleanClass","remove$2","remove","toggle$4","toggle","toggle$5","has","add$1","remove$1","get$7","getNative","get$6","set$5","ensureInDom","child","obsoleted","obs","patchChildrenWith","builtChildren","currentChildren","patchSpecChild","oldObsoleted","childComp","newObs","oldTag","determineObsoleted","diffKeyValueSet","newObj","oldObj","newKeys","oldKeys","toRemove","toSet","bifilter","reconcileToDom","definition","class","existingAttributes","clone$2","attrsToSet","attrsToRemove","existingStyles","stylesToSet","stylesToRemove","existingClasses","classesToRemove","classesToAdd","innerHtml","domChildren","nodes","optObsoleted","patchDomChildren","valueElement","updateValue","renderToDom","hasMixedChildren","isPremade","attemptPatch","subject","introduceToDom","generateFrom","validated","list","optBlobThunk","blob","config","state","generateFrom$1","generate$4","me","getBehaviours$2","getDomDefinition","bList","bData","components","infoModification","domModification","toModification","baseModification","modification","baseMod","modsByBehaviour","exhibit","byAspect","combineObjects","combinedClasses","combinedAttributes","combinedStyles","combine$2","defnA","mod","build$2","getMe","systemApi","toInfo","bBlob","getBehaviours$3","getData$2","modDefinition","baseEvents","getEvents","subcomponents","hasConfigured","behaviourName","apis","connect","newApi","disconnect","syncComponents","children$1","subs","buildFromSpec","userSpec","specEvents","build$1","buildSubcomponents","completeSpec","text$2","external$1","extSpec","uids","userSpecWithUid","isSketchSpec$1","premade","ClosestOrAncestor","ancestor","ancestor$1","closest$3","closest$2","child$1","descendant","closest$1","attribute","manager","ariaId","link","unlink","isAriaPartOf","queryElem","dep","find$1","isPartOf$1","EventConfiguration","eventConfig","processEvent","initialTarget","patterns","NORMAL","noLogger","LOGGING","logger","sequence","startTime","logEventCut","_name","outcome","logEventStopped","logNoParent","logEventNoHandlers","logEventResponse","write","finishTime","makeEventLogger","STOP","monitorEvent","menuFields","itemFields","itemSchema$3","_initSize","tieredMenuMarkers","markers$1","required","onPresenceHandler","fieldName","stack","lines","line","getTrace","onHandler","onKeyboardHandler","onStrictHandler","onStrictKeyboardHandler","output$1","snapshot","initSize","nu$6","bubble","direction","placement","boundsRestriction","labelPrefix","alwaysFit","restriction","adt$a","southeast","southwest","northeast","northwest","south","north","east","west","southeast$3","southwest$3","northeast$3","northwest$3","south$3","north$3","east$3","west$3","cycleBy","delta","clamp","anchor","restrictions","dir","getRestriction","labelPrefix$2","eastX$1","middleX$1","westX$1","northY$2","southY$2","centreY$1","southeast$2","bubbles","southwest$2","northeast$2","northwest$2","north$2","south$2","east$2","eastEdgeX$1","west$2","westEdgeX$1","all$1","allRtl$1","aboveOrBelow","aboveOrBelowRtl","belowOrAbove","belowOrAboveRtl","ActiveReceiving","receiveConfig","channelMap","channels","receivingData","targetChannels","universal","chooseChannels","channelInfo","channelSchema","onReceive","ReceivingSchema","loadEvent","bConfig","bState","_simulatedEvent","wrapApi","bName","apiName","markAsBehaviourApi","revokeBehaviour","doCreate","configSchema","schemaSchema","active","getConfig","wrappedApis","apiF","extraF","revoke","prepared","configAsRaw","initialConfig","behaviourInfo","exhibitor","derive$1","capabilities","simpleSchema","create$4","create$5","modeSchema","createModes","modes","createModes$1","branchKey","Receiving","ActivePosition","posConfig","useFixed","focus$3","preventScroll","focus","blur$1","blur","hasFocus","root","activeElement","active$1","preserve$1","refocus","focused","descend","descendant$1","oldFocus","newFocus","NuPositionCss","toPx","applyPositionCss","toOptions","adt$9","relative","fixed","positionWithDirection","posName","decision","decisionRect","rect","decisionX","decisionY","decisionRight","decisionBottom","cata$2","reposition","origin","toBox","rel","viewport","optBounds","pos","translate$2","outerScroll","relative$1","fixed$1","anchorBox","placementAttribute","getPlacement","adt$8","fit","nofit","attempt","bubbleOffset","adjustedBounds","applyRestriction","isVerticalAxis","newPos","adjustedLeft","adjustedTop","adjustedRight","adjustedBottom","adjustBounds","newX","newY","originInBounds","sizeInBounds","visibleW","visibleH","boundsX","boundsY","boundsRight","boundsBottom","determinePosition","fits","fittedBox","maxX","maxY","restrictedX","restrictedY","restrictedWidth","restrictedHeight","calcReposition","isPartlyVisible","maxWidth","maxHeight","upAvailable","downAvailable","middle","cataVertical","westAvailable","eastAvailable","cataHorizontal","calcMaxSizes","on","classesOn","off","classesOff","layout","testY","singleton","doRevoke","clear","isSet","unbindable","value$2","bind$2","capture","capture$1","fromRawEvent","timerAttr","isTransitioning$1","transition","hasAll","hasChanges","intermediate","round","toFixed","equals","setupTransitionListeners","transitionEnd","transitionCancel","timer","isSourceTransition","pseudoElement","propertyName","transitionDone","clearTimeout","transitionStart","duration","times","parse","delay","dur","getTransitionDuration","requestAnimationFrame","setTimeout","applyTransitionCss","lastPlacement","shouldTransition","placer","mode","shouldApplyTransitionCss","intermediatePosition","intermediateCssOptions","timerId","startTransitioning","options","elementBox","panelWidth","panelHeight","attemptBestFit","isVisible","next","attemptLayout","newReposition","newVisibleW","newVisibleH","newIsVisible","abc","bestNext","attempts","preference","setPlacement","setPlacement$1","setMaxHeight","absMax","setMax$1","anchored","available","expandable$1","defaultOr","dephault","go","positionCss","position$2","classInfo","setClasses","maxHeightFunction","setHeight","maxWidthFunction","setWidth","allAlignments","nu$5","xOffset","yOffset","insetModifier","insetXOffset","insetYOffset","getClasses","make","xDelta","yDelta","alignmentsOn","alignmentsOff","insetNortheast","insetNorthwest","insetNorth","insetSoutheast","insetSouthwest","insetSouth","insetEast","insetWest","nu$4","onDirection","isLtr","isRtl","getDirection","AttributeValue","Attribute","isBottomToTopDir","BottomToTop","schema$y","get$5","defaultLtr","defaultRtl","defaultBottomLtr","defaultBottomRtl","dirElement","isBottomToTop","customLtr","layouts","ls","onLtr","customRtl","onRtl","ltr","onBottomLtr","rtl","onBottomRtl","HotspotAnchor","anchorInfo","hotspot","overrides","MakeshiftAnchor","adt$7","screen","absolute","point","toAbsolute","sum","points","sumAsAbsolute","positions","absolute$1","getRootPoint","frame","frameOwner","compOwner","getBox","pointed","calcNewAnchor","optBox","rootPoint","topLeft","onRelative","onFixed","sumAsFixed","layoutsLtr","showAbove","layoutsRtl","NodeAnchor","nodeBox","SimRange","soffset","finish","foffset","adt$6","before","after","Situ","situ","adt$5","domRange","exact","SimSelection","exactFromRange","simRange","getWin","selection","rng","startContainer","startSitu","_finishSitu","_soffset","_finish","_foffset","getStart","range","relativeToNative","finishSitu","createRange","setStartBefore","setStart","setStartAfter","setEndBefore","setEnd","setEndAfter","setFinish","exactToNative","toRect","adt$4","fromRange","startOffset","endContainer","endOffset","diagnose","ranges","getRanges","collapsed","rev","doDiagnose","asLtrRange","ancestors","rawParent","parents","descendants","querySelectorAll","all$3","makeRange","same","readRange","rangeCount","firstRng","getRangeAt","lastRng","doGetExact","anchorNode","focusNode","anchorOffset","focusOffset","getExact","getSelection","getNativeSelection","sel","getFirstRect","rects","getClientRects","getFirstRect$1","getBounds$1","getBounds$2","api","getOption","nodeValue","NodeValue","descendOnce$1","last","get$4","descendOnce","isSimRange","getAnchorSelection","modStart","modFinish","SelectionAnchor","selectionBox","optRect","zeroWidth$1","rawRect","selectionRect","cell","firstCell","lastCell","labelPrefix$1","eastX","westX","northY$1","southY$1","southeast$1","southwest$1","northeast$1","northwest$1","allRtl","SubmenuAnchor","submenuInfo","AnchorSchema","submenu","makeshift","TransitionSchema","PositionSchema","PlacementSchema","place","anchoring","placee","lastPlace","overrideOptions","simple","positionWithinBounds","posState","placementSpec","optWithinBounds","placeeDetail","anchorage","placeeState","oldVisibility","getFixedOrigin","getRelativeOrigin","getBounds","newState","vis","PositionApis","getMode","pConfig","_pState","reset","reset$2","Positioning","fireDetaching","fireAttaching","virtualAttach","virtualDetach","attach$1","replaceChildren","newSpecs","buildNewChildren","detachChildren$1","newChildren","deleted","attach","attachWith","insertion","doDetach","detach","parent$1","detachChildren","attachSystem","guiSystem","attachSystemWith","attachSystemAfter","inserter","detachSystem","rebuild","sandbox","sConfig","sState","_data","getAttachPoint","built","open$1","onOpen","close$1","onClose","isOpen$1","_sandbox","_sConfig","isOpen","cloak","_sState","sink","cssKey","newValue","store","cloakVisibilityAttr","decloak","hasPosition","oldValue","restore","SandboxApis","open","openWhileCloaked","transaction","close","isPartOf","getState","setContent","ActiveSandbox","sandboxConfig","sandboxState","SandboxSchema","SandboxState","contents","Sandboxing","dismissPopups","repositionPopups","mouseReleased","schema$x","receivingChannel$1","rawSpec","isExtraPart","fireEventInstead","fe","schema$w","receivingChannel","doReposition","onLoad$5","repConfig","repState","onLoad","onUnload$2","onUnload","RepresentApis","setValue","getValue","ActiveRepresenting","resetOnDom","_se","memory$1","isNotSet","dataset","dataByValue","dataByText","lookup","itemString","update","items","currentDataByValue","currentDataByText","newDataByValue","newDataByText","meta","RepresentState","memory","manual","setValue$2","onSetValue","DatasetStore","getDataKey","getFallbackEntry","initialValue","ManualStore","_repState","MemoryStore","initVal","RepresentSchema","Representing","setValueFrom","source","forbidden","forbid","_v","get$3","dump","augment","SketchBehaviours","_placeholder","adt$3","single","multiple","isSubstituted","scan","compSpec","placeholders","uiType","newSpec","subPlaceholder","substitute","req","childSpecs","substituted","valuesThunk","preprocess","preprocessor","substitutePlaces","ps","ph","replacements","_","used","oneReplace","substituteAll","single$2","placeholder","adt$2","external","fFactory","sketch","fSchema","fName","fPname","typeSpec","fGroupSchema","fDefaults","fOverrides","requiredSpec","externalSpec","optionalSpec","groupSpec","asNamedPart","part","name$2","convert","adtConstructor","partSchema","PartType","asCommon","combine","partSpec","partValidated","defaults","generate$3","np","g","doGenerateOne","pname","generateOne$1","schemas","names","substitutes","internals","externals","factory","_partSpec","_partValidated","units","u","components$1","getPart","partKey","getPartOrDie","getParts","partKeys","system","pk","getAllParts","pUid","_k","getAllPartNames","getPartsOrDie","defaultUids","baseUid","partTypes","partNames","pn","defaultUidsSchema","AlloyParts","generate","generateOne","asRawOrDie","partSchemas","partUidsSchemas","baseS","composite$1","specWithUid","supplyUid","partUidsSchema","hasUid","singleSchema","compositeSchema","rawConfig","extraApis","configFields","single$1","composite","partFields","inside","ComposeApis","getCurrent","composeConfig","_composeState","find","ComposeSchema","Composing","nativeDisabled","onLoad$1","disableConfig","disableState","disabled","disable","enable","hasNative","useNative","nativeDisable","nativeEnable","ariaDisable","ariaEnable","_disableState","disableClass","onDisabled","onEnabled","isDisabled","nativeIsDisabled","ariaIsDisabled","DisableApis","ActiveDisable","DisableSchema","Disabling","dehighlightAllExcept","hConfig","hState","skip","highlighted","highlightClass","skipComp","onDehighlight","highlight","isHighlighted","onHighlight","queryTarget","getByIndex","itemClass","getFirst","_hState","getLast","getDelta$2","selected","dest","getCandidates","HighlightApis","dehighlightAll","dehighlight","highlightFirst","firstComp","highlightLast","lastComp","highlightAt","highlightBy","getHighlighted","getPrevious","getNext","HighlightSchema","Highlighting","BACKSPACE","TAB","ENTER","ESCAPE","SPACE","LEFT","UP","RIGHT","DOWN","cyclePrev","tryPrev","cycleNext","tryNext","inSet","which","and","preds","isShift$1","shiftKey","isControl","ctrlKey","isNotShift","rule","classification","reportFocusShifting","prevFocus","n","dom$2","focusee","highlights","FocusInsideModes","typical","infoSchema","stateInit","getKeydownRules","getKeyupRules","optFocusIn","processKey","getRules","keyingConfig","keyingState","transitions","choose","onFocusHandler","focusInside","OnFocusMode","focusIn","keyboardEvents","isEnterOrSpace","OnEnterOrSpaceMode","tryGoInsideComponent","create$2","cyclicField","tabbingConfig","visibilitySelector","findCurrent","focusManager","_tabbingState","tabstops","visibles","firstTabstop","findInitial","goFromTabstop","stopIndex","cycle","useTabstopAt","isTabstop","cyclic","tabstop","goBackwards","navigate","goForwards","isFirstChild","onEnter","onEscape","AcyclicType","CyclicType","defaultExecute","doDefaultExecute","stopEventForFirefox","_component","schema$v","execute$4","executeConfig","execute","ExecutionType","_executeState","spaceExec","useSpace","enterExec","useEnter","downExec","useDown","execKeys","useControlEnter","flatgrid$1","dimensions","numRows","numColumns","setGridSize","getNumRows","getNumColumns","KeyingState","flatgrid","useH","movement","move","use","west$1","moveLeft","moveRight","east$1","useV","north$1","south$1","move$1","isHidden$1","locateVisible","locate","findIndex","withGrid","numCols","address","newIndex","row","column","cycleHorizontal$1","oldRow","oldColumn","colsInRow","newColumn","cycleVertical$1","newRow","newCol","schema$u","focusIn$3","gridConfig","_gridState","first","doMove$2","gridState","identified","handleTab","captureTab","moveLeft$3","moveRight$3","moveNorth$1","moveSouth$1","getKeydownRules$4","findCurrent$1","getKeyupRules$4","FlatgridType","getNewIndex","tryNewIndex","isDisabledButton","horizontalWithoutCycles","prevIndex","oldCandidate","onNewIndex","horizontal","_oldCandidate","schema$t","execute$2","flowConfig","focusIn$2","_state","getInitial","moveLeft$2","cycles","moveRight$2","doMove$1","flowState","executeOnMove","getKeyupRules$3","FlowType","_flowState","westMovers","allowHorizontal","allowVertical","eastMovers","toCell","matrix","rowIndex","columnIndex","cycleHorizontal","startCol","deltaCol","newColIndex","cycleVertical","colIndex","startRow","deltaRow","nextRowIndex","colsInNextRow","nextColIndex","moveHorizontal","moveVertical","schema$s","focusIn$1","matrixConfig","previousSelector","selectors","doMove","ifCycle","ifMove","inRow","cellsInRow","allRows","rows","toMatrix","moveNorth","moveSouth","getKeydownRules$2","getKeyupRules$2","MatrixType","schema$r","menuConfig","moveUp","moveDown","getKeydownRules$1","menuState","moveOnTab","getKeyupRules$1","MenuType","schema$q","SpecialType","specialInfo","onSpace","onShiftEnter","onShiftTab","onTab","onUp","onDown","onLeft","onRight","stopSpaceKeyup","acyclic","flow","execution","menu","special","Keying","keyConfig","keyState","sendFocusIn","isFlatgridState","withoutReuse","withReuse","existingComps","deletedComp","virtualReplaceChildren","specs","patchSpecChildren","virtualReplace","replacee","replaceeIndex","childSpec","insert","appendAt","_replaceConfig","replaceAt","replaceConfig","replaceState","replacer","reuseDom","ReplaceApis","append","appendee","prepend","prependee","removee","foundChild","replaceBy","replaceePred","Replacing","eventHandlers","events$d","focus$2","focusConfig","ignore","onFocus","FocusApis","isFocused","ActiveFocus","tabindex","stopMousedown","FocusSchema","Focusing","set$2","toggleConfig","toggleState","initialState","toggleClass","updateClass","ariaInfo","aria","updateAriaState","onToggled","toggle$2","ToggleApis","isOn","ActiveToggle","executor","load","toggleOnExecute","updateExpanded","status","ToggleSchema","pressed","syncWithExpanded","checked","expanded","Toggling","pointerEvents","onClick","events$a","optAction","hoverEvent","focusEvent","toggledEvent","onHover","onFocus$1","hover","focus$1","toggled","getItemRole","toggling","exclusive","getTogglingSpec","tConfig","_value","schema$p","hasSubmenu","itemBehaviours","ignoreFocus","schema$o","owner$2","parts$h","schema$n","focusWidget","widget","onHorizontalArrow","autofocus","setSource","_widget","widgetBehaviours","itemSchema$2","separator","parts$g","itemInfo","builder","unit","fakeFocus","markers","schema$m","grid","movementInfo","rowSelector","Menu","_spec","_externals","menuBehaviours","selectedItem","checkedRadioItems","ele","deselectOtherRadioItems","role","trace","byItem","byMenu","triggerItem","triggerMenu","generate$2","menus","expansions","menuItems","menuPaths","_triggerItem","extractPreparedMenu","prep","LayeredState","primary","directory","getTriggerData","menuValue","getItemByValue","getPreparedMenu","getTriggeringItem","triggeringItemValue","triggeredItem","triggeredMenu","triggeringItem","triggeringPath","lookupMenu","lookupItem","itemValue","setMenuBuilt","menuName","setContents","sPrimary","sMenus","sExpansions","sPaths","expand","refresh","collapse","otherMenus","menuValues","getPrimary","getMenus","isClear","getTriggeringPath","extraPath","revPath","menuIndex","onMenuItemHighlightedEvent","onMenuItemDehighlightedEvent","HighlightOnOpen","collapseItem$1","tieredMenu","HighlightMenuAndItem","collapseMenu","tmenu","highlightPrimary","repositionMenus","_rawUiSpec","submenuParentItems","layeredState","setup","componentMap","primaryName","makeSketch","menuComp","itemComp","nbMenu","buildMenus","toDirectory","getItemValue","_container","_menuName","setActiveMenu","setActiveMenuAndItem","mv","closeOthers","others","backgroundMenu","stayInDom","updateAriaExpansions","parentItems","getSubmenuParents","updateMenuPath","latestMenuName","menuPrep","activeMenu","ExpandHighlightDecision","expandRight","HighlightSubmenu","activeMenuPrep","buildIfRequired","onOpenSubmenu","collapseLeft","onCollapseMenu","keyOnItem","getSource","onExecute","onOpenMenu","highlightOnOpen","HighlightJustMenu","tmenuComp","se","onHighlightItem","onDehighlightItem","navigateOnHover","updateView","HighlightParent","getActiveItem","currentItem","maybeActivePrimary","allMenus","preparedMenus","extractMenuFromContainer","primaryMenu","onRepositionMenu","tmenuBehaviours","_keyInfo","selectedMenu","tieredData","singleData","collapseItem","InlineView","showWithinBounds","thing","lazySink","showMenuWithinBounds","menuSpec","menuSandbox","getSubmenuLayouts","triggeringPaths","isFirstTierSubmenu","submenuTriggers","st","submenuLayouts","makeMenu","showAt","showMenuAt","hide","getContent","inlineBehaviours","getRelated","isPartOfRelated","onShow","onHide","fireDismissalEventInstead","fireRepositionEventInstead","global$9","Button","lookupAttr","buttonBehaviours","getModAttributes","getAttrs","record","isSketchSpec","anyInSystem","asSpec","entries","setPrototypeOf","isFrozen","getOwnPropertyDescriptor","seal","create","create$1","construct","Reflect","fun","thisValue","Func","arrayForEach","unapply","forEach","arrayLastIndexOf","lastIndexOf","arrayPop","pop","arrayPush","arraySplice","splice","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","trim","objectHasOwnProperty","regExpTest","RegExp","typeErrorCreate","func","TypeError","_len2","arguments","_key2","thisArg","_len","_key","addToSet","transformCaseFunc","l","lcElement","cleanArray","object","newObject","lookupGetter","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","text$1","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","EXPRESSIONS","NODE_TYPE","getGlobal","purify","createDOMPurify","DOMPurify","removed","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","NodeFilter","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","trustedTypes","ElementPrototype","getNextSibling","getChildNodes","getParentNode","template","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","getElementsByTagName","importNode","hooks","afterSanitizeAttributes","afterSanitizeElements","afterSanitizeShadowDOM","beforeSanitizeAttributes","beforeSanitizeElements","beforeSanitizeShadowDOM","uponSanitizeAttribute","uponSanitizeElement","uponSanitizeShadowNode","createHTMLDocument","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","tagNameCheck","configurable","enumerable","attributeNameCheck","allowCustomizedBuiltInElements","FORBID_TAGS","FORBID_ATTR","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","TRUSTED_TYPES_POLICY","createHTML","createScriptURL","purifyHostElement","createPolicy","ATTR_NAME","policyName","scriptUrl","_createTrustedTypesPolicy","ALL_SVG_TAGS","ALL_MATHML_TAGS","_forceRemove","_removeAttribute","getAttributeNode","_initDocument","dirty","leadingWhitespace","dirtyPayload","parseFromString","createDocument","_createNodeIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","SHOW_PROCESSING_INSTRUCTION","SHOW_CDATA_SECTION","_isClobbered","namespaceURI","_isNode","_executeHooks","currentNode","hook","_sanitizeElements","tagName","allowedTags","firstElementChild","_isBasicCustomElement","childClone","__removalCount","parentTagName","Boolean","_checkValidNamespace","expr","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","forceKeepAttr","initValue","getAttributeType","setAttributeNS","_sanitizeShadowDOM","shadowNode","shadowIterator","nextNode","sanitize","importedNode","returnNode","nodeIterator","shadowroot","shadowrootmode","serializedHTML","outerHTML","doctype","setConfig","clearConfig","isValidAttribute","addHook","entryPoint","hookFunction","removeHook","removeHooks","removeAllHooks","sanitizeHtmlString","global$8","rtlTransform","defaultIconName","defaultIcon","icons","getIconName","rtlName","addToEnd","ensureTrailing","lookupIcon","get$2","iconProvider","addFocusableBehaviour","renderIcon$3","iconName","fallbackIcon","_b","rtlIconClasses","needsRtlTransform","iconHtml","render$3","notificationIconMap","warning","Notification","memBannerText","translationProvider","renderPercentBar","percent","renderPercentText","memBannerProgress","progress","updateProgress","updateText","banner","iconChoices","icon","level","memButton","onAction","notificationIconSpec","iconNames","renderFirst","ToolbarMode$1","ToolbarLocation$1","global$7","global$6","global$5","ToolbarMode","ToolbarLocation","option$2","editor","wrapOptional","register$e","registerOption","register","stringOrFalseProcessor","stringOrNumberProcessor","default","getElement","DOM","getStyle","valid","auto","inline","hasPlugin","isReadOnly","getHeightOption","getWidthOption","getMinWidthOption","getMinHeightOption","getMaxWidthOption","getMaxHeightOption","getUserStyleFormats","shouldMergeStyleFormats","shouldAutoHideStyleFormats","getContentLanguages","getRemovedMenuItems","getToolbarMode","getToolbarGroups","getToolbarLocation","fixedContainerSelector","fixedToolbarContainerTarget","isToolbarPersist","getStickyToolbarOffset","getMenubar","getToolbar","getFilePickerCallback","getFilePickerValidatorHandler","getFontSizeInputDefaultUnit","getFilePickerTypes","useTypeaheadUrls","getAnchorTop","getAnchorBottom","isDraggableModal$1","useStatusBar","useElementPath","useBranding","getResize","getPasteAsText","getSidebarShow","useHelpAccessibility","getDefaultFontStack","isSkinDisabled","isMenubarEnabled","getSkinUrl","skinUrl","documentBaseURI","skin","baseURL","getSkinUrlOption","getLineHeightFormats","isToolbarEnabled","toolbar","isToolbarString","isToolbarObjectArray","isMultipleToolbars","getMultipleToolbarsOption","toolbars","toolbarArray","isToolbarLocationBottom","fixedContainerTarget","useFixedContainer","getUiContainer","isDistractionFree","isStickyToolbar","isSplitUiMode","Options","isDraggableModal","AutocompleterEditorEvents","redirectKeyToItem","getItem","getMenu","keyCode","isActive","isMenuOpen","stopImmediatePropagation","cancelIfNecessary","isProcessingAction","queryCommandState","ItemResponse","ItemResponse$1","navClass","selectableClass","colorClass","presetClasses","normal","color","tickedClass","iconClass","textClass","caretClass","activeClass","containerClass","containerRowClass","classForPreset","presets","forMenu","hasIcons","menuClasses","dom$1","columns","schema$l","focusBehaviours","selectOnFocus","setSelectionRange","inputBehaviours","inputAttributes","inputStyles","inputClasses","Input","refetchTriggerEvent","redirectMenuItemInteractionEvent","menuSearcherClass","findWithinSandbox","sandboxComp","inputElem","findWithinMenu","saveState","inputComp","fetchPattern","selectionStart","selectionEnd","renderMenuSearcher","handleByBrowser","handleByHighlightedItem","eventData","interactionEvent","eventType","customSearcherEventsName","i18n","searchResultsClass","augmentWithAria","chunk","rowDom","chunks","preprocessCollection","isSeparator","allSplits","currentSplit","insertItemsPlaceholder","initItems","onItem","rawItems","enrichedItems","_item","forCollection","_hasIcons","menuHasIcons","handleError","createHorizontalPartialMenuWithAlloyItems","_columns","_menuLayout","structure","createPartialMenuWithAlloyItems","menuLayout","getNormalStructure","menuType","searchMode","searchField","ariaControlsSearchResults","forCollectionWithSearchField","forCollectionWithSearchResults","forSwatch","forToolbar","name$1","title","value$1","fetch$1","getSubmenuItems","onItemAction","onSetup","optionalName","optionalText","optionalIcon","optionalTooltip","optionalLabel","optionalShortcut","optionalSelect","borderless","enabled","defaultedColumns","defaultedMeta","defaultedOnAction","defaultedType","generatedName","namePrefix","separatorMenuItemSchema","autocompleterItemSchema","baseToolbarButtonFields","toolbarButtonSchema","createToolbarButton","baseToolbarToggleButtonFields","toggleButtonSchema","createToggleButton","contextBarFields","contextButtonFields","contextToggleButtonFields","launchButtonFields","launchToggleButtonFields","toggleOrNormal","contextformbutton","contextformtogglebutton","contextFormSchema","contextToolbarSchema","cardImageFields","cardImageSchema","cardTextFields","cardTextSchema","itemSchema$1","cardimage","cardtext","cardcontainer","cardContainerSchema","commonMenuItemFields","valuePrefix","cardMenuItemSchema","choiceMenuItemSchema","baseFields","insertTableFields","colorSwatchFields","fancyMenuItemSchema","inserttable","colorswatch","menuItemSchema","nestedMenuItemSchema","toggleMenuItemSchema","detectSize","margin","selectorClass","descendants$1","columnLength","thisTop","cTop","abs","ceil","namedEvents","SimpleBehaviours","ExclusivityChannel","ShowTooltipEvent","HideTooltipEvent","ImmediateHideTooltipEvent","ImmediateShowTooltipEvent","hideAllExclusive","_tConfig","_tState","TooltippingApis","setComponents","tState","getTooltip","tooltip","ActiveTooltipping","tooltipConfig","clearTooltip","clearTimer","show","isShowing","popup","tooltipDom","tooltipComponents","setTooltip","resetTimer","delayForShow","delayForHide","TooltippingSchema","TooltippingState","Tooltipping","ReadOnlyChannel","ReadOnlyDataSchema","broadcastReadonly","uiRefs","readonly","mainUi","outerContainer","motherships","mothership","uiMotherships","m","setupReadonlyModeSwitch","receivingConfig","DisablingConfigs","runWithApi","getApi","onControlAttached","editorOffCell","onDestroy","onControlDetached","onMenuItemExecute","itemResponse","triggersSubmenu","CLOSE_ON_EXECUTE","menuItemEventOrder","componentRenderPipeline","renderCommonItem","providersBackstage","optComponents","buildData","convertText","isMac","alt","ctrl","shift","access","shortcut","updated","segment","renderIcon$2","renderText","renderHtml","renderStyledText","renderShortcut","renderCheckmark","renderColorStructure","providerBackstage","iconSvg","iconContent","ariaLabel","al","common","baseDom","getDom","renderItemDomStructure","domTitle","renderItemStructure","renderIcons","iconSpec","leftIcon","checkmark","checkMark","textRender","htmlContent","shortcutContent","caret","renderNormalItemStructure","tooltipBehaviour","sharedBackstage","tooltipText","tooltipWorker","getSink","_tooltip","elm","providers","tooltips","replaceText","matchText","encoded","encode","encodeText","escapedMatchRegex","escape","render$2","extras","directionClass","alignClass","align","valign","getValignClass","renderContainer","src","renderImage","shouldHighlight","cardText","highlightOn","parts$f","hexColour","normalizeHex","shorthandRegex","longformRegex","isHexString","hex","toUpperCase","extractValues","longForm","hexString","getLongForm","splitForm","exec","toHex","fromRgba","rgbaColour","red","green","blue","round$1","rgbRegex","rgbaRegex","alpha","isRgbaComponent","fromHsv","hsv","hue","saturation","brightness","side","chroma","fromHex","fromStringValues","fromString","rgbaString","rgbMatch","rgbaMatch","rgba","fireResizeContent","fireTextColorChange","fireResolveName","composeUnbinders","onSetupEditableToggle","onSetupEvent","setEnabled","isEditable","onSetupStateToggle","unbindEditableToogle","unbindFormatToggle","boundFormatChangeCallback","setActive","formatter","binding","formatChanged","initialized","once","onSetupFormatToggle","handleEvent","onActionToggleFormat$1","rawItem","undoManager","transact","execCommand","format","onActionExecCommand","command","global$4","cacheStorage","getCacheForId","storageId","currentData","legacyDefault","setItem","storage","storageString","localstorage","cache","unshift","ColorCache","addColor","hsvColour","fromRgb","minRGB","maxRGB","hsvToHex","anyToHex","fromString$1","canvas","canvasContext","getContext","clearRect","fillStyle","fillRect","getImageData","foregroundId","backgroundId","mapColors","colorMap","colors","option$1","fallbackColor","getColors$2","calcCols","sqrt","defaultCols","calculatedCols","getColorCols$1","hasCustomColors$1","getDefaultForegroundColor","getDefaultBackgroundColor","getClosestCssBackgroundColorValue","isValidBackgroundColor","getCurrentColor","cssRgbValue","getAdditionalColors","hasCustom","applyColor","onChoice","colorPickerDialog","dialog","colorOpt","getColors$1","getCurrentColors","getFetch$1","callback","setIconColor","splitButtonApi","newColor","setIconFill","buttonApi","select$1","optCurrentHex","getToolTipText","lastColor","tooltipPrefix","colorText","registerTextColorButton","ui","registry","addSplitButton","select","fetch","_splitButtonApi","registerTextColorMenuItem","addNestedMenuItem","fancytype","initData","storageKey","isValid","initialData","colorpicker","windowManager","buttons","_api","details","onSubmit","getData","alert","onCancel","createPartialChoiceMenu","onItemValueHandler","alloyItems","createChoiceItems","itemPresets","useText","isSelected","optTooltipping","isEnabled","renderChoiceItem","deriveMenuMovement","menuMarkers","getColorItems","backstage","useCustomColors","allowCustomColors","colorinput","hasCustomColors","getColors","cellOverEvent","cellExecuteEvent","makeCell","col","makeComponents","cells","cellRow","makeLabelText","fancyMenuItems","getCellLabel","shared","makeAnnouncementText","makeCells","emptyLabelText","memLabel","selectedRow","selectedColumn","selectCells","getColorCols","widgetSpec","autocomplete","tooltipString","separator$3","nested","downwardsCaret","renderSubmenuCaret","underlinePath","translatedTooltip","toggle$1","fancy","render","card","CouplingApis","getCoupled","coupleConfig","coupleState","getOrCreate","getExistingCoupled","getExisting","CouplingSchema","CouplingState","coupled","lookupCoupled","coupledName","Coupling","nu$3","baseFn","callbacks","nCallback","isReady","cbs","cb","LazyValue","pure","errorReporter","make$5","then","aFutureB","toPromise","anonBind","futureB","toLazy","toCached","Future","Promise","partType$1","getAnchor","getHotspot","getAnchorOverrides","mapFetch","onOpenSync","processed","futureData","fetcher","getLazySink","tdata","openF","_onOpenSync","_highlightOnOpen","togglePopup","matchWidth","useMinWidth","buttonWidth","set$7","sinkDetail","internalSink","lazySinkFn","doRepositionMenus","makeSandbox$1","ariaControls","sandboxClasses","sandboxBehaviours","FocusEvent","sandboxFields","schema$k","parts$e","Dropdown","switchToMenu","togglePopup$1","dropdownComp","HighlightNone","refetch","triggerExecute","dropdownBehaviours","handleRefetchTrigger","originalSandboxComp","dropdown","optSearcherState","newSandboxComp","searcherState","restoreState","getActiveMenuItemFrom","updateAriaOnHighlight","setActiveDescendant","activeMenuComp","resultsElem","controlledId","updateAriaOnDehighlight","getSearchPattern","FocusMode","createMenuItemFromBridge","isHorizontalMenu","parseForHorizontalMenu","menuitem","createNestedMenuItem","createToggleMenuItem","createSeparatorMenuItem","createFancyMenuItem","createAutocompleteItems","createCardMenuItem","createAutocompleterItem","createPartialMenu","createItem","itemHasIcon","identifyMenuLayout","createTieredDataFrom","partialMenu","rangeToSimRange","Autocompleter","autocompleterId","processingAction","activeState","activeRange","autocompleter","hideIfNecessary","editorBody","ariaOwnsAttr","display","lookupData","ld","focusMode","ContentFocus","createInlineMenuFrom","updateDisplay","combinedItems","choices","itemMeta","autocompleterApi","reload","fetchOptions","BUBBLE_TO_SANDBOX","getCombinedItems","cloneAutocompleterToEditorDoc","getDoc","getNode","newElm","deep","border","clip","overflow","padding","autocompleterUiApi","nonScrollingOverflows","isScrollingOverflowValue","isScroller","overflowX","overflowY","detectWhenSplitUiMode","popupSinkElem","ancestorsScrollers","scrollers","getBoundsFrom","sc","scrollableBoxes","constraints","constrainByMany","closest","DelayedFunction","ref","cancel","schedule","getTouch","touches","monitor","settings","startData","longpressFired","longpress$1","touch","distX","distY","isFarEnough","fireIfReady","setup$d","rawSettings","stopBackspace","tapEvent","simpleEvents","tapStopped","pasteTimeout","onPaste","onKeydown","isDangerous","onFocusIn","focusoutTimeout","onFocusOut","derive","rawTarget","adt$1","stopped","resume","complete","doTriggerHandler","isStopped","isCut","fromSource","handlerInfo","eventHandler","doTriggerOnUntilStopped","listeners","_logger","fromExternal","listener","triggerOnUntilStopped","EventRegistry","registerId","extraArgs","curried","curryArgs","unregisterId","handlersById","_eventName","filterByType","broadcastHandler","isAboveRoot","findHandler","Registry","readOrTag","unregister","tagId","conflict","failOnDuplicate","getById","Container","domWithoutAttributes","containerBehaviours","takeover","domEvents","triggerUntilStopped","_alloyId","triggerHandler","broadcast$1","broadcastData","receivers","receiver","destroy","schema$j","parts$d","excludeFactory","FormField","fieldBehaviours","descriptor","descriptorId","getField","getLabel","ActiveTabstopping","tabConfig","tabAttr","TabstopSchema","Tabstopping","global$3","renderFormFieldWith","pLabel","pField","extraClasses","extraBehaviours","renderFormFieldSpecWith","renderFormFieldDomWith","renderLabel$3","formChangeEvent","formCloseEvent","formCancelEvent","formActionEvent","formSubmitEvent","formBlockEvent","formUnblockEvent","formTabChangeEvent","formResizeEvent","renderCollection","runOnItem","htmlLines","itemText","getIcon","mapItemName","encodeAllRaw","tgt","collectionEvents","currentActive","iterCollectionItems","applyAttributes","childElm","getComponents","ariaElements","isAriaElement","markValid","invalidConfig","getRoot","invalidClass","notify","notifyInfo","getContainer","validHtml","onValid","markInvalid","invalidState","onInvalid","_invalidState","validatorInfo","validate","onValidate","InvalidateApis","isInvalid","ActiveInvalidate","onEvent","validateOnLoad","InvalidateSchema","Invalidating","validation","Unselecting","unselectable","colorInputChangeEvent","colorSwatchChangeEvent","colorPickerCancelEvent","renderColorInput","colorInputBackstage","inputValue","span","emitSwatchChange","colorBit","memColorButton","renderPanelButton","colorPicker","valueOpt","colorButton","_field","labelPart","edgePart","model","edgeActions","det","mouseIsDown","tlEdgePart","tedgePart","trEdgePart","redgePart","brEdgePart","bedgePart","blEdgePart","ledgePart","thumbPart","isShift","spectrumPart","getValueFromEvent","spectrum","SliderParts","sliderChangeEvent","getEventSource","evt","isTouchEvent$2","touchEvent","mouseEvent","minX","minY","min1X","min1Y","max1X","max1Y","xRange","yRange","halfX","halfY","step","useMultiplier","stepSize","speedMultiplier","snap","snapToGrid","snapStart","rounded","hasEdge","edgeName","hasLEdge","hasREdge","hasTEdge","hasBEdge","currentValue","xyValue","fireSliderChange$3","reduceBy","increaseBy","capValue","findValueOf","hasMinEdge","hasMaxEdge","minBound","maxBound","screenRange","capMin","capMax","findOffsetOf","extraValue","remainder","adjustment","rawSteps","maxSteps","snapValueOf","findOffsetOfValue$2","maxOffset","centerMinEdge","centerMaxEdge","getBoundsProperty","getMinXBounds","getMaxXBounds","getMinYBounds","getMaxYBounds","getXScreenRange","getYScreenRange","getCenterOffsetOf","componentMinEdge","componentMaxEdge","spectrumMinEdge","getXCenterOffSetOf","componentBounds","spectrumBounds","getYCenterOffSetOf","fireSliderChange$2","findValueOfOffset$1","handleMovement$2","xValue","moveBy$2","findPositionOfValue$1","slider","minEdge","maxEdge","minOffset","findOffsetOfValue$1","onLeft$2","onRight$2","onUp$2","onDown$2","edgeActions$2","HorizontalModel","setToMin","setToMax","findValueOfOffset","findPositionOfValue","setPositionFromValue","thumb","edges","getSpectrum","getLeftEdge","getRightEdge","thumbRadius","fireSliderChange$1","handleMovement$1","yValue","moveBy$1","findOffsetOfValue","onLeft$1","onRight$1","onUp$1","onDown$1","edgeActions$1","VerticalModel","getTopEdge","getBottomEdge","fireSliderChange","sliderValue","handleMovement","isVerticalMovement","moveBy","TwoDModel","mX","mY","xPos","yPos","thumbXRadius","thumbYRadius","Slider","getThumb","modelDetail","wasDown","onChoose","onDragStart","onDragEnd","sliderBehaviours","onChange","changeValue","getInitialValue","onInit","resetToMin","resetToMax","fieldsUpdate","sliderUpdate","paletteUpdate","owner$1","schema$i","getPartName$1","make$4","formBehaviours","form","resPs","resPThunk","pName","opt","wrapper","Form","fSpec","fieldParts","validInput","invalidInput","validatingInput","translatePrefix","rgbFormFactory","getClass","onValidHexx","onInvalidHexx","invalidation","renderTextField","description","helptext","comps","concats","copyRgbToForm","rgb","memPreview","updatePreview","preview","rgbFormSketcher","setValueRgb","onInvalidInput","onValidRgb","hexField","copyRgbToHex","onValidInput","isHexInputEvent","onValidHex","formPartStrings","redStrings","greenStrings","blueStrings","hexStrings","updateHex","copyHexToRgb","paletteFactory","setColour","ctx","grdWhite","createLinearGradient","addColorStop","grdBlack","saturationBrightnessPaletteSketcher","_detail","_thumb","_slider","setHue","_apis","setPaletteHue","setThumb","setPaletteThumb","makeFactory","colourPickerSketcher","rgbForm","onInvalidHex","sbPalette","paletteRgba","paletteHue","memSlider","sliderFactory","memPalette","memRgb","updatePalette","_hex","palette","updateFields","updateSlider","hueDegreesToSlider","updatePaletteThumb","runUpdates","updates","updateState","hexToHsv","onFieldsUpdate","oldHue","newHsv","newHex","onPaletteUpdate","hueSliderToDegrees","oldRgb","oldHsv","onSliderUpdate","ComposingConfigs","mem","processors","memento","rawProcessors","other","rawValue","postprocess","withComp","optInitialValue","getter","setter","withElement","english","renderColorPicker","colourPickerFactory","translate$1","memPicker","picker","valOpt","global$2","isOldCustomEditor","global$1","renderDropZone","actions","onDrop","transferEvent","handleFiles","dataTransfer","files","onSelect","allowedImageFileTypes","explode","file","filterByExtension","memInput","accept","rate","throttle","beforeObject","afterObject","craftWithClasses","outline","craft","containerClasses","triggerTab","targetComp","isPseudoStop","dialogChannel","titleChannel","bodyChannel","footerChannel","bodySendMessageChannel","dialogFocusShiftedChannel","isSafariOrFirefox","isElementScrollAtBottom","scrollHeight","scrollToY","writeValue","iframeElement","fallbackFn","iframe","contentDocument","lastScrollTop","isScrollAtBottom","getScrollingElement","scrollAfterWrite","contentWindow","writeValueThrottler","interval","newArgs","tempArgs","adaptable","renderIFrame","baseClass","opaqueClass","transparent","containerBorderedClass","srcdoc","sandboxed","sourcing","stream","cachedValue","_frameComponent","frameComponent","setSrcdocValue","throttler","getDynamicSource","streamContent","renderImagePreview","cachedData","url","memImage","memContainer","fakeValidatedData","zoom","cachedWidth","cachedHeight","translatedData","z","applyFramePositioning","panel","panelW","panelH","zoomToFit","imageWidth","imageHeight","calculateImagePosition","imageComponent","img","image","reject","loaded","naturalWidth","naturalHeight","internalToolbarButtonExecute","commonButtonDisplayEvent","toolbarButtonEventOrder","forceInitialSize","renderIcon$1","iconsProvider","renderIconFromPack$1","renderReplaceableIconFromPack","renderLabel$1","updateMenuText","updateMenuIcon","renderCommonDropdown","btnName","optMemDisplayText","optMemDisplayIcon","onLeftOrRightInMenu","ariaLabelAttribute","fixWidthBehaviourName","customEventsName","memDropdown","searchable","searcherComp","focusSearchField","displayText","displayIcon","activeItem","retargetAndDispatchWith","handleRedirectToMenuItem","itemCompCausingCollapse","nowActiveMenuComp","isSeparator$2","separator$2","unwrapReferences","realItems","isMenuItemReference","isExpandingMenuItem","itemWithValue","generateValueIfRequired","newData","submenuItems","getFromExpandingItem","mainMenuSearchMode","searchSettings","getSearchModeForField","mainMenu","submenuSearchMode","getSearchModeForResults","submenus","isSingleListItem","dataAttribute","fetchItems","selectedValue","findItemByValue","HtmlSelect","option","initialValues","selectClasses","selectAttributes","selectBehaviours","firstOption","selectedIndex","schema$h","coupledPart","selfName","otherName","lock","onLockedChange","parts$c","locked","lockClass","FormCoupledInputs","coupledFieldBehaviours","field1Name","field1","field2Name","field2","getField1","getField2","getLock","parseSize","sizeText","convertUnit","inInch","noSizeConversion","_input","makeRatioConverter","currentFieldText","otherFieldText","cValue","oValue","cSize","oSize","ratioSizeConversion","scale","baseInputBehaviours","multiline","validatingBehaviours","vl","inputMode","inputmode","classname","pTextField","extraClasses2","flex","maximized","getAnimationRoot","slideConfig","getDimensionProperty","dimension","getDimension","disableTransitions","shrinkingClass","growingClass","setShrunk","openClass","closedClass","setGrown","doImmediateShrink","slideState","_calculatedSize","setCollapsed","onStartShrink","onShrunk","doStartShrink","calculatedSize","doStartSmartShrink","doStartGrow","wasShrinking","beforeSize","fullSize","setExpanded","onStartGrow","isGrowing","_slideState","isShrinking","SlidingApis","isExpanded","grow","shrink","immediateShrink","hasGrown","hasShrunk","isCollapsed","isTransitioning","toggleGrow","immediateGrow","onGrown","ActiveSliding","SlidingSchema","Sliding","getMenuButtonApi","setText","setIcon","renderMenuButton","tabstopping","fetchContext","pattern","getFetch","getButton","getMenuItemAction","orig","getMenuItemSetup","renderLabel","leafLabelEventsId","renderLeafLabel","onLeafAction","visible","treeId","selectedId","internalMenuButton","btn","button","isLeftArrowKey","code","isRightArrowKey","dirComp","dirLabelElement","renderIconFromPack","renderIcon","directoryLabelEventsId","renderDirectoryLabel","noChildren","toggleExpandChildren","directoryEle","directoryComp","willExpand","parentDirElement","parentDirLabelElement","renderDirectoryChildren","expandedIds","renderDirectory","labelTabstopping","directoryEventsId","expandedIdsCell","childrenVisible","includes","_cmp","childrenComp","treeEventsId","ActiveStreaming","streamConfig","streamState","streams","cancelEvent","_config","setTimer","StreamingState","StreamingSchema","streamInfo","sInfo","onStream","stopEvent","Streaming","setValueFromItem","itemData","setCursorAtEnd","setSelectionOn","attemptSelectOver","selectsOver","inputDisplay","getDisplayText","setSelectionToEnd","itemExecute","schema$g","parts$b","_tmenu","previewing","lazyTypeaheadComp","selectOverTextInInput","populateFromBrowse","_menu","typeahead","Typeahead","navigateList","highlighter","focusBehaviours$1","getActiveMenu","typeaheadCustomEvents","responseTime","minChars","previousValue","pv","sandboxIsOpen","typeaheadComp","_typeaheadComp","onItemExecute","dismissOnBlur","typeaheadBehaviours","wrap","bindFuture","resA","bindResult","mapResult","foldResult","whenError","whenValue","withTimeout","timeout","errorThunk","timedOut","nu$1","FutureResult","renderCommonSpec","actionOpt","domFinal","renderIconButtonSpec","calculateClassesFromButtonType","buttonType","renderButtonSpec","translatedText","optTooltip","renderButton$1","buttonSpec","getAction","renderFooterButton","isMenuFooterButtonSpec","menuButtonSpec","fixedSpec","isNormalFooterButtonSpec","isToggleButtonSpec","optMemIcon","memIcon","tooltipAttributes","buttonTypeClasses","showIconAndText","translatedTextComponed","iconButtonSpec","newIcon","renderToggleButton","renderDialogButton","separator$1","toMenuItem","staticMenuItem","filteredTargets","targets","toMenuItems","filterLinkTargets","headerTargets","linkInfo","anchorTargets","anchorTargetTop","anchorTop","anchorTargetBottom","anchorBottom","filterByQuery","term","lowerCaseTerm","getItems","fileType","urlBackstage","urlInputValue","getLinkInformation","history","historyTargets","getHistory","errorId","set$1","get$1","make$2","dialogData","factories","bar","interpreter","renderBar","collection","alertbanner","iconTooltip","renderAlertBanner","renderInput","textarea","renderTextarea","backstageShared","renderLabel$2","iframeSpec","makeIframe","checkbox","toggleCheckboxHandler","makeIcon","className","memIcons","renderCheckbox","dropzone","renderGrid","listbox","initialItem","sketchSpec","listBoxWrap","renderListBox","selectbox","translatedOptions","chevron","selectWrap","renderSelectBox","sizeinput","converter","ratioEvent","translatedLabel","pLock","formGroup","getFieldPart","isField1","widthField","heightField","_lock","newSize","unitDec","numText","formatSize","optCurrent","optOther","value1","value2","renderSizeInput","renderSlider","urlinput","updateHistory","urlEntry","addToHistory","filetype","typeaheadSpec","memUrlBox","_newValue","getValidationHandler","memInvalidIcon","invalidComp","completer","trimmedValue","_entry","errId","memStatus","optUrlPicker","getUrlPicker","browseUrlEvent","memUrlPickerButton","picker_text","componentData","urlData","fieldname","chosenData","renderUrlInput","customeditor","editorApi","memReplaced","focusBehaviour","onFocusFn","ta","scriptId","ea","cvalue","ed","htmlpanel","renderHtmlPanel","imagepreview","renderTh","renderTd","renderTr","header","renderTable","tree","onToggleExpand","defaultExpandedIds","selectedIdCell","defaultSelectedId","renderTree","renderPanel","noFormParts","interpretInForm","oldBackstage","newBackstage","interpretParts","interpretWithoutForm","westEdgeX","middleX","eastEdgeX","northY","southY","centreY","lookupPreserveLayout","preserve","lookupFlippedLayout","flip","bubbleAlignments$2","valignCentre","alignCentre","alignLeft","alignRight","getInlineDialogAnchor","contentAreaElement","lazyAnchorbar","lazyUseEditableAreaAnchor","getInlineBottomDialogAnchor","lazyBottomAnchorBar","getBannerAnchor","getCursorAnchor","bodyElement","getRng","selectedCells","getSelectedCells","selectionTableCellRange","getNodeAnchor$1","getAnchors","isToolbarTop","useFixedToolbarContainer","getContentAreaContainer","inlineDialog","inlineBottomDialog","cursor","isNestedFormat","isFormatReference","defaultStyleFormats","mapFormats","userFormats","fmt","customFormats","formats","isInlineFormat","isBlockFormat","isSelectorFormat","formatNameWithPrefix","getStyleFormats","registeredUserFormats","registerFormats","registerCustomFormats","processBasic","isSelectedFor","getPreviewFor","getStylePreview","register$a","doEnrich","newItems","getStyleItems","enrichMenu","enrichSupported","isSeparator$1","formatName","newItem","enrichCustom","TooltipsBackstage","numActiveTooltips","tooltipDelay","hasContentEditableState","isElement","contentEditable","isContentEditableTrue","isContentEditableFalse","getElementText","innerText","isValidAnchor","isAnchor","isHeader","tempNode","isChildOfContentEditableTrue","isValidHeader","headerTarget","headerId","getOrGenerateId","getLevel","anchorTarget","anchorId","anchorText","getTargetElements","elms","hasTitle","LinkTargets","getHeaderTargets","getAnchorTargets","STORAGE_KEY","isHttpUrl","isRecordOfUrlArray","getAllHistory","unparsedHistory","SyntaxError","itemsWithoutUrl","setAllHistory","isTruthy","makeMap","getPicker","getPickerSetting","pickerTypes","optFileTypes","_picker","types","getPickerTypes","getTextSetting","UrlInputBackstage","entry","init$6","lazySinks","contextMenuState","isPositionedAtTop","getDockingMode","setDockingMode","HeaderBackstage","getAll","block","parseStyle","getCssText","settingsFormats","eventsFormats","replaceSettings","_e","enriched","modifications","fromSettings","fromEvents","init$7","ColorInputBackstage","dialogSettings","DialogBackstage","commonBackstage","anchors","isContextMenuOpen","setContextMenuState","popupBackstage","dialogBackstage","parts$a","partType","schema$f","itemsPart","parts$9","CustomList","_external","shell","getListContainer","listBehaviours","setItems","itemComps","numListsRequired","numListsToAdd","itemsToAdd","makeItem","itemsToRemove","builtLists","setupItem","schema$e","parts$8","Toolbar","getGroupContainer","toolbarBehaviours","setGroups","groups","setup$a","isDocked$2","getBehaviours$1","StaticHeader","isDocked","getBehaviours","getOffsetParent","offsetParent$1","getOrigin","appear","contextualInfo","transitionClass","fadeOutClass","fadeInClass","disappear","isTopCompletelyVisible","isBottomCompletelyVisible","forceTopPosition","winBox","leftX","location","topY","forceBottomPosition","bottomY","getDockedLeftPosition","getPrior","getInitialPos","priorY","optScrollEnv","scrollEnv","scrollElmTop","currentScrollTop","getXYForRestoring","storePrior","getXYForSaving","setInitialPos","revertToOriginal","clearInitialPos","morph","offsetBox","scrollDelta","_left","_top","_right","_bottom","tryMorphToOriginal","isVisibleForModes","getModes","tryDecisionToFixedMorph","tryMorphToFixed","tryDockingPosition","tryMorph","tryMorphToOriginalOrUpdateFixed","forceDockWith","getDecision","storePriorIfNone","morphToStatic","setDocked","onUndocked","morphToCoord","onDocked","updateVisibility","morphToDocked","contextual","contextInfo","lazyContext","isPartiallyVisible","setVisible","applyFixedMorph","refreshInternal","lazyViewport","applyMorph","resetInternal","calculateMorphToOriginal","staticOrAbsoluteMorph","refresh$3","forceDockWithDecision","forceDockToTop","forceDockToBottom","DockingApis","setModes","ActiveDocking","dockInfo","dockState","onShown","onHidden","DockingSchema","Docking","docked","initialBounds","toolbarHeightChange","visibility","editorStickyOnClass","editorStickyOffClass","isDockedMode","updateIframeContentFlow","parentElem","parentWidth","getOccupiedHeight","updateSinkVisibility","sinkElem","updateEditorClasses","editorContainer","focusedElm","runOnSinkElement","onDockingSwitch","additionalBehaviours","headerHeight","boxHeight","topBound","constrainedBounds","constrainedBoundsY","headerElem","focusedElem","ownerDoc","activeElm","restoreFocus","rootElm","findFocusedElem","boundsWithoutOffset","StickyHeader","lazyHeader","containerHeader","viewHeight","innerHeight","scrollPos","markerElement","markerPos","markerHeight","markerTop","markerBottom","editorHeaderPos","editorHeaderHeight","editorHeaderTop","editorHeaderBottom","editorHeaderDockedAtTop","editorHeaderDockedAtBottom","scrollFromBehindHeader","groupToolbarButtonSchema","baseMenuButtonFields","MenuButtonSchema","createMenuButton","splitButtonSchema","SilverMenubar","setMenus","newMenus","internal","activeButton","hoveredButton","activeComp","hoveredComp","prev","schema$d","getPartName","make$1","getSlotNames","onSlot","def","slot","doShowing","hideSlot","hideSlots","onSlots","showSlot","getSlot","hideAllSlots","slotBehaviours","slotApis","SlotContainer","sSpec","sidebarSchema","makePanels","panelConfigs","bridged","createSidebar","sidepanel","optSidePanelSpec","sidePanelSpec","makeSidebar","slotContainer","updateSidebarRoleOnToggle","sidebar","sidebarState","whichSidebar","fixSize","autoSize","BlockingApis","getBusySpec","blockerBehaviours","blockSpec","blocker","isBlocked","onBlock","blockWith","unblock","onUnblock","blockingConfig","blockingState","BlockingSchema","Blocking","focusBusyComponent","throbber","toggleThrobber","tabIndexAttr","dataTabIndexAttr","tabIndex","toggleEditorTabIndex","_root","_behaviours","getBusySpec$1","throbberFocus","busyComp","setup$7","lazyThrobber","throbberState","stealFocus","isFocusEvent","targetElm","isPasteBinTarget","editorManager","fireAfterProgressState","setEditorTimeout","within","withinWidth","apportion","total","parray","generate$1","toUnit","partition","overflower","divide","tryFit","fitLast","fitAll","setGroups$1","storedGroups","bGroups","refresh$2","setOverflow","builtGroups","overflowGroup","focusedComp","availableWidth","overflows","schema$c","schema$b","parts$7","expandable","setMax","schema$a","parts$6","toggledClass","shouldSkipFocus","toolbarSandbox","bounder","FloatingToolbarButton","skipFocus","makeSandbox","toggleWithoutFocusing","schema$9","parts$5","ToolbarGroup","tgroupBehaviours","itemSelector","buildGroups","refresh$1","memFloatingToolbarButton","overflowGroups","floatingToolbarButton","SplitFloatingToolbar","getOverflowBounds","overflowToggledClass","splitToolbarBehaviours","getOverflow","schema$8","parts$4","onClosed","onOpened","toggleToolbar","overf","SplitSlidingToolbar","toolbarToggleEvent","_button","doSetGroups","renderToolbarGroupCommon","toolbarGroup","renderToolbarGroup","getToolbarBehaviours","toolbarSpec","modeName","onAttached","initGroups","renderMoreToolbarCommon","cyclicKeying","renderFloatingMoreToolbar","baseSpec","moreDrawerData","headerBounds","docElem","docBounds","overflowXOffset","renderSlidingMoreToolbar","renderToolbar","scrolling","baseButtonFields","schemaWithoutGroupButton","togglebutton","groupFields","viewButtonSchema","viewSchema","renderViewButton","isToggleButton","optTranslatedText","optTranslatedTextComponed","ariaLabelAttributes","optIconSpec","hasIconAndText","renderButton","deviceDetection","View","hasGroups","endButtons","btnspec","renderButtonsGroup","getPane","getOnShow","_comp","viewConfig","getOnHide","makeViews","viewConfigs","internalViewConfig","pane","makeSlotContainer","getCurrentName","runOnPaneWithInstanceApi","onCallback","ViewWrapper","setViews","whichView","toggleView","showMainView","hideMainView","optCurrentSlotName","isTogglingCurrentView","hideContainer","showContainer","runOnShow","prevName","runOnHide","views","editorCont","partMenubar","partMultipleToolbar","_mToolbar","tc","_index","partToolbar","renderer","sliding","floating","toolbarFactory","onToolbarToggled","lazyToolbar","lazyMoreButton","partHeader","sticky","partSocket","partSidebar","partThrobber","partViewWrapper","partEditorContainer","OuterContainer","toolbarDrawerOpenState","getSocket","setSidebar","showSidebar","configKey","toggleSidebar","getHeader","setToolbar","renderedGroups","setToolbars","mToolbar","renderedToolbars","refreshToolbar","toggleToolbarDrawer","toggleToolbarDrawerWithoutFocusing","isToolbarDrawerToggled","getThrobber","focusToolbar","setMenubar","menubar","focusMenubar","defaultMenus","edit","tools","help","parseItemsString","identifyMenus","rawMenuData","userDefinedMenus","validMenus","isDefaultMenu","menuData","removedMenuItems","itemName","removedMenuItem","loadStylesheet","stylesheetUrl","styleSheetLoader","unload","loadRawCss","unloadRawCss","loadUiSkins","async","skinUiCss","Resource","loadShadowDomUiSkins","shadowDomSkinCss","loadSkin","isInline","skinResourceIdentifier","contentCSS","skinContentCss","loadUrlSkin","done","_skinLoaded","fireSkinLoaded$1","fireSkinLoaded","fireSkinLoadError$1","fireSkinLoadError","makeTooltipText","labelWithPlaceholder","generateSelectItems","generateItem","response","invalid","si","validateItems","preItems","getCurrentValue","shouldHide","createMenuItems","createSelectButton","tooltipWithPlaceholder","textUpdateEventName","getComponent","Delimiter","buildBasicSettingsDataset","settingName","delimiter","rawFormats","SemiColon","btnTooltip$4","fallbackAlignment","alignMenuItems","getSpec$4","_format","alignment","fireAlignTextUpdate","canApply","findNearest","getStyles","btnTooltip$3","fallbackFormat","getSpec$3","fireBlocksTextUpdate","btnTooltip$2","systemFont","systemStackFonts","splitFonts","fontFamily","fonts","font","matchesStack","getSpec$2","getMatchingValue","getFirstFont","queryCommandValue","userStack","matchOpt","isSystemFontStack","fireFontFamilyTextUpdate","unsupportedLength","decimalDigits","exponentPart","unsignedDecimalLiteral","accepted","unitRaw","check","isUnit","Keys","tab","enter","backspace","delete","up","down","space","home","pageUp","pageDown","createBespokeNumberInput","currentComp","updateInputValue","customEvents","fromInput","focusBack","alloyComp","getNewValue","lenghtDelta","oldStart","oldEnd","decrease","increase","goToParent","focusInput","makeStepperButton","editorOffCellStepButton","altExecuting","memMinus","memPlus","buttonNode","wrapperComp","btnTooltip$1","fallbackFontSize","legacyFontSizes","keywordFontSizes","toPt","fontSize","precision","factor","pow","toLegacy","getSpec$1","pt","legacy","Space","fireFontSizeTextUpdate","btnTooltip","getSpec","getFormatItems","flattenedItems","fireStylesTextUpdate","schema$7","arrowPart","arrow","buttonPart","splitDropdown","parts$3","SplitDropdown","executeOnButton","buttonEvents","splitDropdownBehaviours","getButtonApi","getToggleApi","getTooltipAttributes","focusButtonEvent","renderCommonStructure","optIcon","optText","renderCommonToolbarButton","specialisation","_d","itemApi","toolbarButtonBehaviours","renderToolbarButtonWith","bonusEvents","renderToolbarToggleButtonWith","fetchChoices","defaultToolbar","renderFromBridge","bridgeBuilder","renderToolbarButton","renderToolbarToggleButton","menubutton","splitbutton","buttonComp","_c","renderSplitButton","grouptoolbarbutton","identify","identifyButtons","allowToolbarGroups","TopToBottom","renderFloatingToolbarButton","bespokeButtons","fontsize","fontsizeinput","skip_focus","updateFunction","parsedText","defaultUnit","em","cm","in","pc","rem","getConfigFromUnit","isValidValue","fireFontSizeInputTextUpdate","getNumberInputSpec","fontfamily","blocks","createToolbar","toolbarConfig","filteredItemGroups","subItem","removeUnusedDefaults","strToolbar","groupsStrings","convertStringToolbar","isToolbarGroupSettingArray","lookupButton","toolbarItem","prefixes","extractFrom","toolbarGroups","rawUiConfig","toolbarButtonsConfig","detection","isiOS12","Iframe","lastToolbarWidth","eTargetNode","targetNode","uiRoot","popupUi","dialogUi","attachUiMotherships","innerWidth","initialDocEle","lastWindowDimensions","lastDocumentDimensions","resizeWindow","outer","resizeDocument","docEle","fireScrollContent","elementLoad","setupEvents$1","socket","limit","unbinder","addCommand","_ui","addQueryValueHandler","nodeChanged","toolbarMode","iframeContainer","parseToInt","numToPx","calcCappedSize","minSize","maxSize","minOverride","maxOverride","getHeightWithFallback","baseHeight","minHeight","getHeight","getWidth","baseWidth","minWidth","InlineHeader","floatContainer","isSticky","editorMaxWidthOpt","headerBackstage","isSplitToolbar","calcToolbarOffset","tbar","getOffsetParent$1","repositionPopups$1","stickyAction","bodyMargin","isOuterContainerWidthRestored","restoreOuterContainerWidth","targetBounds","widthProperties","toolbarWidth","baseProperties","topValue","updateChromePosition","doUpdateMode","fc","currentMode","newMode","toolbarHeight","docHeight","calcMode","verticalDir","addClass","removeClass","updateMode","getTargetPosAndBounds","Inline","toolbarPersist","uiContainer","prevPosAndBounds","resizeContent","prevPos","prevBounds","hasResized","lastScrollX","updateUi","newScrollX","_args","setupEvents","hideContextToolbarEvent","runOnExecute","formApi","getFormApi","renderContextToggleButton","renderContextButton","buildInitGroups","commands","findPrimary","mementos","asSpecs","compInSystem","ContextForm","isVerticalOverlap","threshold","getSelectionBounds","leaf$1","getRangeRect","bodyPos","getContextToolbarBounds","toolbarType","viewportBounds","contentAreaBox","toolbarOrMenubarEnabled","getHorizontalBounds","isToolbarLocationTop","headerBox","isToolbarBelowContentArea","isToolbarAbove","containerBounds","getVerticalBounds","bubbleAlignments$1","inset","anchorOverrides","shouldUseInsetLayouts","determineInsetLayout","contextbar","selectionBounds","isSameAnchorElement","lastElement","isEntireElementSelected","currentPosition","preservePosition","isReposition","getAnchorSpec$2","mobile","smartInsetLayout","getInsetLayouts","matchTargetWith","ctxs","toolbarApi","contextToolbars","contextForms","matchStartNode","nodeCandidates","editorCandidates","nodeMatches","editorMatches","doesPositionExist","filterToolbarsByPosition","hasSelectionToolbars","hasNodeToolbars","nodeToolbars","selectionToolbars","filterByPositionForStartNode","matchAncestor","startNode","scopes","ancestorElem","inNodeScope","findPosition","basePosition","filterByPositionForAncestorNode","categorise","forms","inEditorScope","formNavigators","lookupTable","registerForm","contextForm","launch","registerToolbar","contextToolbar","forwardSlideEvent","backSlideEvent","changeSlideEvent","resizingClass","register$9","registryContextToolbars","lastTrigger","lastContextPosition","currentWidth","newWidth","newContents","oldContents","forwardContents","renderContextToolbar","canLaunchToolbar","shouldContextToolbarHide","contextToolbarBounds","anchorBounds","getAnchorElementBounds","hideOrRepositionIfNecessary","contextBarEle","wrapInPopDialog","shortcuts","getScopes","alloySpec","buildToolbar","allButtons","buildContextToolbarGroups","buildContextFormGroups","anchorLayout","getAnchorLayout","launchContext","launchContextToolbar","isSameLaunchElement","isDragging","rootElem","isOutsideRoot","lookup$1","toolbarKey","registerController","getMenuItems","getOptions","hash","oldApi","unbindWatcher","watcher","setCurrent","addMenuButton","onToolbarSetup","onMenuSetup","lineHeightSpec","normalise","register$7","customCode","customValue","lang","languageSpec","register$6","createAlignMenu","createFontFamilyMenu","createStylesMenu","createBlocksMenu","createFontSizeMenu","onSetupOutdentState","register$5","addButton","registerButtons$2","makeSetupHandler","pasteAsText","pastePlainTextToggleHandler","onActionToggleFormat","registerButtons$1","_idx","addToggleButton","registerFormatButtons","registerCommandButtons","registerCommandToggleButtons","register$3","addMenuItem","registerMenuItems$2","onSetupUndoRedoState","register$2","registerMenuItems$1","registerButtons","onSetupVisualAidState","hasVisual","register$1","registerToolbarButton","addToggleMenuItem","registerMenuItems","setup$6","cmd","register$8","applyFormat","removeFormat","registerCommands","fallbackColorForeground","fallbackColorBackground","lastForeColor","lastBackColor","register$c","register$4","patchPipeConfig","shouldNeverUseNative","getAvoidOverlapSelector","getContextMenu","contextMenus","contextMenu","isTouchEvent$1","transposeContentAreaContainer","containerPos","getPos","dx","dy","transpose","getPointAnchor","pageX","pageY","fromPageXY","fromClientXY","getSelectionAnchor","getAnchorSpec$1","anchorType","getNodeAnchor","initAndShow$1","buildMenu","contextmenu","anchorSpec","bubbleAlignments","highlightImmediately","getAnchorSpec","initAndShow","openiOS","originalSelection","selectionReset","setRng","unbindEventListeners","preventMousedown","clearSelectionReset","setupiOSOverrides","rngRect","isTouchWithinSelection","makeContextItem","commonMenuItem","commonItem","addContextMenuGroup","groupItems","lastMenuItem","isTriggeredByKeyboard","isTouchEvent","pointerType","getSelectedElement","setup$5","hideContextMenu","showContextMenu","isNativeOverrideKeyEvent","isContextMenuDisabled","getAnchorType","selectedElement","sections","allItems","generateContextMenu","hideEvents","subtract","changes","asFixed","coord","asAbsolute","asOffset","toStyles","stylesOpt","absorb","partialCoord","originalCoord","absorbOne","stencil","optX","optY","parseAttrToInt","NaN","getCoords","snapInfo","snapsInfo","leftAttr","topAttr","moveOrSnap","newCoord","mustSnap","findClosestSnap","findSnap","fixedCoord","spanned","stopDrag","findMatchingSnap","snaps","sensor","inRange","coord1","coord2","withinRange","getSnapPoints","bestSnap","deltas","getDeltas","bestDeltas","DraggingApis","snapTo","dragConfig","getTarget","repositionTarget","snapPin","snapTo$1","initialAttribute","instigate","anyComponent","zindex","changeZIndex","discard","zIndex","resetZIndex","createComponent","blockerClass","blockerEvents","SnapSchema","schema$6","getCurrentCoord","oc","lift3","calcNewCoord","optSnaps","currentCoord","coords","absoluteCoord","newCoords","offset$1","clampCoords","translated","deltaX","deltaY","snapping","onSensor","calcStartData","dragState","dragMode","dragStartData","getStartData","dlt","onDrag","dragBy","updateStartState","setStartData","MouseData","getDelta","events$3","stop$1","delayDrop","dragApi","drop","forceDrop","init$3","schema$5","TouchData","getDataFrom","events$2","blockerSingleton","stopBlocking","init$2","mouse","mouseOrTouch","DraggingBranches","DragState","previous","dragEvent","nuData","calculateDelta","Dragging","dragger","calcSnap","selectorOpt","td","snapWidth","selectorHandle","sensorLeft","sensorTop","getSnapsConfig","cellOpt","currentTd","isSameCell","createSelector","setup$4","tlTds","brTds","startCell","finishCell","getTopLeftSnap","memTopLeft","getBottomRightSnap","memBottomRight","topLeftSnaps","bottomRightSnaps","bottomRight","getSnapConfig","isAbove","isBelow","cellRect","viewportHeight","aboveViewport","belowViewport","showOrHideHandle","snapTopLeft","snapBottomRight","domToSugar","otherCells","upOrLeftCells","downOrRightCells","renderElementPath","renderPathData","_btn","renderElement","newPath","isDefaultPrevented","isPropagationStopped","updatePath","ResizeTypes","resize","resizeType","originalHeight","originalWidth","Both","getDimensions","dim","fireResizeEditor","keyboardHandler","renderResizeHandler","None","Vertical","getResizeType","resizeLabel","_target","renderStatusbar","renderRightContainer","replaceCountText","words","characters","currentVal","wordCount","renderWordCount","href","getTextComponents","shouldRenderHelp","shouldRenderElementPath","shouldRenderRightContainer","getTextComponentClasses","flexStart","flexEnd","container3Columns","shortcutText","renderHelpAccessibility","resizeHandler","getLazyMothership","setup$3","setupForTheme","lazyUiRefs","getUiMotherships","optDialogMothership","optPopupMothership","dm","pm","lazyGetInOuterOrDie","LazyUiReferences","lazyMothership","lazyDialogMothership","lazyPopupMothership","deviceClasses","isToolbarBottom","memAnchorBar","memBottomAnchorBar","lazyAnchorBar","backstages","renderMainUi","verticalDirAttributes","fireToggleToolbarDrawer","hasMultipleToolbar","hasToolbar","hasMenubar","hasAnyContents","makeHeaderPart","sidebarContainer","viewWrapper","statusbar","editorComponents","isHidden","opacity","setEditorSize","parsedHeight","parsedWidth","getWidthWithFallback","renderUIWithRefs","toolbarGroupButtonConfig","addGroupToolbarButton","sidebars","toolbarOpt","addShortcut","addQueryStateHandler","channel","fireDismissPopups","onTouchstart","onTouchmove","onTouchend","onMousedown","onMouseup","onContentClick","onContentMouseup","onContentMousedown","loopEditor","relatedTarget","onWindowScroll","onWindowResize","onElementScroll","onEditorResize","onEditorProgress","onDismissPopups","gui","setup$b","handleToggle","setup$8","popups","getMothership","dialogs","renderUI","isGridUiContainer","sinkSpec","reactiveWidthSpec","uiMothership","renderDialogUi","getPopupSinkBounds","renderPopupUi","reuseDialogUiForPopuUi","schema$2","basic","parts$2","dragBlockClass","getDragBounds","ModalDialog","dialogComp","modalEventsId","externalBlocker","blockerDom","getFooter","setIdle","setBusy","modalBehaviours","labelledElement","labelElement","labelId","labelledBy","dialogToggleMenuItemSchema","dialogToggleMenuItemDataProcessor","baseFooterButtonFields","dialogFooterButtonFields","normalFooterButtonFields","menuFooterButtonFields","toggleButtonSpecFields","dialogFooterButtonSchema","submit","alertBannerFields","alertBannerSchema","buttonFields","buttonSchema","formComponentFields","formComponentWithLabelFields","checkboxFields","checkboxSchema","checkboxDataProcessor","collectionFields","collectionSchema","collectionDataProcessor","colorInputFields","colorInputSchema","colorInputDataProcessor","colorPickerSchema","colorPickerDataProcessor","customEditorFields","defaultedPostMsg","customEditorFieldsOld","customEditorSchema","customEditorDataProcessor","dropZoneSchema","dropZoneDataProcessor","createGridFields","itemsField","htmlPanelFields","htmlPanelSchema","iframeFields","iframeSchema","iframeDataProcessor","imagePreviewSchema","imagePreviewDataProcessor","inputFields","inputSchema","inputDataProcessor","createLabelFields","listBoxSingleItemFields","listBoxNestedItemFields","listBoxItemSchema","listBoxFields","listBoxSchema","listBoxDataProcessor","selectBoxFields","selectBoxSchema","selectBoxDataProcessor","sizeInputFields","sizeInputSchema","sizeInputDataProcessor","sliderFields","sliderSchema","sliderInputDataProcessor","tableFields","tableSchema","textAreaFields","textAreaSchema","textAreaDataProcessor","baseTreeItemFields","treeItemLeafSchema","treeItemDirectoryFields","treeItemDirectorySchema","treeItemSchema","treeFields","treeSchema","urlInputFields","urlInputSchema","urlInputDataProcessor","createItemsField","itemSchema","sErr","passValue","panelSchema","panelFields","tabFields","tabPanelFields","tabPanelSchema","dialogButtonFields","dialogButtonSchema","dialogSchema","tabpanel","urlDialogButtonSchema","urlDialogSchema","getAllObjects","isNamedItem","dataProcessors","togglemenuitem","createDataValidator","namedItems","getNamedItems","getDataProcessor","internalDialog","dataValidator","DialogManager","openUrl","redial","ActiveReflecting","reflectingConfig","reflectingState","renderComponents","newComponents","rawData","ReflectingApis","reflectState","ReflectingSchema","Reflecting","toValidValues","renderBodyPanel","memForm","formValue","TabButton","tabButtonBehaviours","schema$1","tabsPart","barDetail","dismissTab$1","tabbar","changeTab$1","clickToDismiss","tabClass","parts$1","Tabbar","tabbarBehaviours","selectedClass","Tabview","tabviewBehaviours","barPart","tabs","viewPart","TabSection","changeTabBy","section","byPred","tabSectionBehaviours","selectFirst","tabValue","tabview","tabWithValue","tabData","onChangeTab","onDismissTab","getViewItems","showTab","tabKey","setTabviewHeight","updateTabviewHeight","dialogBody","maxTabHeight","tablist","documentElement$1","tabviewHeight","currentTabHeight","dialogTopMargin","dialogBottomMargin","getMaxTabviewHeight","getTabview","smartMode","allTabs","extraEvents","tabviewComp","heights","_tab","measureHeights","maxTabHeightOpt","getMaxHeight","oldHeight","newHeight","SendDataToSectionChannel","SendDataToViewChannel","renderTabPanel","storedValue","updateDataWithForm","formData","validData","setDataOnForm","oldTab","tabMode","_viewItems","oldName","tsection","renderBody","dialogId","contentId","ariaAttrs","incoming","isTabPanel","hiddenHeader","pClose","pUntitled","pBodyMessage","pFooter","footer","pFooterGroup","startButtons","renderDialog$1","dialogClass","blockerBackdropClass","scrollLockClass","extraStyles","dialogEvents","renderClose","renderTitle","titleId","renderDragHandle","pTitle","pHandle","draghandle","draggable","renderModalHeader","bs","getEventExtras","lazyDialog","closeWindow","blockEvent","fullscreenClass","largeDialogClass","mediumDialogClass","getDialogSizeClass","updateDialogSizeClass","dialogSizeClass","toggleFullscreen","currentSize","currentSizeClass","toggle$3","renderModalDialog","mapMenuButtons","menuItemStates","mapItems","extractCellsToObject","innerAcc","initCommonEvents","fireApiEvent","_event","self","initDialog","getInstanceApi","withSpec","currentDialogInit","rootNode","cur","onTabChange","newTabName","oldTabName","footerButtons","buttonGroups","makeGroup","renderFooter","initSpec","makeButton","lookupByName","buttonName","renderModalFooter","getCompByName","getFormWrapper","footerState","getDialogApi","doRedial","withRoot","instanceApi","valueComp","setData","prevData","mergedData","newInternalData","dialogState","validateData$1","tabSection","getId","dialogInit","storedMenuButtons","renderDialog","dialogSize","dialogSizeClasses","bodySpec","renderModalBody","objOfCells","modalAccess","outerForm","renderInlineDialog","refreshDocking","dialogLabelId","dialogContentId","memHeader","renderInlineHeader","memBody","renderInlineBody","storagedMenuButtons","optMemFooter","renderInlineFooter","memFooter","global","SUPPORTED_MESSAGE_ACTIONS","isSupportedMessage","mceAction","renderUrlDialog","renderIframeBody","currentDialog","initUrlDialog","iframeUri","base_uri","iframeDomain","protocol","port","messageHandlerUnbinder","isSameOrigin","insertContent","handleMessage","isCustomMessage","onMessage","iframeEle","iframeWin","postMessage","sendMessage","getUrlDialogApi","validateData","isAlertOrConfirmDialog","inlineAdditionalBehaviours","isStickyToolbar$1","alertDialog","closeDialog","memFooterClose","titleSpec","closeSpec","footerCloseButton","setup$2","confirmDialog","memFooterYes","footerNo","footerYesButton","setup$1","openModalUrlDialog","openModalDialog","internalInitialData","openInlineDialog","config$1","windowParams","inlineDialogComp","persistent","openBottomInlineDialog","contentAreaContainer","confirm","registerOptions","colorProcessor","colorColsProcessor","register$d","popupSinkBounds","renderModeUI","windowMgr","renderResult","getWindowManagerImpl","getNotificationManagerImpl","contentArea","win$1","closeCallback","notificationWrapper","notification","progressBar","thisNotification","notificationSpec","allNotifications","notificationManager","getNotifications","previousNotification","getEl","nodeAnchor","nuText","getArgs","NotificationManagerImpl","assumeExternalTargets","hasContextToolbar","getLinkList","getDefaultLinkTarget","getDefaultLinkProtocol","getTargetList","getRelList","getLinkClassList","shouldShowLinkTitle","allowUnsafeLinkTarget","useQuickLink","sanitizeList","out","getText","sanitizeWith","extracter","ListOptions","createUi","isLink","getHref","collectNodesInRange","cloneContents","walker","hasProtocol","applyRelTargetRules","isUnsafe","rules","rels","removeTargetRules","inArray","newRels","addTargetRules","getAnchorElement","selectedElm","getLinksInSelection","isImageFigure","getParent","isInAnchor","getAnchorText","anchorElm","trimCaretContainers","getLinks$1","grep","hasLinks","isOnlyTextSelected","inlineTextElements","getTextInlineElements","applyLinkOverrides","linkAttrs","newLinkAttrs","newRel","handleExternalTargets","linkDomMutation","attachState","getLinkAttrs","linkImageFigure","createLink","setAttribs","updateLink","unwrapOptions","cls","sanitizedData","uriOptions","allow_html_data_urls","allow_script_urls","allow_svg_data_urls","isDomSafe","sanitizeData","unlinkImageFigure","bookmark","getBookmark","cloneRange","startAnchorElm","endAnchorElm","moveToBookmark","unlinkSelection","unlinkDomMutation","fig","getParents","isListGroup","findTextByValue","catalog","persistentText","hasPersistentText","DialogChanges","linkCatalog","persistentData","onUrlChange","getTitleFromUrlChange","onCatalogChange","catalogs","tryEmailTransform","oldData","tryProtocolTransform","defaultLinkProtocol","DialogConfirms","delayedConfirm","AnchorListOptions","anchorNodes","ClassListOptions","parseJson","LinkListOptions","extractor","convertURL","linkList","ok","optItems","RelOptions","isTargetBlank","safeRelExtractor","fallbacks","TargetOptions","nonEmptyAttr","getAttrib","DialogInfo","linkNode","links","linkClass","extractFromAnchor","optNode","flags","titleEnabled","collectData","getChangedValue","changedData","pData","handleSubmit","titleText","defaultTarget","getInitialData","dialogDelta","makeDialog","createEvent","initMouseEvent","appendClickRemove","getLink","getSelectedLink","gotoLink","targetEl","scrollIntoView","openDialog","gotoSelectedLink","toggler","toggleLinkState","toggleLinkMenuState","toggleGotoLinkState","hasExactlyOneLinkInSelection","toggleUnlinkState","hasLinks$1","updateEnabled","setupContextToolbars","onSetupLink","addContextForm","onlyText","getLinkText","collapseSelectionToEnd","setupButtons","setupMenuItems","addContextMenu","setupContextMenu","metaKeyPressed","altKey","metaKey","hasOnlyAltModifier","setupGotoLinks","eq$2","range$1","each$2","last$2","resolve$2","isComment","fromDom$1","prevSibling","previousSibling","children$2","before$3","after$5","firstChild$1","after$4","unwrap","shallowAs","validSectionList","rowspan","colspan","rowdetail","elementnew","isNew","isLocked","rowcells","getBody$1","ancestors$3","ancestors$4","getRaw$2","getAttrValue","getSpan","hasColspan","cellOrCol","getCssValue","firstLayer","filterFirstLayer","tags","cells$1","columns$1","columnGroups","columnGroup","rows$1","fromRowsOrColGroups","elems","getSection","getParentSection","parentName","isValidSection","fromTable$1","unknown$2","nu$2","detect$4","detect$2","toNumber","px","toFloat","getProp","getCalculatedWidth","boxSizing","upper","lower","calcContentBoxSize","getInner","getRuntime$1","addCells","gridRow","existingCells","newCells","setCells","addCell","mutateCell","getCell","getCellElement","cellLength","extractGridDetails","cols","cloneRow","cloneCell","LOCKED_COL_ATTR","getLockedColumnsFromTable","lockedColStr","lockedCols","getLockedColumnsFromGrid","lockedArr","_val","sort$1","filterItems","warehouse","lockedColumns","rowData","maxRows","maxColumns","rowCount","colgroupRows","currentRow","rowCell","extended","occupiedColumnPosition","occupiedRowPosition","columnPosition","newpos","colgroups","columnsGroup","columnext","generateColumns","colgroup$1","colgroup","grid$1","Warehouse","fromTable","getAt","findItem","filtered","justCells","justColumns","hasColumns","getColumnAt","isValidCell","rowsArr","decide","getBlock","getFallback","inBlock","deduce","aa","getRuntime","rowInfo","colInfo","rtlEdge","ltrEdge","getTop$1","findPositions","getInnerEdge","getOuterEdge","cellOption","lastLine","optElements","amount","rPercentageBasedSizeRegex","rPixelBasedSizeRegex","isCol$2","isRow$2","getPercentSize","outerGetter","innerGetter","relativeParent","setPixelWidth","setPercentageWidth","normalizePixelSize","getTotalHeight","getHeightValue","getRaw$1","getRawWidth$1","getPercentageWidth","getPixelWidth$1","setGenericWidth","getPercentTableWidth","percentageBasedSizeRegex","isCol$1","getRawW","getRawH","backups","getWidthFrom","columnCells","justCols","colFilter","supportsColWidths","isValidColumn","getDeduced","deduced","getPixelWidths","tableSize","minCellWidth","getHeightFrom","rowCells","widthLookup","noneSize","zero","pixelWidth","getWidths","getCellDelta","singleColumnWidth","setElementWidth","adjustTableWidth","isRelative","percentageSize","getFloatWidth","cellWidth","getPercentageWidths","_delta","pixelSize","TableSize","chooseSize","seenSelected","extract$1","selectedSelector","replica","replicaHouse","replicaStats","house","totalColumns","minRow","minCol","maxRow","maxCol","allCells","endRow","endCol","statsStruct","findSelectedStats","unselectedCells","stats","totalRows","fillInGaps","widthDelta","colWidths","allColsWidth","selectedColsWidth","getTableWidthDelta","emptyRows","clean","getEnd","elementsWithCursorPosition","isCursorPosition","descendantRtl","transferableAttributes","createCell","createCol","createColgroup","createRow$1","replace$1","cloneChildren","copy$2","pasteReplace","cellOperations","mutate","formatsToClone","cloneCss","sourceDom","targetDom","cssText","copy$1","lastNode","oldCell","newCell","firstText","formatSelector","clonedFormat","cloneFormats","validAttributes","attributeName","cloneAppropriateAttributes","colGap","gap","paste$1","defaultWidth","getPixelForcedWidth","parentBlock","isBlock","getTableCloneElements","getTableHeaderType","getTableColumnResizingBehaviour","isPreserveTableColumnResizing","isResizeTableColumnResizing","getTableSizingMode","isTablePercentagesForced","isTablePixelsForced","isTableResponsiveForced","hasTableResizeBars","shouldStyleWithCss","shouldMergeContentOnPaste","getTableDefaultAttributes","defaultAttributes","determineDefaultTableAttributes","getTableDefaultStyles","defaultStyles","determineDefaultTableStyles","tableUseColumnGroup","isEditable$1","assumeEditable","isContentEditable","editable","getIsRoot","removeDataStyle","removeStyleAttribute","getSelectionStart","getPixelWidth","getPixelHeight","getRawValue","getRawWidth","getRawHeight","isInEditableContext$1","inSelection","leftEdge","rightEdge","topEdge","bottomEdge","finishCol","finishRow","isWithin","getAnyBox","startCoords","finishCoords","detailA","detailB","getBox$1","isRect","detailIsWithin","isRectangular","intercepts$1","parentCell","innerCell","c1","c2","deltaColumn","getWarehouse","intercepts","nestedIntercepts","firstTable","lastTable","optStartCell","optLastCell","TagBoundaries","DomUniverse","copyTo","destination","as","afterAll","appendAll","comparePosition","compareDocumentPosition","isSpecial","getLanguage","isBoundary","isEmptyTag","isNonEditable","unsafeOne","universe","look","tail","commonElement","sharedOne$1","ancestors$1","ps1","ps2","prune","ind","pruned1","pruned2","firstpath","secondpath","universe$3","sharedOne","_universe","rootTable","boxes","startTable","finishTable","ancestorCells","lca","lcaTable","finishAncestorCells","startAncestorCells","retrieve$1","sels","getEdges","firstSelectedSelector","lastSelectedSelector","shiftSelection","expandTo","retrieve","retrieveBox","sectionSelector","firstAncestor","lastAncestor","fA","lA","unmergable","hasSpan","mergable","ephemera","strSelected","strSelectedSelector","strAttributeSelector","strFirstSelected","strFirstSelectedSelector","strLastSelected","strLastSelectedSelector","attributeSelector","firstSelected","lastSelected","getSelectionFromSelector","initCell","cellName","getSelectionCellOrCaption","getSelectionCell","getCellsFromSelection","registerEvents","multiCellContext","extractSelected","getTextContent","serializer","serialize","serializeElements","getCellsFromFakeSelection","paste","isTable","generators","clipboard","pasteCells","scan$1","toEnd","freefallRtl$2","freefallRtl$1","universe$2","halve","main","getGenericWidth","surround","sizes","startIndex","clampDeltaHelper","minCellSize","diff","clampNegativeDelta","clampDelta","resizeTable","calcRelativeDeltas","ratio","newThis","calcLeftEdgeDeltas","clampedDelta","calcFixedDeltas","resizer","clampTableDelta","calcMiddleDeltas","_prev","calcRightEdgeDeltas","calcRedestributedWidths","totalWidth","pixelDelta","newSizes","preserveTable","isLastColumn","maxDelta","_minCellSize","_totalWidth","_pixelDelta","_isRelative","getGridSize","isHeaderCell","isHeaderCells","getRowHeaderType","isHeaderRow","getRowType","findCommonCellType","subType","headerCells","transformCell","substitution","transformRow","fixedCell","mutate$1","sectionCells","TableSection","rowType","findTableRowHeaderType","setIfNot","insert$1","render$1","newRows","syncRows","gridSection","tr","syncColGroup","colGroup","renderSection","sectionName","newSection","generateSection","sectionElems","renderOrRemoveSection","removeSection","headSection","bodySection","footSection","columnGroupsSection","findDiff","subgrid","getRow","isColRow","getColumn","toDetails","seen","updateSeen","rowdetailnew","toGrid","colgroupCols","rowDetail","toDetailList","findInWarehouse","extractCells","cell$1","lc","operation","postAction","genWrappers","tableSection","fromWarehouse","newElements","tableSizing","sizing","resizing","onPasteByEditor","onCells","onUnlockedCells","allUnlocked","isUnlockedTableCell","unmerge","currentCell","isToReplace","splitRows","uniqueCells","sub","measureWidth","gridA","gridB","rowDelta","colDelta","measureHeight","generateElements","generator","rowFill","exampleRow","colFill","tailor","fillCols","fillRows","gridWidth","isLastColLocked","modifiedCols","newLockedColumns","isSpanning","matching","getLockedColumnsWithinBounds","startAddress","colNum","validStartAddress","currentStartAddress","gridColLength","adjustedRowAddress","possibleColAddresses","validColAddress","getValidStartAddress","gridBRows","lockedColumnsWithinBounds","rowRemainder","colRemainder","colRequired","rowRequired","measure","fittedGrid","newLockedColumnsWithinBounds","lockedColumnObj","skippedCol","gridBColIndex","newCellElm","mergeTables","insertCols","prevCell","splitCols","fittedNewGrid","secondDelta","fittedOldGrid","insertRows","oldCols","oldRows","newLocked","secondDiff","fittedGridB","newChild","lockedColFill","insertRowAt","example","ex","insertColumnAt","withinSpan","getElementFor","isDuplicatedCell","notInStartRow","notInStartColumn","determineScope","applyScope","newScope","isInHeader","hasRowspan","getScope","replaceIn","genScope","shouldReplace","mapCells","isTarget","getColumnCells","replaceColumns","indexes","rowHeaders","shouldReplaceCell","targetColumn","_colIndex","columnReplacePredicate","scopeGenerator","columnScopeGenerator","replaceRows","targetRow","getRowCells","columnHeaders","_cell","newGrid","_rowIndex","rowReplacerPredicate","rowScopeGenerator","replaceCells","targetCells","ColumnContext","only","determine","context","neighbours","recalculate","widths","recalculateWidthForColumns","measures","recalculateWidthForCells","recalculateAndApply","adjustWidth","clampedStep","newWidths","adjustHeight","getPixelHeights","newHeights","newRowSizes","matchRowHeight","removeHeight","uniqueColumns","currentDetail","isCol","isColgroup","isRow$1","elementToData","getScopeAttribute","Generators","toData","nuCell","recent","getOrInit","makeNew","replaceOrInit","merge","stringAttributes","baseScope","getScopeProperty","blockList","universe$1","isBlock$1","isList","isList$1","isEmptyTag$1","isBr","markCell","rightSiblingIsBlock","rightSibling","isListItem","advancedBr","markContent","elementFromGrid","findEditableCursorPosition","cursorElement","uniqueRows","makeRowsSection","initialGrid","rowIndexes","opMakeRowsHeader","opMakeRowsBody","opMakeRowsFooter","gridifyRows","pasteDetails","fromPastedRows","wh","_table","_info","adjustWidthTo","adjustAndRedistributeWidths","resizeBehaviour","tablePixelWidth","adjustAndRedistributeWidths$1","firstColumnIsLocked","_warehouse","lastColumnIsLocked","getColumnsWidth","uniqueCols","insertColumnsExtractor","pasteColumnsExtractor","headerCellGenerator","bodyCellGenerator","insertRowsBefore","targetIndex","insertRowsAfter","newG","insertColumnsBefore","extractDetail","insertColumnsAfter","eraseColumns","_comparator","_genWrappers","deleteColumnsAt","maxColIndex","eraseRows","deleteRowsAt","maxRowIndex","makeColumnsHeader","columnIndexes","unmakeColumnsHeader","makeRowsHeader","makeRowsBody","makeRowsFooter","makeCellsHeader","unmakeCellsHeader","mergeCells","merge$2","onMergable","mergeable","unmergeCells","onUnmergable","gridify","pasteColsBefore","mergedGrid","pasteColsAfter","pasteRowsBefore","pasteRowsAfter","getColumnsType","lastSelectedCell","minColRange","maxColRange","selectedColumnCells","getCellsType","getRowsType","minRowRange","maxRowRange","rowTypes","hasHeader","hasFooter","hasBody","findCommonRowType","fireNewRow","fireNewCell","fireTableModified","styleModified","structureModified","styleAndStructureModified","TableActions","cellSelectionHandler","isTableBody","colMutationOp","getTableSectionType","setSelectionFromAction","clearSelectedCells","createRng","selectNode","des","guard","effect","noEvents","deleteRow","deleteColumn","getTableRowType","getTableCellType","getTableColType","constrainSpan","currentColspan","isColInRange","copyCols","fakeColGroups","colsToCopy","copiedCols","clonedCol","fakeColgroup","generateColGroup","fakeRows","cellsToCopy","copiedCells","clonedCell","fakeTR","generateRows","copyRows","slicedGrid","filteredGrid","slicedDetails","pixels","validateFor","rawAmount","Size","redistributeValues","newWidthType","newTotalWidth","redistributeToPx","_pc","redistributeToPercent","redistribute$1","newType","floats","redistributeEmpty","normalize","floored","roundDown","redistribute","optWidth","optHeight","widthUnit","oldWidths","getRawWidths","nuWidths","redistributeToColumns","redistributeToW","totalHeight","oldHeights","getRawHeights","redistributeToH","isPercentSizing","isPixelSizing","isNoneSizing","cleanupLegacyAttributes","convertToPercentSizeWidth","convertToPixelSizeWidth","getPixelTableWidth","convertToPixelSizeHeight","getPixelTableHeight","convertToNoneSizeWidth","rowElements","DefaultRenderOptions","colGroups","createGroupRow","createRows","createRow","placeCaretInCell","colHeaders","headerType","renderOpts","rowHeadersGoInThead","actualRowHeaders","thead","theadRows","tbodyRows","addVisual","isPercentage","fireEvents","tableElm","selectFirstCellInTable","tableTypeBase","tableTypeRow","tableTypeColumn","fakeClipboardItem","FakeClipboardItem","getType","clearData","setRows","rowsOpt","clearRows","getRows","setColumns","columnsOpt","clearColumns","getColumns","getSelectionStartCellOrCaption","getTableFromCell","performActionOnSelection","getSelectionStartCell","postExecute","actOnSelection","copyRowSelection","copyColSelection","pasteOnSelection","clonedRows","pasteRows","actOnType","no_events","mceTableSplitCells","mceTableMergeCells","mceTableInsertRowBefore","mceTableInsertRowAfter","mceTableInsertColBefore","mceTableInsertColAfter","mceTableDeleteCol","mceTableDeleteRow","mceTableCutCol","mceTableCutRow","mceTableCopyCol","mceTableCopyRow","mceTablePasteColBefore","mceTablePasteColAfter","mceTablePasteRowBefore","mceTablePasteRowAfter","mceTableDelete","cellOrCaption","setCursorLocation","mceTableCellToggleClass","allHaveClass","formatterAction","mceTableToggleClass","mceTableToggleCaption","caption","mceTableSizingMode","setSizingMode","mceTableCellType","mceTableColType","mceTableRowType","checkInput","headerRows","headerColumns","insertTable","getFormatName","validArgs","cata","onBefore","onOn","onAfter","Response","selectNodeContents","selectNodeContentsUsing","Situs","convertToRange","makeSitus","selectRange","cellSel","traverse","backtrack","_direction","sidestep","advance","successors","succ","Walkers","hone","isLeaf","seekLeft$1","seekRight$1","after$1","failedUp","failedDown","isRow","BeforeAfter","verify","bridge","beforeOffset","afterOffset","failure","afterCell","beforeCell","beforeBounds","getRect","afterBounds","isOverlapping","_sharedRow","onSuccess","onFailedUp","onFailedDown","gatherer","cand","gather","handleParent","findBr","br","adjacent","inParent","indexInParent","tryBr","handleBr","toCaret","getElemBox","getBoxAt","getRangedRect","getPartialBox","getEntireBox","retry","inOutsideBlock","isOutside","downMovement","adjuster","guessBox","lowerCaret","adjustTil","numRetries","isAtTable","adjustForTable","situsFromPoint","guess","newCaret","moved","adjusted","getInnerHeight","checkScroll","scrollBy","Retries","tryUp","higherCaret","tryDown","getJumpSize","findSpot","brNeighbour","fromSitus","analysis","_message","tryCursor","situs","tryAgain","tryAt","inSameTable","simulate","handle$1","precheck","firstUpCheck","seekLeft","lastOffset","lastDownCheck","seekRight","findCell","isInEditableContext","isKey","keycode","isUp","isDown","isNavigation","isBackward","isForward","caretPositionFromPoint","offsetNode","caretRangeFromPoint","availableSearch","beforeSpecial","doSetNativeRange","removeAllRanges","addRange","doSetRange","setRangeFromRelative","setBaseAndExtent","extend","setLegacyRtlRange","setExact","preprocessExact","setRelative","preprocessRelative","setToElement","selectNodeContents$1","getAtPoint","WindowBridge","exactAdt","clearSelection","collapseSelection","toStart","setSelection","setRelativeSelection","selectContents","getScrollY","by","rc","annotations","clearstate","applySelection","clearBeforeUpdate","singleCell","isNonEditableCell","isCellClosestContentEditable","MouseSelection","isEditableNode","isEditableSelection","keyboard","clearToNavigate","realEvent","update$1","newSels","sync","SelectionAnnotation","onSelection","onClear","removeSelectionAttributes","addSelectionAttribute","getOtherCells","upGrid","upDetails","slicedCells","getUpOrLeftCells","downGrid","downDetails","getDownOrRightCells","bind$1","hasInternalTarget","TableCellSelectionHandler","cellSelection","lazyRoot","Selections","cellsDom","otherCellsDom","cellArr","fireTableSelectionChange","fireTableSelectionClear","mouseHandlers","keyHandlers","handleResponse","hasShiftKey","ns","isLeftMouse","doubleTap","lastTarget","lastTimeStamp","touchEnd","lT","lTS","timeStamp","getDoubleTap","wrappedEvent","addTempAttr","onMultiple","onSingle","Event","trigger","typeDefs","baseWith","handleUnsupported","validateStrArr","everything","checkDupes","reqMessage","invalidKeys","incorrect","invalidTypeMessage","handleExact","unsuppMessage","exactly","DragMode","DragSink","DragApi","InDrag","compare","Movement","noDragState","NoDrag","inDragState","mutation","throttledDrop","runIfActive","namespace","dashNamespace","resolve$1","MouseDrag","layerClass","Blocker","mdown","mup","mmove","mout","BarMutation","drag","Mutation","assign","resizeBar","resizeRowBar","resizeColBar","wire","drawBar","cpOption","cp","refreshCol","colPositions","tableHeight","colBar","refreshRow","rowPositions","tableWidth","rowBar","refreshGrid","warhouse","isResizable","resizableRowBars","resizableRows","resizableRowPositions","_pos","barIndex","resizableColBars","resizableCols","colElmOpt","resizableColumns","resizableColPositions","bars","resizeBarDragging","BarManager","hoverTable","getResizer","_dataRow","_dataCol","currentCol","startAdjust","isColBar","tbl","hideBars","showBars","TableResize","lazySizing","hdirection","vdirection","beforeResize","afterResize","startDrag","refreshBars","ResizeWire","chrome","createContainer","barResizerPrefix","TableResizeHandler","selectionRng","tableResize","resizeWire","startW","startRawW","startH","startRawH","lazyResizingBehaviour","afterCornerResize","isRightEdgeResize","isPercentage$1","percentW","isPixel","computedWidth","syncTableCellPixels","sz","rawWire","objectResizing","hasTableObjectResizing","rawTable","fireObjectResizeStart","fireObjectResized","setupTable","lookupOnSelection","registerQueryCommands","DomModel","tinymceInit","language","language_url","promotion","plugins","color_cols","skin_url","content_css","convert_unsafe_embeds","Turbo","drive","progressBarDelay","turboConfirmationDialog","application","Application","require","definitionsFromContext","DayJS","customParseFormat","locale","IconManager","datePickerOptions","clearBtn","weekStart","maxViewMode","autoclose","todayHighlight","keyboardNavigation","orientation","forceParse","toDisplay","date","toValue","$","datepicker","initDatepicker","dateValue","setDate","inputEl","startDate","endDate","serverField","dataKey","dataVal","insertAdjacentElement","dateStartDate","dateEndDate","toDate","typeOf$1","eqString","eqArray","eqa","eqSortedArray","compareFn","contramap","eqRecord","kx","ky","q","eqAny","tx","isEquatableType","is$4","isArray$1","compose1","map$3","each$e","partition$2","filter$5","findUntil$1","findIndex$2","unique$1","isDuplicated","hasOwnProperty$1","each$d","filter$4","stringArray","isArrayLike","each$c","filter$3","reduce","iteratee","accumulator","trim$4","lTrim","rTrim","isEmpty$3","toInt","radix","platform$4","platform$3","browser$3","os$1","windowsPhone","Env","transparentSrc","documentMode","cacheSuffix","canHaveCSP","trim$3","walk$4","delim","resolvedItems","hasOwn","exts","ext","walk","_addCacheSuffix","isHTMLElement$1","isElement$7","isText$c","isDocument$2","isDocumentFragment$1","set$3","remove$9","clone$4","read$4","remove$8","fromDom$2","recurse","parents$1","prevSiblings","nextSiblings","lastChild","childNodesCount","getStyleContainer","getHead","ancestor$4","descendant$2","ancestor$3","isEditable$2","intoView","alignToTop","scrollIntoViewIfNeeded","sibling$1","DomTreeWalker","prev2","findSibling","findPreviousNode","startName","siblingName","zeroWidth","nbsp","isZwsp$2","char","whiteSpaceRegExp","isWhitespaceText","isNewLineChar","normalize$4","tabSpaces","isStartOfContent","isEndOfContent","tabSpace","repeat","normalizedText","isCollapsibleWhitespace$1","pcIsSpace","isNewline","isNodeType","isRestrictedNode","isElement$6","matchNodeName","lowerCasedName","matchNodeNames","lowerCasedNames","matchStyleValues","computed","isBogus$1","isTable$2","isTextareaOrInput","isText$b","isCData","isPi","isDocument$1","isBr$6","isImg","isContentEditableTrue$3","isContentEditableFalse$b","isTableCell$3","isTableCellOrCaption","isMedia$2","isListItem$2","isDetails","isSummary$1","defaultOptionValues","skipBogus","includeZwsp","checkRootAsContent","isBookmark","isWhitespace$1","rootElement","whitespaceElements","getWhitespaceElements","hasWhitespacePreserveParent","isText$a","isZwsp$1","isContentNode","isContent","getNonEmptyElements","isNonEmptyElement$1","isNamedAnchor","hasNonEditableParent","isEmptyNode","opts","brCount","bogusValue","isEmpty$2","isContent$1","isNonHtmlElementRootName","isNonHtmlElementRoot","toScopeType","namespaceElements","transparentBlockAttr","makeSelectorFromSchemaMap","elementNames","updateTransparent","blocksSelector","updateBlockStateOnChildren","transparentSelector","getTransparentElements","getBlockElements","trimEdge","leftSide","childPropertyName","splitInvalidChildren","transparentBlocks","blocksElements","transparentBlock","invalidChildren","isValidChild","stateScope","parentElm","splitElm","beforeFragment","extractContents","afterFragment","split$2","updateChildren","isTransparentBlock","isTransparentInline","unwrapInvalidChildren","updateElement","isTransparentElement","hasBlockAttr","isTransparentElementName","isTransparentAstBlock","browser$2","firstElement","hasChild","castOffsetParent","bodyTop","captionTop","captionHeight","getTableCaptionDeltaY","StyleSheetLoader","documentOrShadowRoot","idCount","loadedStates","edos","addStyle","removeStyle","styleContainer","getOrCreateState","passed","failed","urlWithSuffix","onload","onerror","linkElem","contentCssCors","referrerPolicy","styleElem","loadAll","urls","allSettled","reason","unloadAll","_setReferrerPolicy","_setContentCssCors","instance","WeakMap","forElement","referenceElement","rootDom","sl","create$c","isInlineContent","isBookmarkNode$2","isSpan","isKeepTextNode","prevIsInline","nextIsInline","surroundedByInlineContent","trimNode","isKeepElement","makeMap$3","attrsCharsRegExp","textCharsRegExp","rawCharsRegExp","entityRegExp","asciiMap","baseEntities","reverseEntities","buildEntitiesLookup","itemList","chr","fromCharCode","entity","namedEntities","encodeRaw","encodeNumeric","charCodeAt","encodeNamed","entities","resolveEntities","Entities","getEncodeFunc","entitiesMap","encodeNamedAndNumeric","encodeCustomNamed","nameMap","named","numeric","decode","charAt","nativeDecode","split$1","patternToRegExp","deepCloneElementRule","helper","isRegExp$1","getGlobalAttributeSet","getElementSetsAsStrings","blockContent","phrasingContent","flowContent","getElementSets","toArr","cachedSets","getElementsPreset","parseValidChild","preset","parseValidElementsRules","globalElement","validElements","elementRuleRegExp","elementName","outputName","attrsPrefix","attrData","attributesOrder","cloneAttributesInto","paddEmpty","removeEmpty","removeEmptyAttrs","targetElement","attrRuleRegExp","hasPatternsRegExp","attrType","attrPrefix","attributesRequired","attributesDefault","defaultValue","attributesForced","forcedValue","validValues","attrPattern","attributePatterns","parseValidElementsAttrDataIntoElement","aliasName","mapCache","makeMap$2","each$b","extend$2","explode$2","createMap","extendWith","getTextRootBlockElements","getTextBlockElements","compileElementMap","Schema","patternElements","customElementsMap","specialElements","createLookupTable","schemaType","schemaItems","globalAttributes","addElement","childNames","ni","allAttributes","addAttrs","schemaItem","video","audio","script","makeSchema","verify_html","valid_elements","validStyles","valid_styles","invalidStyles","invalid_styles","validClasses","valid_classes","whitespaceElementsMap","selfClosingElementsMap","voidElementsMap","boolAttrMap","nonEmptyOrMoveCaretBeforeOnEnter","nonEmptyElementsMap","moveCaretBeforeOnEnterElementsMap","headings","textBlockElementsMap","blockElementsMap","textInlineElementsMap","transparentElementsMap","wrapBlockElementsMap","addValidElements","patternElement","setValidElements","addCustomElement","text_block_elements","block_elements","extends","cloneName","customRule","processAttrName","globalAttrs","padEmpty","customElementChildren","processNodeName","processPreset","elmName","addCustomElementsFromString","customElements","customElementRegExp","parseCustomElementsRules","addCustomElements","addValidChildren","validChildren","childRuleRegExp","prefixToOperation","validChild","parseValidChildrenRules","getElementRule","getValidStyles","getInvalidStyles","getValidClasses","getBoolAttrs","getVoidElements","getSelfClosingElements","getMoveCaretBeforeOnEnterElements","getWrapBlockElements","getSpecialElements","attrPatterns","getCustomElements","padd_empty_block_inline_children","paddInEmptyBlock","custom_elements","valid_children","extended_valid_elements","dd","dt","li","th","tfoot","legend","area","param","parentsRequired","invalid_elements","isWrapper","rgbaToHexString","Styles","urlOrStrRegExp","styleRegExp","trimRightRegExp","encodingLookup","invisibleChar","encodingItems","isEncoded","urlConverter","url_converter","urlConverterScope","url_converter_scope","compress","noJoin","canCompress","keepSlashes","decodeSingleHexSequence","escSeq","decodeHexSequences","processUrl","url2","url3","str2","lastIndex","force_hex_color","serializeStyles","elemName","validStyleList","styleList","styleMap","deprecated","keyLocation","layerX","layerY","returnValue","webkitMovementX","webkitMovementY","keyIdentifier","mozPressure","needsNormalizing","initEvent","isNativeEvent","clone$3","originalEvent","getModifierState","keyArg","getTargetRanges","normalize$3","fallbackTarget","srcElement","defaultPrevented","cancelBubble","isImmediatePropagationStopped","hasIsDefaultPrevented","mouseEventRe","addEvent","removeEvent","fix","isMouseEvent","eventDoc","bindOnReady","eventUtils","domLoaded","readyHandler","readyState","EventUtils","expando","hasFocusIn","callbackList","defaultNativeHandler","executeHandlers","namesList","nativeHandler","fakeName","eventMap","ci","newCallbackList","fire","parentWindow","each$a","internalStyleName","numericalCssMap","legacySetAttribute","camelCaseToHyphens","findNodeIndex","normalized","lastNodeType","updateInternalStyleAttr","applyStyle$1","$elm","cssName","cssValue","normalizedName","convertStyleToString","DOMUtils","addedStyles","counter","boundEvents","ownEvents","getElementById","_get","defaultVal","attrHooks","getAttribs","setAttrib","originalValue","onSetAttrib","attrElm","root_element","getPos$1","getSize","collect","resolvedRoot","selectorVal","_findSib","setHTML","keepChildren","$node","oldElm","replaceChild","rv","boundTarget","boundName","boundFunc","getContentEditable","stdMode","boxModel","getViewPort","argWin","getPrev","outHtml","createFragment","frag","setStyle","update_styles","setStyles","stylesArg","removeAllAttribs","removeAttributeNode","serializeStyle","styleElm","styleSheet","loadCSS","catch","hasClass","uniqueId","getOuterHTML","setOuterHTML","insertAfter","reference","referenceNode","rename","attrNode","findCommonAncestor","pe","nodeIndex","replacementElm","getContentEditableParent","isChildOf","dumpRng","keepValues","keep_values","keepUrlHook","sugarElm","setupAttrHooks","DOM$b","ScriptLoader","states","queue","scriptLoadedCallbacks","queueLoadedCallbacks","loading","loadScript","cleanup","isDone","markDone","loadQueue","loadScripts","scripts","execCallbacks","processResults","failures","processQueue","nextQueuedItem","uniqueScripts","currentCode","getLanguageData","I18n","setCode","newCode","getCode","langData","lcNames","translation","firstIndex","getLangData","textStr","removeContext","isTokenised","$1","$2","hasCode","AddOnManager","_listeners","runListeners","matchedListeners","isLoaded","loadLanguagePack","languages","waitFor","isAdded","requireLangPack","languageLoad","addOn","createUrl","baseUrl","resource","addOnUrl","urlString","PluginManager","ThemeManager","ModelManager","repeatable","intervalId","clearInterval","functionToRepeat","setInterval","first$1","annotation","dataAnnotation","dataAnnotationId","dataAnnotationActive","dataAnnotationClasses","dataAnnotationAttributes","isRoot$1","annotationName","an","newStart","findMarkers","isBogusElement","findAll","nodesAlready","setup$y","changeCallbacks","withCallbacks","updateCallbacks","callbackMap","outputData","toggleActiveAttr","onNodeChange","getNames","fireNoAnnotation","fireCallbacks","addListener","shallow$1","deep$1","TextWalker","TextSeeker","isBlockBoundary","newOffset","backwards","forwards","lazyLookup","isBr$5","isTextBlock$2","isListItem$1","isTableSection","isTableCell$2","isWsPreserveElement","removeTrailingBr","allBrs","brs","rawNode","getLastChildren$1","createPaddingBr","fillWithPaddingBr","ZWSP$1","isZwsp","trim$2","isElement$5","isText$9","isCaretContainerBlock$1","isCaretContainerInline","isCaretContainer$2","hasContent","isBeforeInline","isAtStart","isAfterInline","isAtEnd","startsWithCaretContainer$1","endsWithCaretContainer$1","showCaretContainerBlock","caretContainer","lastBr","trimBogusBr","isRangeInCaretContainerBlock","round$2","isValidOverflow","rect1","rect2","isAbove$1","halfHeight","isBelow$1","distanceToRectEdgeFromXY","cx","cy","getSelectedNode","getNode$1","safeOffset","clamp$2","extendingChars","isExtendingChar","isContentEditableTrue$2","isContentEditableFalse$a","isBr$4","isText$8","isInvalidTextElement","isAtomicInline","isCaretContainer$1","isCaretCandidate$3","isNonUiContentEditableFalse","isUnselectable","isEditableCaretCandidate$1","isInEditable","isElement$4","isCaretCandidate$2","isBlock$2","isFloated","isValidElementCaretCandidate","isNotPre","isText$7","isBr$3","nodeIndex$1","resolveIndex$1","createRange$1","isWhiteSpace$1","isRange","isHiddenWhiteSpaceRange","isZeroRect","getBoundingClientRect$1","clientRect","clientRects","brNode","nbsp$1","getBrClientRect","ec","so","eo","newRng","getBoundingClientRectWebKitText","collapseAndInflateWidth","newClientRect","getCaretPositionClientRects","caretPosition","addUniqueAndValidRect","addCharacterOffset","beforeNode","CaretPosition","toRange","isEqual","fromRangeStart","fromRangeEnd","pos1","pos2","isTextPosition","isElementPosition","trimEmptyTextNode$1","rangeInsertNode","insertNode","insertFragment","isText$6","isBogus","normalizedParent","equal","createPathItem","numTextFragments","normalizedNodeIndex","create$a","outputOffset","normalizedTextOffset","parentsUntil$1","resolvePathItem","nodeOffset","targetOffset","dataLen","findTextPosition","isContentEditableFalse$9","getPoint","trimmedOffset","getNormalizedTextOffset$1","moveEndPoint$1","normalizeTableCellSelection","getOffsetBookmark","findAdjacentContentEditableFalseElm","forward","fakeCaret","isFakeCaret","getLocation","createBookmarkSpan","filled","getPersistentBookmark","rng2","endBookmarkNode","startBookmarkNode","keep","getBookmark$2","getCaretBookmark","getRangeBookmark","getUndoBookmark","isInlinePattern","isBlockPattern","normalizePattern","formatOrCmd","onFormat","onCommand","commandValue","getBlockPatterns","getInlinePatterns","filterByTrigger","blockPatterns","hasBlockTrigger","fromRawPatterns","deviceDetection$1","DOM$a","isRegExp","stringOrObjectProcessor","bodyOptionProcessor","bodyObj","getHash","getIframeAttrs","getDocType","getDocumentBaseUrl","getBodyId","getBodyClass","getContentSecurityPolicy","shouldPutBrInPre$1","getForcedRootBlock","getForcedRootBlockAttrs","getNewlineBehavior","getBrNewLineSelector","getNoNewLineSelector","shouldKeepStyles","shouldEndContainerOnEmptyBlock","isAutomaticUploadsEnabled","shouldReuseFileName","shouldReplaceBlobUris","getIconPackName","getIconsUrl","getImageUploadUrl","getImageUploadBasePath","getImagesUploadCredentials","getImagesUploadHandler","shouldUseContentCssCors","getReferrerPolicy","getLanguageCode","getLanguageUrl","shouldIndentUseMargin","getIndentation","getContentCss","getContentStyle","getFontCss","getDirectionality","getInlineBoundarySelector","getObjectResizing","getResizeImgProportional","getPlaceholder","getEventRoot","getServiceMessage","getTheme","getThemeUrl","getModel","getModelUrl","isInlineBoundariesEnabled","getFormats","getPreviewStyles","canFormatEmptyLines","getFormatNoneditableSelector","getCustomUiSelector","isInline$1","hasHiddenInput","shouldPatchSubmit","shouldAddFormSubmitTrigger","shouldAddUnloadTrigger","getCustomUndoRedoLevels","shouldDisableNodeChange","isReadOnly$1","hasEditableRoot$1","hasContentCssCors","getPlugins","getExternalPlugins$1","shouldBlockUnsupportedDrop","isVisualAidsEnabled","getVisualAidsTableClass","getVisualAidsAnchorClass","getIframeAriaText","getSetupCallback","getInitInstanceCallback","getUrlConverterCallback","getAutoFocus","shouldBrowserSpellcheck","getProtect","shouldPasteBlockDrop","shouldPasteDataImages","getPastePreProcess","getPastePostProcess","getNewDocumentContent","getPasteWebkitStyles","shouldPasteRemoveWebKitStyles","shouldPasteMergeFormats","isSmartPasteEnabled","isPasteAsTextEnabled","getPasteTabSpaces","shouldAllowHtmlDataUrls","getTextPatterns","getTextPatternsLookup","getNonEditableClass","getEditableClass","getNonEditableRegExps","shouldPreserveCData","shouldHighlightOnFocus","shouldSanitizeXss","shouldUseDocumentWrite","getAllowedImageFileTypes","hasTableTabNavigation","getDetailsInitialState","getDetailsSerializedState","shouldForceHexColor","shouldSandboxIframes","getSandboxIframesExclusions","shouldConvertUnsafeEmbeds","isElement$3","isText$5","removeNode$1","trimCount","trimmedText","deleteZwspChars","deleteData","removeUnchanged","removeElementAndReposition","newPosition","indexOf$1","removeTextCaretContainer","removeTextAndReposition","removeAndReposition","removeElementCaretContainer","caretContainerNode","isContentEditableFalse$8","isMedia$1","isTableCell$1","getAbsoluteClientRect","scrollX","scrollY","rootRect","FakeCaret","lastVisualCaret","cursorInterval","caretBlock","fakeCaretTargetNodes","trimInlineCaretContainers","caretState","startBlink","textNode","splitText","insertInline$1","isInlineFakeCaretTarget","blockName","blockNode","insertBlock","getCss","isFakeCaretTableBrowser","isFakeCaretTarget","isContentEditableTrue$1","isContentEditableFalse$7","isMedia","isBlockLike","isCaretContainer","isCaretContainerBlock","isElement$2","isText$4","isCaretCandidate$1","isForwards","isBackwards","skipCaretContainers","findNode","predicateFn","isCefOrCaretContainer","getParentBlock$3","isInSameBlock","caretPosition1","caretPosition2","getChildNodeAtRelativeOffset","relativeOffset","beforeAfter","isNodesInSameBlock","node1","node2","lean","before$2","normalizeRange","leanLeft","leanRight","getRelativeCefElm","getNormalizedRangeEndPoint","normalizedRange","getElementFromPosition","getVisualCaretPosition","walkFn","isMoveInsideSameBlock","inSameBlock","HDirection","isContentEditableFalse$6","isText$3","isBr$2","isCaretCandidate","isAtomic","isAtomicContentEditableFalse","isEditableCaretCandidate","nodeAtIndex","getCaretCandidatePosition","findCaretPosition$1","startPos","innerNode","Forwards","moveForwardFromBr","rootContentEditableFalseElm","getParents$3","CaretWalker","Backwards","isBeforeOrStart","isAfterOrEnd","isBeforeAfterSameElement","shouldSkipPosition","fromPosition","navigateIgnore","ignoreFilter","positionIn","walkToPositionIn","nextPosition","prevPosition","firstPositionIn","lastPositionIn","CARET_ID","isCaretNode","getParentCaretContainer","isIndexBookmark","isPathBookmark","isForwardBookmark","addBogus","tryFindRangePosition","padEmptyCaretContainer","isEmpty$1","insertZwsp","setEndPoint","isValidTextNode","restoreEndPoint","markerParent","otherMarker","appendData","resolvePaths","isStringPathBookmark","endPos","resolveCaretPositionBookmark","isIdBookmark","spos","epos","resolveId","resolveIndex","isRangeBookmark","getBookmark$1","isBookmarkNode$1","isNbsp","expected","isWhiteSpace","getRanges$1","getCellsFromRanges","getSelectedNodes","getCellsFromElementOrRanges","getCellsFromEditor","getSel","getClosestTable","getFirstChildren","getLastChildren","hasAllContentsSelected","getStartNode","getEndNode","endNode","moveEndPoint","hasAnyRanges","runOnRanges","fakeSelectionNodes","fakeNodeRng","fillBookmark","isNode","isElementNode$1","preserveSelection","shouldMoveStart","selectedNodeBeforeAction","isSelectedBeforeNodeNoneditable","moveStartToNearestText","selectedAttr","isElementDirectlySelected","isWhiteSpaceNode$1","getNonWhiteSpaceSibling","inc","nextName","isTextBlock$1","allowSpaces","isWrappableNoneditable","baseDataSelector","formatNoneditableSelector","isWrapNoneditableTarget","replaceVars","vars","isEq$5","str1","normalizeStyleValue","strValue","getTextDecoration","decoration","getParents$2","isFormatPredicate","areSimilarFormats","otherFormatName","filterObj","validKey","fmt1","filteredFmt1","fmt2","filteredFmt2","equal$1","shouldExpandToSelector","isCaretContainerEmpty","getEmptyCaretContainers","isEmptyCaretFormatElement","isBookmarkNode","getParents$1","isWhiteSpaceNode","isTextBlock","findParentContentEditable","walkText","findSpace","findContent","findWordEndPoint","includeTrailingSpaces","lastTextNode","textSeeker","textOffset","findSelectorEndPoint","formatList","curFormat","findBlockEndPoint","scopeRoot","isAtBlockBoundary$1","findParentContainer","block_expand","isSelfOrParentBookmark","expandRng","includeTrailingSpace","walk$3","firstNode","collectSiblings","siblings","findEndPoint","walkBoundary","startPoint","endPoint","validBlocks","wrapName","isZeroWidth","isAnnotation","applyAnnotation","masterUId","decorate","directAnnotation","otherData","attributeNames","removeDirectAnnotation","customAttrNames","customClasses","makeAnnotation","eDoc","master","annotate","newWrappers","finishWrapper","processElements","processElement","processNodes","annotateWithBookmark","initialRng","hasFakeSelection","masterUid","applyWordGrab","Annotator","create$b","dataAnnotation$1","identifyParserNode","newClassList","addAttributeFilter","setup$x","removeAnnotations","annotationChanged","removeAll","BookmarkManager","isXYWithinRange","containsXY","fireError","errorType","fireFormatApply","fireFormatRemove","fireSetContent","fireGetContent","fireAutocompleterUpdateActiveRange","firePastePlainTextToggle","VK","DELETE","ESC","SPACEBAR","PAGE_UP","PAGE_DOWN","END","HOME","modifierPressed","elementSelectionAttr","resizeHandles","nw","ne","sw","ControlSelection","editableDoc","rootDocument","selectedElmGhost","resizeHelper","selectedHandle","resizeBackdrop","startX","startY","resizeStarted","startScrollWidth","startScrollHeight","isImage","contextMenuSelectImage","isEventOnImageOutsideRange","getResizeTargets","setSizeProp","setGhostElmSize","ghostElm","resizeGhostElement","proportional","resizeHelperX","resizeHelperY","screenX","screenY","selectedElmX","selectedElmY","scrollWidth","endGhostResize","wasResizeStarted","showResizeRect","unbindResizeHandleEvents","targetWidth","targetHeight","hideResizeRect","createGhostElement","handleElm","throttledShowResizeRect","removeSelected","isChildOrEqual","updateResizeRect","composing","controlElm","disableGeckoResize","startElm","getStart$1","fromElements","toNative","getDomRange","fromPoint$1","isEq$4","rng1","hasParent$1","findParent","hasParentWithName","isCeFalseCaretContainer","hasBrBeforeAfter","findTextNodeRelative","isAfterNode","lastInlineElement","parentBlockContainer","normalizeEndPoint","directionLeft","hasContentEditableFalseParent","isPrevNode","normalize$2","normRng","newContainer","RangeUtils","rangeLike","newRange","normalizedRng","compareRanges","getCaretRangeFromPoint","excludeFromDescend","markerInfo","cleanupFun","createMarker$1","withMarker","preserveWith","_s","applyWithMarker","withScrollEvents","fireScrollIntoViewEvent","fireAfterScrollIntoViewEvent","elementMarker","startElement","endElement","scrollToMarker","intoWindowIfNeeded","viewportBottom","largerThanViewport","intoWindow","intoFrame","frameViewHeight","op","rangeIntoWindow","elementIntoWindow","rangeIntoFrame","elementIntoFrame","scrollRangeIntoView","hasFocus$1","clamp$1","normalizeRng","isOrContains","isRngInRoot","nativeRangeToSelectionRange","bookmarkToNativeRng","newBookmark","shouldStore","FocusManager","isEditorUIElement","Delay","wrappedSetTimeout","setEditorInterval","wrappedSetInterval","throttledStore","mouseUpPage","registerPageMouseUp","registerMouseUp","selectionChange","isManualNodeChange","registerEditorEvents","documentFocusInHandler","DOM$9","isEditorContentAreaElement","isUIElement","customSelector","getActiveElement","registerEvents$1","toggleContentAreaOnFocus","focusedEditor","blurredEditor","activeEditor","unregisterDocumentEvents","getFocusInElement","getCollapsedNode","normalizeSelection","caretPos","focusBody","hasElementFocus","rawBody","hasInlineFocus","hasIframeFocus","hasEditorOrUiFocus","hasUiFocus","activateEditor","quirks","refreshContentEditable","bookmarkRng","contentEditableHost","getContentEditableHost","focusEditor","isEditableRange","getEndpointElement","real","skipEmptyTextNodes","processRanges","typeLookup","walk$2","isEmptyTextNode","isNonEmptyElement","AstNode","selfAttrs","cloneAttrs","selfAttr","refNode","whitespace","unescapedTextParents","containsZwsp","getTemporaryNodeSelector","tempAttrs","createZwspCommentWalker","createTreeWalker","FILTER_ACCEPT","FILTER_SKIP","createUnescapedZwspTextWalker","hasZwspComment","hasUnescapedZwspText","hasTemporaryNode","trimTemporaryNodes","getTemporaryNodes","emptyAllNodeValuesInWalker","curr","emptyZwspComments","emptyUnescapedZwspTexts","conditionalTrims","condition","trimmed","cloned","cleanupBogusElements","bogusElements","cleanupInputNames","inputs","getPlainTextContent","offscreenDiv","getContentFromBody","getTempAttrs","emptyRegExp","trimEmptyContents","makeMap$1","Writer","indent","indentBefore","indent_before","indentAfter","indent_after","entity_encoding","htmlOutput","element_format","cdata","comment","pi","HtmlSerializer","writer","sortedAttrs","elementRule","nonInheritableStyles","Set","shorthandStyleProps","getStyleProps","hasInheritableStyles","isNonInheritableStyle","hasStyleConflict","nodeStyleProps","parentNodeStyleProps","valueMismatch","parentValue","nodeStyleProp","propExists","longhandProps","isChar","isBeforeSpace","isAfterSpace","isEmptyText","matchesElementPosition","isImageBlock","isCefNode","isBogusAll","isBeforeImageBlock","isAfterImageBlock","isBeforeMedia","isAfterMedia","isBeforeTable","isAfterTable","isBeforeContentEditableFalse","isAfterContentEditableFalse","parentsUntil","parentsAndSelf","navigateIgnoreEmptyTextNodes","getClosestBlock$1","isAtBeforeAfterBlockBoundary","fromBlock","isAtBlockBoundary","isAtStartOfBlock","isAtEndOfBlock","isBeforeBlock","isAfterBlock","isBr$1","parentBlocks","isBeforeBr$1","isAfterBr","getElementFromPrevPosition","findPreviousBr","findNextBr","isInMiddleOfText","getClosestBlock","hasSpaceBefore","hasSpaceAfter","isInPre","isPreValue","isAtLineBoundary","isAtBeginningOfBody","isAtEndOfBody","isSiblingCefBlock","needsToHaveNbsp","needsToBeNbspLeft","isPrevCefBlock","isAfterCefBlock","needsToBeNbspRight","nextPos","isNextCefBlock","isBeforeCefBlock","needsToBeNbsp","isNbspAt","isWhiteSpaceAt","normalizeNbspAtStart","makeNbsp","firstPos","normalizeNbspInMiddleOfTextNode","newText","chars","normalizeNbspMiddle","normalizeNbspAtEnd","lastPos","normalizeNbsps","hasNbsp","normalize$1","replaceData","normalizeWhitespaceAfter","whitespaceCount","normalizeWhitespaceBefore","mergeTextNodes","prevNode","normalizeWhitespace","mergeToPrev","whitespaceOffset","newNode","removeNode","insertData","needsReposition","getPreviousSiblingCaretPosition","getNextSiblingCaretPosition","findCaretPositionBackwards","findCaretPositionBackwardsFromElm","findCaretPositionForward","findCaretPositionForwardsFromElm","findCaretPosOutsideElmAfterDelete","findCaretPosition","setSelection$1","deleteNormalized","afterDeletePosOpt","prevTextOpt","nextTextOpt","deleteElement$2","moveCaret","preserveEmptyCaret","afterDeletePos","normalizedAfterDeletePos","isInlineElement","paddEmptyBlock","paddPos","strongRtl","isInlineTarget","hasStrongRtl","findRootInline","findInlineParents","normalizePosition","normalizeForwards","normalizeBackwards","execCommandIgnoreInputEvents","inputBlocker","execNativeDeleteCommand","isTextBlockOrListItem","getParentBlock$2","isBeforeRoot","paddEmptyBody","moveSelection","no_selection","willDeleteLastPositionInElement","fromPos","normalizedFirstPos","normalizedLastPos","normalizedFromPos","freefallRtl","deleteRangeContents","deleteContents","lastBlock","additionalCleanupNodes","getTableCells","getTable$1","adjustQuirksInDetails","endTable","isStartTableParentOfEndTable","isEndTableParentOfStartTable","isSameTable","isMultiTable","selectionInTableWithNestedTable","tableCellRng","deleteAction","singleCellTable","fullTable","partialTable","multiTable","getClosestCell$1","isExpandedCellRng","cellRng","getTableFromCellRng","startParentTable","endParentTable","getTableSelectionFromCellRng","tableSelection","getTableSelections","selectionDetails","sameTableSelection","endCell","startTableSelection","getCellRangeFromStartTable","endTableSelection","getCellRangeFromEndTable","getCellIndex","isSingleCellTableContentSelected","optCellRng","isSingleCellTable","unselectCells","otherContentRng","getActionFromRange","isRootFromElement","getCellRng","isStartInTable","isEndInTable","getTableDetailsFromRange","startTableSelectedCells","endTableSelectedCells","handleMultiTable","handleSingleTable","cleanCells","deleteContentInsideCell","isFirstCellInSelection","insideTableRng","deleteCellContents","collapseAndRestoreCellSelection","selectedNode","emptySingleTableCells","outsideDetails","editorRng","cellsToClean","outsideBlock","getOutsideBlock","startInTable","emptyBlock","handleEmptyBlock","endPointCell","emptyMultiTableCells","startTableCells","endTableCells","betweenRng","startTableCellsToClean","endTableCellsToClean","deleteTableElement","deleteTableRange","getParentCaption","deleteCellRange","emptyElement","deleteCaptionRange","getParentCell","deleteCaretInsideCaption","fromCaption","isDeleteOfLastCharPos","emptyCaretCaption","toCaption","validateCaretCaption","deleteCaretCells","fromCell","deleteBetweenCells","isNearTable","deleteCaret$3","isBeforeOrAfterTable","deleteCaretCaption","backspaceDelete$a","deleteRange$3","getContentEditableRoot$1","internalAttributesPrefixes","each$9","ElementUtils","internalAttributes","isAttributeInternal","attribs","compareObjects","obj1","obj2","isHeading","matchNode$1","nodeFilters","attributeFilters","nl","ai","runFilters","matchRecord","filteringAttributes","childNode","findMatchingNodes","paddEmptyNode","pad_empty_with_br","astNode","hasOnlyChild","nonEmptyElements","isPadded","findClosestEditingHost","editableNode","removeOrUnwrapInvalidNode","originalNodeParent","cleanInvalidNodes","onCreate","textBlockElements","nonSplittableElements","isSplittableElement","newParent","hasClosest","isSummary","normalizeBlockSelectionRange","commonAncestorContainer","newEndPos","isPaddedEmptyBlock","hasOnlyOneChild$1","isPaddingNode","isListFragment","isEmptyFragmentElement","isListItemPadded","isPadding","trimListItems","getParentLi","findLastOf","newCaretPos","insertBefore$2","findFirstIn","insertAtCaret$1","domFragment","cleanupDomFragment","toDomFragment","liTarget","liElms","isAt","caretWalker","newPosNode","insertAfter$2","beforeRng","afterRng","getSplit","insertMiddle","mergeableWrappedElements","isTableCell","trimBrsFromTableCell","lastChildPrevSibling","trimBlockTrailingBr","moveSelectionToMarker","nextRng","parentEditableElm","isCell","isPartOfFragment","findNextCaretRng","deleteSelectedContent","isTableCellContentSelected","insertHtmlAtCaret","parser","bookmarkHtml","preserve_zwsp","caretElement","canHaveChildren","parserArgs","isParentBlockLi","isPastingSingleElement","isWrappedElement","isPastingInTheSameBlockTag","isPastingInContentEditable","shouldPasteContentOnly","markFragmentElements","_selectionOverrides","showBlockCaretContainer","notHeadingsInSummary","markerNode","findMarkerNode","editingHost","toExtract","getNodeFilters","getAttributeFilters","validInsertion","textInlineElements","elementUtils","reduceInlineTextElements","caretParent","updateCaret","isTreeNode","setEditorHtml","noSelection","setContentInternal","trimmedHtml","setContentTree","padd","forcedRootBlockName","isRootContent","setContentString","isEq$3","matchesUnInheritedFormatSelector","inherit","matchParents","similar","matchedNode","matchNode","matchName","matchItems","matchAttributes","onmatch","expectedValue","isEmptyValue","match$2","rawElm","matchAllOnNode","formatNames","matchSimilar","isVariableValue","fieldValues","isVariableFormatName","ZWSP","findFirstTextNode","createCaretContainer","fill","removeCaretContainerNode","trimZwspFromCaretContainer","removeCaretContainer","appendNode","insertFormatNodesIntoCaretContainer","formatNodes","innerMostFormatNode","formatNode","removeCaretFormat","hasContentAfter","expandedRng","parentsAfter","newCaretContainer","insertCaretContainerNode","cleanedFormatNode","validFormats","matchedFormats","fmtName","clonedFormatNode","cleanFormatNode","caretTextNode","setup$v","disableCaretContainer","createCaretFormat","innerMost","replaceWithCaretFormat","isFormatElement","inlineElements","postProcessHooks","isPre","addPostProcessHook","getSelectedBlocks","preBlocks","pre","hasPreSibling","pre1","pre2","sPre2","joinPre","listItemStyles","findExpandedListItemFormat","hasListStyles","getExpandedListItemFormat","isRngStartAtStartOfElement","isRngEndAtEndOfElement","isEditableListItem","getFullySelectedListItems","getFullySelectedBlocks","getPartiallySelectedListItems","each$8","isElementNode","findElementSibling","mergeSiblingsNodes","isPrevEditable","isNextEditable","tmpSibling","mergeSiblings","merge_siblings","processChildElements","hasStyle","applyStyle","unwrapEmptySpan","removeResult","MCE_ATTR_RE","each$7","isEq$2","isChildOfInlineParent","lastIdx","normalizeTableSelection","isTableCellOrRow","wrapWithSiblings","rootBlockElm","forcedRootBlock","list_block","isMixedFormat","processFormatAttrOrStyle","removeEmptyStyleAttributeIfNeeded","removeStyles","compareNode","stylesModified","styleName","styleValue","normalizedStyleValue","remove_similar","removeNodeFormatInternal","ceFalseOverride","isColorFormatAndAnchor","preserveAttributes","preserve_attributes","attrsToPreserve","valueOut","removeNodeFormatFromClone","newName","removeFormatInternal","splitToFormatRoot","formatRoot","findFormatRoot","lastClone","firstClone","formatRootParent","mixed","wrapAndSplit","removeFormatOnNode","removeNodeFormat","currentNodeMatches","textDecoration","isRemoveBookmarkNode","removeRngStyle","liFmt","removeListStyleFormats","removeFormat$1","each$6","mergeWithChildren","clear_child_styles","clearChildStyles","each$5","applyStyles","styleVal","applyFormatAction","setElementFormat","onformat","applyNodeStyle","found","createWrapElement","wrapElm","applyRngStyle","nodeSpecific","isMatchingWrappingBlock","isWrappingBlockFormat","canRenameBlock","isEditableDescendant","isValidBlockFormatForNode","isNonWrappingBlockFormat","currentWrapElm","lastContentEditable","isWrappableNoneditableElm","contentEditableValue","validBRParentElements","hasCaretNodeSibling","canFormatBR","isValidWrapNode","isCaret","isCorrectFormatForNode","canWrapNode","childCount","isEmptyTextNode$1","getChildCount","childElement","mergeStyles","merge_with_parents","mergeWithParents","backgroundColor","hasFontSize","mergeBackgroundColorAndFontSize","processTextDecorationsAndColor","parentTextDecoration","mergeTextDecorationsAndColor","inverseTagDescendants","mergeSubSup","wordcharRegex","applyCaretFormat","fake","postProcess$1","applyFormat$1","hasVars","fallbackElement","matchingNode","matchingFormat","updateAndFireChangeCallbacks","registeredCallbacks","runIfChanged","withSimilar","withoutSimilar","withVars","formatChangedInternal","registeredFormatListeners","formatChangeItems","toAppendTo","addListeners","removeListeners","explode$1","create$8","filters","addFilter","getFilters","removeFilter","newCallbacks","addFontToSpansFilter","domParser","fontSizes","addNodeFilter","face","removeAttrs","addFilters","convert_fonts_to_spans","font_size_legacy_values","convertToSTag","addStrikeFilter","parseDataUri","uri","base64Encoded","extractedData","extractBase64Data","decodeURIComponent","buildBlob","atob","Uint8Array","Blob","uriToBlob","uriType","blobUriToBlob","blobToDataUri","reader","FileReader","onloadend","readAsDataURL","count$1","processDataUri","dataUri","base64Only","generateBlobInfo","base64","btoa","createBlobInfo$1","blobCache","blobInfo","dataUriToBlobInfo","getByData","hostCaptureRegex","extractHost","ms","sandboxIframe","iframeNode","exclusions","isMimeType","mime","createSafeEmbed","sandboxIframes","sandboxIframesExclusions","getEmbedType","embed","registerBase64ImageFilter","blob_cache","processImage","inputSrc","isInternalImageSource","isBogusImage","blobUri","create$7","each$4","queryParts","DEFAULT_PORTS","ftp","http","https","mailto","safeSvgDataUrlElements","isInvalidUri","decodedUri","encodedUri","unescape","decodeUri","allowSvgDataUrls","blockSvgDataUris","URI","uriComponents","pathname","baseUri","isProtocolRelative","toAbsPath","urlMatch","userInfo","setPath","pathMatch","getURI","toRelative","relativeUri","tu","uu","toRelPath","noHost","absoluteUri","defaultPort","breakPoint","normalizedBase","nb","normalizedPath","baseParts","pathParts","outPath","noProtoHost","filteredUrlAttrs","internalElementAttr","processNode","allow_conditional_comments","lcTagName","isInternalElement","bogus","hasNone","shouldKeepAttribute","isRequiredAttributeOfInternalElement","isBooleanAttribute","filterAttributes","setupPurify","namespaceTracker","purify$1","track","processAttr","sanitizeNamespaceElement","xlinkAttrs","getSanitizer","peek","currentScope","createNamespaceTracker","sanitizeHtmlElement","mimeType","getPurifyConfig","_mimeType","extend$1","transferChildren","nativeParent","nsSanitizer","nativeChild","whitespaceCleaner","blockElements","textRootBlockElements","allWhiteSpaceRegExp","startWhiteSpaceRegExp","endWhiteSpaceRegExp","hasWhitespaceParent","isAtEdgeOfBlock","neighbour","isLineBreakNode","isNodeEmpty","isTextRootBlockEmpty","isPaddedWithNbsp","DomParser","nodeFilterRegistry","attributeFilterRegistry","defaultedSettings","root_name","sanitizer","removeNodeFilter","removeAttributeFilter","isWrappableNode","exports","rootName","isSpecialRoot","wrappedHtml","parseAndSanitizeWithContext","whitespacePre","whitespacePost","invalidFinder","findInvalidChildren","matchFinder","preprocessors","postprocessors","traverseOrder","walkTree","topLevelChildren","otherChildren","rootBlockName","forced_root_block","getRootBlockName","rootBlockNode","rootBlock","forced_root_block_attrs","addRootBlocks","addNoOpener","appendRel","allow_unsafe_link_target","allow_html_in_named_anchor","fix_list_elements","classValue","validClassesMap","sandbox_iframes","sandbox_iframes_exclusions","inline_styles","withSerializedContent","fireEvent","parserSettings","serializedContent","serializeContent","eventArgs","makeParserSettings","preProcessGetContent","fireBeforeGetContent","postProcessGetContent","processedEventArgs","preProcessSetContent","fireBeforeSetContent","postProcessSetContent","tableModel","tableRow","cellPosition","cellExists","findElementPos","extractRows","sx","sy","ey","y2","x2","fillout","skipCellsX","toDom","tableElement","tableBody","createDomTable","modelRowsToDomRows","subsection","subTable","getFullySelectedListWrappers","_li","findParentListContainer","listCont","listElm","listStyles","_style","getWrapElements","commonAnchorContainer","wrapElements","listWrappers","allWrappers","directListWrappers","emptyFragment","getFragmentFromRange","innerElm","getTableFragment","selectedTableCells","getParentTable","fullTableModel","sectionedTableModel","read$3","getSelectionFragment","isCollapsibleWhitespace","getInnerText","bin","extractSelectedContent","parentBlockOpt","contextNodeName","getContextNodeName","rangeContentClone","nonRenderedText","parentBlockText","textIndex","tmpElm","getSerializedContent","getOuterHtml","insertAt","fragments","removeAt","applyDiff","vDown","vUp","buildScript","start1","end1","start2","end2","getMiddleSnake","diag","i2","buildSnake","snake","lazyTempDocument","createFromEditor","hasIframes","trimZwsp","beforeBookmark","applyToEditor","getLevelContent","getCleanLevelContent","isEq$1","level1","level2","hasEqualContent","hasEqualCleanedContent","isUnlocked","locks","setTyping","typing","endTyping","makePlainAdaptor","bindEvents","beforeChange","beforeChange$1","currentLevel","newLevel","lastLevel","bm","customUndoRedoLevels","setDirty","addUndoLevel$1","undo","undo$1","redo","redo$1","clear$1","reset$1","hasUndo","hasUndo$1","hasRedo","hasRedo$1","transact$1","ignore$1","callback1","callback2","extra$1","matchAll","matchedFormatNames","checkedMap","getContentInternal","matchedElm","addVisualInternal","defaultedArgs","setupArgs$3","updatedArgs","getSelectedContentInternal","addDecoration","removeDecoration","isRtc","setup$t","editorCast","rtcPlugin","getRtcSetup","rtcInstance","nul","makeNoopAdaptor","rtcEditor","defaultVars","_undoManager","_locks","_node","_similar","_rfl","_details","getRawModel","makeRtcAdaptor","rtc","isRemote","getRtcInstanceWithFallback","getRtcInstanceWithError","getContent$1","getSelectedContent","mergeAndNormalizeText","outerNode","outerElm","oldLength","innerTextNode","walkPastBookmark","normalizeTextIfRequired","setContent$1","setupArgs$2","cleanedContent","contextBlock","contextArgs","cleanContent","prevText","nextText","rngSetContent","createContextualFragment","deleteFromCallbackMap","SelectorChanged","selectorChangedData","currentSelectors","findMatchingNode","selectorChangedWithUnbind","matchedSelectors","isAttachedToDom","EditorSelection","selectedRange","explicitRange","getRng$1","tryCompareBoundaryPoints","how","sourceRange","destinationRange","compareBoundaryPoints","START_TO_START","END_TO_END","isValidRange","anchorRange","focusRange","bookmarkManager","compareEndPoints","fakeSelectedElements","setNode","endElm","selectedBlocks","selectorChanged","getScrollContainer","scrollContainer","scrollElementIntoView","placeCaretAt","controlSelection","htmlParser","internalName","hasChildren","preserve_cdata","remove_trailing_brs","lastParent","process$1","hasEventListeners","shouldFireEvent","oldDoc","clonedNode","impl","firePreProcess","preProcess$1","toHtml","serializeNode","outArgs","firePostProcess","postProcess","DomSerializerImpl","getHtmlFromNode","brNode1","brNode2","trimTrailingBr","parseHtml","addRules","setRules","DomSerializer","domSerializer","setupArgs$1","getContent$2","setupArgs","setContent$2","removedOptions","deprecatedOptions","removedPlugins","deprecatedPlugins","replacedWith","getMatchingOptions","searchingFor","settingNames","setting","getRemovedOptions","getDeprecatedOptions","getMatchingPlugins","pluginNames","plugin","getRemovedPlugins","getDeprecatedPlugins","getPluginDescription","logWarnings","rawOptions","normalizedOptions","hasRemovedPlugins","hasRemovedOptions","isLegacyMobileTheme","theme","listJoiner","themesMessage","pluginsMessage","optionsMessage","logRemovedWarnings","hasDeprecatedPlugins","hasDeprecatedOptions","logDeprecatedWarnings","DOM$8","safeDestroy","editorUpload","save","is_removing","unbindAllNativeEvents","fireRemove","orgDisplay","restoreOriginalStyles","fireDetach","automatic","destroyed","_beforeUnload","_mceOldSubmit","formEventDelegate","restoreForm","clearDomReferences","iconPack","CreateIconManager","propName","getComputedSizeProp","getClientWidth","getClientHeight","getMarginTop","getMarginLeft","isXYInContentArea","bodyElm","transposedPoint","isInsideElementContentArea","isEditorAttachedToDom","rawContainer","NotificationManager","notifications","getImplementation","unimplemented","getTopNotification","closeNotification","otherNotification","addNotification","serviceMessage","WindowManager","WindowManagerImpl","funcBind","addDialog","fireOpenEvent","fireCloseEvent","otherDialog","storeSelectionAndOpenDialog","windowManagerImpl","displayNotification","displayError","logError","createLoadError","initError","toContentSkinResourceName","transformToUrls","cssLinks","contentCssFile","isBundledCssSkinName","isContentCssSkinName","appendContentCssFromSettings","getContentCssUrls","getFontCssUrls","ImageScanner","uploadStatus","cachedPromises","images","getAllImages","isUploaded","promises","imageSrc","imageInfo","newPromise","invalidDataUri","getByUri","imageToBlobInfo","UploadStatus","blobUriStatuses","createStatus","resultUri","hasBlobUri","getResultUri","isPending","markPending","markUploaded","removeFailed","uuid","rnd","seed","Uploader","pendingPromises","defaultHandler","xhr","XMLHttpRequest","withCredentials","credentials","upload","onprogress","json","responseText","path1","path2","basePath","FormData","filename","send","uploadHandler","handlerSuccess","handlerFailure","resolvePending","uploadBlobs","blobInfos","openNotification","pendingUploadBlobInfo","uploadBlobInfo","createUploader","addPaddingToEmpty","isEmptyForPadding","EditorUpload","toBlobInfo","URL","createObjectURL","findFirst","cachedBlobInfo","removeByUri","revokeObjectURL","BlobCache","uploader","imageScanner","urlFilters","aliveGuard","replaceString","replaceImageUrl","targetUrl","replacementUrl","replacementString","replaceUrlInUndoStack","uploadImages","scanForImages","imageInfos","imagesToRemove","shouldDispatchChange","filteredResult","uploadInfo","replaceImageUriInView","uploadError","uploadUri","sugarElement","parentOpt","dispatchChange","uploadImagesAuto","isValidDataUriImage","imgElm","resultItem","replaceBlobUris","source_view","genericBase","cellBase","cellFormats","tablecellbackgroundcolor","tablecellverticalalign","tablecellbordercolor","borderColor","tablecellclass","tableclass","tablecellborderstyle","borderStyle","tablecellborderwidth","borderWidth","FormatRegistry","valigntop","verticalAlign","valignmiddle","valignbottom","alignleft","textAlign","float","marginLeft","marginRight","aligncenter","alignright","alignjustify","bold","fontWeight","italic","fontStyle","underline","strikethrough","strike","forecolor","hilitecolor","fontname","lineheight","lineHeight","fontsize_class","blockquote","subscript","superscript","_fmt","_itemName","removeformat","each$3","isPreviewItem","parsedSelectorToHtml","ancestry","sItem","wrapInHtml","parentCandidate","ancestorName","parentRequired","elmRule","getRequiredParent","siblingElm","parentSiblings","parseSelectorItem","$0","$3","$4","previewCss","previewStyles","removeVars","previewFrag","previewElm","rawParentFontSize","parentFontSize","Formatter","formatChangeState","setup$s","nodeOrRange","setup$u","toggleFormat","matchFormat","closestFormat","matchAllFormats","matchNodeFormat","canApplyFormat","shouldIgnoreCommand","UndoManager","addUndoLevel","isFirstTypedCharacter","addNonTypingUndoLevel","isMeta","isDirty","modKey","inputType","isInsertFromPasteOrDrop","addKeyboardShortcuts","nonTypingKeycodes","placeholderAttr","isKeyboardEvent","isDeleteEvent","setup$r","updatePlaceholder","isNonTypingKeyboardEvent","showPlaceholder","isTypingKeyboardEvent","isVisuallyEmpty","firePlaceholderToggle","blockBoundary","getBlockPosition","containerElm","blockPosition","getClosestHost","readFromRange","fromBlockPos","toBlockPos","blockPos","lastPositionInBlock","skipLastBr","isDifferentBlocks","hasSameHost","isValidBlock","hasValidBlocks","extractChildren","getChildrenUntilBlockBoundary","removeEmptyRoot","nestedBlockMerge","toBlock","insertionPoint","isEmptyBefore","sidelongBlockMerge","getInlineToBlockDescendants","newFromBlockDescendants","getInsertionPoint","parentsAndSelf$1","findInsertionPoint","trimBr","mergeBlockInto","mergeBlocks","block1","block2","backspaceDelete$9","isRawNodeInTable","isEverythingSelected","noPrevious","noNext","isSelectionInTable","deleteRange$2","emptyEditor","deleteRangeMergeBlocks","backspaceDelete$8","_forward","showCaret","getNodeRange","renderRangeCaret","caretPositionNode","caretPositionBeforeNode","ceRoot","renderCaretAtRange","isBeforeBoundary","isAfterBoundary","deleteContentAndShowCaret","peekCaretPosition","caretRange","deleteRange","trimEmptyTextNode","backspaceDelete$7","getNextPosFn","isBeforeFn","nextCaretPosition","normalizedNextCaretPosition","deleteBoundaryText","getEdgeCefPosition","atStart","isCefAtEdgeSelected","DeleteAction","moveToElement","moveToPosition","deleteEmptyBlockOrMoveToCef","toCefElm","blockElm","findCefPosition","isDeleteFromCefDifferentBlocks","getContentEditableAction","caretLocation","isAtContentEditableBlockCaret","getContentEditableBlockAction","skipMoveToActionFromInlineCefToContent","getAncestorCe","backspaceDeleteCaret","hideFakeCaret","deleteElement$1","backspaceDeleteRange","paddEmptyElement","backspaceDelete$6","backspaceDelete$5","deleteCaret$2","isText$2","startsWithCaretContainer","endsWithCaretContainer","createZwsp","insertInline","insertBefore$1","insertAfter$1","insertInlineBefore","insertInlineAfter","insertInlinePos","isPosCaretContainer","caretNode","renderCaret","evaluateUntil","fns","Location","rescope$1","nPos","isNotInsideFormatCaretContainer","findInsideRootInline","start$1","isValidLocation","readLocation","getName","outside","betweenInlines","fromInline","toInline","hasSameParentBlock","skipNoMovement","fromLocation","toLocation","location2","location1","findLocationSimple","findLocation$1","findLocationTraverse","moveRel","modify","moveByWord","hasSelectionModifyApi","BreakType","walk$1","getBreakType","currentPos","Br","Block","Wrap","getPositionsUntil","breakType","breakAt","Eol","getAdjacentLinePositions","getPositionsUntilBreak","findClosestHorizontalPositionFromPoint","lastRect","newRect","lastDist","findClosestHorizontalPosition","targetRect","getPositionsUntilPreviousLine","getPositionsUntilNextLine","getPositionsAbove","getPositionsBelow","isAtFirstLine","isAtLastLine","getClosestPositionAbove","getClosestPositionBelow","isContentEditableFalse$5","distanceToRectLeft$1","distanceToRectRight$1","findClosestClientRect","oldClientRect","oldDistance","newDistance","getNodeClientRects","toArrayWithNode","VDirection","walkUntil","isAboveFn","isBeflowFn","targetClientRect","upUntil","Up","downUntil","Down","getLastClientRect","isAboveLine","lineNumber","aboveLineNumber","isLine","isLineNumber","moveToRange","renderRangeCaretOpt","moveHorizontally","isBefore","isAfter","rangeIsInContainerBlock","moveVertically","caretClientRect","linePositions","nextLinePositions","nextLineRect","dist1","dist2","caretPositions","isBelowFn","positionsUntil","closestNextLineRect","getLineEndPoint","lineInfo","moveToLineEndPoint$3","setCaretPosition","setSelected","renderCaretLocation","findLocation","getPositionFromRange","isInlineTarget$1","safeRemoveCaretContainer","caretValue","isAtZwsp","move$3","moveWord","_caret","setupSelectedState","inlineBoundaries","selectedInlines","targetInlines","toggleInlines","inlines","_inline","renderInsideInlineCaret","moveNextWord","movePrevWord","moveToLineEndPoint$2","linePoint","outsideLoc","setCaretLocation","deleteFromTo","rangeFromPositions","backspaceDeleteCollapsed","rescope","toPosition","hasOnlyTwoOrLessPositionsLeft","backspaceDelete$4","getParentsUntil","hasOnlyOneChild","getParentInlinesUntilMultichildInline","hasMultipleChildren","getFormatNodes","parentInlines","isFormatElement$1","getFormatNodesAtStart","getParentInlines","deleteCaret$1","deleteLastPosition","createCaretFormatAtStart","isBrInEmptyElement","createCaretFormatAtStart$1","rangeStartsAtTextContainer","rangeEndsAtEndOfStartContainer","startParent","endParent","isEqualNode","rangeStartAndEndHaveSameParent","rangeEndsAtEndOfEndContainer","requiresDeleteRangeOverride","rangeStartsAtStartOfTextContainer","rangeStartParentIsFormatElement","rangeEndsAfterEndOfStartContainer","rangeEndsAtOrAfterEndOfStartContainer","deleteRange$1","updateFormats","missingFormats","updateCaretFormat","backspaceDelete$3","hasAncestorInlineCaretAtStart","hasAncestorInlineCaret","refreshCaret","requiresRefreshCaretOverride","deleteElement","backspaceDelete$2","isNearMedia","deleteCaret","parseIndentValue","getIndentStyleName","useMargin","canOutdent","getBlocksToIndent","indentStyleName","intentValue","validateBlocks","isListComponent","parentIsListComponent","indentation","indentUnit","indentValue","parsedValue","indentElement","outdent","backspaceDelete$1","findAction","forwardDeleteCommand","execNativeForwardDeleteCommand","setup$q","deleteCommand","setup$p","debounceLongpress","isBlockElement","isValidTarget","shouldRemoveTextNode","createRootBlock","rootNodeName","hasBlockParent","restoreSelection","insertEmptyLine","checkClassName","replaceMatchWithSpan","prevChar","findStartTagIndex","isValidContent","nonEditableRegExps","re","setup$n","contentEditableAttrName","editClass","nonEditClass","hasEditClass","hasNonEditClass","convertRegExpsToNonEditable","blockCaretContainer","handleBlockContainer","findBlockCaretContainer","isContentEditableFalse$4","exitPreBlock","getVisualCaretPosition$1","newBlock","textBlock","createTextBlock","getHorizontalRange","moveToCeFalseHorizontally","getVerticalRange","moveToCeFalseVertically","moveH$2","flipDirection","moveV$4","moveToLineEndPoint$1","selectToEndPoint","curRng","moveCaretToNewEmptyLine","getClosestTargetBlock","isAtFirstOrLastLine","moveV$3","move$2","summary","moveV$2","baseKeyPattern","matchesEvent","match$1","defaultPatterns","matchDelayed","defaultDelayedPatterns","executeWithDelayedAction","moveH$1","moveV$1","moveToLineEndPoint","CellLocation","isEligible","isTextNodeWithCursorPosition","isContentEditableFalse$3","getClosestCell","getYAxisValue","isTargetCorner","corners","tds","deflate","getCorners","corner","newCorner","oldCorner","oldDist","newDist","findClosestCorner","getClosestCellAbove","getClosestCellBelow","findClosestPositionInAboveCell","findClosestPositionInBelowCell","isAtTableCellLine","startsWithWrapBreak","startsWithBrBreak","breakPos","hasNextBreak","isAtFirstTableCellLine","isAtLastTableCellLine","navigateHorizontally","_td","isCaretAtStartOrEndOfTable","getTable","insertFn","renderBlock","navigateVertically","getClosestAbovePosition","getClosestBelowPosition","mover","moveH","moveV","tabGo","_current","getCellFirstCursorPosition","tabForward","tabBackward","rootElements","setup$l","executeKeydownOverride$4","DOM$7","alwaysNext","textBefore","scanLeft","scanRight","repeatLeft","isWhitespace","stripTrigger","initRange","includeWhitespace","buffer","firstChar","findTrigger","toLast","isText$1","toLeaf","isStartOfWord","_element","isPreviousCharContent","getDatabase","database","triggers","getTriggerContext","lookupWithContext","startText","autocompleters","lookupByTrigger","ac","maxResults","mergeErrors","autocompleterSchema","createAutocompleter","datasetValues","dv","setup$k","activeAutocompleter","uiActive","fireAutocompleterEnd","getAutocompleters","newContext","doLookup","lookupInfo","matchLength","commenceIfNecessary","fireAutocompleterUpdate","fireAutocompleterStart","readActiveRange","selRange","innerRange","outerRange","startComparison","Range","endComparison","isRangeInsideOrEqual","editorCommands","setupEditorInput","emptyNodeContents","isEntireNodeSelected","getParentDetailsElementAtPos","isInDetailsElement","isCaretAtStartOfSummary","detailsElements","startSummary","isCaretInTheBeginningOf","isCaretAtEndOfSummary","isCaretInTheEndOf","setCaretToPosition","moveCaretToDetailsPos","shouldPreventDeleteIntoDetails","granularity","parentDetailsAtCaret","inEmptyParentBlock","isFirstBlock","isLastBlock","parentDetailsAtNewPos","shouldPreventDeleteSummaryAction","detailElements","startInSummary","endInSummary","isPartiallySelectedDetailsElements","startDetails","endDetails","isPartialDelete","isCaretInLastPositionInBody","isCaretInFirstPositionInBody","shouldPreventDeleteAction","getDetailsElements","handleDeleteActionSafari","appendAllChildNodes","backspaceDelete","createAndFireInputEvent","specifics","isComposing","currentTarget","eventPhase","AT_TARGET","originalTarget","explicitOriginalTarget","isTrusted","cancelable","InputEvent","fireInputEvent","fireBeforeInputEvent","platform$2","isMacOSOriOS","setup$j","isBackspaceKeydown","unmodifiedGranularity","getModifiedGranularity","isWord","applyAction","executeKeydownOverride$3","executeKeyupOverride","moveToCaretPosition","firstNonWhiteSpaceNodeSibling","getEditableRoot","editableRoot","getParentBlock$1","setForcedBlockAttrs","forcedRootBlockAttrs","attrStyles","newStyles","attrClassesOpt","attrClasses","currentClassesOpt","currentClasses","filteredClasses","newClasses","appliedAttrs","remainingAttrs","createNewBlock","keepStyles","newBlockName","parentBlockName","isLastEmptyBlockInDetails","isAtDetailsEdge","insertNewLine","getDetailsRoot","hasParent","isListBlock","getContainerBlock","containerBlock","containerBlockParent","isFirstOrLastLi","insert$4","containerParent","parentBlockStyles","tmpRng","hasFirstChild","previousChildren","isEmptyAnchor","containerAndSiblingName","canSplitBlock","normalizeZwspOffset","blockbreak","isAfterLastNodeInContainer","isCef","collapsedAndCef","createNewBlock$1","isCaretAtStartOrEndOfBlock","normalizedOffset","insertNewBlockAfter","containerBlockName","optionValue","shouldEndContainer","parentList","isWithinNonEditableList","startNodeName","startNodeParent","wrapSelfAndSiblingsInDefaultBlock","parentBlockParent","isNearChildren","includeZwspInRange","trimLeadingLineBreaks","firstChilds","trimInlineElementsOnLeftSideOfBlock","addBrToBlockIfNeeded","fakeEventName","moveSelectionToBr","brElm","extraBr","insertBrAtCaret","isControlKey","hasRightSideContent","insertBrBefore","insertBrAfter","hasBrAfter","isAnchorLink","isInsideAnchor","insertBrOutsideAnchor","linebreak","anchorLocation","readInlineAnchorLocation","matchesSelector","newLineAction","shouldBlockNewLine","_shiftKey","shouldBlockNewLine$1","inListBlock","requiredState","isListItemParentBlock","getParentBlockName","inCefBlock","inPreBlock","shouldPutBrInPre","inBrContext","shouldInsertBr","_editor","canInsertIntoEditableRoot","rootEditable","isInRootWithEmptyOrCEF","isCefOpt","predicates","insertBreak","execEditorDeleteCommand","logicalAction","platform$1","isIOSSafari","handleEnterKeyEvent","setup$i","iOSSafariKeydownBookmark","koreanCharRegex","isCaretAfterKoreanCharacter","iOSSafariKeydownOverride","iOSSafariKeyupOverride","setup$h","executeKeydownOverride$2","setup$g","normalizeNbspsInEditor","isPageUpDown","setNodeChangeBlocker","blocked","setup$f","executeKeyupAction","insertTextAtPosition","insertNbspAtPosition","insertSpaceAtPosition","insertSpaceOrNbspAtSelection","locationToCaretPosition","checkPos","insertInlineBoundarySpaceOrNbsp","insertSpaceInSummaryAtSelectionOnFirefox","domUtils","insertSpaceOrNbspAtPosition","executeKeydownOverride$1","tableTabNavigation","setup$c","executeKeydownOverride","setup$e","setup$m","NodeChange","lastPath","nativeRng","fakeRng","isSameElementPath","currentPath","imageId","eventId","mkSetEventFn","transfer","setDragstartEvent","setDropEvent","setDragendEvent","isInDragStartEvent","modeId","mkSetModeFn","setMode$1","setReadWriteMode","setReadOnlyMode","setProtectedMode","checkMode","expectedMode","isInReadWriteMode","isInProtectedMode","validDropEffects","validEffectAlloweds","createDataTransfer","dataTransferImpl","DataTransfer","dropEffect","effectAllowed","allowed","itemsImpl","normalizeItems","setDragImage","imageData","cloneDataTransfer","originalMode","getDragImage","getEvent","setEvent","setHtmlData","internalMimeType","internalHtmlMime","internalMark","mark","isMarked","toBlockElements","rootTag","rootAttrs","tagOpen","openContainer","tagClose","paragraphs","pasteBinDefaultContent","isPasteBin","isDefaultPasteBinContent","PasteBin","lastRngCell","pasteBinElm","create$6","pasteBinClone","copyAndRemove","toElm","fromElm","pasteBinClones","dirtyWrappers","cleanWrapper","getLastRng","trimHtml","s1","s2","processResult","cancelled","filterContent","preProcessArgs","firePastePreProcess","filteredContent","preProcess","tempBody","postProcessArgs","firePastePostProcess","postProcessFilter","pasteHtml$1","isAbsoluteUrl","linkSelection","pasteHtmlFn","insertImage","isImageUrl","createImage","smartInsertContent","createIdGenerator","createPasteDataTransfer","doPaste","shouldSimulateInputEvent","doPasteAction","pasteHtml","internalFlag","unmark","pasteText","encodedText","getDataTransferItems","contentType","hasContentType","clipboardContent","hasHtmlOrText","createBlobInfo","useFileName","extractFilename","allowedExtensions","extension","lowerExt","mimeOverrides","jpg","jpe","jfi","jif","jfif","pjpeg","pjp","getImageMimeType","pasteImageData","clipboardData","kind","getAsFile","getImagesFromDataTransfer","fileResults","imageItem","existingBlobInfo","pasteImage","insertClipboardContent","plainTextMode","isInternal","isPlainTextHtml","isPlainText","isAbsoluteUrl$1","voidElements","ignoreElements","registerEventHandlers","pasteBin","pasteFormat","keyboardPastePlainTextState","isKeyboardPasteEvent","isBrokenAndroidClipboardEvent","registerEventsAndFilters","isWebKitFakeUrl","isDataUri","isPasteInsert","registerDataImageFilter","togglePlainTextPaste","setClipboardData","setHtml5Clipboard","contenteditable","offscreenRange","hasSelectedContent","isTableSelection","getCaretRangeFromEvent","setFocusedRange","draggingInternallyState","hasImage","dropContent","plainTextContent","isPlainTextFileUrl","internalContent","needsInternalDrop","parentTransparent","needsCustomInternalDrop","isInternalDrop","trimmedContent","hasNoSummary","brokenDetailElements","setupSummaryDeleteByDragFix","rgbRegExp","rgbToHex","removeWebKitStyles","webKitStylesOption","webKitStyles","outputStyles","compareInput","outputStyle","filterFunc","addPreProcessFilter","setup$9","preventSummaryToggle","initialStateOption","serializedStateOption","filterDetails","isContentEditableFalse$2","getClosestScope","getClosestCef","findEdgeCaretCandidate","onTripleClickSelect","startRng","clickNode","cef","findClosestBlockRange","FakeCaretPosition","distanceToRectLeft","distanceToRectRight","r1","r2","overlap","overlapY","collidesY","splitRectsPerAxis","prevRect","boundingClientRectFromRects","isInsideY","boundingRect","vertical","horizontalDistance","_y","closestChildCaretCandidateNodeRect","findCloserTextNode","caretCandidateRect","findClosestCaretCandidateNodeRect","distance","sortedRects","sndClosest","tryFindSecondBestTextNode","horizontalRects","verticalRects","above","below","closestCaretCandidateNodeRect","prevScope","childNodesWithoutGhost","uncheckedChildren","traverseUp","closestFakeCaretCandidate","Before","After","clientInfo","getAbsolutePosition","calc","calculatePosition","bodyPosition","getBodyPosition","scrollPosition","getScrollPosition","mousePosition","iframePosition","inlineScroll","iframeScroll","getBodyScroll","getMousePosition","getTargetProps","makeDragEvent","dataTransferForDispatch","makeDataTransferCopyForDragEvent","BUBBLING_PHASE","CAPTURING_PHASE","NONE","movementX","movementY","offsetX","offsetY","initUIEvent","makeDndEvent","makeDndEventFromMouseEvent","isContentEditableFalse$1","createGhost","clonedElm","scrollEditor","behavior","scrollRight","scrollUp","scrollDown","removeElement","isLeftMouseButtonPressed","ceElm","isDraggable","elmPos","dragging","relX","relY","ghost","dispatchDragEvent","throttledPlaceCaretAt","caretInfo","state_","mouseEventOriginatedFromWithinTheEditor","targetPos","applyRelPos","mouseY","mouseX","outerMouseY","outerMouseX","moveGhost","dragElement","isValidDropTarget","getRawTarget","dropTarget","removeElementWithPadding","getHtmlData","removeDragState","stopDragging","bindFakeDragEvents","pageDom","dragStartHandler","dragHandler","dropHandler","dragEndHandler","preventFileDrop","preventFileDropIfUIElement","editorRoot","eventNames","blockUnsupportedFileDrop","getContentEditableRoot","SelectionOverrides","realSelectionId","isFakeSelectionTargetElement","removeElementSelection","contentEditableRoot","setElementSelection","closestContentEditable","setRange","normalizeVoidElementSelection","isRangeInCaretContainer","isFakeSelectionElement","renderFocusCaret","isWithinCaretContainer","selectElement","targetClone","realSelectionContainer","setupOffscreenSelection","nodeElm","afterNode","getNormalizedTextOffset","generatePath","generatePathRange","resolvePath","nodePath","resolvePathRange","cleanEmptyNodes","deleteRng","getParentBlock","resolveFromDynamicPatterns","patternSet","beforeText","dynamicPatterns","dynamicPatternsLookup","inlinePatterns","getBeforeText","newMarker","rangeFromMarker","createMarker","markerPrefix","pathRange","textEnd","textStart","startParentNode","removeMarker","isReplacementPattern","findPatternStartFromSpot","startPattern","patternContent","searchText","startEndIndex","startPatternIndex","nextSpot","findPattern$3","normalizedMatches","endPathRng","endRng","resultsOpt","findPatternsRec","remainingPatterns","requireGap","startRange","findPatternStart","startPathRng","generatePathRangeFromRange","endSpot","patternsWithoutCurrent","applyPattern$2","patternRange","findPatterns$2","matchesWithSortedPatterns","hasSameMatches","sortedMatch","getBestMatches","applyMatches$2","matchesWithMarkers","matchesWithEnds","endMarker","startMarker","addMarkers","markerRange","applyReplacementPattern","markerEndRange","markerStartRange","patternMarker","applyPatternWithContent","stripPattern$1","textAfter","createApplyPattern","stripPattern","formatSet","isBlockFormatName","findPattern$2","sortedPatterns","sortPatterns","createFindPatterns","findPattern","skipFullMatch","applyPattern$1","findPattern$1","findPatterns$1","applyPattern","findPatterns","handleEnter","dynamicPatternSet","inlineMatches","blockMatches","getMatches$1","insert$5","applyMatches$1","handleBlockPatternOnSpace","getMatches","applyMatches","checkKeyEvent","codes","charCodes","keyCodes","getPatternSet","createPatternSet","hasDynamicPatterns","hasTextPatternsLookup","handleInlineTrigger","handleInlineKey","charCode","Quirks","isGecko","isWebKit","setEditorCommandState","emptyEditorWhenDeleting","serializeRng","allRng","allContentsSelected","selectAll","documentElementEditingFocus","selectControlElements","visualAidsAnchorClass","disableBackspaceIntoATable","setGeckoEditingOptions","setOpts","addBrAfterLastLinks","showBrokenImageIcon","contentStyles","restoreFocusOnKeyDown","bodyHeight","blockCmdArrowNavigation","tapLinksAndImages","blockFormSubmitInsideEditor","isAllContentSelected","getAttributeApplyFunction","setAttributeNode","isSelectionAcrossElements","removeStylesWhenDeletingAcrossBlockElements","DOM$6","getRootName","removeUndefined","mkParserSettings","mkSchemaSettings","initEditor","bindPendingEventDelegates","fireInit","moveSelectionToFirstCaretPosition","initInstanceCallback","autoFocus","getStyleSheetLoader$1","loadContentCss","fontCss","removeCss","contentCssText","allStylesheets","framedFonts","bundledCss","normalCss","bundledPromises","makeStylesheetLoadingPromises","contentStyle","appendStyle","initEditorWithInitialContent","startContent","loadInitialContent","contentBodyLoaded","_editableRoot","hasEditableRoot","createParser","mkSerializerSettings","annotator","_nodeChangeDispatcher","setup$o","setupRtcThunk","firePreInit","spellcheck","firePostRender","directionality","protect","preInit","cancelProgress","canceled","progressTimeout","setProgressState","startProgress","setupRtc","_rtcMode","DOM$5","createIframe","boxInfo","iframeTitle","ifr","customAttrs","frameBorder","allowTransparency","createIframeElement","iframeHTML","documentBaseUrl","bodyId","bodyClass","translatedAriaText","getIframeHtml","setupIframeBody","ready","DOM$4","initPlugin","initializedPlugins","Plugin","pluginUrl","pluginInstance","pluginInitError","createThemeFalseResult","renderThemeFalse","renderThemeFalseIframe","renderThemeUi","renderFromLoadedTheme","iframeHeight","renderFromThemeFunc","iconPackName","currentIcons","loadIcons","svgData","addIcon","initIcons","Theme","initTheme","Model","initModel","trimLegacyPrefix","initPlugins","renderInfo","uiApiFacade","augmentEditorUiApi","hidden","orgVisibility","init$1","DOM$3","hasSkipLoadPrefix","loadLanguage","scriptLoader","languageCode","languageUrl","languageLoadError","loadTheme","themeUrl","themeLoadError","loadModel","modelUrl","modelLoadError","getIconsUrlMetaFromName","defaultIconsUrl","customIconsUrl","getIconsUrlMetaFromUrl","urlMeta","iconsLoadError","loadPlugins","loadPlugin","pluginLoadError","isThemeLoaded","isModelLoaded","getStyleSheetLoader","resetContent","triggerSave","isEncodingXml","set_dirty","normalizePlugins","trimmedPlugins","extractSections","hasSection","sectionResult","getMobileOverrideOptions","mobileOptions","table_grid","object_resizing","toolbar_mode","toolbar_sticky","getExternalPlugins","userDefinedExternalPlugins","external_plugins","processPlugins","isMobileDevice","defaultOverrideOptions","forcedPlugins","forced_plugins","desktopPlugins","mobileConfig","getSectionConfig","platformPlugins","mobilePlugins","getPlatformPlugins","combinedPlugins","combinePlugins","combineOptions","defaultOptions","deviceOverrideOptions","extendedOptions","isOnMobile","sectionOptions","addVisual$1","registerExecCommands$2","toggleAlign","addCommands","JustifyLeft","JustifyCenter","JustifyRight","JustifyFull","JustifyNone","registerCommands$a","alignStates","registerQueryStateCommands","trimOrPad","trimOrPadLeftRight","insertAtCaret","processValue$1","insertedContent","insertContent$1","legacyPropNames","isFont","getSpecifiedFontProp","legacyPropName","getProperty","getFontProp","getComputedFontProp","getFontSize","getFontFamily","findFirstCaretElement","bindRange","getCaretElement","mapRange","fromFontSizeNumber","fontSizeNumber","getFontStyleValues","fontClasses","getFontSizeClasses","normalizeFontNames","registerExecCommands$1","_command","fontNameAction","fontSizeAction","lineHeightAction","registerQueryValueCommands","isFormatMatch","fontNameQuery","fontSizeQuery","specifiedStyle","lineHeightQuery","registerCommands$5","Indent","Outdent","topParentBlock","getTopParentBlock","registerCommands$3","InsertNewBlockBefore","InsertNewBlockAfter","queryCommandEnabled","queryCommandSupported","registerCommands$9","mceAddUndoLevel","mceEndUndoLevel","Undo","Redo","registerCommands$6","mceSelectNodeDepth","mceSelectNode","registerCommands$1","mceCleanup","insertHorizontalRule","insertText","insertHTML","mceInsertContent","mceSetContent","mceReplaceContent","mceNewDocument","registerCommands$8","applyLinkToSelection","linkDetails","mceInsertLink","registerCommands$4","insertParagraph","mceInsertNewLine","InsertLineBreak","registerCommands$2","registerCommands$7","mceRemoveNode","mcePrint","print","mceFocus","mceToggleVisualAid","registerExecCommands","selectionSafeCommands","isSelectionSafeCommand","EditorCommands","lowerCaseCommand","commandList","internalContentEditableAttr","setContentEditable","toggleReadOnly","removeFakeSelection","switchOnContentEditableTrue","restoreFakeSelection","registerFilters","allowedEvents","processReadonlyEvents","isClickEvent","getAnchorHrefOpt","isReadOnlyAllowedEvent","nativeEvents","EventDispatcher","isNative","bindings","toggleEvent","beforeFire","wrappedCallback","currentName","bindingName","filteredHandlers","getEventDispatcher","_eventDispatcher","toggleNativeEvent","Observable","dispatcherArgs","DOM$2","customEventRootDelegates","getEventTarget","eventRoot","isListening","bindEventDelegate","delegates","eventRootElm","editors","EditorObservable","_pendingNativeEvents","stringListProcessor","getErrorMessage","isValidResult","processValue","initialOptions","isRegistered","isBuiltInSpec","getBuiltInProcessor","processDefaultValue","immutable","unset","registered","defaultModes","switchToMode","activeMode","availableModes","oldMode","activate","deactivate","editorReadOnly","fireSwitchMode","design","registerReadOnlyContentFilters","registerReadOnlySelectionBlockers","setMode","registerMode","keyCodeLookup","f1","f2","f3","f4","f5","f6","f7","f8","f9","f10","f11","f12","modifierNames","parseShortcut","isModifier","Shortcuts","pendingPatterns","hasModifier","isFunctionKey","matchShortcut","subpatterns","executeShortcutAction","cmdFunc","normalizeCommandFunc","createShortcut","addAutocompleter","addContextToolbar","addSidebar","addView","create$3","DOM$1","Editor","loadedCSS","isNotDirty","documentBaseURL","normalizeOptions","lookupFn","rawPatterns","_ctx","_setBaseUrl","baseURI","setupCallback","getParam","loadArgs","saveArgs","initialContent","oldState","urlConverterCallback","urlObject","setEditableRoot","fireEditableRootStateChange","_scanForImages","beforeUnloadDelegate","boundGlobalEvents","globalEventDelegate","EditorManager","toggleGlobalEvents","removeEditorFromList","targetEditor","oldEditors","isQuirksMode","compatMode","majorVersion","minorVersion","releaseDate","hugeRTEPreInit","srcScript","overrideDefaults","base_url","pluginBaseUrls","plugin_base_urls","pluginBaseUrl","pluginName","invalidInlineTargets","provideResults","initEditors","initCount","execCallback","findTargets","isInvalidInlineTarget","createEditor","createId","existingEditor","editorId","editorOptions","addI18n","FakeClipboard","dataValue","relativePosition","targetW","targetH","relChars","Rect","inflate","findBestRelativePosition","constrainRect","intersect","cropRect","x1","y1","clampRect","fixedSize","cx2","cy2","underflowX1","underflowY1","overflowX2","overflowY2","fromClientRect","tasks","resultFns","resources","loadErrMsg","runErrMsg","task","waiter","resolveCb","rejectCb","awaiter","localStorage","removeItem","publicApi","geom","LocalStorage","ImageUploader","showNotification","TreeWalker","Serializer","Selection","hugerte$1","hugeRTE","exportToWindowGlobal","module","exportToModuleLoaders","select2","defaultSelectAjaxOptions","dataType","initSelect2","specificEl","customOptions","_select$0$attributes$","_select$0$attributes$2","ajax","queryParams","queryParamsToSend","minInputLen","minimumInputLength","createSearchChoice","localeCompare","clearing","defaultSelected","allFound","vals"],"sourceRoot":""}