{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./app/javascript/packs/tinymce.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","typeOf$1","x","undefined","Array","isPrototypeOf","constructor","String","eq$2","f","eq","eqString","y","eqArray","eqa","length","len","eqSortedArray","compareFn","contramap","xs","slice","sort","sort$1","eqRecord","kx","keys","ky","q","eqAny","tx","indexOf","isEquatableType","getPrototypeOf$1","getPrototypeOf","hasProto","v","predicate","_a","isType$1","type","isArray","proto","isSimpleType","eq$1","a","is$4","isObject","isString","isPlainObject","isArray$1","isNull","isBoolean","isUndefined","isNullable","isNonNullable","isFunction","isNumber","isArrayOf","pred","noop","compose","fa","fb","_len3","arguments","args","_key3","apply","compose1","fbc","fab","constant","identity","tripleEquals","b","curry","fn","_len4","initialArgs","_key4","_len5","restArgs","_key5","all","concat","not","apply$1","never","always","Optional","tag","_classCallCheck","this","_createClass","onNone","onSome","mapper","some","none","binder","replacement","thunk","message","Error","worker","singletonNone","nativeSlice","nativeIndexOf","nativePush","push","rawIndexOf","ts","contains$2","exists","map$3","each$e","eachr","partition$2","pass","fail","filter$5","foldr","acc","foldl","findUntil$1","until","find$2","findIndex$2","flatten","bind$3","forall","reverse","difference","a1","a2","mapToObject","comparator","copy","get$b","head","last$3","from","findMap","arr","isSome","hasOwnProperty$2","each$d","obj","props","k","map$2","tupleMap","tuple","objAcc","internalFilter","onTrue","onFalse","filter$4","mapToArray","values","get$a","has$2","hasNonNullableKey","stringArray","isArrayLike","each$c","cb","map$1","array","callback","out","item","index","filter$3","reduce","collection","iteratee","accumulator","thisArg","findIndex$1","last$2","cached","called","_len6","_key6","unknown$2","nu$3","major","minor","Version","nu","detect","versionRegexes","agent","cleanedAgent","toLowerCase","regexes","test","firstMatch","group","Number","replace","find$1","unknown","detect$4","candidates","userAgent","candidate","search","checkRange","str","substr","start","contains$1","end","idx","startsWith","prefix","endsWith","suffix","blank","trim$3","lTrim","rTrim","isNotEmpty","isEmpty$3","toInt","num","parseInt","isNaN","normalVersionRegex","checkContains","target","uastring","browsers","brand","oses","PlatformInfo","edge","chromium","opera","firefox","safari","nu$2","info","current","version","isBrowser","isEdge","isChromium","isIE","isOpera","isFirefox","isSafari","Browser","ie","windows","android","linux","macos","solaris","freebsd","chromeos","nu$1","isOS","isWindows","isiOS","isAndroid","isMacOS","isLinux","isSolaris","isFreeBSD","isChromeOS","OperatingSystem","ios","PlatformDetection","userAgentDataOpt","mediaMatch","browser","userAgentData","brands","uaBrand","lcBrand","map","detectBrowser$1","orThunk","detectBrowser","fold","os","detectOs","deviceType","isiPad","isiPhone","isMobile","isTouch","isTablet","isPhone","iOSwebview","isDesktop","isWebView","DeviceType","query","window","matchMedia","matches","platform$2","navigator","detect$2","platform$1","browser$1","windowsPhone","Env","transparentSrc","documentMode","document","cacheSuffix","container","canHaveCSP","whiteSpaceRegExp$1","trim$2","walk$4","Tools","trim","is","toArray","makeMap","items","delim","resolvedItems","split","each","grep","inArray","hasOwn","extend","ext","walk","resolve","path","explode","_addCacheSuffix","url","is$2","lhs","rhs","left","lift2","oa","ob","getOrDie","someIf","Function","attrName","attrValue","element","dom","nodeName","type$1","nodeType","isType","isElement$7","isText$b","isDocument$2","isDocumentFragment$1","isTag","e","rawSet","console","error","setAttribute","set$2","setAll$1","attrs","get$9","getAttribute","getOpt","has$1","hasAttribute","remove$b","removeAttribute","clone$4","attributes","attr","read$4","supports","classList","get$8","add$3","clazz","id","join","add$4","remove$9","remove$a","add$2","add","cleanClass","remove$8","remove","toggle$1","result","toggle","toggle$2","has","contains","isSupported$1","style","getPropertyValue","fromDom$2","node","SugarElement","fromHtml","html","scope","div","createElement","innerHTML","hasChildNodes","childNodes","fromTag","fromText","text","createTextNode","fromDom","fromPoint","docElm","elementFromPoint","recurse","cur","is$1","selector","elem","msMatchesSelector","webkitMatchesSelector","mozMatchesSelector","bypassSelector","childElementCount","e1","e2","d1","d2","owner$1","ownerDocument","documentOrOwner","dos","defaultView","parent","parentNode","parentElement","parents$1","isRoot","stop","ret","rawParent","prevSibling","previousSibling","nextSibling","prevSiblings","nextSiblings","children$1","child$1","cs","firstChild","lastChild","childNodesCount","isShadowRoot","host","supported","Element","attachShadow","Node","getRootNode","isSupported","getStyleContainer","doc","getHead","getShadowHost","getOriginalEventTarget","event","el","isOpenShadowHost","composed","composedPath","shadowRoot","inBody","body","internalSet","setProperty","set$1","setAll","css","get$7","getComputedStyle","getUnsafeProperty","getRaw$1","raw","filter","getAllRaw","ruleName","remove$7","removeProperty","internalRemove","before$3","marker","insertBefore","after$4","append$1","prepend","appendChild","append","elements","empty","textContent","rogue","remove$6","removeChild","unwrap","wrapper","children","fromDom$1","nodes","get$6","set","content","docDom","fragment","createDocumentFragment","contentElements","handle$1","handler","rawEvent","getOr","stopPropagation","prevent","preventDefault","kill","mkEvent","clientX","clientY","fromRawEvent","bind$2","useCapture","wrapped","addEventListener","unbind","removeEventListener","top","translate","SugarPosition","firstDefinedOrZero","viewport","offsetLeft","offsetTop","box","getBoundingClientRect","boxPosition","get$5","_DOC","scrollLeft","documentElement","scrollTop","to","win","scrollTo","intoView","alignToTop","scrollIntoViewIfNeeded","scrollIntoView","bounds","width","height","right","bottom","getBounds","_win","scroll","visualViewport","get$4","clientWidth","clientHeight","Math","max","pageLeft","pageTop","descendants$1","ClosestOrAncestor","ancestor","ancestor$3","closest$4","child","ancestor$2","descendant","base","querySelector","one","closest$3","ancestor$1","DomTreeWalker","startNode","rootNode","next","prev","prev2","shallow","findSibling","findPreviousNode","startName","siblingName","sibling","isNodeType","isRestrictedNode","isElement$6","matchNodeName","lowerCasedName","matchNodeNames","names","lowerCasedNames","matchStyleValues","computed","isBogus$2","isTable$2","tagName","hasContentEditableState","contentEditable","isTextareaOrInput","isText$a","isCData","isPi","isComment","isDocument$1","isDocumentFragment","isBr$6","isImg","isContentEditableTrue$3","isContentEditableFalse$a","isTableCell$3","isTableCellOrCaption","isMedia$2","isListItem$2","zeroWidth","nbsp","isZwsp$1","char","descendants","querySelectorAll","api$1","getOption","nodeValue","NodeValue","get$3","wrapBlockElements","lazyLookup","lookup","isBlock$2","isInline$1","isBr$5","isTextBlock$2","isList","isListItem$1","isTableSection","isTableCell$2","isWsPreserveElement","isWrapBlockElement","isWrapElement","removeTrailingBr","elm","allBrs","brs","rawNode","getLastChildren$1","createPaddingBr","br","fillWithPaddingBr","trimBlockTrailingBr","lastChildPrevSibling","ZWSP$1","isZwsp","trim$1","isElement$5","isText$9","isCaretContainerBlock$1","isCaretContainerInline","data","isCaretContainer$2","hasContent","isBeforeInline","pos","charAt","offset","isAtStart","isAfterInline","isAtEnd","startsWithCaretContainer$1","endsWithCaretContainer$1","showCaretContainerBlock","caretContainer","getElementsByTagName","lastBr","isRangeInCaretContainerBlock","range","startContainer","isContentEditableTrue$2","isContentEditableFalse$9","isBr$4","isText$8","isInvalidTextElement","isAtomicInline","isTable","isCaretContainer$1","isCaretCandidate$3","isNonUiContentEditableFalse","isUnselectable","isEditableCaretCandidate$1","root","tempNode","isInEditable","whiteSpaceRegExp","isWhitespaceText","isNewLineChar","normalize$4","isStartOfContent","isEndOfContent","tabSpace","count","repeat","normalizedText","isCollapsibleWhitespace$1","pcIsSpace","isNewline","isWhitespace$1","rootElement","hasWhitespacePreserveParent","isContent$1","isNamedAnchor","isBookmark","isBogus$1","isBogusAll","isEmpty$2","skipBogus","targetNode","brCount","walker","isEmptyNode","transparentBlockAttr","makeSelectorFromSchemaMap","elementNames","updateTransparent","blocksSelector","transparent","updateBlockStateOnChildren","schema","transparentSelector","getTransparentElements","getBlockElements","trimEdge","leftSide","childPropertyName","splitInvalidChildren","transparentBlocks","blocksElements","isBlock","transparentBlock","parentBlock","invalidChildren","isValidChild","stateScope","parentElm","splitElm","createRange","setStartBefore","setEndBefore","beforeFragment","extractContents","setStartAfter","setEndAfter","afterFragment","split$2","updateChildren","updateElement","isTransparentElement","hasBlockAttr","isTransparentElementName","isTransparentBlock","isTransparentAstInline","firstElement","hasChild","getPos","rootElm","clientLeft","clientTop","offsetParent","castOffsetParent","caption","bodyTop","captionTop","captionHeight","offsetHeight","getTableCaptionDeltaY","StyleSheetLoader","documentOrShadowRoot","settings","idCount","loadedStates","edos","maxLoadTime","load","Promise","success","failure","link","urlWithSuffix","state","getOrThunk","passed","failed","getOrCreateState","callbacks","status","onload","onerror","waitForWebKitLinkLoaded","waitCallback","styleSheets","owner","ownerNode","testCallback","Date","now","startTime","setTimeout","linkElem","rel","contentCssCors","referrerPolicy","unload","styleContainer","loadAll","urls","allSettled","then","results","parts","reject","reason","unloadAll","_setReferrerPolicy","_setContentCssCors","instance","WeakMap","forElement","referenceElement","rootDom","sl","create$d","isInlineContent","isBookmarkNode$2","isSpan","isKeepTextNode","prevIsInline","nextIsInline","surroundedByInlineContent","trimNode","currentChildren","isDocument","isKeepElement","makeMap$3","attrsCharsRegExp","textCharsRegExp","rawCharsRegExp","entityRegExp","asciiMap","baseEntities","reverseEntities","buildEntitiesLookup","radix","itemList","chr","fromCharCode","entity","namedEntities","encodeRaw","encodeNumeric","charCodeAt","encodeNamed","entities","resolveEntities","Entities","encodeAllRaw","getEncodeFunc","entitiesMap","nameMap","named","numeric","decode","innerText","nativeDecode","lookupCache","mapCache","dummyObj","makeMap$2","each$b","extend$2","explode$2","split$1","createMap","defaultValue","extendWith","toUpperCase","getTextRootBlockElements","getTextBlockElements","compileElementMap","styles","Schema","patternElements","customElementsMap","specialElements","createLookupTable","option","newValue","schemaType","schemaItems","globalAttributes","blockContent","phrasingContent","flowContent","childNames","ni","attributesOrder","addAttrs","schemaItem","html4PhrasingContent","html4BlockContent","video","audio","table","script","compileSchema","verify_html","valid_elements","validStyles","valid_styles","invalidStyles","invalid_styles","validClasses","valid_classes","whitespaceElementsMap","selfClosingElementsMap","voidElementsMap","boolAttrMap","nonEmptyOrMoveCaretBeforeOnEnter","nonEmptyElementsMap","moveCaretBeforeOnEnterElementsMap","textBlockElementsMap","blockElementsMap","textInlineElementsMap","transparentElementsMap","RegExp","patternToRegExp","addValidElements","validElements","elementRuleRegExp","attrRuleRegExp","hasPatternsRegExp","globalAttributesOrder","validElementsArr","_loop","exec","ei","elementName","outputName","attrData","paddEmpty","removeEmpty","removeEmptyAttrs","_toConsumableArray2","attrDatas","ai","al","attrType","attrPrefix","attributesRequired","required","splice","attributesDefault","attributesForced","forcedValue","validValues","attrPattern","attributePatterns","pattern","patternElement","setValidElements","addCustomElements","customElements","customElementRegExp","text_block_elements","block_elements","rule","inline","cloneName","customRule","elmName","addValidChildren","validChildren","childRuleRegExp","getElementRule","_val","padd_empty_block_inline_children","paddInEmptyBlock","custom_elements","valid_children","extended_valid_elements","dd","dt","li","td","th","tr","tbody","thead","tfoot","legend","area","param","parents","parentsRequired","invalid_elements","getValidStyles","getInvalidStyles","getValidClasses","getBoolAttrs","getTextInlineElements","getVoidElements","seal","getSelfClosingElements","getNonEmptyElements","getMoveCaretBeforeOnEnterElements","getWhitespaceElements","getSpecialElements","getCustomElements","isValid","attrPatterns","Styles","urlOrStrRegExp","styleRegExp","trimRightRegExp","encodingLookup","invisibleChar","encodingItems","self","parse","isEncoded","urlConverter","url_converter","urlConverterScope","url_converter_scope","compress","noJoin","canCompress","encode","keepSlashes","decodeSingleHexSequence","escSeq","decodeHexSequences","processUrl","match","url2","url3","str2","allow_script_urls","scriptUrl","allow_svg_data_urls","lastIndex","border","serialize","serializeStyles","elemName","validStyleList","styleList","styleMap","deprecated","keyLocation","layerX","layerY","returnValue","webkitMovementX","webkitMovementY","keyIdentifier","mozPressure","needsNormalizing","Event","initEvent","isNativeEvent","clone$3","originalEvent","normalize$3","fallbackTarget","srcElement","defaultPrevented","isDefaultPrevented","cancelBubble","isPropagationStopped","stopImmediatePropagation","isImmediatePropagationStopped","hasIsDefaultPrevented","mouseEventRe","addEvent","capture","removeEvent","fix","isMouseEvent","pageX","eventDoc","mouseEvent","pageY","bindOnReady","eventUtils","domLoaded","readyHandler","readyState","EventUtils","events","expando","toString","hasFocusIn","callbackList","defaultNativeHandler","evt","executeHandlers","namesList","nativeHandler","fakeName","func","eventMap","ci","newCallbackList","ex","dispatch","parentWindow","each$a","internalStyleName","numericalCssMap","legacySetAttribute","camelCaseToHyphens","findNodeIndex","normalized","lastNodeType","updateInternalStyleAttr","rawValue","applyStyle$1","$elm","cssName","cssValue","normalizedName","convertStyleToString","DOMUtils","addedStyles","files","counter","styleSheetLoader","boundEvents","ownEvents","getElementById","_get","getAttrib","defaultVal","hook","attrHooks","getAttribs","setAttrib","run","val","originalValue","onSetAttrib","attrElm","getRoot","root_element","getPos$1","getStyle","getSize","w","h","offsetWidth","elms","getParents","collect","resolvedRoot","selectorVal","_findSib","context","setAttribs","setHTML","newElm","keepChildren","$node","toggleClass","cls","classes","oldElm","replacee","cloneNode","replaceChild","isNonEmptyElement","createRng","rv","_boundEvents$_i","_slicedToArray","boundTarget","boundName","boundFunc","getContentEditable","stdMode","boxModel","clone","deep","getViewPort","argWin","vp","getRect","size","getParent","getNext","getPrev","select","_b","createHTML","outHtml","createFragment","frag","setStyle","update_styles","setStyles","stylesArg","removeAllAttribs","removeAttributeNode","parseStyle","cssText","serializeStyle","addStyle","DOM","styleElm","styleSheet","loadCSS","addClass","removeClass","hasClass","show","hide","isHidden","uniqueId","getOuterHTML","outerHTML","getOuter","setOuterHTML","insertAfter","reference","referenceNode","rename","attrNode","findCommonAncestor","ps","pe","isEmpty","whitespaceElements","nonEmptyElements","bogusVal","nodeIndex","replacementElm","setStart","setEnd","fire","getContentEditableParent","destroy","_boundEvents$i","_","isChildOf","dumpRng","startOffset","endContainer","endOffset","getContext","keepValues","keep_values","keepUrlHook","sugarElm","href","src","setupAttrHooks","DOM$b","ScriptLoader","states","queue","scriptLoadedCallbacks","queueLoadedCallbacks","loading","_this","cleanup","loadScripts","scripts","execCallbacks","processResults","failures","_ref2","loadScript","processQueue","nextQueuedItem","shift","uniqueScripts","Cell","initial","currentCode","getLanguageData","I18n","getData","_objectSpread","setCode","newCode","getCode","code","langData","translation","getLangData","textstr","removeContext","isTokenised","$1","$2","isRtl","dir","hasCode","AddOnManager","_listeners","runListeners","matchedListeners","listener","isLoaded","loadLanguagePack","languages","language","waitFor","isAdded","requireLangPack","languageLoad","addOn","createUrl","baseUrl","dep","resource","addOnUrl","urlString","baseURL","substring","lastIndexOf","done","PluginManager","ThemeManager","ModelManager","value$2","subject","doRevoke","revoke","clear","isSet","singleton","on","first$1","rate","timer","cancel","clearTimeout","throttle","_len7","_key7","last$1","_len8","_key8","annotation","dataAnnotation","dataAnnotationId","dataAnnotationActive","dataAnnotationClasses","dataAnnotationAttributes","isRoot$1","identify","editor","annotationName","rng","selection","getRng","getBody","an","newStart","uid","findMarkers","isBogusElement","findAll","markers","directory","nodesAlready","setup$x","registry","changeCallbacks","initData","listeners","previous","withCallbacks","updateCallbacks","callbackMap","outputData","toggleActiveAttr","onNodeChange","annotations","getNames","fireNoAnnotation","_ref3","fireCallbacks","addListener","setup$w","dataAnnotation$1","serializer","addTempAttr","addAttributeFilter","_step","_iterator","_createForOfIteratorHelper","_loop2","identifyParserNode","persistent","customAttrNames","customClasses","newClassList","removeDirectAnnotation","err","unique","generate$1","time","getTime","floor","random","clone$2","original","isDeep","shallow$1","deep$1","mutate","shallowAs","TextWalker","isBoundary","direction","TextSeeker","isBlockBoundary","process","newOffset","backwards","getOrNull","forwards","round$2","round","clone$1","rect","collapse","toStart","isValidOverflow","overflowY","rect1","rect2","min","isAbove$1","halfHeight","isBelow$1","distanceToRectEdgeFromXY","cx","cy","sqrt","getSelectedNode","getNode$1","safeOffset","clamp$2","extendingChars","isExtendingChar","ch","isElement$4","isCaretCandidate$2","isBlock$1","isFloated","isValidElementCaretCandidate","_len10","_key10","and","isNotPre","isText$7","isBr$3","nodeIndex$1","resolveIndex$1","createRange$1","isWhiteSpace$1","isRange","isHiddenWhiteSpaceRange","getBoundingClientRectWebKitText","sc","ec","so","eo","newRng","cloneRange","getBoundingClientRect$1","isZeroRect","clientRect","clientRects","getClientRects","brNode","nbsp$1","getBrClientRect","collapseAndInflateWidth","newClientRect","getCaretPositionClientRects","caretPosition","addUniqueAndValidRect","addCharacterOffset","beforeNode","CaretPosition","toRange","isVisible","isEqual","getNode","before","fromRangeStart","fromRangeEnd","after","isAbove","pos1","pos2","isBelow","isTextPosition","isElementPosition","trimEmptyTextNode$1","rangeInsertNode","insertNode","insertFragment","isText$6","isBogus","normalizedParent","getChildNodes","equal","createPathItem","numTextFragments","normalizedNodeIndex","create$b","outputOffset","normalizedTextOffset","parentsUntil$1","resolve$1","nodeOffset","paths","resolvePathItem","targetOffset","dataLen","findTextPosition","isContentEditableFalse$8","getPoint","point","trimmedOffset","getNormalizedTextOffset$1","findIndex","moveEndPoint$1","normalizeTableCellSelection","getOffsetBookmark","findAdjacentContentEditableFalseElm","forward","isForward","fakeCaret","isFakeCaret","isCollapsed","getLocation","createBookmarkSpan","filled","getPersistentBookmark","collapsed","rng2","endBookmarkNode","startBookmarkNode","moveToBookmark","keep","getBookmark$2","getCaretBookmark","getRangeBookmark","getUndoBookmark","value$1","applyHelper","constHelper","outputHelper","output","inner","_onError","onValue","isValue","isError","Result","mapError","or","toOptional","msg","onError","_onValue","fromOption","optional","Adt","cases","constructors","adt","acase","keys$1","_len11","_key11","argLength","_len12","foldArgs","_key12","branches","branchKeys","reqKey","log","label","params","bothErrors","firstError","secondError","bothValues","HDirection","isInlinePattern","isBlockPattern","normalizePattern","formatOrCmd","onFormat","onCommand","format","formats","cmd","command","commandValue","getBlockPatterns","patterns","getInlinePatterns","fromRawPatterns","errors","partition$1","deviceDetection$1","DOM$a","isRegExp","options","stringOrObjectProcessor","bodyOptionProcessor","valid","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","hasHiddenInput","shouldPatchSubmit","shouldAddFormSubmitTrigger","shouldAddUnloadTrigger","getCustomUndoRedoLevels","shouldDisableNodeChange","isReadOnly$1","hasContentCssCors","getPlugins","getExternalPlugins$1","shouldBlockUnsupportedDrop","isVisualAidsEnabled","getVisualAidsTableClass","getVisualAidsAnchorClass","getIframeAriaText","getSetupCallback","getInitInstanceCallback","getUrlConverterCallback","getAutoFocus","shouldBrowserSpellcheck","getProtect","shouldPasteBlockDrop","shouldPasteDataImages","getPastePreProcess","getPastePostProcess","getPasteWebkitStyles","shouldPasteRemoveWebKitStyles","shouldPasteMergeFormats","isSmartPasteEnabled","isPasteAsTextEnabled","getPasteTabSpaces","shouldAllowHtmlDataUrls","getTextPatterns","getTextPatternsLookup","getNonEditableClass","getEditableClass","getNonEditableRegExps","shouldPreserveCData","getAllowedImageFileTypes","hasTableTabNavigation","isElement$3","isText$5","removeNode$1","trimCount","trimmedText","deleteZwspChars","deleteData","removeUnchanged","remove$4","removeElementAndReposition","newPosition","removeTextCaretContainer","removeTextAndReposition","removeAndReposition","removeElementCaretContainer","caretContainerNode","isContentEditableFalse$7","isMedia$1","isTableCell$1","getAbsoluteClientRect","scrollX","scrollY","rootRect","margin","FakeCaret","hasFocus","cursorInterval","lastVisualCaret","caretBlock","fakeCaretTargetNodes","trimInlineCaretContainers","caretState","caret","clearInterval","startBlink","setInterval","textNode","splitText","insertInline$1","isInlineFakeCaretTarget","blockName","blockNode","insertBlock","getCss","reposition","isFakeCaretTableBrowser","isFakeCaretTarget","isContentEditableTrue$1","isContentEditableFalse$6","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","after$2","normalizeRange","leanLeft","leanRight","block","location","getRelativeCefElm","getNormalizedRangeEndPoint","normalizedRange","getElementFromPosition","getVisualCaretPosition","walkFn","isMoveInsideSameBlock","inSameBlock","expected","isContentEditableFalse$5","isText$3","isElement$1","isBr$2","isCaretCandidate","isAtomic","isAtomicContentEditableFalse","isEditableCaretCandidate","nodeAtIndex","getCaretCandidatePosition","moveForwardFromBr","nextNode","findCaretPosition$1","Forwards","startPos","innerNode","rootContentEditableFalseElm","getParents$3","CaretWalker","Backwards","isBeforeOrStart","position","isAfterOrEnd","isBeforeAfterSameElement","shouldSkipPosition","fromPosition","navigate","navigateIgnore","ignoreFilter","positionIn","walkToPositionIn","nextPosition","prevPosition","firstPositionIn","lastPositionIn","CARET_ID","isCaretNode","getParentCaretContainer","currentNode","isIndexBookmark","bookmark","isPathBookmark","isForwardBookmark","addBogus","tryFindRangePosition","padEmptyCaretContainer","isEmpty$1","insertZwsp","setEndPoint","isValidTextNode","restoreEndPoint","markerParent","otherMarker","appendData","resolvePaths","isStringPathBookmark","endPos","resolveCaretPositionBookmark","isIdBookmark","spos","epos","resolveId","selectNode","resolveIndex","isRangeBookmark","getBookmark$1","_ref4","setRng","isBookmarkNode$1","isNbsp","actual","isWhiteSpace","isContent","toHex","component","hex","fromRgba","rgbaColour","hexColour","red","green","blue","rgbRegex","rgbaRegex","alpha","fromStringValues","g","parseFloat","rgbaToHexString","color","rgbaString","rgbMatch","rgbaMatch","fromString","getRanges$1","ranges","rangeCount","getRangeAt","getCellsFromRanges","getSelectedNodes","getCellsFromElementOrRanges","selectedCells","getCellsFromEditor","getSel","getClosestTable","cell","getFirstChildren","getLastChildren","hasAllContentsSelected","getStartNode","getEndNode","endNode","moveEndPoint","hasAnyRanges","sel","runOnRanges","executor","fakeSelectionNodes","fakeNodeRng","preserve","fillBookmark","isNode","isElementNode$1","isEditable$3","isContentEditable","preserveSelection","action","shouldMoveStart","selectedNodeBeforeAction","isSelectedBeforeNodeNoneditable","getStart","moveStartToNearestText","selectedAttr","isElementDirectlySelected","isWhiteSpaceNode$1","getNonWhiteSpaceSibling","inc","nextName","isTextBlock$1","ed","allowSpaces","isWrappableNoneditable","baseDataSelector","formatNoneditableSelector","isWrapNoneditableTarget","replaceVars","vars","isEq$5","str1","normalizeStyleValue","strValue","getTextDecoration","decoration","getParents$2","isFormatPredicate","formatName","formatter","areSimilarFormats","otherFormatName","validKeys","filterObj","validKey","fmt1","filteredFmt1","fmt2","filteredFmt2","equal$1","isBlockFormat","isSelectorFormat","isInlineFormat","shouldExpandToSelector","expand","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","_ref5","_ref6","walk$3","exclude","firstNode","lastNode","collectSiblings","siblings","findEndPoint","walkBoundary","startPoint","endPoint","validBlocks","wrapName","isZeroWidth","isAnnotation","applyAnnotation","masterUId","decorate","directAnnotation","_data$uid","otherData","_objectWithoutProperties","_excluded","_decorate","_decorate$attributes","_decorate$classes","attributeNames","makeAnnotation","eDoc","master","annotate","newWrappers","getDoc","finishWrapper","processElements","elems","processElement","wrap$2","processNodes","annotateWithBookmark","undoManager","transact","initialRng","hasFakeSelection","masterUid","applyWordGrab","selectionRng","Annotator","register","changes","removeAnnotations","annotationChanged","getBookmark","_ref7","removeAll","getAll","BookmarkManager","isXYWithinRange","containsXY","fireError","errorType","fireFormatApply","fireFormatRemove","fireSetContent","fireGetContent","firePastePlainTextToggle","VK","BACKSPACE","DELETE","DOWN","ENTER","ESC","LEFT","RIGHT","SPACEBAR","TAB","UP","PAGE_UP","PAGE_DOWN","END","HOME","modifierPressed","shiftKey","ctrlKey","altKey","metaKeyPressed","metaKey","elementSelectionAttr","abs","round$1","resizeHandles","nw","ne","se","sw","ControlSelection","selectedElm","selectedElmGhost","resizeHelper","selectedHandle","resizeBackdrop","startX","startY","startW","startH","ratio","resizeStarted","startScrollWidth","startScrollHeight","editableDoc","rootDocument","isImage","contextMenuSelectImage","isTouchEvent","touch","touches","isEventOnImageOutsideRange","getResizeTargets","firstElementChild","isResizable","setSizeProp","targets","setGhostElmSize","ghostElm","resizeGhostElement","deltaX","deltaY","resizeHelperX","resizeHelperY","screenX","screenY","display","selectedElmX","selectedElmY","scrollWidth","scrollHeight","origin","fireObjectResizeStart","endGhostResize","wasResizeStarted","showResizeRect","fireObjectResized","nodeChanged","targetElm","unbindResizeHandleEvents","targetWidth","targetHeight","hideResizeRect","handle","startDrag","handleElm","throttledShowResizeRect","removeSelected","isChildOrEqual","updateResizeRect","removed","composing","controlElm","getOrUndefined","selectedValue","img","disableGeckoResize","startElm","getEnd","execCommand","relativeToNative","startSitu","finishSitu","situ","setFinish","exactToNative","soffset","finish","foffset","adt$3","ltr","rtl","fromRange","diagnose","domRange","relative","exact","getRanges","rev","doDiagnose","SimRange","caretPositionFromPoint","offsetNode","caretRangeFromPoint","availableSearch","adt$2","Situ","cata","onBefore","onOn","onAfter","adt$1","SimSelection","exactFromRange","simRange","getWin","_finishSitu","_soffset","_finish","_foffset","getStart$1","beforeSpecial","name$1","preprocessRelative","preprocessExact","fromElements","toNative","getDomRange","filtered","preprocess","getAtPoint","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","normalize","normalizedRng","compareRanges","getCaretRangeFromPoint","documentFocusInHandler","api","getOffset","aggregate","properties","cumulativeInclusions","Dimension","getDocument","walkUp","navigation","view","rest","Navigation","freeze","__proto__","frameElement","find","frames","pathTo","loc","excludeFromDescend","markerInfo","cleanupFun","pageYOffset","pageXOffset","absolute","get$2","createMarker$1","last","descend","span","withMarker","preserveWith","_s","_e","applyWithMarker","withScrollEvents","fireScrollIntoViewEvent","fireAfterScrollIntoViewEvent","withElement","elementMarker","startElement","endElement","scrollToMarker","viewHeight","intoWindowIfNeeded","viewportBottom","markerTop","markerBottom","largerThanViewport","intoWindow","innerHeight","intoFrame","frameViewHeight","op","viewportBounds","rangeIntoWindow","elementIntoWindow","rangeIntoFrame","elementIntoFrame","scrollRangeIntoView","focus$1","focus","hasFocus$1","activeElement","active$1","clamp$1","normalizeRng","isOrContains","isRngInRoot","nativeRangeToSelectionRange","getSelection","readRange","bookmarkToNativeRng","store","newBookmark","shouldStore","validate","FocusManager","isEditorUIElement","className","Delay","setEditorTimeout","wrappedSetTimeout","setEditorInterval","wrappedSetInterval","register$6","throttledStore","mouseUpPage","registerPageMouseUp","registerMouseUp","selectionChange","isManualNodeChange","registerEditorEvents","DOM$9","isUIElement","customSelector","registerEvents$1","editorManager","focusedEditor","setActive","blurredEditor","getElement","getActiveElement","activeEditor","unregisterDocumentEvents","getFocusInElement","getCollapsedNode","normalizeSelection","caretPos","focusBody","hasElementFocus","rawBody","hasInlineFocus","iframeElement","hasIframeFocus","hasEditorOrUiFocus","hasUiFocus","activateEditor","skipFocus","quirks","refreshContentEditable","bookmarkRng","contentEditableHost","getContentEditableHost","focusEditor","getEndpointElement","real","getEnd$1","skipEmptyTextNodes","orig","processRanges","elementsWithCursorPosition","isCursorPosition","hasCursorPosition","first","res","descendantRtl","autocompleteSelector","create$9","findIn","isNone","setCursorLocation","typeLookup","walk$2","isEmptyTextNode","AstNode","insert","selfAttrs","cloneAttrs","selfAttr","refNode","whitespace","findCommentEndIndex","startIndex","lcHtml","isConditionalComment","endIfIndex","endIndex","endCommentRegexp","findMatchingEndTagIndex","startTagRegExp","endTagRegExp","voidElements","startMatch","endMatch","trimInternal","bogusAllRegExp","tempAttrs","trimContentRegExp","trimHtml$1","getTempAttrs","matchLength","endTagIndex","trimExternal","cleanupBogusElements","bogusElements","cleanupInputNames","inputs","input","getPlainTextContent","offscreenDiv","getContentContainer","getContentFromBody","emptyRegExp","trimEmptyContents","makeMap$1","Writer","indent","indentBefore","indent_before","indentAfter","indent_after","entity_encoding","htmlOutput","element_format","cdata","comment","pi","doctype","reset","getContent","HtmlSerializer","writer","handlers","sortedAttrs","elementRule","nonInheritableStyles","Set","shorthandStyleProps","getStyleProps","hasInheritableStyles","isNonInheritableStyle","hasStyleConflict","nodeStyleProps","parentNodeStyleProps","valueMismatch","prop","parentValue","nodeStyleProp","propExists","longhandProps","isChar","delta","isBeforeSpace","isAfterSpace","isEmptyText","matchesElementPosition","isImageBlock","isCefNode","isBogusAll$1","isBeforeImageBlock","isAfterImageBlock","isBeforeMedia","isAfterMedia","isBeforeTable","isAfterTable","isBeforeContentEditableFalse","isAfterContentEditableFalse","parentsUntil","parentsAndSelf","navigateIgnoreEmptyTextNodes","getClosestBlock$1","isAtBeforeAfterBlockBoundary","newPos","fromBlock","isAtBlockBoundary","isAtStartOfBlock","isAtEndOfBlock","isBeforeBlock","isAfterBlock","isBr$1","findBr","parentBlocks","isBeforeBr$1","isAfterBr","getElementFromPrevPosition","findPreviousBr","findNextBr","isInMiddleOfText","getClosestBlock","hasSpaceBefore","hasSpaceAfter","isInPre","isPreValue","isAtLineBoundary","isAtBeginningOfBody","isAtEndOfBody","isSiblingCefBlock","needsToBeNbspLeft","prevPos","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","paddEmptyBlock","deleteNormalized","afterDeletePosOpt","oc","prevTextOpt","nextTextOpt","deleteElement$2","moveCaret","afterDeletePos","normalizedAfterDeletePos","isInlineElement","setContent","paddPos","strongRtl","isInlineTarget","hasStrongRtl","findRootInline","findInlineParents","normalizePosition","normalizeForwards","normalizeBackwards","execCommandIgnoreInputEvents","inputBlocker","off","execNativeDeleteCommand","isTextBlockOrListItem","getParentBlock$2","isBeforeRoot","paddEmptyBody","moveSelection","no_selection","freefallRtl","deleteRangeContents","deleteContents","lastBlock","additionalCleanupNodes","getTableCells","tableCellRng","deleteAction","singleCellTable","fullTable","partialTable","multiTable","getClosestCell$1","isExpandedCellRng","cellRng","getTableFromCellRng","startParentTable","endParentTable","getTableSelectionFromCellRng","cells","tableSelection","getTableSelections","selectionDetails","isSameTable","sameTableSelection","startCell","endCell","startTableSelection","getCellRangeFromStartTable","endTableSelection","getCellRangeFromEndTable","getCellIndex","getSelectedCells","isSingleCellTableContentSelected","optCellRng","rows","isSingleCellTable","unselectCells","startTable","endTable","otherContentRng","getActionFromRange","isRootFromElement","getCellRng","getTable","isStartInTable","isEndInTable","isMultiTable","getTableDetailsFromRange","_ref9","startTableSelectedCells","endTableSelectedCells","handleMultiTable","_ref8","handleSingleTable","cleanCells","deleteContentInsideCell","isFirstCellInSelection","insideTableRng","deleteCellContents","collapseAndRestoreCellSelection","selectedNode","emptySingleTableCells","outsideDetails","editorRng","cellsToClean","_ref10","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","toCell","deleteBetweenCells","isNearTable","deleteCaret$3","fromPos","isBeforeOrAfterTable","deleteCaretCaption","backspaceDelete$9","deleteRange$2","getContentEditableRoot$1","internalAttributesPrefixes","each$9","ElementUtils","internalAttributes","isAttributeInternal","attributeName","compare","attribs","compareObjects","obj1","obj2","matchNode$1","nodeFilters","attributeFilters","nl","runFilters","matchRecord","filteringAttributes","filter$2","traverse","childNode","findMatchingNodes","paddEmptyNode","astNode","hasOnlyChild","isPadded","removeOrUnwrapInvalidNode","originalNodeParent","_step2","_iterator2","cleanInvalidNodes","onCreate","textBlockElements","nonSplittableElements","fixed","newParent","wrap","isInvalid","parentName","hasClosest","normalizeBlockSelectionRange","commonAncestorContainer","newEndPos","isPaddedEmptyBlock","hasOnlyOneChild$1","isPaddingNode","isListFragment","isEmptyFragmentElement","isListItemPadded","isPadding","trimListItems","getParentLi","findLastOf","newCaretPos","insertBefore$1","findFirstIn","insertAtCaret$1","domFragment","cleanupDomFragment","toDomFragment","liTarget","liElms","isAt","caretWalker","newPosNode","insertAfter$1","beforeRng","afterRng","cloneContents","getSplit","insertMiddle","mergeableWrappedElements","isTableCell","deleteSelectedContent","isTableCellContentSelected","insertHtmlAtCaret","details","parser","merge","bookmarkHtml","caretElement","canHaveChildren","parserArgs","paste","isParentBlockLi","isPastingSingleElement","isWrappedElement","isPastingInTheSameBlockTag","isPastingInContentEditable","shouldPasteContentOnly","markFragmentElements","_selectionOverrides","showBlockCaretContainer","invalid","markerNode","toExtract","getNodeFilters","getAttributeFilters","no_events","validInsertion","textInlineElements","elementUtils","reduceInlineTextElements","_c","nextRng","parentEditableElm","isPartOfFragment","findNextCaretRng","moveSelectionToMarker","trimBrsFromTableCell","caretParent","updateCaret","isTreeNode","setEditorHtml","noSelection","setContentInternal","trimmedHtml","setContentTree","padd","forcedRootBlockName","isRootContent","setContentString","sibling$1","ensureIsRoot","closest$2","transform","transformed","isEq$3","matchesUnInheritedFormatSelector","inherit","matchParents","similar","matchedNode","matchNode","matchName","matchItems","itemName","matchAttributes","onmatch","expectedValue","isEmptyValue","match$2","closest$1","rawElm","matchAllOnNode","formatNames","matchSimilar","isVariableValue","field","fieldValues","isVariableFormatName","ZWSP","isCaretContainerEmpty","getEmptyCaretContainers","findFirstTextNode","createCaretContainer","fill","removeCaretContainerNode","trimZwspFromCaretContainer","removeCaretContainer","appendNode","insertFormatNodesIntoCaretContainer","formatNodes","innerMostFormatNode","formatNode","removeCaretFormat","hasContentAfter","expandedRng","newCaretContainer","insertCaretContainerNode","cleanedFormatNode","validFormats","matchedFormats","fmtName","clonedFormatNode","cleanFormatNode","caretTextNode","setup$u","keyCode","disableCaretContainer","isFormatElement","inlineElements","postProcessHooks","isPre","addPostProcessHook","blocks","getSelectedBlocks","preBlocks","pre","hasPreSibling","pre1","pre2","sPre2","listItemStyles","findExpandedListItemFormat","fmt","hasListStyles","getExpandedListItemFormat","isRngStartAtStartOfElement","isRngEndAtEndOfElement","isEditableListItem","getFullySelectedListItems","middle","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","getContainer","lastIdx","normalizeTableSelection","isTableCellOrRow","wrap$1","wrapWithSiblings","rootBlockElm","forcedRootBlock","list_block","isMixedFormat","processFormatAttrOrStyle","removeEmptyStyleAttributeIfNeeded","removeStyles","compareNode","stylesModified","_processFormatAttrOrS","styleName","styleValue","normalizedStyleValue","remove_similar","removeFormatInternal","ceFalseOverride","links","isColorFormatAndAnchor","preserveAttributes","preserve_attributes","attrsToPreserve","_processFormatAttrOrS2","currentValue","valueOut","removeFormat$1","newName","removeFormatFromClone","remove$2","splitToFormatRoot","formatRoot","findFormatRoot","lastClone","firstClone","formatRootParent","mixed","wrapAndSplit","removeNodeFormat","currentNodeMatches","textDecoration","isRemoveBookmarkNode","removeRngStyle","liFmt","removeListStyleFormats","each$6","mergeWithChildren","clear_child_styles","_value","clearChildStyles","each$5","applyStyles","styleVal","applyFormat$1","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","importNode","applyCaretFormat","fake","postProcess$1","hasVars","fallbackElement","matchingNode","matchingFormat","updateAndFireChangeCallbacks","registeredCallbacks","runIfChanged","spec","withSimilar","withoutSimilar","withVars","formatChangedInternal","registeredFormatListeners","formatChangeItems","getCurrent","toAppendTo","addListeners","removeListeners","_typeof","iterator","_setPrototypeOf","setPrototypeOf","_construct","Parent","Class","Reflect","construct","sham","Proxy","Boolean","valueOf","_isNativeReflectConstruct","_toConsumableArray","_arrayLikeToArray","_arrayWithoutHoles","iter","_iterableToArray","minLen","_unsupportedIterableToArray","TypeError","_nonIterableSpread","arr2","isFrozen","getOwnPropertyDescriptor","create$8","_ref","fun","thisValue","Func","arrayForEach","unapply","forEach","arrayPop","pop","arrayPush","stringToLowerCase","stringMatch","stringReplace","stringIndexOf","stringTrim","regExpTest","typeErrorCreate","_len2","_key2","_len","_key","addToSet","lcElement","newObject","lookupGetter","desc","warn","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","getGlobal","BreakType","purify","createDOMPurify","DOMPurify","originalDocument","DocumentFragment","HTMLTemplateElement","NodeFilter","_window$NamedNodeMap","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","trustedTypes","ElementPrototype","getNextSibling","getParentNode","template","trustedTypesPolicy","createPolicy","ATTR_NAME","currentScript","policyName","_createTrustedTypesPolicy","emptyHTML","_document","implementation","createNodeIterator","hooks","createHTMLDocument","PARSER_MEDIA_TYPE","transformCaseFunc","MUSTACHE_EXPR$1","ERB_EXPR$1","DATA_ATTR$1","ARIA_ATTR$1","IS_SCRIPT_OR_DATA$1","ATTR_WHITESPACE$1","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","tagNameCheck","writable","configurable","attributeNameCheck","allowCustomizedBuiltInElements","FORBID_TAGS","FORBID_ATTR","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","SAFE_FOR_TEMPLATES","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","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","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","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","ALL_SVG_TAGS","ALL_MATHML_TAGS","_forceRemove","_removeAttribute","attribute","getAttributeNode","_initDocument","dirty","leadingWhitespace","dirtyPayload","parseFromString","createDocument","_createIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isNode","_executeHook","entryPoint","_sanitizeElements","namespaceURI","allowedTags","_basicCustomElementTest","parentTagName","_checkValidNamespace","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","hookEvent","keepAttr","allowedAttributes","_attr","initValue","forceKeepAttr","setAttributeNS","_sanitizeShadowDOM","shadowNode","shadowIterator","sanitize","importedNode","oldNode","returnNode","toStaticHTML","nodeIterator","shadowroot","serializedHTML","setConfig","clearConfig","isValidAttribute","addHook","hookFunction","removeHook","removeHooks","removeAllHooks","explode$1","create$7","filters","addFilter","getFilters","removeFilter","newCallbacks","addFontToSpansFilter","domParser","fontSizes","addNodeFilter","face","removeAttrs","addFilters","convert_fonts_to_spans","font_size_legacy_values","convertToSTag","addStrikeFilter","parseDataUri","uri","_uri$split2","_toArray","base64Encoded","extractedData","extractBase64Data","decodeURIComponent","buildBlob","atob","Uint8Array","Blob","uriToBlob","fetch","ok","blob","blobUriToBlob","_ref11","blobToDataUri","reader","FileReader","onloadend","readAsDataURL","count$1","processDataUri","dataUri","base64Only","generateBlobInfo","_ref12","base64","btoa","createBlobInfo$1","blobCache","blobInfo","dataUriToBlobInfo","getByData","registerBase64ImageFilter","blob_cache","processImage","inputSrc","isInternalImageSource","isBogusImage","blobUri","each$4","queryParts","DEFAULT_PORTS","ftp","http","https","mailto","safeSvgDataUrlElements","isInvalidUri","decodedUri","encodedUri","unescape","decodeUri","allow_html_data_urls","allowSvgDataUrls","blockSvgDataUris","URI","baseUri","base_uri","source","isProtocolRelative","protocol","toAbsPath","urlMatch","part","userInfo","port","pathMatch","file","getURI","relativeUri","tu","uu","toRelPath","anchor","noHost","absoluteUri","isSameOrigin","defaultPort","breakPoint","normalizedBase","nb","normalizedPath","baseParts","pathParts","outPath","noProtoHost","uriComponents","pathname","extend$1","basePurifyConfig","filteredUrlAttrs","internalElementAttr","setupPurify","purify$1","ele","allow_conditional_comments","lcTagName","isInternalElement","bogus","hasNone","transferChildren","nativeParent","isSpecial","nativeChild","whitespaceCleaner","blockElements","textRootBlockElements","allWhiteSpaceRegExp","startWhiteSpaceRegExp","endWhiteSpaceRegExp","hasWhitespaceParent","isAtEdgeOfBlock","neighbour","isLineBreakNode","isNodeEmpty","isTextRootBlockEmpty","isPaddedWithNbsp","DomParser","nodeFilterRegistry","attributeFilterRegistry","defaultedSettings","root_name","parseAndSanitizeWithContext","rootName","mimeType","isSpecialRoot","wrappedHtml","config","getPurifyConfig","removeNodeFilter","removeAttributeFilter","isWrappableNode","isTransparentAstBlock","_whitespaceCleaner2","whitespacePre","whitespacePost","invalidFinder","findInvalidChildren","matchFinder","preprocessors","postprocessors","traverseOrder","_loop3","_node4","_loop4","postprocess","walkTree","_partition$","topLevelChildren","otherChildren","rootBlockName","forced_root_block","getRootBlockName","rootBlockNode","rootBlock","forced_root_block_attrs","addRootBlocks","remove_trailing_brs","prevName","lastParent","newRel","allow_unsafe_link_target","appendRel","allow_html_in_named_anchor","fix_list_elements","classValue","validClassesMap","register$4","inline_styles","register$5","withSerializedContent","fireEvent","serializedContent","serializeContent","eventArgs","preProcessGetContent","fireBeforeGetContent","postProcessGetContent","preProcessSetContent","processedEventArgs","fireBeforeSetContent","postProcessSetContent","tableModel","tableRow","cellPosition","getSpan","cellExists","getWidth","row","findElementPos","extractRows","sx","sy","ey","newRows","tableElm","rowspan","colspan","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","firstCell","lastCell","fullTableModel","sectionedTableModel","read$3","getSelectionFragment","isCollapsibleWhitespace","getInnerText","bin","extractSelectedContent","parentBlockOpt","contextNodeName","getContextNodeName","rangeContentClone","nonRenderedText","parentBlockText","textIndex","getTextContent","tmpElm","contextual","getSerializedContent","getSelectedContentInternal","defaultedArgs","getInner","setupArgs$3","updatedArgs","getOuterHtml","insertAt","write","fragments","vDown","vUp","buildScript","buildSnake","getMiddleSnake","currentFragments","diff","removeAt","applyDiff","start1","end1","start2","end2","diag","j","i2","snake","sum","lazyTempDocument","createFromEditor","trimmedFragments","trimmed","hasIframes","beforeBookmark","createFragmentedLevel","createCompleteLevel","applyToEditor","level","getLevelContent","getCleanLevelContent","isEq$1","level1","level2","hasEqualContent","hasEqualCleanedContent","isUnlocked","locks","setTyping","typing","endTyping","makePlainAdaptor","init","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","ignore","transact$1","ignore$1","extra","callback1","callback2","extra$1","matchAll","matchedFormatNames","checkedMap","canApply","closest","formatChanged","getContentInternal","insertContent","addVisual","matchedElm","hasVisual","addVisualInternal","autocompleter","addDecoration","removeDecoration","remove$3","isRtc","plugins","setup$s","editorCast","rtcPlugin","setup","getRtcSetup","rtcInstance","nul","makeNoopAdaptor","rtcEditor","defaultVars","_undoManager","_locks","_index","_node","_similar","_rfl","_details","_format","getRawModel","makeRtcAdaptor","rtc","isRemote","getRtcInstanceWithFallback","getRtcInstanceWithError","getContent$1","getSelectedContent","mergeAndNormalizeText","outerNode","outer","outerElm","oldLength","merge$1","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","anchorNode","START_TO_START","END_TO_END","isValidRange","removeAllRanges","addRange","setBaseAndExtent","focusNode","anchorRange","focusRange","anchorOffset","focusOffset","bookmarkManager","compareEndPoints","setNode","endElm","selectedBlocks","selectorChanged","getScrollContainer","scrollContainer","scrollElementIntoView","placeCaretAt","controlSelection","process$1","hasEventListeners","shouldFireEvent","oldDoc","clonedNode","impl","firePreProcess","preProcess$1","htmlParser","toHtml","serializeNode","outArgs","firePostProcess","postProcess","DomSerializerImpl","internalName","hasChildren","preserve_cdata","register$3","getHtmlFromNode","isBr","brNode1","brNode2","trimTrailingBr","parseHtml","addRules","setRules","DomSerializer","domSerializer","setupArgs$1","getContent$2","setupArgs","setContent$2","removedOptions","removedPlugins","getRemovedOptions","settingNames","setting","getRemovedPlugins","pluginNames","plugin","logWarnings","rawOptions","normalizedOptions","hasRemovedPlugins","hasRemovedOptions","isLegacyMobileTheme","theme","listJoiner","themesMessage","pluginsMessage","optionsMessage","logRemovedWarnings","DOM$8","safeDestroy","remove$1","editorUpload","save","is_removing","unbindAllNativeEvents","fireRemove","orgDisplay","restoreOriginalStyles","fireDetach","automatic","destroyed","_beforeUnload","form","_mceOldSubmit","submit","formEventDelegate","restoreForm","contentAreaContainer","editorContainer","bodyElement","contentDocument","contentWindow","clearDomReferences","IconManager","iconPack","icons","CreateIconManager","getProp","propName","getComputedSizeProp","getClientWidth","getClientHeight","getMarginTop","getMarginLeft","isXYInContentArea","bodyElm","transposedPoint","transpose","isInsideElementContentArea","isEditorAttachedToDom","rawContainer","getContentAreaContainer","NotificationManager","notifications","getImplementation","unimplemented","getNotificationManagerImpl","open","close","getArgs","getTopNotification","notification","closeNotification","otherNotification","progressBar","timeout","getEl","addNotification","getNotifications","serviceMessage","requestAnimationFrame","registerEvents","WindowManager","dialogs","getWindowManagerImpl","openUrl","alert","confirm","funcBind","_len13","_key13","addDialog","dialog","fireOpenEvent","closeDialog","fireCloseEvent","otherDialog","storeSelectionAndOpenDialog","openDialog","ui","windowManagerImpl","displayNotification","notificationManager","displayError","_skinLoaded","logError","createLoadError","initError","_len14","_key14","transformToUrls","cssLinks","skinUrl","contentCssFile","isContentCssSkinName","documentBaseURI","toAbsolute","appendContentCssFromSettings","contentCSS","getContentCssUrls","getFontCssUrls","filter$1","ImageScanner","uploadStatus","cachedPromises","images","getAllImages","isUploaded","promises","imageSrc","imageInfo","image","newPromise","invalidDataUri","getByUri","imageToBlobInfo","UploadStatus","blobUriStatuses","createStatus","resultUri","hasBlobUri","getResultUri","isPending","markPending","markUploaded","removeFailed","uuid","rnd","Uploader","pendingPromises","defaultHandler","progress","xhr","XMLHttpRequest","withCredentials","credentials","upload","onprogress","loaded","total","path1","path2","json","JSON","responseText","basePath","formData","FormData","filename","send","uploadHandler","handlerSuccess","handlerFailure","resolvePending","uploadBlobInfo","openNotification","percent","uploadBlobs","blobInfos","pendingUploadBlobInfo","createUploader","EditorUpload","uploader","imageScanner","cache","toBlobInfo","mime","URL","createObjectURL","findFirst","cachedBlobInfo","removeByUri","revokeObjectURL","BlobCache","urlFilters","aliveGuard","replaceString","replaceImageUrl","targetUrl","replacementUrl","replacementString","replaceUrlInUndoStack","uploadImages","scanForImages","imageInfos","imagesToRemove","shouldDispatchChange","filteredResult","uploadInfo","_imageInfos$index","convertURL","replaceImageUriInView","uploadError","uploadUri","dispatchChange","uploadImagesAuto","isValidDataUriImage","imgElm","resultItem","replaceBlobUris","source_view","genericBase","cellBase","cellFormats","tablecellbackgroundcolor","tablecellverticalalign","tablecellbordercolor","borderColor","tablecellclass","tableclass","tablecellborderstyle","borderStyle","tablecellborderwidth","borderWidth","FormatRegistry","strike","valigntop","verticalAlign","valignmiddle","valignbottom","alignleft","preview","textAlign","float","marginLeft","marginRight","aligncenter","alignright","alignjustify","bold","fontWeight","italic","fontStyle","underline","strikethrough","forecolor","hilitecolor","fontname","fontFamily","fontsize","fontSize","lineheight","lineHeight","fontsize_class","class","blockquote","subscript","superscript","_fmt","_itemName","lang","customValue","removeformat","get$1","unregister","each$3","isPreviewItem","parsedSelectorToHtml","ancestry","sItem","wrapInHtml","ancestors","parentCandidate","ancestorName","parentRequired","elmRule","getRequiredParent","siblingElm","parentSiblings","parseSelectorItem","$0","$3","$4","getCssText","previewCss","previewStyles","removeVars","previewFrag","previewElm","rawParentFontSize","parentFontSize","Formatter","formatChangeState","addShortcut","setup$r","nodeOrRange","setup$t","applyFormat","removeFormat","toggleFormat","matchFormat","closestFormat","matchAllFormats","matchNodeFormat","canApplyFormat","shouldIgnoreCommand","UndoManager","addUndoLevel","isFirstTypedCharacter","addNonTypingUndoLevel","isDirty","modKey","inputType","isInsertFromPasteOrDrop","addKeyboardShortcuts","nonTypingKeycodes","placeholderAttr","isKeyboardEvent","isDeleteEvent","setup$q","placeholder","updatePlaceholder","isNonTypingKeyboardEvent","showPlaceholder","isTypingKeyboardEvent","isVisuallyEmpty","firePlaceholderToggle","blockBoundary","getBlockPosition","containerElm","blockPosition","getClosestHost","readFromRange","fromBlockPos","toBlockPos","blockPos","lastPositionInBlock","skipLastBr","isDifferentBlocks","hasSameHost","isEditable$2","isValidBlock","hasValidBlocks","extractChildren","getChildrenUntilBlockBoundary","removeEmptyRoot","nestedBlockMerge","toBlock","insertionPoint","sidelongBlockMerge","getInsertionPoint","parentsAndSelf$1","findInsertionPoint","trimBr","mergeBlockInto","mergeBlocks","block1","block2","backspaceDelete$8","read$1","isRawNodeInTable","isEverythingSelected","noPrevious","noNext","isSelectionInTable","deleteRange$1","emptyEditor","deleteRangeMergeBlocks","backspaceDelete$7","_forward","showCaret","getNodeRange","renderRangeCaret","caretPositionNode","caretPositionBeforeNode","ceRoot","renderCaretAtRange","isBeforeBoundary","isAfterBoundary","deleteContentAndShowCaret","peekCaretPosition","caretRange","deleteRange","trimEmptyTextNode","backspaceDelete$6","getNextPosFn","isBeforeFn","nextCaretPosition","normalizedNextCaretPosition","deleteBoundaryText","getEdgeCefPosition","atStart","isCefAtEdgeSelected","DeleteAction","moveToElement","moveToPosition","deleteEmptyBlockOrMoveToCef","toCefElm","blockElm","findCefPosition","isDeleteFromCefDifferentBlocks","getContentEditableAction","caretLocation","isAtContentEditableBlockCaret","getContentEditableBlockAction","skipMoveToActionFromInlineCefToContent","getAncestorCe","backspaceDeleteCaret","read","hideFakeCaret","deleteElement$1","backspaceDeleteRange","paddEmptyElement","backspaceDelete$5","backspaceDelete$4","deleteCaret$2","isText$2","startsWithCaretContainer","endsWithCaretContainer","createZwsp","insertInline","insertInlineBefore","insertInlineAfter","insertInlinePos","isPosCaretContainer","caretNode","renderCaret","evaluateUntil","fns","Location","rescope$1","nPos","isNotInsideFormatCaretContainer","findInsideRootInline","start$1","isValidLocation","readLocation","getName","outside","inside","betweenInlines","fromInline","toInline","hasSameParentBlock","skipNoMovement","fromLocation","toLocation","location2","location1","findLocationSimple","findLocation$1","findLocationTraverse","moveRel","modify","moveByWord","hasSelectionModifyApi","VDirection","flip","positions","walk$1","getBreakType","currentPos","Br","Block","Wrap","getPositionsUntil","breakType","breakAt","Eol","getAdjacentLinePositions","getPositionsUntilBreak","findClosestHorizontalPositionFromPoint","lastRect","newRect","lastDist","findClosestHorizontalPosition","targetRect","getPositionsUntilPreviousLine","getPositionsUntilNextLine","getPositionsAbove","getPositionsBelow","getClosestPositionAbove","getClosestPositionBelow","isContentEditableFalse$4","distanceToRectLeft$1","distanceToRectRight$1","findClosestClientRect","oldClientRect","oldDistance","newDistance","getNodeClientRects","toArrayWithNode","SimpleResultType","walkUntil","isAboveFn","isBeflowFn","line","targetClientRect","findUntil","upUntil","Up","downUntil","Down","getLastClientRect","isAboveLine","lineNumber","aboveLineNumber","isLine","isLineNumber","moveToRange","renderRangeCaretOpt","moveHorizontally","isBefore","isAfter","isElement","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$2","moveWord","_caret","setupSelectedState","inlineBoundaries","selectedInlines","targetInlines","toggleInlines","inlines","_inline","renderInsideInlineCaret","moveNextWord","movePrevWord","moveToLineEndPoint$2","linePoint","outsideLoc","setCaretLocation","deleteFromTo","rangeFromPositions","backspaceDeleteCollapsed","rescope","toPosition","normalizedFirstPos","normalizedLastPos","hasOnlyTwoOrLessPositionsLeft","backspaceDelete$3","hasOnlyOneChild","deleteLastPosition","parentInlines","isFormatElement$1","innerMost","replaceWithCaretFormat","deleteCaret$1","getParentInlines","normalizedFromPos","willDeleteLastPositionInElement","backspaceDelete$2","deleteElement","backspaceDelete$1","isNearMedia","deleteCaret","parseIndentValue","getIndentStyleName","useMargin","canOutdent","getBlocksToIndent","isReadOnly","indentStyleName","intentValue","validateBlocks","isListComponent","parentIsListComponent","indentation","indentUnit","indentValue","unit","parsedValue","indentElement","outdent","backspaceDelete","findAction","forwardDeleteCommand","execNativeForwardDeleteCommand","setup$p","addCommand","deleteCommand","getTouch","setup$o","startData","longpressFired","debounceLongpress","distX","distY","isFarEnough","isEqualNode","isBlockElement","isValidTarget","shouldRemoveTextNode","createRootBlock","rootNodeName","hasBlockParent","restoreSelection","insertEmptyLine","checkClassName","replaceMatchWithSpan","prevChar","findStartTagIndex","setup$m","contentEditableAttrName","editClass","nonEditClass","hasEditClass","hasNonEditClass","nonEditableRegExps","convertRegExpsToNonEditable","blockCaretContainer","handleBlockContainer","findBlockCaretContainer","isContentEditableFalse$3","exitPreBlock","getVisualCaretPosition$1","newBlock","textBlock","createTextBlock","getHorizontalRange","moveToCeFalseHorizontally","getVerticalRange","down","moveToCeFalseVertically","moveH$2","moveV$3","moveToLineEndPoint$1","selectToEndPoint","curRng","isTarget","isAtFirstOrLastLine","isAtLastLine","isAtFirstLine","moveCaretToNewEmptyLine","getClosestTargetBlock","moveV$2","baseKeyPattern","matchesEvent","match$1","defaultPatterns","matchDelayed","defaultDelayedPatterns","_len15","_key15","execute","executeWithDelayedAction","moveH$1","moveV$1","moveToLineEndPoint","CellLocation","filterFirstLayer","tags","lookup$1","isEligible","newIndex","isEditable","assumeEditable","editable","getRaw","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","insertFn","renderBlock","navigateVertically","getClosestAbovePosition","getClosestBelowPosition","move$1","mover","moveH","moveV","tabGo","_current","getCellFirstCursorPosition","tabForward","tabBackward","handleTab","rootElements","model","clearSelectedCells","setup$k","isMac","executeKeydownOverride$4","DOM$7","alwaysNext","textBefore","scanLeft","scanRight","repeatLeft","getText","isWhitespace","stripTrigger","trigger","findStart","initRange","minChars","buffer","firstChar","findTrigger","spot","toLast","isText$1","toLeaf","isStartOfWord","leaf","_element","isPreviousCharContent","getDatabase","database","triggers","getTriggerContext","lookupWithContext","fetchOptions","startText","autocompleters","lookupByTrigger","lookupData","ac","maxResults","matchText","columns","onAction","highlightOn","fold$1","stype","serror","svalue","Value","SimpleResult","formatObj","stringify","getErrorInfo","chooseFrom","branch","missingBranch","extract","choose$1","missingKey","chosen","baseMerge","merger","curObject","deepMerge","old","defaulted$1","fallback","mergeErrors","ResultCombine","objects","partitions","ifField","ifCustom","newKey","presence","instantiator","validator","custom","anyValue$1","requiredAccess","bundle","missingRequired","fallbackAccess","extractField","av","bundleAsOption","optValue","ov","optionAccess","optionDefaultedAccess","objOf","fields","_step3","_iterator3","extractFields","fieldStrings","_okey","_presence","_instantiator","arrOf","asRaw","errs","extractValue","formatError","errInfo","es","choose","anyValue","typedValue","expectedType","actualType","number","string","boolean","functionProcessor","customField","validateEnum","requiredOf","requiredString","requiredFunction","optionOf","optionString","defaultedOf","defaultedNumber","defaultedStringEnum","defaultedBoolean","defaultedFunction","fetch$1","onSetup","optionalText","optionalIcon","optionalTooltip","optionalLabel","active","enabled","primary","defaultedType","defaultedString","autocompleterSchema","defaulted","defaultedArrayOf","baseToolbarButtonFields","baseToolbarToggleButtonFields","contextBarFields","contextButtonFields","contextToggleButtonFields","launchButtonFields","launchToggleButtonFields","toggleOrNormal","contextformbutton","contextformtogglebutton","requiredArrayOf","FakeCaretPosition","register$2","popups","dataset","popup","datasetValues","dv","setup$j","activeAutocompleter","uiActive","isActive","cancelIfNecessary","removeAutocompleterDecoration","fireAutocompleterEnd","commenceIfNecessary","addAutocompleterDecoration","getAutocompleters","newContext","doLookup","lookupInfo","fireAutocompleterUpdate","fireAutocompleterStart","_ui","update","which","setupEditorInput","createAndFireInputEvent","eventType","specifics","overrides","bubbles","isComposing","detail","currentTarget","eventPhase","AT_TARGET","originalTarget","explicitOriginalTarget","isTrusted","cancelable","InputEvent","fireFakeInputEvent","fireFakeBeforeInputEvent","setup$i","applyAction","executeKeydownOverride$3","executeKeyupOverride","moveToCaretPosition","firstNonWhiteSpaceNodeSibling","getEditableRoot","editableRoot","getParentBlock$1","hasParent","isListBlock","getContainerBlock","containerBlock","containerBlockParent","isFirstOrLastLi","insert$3","createNewBlock","newBlockName","containerParent","isFirstChild","tmpRng","hasFirstChild","isEmptyAnchor","containerAndSiblingName","canSplitBlock","normalizeZwspOffset","setForcedBlockAttrs","forcedRootBlockAttrs","attrStyles","newStyles","attrClassesOpt","attrClasses","currentClassesOpt","currentClasses","filteredClasses","newClasses","appliedAttrs","remainingAttrs","applyAttributes","blockbreak","parentBlockName","isAfterLastNodeInContainer","isCaretAtStartOrEndOfBlock","normalizedOffset","insertNewBlockAfter","containerBlockName","optionValue","shouldEndContainer","parentList","isWithinNonEditableList","startNodeParent","wrapSelfAndSiblingsInDefaultBlock","parentBlockParent","includeZwspInRange","trimZwsp","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","inBlock","getParentBlockName","inCefBlock","inPreBlock","shouldPutBrInPre","inBrContext","shouldInsertBr","hasShiftKey","_editor","canInsertIntoEditableRoot","rootEditable","predicates","insertBreak","execEditorDeleteCommand","logicalAction","getAction","setup$h","handleEnterKeyEvent","setup$g","executeKeydownOverride$2","setup$f","normalizeNbspsInEditor","platform","isPageUpDown","setNodeChangeBlocker","blocked","setup$e","executeKeyupAction","insertTextAtPosition","insertNbspAtPosition","insertSpaceAtPosition","insertInlineBoundarySpaceOrNbsp","checkPos","needsToHaveNbsp","insertSpaceOrNbspAtSelection","locationToCaretPosition","setSelection","setup$d","executeKeydownOverride$1","executeKeydownOverride","tableTabNavigation","setup$b","setup$l","setup$c","NodeChange","lastRng","lastPath","nativeRng","fakeRng","isSameElementPath","initialized","currentPath","internalMimeType","internalHtmlMime","internalMark","mark","isMarked","toBlockElements","rootTag","rootAttrs","tagOpen","openContainer","tagClose","paragraphs","pasteBinDefaultContent","isPasteBin","isDefaultPasteBinContent","PasteBin","lastRngCell","pasteBinElm","create$6","pasteBinClone","getHtml","copyAndRemove","toElm","fromElm","_filter$2","pasteBinClones","dirtyWrappers","cleanWrapper","getLastRng","trimHtml","s1","s2","processResult","cancelled","filterContent","internal","preProcessArgs","firePastePreProcess","filteredContent","preProcess","tempBody","postProcessArgs","firePastePostProcess","postProcessFilter","pasteHtml$1","isAbsoluteUrl","linkSelection","pasteHtmlFn","createLink","insertImage","isImageUrl","createImage","pasteAsText","smartInsertContent","createIdGenerator","doPaste","pasteHtml","internalFlag","unmark","pasteText","encodedText","getDataTransferItems","dataTransfer","types","contentType","hasContentType","clipboardContent","hasHtmlOrText","createBlobInfo","useFileName","extractFilename","allowedExtensions","extension","lowerExt","mimeOverrides","jpg","jpe","jfi","jif","jfif","pjpeg","pjp","pasteImageData","clipboardData","kind","getAsFile","getImagesFromDataTransfer","fileResults","imageItem","_ref13","existingBlobInfo","pasteImage","insertClipboardContent","plainTextMode","isInternal","isPlainTextHtml","isPlainText","isAbsoluteUrl$1","ignoreElements","registerEventHandlers","pasteBin","pasteFormat","keyboardPastePlainTextState","isKeyboardPasteEvent","isBrokenAndroidClipboardEvent","registerEventsAndFilters","isWebKitFakeUrl","isDataUri","isPasteInsert","_step4","_iterator4","registerDataImageFilter","register$1","togglePlainTextPaste","setClipboardData","clearData","setData","setHtml5Clipboard","contenteditable","overflow","offscreenRange","selectNodeContents","hasSelectedContent","isTableSelection","cut","getCaretRangeFromEvent","setFocusedRange","setup$a","draggingInternallyState","hasImage","dropContent","plainTextContent","isPlainTextFileUrl","internalContent","trimmedContent","rgbRegExp","rgbToHex","removeWebKitStyles","webKitStylesOption","webKitStyles","inputStyles","outputStyles","inputValue","compareInput","outputStyle","setup$7","filterFunc","addPreProcessFilter","setup$8","processEvent","setup$9","setup$6","preventSummaryToggle","filterDetails","isText","isContentEditableFalse$2","getClosestScope","isContentEditableTrue","getClosestCef","findEdgeCaretCandidate","onTripleClickSelect","startRng","clickNode","cef","findClosestBlockRange","customEventRootDelegates","beforeUnloadDelegate","distanceToRectLeft","distanceToRectRight","isOverlapping","r1","r2","overlap","overlapY","collidesY","splitRectsPerAxis","rects","prevRect","boundingClientRectFromRects","boundingRect","_partition$2","horizontalDistance","_y","closestChildCaretCandidateNodeRect","caretCandidateRect","findClosestCaretCandidateNodeRect","distance","sortedRects","getClosestTextNode","_splitRectsPerAxis2","horizontalRects","verticalRects","_partition$3","above","below","closestCaretCandidateNodeRect","ownerDoc","helper","prevScope","childNodesWithoutGhost","uncheckedChildren","newScope","traverseUp","closestFakeCaretCandidate","Before","After","clientInfo","getAbsolutePosition","docElem","calc","bodyPosition","getBodyPosition","scrollPosition","getScrollPosition","mousePosition","iframePosition","inlineScroll","iframeScroll","getBodyScroll","getMousePosition","isContentEditableFalse$1","_len9","_key9","createGhost","clonedElm","opacity","padding","boxSizing","scrollEditor","amount","_defineProperty","scrollRight","scrollUp","scrollDown","removeElement","button","isLeftMouseButtonPressed","ceElm","elmPos","dragging","maxX","maxY","relX","relY","ghost","intervalId","delay","functionToRepeat","move","throttledPlaceCaretAt","caretInfo","state_","movement","mouseEventOriginatedFromWithinTheEditor","targetPos","applyRelPos","mouseY","mouseX","overflowX","outerMouseY","outerMouseX","innerWidth","moveGhost","drop","targetElement","dragElement","isValidDropTarget","getRawTarget","targetClone","cloneElm","removeDragState","bindFakeDragEvents","pageDom","dragStartHandler","dragHandler","dropHandler","dragEndHandler","init$2","preventFileDrop","preventFileDropIfUIElement","editorRoot","eventNames","blockUnsupportedFileDrop","isContentEditableFalse","getContentEditableRoot","SelectionOverrides","selectedElement","realSelectionId","isFakeSelectionTargetElement","isWithinCaretContainer","isRangeInCaretContainer","normalizeVoidElementSelection","selectElement","realSelectionContainer","setupOffscreenSelection","nodeElm","setElementSelection","afterNode","removeElementSelection","contentEditableRoot","closestContentEditable","setRange","isFakeSelectionElement","renderFocusCaret","setup$4","setup$3","getNormalizedTextOffset","generatePath","generatePathRange","resolvePath","nodePath","optNode","resolvePathRange","_ref14","_ref15","cleanEmptyNodes","deleteRng","clean","startParent","endParent","getParentBlock","resolveFromDynamicPatterns","patternSet","beforeText","dynamicPatterns","dynamicPatternsLookup","blockPatterns","inlinePatterns","getBeforeText","stripPattern","firstTextNode","textAfter","applyPattern$1","formatSet","isBlockFormatName","findPattern$1","sortedPatterns","sortPatterns$1","nuText","newMarker","rangeFromMarker","createMarker","markerPrefix","pathRange","textEnd","textStart","startParentNode","removeMarker","isReplacementPattern","findPatternStartFromSpot","patternContent","startPattern","searchText","startEndIndex","startPatternIndex","nextSpot","findPattern","normalizedMatches","endPathRng","endRng","resultsOpt","findPatternsRec","remainingPatterns","requireGap","startRange","findPatternStart","startPathRng","generatePathRangeFromRange","endSpot","patternsWithoutCurrent","applyPattern","patternRange","findPatterns","matchesWithSortedPatterns","hasSameMatches","sortedMatch","getBestMatches","applyMatches","matchesWithMarkers","matchesWithEnds","endMarker","startMarker","addMarkers","markerRange","applyReplacementPattern","markerEndRange","markerStartRange","patternMarker","applyPatternWithContent","handleEnter","dynamicPatternSet","inlineMatches","blockMatches","blockText","findPatterns$1","applyMatches$1","checkKeyEvent","codes","setup$2","charCodes","keyCodes","getPatternSet","hasDynamicPatterns","hasTextPatternsLookup","handleInlineTrigger","handleInlineKey","charCode","Quirks","getAttributeApplyFunction","isSelectionAcrossElements","isGecko","isWebKit","setEditorCommandState","emptyEditorWhenDeleting","serializeRng","contents","allRng","allContentsSelected","selectAll","shortcuts","documentElementEditingFocus","Range","blur","selectControlElements","visualAidsAnchorClass","disableBackspaceIntoATable","setGeckoEditingOptions","addBrAfterLastLinks","showBrokenImageIcon","contentStyles","restoreFocusOnKeyDown","bodyHeight","blockCmdArrowNavigation","tapLinksAndImages","blockFormSubmitInsideEditor","isAllContentSelected","setAttributeNode","DOM$6","getRootName","removeUndefined","mkParserSettings","mkSchemaSettings","initEditor","bindPendingEventDelegates","fireInit","moveSelectionToFirstCaretPosition","initInstanceCallback","autoFocus","getStyleSheetLoader$1","loadContentCss","fontCss","removeCss","contentCssText","allStylesheets","framedFonts","makeStylesheetLoadingPromises","contentStyle","appendStyle","initEditorWithInitialContent","startContent","loadInitialContent","contentBodyLoaded","disabled","readonly","createParser","mkSerializerSettings","annotator","_nodeChangeDispatcher","setup$5","setup$1","setup$n","setupRtcThunk","firePreInit","spellcheck","firePostRender","directionality","protect","escape","preInit","setupRtc","setProgressState","_rtcMode","initContentBody","skipWrite","visibility","orgVisibility","iframe","iframeHTML","srcdoc","DOM$5","createIframe","boxInfo","iframeTitle","tabindex","ifr","title","customAttrs","frameBorder","allowTransparency","createIframeElement","iframeContainer","documentBaseUrl","bodyId","bodyClass","translatedAriaText","getIframeHtml","DOM$4","initPlugin","initializedPlugins","Plugin","pluginUrl","pluginInstance","pluginInitError","createThemeFalseResult","renderThemeFalse","renderThemeFalseIframe","renderThemeUi","render","renderUI","renderFromLoadedTheme","iframeHeight","renderFromThemeFunc","iconPackName","currentIcons","loadIcons","svgData","icon","addIcon","initIcons","Theme","initTheme","Model","initModel","trimLegacyPrefix","initPlugins","renderInfo","uiApiFacade","isEnabled","setEnabled","augmentEditorUiApi","hidden","init$1","DOM$3","hasSkipLoadPrefix","loadLanguage","scriptLoader","languageCode","languageUrl","languageLoadError","loadTheme","themeUrl","themeLoadError","loadModel","modelUrl","modelLoadError","getIconsUrlMetaFromName","defaultIconsUrl","customIconsUrl","getIconsUrlMetaFromUrl","cat","urlMeta","iconsLoadError","loadPlugins","loadPlugin","pluginLoadError","isThemeLoaded","isModelLoaded","loadQueue","snapshot","getStyleSheetLoader","resetContent","triggerSave","windowManager","isEncodingXml","set_dirty","deviceDetection","normalizePlugins","trimmedPlugins","extractSections","sections","hasSection","sectionResult","getMobileOverrideOptions","mobileOptions","table_grid","object_resizing","resize","toolbar_mode","toolbar_sticky","menubar","getExternalPlugins","overrideOptions","userDefinedExternalPlugins","external_plugins","processPlugins","isMobileDevice","defaultOverrideOptions","forcedPlugins","forced_plugins","desktopPlugins","mobileConfig","getSectionConfig","platformPlugins","mobilePlugins","getPlatformPlugins","combinedPlugins","combinePlugins","combineOptions","defaultOptions","deviceOverrideOptions","mobile","extendedOptions","isOnMobile","defaults","sectionOptions","getSection","addVisual$1","registerExecCommands$3","toggleAlign","align","editorCommands","addCommands","JustifyLeft","JustifyCenter","JustifyRight","JustifyFull","JustifyNone","registerCommands$a","alignStates","registerQueryStateCommands$1","trimOrPad","trimOrPadLeftRight","insertAtCaret","_processValue$","processValue$1","insertedContent","insertContent$1","legacyPropNames","isFont","getSpecifiedFontProp","legacyPropName","getProperty","getFontProp","getComputedFontProp","getFontSize","getFontFamily","findFirstCaretElement","bindRange","getCaretElement","mapRange","fromFontSizeNumber","fontSizeNumber","getFontStyleValues","fontClasses","getFontSizeClasses","normalizeFontNames","font","fonts","registerExecCommands$2","_command","fontNameAction","fontSizeAction","lineHeightAction","customCode","registerQueryValueCommands","isFormatMatch","addQueryValueHandler","fontNameQuery","fontSizeQuery","specifiedStyle","lineHeightQuery","registerCommands$5","Indent","Outdent","registerCommands","queryCommandEnabled","queryCommandSupported","registerCommands$9","mceAddUndoLevel","mceEndUndoLevel","Undo","Redo","registerCommands$6","mceSelectNodeDepth","mceSelectNode","editingHost","registerCommands$1","mceCleanup","insertHorizontalRule","insertText","insertHTML","mceInsertContent","mceSetContent","mceReplaceContent","mceNewDocument","registerCommands$8","applyLinkToSelection","linkDetails","unlink","mceInsertLink","registerCommands$4","insertParagraph","mceInsertNewLine","InsertLineBreak","registerCommands$2","listParent","registerExecCommands$1","list","registerQueryStateCommands","registerCommands$3","registerCommands$7","mceRemoveNode","mcePrint","print","mceFocus","mceToggleVisualAid","registerExecCommands","selectionSafeCommands","isSelectionSafeCommand","EditorCommands","commands","lowerCaseCommand","skip_focus","restore","commandList","_this2","_this3","_this4","internalContentEditableAttr","setContentEditable","toggleReadOnly","removeFakeSelection","switchOnContentEditableTrue","restoreFakeSelection","registerFilters","allowedEvents","processReadonlyEvents","isClickEvent","getAnchorHrefOpt","targetEl","numChars","removeFromStart","isReadOnlyAllowedEvent","nativeEvents","EventDispatcher","bindings","toggleEvent","beforeFire","once","wrappedCallback","currentName","_this5","bindingName","filteredHandlers","binding","getEventDispatcher","_eventDispatcher","isNative","toggleNativeEvent","Observable","bubble","dispatcherArgs","DOM$2","getEventTarget","eventName","eventRoot","isListening","bindEventDelegate","delegates","eventRootElm","delegate","editors","EditorObservable","_pendingNativeEvents","stringListProcessor","getErrorMessage","isValidResult","processValue","processor","create$5","initialOptions","setValue","isRegistered","isBuiltInSpec","getBuiltInProcessor","processDefaultValue","default","immutable","unset","registered","defaultModes","switchToMode","activeMode","availableModes","oldMode","newMode","activate","deactivate","editorReadOnly","fireSwitchMode","create$4","design","registerReadOnlyContentFilters","registerReadOnlySelectionBlockers","setMode","registerMode","each$2","keyCodeLookup","f1","f2","f3","f4","f5","f6","f7","f8","f9","f10","f11","f12","modifierNames","parseShortcut","shortcut","isModifier","access","alt","ctrl","meta","Shortcuts","pendingPatterns","hasModifier","isFunctionKey","matchShortcut","subpatterns","executeShortcutAction","cmdFunc","normalizeCommandFunc","createShortcut","bridge","buttons","menuItems","contextMenus","contextToolbars","sidebars","views","addButton","addGroupToolbarButton","addToggleButton","addMenuButton","addSplitButton","addMenuItem","addNestedMenuItem","addToggleMenuItem","addAutocompleter","addContextMenu","addContextToolbar","addContextForm","addSidebar","addView","create$3","DOM$1","each$1","Editor","loadedCSS","isNotDirty","documentBaseURL","registerOption","normalizeOptions","hasPlugin","lookupFn","ctx","rawPatterns","_ctx","_setBaseUrl","baseURI","setupCallback","addQueryStateHandler","queryCommandState","queryCommandValue","loadArgs","saveArgs","initialContent","oldState","urlConverterCallback","toRelative","boundGlobalEvents","globalEventDelegate","EditorManager","toggleGlobalEvents","removeEditorFromList","targetEditor","oldEditors","isQuirksMode","compatMode","majorVersion","minorVersion","releaseDate","i18n","tinymce","tinyMCEPreInit","srcScript","overrideDefaults","base_url","pluginBaseUrls","plugin_base_urls","pluginBaseUrl","pluginName","invalidInlineTargets","provideResults","initEditors","initCount","execCallback","isDuplicated","unique$1","findTargets","isInvalidInlineTarget","createEditor","createId","existingEditor","editorId","editorOptions","addI18n","relatedTarget","dataValue","tasks","resultFns","localStorage","FakeClipboard","FakeClipboardItem","getType","relativePosition","targetW","targetH","relChars","create$2","Rect","inflate","findBestRelativePosition","constrainRect","rels","intersect","cropRect","x1","y1","clamp","clampRect","fixedSize","cx2","cy2","underflowX1","underflowY1","overflowX2","overflowY2","fromClientRect","Resource","loadErrMsg","runErrMsg","task","waiter","resolveCb","rejectCb","complete","completer","_len16","_key16","_len17","_key17","awaiter","setItem","removeItem","storage","getItem","publicApi","geom","util","LocalStorage","ImageUploader","showNotification","TreeWalker","Serializer","Selection","tinyMCE","exportToWindowGlobal","exportToModuleLoaders"],"mappings":"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AAU,QAC5BgS,GAAQ,SAAAvS,GAAO,OAAImS,GAAMxpB,IAAIqX,EAAS,EACtCoS,GAAY,SAAApS,GAAO,OAAImS,GAAMC,UAAUpS,EAAS,EA+GhDwS,GAAoB,CAAC,OAAOtjB,OAxBjB,CACf,KACA,KACA,KACA,KACA,KACA,OAmBIujB,GAAa,SAAArU,GACjB,IAAIsU,EACJ,OAAO,SAAAnP,GAEL,OADAmP,EAASA,GAAkBrgB,GAAY+L,EAAO9O,GACvCyE,GAAM2e,EAAQrqB,GAAKkb,GAC5B,CACF,EACMoP,GAAYF,GArHH,CACb,UACA,QACA,UACA,MACA,KACA,aACA,SACA,OACA,WACA,SACA,SACA,OACA,OACA,MACA,UACA,UACA,OACA,IACA,KACA,WACA,KACA,SACA,UACA,SACA,aACA,KACA,KACA,KACA,KACA,KACA,KACA,UACA,MACA,MACA,YACA,OACA,MACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,YAsEIG,GAAa,SAAArP,GAAI,OAAIjD,GAAYiD,KAAUoP,GAAUpP,EAAM,EAC3DsP,GAAS,SAAAtP,GAAI,OAAIjD,GAAYiD,IAAwB,OAAflb,GAAKkb,EAAe,EAC1DuP,GAAgBL,GA7DH,CACjB,KACA,KACA,KACA,KACA,KACA,KACA,IACA,MACA,UACA,MACA,OACA,aACA,SACA,MACA,WACA,SACA,SACA,UACA,UACA,SACA,QACA,MACA,WAuCIM,GAASN,GAxBD,CACZ,KACA,KACA,OAsBIO,GAAeP,GA9BD,CAClB,KACA,KACA,OA4BIQ,GAAiBR,GArED,CACpB,QACA,QACA,UAmEIS,GAAgBT,GA1EH,CACjB,KACA,OAyEIU,GAAsBV,GAvBT,CACjB,MACA,SACA,WACA,UAoBIW,GAAqBX,GAAWD,IAChCa,GAAgB,SAAA9P,GAAI,OAAI6P,GAAmB7P,IAASqP,GAAWrP,EAAM,EAWrE+P,GAAmB,SAAAC,GACvB,IAAMC,EAASvB,GAAYsB,EAAK,MAC1BE,EAAMniB,GAXY,SAAAiiB,GAGxB,IAFA,IAAMnJ,EAAW,GACbsJ,EAAUH,EAA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gBH,EAAQ,CAACC,MACjCijG,EAAUjjG,GAAYD,EAAOC,IAGjC,OAAOijG,CACT,CACA,SAASC,GAAanjG,EAAQg8E,GAC5B,KAAkB,OAAXh8E,GAAiB,CACtB,IAAIojG,EAAO3B,GAAyBzhG,EAAQg8E,GAC5C,GAAIonB,EAAM,CACR,GAAIA,EAAKjkG,IACP,OAAO6iG,GAAQoB,EAAKjkG,KAEtB,GAA0B,oBAAfikG,EAAK7jG,MACd,OAAOyiG,GAAQoB,EAAK7jG,MAExB,CACAS,EAASuC,GAAevC,EAC1B,CAKA,OAJA,SAAuBwW,GAErB,OADAa,QAAQgsF,KAAK,qBAAsB7sF,GAC5B,IACT,CAEF,CACA,IAAI8sF,GAASl0B,GAAO,CAClB,IACA,OACA,UACA,UACA,OACA,UACA,QACA,QACA,IACA,MACA,MACA,MACA,QACA,aACA,OACA,KACA,SACA,SACA,UACA,SACA,OACA,OACA,MACA,WACA,UACA,OACA,WACA,KACA,YACA,MACA,UACA,MACA,SACA,MACA,MACA,KACA,KACA,UACA,KACA,WACA,aACA,SACA,OACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,MACA,OACA,UACA,OACA,WACA,QACA,MACA,OACA,KACA,WACA,SACA,SACA,IACA,UACA,MACA,WACA,IACA,KACA,KACA,OACA,IACA,OACA,UACA,SACA,SACA,QACA,SACA,SACA,OACA,SACA,SACA,QACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,KACA,QACA,KACA,IACA,KACA,MACA,QACA,QAEEm0B,GAAQn0B,GAAO,CACjB,MACA,IACA,WACA,cACA,eACA,eACA,gBACA,mBACA,SACA,WACA,OACA,OACA,UACA,SACA,OACA,IACA,QACA,WACA,QACA,QACA,OACA,iBACA,SACA,OACA,WACA,QACA,OACA,UACA,UACA,WACA,iBACA,OACA,OACA,QACA,SACA,SACA,OACA,WACA,QACA,OACA,QACA,OACA,UAEEo0B,GAAap0B,GAAO,CACtB,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,iBACA,UACA,UACA,UACA,UACA,UACA,iBACA,UACA,UACA,cACA,eACA,WACA,eACA,qBACA,cACA,SACA,iBAEEq0B,GAAgBr0B,GAAO,CACzB,UACA,gBACA,SACA,UACA,eACA,YACA,mBACA,iBACA,gBACA,gBACA,gBACA,QACA,YACA,OACA,eACA,YACA,UACA,gBACA,SACA,MACA,aACA,UACA,QAEEs0B,GAAWt0B,GAAO,CACpB,OACA,WACA,SACA,UACA,QACA,SACA,KACA,aACA,gBACA,KACA,KACA,QACA,UACA,WACA,QACA,OACA,KACA,SACA,QACA,SACA,OACA,OACA,UACA,SACA,MACA,QACA,MACA,SACA,eAEEu0B,GAAmBv0B,GAAO,CAC5B,UACA,cACA,aACA,WACA,YACA,UACA,UACA,SACA,SACA,QACA,YACA,aACA,iBACA,cACA,SAEEz0D,GAAOy0D,GAAO,CAAC,UACfl1D,GAAOk1D,GAAO,CAChB,SACA,SACA,QACA,MACA,iBACA,eACA,uBACA,WACA,aACA,UACA,SACA,UACA,cACA,cACA,UACA,OACA,QACA,QACA,QACA,OACA,UACA,WACA,eACA,SACA,cACA,WACA,WACA,UACA,MACA,WACA,0BACA,wBACA,WACA,YACA,UACA,eACA,OACA,MACA,UACA,SACA,SACA,OACA,OACA,WACA,KACA,YACA,YACA,QACA,OACA,QACA,OACA,OACA,UACA,OACA,MACA,MACA,YACA,QACA,SACA,MACA,YACA,WACA,QACA,OACA,QACA,UACA,aACA,SACA,OACA,UACA,UACA,cACA,cACA,SACA,UACA,UACA,aACA,WACA,MACA,WACA,MACA,WACA,OACA,OACA,UACA,aACA,QACA,WACA,QACA,OACA,QACA,OACA,UACA,QACA,MACA,SACA,OACA,QACA,UACA,WACA,QACA,YACA,OACA,SACA,SACA,QACA,QACA,QACA,SAEEw0B,GAAMx0B,GAAO,CACf,gBACA,aACA,WACA,qBACA,SACA,gBACA,gBACA,UACA,gBACA,iBACA,QACA,OACA,KACA,QACA,OACA,gBACA,YACA,YACA,QACA,sBACA,8BACA,gBACA,kBACA,KACA,KACA,IACA,KACA,KACA,kBACA,YACA,UACA,UACA,MACA,WACA,YACA,MACA,OACA,eACA,YACA,SACA,cACA,cACA,gBACA,cACA,YACA,mBACA,eACA,aACA,eACA,cACA,KACA,KACA,KACA,KACA,aACA,WACA,gBACA,oBACA,SACA,OACA,KACA,kBACA,KACA,MACA,IACA,KACA,KACA,KACA,KACA,UACA,YACA,aACA,WACA,OACA,eACA,iBACA,eACA,mBACA,iBACA,QACA,aACA,aACA,eACA,eACA,cACA,cACA,mBACA,YACA,MACA,OACA,QACA,SACA,OACA,MACA,OACA,aACA,SACA,WACA,UACA,QACA,SACA,cACA,SACA,WACA,cACA,OACA,aACA,sBACA,mBACA,eACA,SACA,gBACA,sBACA,iBACA,IACA,KACA,KACA,SACA,OACA,OACA,cACA,YACA,UACA,SACA,SACA,QACA,OACA,kBACA,mBACA,mBACA,eACA,cACA,eACA,cACA,aACA,eACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,SACA,eACA,QACA,eACA,iBACA,WACA,UACA,UACA,YACA,mBACA,cACA,kBACA,iBACA,aACA,OACA,KACA,KACA,UACA,SACA,UACA,aACA,UACA,aACA,gBACA,gBACA,QACA,eACA,OACA,eACA,mBACA,mBACA,IACA,KACA,KACA,QACA,IACA,KACA,KACA,IACA,eAEEy0B,GAASz0B,GAAO,CAClB,SACA,cACA,QACA,WACA,QACA,eACA,cACA,aACA,aACA,QACA,MACA,UACA,eACA,WACA,QACA,QACA,SACA,OACA,KACA,UACA,SACA,gBACA,SACA,SACA,iBACA,YACA,WACA,cACA,UACA,UACA,gBACA,WACA,WACA,OACA,WACA,WACA,aACA,UACA,SACA,SACA,cACA,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","file":"js/tinymce-90a4bbc640e6a75caf06.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/packs/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 20);\n","/**\n * TinyMCE version 6.3.1 (2022-12-06)\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$1 = 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$1(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$3 = 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$2 = 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$2.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$2 = 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$5 = (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$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$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$4 = (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$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 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$3 = 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$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$2 = cached(() => PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch));\n    const detect$2 = () => platform$2();\n\n    const userAgent = navigator.userAgent;\n    const platform$1 = detect$2();\n    const browser$1 = platform$1.browser;\n    const os = platform$1.os;\n    const deviceType = platform$1.deviceType;\n    const windowsPhone = userAgent.indexOf('Windows Phone') !== -1;\n    const Env = {\n      transparentSrc: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n      documentMode: browser$1.isIE() ? document.documentMode || 7 : 10,\n      cacheSuffix: null,\n      container: null,\n      canHaveCSP: !browser$1.isIE(),\n      windowsPhone,\n      browser: {\n        current: browser$1.current,\n        version: browser$1.version,\n        isChromium: browser$1.isChromium,\n        isEdge: browser$1.isEdge,\n        isFirefox: browser$1.isFirefox,\n        isIE: browser$1.isIE,\n        isOpera: browser$1.isOpera,\n        isSafari: browser$1.isSafari\n      },\n      os: {\n        current: os.current,\n        version: os.version,\n        isAndroid: os.isAndroid,\n        isChromeOS: os.isChromeOS,\n        isFreeBSD: os.isFreeBSD,\n        isiOS: os.isiOS,\n        isLinux: os.isLinux,\n        isMacOS: os.isMacOS,\n        isSolaris: os.isSolaris,\n        isWindows: os.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 whiteSpaceRegExp$1 = /^\\s*|\\s*$/g;\n    const trim$2 = str => {\n      return isNullable(str) ? '' : ('' + str).replace(whiteSpaceRegExp$1, '');\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$1 = 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$2 = (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$2);\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$2,\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$1,\n      extend: extend$3,\n      walk: walk$4,\n      resolve: resolve$2,\n      explode: explode$3,\n      _addCacheSuffix\n    };\n\n    const is$2 = (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 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    typeof window !== 'undefined' ? window : Function('return this;')();\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 isElement$7 = isType(ELEMENT);\n    const isText$b = 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$2 = (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$b = (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$2(element, attr, nu.join(' '));\n      return true;\n    };\n    const remove$a = (element, attr, id) => {\n      const nu = filter$5(read$4(element, attr), v => v !== id);\n      if (nu.length > 0) {\n        set$2(element, attr, nu.join(' '));\n      } else {\n        remove$b(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$9 = (element, clazz) => remove$a(element, 'class', clazz);\n    const toggle$2 = (element, clazz) => {\n      if (contains$2(get$8(element), clazz)) {\n        return remove$9(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$b(element, 'class');\n      }\n    };\n    const remove$8 = (element, clazz) => {\n      if (supports(element)) {\n        const classList = element.dom.classList;\n        classList.remove(clazz);\n      } else {\n        remove$9(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 isSupported$1 = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue);\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\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 = 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() && 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$b(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    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$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$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$1(dom) ? dom.style.getPropertyValue(property) : '';\n    const getRaw$1 = (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 remove$7 = (element, property) => {\n      const dom = element.dom;\n      internalRemove(dom, property);\n      if (is$2(getOpt(element, 'style').map(trim$3), '')) {\n        remove$b(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$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$1(wrapper);\n      if (children.length > 0) {\n        after$3(wrapper, children);\n      }\n      remove$6(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 = (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$2().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$2().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    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$3 = (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$3, 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$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$2 = (scope, selector, isRoot) => ancestor$3(scope, e => is$1(e, selector), isRoot);\n    const descendant = (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$2, scope, selector, isRoot);\n    };\n\n    const ancestor$1 = (scope, selector, isRoot) => ancestor$2(scope, selector, isRoot).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 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 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 hasAttributeValue = (attrName, attrValue) => {\n      return node => {\n        return isElement$6(node) && node.getAttribute(attrName) === attrValue;\n      };\n    };\n    const isBogus$2 = node => isElement$6(node) && node.hasAttribute('data-mce-bogus');\n    const isBogusAll$1 = 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 (isElement$6(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$a = 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$a = 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\n    const zeroWidth = '\\uFEFF';\n    const nbsp = '\\xA0';\n    const isZwsp$1 = char => char === zeroWidth;\n    const removeZwsp = s => s.replace(/\\uFEFF/g, '');\n\n    const descendants = (scope, selector) => all(selector, scope);\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$b, 'text');\n    const get$3 = element => api$1.get(element);\n    const getOption = element => api$1.getOption(element);\n\n    const blocks = [\n      'article',\n      'aside',\n      'details',\n      'div',\n      'dt',\n      'figcaption',\n      'footer',\n      'form',\n      'fieldset',\n      'header',\n      'hgroup',\n      'html',\n      'main',\n      'nav',\n      'section',\n      'summary',\n      'body',\n      'p',\n      'dl',\n      'multicol',\n      'dd',\n      'figure',\n      'address',\n      'center',\n      'blockquote',\n      'h1',\n      'h2',\n      'h3',\n      'h4',\n      'h5',\n      'h6',\n      'listing',\n      'xmp',\n      'pre',\n      'plaintext',\n      'menu',\n      'dir',\n      'ul',\n      'ol',\n      'li',\n      'hr',\n      'table',\n      'tbody',\n      'thead',\n      'tfoot',\n      'th',\n      'tr',\n      'td',\n      'caption'\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 headings = [\n      'h1',\n      'h2',\n      'h3',\n      'h4',\n      'h5',\n      'h6'\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 wrapBlockElements = ['pre'].concat(headings);\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 isBlock$2 = lazyLookup(blocks);\n    const isTable$1 = node => name(node) === 'table';\n    const isInline$1 = node => isElement$7(node) && !isBlock$2(node);\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    const isWrapBlockElement = lazyLookup(wrapBlockElements);\n    const isWrapElement = node => isWrapBlockElement(node) || isInline$1(node);\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$6);\n      }\n    };\n    const createPaddingBr = () => {\n      const br = SugarElement.fromTag('br');\n      set$2(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 => {\n      lastChild(elm).each(lastChild => {\n        prevSibling(lastChild).each(lastChildPrevSibling => {\n          if (isBlock$2(elm) && isBr$5(lastChild) && isBlock$2(lastChildPrevSibling)) {\n            remove$6(lastChild);\n          }\n        });\n      });\n    };\n\n    const ZWSP$1 = zeroWidth;\n    const isZwsp = isZwsp$1;\n    const trim$1 = removeZwsp;\n\n    const isElement$5 = isElement$6;\n    const isText$9 = isText$a;\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$a(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$a(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$2(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 isContentEditableTrue$2 = isContentEditableTrue$3;\n    const isContentEditableFalse$9 = isContentEditableFalse$a;\n    const isBr$4 = isBr$6;\n    const isText$8 = isText$a;\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$9(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 whiteSpaceRegExp = /^[ \\t\\r\\n]*$/;\n    const isWhitespaceText = text => whiteSpaceRegExp.test(text);\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 hasWhitespacePreserveParent = (node, rootNode) => {\n      const rootElement = SugarElement.fromDom(rootNode);\n      const startNode = SugarElement.fromDom(node);\n      return ancestor$1(startNode, 'pre,code', curry(eq, rootElement));\n    };\n    const isWhitespace$1 = (node, rootNode) => {\n      return isText$a(node) && isWhitespaceText(node.data) && !hasWhitespacePreserveParent(node, rootNode);\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 isContent$1 = (node, rootNode) => {\n      return isCaretCandidate$3(node) && !isWhitespace$1(node, rootNode) || isNamedAnchor(node) || isBookmark(node);\n    };\n    const isBookmark = hasAttribute('data-mce-bookmark');\n    const isBogus$1 = hasAttribute('data-mce-bogus');\n    const isBogusAll = hasAttributeValue('data-mce-bogus', 'all');\n    const isEmptyNode = (targetNode, skipBogus) => {\n      let brCount = 0;\n      if (isContent$1(targetNode, targetNode)) {\n        return false;\n      } else {\n        let node = targetNode.firstChild;\n        if (!node) {\n          return true;\n        }\n        const walker = new DomTreeWalker(node, targetNode);\n        do {\n          if (skipBogus) {\n            if (isBogusAll(node)) {\n              node = walker.next(true);\n              continue;\n            }\n            if (isBogus$1(node)) {\n              node = walker.next();\n              continue;\n            }\n          }\n          if (isBr$6(node)) {\n            brCount++;\n            node = walker.next();\n            continue;\n          }\n          if (isContent$1(node, targetNode)) {\n            return false;\n          }\n          node = walker.next();\n        } while (node);\n        return brCount <= 1;\n      }\n    };\n    const isEmpty$2 = (elm, skipBogus = true) => isEmptyNode(elm.dom, skipBogus);\n\n    const transparentBlockAttr = 'data-mce-block';\n    const elementNames = map => filter$5(keys(map), key => !/[A-Z]/.test(key));\n    const makeSelectorFromSchemaMap = map => elementNames(map).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 = (el, leftSide) => {\n      var _a;\n      const childPropertyName = leftSide ? 'lastChild' : 'firstChild';\n      for (let child = el[childPropertyName]; child; child = child[childPropertyName]) {\n        if (isEmpty$2(SugarElement.fromDom(child))) {\n          (_a = child.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(child);\n          return;\n        }\n      }\n    };\n    const split$2 = (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(beforeFragment, true);\n        range.setStartAfter(splitElm);\n        range.setEndAfter(parentElm);\n        const afterFragment = range.extractContents();\n        trimEdge(afterFragment, false);\n        if (!isEmpty$2(SugarElement.fromDom(beforeFragment))) {\n          parentNode.insertBefore(beforeFragment, parentElm);\n        }\n        if (!isEmpty$2(SugarElement.fromDom(splitElm))) {\n          parentNode.insertBefore(splitElm, parentElm);\n        }\n        if (!isEmpty$2(SugarElement.fromDom(afterFragment))) {\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$3(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$3(child, isBlock, isRoot).each(parentBlock => {\n                split$2(parentBlock.dom, child.dom);\n              });\n            });\n            stateScope.each(scope => updateBlockStateOnChildren(schema, scope.dom));\n          }\n        });\n      });\n    };\n    const updateChildren = (schema, scope) => {\n      const transparentBlocks = updateBlockStateOnChildren(schema, scope);\n      splitInvalidChildren(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 isTransparentAstBlock = (schema, node) => node.type === 1 && isTransparentElementName(schema, node.name) && isString(node.attr(transparentBlockAttr));\n    const isTransparentAstInline = (schema, node) => node.type === 1 && isTransparentElementName(schema, node.name) && isUndefined(node.attr(transparentBlockAttr));\n\n    const browser = detect$2().browser;\n    const firstElement = nodes => find$2(nodes, isElement$7);\n    const getTableCaptionDeltaY = elm => {\n      if (browser.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 maxLoadTime = settings.maxLoadTime || 5000;\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(styleContainer, '#' + id).each(remove$6);\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        const wait = (testCallback, waitCallback) => {\n          if (!testCallback()) {\n            if (Date.now() - startTime < maxLoadTime) {\n              setTimeout(waitCallback);\n            } else {\n              failed();\n            }\n          }\n        };\n        const waitForWebKitLinkLoaded = () => {\n          wait(() => {\n            const styleSheets = documentOrShadowRoot.styleSheets;\n            let i = styleSheets.length;\n            while (i--) {\n              const styleSheet = styleSheets[i];\n              const owner = styleSheet.ownerNode;\n              if (owner && link && owner.id === link.id) {\n                passed();\n                return true;\n              }\n            }\n            return false;\n          }, waitForWebKitLinkLoaded);\n        };\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        const startTime = Date.now();\n        if (settings.contentCssCors) {\n          set$2(linkElem, 'crossOrigin', 'anonymous');\n        }\n        if (settings.referrerPolicy) {\n          set$2(linkElem, 'referrerpolicy', settings.referrerPolicy);\n        }\n        link = linkElem.dom;\n        link.onload = waitForWebKitLinkLoaded;\n        link.onerror = failed;\n        addStyle(linkElem);\n        set$2(linkElem, 'href', urlWithSuffix);\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 unloadAll = urls => {\n        each$e(urls, url => {\n          unload(url);\n        });\n      };\n      return {\n        load,\n        loadAll,\n        unload,\n        unloadAll,\n        _setReferrerPolicy,\n        _setContentCssCors\n      };\n    };\n\n    const create$d = () => {\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$d();\n\n    const isSpan = node => node.nodeName.toLowerCase() === 'span';\n    const isInlineContent = (node, root) => isNonNullable(node) && (isContent$1(node, root) || isInline$1(SugarElement.fromDom(node)));\n    const surroundedByInlineContent = (node, root) => {\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, root);\n      const nextIsInline = isUndefined(next) || isInlineContent(next, root);\n      return prevIsInline && nextIsInline;\n    };\n    const isBookmarkNode$2 = node => isSpan(node) && node.getAttribute('data-mce-type') === 'bookmark';\n    const isKeepTextNode = (node, root) => isText$a(node) && node.data.length > 0 && surroundedByInlineContent(node, root);\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, 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], 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(node, rootNode) && !isKeepElement(node) && !isKeepTextNode(node, rootNode)) {\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 lookupCache = {};\n    const mapCache = {};\n    const dummyObj = {};\n    const makeMap$2 = Tools.makeMap, each$b = Tools.each, extend$2 = Tools.extend, explode$2 = Tools.explode, inArray = Tools.inArray;\n    const split$1 = (items, delim) => {\n      items = Tools.trim(items);\n      return items ? items.split(delim || ' ') : [];\n    };\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 compileSchema = type => {\n      const schema = {};\n      let globalAttributes, blockContent;\n      let phrasingContent, flowContent;\n      const add = (name, attributes = '', children = '') => {\n        const childNames = split$1(children);\n        const names = split$1(name);\n        let ni = names.length;\n        while (ni--) {\n          const attributesOrder = split$1([\n            globalAttributes,\n            attributes\n          ].join(' '));\n          schema[names[ni]] = {\n            attributes: mapToObject(attributesOrder, () => ({})),\n            attributesOrder,\n            children: mapToObject(childNames, constant(dummyObj))\n          };\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 (lookupCache[type]) {\n        return lookupCache[type];\n      }\n      globalAttributes = 'id accesskey class dir lang style tabindex title role';\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        globalAttributes += ' contenteditable contextmenu draggable dropzone ' + 'hidden spellcheck translate';\n        blockContent += ' article aside details dialog figure main header footer hgroup section nav ' + transparentContent;\n        phrasingContent += ' audio canvas command datalist mark meter output picture ' + 'progress time wbr video ruby bdi keygen';\n      }\n      if (type !== 'html5-strict') {\n        globalAttributes += ' xml:lang';\n        const html4PhrasingContent = 'acronym applet basefont big font strike tt';\n        phrasingContent = [\n          phrasingContent,\n          html4PhrasingContent\n        ].join(' ');\n        each$b(split$1(html4PhrasingContent), name => {\n          add(name, '', phrasingContent);\n        });\n        const html4BlockContent = 'center dir isindex noframes';\n        blockContent = [\n          blockContent,\n          html4BlockContent\n        ].join(' ');\n        flowContent = [\n          blockContent,\n          phrasingContent\n        ].join(' ');\n        each$b(split$1(html4BlockContent), name => {\n          add(name, '', flowContent);\n        });\n      }\n      flowContent = flowContent || [\n        blockContent,\n        phrasingContent\n      ].join(' ');\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('address dt dd div caption', '', 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', 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 summary bdi', '', phrasingContent);\n        add('canvas', 'width height', flowContent);\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      }\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$b(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      lookupCache[type] = schema;\n      return schema;\n    };\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 = compileSchema(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', voidElementsMap);\n      const moveCaretBeforeOnEnterElementsMap = createLookupTable('move_caret_before_on_enter_elements', nonEmptyOrMoveCaretBeforeOnEnter + ' table', voidElementsMap);\n      const textBlockElementsMap = createLookupTable('text_block_elements', 'h1 h2 h3 h4 h5 h6 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', 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      each$b('script noscript iframe noframes noembed title style textarea xmp plaintext'.split(' '), name => {\n        specialElements[name] = new RegExp('</' + name + '[^>]*>', 'gi');\n      });\n      const patternToRegExp = str => new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$');\n      const addValidElements = validElements => {\n        const elementRuleRegExp = /^([#+\\-])?([^\\[!\\/]+)(?:\\/([^\\[!]+))?(?:(!?)\\[([^\\]]+)])?$/;\n        const attrRuleRegExp = /^([!\\-])?(\\w+[\\\\:]:\\w+|[^=~<]+)?(?:([=~<])(.*))?$/;\n        const hasPatternsRegExp = /[*?+]/;\n        if (validElements) {\n          const validElementsArr = split$1(validElements, ',');\n          let globalAttributes;\n          let globalAttributesOrder;\n          if (elements['@']) {\n            globalAttributes = elements['@'].attributes;\n            globalAttributesOrder = elements['@'].attributesOrder;\n          }\n          for (let ei = 0, el = validElementsArr.length; ei < el; ei++) {\n            let matches = elementRuleRegExp.exec(validElementsArr[ei]);\n            if (matches) {\n              const prefix = matches[1];\n              const elementName = matches[2];\n              const outputName = matches[3];\n              const attrData = matches[5];\n              const attributes = {};\n              const attributesOrder = [];\n              const element = {\n                attributes,\n                attributesOrder\n              };\n              if (prefix === '#') {\n                element.paddEmpty = true;\n              }\n              if (prefix === '-') {\n                element.removeEmpty = true;\n              }\n              if (matches[4] === '!') {\n                element.removeEmptyAttrs = true;\n              }\n              if (globalAttributes) {\n                each$d(globalAttributes, (value, key) => {\n                  attributes[key] = value;\n                });\n                if (globalAttributesOrder) {\n                  attributesOrder.push(...globalAttributesOrder);\n                }\n              }\n              if (attrData) {\n                const attrDatas = split$1(attrData, '|');\n                for (let ai = 0, al = attrDatas.length; ai < al; ai++) {\n                  matches = attrRuleRegExp.exec(attrDatas[ai]);\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                      element.attributesRequired = element.attributesRequired || [];\n                      element.attributesRequired.push(attrName);\n                      attr.required = true;\n                    }\n                    if (attrType === '-') {\n                      delete attributes[attrName];\n                      attributesOrder.splice(inArray(attributesOrder, attrName), 1);\n                      continue;\n                    }\n                    if (attrPrefix) {\n                      if (attrPrefix === '=') {\n                        element.attributesDefault = element.attributesDefault || [];\n                        element.attributesDefault.push({\n                          name: attrName,\n                          value\n                        });\n                        attr.defaultValue = value;\n                      }\n                      if (attrPrefix === '~') {\n                        element.attributesForced = element.attributesForced || [];\n                        element.attributesForced.push({\n                          name: attrName,\n                          value\n                        });\n                        attr.forcedValue = value;\n                      }\n                      if (attrPrefix === '<') {\n                        attr.validValues = makeMap$2(value, '?');\n                      }\n                    }\n                    if (hasPatternsRegExp.test(attrName)) {\n                      const attrPattern = attr;\n                      element.attributePatterns = element.attributePatterns || [];\n                      attrPattern.pattern = patternToRegExp(attrName);\n                      element.attributePatterns.push(attrPattern);\n                    } else {\n                      if (!attributes[attrName]) {\n                        attributesOrder.push(attrName);\n                      }\n                      attributes[attrName] = attr;\n                    }\n                  }\n                }\n              }\n              if (!globalAttributes && elementName === '@') {\n                globalAttributes = attributes;\n                globalAttributesOrder = attributesOrder;\n              }\n              if (outputName) {\n                element.outputName = elementName;\n                elements[outputName] = element;\n              }\n              if (hasPatternsRegExp.test(elementName)) {\n                const patternElement = element;\n                patternElement.pattern = patternToRegExp(elementName);\n                patternElements.push(patternElement);\n              } else {\n                elements[elementName] = element;\n              }\n            }\n          }\n        }\n      };\n      const setValidElements = validElements => {\n        patternElements = [];\n        each$e(keys(elements), name => {\n          delete elements[name];\n        });\n        addValidElements(validElements);\n        each$b(schemaItems, (element, name) => {\n          children[name] = element.children;\n        });\n      };\n      const addCustomElements = customElements => {\n        const customElementRegExp = /^(~)?(.+)$/;\n        if (customElements) {\n          delete mapCache.text_block_elements;\n          delete mapCache.block_elements;\n          each$b(split$1(customElements, ','), 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              children[name] = children[cloneName];\n              customElementsMap[name] = cloneName;\n              nonEmptyElementsMap[name.toUpperCase()] = {};\n              nonEmptyElementsMap[name] = {};\n              if (!inline) {\n                blockElementsMap[name.toUpperCase()] = {};\n                blockElementsMap[name] = {};\n              }\n              if (!elements[name]) {\n                let customRule = elements[cloneName];\n                customRule = extend$2({}, customRule);\n                delete customRule.removeEmptyAttrs;\n                delete customRule.removeEmpty;\n                elements[name] = customRule;\n              }\n              each$b(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        }\n      };\n      const addValidChildren = validChildren => {\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        delete lookupCache[schemaType];\n        if (validChildren) {\n          each$b(split$1(validChildren, ','), rule => {\n            const matches = childRuleRegExp.exec(rule);\n            if (matches) {\n              const prefix = matches[1];\n              let parent;\n              if (prefix) {\n                parent = children[matches[2]];\n              } else {\n                parent = children[matches[2]] = { '#comment': {} };\n              }\n              parent = children[matches[2]];\n              each$b(split$1(matches[3], '|'), child => {\n                if (prefix === '-') {\n                  delete parent[child];\n                } else {\n                  parent[child] = {};\n                }\n              });\n            }\n          });\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      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'), name => {\n          elements[name].paddEmpty = true;\n        });\n        each$b(split$1('span'), name => {\n          elements[name].removeEmptyAttrs = true;\n        });\n      } else {\n        setValidElements(settings.valid_elements);\n      }\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      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 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 getCustomElements = constant(customElementsMap);\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        getCustomElements,\n        addValidElements,\n        setValidElements,\n        addCustomElements,\n        addValidChildren\n      };\n    };\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.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                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      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$a(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$a(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$a(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$a(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$b(elm, name);\n      } else {\n        set$2(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$a(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$7($elm, normalizedName);\n      } else {\n        set$1($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$b(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      }, 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) || !isElement$6($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($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$b(child) && child.dom.length === 0) {\n                remove$6(child);\n              } else {\n                before$3($node, child);\n              }\n            });\n          }\n          remove$6($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$8;\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$7(SugarElement.fromDom(e), 'display'));\n      };\n      const hide = elm => {\n        run(elm, e => set$1(SugarElement.fromDom(e), 'display', 'none'));\n      };\n      const isHidden = elm => {\n        const $elm = _get(elm);\n        return isNonNullable($elm) && is$2(getRaw$1($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 isNonEmptyElement = node => {\n        if (isElement$6(node)) {\n          const isNamedAnchor = node.nodeName.toLowerCase() === 'a' && !getAttrib(node, 'href') && getAttrib(node, 'id');\n          if (getAttrib(node, 'name') || getAttrib(node, 'data-mce-bookmark') || isNamedAnchor) {\n            return true;\n          }\n        }\n        return false;\n      };\n      const isEmpty = (node, elements) => {\n        let brCount = 0;\n        if (isNonEmptyElement(node)) {\n          return false;\n        }\n        const firstChild = node.firstChild;\n        if (firstChild) {\n          const walker = new DomTreeWalker(firstChild, node);\n          const whitespaceElements = schema ? schema.getWhitespaceElements() : {};\n          const nonEmptyElements = elements || (schema ? schema.getNonEmptyElements() : null);\n          let tempNode = firstChild;\n          do {\n            if (isElement$6(tempNode)) {\n              const bogusVal = tempNode.getAttribute('data-mce-bogus');\n              if (bogusVal) {\n                tempNode = walker.next(bogusVal === 'all');\n                continue;\n              }\n              const name = tempNode.nodeName.toLowerCase();\n              if (nonEmptyElements && nonEmptyElements[name]) {\n                if (name === 'br') {\n                  brCount++;\n                  tempNode = walker.next();\n                  continue;\n                }\n                return false;\n              }\n              if (isNonEmptyElement(tempNode)) {\n                return false;\n              }\n            }\n            if (isComment(tempNode)) {\n              return false;\n            }\n            if (isText$a(tempNode) && !isWhitespaceText(tempNode.data)) {\n              return false;\n            }\n            if (isText$a(tempNode) && tempNode.parentNode && whitespaceElements[tempNode.parentNode.nodeName] && isWhitespaceText(tempNode.data)) {\n              return false;\n            }\n            tempNode = walker.next();\n          } while (tempNode);\n        }\n        return brCount <= 1;\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), parentElm);\n          if (replacementElm) {\n            parentNode.insertBefore(replacementElm, parentElm);\n          } else {\n            parentNode.insertBefore(splitElm, parentElm);\n          }\n          parentNode.insertBefore(trimNode(self, afterFragment), 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 && isElement$6(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 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        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(() => processQueue(uniqueScripts).then(resolve, reject));\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 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      each$d(items, (translation, name) => {\n        langData[name.toLowerCase()] = translation;\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 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$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        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 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$x = (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$2(elem, dataAnnotationActive(), 'true');\n          } else {\n            remove$b(elem, dataAnnotationActive());\n          }\n        });\n      };\n      const onNodeChange = last$1(() => {\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$w = (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$c = () => {\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$5 = (element, classes) => {\n      each$e(classes, x => {\n        remove$8(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$6(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$a(next) && !isBoundary(next));\n        return Optional.from(next).filter(isText$a);\n      };\n      return {\n        current: () => Optional.from(walker.current()).filter(isText$a),\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$a(node);\n      const walk = (node, offset, walker, process) => {\n        if (isText$a(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 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 isElement$4 = isElement$6;\n    const isCaretCandidate$2 = isCaretCandidate$3;\n    const isBlock$1 = 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$a;\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$a(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$a(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$1(beforeNode) || isBlock$1(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$3(pos1.getClientRects()), isAbove$1).getOr(false);\n    CaretPosition.isBelow = (pos1, pos2) => lift2(last$3(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$a(pos.container()) : false;\n    CaretPosition.isElementPosition = pos => !CaretPosition.isTextPosition(pos);\n\n    const trimEmptyTextNode$1 = (dom, node) => {\n      if (isText$a(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$a;\n    const isBogus = isBogus$2;\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$b = (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$2));\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$8 = isContentEditableFalse$a;\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$a(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$a(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$8(node)) {\n          return node;\n        }\n      }\n      if (isCaretContainer$2(node)) {\n        if (isText$a(node) && isCaretContainerBlock$1(node)) {\n          node = node.parentNode;\n        }\n        let sibling = node.previousSibling;\n        if (isContentEditableFalse$8(sibling)) {\n          return sibling;\n        }\n        sibling = node.nextSibling;\n        if (isContentEditableFalse$8(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$8(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$b(selection.dom.getRoot(), CaretPosition.fromRangeStart(rng)),\n        end: create$b(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$1, 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 normalizePattern = pattern => {\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        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        }), (command, commandValue) => ({\n          type: 'block-command',\n          start: pattern.start,\n          cmd: command,\n          value: commandValue\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 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$2().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$3(key)] = trim$3(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, 'tinymce'),\n        default: 'tinymce'\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,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,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$3),\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(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$3);\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: 'object' });\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('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', { processor: 'boolean' });\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: 'string' });\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          },\n          {\n            start: '##',\n            format: 'h2'\n          },\n          {\n            start: '###',\n            format: 'h3'\n          },\n          {\n            start: '####',\n            format: 'h4'\n          },\n          {\n            start: '#####',\n            format: 'h5'\n          },\n          {\n            start: '######',\n            format: 'h6'\n          },\n          {\n            start: '1. ',\n            cmd: 'InsertOrderedList'\n          },\n          {\n            start: '* ',\n            cmd: 'InsertUnorderedList'\n          },\n          {\n            start: '- ',\n            cmd: 'InsertUnorderedList'\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      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 = 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 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 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 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\n    const isElement$3 = isElement$6;\n    const isText$5 = isText$a;\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$1(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$4(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$4(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$4 = 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$7 = isContentEditableFalse$a;\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          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$4(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$7(node) || isMedia$1(node);\n    const isFakeCaretTarget = node => isInlineFakeCaretTarget(node) || isTable$2(node) && isFakeCaretTableBrowser();\n\n    const isContentEditableTrue$1 = isContentEditableTrue$3;\n    const isContentEditableFalse$6 = isContentEditableFalse$a;\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$a;\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$6(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$3(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$6(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$a(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$6);\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$5 = isContentEditableFalse$a;\n    const isText$3 = isText$a;\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$2(filter$5(getParents$3(container, root), isContentEditableFalse$5));\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$a(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$a(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$a(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$a(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$a(next) && isText$a(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$1(chr);\n\n    const hexColour = value => ({ value });\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\n    const rgbaToHexString = color => fromString(color).map(fromRgba).map(h => '#' + h.value).getOr(color);\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$2(cell, 'table', isRoot);\n\n    const getStartNode = rng => {\n      const sc = rng.startContainer, so = rng.startOffset;\n      if (isText$a(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$a(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$a(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$2(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 isEditable$3 = elm => elm.isContentEditable === true;\n    const preserveSelection = (editor, action, shouldMoveStart) => {\n      const {selection, dom} = editor;\n      const selectedNodeBeforeAction = selection.getNode();\n      const isSelectedBeforeNodeNoneditable = isContentEditableFalse$a(selectedNodeBeforeAction);\n      preserve(selection, true, () => {\n        action();\n      });\n      const isBeforeNodeStillNoneditable = isSelectedBeforeNodeNoneditable && isContentEditableFalse$a(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$a(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$a(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$a(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\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$a(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')) !== null && _a !== void 0 ? _a : root;\n        node = dom.getParent(isText$a(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$a(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$a(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$a(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$a(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$a(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$a(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$a(startContainer) || startOffset === 0)) {\n          startContainer = findParentContainer(dom, formatList, startContainer, startOffset, true);\n        }\n        if (!isInlineFormat(format) || (!isText$a(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          }\n          if (!dom.isBlock(endContainer)) {\n            endContainer = findParentContainer(dom, formatList, endContainer, endOffset, false);\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$a(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$a(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$b(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$2(elem, `${ dataAnnotationId() }`, uid);\n      set$2(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$2(elem, `${ dataAnnotationClasses() }`, classes.join(','));\n        }\n        const attributeNames = keys(attributes);\n        if (attributeNames.length > 0) {\n          set$2(elem, `${ dataAnnotationAttributes() }`, attributeNames.join(','));\n        }\n      }\n    };\n    const removeDirectAnnotation = elem => {\n      remove$8(elem, annotation());\n      remove$b(elem, `${ dataAnnotationId() }`);\n      remove$b(elem, `${ dataAnnotation() }`);\n      remove$b(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$b(elem, name));\n      remove$5(elem, customClasses);\n      remove$b(elem, `${ dataAnnotationClasses() }`);\n      remove$b(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(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$c();\n      setup$w(editor, registry);\n      const changes = setup$x(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          const bookmark = editor.selection.getBookmark();\n          identify(editor, Optional.some(name)).each(({elements}) => {\n            removeAnnotations(elements);\n          });\n          editor.selection.moveToBookmark(bookmark);\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 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\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';\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 = elm => {\n        if (isMedia(elm)) {\n          return dom.create('img', { src: Env.transparentSrc });\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(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).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)) {\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$a = (start, soffset, finish, foffset) => ({\n      start,\n      soffset,\n      finish,\n      foffset\n    });\n    const SimRange = { create: create$a };\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$a(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$a(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$a(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 (container.hasChildNodes() && !isTable$2(container)) {\n            node = container;\n            const walker = new DomTreeWalker(container, body);\n            do {\n              if (isContentEditableFalse$a(node) || isCaretContainer$2(node)) {\n                normalized = false;\n                break;\n              }\n              if (isText$a(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$a(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$a(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$a(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$a(startContainer) && startOffset > 0 && startOffset < startContainer.data.length) {\n          startContainer = splitText(startContainer, startOffset);\n          startOffset = 0;\n        }\n        if (isText$a(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$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$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$b(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$6(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(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 = (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(pos.left, y, doc);\n      }\n    };\n    const intoWindowIfNeeded = (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(marker, viewHeight, alignToTop !== false, doc);\n      } else if (markerTop > viewportBottom) {\n        const align = largerThanViewport ? alignToTop !== false : alignToTop === true;\n        scrollToMarker(marker, viewHeight, align, doc);\n      } else if (markerBottom > viewportBottom && !largerThanViewport) {\n        scrollToMarker(marker, viewHeight, alignToTop === true, doc);\n      }\n    };\n    const intoWindow = (doc, scrollTop, marker, alignToTop) => {\n      const viewHeight = defaultView(doc).dom.innerHeight;\n      intoWindowIfNeeded(doc, scrollTop, viewHeight, marker, alignToTop);\n    };\n    const intoFrame = (doc, scrollTop, marker, alignToTop) => {\n      const frameViewHeight = defaultView(doc).dom.innerHeight;\n      intoWindowIfNeeded(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 => element.dom.focus();\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$b(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      editor.on('focusin', () => {\n        const focusedEditor = editorManager.focusedEditor;\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 (!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$v = 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 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$1 = (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$a(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$a(startContainer) && isText$a(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$a(node) ? node.parentNode : node;\n      return isElement$6(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$1(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 = start;\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 getEnd = element => name(element) === 'img' ? 1 : getOption(element).fold(() => children$1(element).length, v => v.length);\n    const isTextNodeWithCursorPosition = el => getOption(el).filter(text => text.trim().length !== 0 || text.indexOf(nbsp) > -1).isSome();\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));\n    };\n\n    const first = element => descendant$1(element, isCursorPosition);\n    const last = element => descendantRtl(element, isCursorPosition);\n    const descendantRtl = (scope, predicate) => {\n      const descend = element => {\n        const children = children$1(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 autocompleteSelector = '[data-mce-autocompleter]';\n    const create$9 = (editor, range) => {\n      if (findIn(SugarElement.fromDom(editor.getBody())).isNone()) {\n        const wrapper = SugarElement.fromHtml('<span data-mce-autocompleter=\"1\" data-mce-bogus=\"1\"></span>', editor.getDoc());\n        append$1(wrapper, SugarElement.fromDom(range.extractContents()));\n        range.insertNode(wrapper.dom);\n        parent(wrapper).each(elm => elm.dom.normalize());\n        last(wrapper).map(last => {\n          editor.selection.setCursorLocation(last.dom, getEnd(last));\n        });\n      }\n    };\n    const detect$1 = elm => closest$3(elm, autocompleteSelector);\n    const findIn = elm => descendant(elm, autocompleteSelector);\n    const remove$3 = (editor, elm) => findIn(elm).each(wrapper => {\n      const bookmark = editor.selection.getBookmark();\n      unwrap(wrapper);\n      editor.selection.moveToBookmark(bookmark);\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      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      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      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 isConditionalComment = (html, startIndex) => /^\\s*\\[if [\\w\\W]+\\]>.*<!\\[endif\\](--!?)?>/.test(html.substr(startIndex));\n    const findCommentEndIndex = (html, isBogus, startIndex = 0) => {\n      const lcHtml = html.toLowerCase();\n      if (lcHtml.indexOf('[if ', startIndex) !== -1 && isConditionalComment(lcHtml, startIndex)) {\n        const endIfIndex = lcHtml.indexOf('[endif]', startIndex);\n        return lcHtml.indexOf('>', endIfIndex);\n      } else {\n        if (isBogus) {\n          const endIndex = lcHtml.indexOf('>', startIndex);\n          return endIndex !== -1 ? endIndex : lcHtml.length;\n        } else {\n          const endCommentRegexp = /--!?>/g;\n          endCommentRegexp.lastIndex = startIndex;\n          const match = endCommentRegexp.exec(html);\n          return match ? match.index + match[0].length : lcHtml.length;\n        }\n      }\n    };\n    const findMatchingEndTagIndex = (schema, html, startIndex) => {\n      const startTagRegExp = /<([!?\\/])?([A-Za-z0-9\\-_:.]+)/g;\n      const endTagRegExp = /(?:\\s(?:[^'\">]+(?:\"[^\"]*\"|'[^']*'))*[^\"'>]*(?:\"[^\">]*|'[^'>]*)?|\\s*|\\/)>/g;\n      const voidElements = schema.getVoidElements();\n      let count = 1, index = startIndex;\n      while (count !== 0) {\n        startTagRegExp.lastIndex = index;\n        while (true) {\n          const startMatch = startTagRegExp.exec(html);\n          if (startMatch === null) {\n            return index;\n          } else if (startMatch[1] === '!') {\n            if (startsWith(startMatch[2], '--')) {\n              index = findCommentEndIndex(html, false, startMatch.index + '!--'.length);\n            } else {\n              index = findCommentEndIndex(html, true, startMatch.index + 1);\n            }\n            break;\n          } else {\n            endTagRegExp.lastIndex = startTagRegExp.lastIndex;\n            const endMatch = endTagRegExp.exec(html);\n            if (isNull(endMatch) || endMatch.index !== startTagRegExp.lastIndex) {\n              continue;\n            }\n            if (startMatch[1] === '/') {\n              count -= 1;\n            } else if (!has$2(voidElements, startMatch[2])) {\n              count += 1;\n            }\n            index = startTagRegExp.lastIndex + endMatch[0].length;\n            break;\n          }\n        }\n      }\n      return index;\n    };\n    const trimHtml$1 = (tempAttrs, html) => {\n      const trimContentRegExp = new RegExp(['\\\\s?(' + tempAttrs.join('|') + ')=\"[^\"]+\"'].join('|'), 'gi');\n      return html.replace(trimContentRegExp, '');\n    };\n    const trimInternal = (serializer, html) => {\n      const bogusAllRegExp = /<(\\w+) [^>]*data-mce-bogus=\"all\"[^>]*>/g;\n      const schema = serializer.schema;\n      let content = trimHtml$1(serializer.getTempAttrs(), html);\n      const voidElements = schema.getVoidElements();\n      let matches;\n      while (matches = bogusAllRegExp.exec(content)) {\n        const index = bogusAllRegExp.lastIndex;\n        const matchLength = matches[0].length;\n        let endTagIndex;\n        if (voidElements[matches[1]]) {\n          endTagIndex = index;\n        } else {\n          endTagIndex = findMatchingEndTagIndex(schema, content, index);\n        }\n        content = content.substring(0, index - matchLength) + content.substring(endTagIndex);\n        bogusAllRegExp.lastIndex = index - matchLength;\n      }\n      return trim$1(content);\n    };\n    const trimExternal = trimInternal;\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$6(elem);\n        } else if (isBr$5(elem)) {\n          before$3(elem, SugarElement.fromText(zeroWidth));\n          remove$6(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$b(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$2(offscreenDiv, 'data-mce-bogus', 'all');\n      setAll(offscreenDiv, {\n        position: 'fixed',\n        left: '-9999999px',\n        top: '0'\n      });\n      set(offscreenDiv, body.innerHTML);\n      cleanupBogusElements(offscreenDiv);\n      cleanupInputNames(offscreenDiv);\n      const root = getContentContainer(dos);\n      append$1(root, offscreenDiv);\n      const content = trim$1(offscreenDiv.dom.innerText);\n      remove$6(offscreenDiv);\n      return content;\n    };\n    const getContentFromBody = (editor, args, body) => {\n      let content;\n      if (args.format === 'raw') {\n        content = Tools.trim(trimExternal(editor.serializer, body.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 (!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          } 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$a).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$a(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$a(node) && !isBogusAll$1(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 getClosestBlock$1 = (root, pos) => find$2(parentsAndSelf(SugarElement.fromDom(pos.container()), root), isBlock$2);\n    const isAtBeforeAfterBlockBoundary = (forward, root, pos) => navigateIgnoreEmptyTextNodes(forward, root.dom, pos).forall(newPos => getClosestBlock$1(root, pos).fold(() => !isInSameBlock(newPos, pos, root.dom), fromBlock => !isInSameBlock(newPos, pos, root.dom) && contains(fromBlock, SugarElement.fromDom(newPos.container()))));\n    const isAtBlockBoundary = (forward, root, pos) => getClosestBlock$1(root, pos).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) => {\n      const parentBlocks = filter$5(parentsAndSelf(SugarElement.fromDom(pos.container()), root), isBlock$2);\n      const scope = head(parentBlocks).getOr(root);\n      return fromPosition(forward, scope.dom, pos).filter(isBr$1);\n    };\n    const isBeforeBr$1 = (root, pos) => getElementFromPosition(pos).exists(isBr$5) || findBr(true, root, pos).isSome();\n    const isAfterBr = (root, pos) => getElementFromPrevPosition(pos).exists(isBr$5) || findBr(false, root, pos).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) => {\n      const parentBlocks = filter$5(parentsAndSelf(SugarElement.fromDom(pos.container()), root), isBlock$2);\n      return head(parentBlocks).getOr(root);\n    };\n    const hasSpaceBefore = (root, pos) => {\n      if (isInMiddleOfText(pos)) {\n        return isAfterSpace(pos);\n      } else {\n        return isAfterSpace(pos) || prevPosition(getClosestBlock(root, pos).dom, pos).exists(isAfterSpace);\n      }\n    };\n    const hasSpaceAfter = (root, pos) => {\n      if (isInMiddleOfText(pos)) {\n        return isBeforeSpace(pos);\n      } else {\n        return isBeforeSpace(pos) || nextPosition(getClosestBlock(root, pos).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) => isAtBeginningOfBody(root, pos) || isAtEndOfBody(root, pos) || isAtStartOfBlock(root, pos) || isAtEndOfBlock(root, pos) || isAfterBr(root, pos) || isBeforeBr$1(root, pos);\n    const isCefBlock = node => isNonNullable(node) && isContentEditableFalse$a(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) => {\n      if (isInPre(pos)) {\n        return false;\n      } else {\n        return isAtLineBoundary(root, pos) || hasSpaceBefore(root, pos) || hasSpaceAfter(root, pos);\n      }\n    };\n    const needsToBeNbspLeft = (root, pos) => {\n      if (isInPre(pos)) {\n        return false;\n      } else {\n        return isAtStartOfBlock(root, pos) || isBeforeBlock(root, pos) || isAfterBr(root, pos) || hasSpaceBefore(root, pos) || isAfterCefBlock(root, pos);\n      }\n    };\n    const leanRight = pos => {\n      const container = pos.container();\n      const offset = pos.offset();\n      if (isText$a(container) && offset < container.data.length) {\n        return CaretPosition(container, offset + 1);\n      } else {\n        return pos;\n      }\n    };\n    const needsToBeNbspRight = (root, pos) => {\n      if (isInPre(pos)) {\n        return false;\n      } else {\n        return isAtEndOfBlock(root, pos) || isAfterBlock(root, pos) || isBeforeBr$1(root, pos) || hasSpaceAfter(root, pos) || isBeforeCefBlock(root, pos);\n      }\n    };\n    const needsToBeNbsp = (root, pos) => needsToBeNbspLeft(root, pos) || needsToBeNbspRight(root, leanRight(pos));\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$a(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) => {\n      const text = node.data;\n      const firstPos = CaretPosition(node, 0);\n      if (!makeNbsp && isNbspAt(text, 0) && !needsToBeNbsp(root, firstPos)) {\n        node.data = ' ' + text.slice(1);\n        return true;\n      } else if (makeNbsp && isWhiteSpaceAt(text, 0) && needsToBeNbspLeft(root, firstPos)) {\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) => {\n      const text = node.data;\n      const lastPos = CaretPosition(node, text.length - 1);\n      if (!makeNbsp && isNbspAt(text, text.length - 1) && !needsToBeNbsp(root, lastPos)) {\n        node.data = text.slice(0, -1) + ' ';\n        return true;\n      } else if (makeNbsp && isWhiteSpaceAt(text, text.length - 1) && needsToBeNbspRight(root, lastPos)) {\n        node.data = text.slice(0, -1) + nbsp;\n        return true;\n      } else {\n        return false;\n      }\n    };\n    const normalizeNbsps = (root, pos) => {\n      const container = pos.container();\n      if (!isText$a(container)) {\n        return Optional.none();\n      }\n      if (hasNbsp(pos)) {\n        const normalized = normalizeNbspAtStart(root, container, false) || normalizeNbspInMiddleOfTextNode(container) || normalizeNbspAtEnd(root, container, false);\n        return someIf(normalized, pos);\n      } else if (needsToBeNbsp(root, pos)) {\n        const normalized = normalizeNbspAtStart(root, container, true) || normalizeNbspAtEnd(root, container, true);\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())).each(pos => {\n          editor.selection.setRng(pos.toRange());\n        });\n      }\n    };\n\n    const normalize$1 = (node, offset, count) => {\n      if (count === 0) {\n        return;\n      }\n      const elm = SugarElement.fromDom(node);\n      const root = ancestor$3(elm, isBlock$2).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));\n      const isStartOfContent = offset === 0 && needsToBeNbspLeft(root, CaretPosition(node, 0));\n      node.replaceData(offset, count, normalize$4(whitespace, 4, isStartOfContent, isEndOfContent));\n    };\n    const normalizeWhitespaceAfter = (node, offset) => {\n      const content = node.data.slice(offset);\n      const whitespaceCount = content.length - lTrim(content).length;\n      normalize$1(node, offset, whitespaceCount);\n    };\n    const normalizeWhitespaceBefore = (node, offset) => {\n      const content = node.data.slice(0, offset);\n      const whitespaceCount = content.length - rTrim(content).length;\n      normalize$1(node, offset - whitespaceCount, whitespaceCount);\n    };\n    const mergeTextNodes = (prevNode, nextNode, 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$6(SugarElement.fromDom(removeNode));\n      if (normalizeWhitespace) {\n        normalizeWhitespaceAfter(newNode, whitespaceOffset);\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$a(node) ? CaretPosition(node, 0) : CaretPosition.before(node);\n    const afterOrEndOf = node => isText$a(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 = elm => {\n      if (isEmpty$2(elm)) {\n        const br = SugarElement.fromHtml('<br data-mce-bogus=\"1\">');\n        empty(elm);\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, normalizeWhitespace) => {\n      const prevTextOpt = prevSibling(elm).filter(isText$b);\n      const nextTextOpt = nextSibling(elm).filter(isText$b);\n      remove$6(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, 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));\n          nextTextOpt.each(elm => normalizeWhitespaceAfter(elm.dom, 0));\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) => {\n      const afterDeletePos = findCaretPosOutsideElmAfterDelete(forward, editor.getBody(), elm.dom);\n      const parentBlock = ancestor$3(elm, curry(isBlock, editor), eqRawNode(editor.getBody()));\n      const normalizedAfterDeletePos = deleteNormalized(elm, afterDeletePos, isInlineElement(editor, elm));\n      if (editor.dom.isEmpty(editor.getBody())) {\n        editor.setContent('');\n        editor.selection.setCursorLocation();\n      } else {\n        parentBlock.bind(paddEmptyBlock).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);\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$a(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$a(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(lastBlock)) {\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(node)) {\n            remove$6(node);\n          }\n        });\n      }\n    };\n\n    const isRootFromElement = root => cur => eq(root, cur);\n    const getTableCells = table => descendants(table, 'td,th');\n    const getTableDetailsFromRange = (rng, isRoot) => {\n      const getTable = node => getClosestTable(SugarElement.fromDom(node), isRoot);\n      const startTable = getTable(rng.startContainer);\n      const endTable = getTable(rng.endContainer);\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 {\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$3(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$b(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$6(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(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$2(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(isEmpty$2));\n        const endPointCell = isStartInTable ? cells[0] : cells[cells.length - 1];\n        deleteContentInsideCell(editor, endPointCell, editorRng, isStartInTable);\n        if (!isEmpty$2(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(startCell) ? startTableCells : startTableCells.slice(1);\n      const endTableCellsToClean = isEmpty$2(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$2 = (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(fromCell) ? 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(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$9 = (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$2(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$a(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 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 = (args, isBlock, node) => {\n      if (args.insert && isBlock(node)) {\n        const astNode = new AstNode('br', 1);\n        astNode.attr('data-mce-bogus', '1');\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\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, 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');\n      const fixed = new Set();\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) && !nonSplittableElements[parent.name]; parent = parent.parent) {\n          parents.push(parent);\n        }\n        if (parent && parents.length > 1) {\n          if (schema.isValidChild(parent.name, node.name)) {\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)) {\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 && schema.children[node.name] && !schema.isValidChild(parent.name, node.name)) {\n        return true;\n      } else if (parent && node.name === 'a' && hasClosest(parent, 'a')) {\n        return true;\n      } else {\n        return false;\n      }\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$1 = (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$1 = (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$1(liTarget, liElms, rootNode);\n      } else if (isAt(END)) {\n        return insertAfter$1(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) => {\n      Optional.from(dom.getParent(elm, 'td,th')).map(SugarElement.fromDom).each(trimBlockTrailingBr);\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$a(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$a(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        empty(SugarElement.fromDom(parentBlock));\n        rng.setStart(parentBlock, 0);\n        rng.setEnd(parentBlock, 0);\n        if (!isTableCell(parentBlock) && !isPartOfFragment(parentBlock) && (nextRng = findNextCaretRng(rng))) {\n          rng = nextRng;\n          dom.remove(parentBlock);\n        } else {\n          dom.add(parentBlock, dom.create('br', { '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$a(rng.startContainer.childNodes[rng.startOffset])) {\n        rng.deleteContents();\n      } else {\n        editor.getDoc().execCommand('Delete', false);\n      }\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 (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) {\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        for (let markerNode = root; markerNode; markerNode = markerNode.walk()) {\n          if (markerNode.attr('id') === 'mce_marker') {\n            markerNode.replace(fragment);\n            break;\n          }\n        }\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);\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());\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      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 = 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 sibling = (scope, predicate) => sibling$1(scope, predicate).isSome();\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$2 = (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$1 = (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$2(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) {\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 getEmptyCaretContainers = node => {\n      const nodes = [];\n      let tempNode = node;\n      while (tempNode) {\n        if (isText$a(tempNode) && tempNode.data !== ZWSP || 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 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$a(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 = true) => {\n      const dom = editor.dom, selection = editor.selection;\n      if (isCaretContainerEmpty(node)) {\n        deleteElement$2(editor, false, SugarElement.fromDom(node), moveCaret);\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 = true) => {\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, false);\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$a(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 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(parents.concat(cleanedFormatNode.toArray()), newCaretContainer);\n        if (caretContainer) {\n          removeCaretContainerNode(editor, caretContainer, false);\n        }\n        selection.setCursorLocation(caretTextNode, 1);\n        if (dom.isEmpty(formatNode)) {\n          dom.remove(formatNode);\n        }\n      }\n    };\n    const disableCaretContainer = (editor, keyCode) => {\n      const selection = editor.selection, body = editor.getBody();\n      removeCaretContainer(editor, null, false);\n      if ((keyCode === 8 || keyCode === 46) && selection.isCollapsed() && selection.getStart().innerHTML === ZWSP) {\n        removeCaretContainer(editor, getParentCaretContainer(body, selection.getStart()));\n      }\n      if (keyCode === 37 || keyCode === 39) {\n        removeCaretContainer(editor, getParentCaretContainer(body, selection.getStart()));\n      }\n    };\n    const setup$u = editor => {\n      editor.on('mouseup keydown', e => {\n        disableCaretContainer(editor, e.keyCode);\n      });\n    };\n    const replaceWithCaretFormat = (targetNode, formatNodes) => {\n      const caretContainer = createCaretContainer(false);\n      const innerMost = insertFormatNodesIntoCaretContainer(formatNodes, caretContainer.dom);\n      before$3(SugarElement.fromDom(targetNode), caretContainer);\n      remove$6(SugarElement.fromDom(targetNode));\n      return CaretPosition(innerMost, 0);\n    };\n    const isFormatElement = (editor, element) => {\n      const inlineElements = editor.schema.getTextInlineElements();\n      return has$2(inlineElements, name(element)) && !isCaretNode(element.dom) && !isBogus$2(element.dom);\n    };\n    const isEmptyCaretFormatElement = element => {\n      return isCaretNode(element.dom) && isCaretContainerEmpty(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$6(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.getContentEditableParent(elm) !== 'false';\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$3(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$2(node);\n    const findElementSibling = (node, siblingName) => {\n      for (let sibling = node; sibling; sibling = sibling[siblingName]) {\n        if (isText$a(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 = isElement$6(prev) && isEditable$3(prev);\n      const isNextEditable = isElement$6(next) && isEditable$3(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) && isEditable$3(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$a(container) && start && offset >= container.data.length) {\n        container = new DomTreeWalker(container, ed.getBody()).next() || container;\n      }\n      if (isText$a(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 removeFormatInternal = (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 removeFormat$1 = (ed, format, vars, node, compareNode) => removeFormatInternal(ed, format, vars, node, compareNode).fold(never, newName => {\n      ed.dom.rename(node, newName);\n      return true;\n    }, always);\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 removeFormatFromClone = (editor, format, vars, clone) => removeFormatInternal(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 = removeFormatFromClone(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 remove$2 = (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 removeNodeFormat = node => exists(formatList, fmt => removeFormat$1(ed, fmt, vars, node, node));\n      const process = node => {\n        const children = from(node.childNodes);\n        const removed = removeNodeFormat(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          removeNodeFormat(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            removeFormat$1(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$a(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\n    const each$6 = Tools.each;\n    const mergeTextDecorationsAndColor = (dom, format, vars, node) => {\n      const processTextDecorationsAndColor = n => {\n        if (isElement$6(n) && isElement$6(n.parentNode) && isEditable$3(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) && isEditable$3(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) && isEditable$3(elm), applyStyle(dom, 'fontSize', ''));\n        const inverseTagDescendants = filter$5(dom.select(format.inline === 'sup' ? 'sub' : 'sup', node), isEditable$3);\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              removeFormat$1(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 (removeFormat$1(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            removeFormat$1(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) && isEmpty$2(SugarElement.fromDom(node.parentNode), false) && !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 applyFormat$1 = (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$a(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\n    const hasVars = value => has$2(value, 'vars');\n    const setup$t = (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$2(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          remove$2(editor, name, vars, node);\n        } else {\n          applyFormat$1(editor, name, vars, node);\n        }\n      }\n    };\n\n    function _typeof(obj) {\n      '@babel/helpers - typeof';\n      return _typeof = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (obj) {\n        return typeof obj;\n      } : function (obj) {\n        return obj && 'function' == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;\n      }, _typeof(obj);\n    }\n    function _setPrototypeOf(o, p) {\n      _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n        o.__proto__ = p;\n        return o;\n      };\n      return _setPrototypeOf(o, p);\n    }\n    function _isNativeReflectConstruct() {\n      if (typeof Reflect === 'undefined' || !Reflect.construct)\n        return false;\n      if (Reflect.construct.sham)\n        return false;\n      if (typeof Proxy === 'function')\n        return true;\n      try {\n        Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {\n        }));\n        return true;\n      } catch (e) {\n        return false;\n      }\n    }\n    function _construct(Parent, args, Class) {\n      if (_isNativeReflectConstruct()) {\n        _construct = Reflect.construct;\n      } else {\n        _construct = function _construct(Parent, args, Class) {\n          var a = [null];\n          a.push.apply(a, args);\n          var Constructor = Function.bind.apply(Parent, a);\n          var instance = new Constructor();\n          if (Class)\n            _setPrototypeOf(instance, Class.prototype);\n          return instance;\n        };\n      }\n      return _construct.apply(null, arguments);\n    }\n    function _toConsumableArray(arr) {\n      return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n    }\n    function _arrayWithoutHoles(arr) {\n      if (Array.isArray(arr))\n        return _arrayLikeToArray(arr);\n    }\n    function _iterableToArray(iter) {\n      if (typeof Symbol !== 'undefined' && iter[Symbol.iterator] != null || iter['@@iterator'] != null)\n        return Array.from(iter);\n    }\n    function _unsupportedIterableToArray(o, minLen) {\n      if (!o)\n        return;\n      if (typeof o === 'string')\n        return _arrayLikeToArray(o, minLen);\n      var n = Object.prototype.toString.call(o).slice(8, -1);\n      if (n === 'Object' && o.constructor)\n        n = o.constructor.name;\n      if (n === 'Map' || n === 'Set')\n        return Array.from(o);\n      if (n === 'Arguments' || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))\n        return _arrayLikeToArray(o, minLen);\n    }\n    function _arrayLikeToArray(arr, len) {\n      if (len == null || len > arr.length)\n        len = arr.length;\n      for (var i = 0, arr2 = new Array(len); i < len; i++)\n        arr2[i] = arr[i];\n      return arr2;\n    }\n    function _nonIterableSpread() {\n      throw new TypeError('Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.');\n    }\n    var hasOwnProperty = Object.hasOwnProperty, setPrototypeOf = Object.setPrototypeOf, isFrozen = Object.isFrozen, getPrototypeOf = Object.getPrototypeOf, getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n    var freeze = Object.freeze, seal = Object.seal, create$8 = Object.create;\n    var _ref = typeof Reflect !== 'undefined' && Reflect, apply = _ref.apply, construct = _ref.construct;\n    if (!apply) {\n      apply = function apply(fun, thisValue, args) {\n        return fun.apply(thisValue, args);\n      };\n    }\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 (!construct) {\n      construct = function construct(Func, args) {\n        return _construct(Func, _toConsumableArray(args));\n      };\n    }\n    var arrayForEach = unapply(Array.prototype.forEach);\n    var arrayPop = unapply(Array.prototype.pop);\n    var arrayPush = unapply(Array.prototype.push);\n    var stringToLowerCase = unapply(String.prototype.toLowerCase);\n    var stringMatch = unapply(String.prototype.match);\n    var stringReplace = unapply(String.prototype.replace);\n    var stringIndexOf = unapply(String.prototype.indexOf);\n    var stringTrim = unapply(String.prototype.trim);\n    var regExpTest = unapply(RegExp.prototype.test);\n    var typeErrorCreate = unconstruct(TypeError);\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    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    function addToSet(set, array) {\n      if (setPrototypeOf) {\n        setPrototypeOf(set, null);\n      }\n      var l = array.length;\n      while (l--) {\n        var element = array[l];\n        if (typeof element === 'string') {\n          var lcElement = stringToLowerCase(element);\n          if (lcElement !== element) {\n            if (!isFrozen(array)) {\n              array[l] = lcElement;\n            }\n            element = lcElement;\n          }\n        }\n        set[element] = true;\n      }\n      return set;\n    }\n    function clone(object) {\n      var newObject = create$8(null);\n      var property;\n      for (property in object) {\n        if (apply(hasOwnProperty, object, [property])) {\n          newObject[property] = object[property];\n        }\n      }\n      return newObject;\n    }\n    function lookupGetter(object, prop) {\n      while (object !== null) {\n        var 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(element) {\n        console.warn('fallback value for', element);\n        return null;\n      }\n      return fallbackValue;\n    }\n    var html$1 = freeze([\n      'a',\n      'abbr',\n      'acronym',\n      'address',\n      'area',\n      'article',\n      'aside',\n      'audio',\n      'b',\n      'bdi',\n      'bdo',\n      'big',\n      'blink',\n      'blockquote',\n      'body',\n      'br',\n      'button',\n      'canvas',\n      'caption',\n      'center',\n      'cite',\n      'code',\n      'col',\n      'colgroup',\n      'content',\n      'data',\n      'datalist',\n      'dd',\n      'decorator',\n      'del',\n      'details',\n      'dfn',\n      'dialog',\n      'dir',\n      'div',\n      'dl',\n      'dt',\n      'element',\n      'em',\n      'fieldset',\n      'figcaption',\n      'figure',\n      'font',\n      'footer',\n      'form',\n      'h1',\n      'h2',\n      'h3',\n      'h4',\n      'h5',\n      'h6',\n      'head',\n      'header',\n      'hgroup',\n      'hr',\n      'html',\n      'i',\n      'img',\n      'input',\n      'ins',\n      'kbd',\n      'label',\n      'legend',\n      'li',\n      'main',\n      'map',\n      'mark',\n      'marquee',\n      'menu',\n      'menuitem',\n      'meter',\n      'nav',\n      'nobr',\n      'ol',\n      'optgroup',\n      'option',\n      'output',\n      'p',\n      'picture',\n      'pre',\n      'progress',\n      'q',\n      'rp',\n      'rt',\n      'ruby',\n      's',\n      'samp',\n      'section',\n      'select',\n      'shadow',\n      'small',\n      'source',\n      'spacer',\n      'span',\n      'strike',\n      'strong',\n      'style',\n      'sub',\n      'summary',\n      'sup',\n      'table',\n      'tbody',\n      'td',\n      'template',\n      'textarea',\n      'tfoot',\n      'th',\n      'thead',\n      'time',\n      'tr',\n      'track',\n      'tt',\n      'u',\n      'ul',\n      'var',\n      'video',\n      'wbr'\n    ]);\n    var svg$1 = freeze([\n      'svg',\n      'a',\n      'altglyph',\n      'altglyphdef',\n      'altglyphitem',\n      'animatecolor',\n      'animatemotion',\n      'animatetransform',\n      'circle',\n      'clippath',\n      'defs',\n      'desc',\n      'ellipse',\n      'filter',\n      'font',\n      'g',\n      'glyph',\n      'glyphref',\n      'hkern',\n      'image',\n      'line',\n      'lineargradient',\n      'marker',\n      'mask',\n      'metadata',\n      'mpath',\n      'path',\n      'pattern',\n      'polygon',\n      'polyline',\n      'radialgradient',\n      'rect',\n      'stop',\n      'style',\n      'switch',\n      'symbol',\n      'text',\n      'textpath',\n      'title',\n      'tref',\n      'tspan',\n      'view',\n      'vkern'\n    ]);\n    var svgFilters = freeze([\n      'feBlend',\n      'feColorMatrix',\n      'feComponentTransfer',\n      'feComposite',\n      'feConvolveMatrix',\n      'feDiffuseLighting',\n      'feDisplacementMap',\n      'feDistantLight',\n      'feFlood',\n      'feFuncA',\n      'feFuncB',\n      'feFuncG',\n      'feFuncR',\n      'feGaussianBlur',\n      'feImage',\n      'feMerge',\n      'feMergeNode',\n      'feMorphology',\n      'feOffset',\n      'fePointLight',\n      'feSpecularLighting',\n      'feSpotLight',\n      'feTile',\n      'feTurbulence'\n    ]);\n    var svgDisallowed = freeze([\n      'animate',\n      'color-profile',\n      'cursor',\n      'discard',\n      'fedropshadow',\n      'font-face',\n      'font-face-format',\n      'font-face-name',\n      'font-face-src',\n      'font-face-uri',\n      'foreignobject',\n      'hatch',\n      'hatchpath',\n      'mesh',\n      'meshgradient',\n      'meshpatch',\n      'meshrow',\n      'missing-glyph',\n      'script',\n      'set',\n      'solidcolor',\n      'unknown',\n      'use'\n    ]);\n    var mathMl$1 = freeze([\n      'math',\n      'menclose',\n      'merror',\n      'mfenced',\n      'mfrac',\n      'mglyph',\n      'mi',\n      'mlabeledtr',\n      'mmultiscripts',\n      'mn',\n      'mo',\n      'mover',\n      'mpadded',\n      'mphantom',\n      'mroot',\n      'mrow',\n      'ms',\n      'mspace',\n      'msqrt',\n      'mstyle',\n      'msub',\n      'msup',\n      'msubsup',\n      'mtable',\n      'mtd',\n      'mtext',\n      'mtr',\n      'munder',\n      'munderover'\n    ]);\n    var mathMlDisallowed = freeze([\n      'maction',\n      'maligngroup',\n      'malignmark',\n      'mlongdiv',\n      'mscarries',\n      'mscarry',\n      'msgroup',\n      'mstack',\n      'msline',\n      'msrow',\n      'semantics',\n      'annotation',\n      'annotation-xml',\n      'mprescripts',\n      'none'\n    ]);\n    var text = freeze(['#text']);\n    var html = freeze([\n      'accept',\n      'action',\n      'align',\n      'alt',\n      'autocapitalize',\n      'autocomplete',\n      'autopictureinpicture',\n      'autoplay',\n      'background',\n      'bgcolor',\n      'border',\n      'capture',\n      'cellpadding',\n      'cellspacing',\n      'checked',\n      'cite',\n      'class',\n      'clear',\n      'color',\n      'cols',\n      'colspan',\n      'controls',\n      'controlslist',\n      'coords',\n      'crossorigin',\n      'datetime',\n      'decoding',\n      'default',\n      'dir',\n      'disabled',\n      'disablepictureinpicture',\n      'disableremoteplayback',\n      'download',\n      'draggable',\n      'enctype',\n      'enterkeyhint',\n      'face',\n      'for',\n      'headers',\n      'height',\n      'hidden',\n      'high',\n      'href',\n      'hreflang',\n      'id',\n      'inputmode',\n      'integrity',\n      'ismap',\n      'kind',\n      'label',\n      'lang',\n      'list',\n      'loading',\n      'loop',\n      'low',\n      'max',\n      'maxlength',\n      'media',\n      'method',\n      'min',\n      'minlength',\n      'multiple',\n      'muted',\n      'name',\n      'nonce',\n      'noshade',\n      'novalidate',\n      'nowrap',\n      'open',\n      'optimum',\n      'pattern',\n      'placeholder',\n      'playsinline',\n      'poster',\n      'preload',\n      'pubdate',\n      'radiogroup',\n      'readonly',\n      'rel',\n      'required',\n      'rev',\n      'reversed',\n      'role',\n      'rows',\n      'rowspan',\n      'spellcheck',\n      'scope',\n      'selected',\n      'shape',\n      'size',\n      'sizes',\n      'span',\n      'srclang',\n      'start',\n      'src',\n      'srcset',\n      'step',\n      'style',\n      'summary',\n      'tabindex',\n      'title',\n      'translate',\n      'type',\n      'usemap',\n      'valign',\n      'value',\n      'width',\n      'xmlns',\n      'slot'\n    ]);\n    var svg = freeze([\n      'accent-height',\n      'accumulate',\n      'additive',\n      'alignment-baseline',\n      'ascent',\n      'attributename',\n      'attributetype',\n      'azimuth',\n      'basefrequency',\n      'baseline-shift',\n      'begin',\n      'bias',\n      'by',\n      'class',\n      'clip',\n      'clippathunits',\n      'clip-path',\n      'clip-rule',\n      'color',\n      'color-interpolation',\n      'color-interpolation-filters',\n      'color-profile',\n      'color-rendering',\n      'cx',\n      'cy',\n      'd',\n      'dx',\n      'dy',\n      'diffuseconstant',\n      'direction',\n      'display',\n      'divisor',\n      'dur',\n      'edgemode',\n      'elevation',\n      'end',\n      'fill',\n      'fill-opacity',\n      'fill-rule',\n      'filter',\n      'filterunits',\n      'flood-color',\n      'flood-opacity',\n      'font-family',\n      'font-size',\n      'font-size-adjust',\n      'font-stretch',\n      'font-style',\n      'font-variant',\n      'font-weight',\n      'fx',\n      'fy',\n      'g1',\n      'g2',\n      'glyph-name',\n      'glyphref',\n      'gradientunits',\n      'gradienttransform',\n      'height',\n      'href',\n      'id',\n      'image-rendering',\n      'in',\n      'in2',\n      'k',\n      'k1',\n      'k2',\n      'k3',\n      'k4',\n      'kerning',\n      'keypoints',\n      'keysplines',\n      'keytimes',\n      'lang',\n      'lengthadjust',\n      'letter-spacing',\n      'kernelmatrix',\n      'kernelunitlength',\n      'lighting-color',\n      'local',\n      'marker-end',\n      'marker-mid',\n      'marker-start',\n      'markerheight',\n      'markerunits',\n      'markerwidth',\n      'maskcontentunits',\n      'maskunits',\n      'max',\n      'mask',\n      'media',\n      'method',\n      'mode',\n      'min',\n      'name',\n      'numoctaves',\n      'offset',\n      'operator',\n      'opacity',\n      'order',\n      'orient',\n      'orientation',\n      'origin',\n      'overflow',\n      'paint-order',\n      'path',\n      'pathlength',\n      'patterncontentunits',\n      'patterntransform',\n      'patternunits',\n      'points',\n      'preservealpha',\n      'preserveaspectratio',\n      'primitiveunits',\n      'r',\n      'rx',\n      'ry',\n      'radius',\n      'refx',\n      'refy',\n      'repeatcount',\n      'repeatdur',\n      'restart',\n      'result',\n      'rotate',\n      'scale',\n      'seed',\n      'shape-rendering',\n      'specularconstant',\n      'specularexponent',\n      'spreadmethod',\n      'startoffset',\n      'stddeviation',\n      'stitchtiles',\n      'stop-color',\n      'stop-opacity',\n      'stroke-dasharray',\n      'stroke-dashoffset',\n      'stroke-linecap',\n      'stroke-linejoin',\n      'stroke-miterlimit',\n      'stroke-opacity',\n      'stroke',\n      'stroke-width',\n      'style',\n      'surfacescale',\n      'systemlanguage',\n      'tabindex',\n      'targetx',\n      'targety',\n      'transform',\n      'transform-origin',\n      'text-anchor',\n      'text-decoration',\n      'text-rendering',\n      'textlength',\n      'type',\n      'u1',\n      'u2',\n      'unicode',\n      'values',\n      'viewbox',\n      'visibility',\n      'version',\n      'vert-adv-y',\n      'vert-origin-x',\n      'vert-origin-y',\n      'width',\n      'word-spacing',\n      'wrap',\n      'writing-mode',\n      'xchannelselector',\n      'ychannelselector',\n      'x',\n      'x1',\n      'x2',\n      'xmlns',\n      'y',\n      'y1',\n      'y2',\n      'z',\n      'zoomandpan'\n    ]);\n    var mathMl = freeze([\n      'accent',\n      'accentunder',\n      'align',\n      'bevelled',\n      'close',\n      'columnsalign',\n      'columnlines',\n      'columnspan',\n      'denomalign',\n      'depth',\n      'dir',\n      'display',\n      'displaystyle',\n      'encoding',\n      'fence',\n      'frame',\n      'height',\n      'href',\n      'id',\n      'largeop',\n      'length',\n      'linethickness',\n      'lspace',\n      'lquote',\n      'mathbackground',\n      'mathcolor',\n      'mathsize',\n      'mathvariant',\n      'maxsize',\n      'minsize',\n      'movablelimits',\n      'notation',\n      'numalign',\n      'open',\n      'rowalign',\n      'rowlines',\n      'rowspacing',\n      'rowspan',\n      'rspace',\n      'rquote',\n      'scriptlevel',\n      'scriptminsize',\n      'scriptsizemultiplier',\n      'selection',\n      'separator',\n      'separators',\n      'stretchy',\n      'subscriptshift',\n      'supscriptshift',\n      'symmetric',\n      'voffset',\n      'width',\n      'xmlns'\n    ]);\n    var xml = freeze([\n      'xlink:href',\n      'xml:id',\n      'xlink:title',\n      'xml:space',\n      'xmlns:xlink'\n    ]);\n    var MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm);\n    var ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\n    var DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/);\n    var ARIA_ATTR = seal(/^aria-[\\-\\w]+$/);\n    var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i);\n    var IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\n    var ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g);\n    var DOCTYPE_NAME = seal(/^html$/i);\n    var getGlobal = function getGlobal() {\n      return typeof window === 'undefined' ? null : window;\n    };\n    var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {\n      if (_typeof(trustedTypes) !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n        return null;\n      }\n      var suffix = null;\n      var ATTR_NAME = 'data-tt-policy-suffix';\n      if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {\n        suffix = document.currentScript.getAttribute(ATTR_NAME);\n      }\n      var policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n      try {\n        return trustedTypes.createPolicy(policyName, {\n          createHTML: function createHTML(html) {\n            return html;\n          }\n        });\n      } catch (_) {\n        console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n        return null;\n      }\n    };\n    function createDOMPurify() {\n      var window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n      var DOMPurify = function DOMPurify(root) {\n        return createDOMPurify(root);\n      };\n      DOMPurify.version = '2.3.8';\n      DOMPurify.removed = [];\n      if (!window || !window.document || window.document.nodeType !== 9) {\n        DOMPurify.isSupported = false;\n        return DOMPurify;\n      }\n      var originalDocument = window.document;\n      var document = window.document;\n      var DocumentFragment = window.DocumentFragment, HTMLTemplateElement = window.HTMLTemplateElement, Node = window.Node, Element = window.Element, NodeFilter = window.NodeFilter, _window$NamedNodeMap = window.NamedNodeMap, NamedNodeMap = _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap, HTMLFormElement = window.HTMLFormElement, DOMParser = window.DOMParser, trustedTypes = window.trustedTypes;\n      var ElementPrototype = Element.prototype;\n      var cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n      var getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n      var getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n      var getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n      if (typeof HTMLTemplateElement === 'function') {\n        var template = document.createElement('template');\n        if (template.content && template.content.ownerDocument) {\n          document = template.content.ownerDocument;\n        }\n      }\n      var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);\n      var emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';\n      var _document = document, implementation = _document.implementation, createNodeIterator = _document.createNodeIterator, createDocumentFragment = _document.createDocumentFragment, getElementsByTagName = _document.getElementsByTagName;\n      var importNode = originalDocument.importNode;\n      var documentMode = {};\n      try {\n        documentMode = clone(document).documentMode ? document.documentMode : {};\n      } catch (_) {\n      }\n      var hooks = {};\n      DOMPurify.isSupported = typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined' && documentMode !== 9;\n      var MUSTACHE_EXPR$1 = MUSTACHE_EXPR, ERB_EXPR$1 = ERB_EXPR, DATA_ATTR$1 = DATA_ATTR, ARIA_ATTR$1 = ARIA_ATTR, IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA, ATTR_WHITESPACE$1 = ATTR_WHITESPACE;\n      var IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n      var ALLOWED_TAGS = null;\n      var DEFAULT_ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray(html$1), _toConsumableArray(svg$1), _toConsumableArray(svgFilters), _toConsumableArray(mathMl$1), _toConsumableArray(text)));\n      var ALLOWED_ATTR = null;\n      var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray(html), _toConsumableArray(svg), _toConsumableArray(mathMl), _toConsumableArray(xml)));\n      var CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(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      var FORBID_TAGS = null;\n      var FORBID_ATTR = null;\n      var ALLOW_ARIA_ATTR = true;\n      var ALLOW_DATA_ATTR = true;\n      var ALLOW_UNKNOWN_PROTOCOLS = false;\n      var SAFE_FOR_TEMPLATES = false;\n      var WHOLE_DOCUMENT = false;\n      var SET_CONFIG = false;\n      var FORCE_BODY = false;\n      var RETURN_DOM = false;\n      var RETURN_DOM_FRAGMENT = false;\n      var RETURN_TRUSTED_TYPE = false;\n      var SANITIZE_DOM = true;\n      var KEEP_CONTENT = true;\n      var IN_PLACE = false;\n      var USE_PROFILES = {};\n      var FORBID_CONTENTS = null;\n      var DEFAULT_FORBID_CONTENTS = addToSet({}, [\n        'annotation-xml',\n        'audio',\n        'colgroup',\n        'desc',\n        'foreignobject',\n        'head',\n        'iframe',\n        'math',\n        'mi',\n        'mn',\n        'mo',\n        'ms',\n        'mtext',\n        'noembed',\n        'noframes',\n        'noscript',\n        'plaintext',\n        'script',\n        'style',\n        'svg',\n        'template',\n        'thead',\n        'title',\n        'video',\n        'xmp'\n      ]);\n      var DATA_URI_TAGS = null;\n      var DEFAULT_DATA_URI_TAGS = addToSet({}, [\n        'audio',\n        'video',\n        'img',\n        'source',\n        'image',\n        'track'\n      ]);\n      var URI_SAFE_ATTRIBUTES = null;\n      var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [\n        'alt',\n        'class',\n        'for',\n        'id',\n        'label',\n        'name',\n        'pattern',\n        'placeholder',\n        'role',\n        'summary',\n        'title',\n        'value',\n        'style',\n        'xmlns'\n      ]);\n      var MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n      var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n      var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n      var NAMESPACE = HTML_NAMESPACE;\n      var IS_EMPTY_INPUT = false;\n      var PARSER_MEDIA_TYPE;\n      var SUPPORTED_PARSER_MEDIA_TYPES = [\n        'application/xhtml+xml',\n        'text/html'\n      ];\n      var DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n      var transformCaseFunc;\n      var CONFIG = null;\n      var formElement = document.createElement('form');\n      var isRegexOrFunction = function isRegexOrFunction(testValue) {\n        return testValue instanceof RegExp || testValue instanceof Function;\n      };\n      var _parseConfig = function _parseConfig(cfg) {\n        if (CONFIG && CONFIG === cfg) {\n          return;\n        }\n        if (!cfg || _typeof(cfg) !== 'object') {\n          cfg = {};\n        }\n        cfg = clone(cfg);\n        ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS) : DEFAULT_ALLOWED_TAGS;\n        ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR) : DEFAULT_ALLOWED_ATTR;\n        URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR) : DEFAULT_URI_SAFE_ATTRIBUTES;\n        DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS) : DEFAULT_DATA_URI_TAGS;\n        FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS) : DEFAULT_FORBID_CONTENTS;\n        FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS) : {};\n        FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR) : {};\n        USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;\n        ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false;\n        ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false;\n        ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false;\n        SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false;\n        WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false;\n        RETURN_DOM = cfg.RETURN_DOM || false;\n        RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false;\n        RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false;\n        FORCE_BODY = cfg.FORCE_BODY || false;\n        SANITIZE_DOM = cfg.SANITIZE_DOM !== false;\n        KEEP_CONTENT = cfg.KEEP_CONTENT !== false;\n        IN_PLACE = cfg.IN_PLACE || false;\n        IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$1;\n        NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\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        PARSER_MEDIA_TYPE = SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE;\n        transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? function (x) {\n          return x;\n        } : stringToLowerCase;\n        if (SAFE_FOR_TEMPLATES) {\n          ALLOW_DATA_ATTR = false;\n        }\n        if (RETURN_DOM_FRAGMENT) {\n          RETURN_DOM = true;\n        }\n        if (USE_PROFILES) {\n          ALLOWED_TAGS = addToSet({}, _toConsumableArray(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        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);\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);\n        }\n        if (cfg.ADD_URI_SAFE_ATTR) {\n          addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR);\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);\n        }\n        if (KEEP_CONTENT) {\n          ALLOWED_TAGS['#text'] = true;\n        }\n        if (WHOLE_DOCUMENT) {\n          addToSet(ALLOWED_TAGS, [\n            'html',\n            'head',\n            'body'\n          ]);\n        }\n        if (ALLOWED_TAGS.table) {\n          addToSet(ALLOWED_TAGS, ['tbody']);\n          delete FORBID_TAGS.tbody;\n        }\n        if (freeze) {\n          freeze(cfg);\n        }\n        CONFIG = cfg;\n      };\n      var MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, [\n        'mi',\n        'mo',\n        'mn',\n        'ms',\n        'mtext'\n      ]);\n      var HTML_INTEGRATION_POINTS = addToSet({}, [\n        'foreignobject',\n        'desc',\n        'title',\n        'annotation-xml'\n      ]);\n      var COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [\n        'title',\n        'style',\n        'font',\n        'a',\n        'script'\n      ]);\n      var ALL_SVG_TAGS = addToSet({}, svg$1);\n      addToSet(ALL_SVG_TAGS, svgFilters);\n      addToSet(ALL_SVG_TAGS, svgDisallowed);\n      var ALL_MATHML_TAGS = addToSet({}, mathMl$1);\n      addToSet(ALL_MATHML_TAGS, mathMlDisallowed);\n      var _checkValidNamespace = function _checkValidNamespace(element) {\n        var parent = getParentNode(element);\n        if (!parent || !parent.tagName) {\n          parent = {\n            namespaceURI: HTML_NAMESPACE,\n            tagName: 'template'\n          };\n        }\n        var tagName = stringToLowerCase(element.tagName);\n        var parentTagName = stringToLowerCase(parent.tagName);\n        if (element.namespaceURI === SVG_NAMESPACE) {\n          if (parent.namespaceURI === HTML_NAMESPACE) {\n            return tagName === 'svg';\n          }\n          if (parent.namespaceURI === MATHML_NAMESPACE) {\n            return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n          }\n          return Boolean(ALL_SVG_TAGS[tagName]);\n        }\n        if (element.namespaceURI === MATHML_NAMESPACE) {\n          if (parent.namespaceURI === HTML_NAMESPACE) {\n            return tagName === 'math';\n          }\n          if (parent.namespaceURI === SVG_NAMESPACE) {\n            return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n          }\n          return Boolean(ALL_MATHML_TAGS[tagName]);\n        }\n        if (element.namespaceURI === HTML_NAMESPACE) {\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          return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n        }\n        return false;\n      };\n      var _forceRemove = function _forceRemove(node) {\n        arrayPush(DOMPurify.removed, { element: node });\n        try {\n          node.parentNode.removeChild(node);\n        } catch (_) {\n          try {\n            node.outerHTML = emptyHTML;\n          } catch (_) {\n            node.remove();\n          }\n        }\n      };\n      var _removeAttribute = function _removeAttribute(name, node) {\n        try {\n          arrayPush(DOMPurify.removed, {\n            attribute: node.getAttributeNode(name),\n            from: node\n          });\n        } catch (_) {\n          arrayPush(DOMPurify.removed, {\n            attribute: null,\n            from: node\n          });\n        }\n        node.removeAttribute(name);\n        if (name === 'is' && !ALLOWED_ATTR[name]) {\n          if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n            try {\n              _forceRemove(node);\n            } catch (_) {\n            }\n          } else {\n            try {\n              node.setAttribute(name, '');\n            } catch (_) {\n            }\n          }\n        }\n      };\n      var _initDocument = function _initDocument(dirty) {\n        var doc;\n        var leadingWhitespace;\n        if (FORCE_BODY) {\n          dirty = '<remove></remove>' + dirty;\n        } else {\n          var matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n          leadingWhitespace = matches && matches[0];\n        }\n        if (PARSER_MEDIA_TYPE === 'application/xhtml+xml') {\n          dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n        }\n        var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n        if (NAMESPACE === HTML_NAMESPACE) {\n          try {\n            doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n          } catch (_) {\n          }\n        }\n        if (!doc || !doc.documentElement) {\n          doc = implementation.createDocument(NAMESPACE, 'template', null);\n          try {\n            doc.documentElement.innerHTML = IS_EMPTY_INPUT ? '' : dirtyPayload;\n          } catch (_) {\n          }\n        }\n        var body = doc.body || doc.documentElement;\n        if (dirty && leadingWhitespace) {\n          body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n        }\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      var _createIterator = function _createIterator(root) {\n        return createNodeIterator.call(root.ownerDocument || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);\n      };\n      var _isClobbered = function _isClobbered(elm) {\n        return elm instanceof HTMLFormElement && (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function');\n      };\n      var _isNode = function _isNode(object) {\n        return _typeof(Node) === 'object' ? object instanceof Node : object && _typeof(object) === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';\n      };\n      var _executeHook = function _executeHook(entryPoint, currentNode, data) {\n        if (!hooks[entryPoint]) {\n          return;\n        }\n        arrayForEach(hooks[entryPoint], function (hook) {\n          hook.call(DOMPurify, currentNode, data, CONFIG);\n        });\n      };\n      var _sanitizeElements = function _sanitizeElements(currentNode) {\n        var content;\n        _executeHook('beforeSanitizeElements', currentNode, null);\n        if (_isClobbered(currentNode)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        if (regExpTest(/[\\u0080-\\uFFFF]/, currentNode.nodeName)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        var tagName = transformCaseFunc(currentNode.nodeName);\n        _executeHook('uponSanitizeElement', currentNode, {\n          tagName: tagName,\n          allowedTags: ALLOWED_TAGS\n        });\n        if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        if (tagName === 'select' && regExpTest(/<template/i, currentNode.innerHTML)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {\n            if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName))\n              return false;\n            if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName))\n              return false;\n          }\n          if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n            var parentNode = getParentNode(currentNode) || currentNode.parentNode;\n            var childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n            if (childNodes && parentNode) {\n              var childCount = childNodes.length;\n              for (var i = childCount - 1; i >= 0; --i) {\n                parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));\n              }\n            }\n          }\n          _forceRemove(currentNode);\n          return true;\n        }\n        if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\\/no(script|embed)/i, currentNode.innerHTML)) {\n          _forceRemove(currentNode);\n          return true;\n        }\n        if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {\n          content = currentNode.textContent;\n          content = stringReplace(content, MUSTACHE_EXPR$1, ' ');\n          content = stringReplace(content, ERB_EXPR$1, ' ');\n          if (currentNode.textContent !== content) {\n            arrayPush(DOMPurify.removed, { element: currentNode.cloneNode() });\n            currentNode.textContent = content;\n          }\n        }\n        _executeHook('afterSanitizeElements', currentNode, null);\n        return false;\n      };\n      var _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n        if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n          return false;\n        }\n        if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR$1, lcName));\n        else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName));\n        else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n          if (_basicCustomElementTest(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)) || 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)));\n          else {\n            return false;\n          }\n        } else if (URI_SAFE_ATTRIBUTES[lcName]);\n        else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, '')));\n        else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]);\n        else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, '')));\n        else if (!value);\n        else {\n          return false;\n        }\n        return true;\n      };\n      var _basicCustomElementTest = function _basicCustomElementTest(tagName) {\n        return tagName.indexOf('-') > 0;\n      };\n      var _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n        var attr;\n        var value;\n        var lcName;\n        var l;\n        _executeHook('beforeSanitizeAttributes', currentNode, null);\n        var attributes = currentNode.attributes;\n        if (!attributes) {\n          return;\n        }\n        var hookEvent = {\n          attrName: '',\n          attrValue: '',\n          keepAttr: true,\n          allowedAttributes: ALLOWED_ATTR\n        };\n        l = attributes.length;\n        while (l--) {\n          attr = attributes[l];\n          var _attr = attr, name = _attr.name, namespaceURI = _attr.namespaceURI;\n          value = name === 'value' ? attr.value : stringTrim(attr.value);\n          lcName = transformCaseFunc(name);\n          var initValue = value;\n          hookEvent.attrName = lcName;\n          hookEvent.attrValue = value;\n          hookEvent.keepAttr = true;\n          hookEvent.forceKeepAttr = undefined;\n          _executeHook('uponSanitizeAttribute', currentNode, hookEvent);\n          value = hookEvent.attrValue;\n          if (hookEvent.forceKeepAttr) {\n            continue;\n          }\n          if (!hookEvent.keepAttr) {\n            _removeAttribute(name, currentNode);\n            continue;\n          }\n          if (regExpTest(/\\/>/i, value)) {\n            _removeAttribute(name, currentNode);\n            continue;\n          }\n          if (SAFE_FOR_TEMPLATES) {\n            value = stringReplace(value, MUSTACHE_EXPR$1, ' ');\n            value = stringReplace(value, ERB_EXPR$1, ' ');\n          }\n          var lcTag = transformCaseFunc(currentNode.nodeName);\n          if (!_isValidAttribute(lcTag, lcName, value)) {\n            _removeAttribute(name, currentNode);\n            continue;\n          }\n          if (value !== initValue) {\n            try {\n              if (namespaceURI) {\n                currentNode.setAttributeNS(namespaceURI, name, value);\n              } else {\n                currentNode.setAttribute(name, value);\n              }\n            } catch (_) {\n              _removeAttribute(name, currentNode);\n            }\n          }\n        }\n        _executeHook('afterSanitizeAttributes', currentNode, null);\n      };\n      var _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n        var shadowNode;\n        var shadowIterator = _createIterator(fragment);\n        _executeHook('beforeSanitizeShadowDOM', fragment, null);\n        while (shadowNode = shadowIterator.nextNode()) {\n          _executeHook('uponSanitizeShadowNode', shadowNode, null);\n          if (_sanitizeElements(shadowNode)) {\n            continue;\n          }\n          if (shadowNode.content instanceof DocumentFragment) {\n            _sanitizeShadowDOM(shadowNode.content);\n          }\n          _sanitizeAttributes(shadowNode);\n        }\n        _executeHook('afterSanitizeShadowDOM', fragment, null);\n      };\n      DOMPurify.sanitize = function (dirty, cfg) {\n        var body;\n        var importedNode;\n        var currentNode;\n        var oldNode;\n        var returnNode;\n        IS_EMPTY_INPUT = !dirty;\n        if (IS_EMPTY_INPUT) {\n          dirty = '<!-->';\n        }\n        if (typeof dirty !== 'string' && !_isNode(dirty)) {\n          if (typeof dirty.toString !== 'function') {\n            throw typeErrorCreate('toString is not a function');\n          } else {\n            dirty = dirty.toString();\n            if (typeof dirty !== 'string') {\n              throw typeErrorCreate('dirty is not a string, aborting');\n            }\n          }\n        }\n        if (!DOMPurify.isSupported) {\n          if (_typeof(window.toStaticHTML) === 'object' || typeof window.toStaticHTML === 'function') {\n            if (typeof dirty === 'string') {\n              return window.toStaticHTML(dirty);\n            }\n            if (_isNode(dirty)) {\n              return window.toStaticHTML(dirty.outerHTML);\n            }\n          }\n          return dirty;\n        }\n        if (!SET_CONFIG) {\n          _parseConfig(cfg);\n        }\n        DOMPurify.removed = [];\n        if (typeof dirty === 'string') {\n          IN_PLACE = false;\n        }\n        if (IN_PLACE) {\n          if (dirty.nodeName) {\n            var 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          body = _initDocument('<!---->');\n          importedNode = body.ownerDocument.importNode(dirty, true);\n          if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {\n            body = importedNode;\n          } else if (importedNode.nodeName === 'HTML') {\n            body = importedNode;\n          } else {\n            body.appendChild(importedNode);\n          }\n        } else {\n          if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && dirty.indexOf('<') === -1) {\n            return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n          }\n          body = _initDocument(dirty);\n          if (!body) {\n            return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n          }\n        }\n        if (body && FORCE_BODY) {\n          _forceRemove(body.firstChild);\n        }\n        var nodeIterator = _createIterator(IN_PLACE ? dirty : body);\n        while (currentNode = nodeIterator.nextNode()) {\n          if (currentNode.nodeType === 3 && currentNode === oldNode) {\n            continue;\n          }\n          if (_sanitizeElements(currentNode)) {\n            continue;\n          }\n          if (currentNode.content instanceof DocumentFragment) {\n            _sanitizeShadowDOM(currentNode.content);\n          }\n          _sanitizeAttributes(currentNode);\n          oldNode = currentNode;\n        }\n        oldNode = null;\n        if (IN_PLACE) {\n          return dirty;\n        }\n        if (RETURN_DOM) {\n          if (RETURN_DOM_FRAGMENT) {\n            returnNode = createDocumentFragment.call(body.ownerDocument);\n            while (body.firstChild) {\n              returnNode.appendChild(body.firstChild);\n            }\n          } else {\n            returnNode = body;\n          }\n          if (ALLOWED_ATTR.shadowroot) {\n            returnNode = importNode.call(originalDocument, returnNode, true);\n          }\n          return returnNode;\n        }\n        var serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\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        if (SAFE_FOR_TEMPLATES) {\n          serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR$1, ' ');\n          serializedHTML = stringReplace(serializedHTML, ERB_EXPR$1, ' ');\n        }\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n      };\n      DOMPurify.setConfig = function (cfg) {\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        if (!CONFIG) {\n          _parseConfig({});\n        }\n        var lcTag = transformCaseFunc(tag);\n        var 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        hooks[entryPoint] = hooks[entryPoint] || [];\n        arrayPush(hooks[entryPoint], hookFunction);\n      };\n      DOMPurify.removeHook = function (entryPoint) {\n        if (hooks[entryPoint]) {\n          return arrayPop(hooks[entryPoint]);\n        }\n      };\n      DOMPurify.removeHooks = function (entryPoint) {\n        if (hooks[entryPoint]) {\n          hooks[entryPoint] = [];\n        }\n      };\n      DOMPurify.removeAllHooks = function () {\n        hooks = {};\n      };\n      return DOMPurify;\n    }\n    var purify = createDOMPurify();\n\n    const explode$1 = Tools.explode;\n    const create$7 = () => {\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(`Cannot convert ${ url } to Blob. Resource might not exist or is inaccessible.`));\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 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      const schema = parser.schema;\n      if (settings.remove_trailing_brs) {\n        parser.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 && isTransparentAstInline(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 && blockElements[parent.name] && 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(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      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    };\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);\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      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      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      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 makeMap = Tools.makeMap, extend$1 = Tools.extend;\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    };\n    const filteredUrlAttrs = Tools.makeMap('src,href,data,background,action,formaction,poster,xlink:href');\n    const internalElementAttr = 'data-mce-type';\n    const getPurifyConfig = (settings, mimeType) => {\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 setupPurify = (settings, schema) => {\n      const purify$1 = purify();\n      const specialElements = schema.getSpecialElements();\n      const validate = settings.validate;\n      let uid = 0;\n      purify$1.addHook('uponSanitizeElement', (ele, evt) => {\n        var _a, _b, _c;\n        if (ele.nodeType === COMMENT && !settings.allow_conditional_comments && /^\\[if/i.test((_a = ele.nodeValue) !== null && _a !== void 0 ? _a : '')) {\n          ele.nodeValue = ' ' + ele.nodeValue;\n        }\n        const tagName = evt.tagName;\n        if (ele.nodeType !== ELEMENT || tagName === 'body') {\n          return;\n        }\n        const element = SugarElement.fromDom(ele);\n        const lcTagName = tagName.toLowerCase();\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$6(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$6(element);\n          } else {\n            unwrap(element);\n          }\n          return;\n        } else {\n          evt.allowedTags[tagName] = true;\n        }\n        if (validate && rule && !isInternalElement) {\n          each$e((_b = rule.attributesForced) !== null && _b !== void 0 ? _b : [], attr => {\n            set$2(element, attr.name, attr.value === '{$uid}' ? `mce_${ uid++ }` : attr.value);\n          });\n          each$e((_c = rule.attributesDefault) !== null && _c !== void 0 ? _c : [], attr => {\n            if (!has$1(element, attr.name)) {\n              set$2(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      purify$1.addHook('uponSanitizeAttribute', (ele, evt) => {\n        const tagName = ele.tagName.toLowerCase();\n        const {attrName, attrValue} = evt;\n        evt.keepAttr = !validate || schema.isValid(tagName, attrName) || startsWith(attrName, 'data-') || startsWith(attrName, 'aria-');\n        if (attrName in filteredUrlAttrs && isInvalidUri(settings, attrValue, tagName)) {\n          evt.keepAttr = false;\n        }\n        if (evt.keepAttr) {\n          evt.allowedAttributes[attrName] = true;\n          if (attrName in schema.getBoolAttrs()) {\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 (ele.hasAttribute(internalElementAttr) && (attrName === 'id' || attrName === 'class' || attrName === 'style')) {\n          evt.forceKeepAttr = true;\n        }\n      });\n      return purify$1;\n    };\n    const transferChildren = (parent, nativeParent, specialElements) => {\n      const parentName = parent.name;\n      const isSpecial = parentName in specialElements && parentName !== 'title' && parentName !== 'textarea';\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        } else if (isText$a(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        transferChildren(child, nativeChild, specialElements);\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 && !isTransparentAstInline(schema, node);\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(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(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$7();\n      const attributeFilterRegistry = create$7();\n      const defaultedSettings = {\n        validate: true,\n        root_name: 'body',\n        ...settings\n      };\n      const parser = new DOMParser();\n      const purify = setupPurify(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        purify.sanitize(body, getPurifyConfig(defaultedSettings, mimeType));\n        purify.removed = [];\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));\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());\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, matchFinder);\n            args.invalid = topLevelChildren.length > 0;\n          } else {\n            cleanInvalidNodes(invalidChildren, schema, 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) => {\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          }).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 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, c => fireGetContent(editor, {\n          ...args,\n          content: c\n        }));\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        }));\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$b(td, 'colspan');\n          remove$b(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) => {\n      const commonAnchorContainer = SugarElement.fromDom(rng.commonAncestorContainer);\n      const parents = parentsAndSelf(commonAnchorContainer, rootNode);\n      const wrapElements = filter$5(parents, isWrapElement);\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) => wrap(SugarElement.fromDom(rng.cloneContents()), getWrapElements(rootNode, rng));\n    const getParentTable = (rootElm, cell) => ancestor$2(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) => ranges.length > 0 && ranges[0].collapsed ? emptyFragment() : getFragmentFromRange(rootNode, ranges[0]);\n    const read$3 = (rootNode, ranges) => {\n      const selectedCells = getCellsFromElementOrRanges(ranges, rootNode);\n      return selectedCells.length > 0 ? getTableFragment(rootNode, selectedCells) : getSelectionFragment(rootNode, ranges);\n    };\n\n    const isCollapsibleWhitespace = (text, index) => index >= 0 && index < text.length && isWhiteSpace(text.charAt(index));\n    const getInnerText = bin => {\n      return trim$1(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$1((_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).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$a(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 => {\n      return filter$5(map$3(from(elm.childNodes), getOuterHtml), item => {\n        return item.length > 0;\n      });\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 = html => {\n      return html.indexOf('</iframe>') !== -1;\n    };\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 fragments = read$2(editor.getBody());\n      const trimmedFragments = bind$3(fragments, html => {\n        const trimmed = trimInternal(editor.serializer, html);\n        return trimmed.length > 0 ? [trimmed] : [];\n      });\n      const content = trimmedFragments.join('');\n      return hasIframes(content) ? createFragmentedLevel(trimmedFragments) : createCompleteLevel(content);\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(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$1(editor, names),\n        apply: (name, vars, node) => applyFormat$1(editor, name, vars, node),\n        remove: (name, vars, node, similar) => remove$2(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: range => create$9(editor, range),\n        removeDecoration: () => remove$3(editor, SugarElement.fromDom(editor.getBody()))\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$s = 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    const addAutocompleterDecoration = (editor, range) => getRtcInstanceWithError(editor).autocompleter.addDecoration(range);\n    const removeAutocompleterDecoration = editor => getRtcInstanceWithError(editor).autocompleter.removeDecoration();\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$6(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) => {\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, false, !start);\n        rng.setStart(innerElm, oldLength);\n      } else {\n        mergeTextNodes(innerElm, outerElm, false, !start);\n        rng.setEnd(innerElm, oldLength);\n      }\n    };\n    const normalizeTextIfRequired = (inner, start) => {\n      parent(inner).each(root => {\n        const text = inner.dom;\n        if (start && needsToBeNbspLeft(root, CaretPosition(text, 0))) {\n          normalizeWhitespaceAfter(text, 0);\n        } else if (!start && needsToBeNbspRight(root, CaretPosition(text, text.length))) {\n          normalizeWhitespaceBefore(text, text.length);\n        }\n      });\n    };\n    const mergeAndNormalizeText = (outerNode, innerNode, rng, start) => {\n      outerNode.bind(outer => {\n        const normalizer = start ? normalizeWhitespaceBefore : normalizeWhitespaceAfter;\n        normalizer(outer.dom, start ? outer.dom.length : 0);\n        return innerNode.filter(isText$b).map(inner => merge$1(outer, inner, rng, start));\n      }).orThunk(() => {\n        const innerTextNode = walkPastBookmark(innerNode, start).or(innerNode).filter(isText$b);\n        return innerTextNode.map(inner => normalizeTextIfRequired(inner, start));\n      });\n    };\n    const rngSetContent = (rng, fragment) => {\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$b).bind(removeEmpty);\n      const nextText = lastChild.bind(nextSibling).filter(isText$b).bind(removeEmpty);\n      mergeAndNormalizeText(prevText, firstChild, rng, true);\n      mergeAndNormalizeText(nextText, lastChild, rng, false);\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));\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 = real => getEnd$1(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 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        isForward,\n        setNode,\n        getNode: getNode$1,\n        getSel,\n        setRng,\n        getRng: getRng$1,\n        getStart: getStart$1,\n        getEnd,\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 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('noscript', nodes => {\n        var _a;\n        let i = nodes.length;\n        while (i--) {\n          const node = nodes[i].firstChild;\n          if (node) {\n            node.value = Entities.decode((_a = node.value) !== null && _a !== void 0 ? _a : '');\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    };\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$1(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 dom = editor && editor.dom ? editor.dom : DOMUtils.DOM;\n      const schema = editor && editor.schema ? editor.schema : Schema(settings);\n      settings.entity_encoding = settings.entity_encoding || 'named';\n      settings.remove_trailing_brs = 'remove_trailing_brs' in settings ? settings.remove_trailing_brs : true;\n      const htmlParser = DomParser(settings, schema);\n      register$3(htmlParser, settings, 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, settings, 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 removedPlugins = 'bbcode,colorpicker,contextmenu,fullpage,legacyoutput,spellchecker,textcolor'.split(',');\n    const getRemovedOptions = options => {\n      const settingNames = filter$5(removedOptions, setting => has$2(options, setting));\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 getRemovedPlugins = options => {\n      const plugins = Tools.makeMap(options.plugins, ' ');\n      const hasPlugin = plugin => has$2(plugins, plugin);\n      const pluginNames = filter$5(removedPlugins, hasPlugin);\n      return sort(pluginNames);\n    };\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 and have been removed in TinyMCE 6.0. These features will no longer work and should be removed from the TinyMCE configuration. ' + 'See https://www.tiny.cloud/docs/tinymce/6/migration-from-5x/ for more information.' + themesMessage + pluginsMessage + optionsMessage);\n      }\n    };\n    const logWarnings = (rawOptions, normalizedOptions) => {\n      logRemovedWarnings(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            getTopNotification().fold(() => editor.focus(), top => focus$1(SugarElement.fromDom(top.getEl())));\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 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 (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 filter$1 = always;\n    const bind$1 = (element, event, handler) => bind$2(element, event, filter$1, handler);\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 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(imagesToRemove, element => {\n                  editor.dom.remove(element);\n                  blobCache.removeByUri(element.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 {\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$r = 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$r(editor);\n      setup$u(editor);\n      if (!isRtc(editor)) {\n        setup$t(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        if (keyCode >= 33 && keyCode <= 36 || keyCode >= 37 && keyCode <= 40 || keyCode === 45 || e.ctrlKey) {\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        }\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 (isEmpty$2(SugarElement.fromDom(rootElm), false)) {\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$q = 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          dom.setAttrib(body, 'aria-placeholder', 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$2 = blockBoundary => isContentEditableFalse$a(blockBoundary.from.block.dom) === false && isContentEditableFalse$a(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 = (rootNode, forward, blockPosition) => {\n      if (isBr$6(blockPosition.position.getNode()) && !isEmpty$2(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 = (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(rootNode, forward, blockPos))));\n      return lift2(fromBlockPos, toBlockPos, blockBoundary).filter(blockBoundary => isDifferentBlocks(blockBoundary) && hasSameHost(rootNode, blockBoundary) && isEditable$2(blockBoundary) && hasValidBlocks(blockBoundary));\n    };\n    const read$1 = (rootNode, forward, rng) => rng.collapsed ? readFromRange(rootNode, forward, rng) : Optional.none();\n\n    const getChildrenUntilBlockBoundary = block => {\n      const children = children$1(block);\n      return findIndex$2(children, isBlock$2).fold(constant(children), index => children.slice(0, index));\n    };\n    const extractChildren = block => {\n      const children = getChildrenUntilBlockBoundary(block);\n      each$e(children, remove$6);\n      return children;\n    };\n    const removeEmptyRoot = (rootNode, block) => {\n      const parents = parentsAndSelf(block, rootNode);\n      return find$2(parents.reverse(), element => isEmpty$2(element)).each(remove$6);\n    };\n    const isEmptyBefore = el => filter$5(prevSiblings(el), el => !isEmpty$2(el)).length === 0;\n    const nestedBlockMerge = (rootNode, fromBlock, toBlock, insertionPoint) => {\n      if (isEmpty$2(toBlock)) {\n        fillWithPaddingBr(toBlock);\n        return firstPositionIn(toBlock.dom);\n      }\n      if (isEmptyBefore(insertionPoint) && isEmpty$2(fromBlock)) {\n        before$3(insertionPoint, SugarElement.fromTag('br'));\n      }\n      const position = prevPosition(toBlock.dom, CaretPosition.before(insertionPoint.dom));\n      each$e(extractChildren(fromBlock), child => {\n        before$3(insertionPoint, child);\n      });\n      removeEmptyRoot(rootNode, fromBlock);\n      return position;\n    };\n    const sidelongBlockMerge = (rootNode, fromBlock, toBlock) => {\n      if (isEmpty$2(toBlock)) {\n        remove$6(toBlock);\n        if (isEmpty$2(fromBlock)) {\n          fillWithPaddingBr(fromBlock);\n        }\n        return firstPositionIn(fromBlock.dom);\n      }\n      const position = lastPositionIn(toBlock.dom);\n      each$e(extractChildren(fromBlock), child => {\n        append$1(toBlock, child);\n      });\n      removeEmptyRoot(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$6);\n    };\n    const mergeBlockInto = (rootNode, fromBlock, toBlock) => {\n      trimBr(true, fromBlock);\n      trimBr(false, toBlock);\n      return getInsertionPoint(fromBlock, toBlock).fold(curry(sidelongBlockMerge, rootNode, fromBlock, toBlock), curry(nestedBlockMerge, rootNode, fromBlock, toBlock));\n    };\n    const mergeBlocks = (rootNode, forward, block1, block2) => forward ? mergeBlockInto(rootNode, block2, block1) : mergeBlockInto(rootNode, block1, block2);\n\n    const backspaceDelete$8 = (editor, forward) => {\n      const rootNode = SugarElement.fromDom(editor.getBody());\n      const position = read$1(rootNode.dom, forward, editor.selection.getRng()).map(blockBoundary => () => {\n        mergeBlocks(rootNode, forward, blockBoundary.from.block, blockBoundary.to.block).each(pos => {\n          editor.selection.setRng(pos.toRange());\n        });\n      });\n      return position;\n    };\n\n    const deleteRangeMergeBlocks = (rootNode, selection) => {\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).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$3(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$1 = 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);\n    };\n    const backspaceDelete$7 = (editor, _forward) => editor.selection.isCollapsed() ? Optional.none() : deleteRange$1(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$a(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$a(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$6 = (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) => {\n      const inSameBlock = elm => isInline$1(SugarElement.fromDom(elm)) && !isInSameBlock(from, to, root);\n      return getRelativeCefElm(!forward, from).fold(() => getRelativeCefElm(forward, to).fold(never, inSameBlock), inSameBlock);\n    };\n    const deleteEmptyBlockOrMoveToCef = (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(blockElm) ? DeleteAction.remove(blockElm.dom) : DeleteAction.moveToElement(toCefElm)).orThunk(() => Optional.some(DeleteAction.moveToElement(toCefElm)));\n    };\n    const findCefPosition = (root, forward, from) => fromPosition(forward, root, from).bind(to => {\n      if (isCompoundElement(to.getNode())) {\n        return Optional.none();\n      } else if (isDeleteFromCefDifferentBlocks(root, forward, from, to)) {\n        return Optional.none();\n      } else if (forward && isContentEditableFalse$a(to.getNode())) {\n        return deleteEmptyBlockOrMoveToCef(root, forward, from, to);\n      } else if (!forward && isContentEditableFalse$a(to.getNode(true))) {\n        return deleteEmptyBlockOrMoveToCef(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$a(elm.nextSibling)) {\n        return Optional.some(DeleteAction.moveToElement(elm.nextSibling));\n      } else if (!forward && isContentEditableFalse$a(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) => {\n      if (isAtContentEditableBlockCaret(forward, from)) {\n        return getContentEditableBlockAction(forward, from.getNode(!forward)).orThunk(() => findCefPosition(root, forward, from));\n      } else {\n        return findCefPosition(root, forward, from).bind(deleteAction => skipMoveToActionFromInlineCefToContent(root, from, deleteAction));\n      }\n    };\n    const read = (root, forward, rng) => {\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)) {\n        return findPreviousBr(rootElement, from).map(br => DeleteAction.remove(br.getNode()));\n      } else if (forward && isAfterContentEditableFalse(from) && isBeforeBr$1(rootElement, from)) {\n        return findNextBr(rootElement, from).map(br => DeleteAction.remove(br.getNode()));\n      } else {\n        return getContentEditableAction(root, forward, from);\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$a).fold(() => read(editor.getBody(), forward, editor.selection.getRng()).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$6);\n    };\n    const backspaceDeleteRange = (editor, forward) => {\n      const selectedNode = editor.selection.getNode();\n      if (isContentEditableFalse$a(selectedNode) && !isTableCell$3(selectedNode)) {\n        const hasCefAncestor = getAncestorCe(editor, selectedNode.parentNode).filter(isContentEditableFalse$a);\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$5 = (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$4 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret$2(editor, forward) : Optional.none();\n\n    const isText$2 = isText$a;\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 = 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 = 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(node) : insertAfter(node);\n    const insertInlineBefore = curry(insertInline, true);\n    const insertInlineAfter = curry(insertInline, false);\n\n    const insertInlinePos = (pos, before) => {\n      if (isText$a(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$4(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$4(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$4(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$4(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$4 = isContentEditableFalse$a;\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$4(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$a(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$2(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$2(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$2(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$2(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$2(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$2(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$3(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$2 = (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$3 = (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 getParentInlines = (rootElm, startElm) => {\n      const parents = parentsAndSelf(startElm, rootElm);\n      return findIndex$2(parents, isBlock$2).fold(constant(parents), index => parents.slice(0, index));\n    };\n    const hasOnlyOneChild = elm => childNodesCount(elm) === 1;\n    const deleteLastPosition = (forward, editor, target, parentInlines) => {\n      const isFormatElement$1 = curry(isFormatElement, editor);\n      const formatNodes = map$3(filter$5(parentInlines, isFormatElement$1), elm => elm.dom);\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 rootElm = SugarElement.fromDom(editor.getBody());\n      const startElm = SugarElement.fromDom(editor.selection.getStart());\n      const parentInlines = filter$5(getParentInlines(rootElm, startElm), hasOnlyOneChild);\n      return last$3(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 backspaceDelete$2 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret$1(editor, forward) : Optional.none();\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$1 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret(editor, forward) : deleteRange(editor, forward);\n\n    const isEditable$1 = target => closest$4(target, elm => isContentEditableTrue$3(elm.dom) || isContentEditableFalse$a(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$1(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$1(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 = 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)) {\n          return Optional.some(() => outdent(editor));\n        }\n      }\n      return Optional.none();\n    };\n\n    const findAction = (editor, caret, forward) => findMap([\n      backspaceDelete,\n      backspaceDelete$5,\n      backspaceDelete$6,\n      (editor, forward) => backspaceDelete$3(editor, caret, forward),\n      backspaceDelete$8,\n      backspaceDelete$9,\n      backspaceDelete$4,\n      backspaceDelete$1,\n      backspaceDelete$7,\n      backspaceDelete$2\n    ], item => item(editor, forward));\n    const deleteCommand = (editor, caret) => {\n      const result = findAction(editor, caret, false);\n      result.fold(() => {\n        execNativeDeleteCommand(editor);\n        paddEmptyBody(editor);\n      }, call);\n    };\n    const forwardDeleteCommand = (editor, caret) => {\n      const result = findAction(editor, caret, true);\n      result.fold(() => execNativeForwardDeleteCommand(editor), call);\n    };\n    const setup$p = (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$o = editor => {\n      const startData = value$2();\n      const longpressFired = Cell(false);\n      const debounceLongpress = last$1(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$a(node)) {\n        return true;\n      } else if (isElement$6(node)) {\n        return !isBlockElement(schema.getBlockElements(), node) && !isBookmarkNode$1(node) && !isTransparentBlock(schema, 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$a(node)) {\n        if (node.data.length === 0) {\n          return true;\n        } else if (/^\\s+$/.test(node.data) && (!node.nextSibling || isBlockElement(blockElements, node.nextSibling))) {\n          return true;\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$n = 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 setup$m = 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          if (nonEditableRegExps.length > 0 && node.attr('data-mce-content')) {\n            node.name = '#text';\n            node.type = 3;\n            node.raw = true;\n            node.value = node.attr('data-mce-content');\n          } else {\n            node.attr(contentEditableAttrName, null);\n          }\n        }\n      });\n    };\n\n    const findBlockCaretContainer = editor => descendant(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$l = editor => {\n      editor.on('keyup compositionstart', curry(handleBlockContainer, editor));\n    };\n\n    const isContentEditableFalse$3 = isContentEditableFalse$a;\n    const moveToCeFalseHorizontally = (direction, editor, range) => moveHorizontally(editor, direction, range, isBeforeContentEditableFalse, isAfterContentEditableFalse, isContentEditableFalse$3);\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$3);\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 moveH$2 = (editor, forward) => getHorizontalRange(editor, forward).exists(newRange => {\n      moveToRange(editor, newRange);\n      return true;\n    });\n    const moveV$3 = (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) => {\n      const isRoot = curry(eq, root);\n      return closest$4(SugarElement.fromDom(pos.container()), isBlock$2, 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).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$2 = (editor, forward) => {\n      if (editor.selection.isCollapsed()) {\n        return moveCaretToNewEmptyLine(editor, forward);\n      } else {\n        return false;\n      }\n    };\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$2(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 closest = target => closest$3(target, '[contenteditable]');\n    const isEditable = (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 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$3(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));\n    const tabBackward = (editor, isRoot, cell) => tabGo(editor, isRoot, prev(cell, isEditable));\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$3, editor, false)\n        },\n        {\n          keyCode: VK.DOWN,\n          action: action(moveV$3, 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.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$2, editor, caret, true)\n        },\n        {\n          keyCode: VK.LEFT,\n          action: action(move$2, 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$2, editor, false)\n        },\n        {\n          keyCode: VK.DOWN,\n          action: action(moveV$2, editor, true)\n        }\n      ], evt).each(_ => {\n        evt.preventDefault();\n      });\n    };\n    const setup$k = (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$a(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$a(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$a(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$a(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$a(rng.startContainer);\n    const getText = rng => trim$1(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) => {\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 (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 findStart = (dom, initRange, trigger, minChars = 0) => {\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).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 || stripTrigger(text, trigger).length < minChars) {\n          return Optional.none();\n        } else {\n          return Optional.some({\n            text: stripTrigger(text, trigger),\n            range,\n            trigger\n          });\n        }\n      });\n    };\n    const getContext = (dom, initRange, trigger, minChars = 0) => detect$1(SugarElement.fromDom(initRange.startContainer)).fold(() => findStart(dom, initRange, trigger, minChars), elm => {\n      const range = dom.createRng();\n      range.selectNode(elm.dom);\n      const text = getText(range);\n      return Optional.some({\n        range,\n        text: stripTrigger(text, trigger),\n        trigger\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 = (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,\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, {\n      trigger: spec.ch,\n      ...spec\n    });\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$1(api.load, 50);\n      editor.on('keypress compositionend', e => {\n        if (e.which === 27) {\n          return;\n        }\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        }\n      });\n      editor.on('remove', update.cancel);\n    };\n    const setup$j = editor => {\n      const activeAutocompleter = value$2();\n      const uiActive = Cell(false);\n      const isActive = activeAutocompleter.isSet;\n      const cancelIfNecessary = () => {\n        if (isActive()) {\n          removeAutocompleterDecoration(editor);\n          fireAutocompleterEnd(editor);\n          uiActive.set(false);\n          activeAutocompleter.clear();\n        }\n      };\n      const commenceIfNecessary = context => {\n        if (!isActive()) {\n          addAutocompleterDecoration(editor, context.range);\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).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                    fireAutocompleterUpdate(editor, { lookupData });\n                  } else {\n                    uiActive.set(true);\n                    fireAutocompleterStart(editor, { lookupData });\n                  }\n                }\n              }\n            });\n          });\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      setupEditorInput(editor, {\n        cancelIfNecessary,\n        load\n      });\n    };\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 fireFakeInputEvent = createAndFireInputEvent('input');\n    const fireFakeBeforeInputEvent = createAndFireInputEvent('beforeinput');\n\n    const executeKeydownOverride$3 = (editor, caret, evt) => {\n      const inputType = evt.keyCode === VK.BACKSPACE ? 'deleteContentBackward' : 'deleteContentForward';\n      executeWithDelayedAction([\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(backspaceDelete, editor)\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$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$3, editor, caret, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete$3, editor, caret, 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$4, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete$4, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(backspaceDelete$1, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete$1, 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$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$2, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(backspaceDelete$2, editor, true)\n        }\n      ], evt).each(applyAction => {\n        evt.preventDefault();\n        const beforeInput = fireFakeBeforeInputEvent(editor, inputType);\n        if (!beforeInput.isDefaultPrevented()) {\n          applyAction();\n          fireFakeInputEvent(editor, inputType);\n        }\n      });\n    };\n    const executeKeyupOverride = (editor, evt) => {\n      execute([\n        {\n          keyCode: VK.BACKSPACE,\n          action: action(paddEmptyElement, editor)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: action(paddEmptyElement, editor)\n        }\n      ], evt);\n    };\n    const setup$i = (editor, caret) => {\n      editor.on('keydown', evt => {\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);\n        }\n      });\n    };\n\n    const firstNonWhiteSpaceNodeSibling = node => {\n      while (node) {\n        if (isElement$6(node) || isText$a(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$a(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        }\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\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 insert$3 = (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      let newBlock = 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          newBlock = fragment.firstChild;\n          dom.insertAfter(fragment, containerBlock);\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$b), text => {\n        const rawNode = text.dom;\n        rawNode.nodeValue = trim$1(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 emptyBlock = elm => {\n      elm.innerHTML = '<br data-mce-bogus=\"1\">';\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.getContentEditable(node) !== 'true';\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$a(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$a(currentNode)) {\n          currentNode.data = currentNode.data.replace(/^[\\r\\n]+/, '');\n        }\n        currentNode = currentNode.firstChild;\n      } while (currentNode);\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 wrapSelfAndSiblingsInDefaultBlock = (editor, newBlockName, rng, container, offset) => {\n      var _a;\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        let rootBlockName;\n        if (parentBlock === editor.getBody() || isTableCellOrCaption(parentBlock)) {\n          rootBlockName = parentBlock.nodeName.toLowerCase();\n        } else if (parentBlock.parentNode) {\n          rootBlockName = parentBlock.parentNode.nodeName.toLowerCase();\n        } else {\n          rootBlockName = '';\n        }\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        if (startNode && editor.schema.isValidChild(rootBlockName, 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$2 = (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 createNewBlock = name => {\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);\n        } else {\n          block = parentBlock.cloneNode(false);\n        }\n        let caretNode = block;\n        if (shouldKeepStyles(editor) === false) {\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      const isCaretAtStartOrEndOfBlock = start => {\n        const normalizedOffset = normalizeZwspOffset(start, container, offset);\n        if (isText$a(container) && (start ? normalizedOffset > 0 : normalizedOffset < container.data.length)) {\n          return false;\n        }\n        if (container.parentNode === 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$a(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$a(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(newBlockName);\n        } else {\n          block = createNewBlock();\n        }\n        if (shouldEndContainer(editor, containerBlock) && canSplitBlock(dom, containerBlock) && dom.isEmpty(parentBlock)) {\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()) {\n        isAfterLastNodeInContainer = offset > container.childNodes.length - 1;\n        container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;\n        if (isAfterLastNodeInContainer && isText$a(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 (/^(LI|DT|DD)$/.test(parentBlockName) && isElement$6(containerBlock)) {\n        if (dom.isEmpty(parentBlock)) {\n          insert$3(editor, createNewBlock, containerBlock, parentBlock, newBlockName);\n          return;\n        }\n      }\n      if (parentBlock === editor.getBody()) {\n        return;\n      }\n      const parentBlockParent = parentBlock.parentNode;\n      let newBlock;\n      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(), parentBlock);\n        moveToCaretPosition(editor, containerAndSiblingName(parentBlock, 'HR') ? 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$2,\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$a(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$a(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$a(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$1 = (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$1,\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 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      ], [\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 = fireFakeBeforeInputEvent(editor, breakType.fakeEventName);\n        if (event.isDefaultPrevented()) {\n          return;\n        }\n      }\n      breakType.insert(editor, evt);\n      if (isNonNullable(evt)) {\n        fireFakeInputEvent(editor, breakType.fakeEventName);\n      }\n    };\n    const insert = (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 handleEnterKeyEvent = (editor, event) => {\n      if (event.isDefaultPrevented()) {\n        return;\n      }\n      event.preventDefault();\n      endTypingLevelIgnoreLocks(editor.undoManager);\n      editor.undoManager.transact(() => {\n        insert(editor, event);\n      });\n    };\n    const setup$h = editor => {\n      editor.on('keydown', event => {\n        if (event.keyCode === VK.ENTER) {\n          handleEnterKeyEvent(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$g = (editor, caret) => {\n      editor.on('keydown', evt => {\n        if (!evt.isDefaultPrevented()) {\n          executeKeydownOverride$2(editor, caret, evt);\n        }\n      });\n    };\n\n    const setup$f = editor => {\n      editor.on('input', e => {\n        if (!e.isComposing) {\n          normalizeNbspsInEditor(editor);\n        }\n      });\n    };\n\n    const platform = detect$2();\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$e = (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 insertTextAtPosition = (text, pos) => {\n      const container = pos.container();\n      const offset = pos.offset();\n      if (isText$a(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 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) => checkPos => needsToHaveNbsp(root, checkPos) ? insertNbspAtPosition(pos) : insertSpaceAtPosition(pos);\n    const setSelection = editor => pos => {\n      editor.selection.setRng(pos.toRange());\n      editor.nodeChanged();\n      return true;\n    };\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)(checkPos).each(setSelection(editor)));\n      } else {\n        return Optional.none();\n      }\n    };\n\n    const executeKeydownOverride$1 = (editor, evt) => {\n      executeWithDelayedAction([{\n          keyCode: VK.SPACEBAR,\n          action: action(insertSpaceOrNbspAtSelection, editor)\n        }], evt).each(applyAction => {\n        evt.preventDefault();\n        const event = fireFakeBeforeInputEvent(editor, 'insertText', { data: ' ' });\n        if (!event.isDefaultPrevented()) {\n          applyAction();\n          fireFakeInputEvent(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$j(editor);\n      if (isRtc(editor)) {\n        return Cell(null);\n      } else {\n        const caret = setupSelectedState(editor);\n        setup$l(editor);\n        setup$k(editor, caret);\n        setup$i(editor, caret);\n        setup$h(editor);\n        setup$d(editor);\n        setup$f(editor);\n        setup$c(editor);\n        setup$g(editor, caret);\n        setup$e(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          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 internalMimeType = 'x-tinymce/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 = (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(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(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({}, 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 doPaste = (editor, content, internal, pasteAsText) => {\n      const args = process(editor, content, internal);\n      if (!args.cancelled) {\n        insertContent(editor, args.content, pasteAsText);\n      }\n    };\n    const pasteHtml = (editor, html, internalFlag) => {\n      const internal = internalFlag ? internalFlag : isMarked(html);\n      doPaste(editor, unmark(html), internal, false);\n    };\n    const pasteText = (editor, text) => {\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);\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);\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) => {\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);\n      } else {\n        pasteHtml(editor, content, isInternal);\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);\n        } else {\n          pasteBin.create();\n          Delay.setEditorTimeout(editor, () => {\n            const html = pasteBin.getHtml();\n            pasteBin.remove();\n            insertClipboardContent(editor, clipboardContent, html, plainTextMode);\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);\n        }\n        if (value.text) {\n          pasteText(editor, value.text);\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)) {\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 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() || draggingInternallyState.get()) {\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        if (content) {\n          e.preventDefault();\n          Delay.setEditorTimeout(editor, () => {\n            editor.undoManager.transact(() => {\n              if (internalContent) {\n                editor.execCommand('Delete');\n              }\n              setFocusedRange(editor, rng);\n              const trimmedContent = trimHtml(content);\n              if (dropContent['text/html']) {\n                pasteHtml(editor, trimmedContent, internal);\n              } else {\n                pasteText(editor, trimmedContent);\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    };\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        each$e(elms, details => {\n          details.attr('data-mce-open', details.attr('open'));\n          details.attr('open', 'open');\n        });\n      });\n      editor.serializer.addNodeFilter('details', elms => {\n        each$e(elms, details => {\n          const open = details.attr('data-mce-open');\n          details.attr('open', isString(open) ? open : null);\n          details.attr('data-mce-open', null);\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$a;\n    const isContentEditableFalse$2 = elm => isContentEditableFalse$a(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) => closest$4(SugarElement.fromDom(node), elm => isContentEditableTrue(elm) || isBlock$2(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) => {\n      const startPos = CaretPosition.fromRangeStart(startRng);\n      const clickNode = startPos.getNode();\n      const scope = getClosestScope(clickNode, rootNode);\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());\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) => {\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);\n        } else {\n          return Optional.none();\n        }\n      };\n      const getClosestTextNode = (rects, distance) => {\n        if (rects.length >= 2) {\n          const r1 = caretCandidateRect(rects[0]).getOr(rects[0]);\n          const r2 = caretCandidateRect(rects[1]).getOr(rects[1]);\n          const deltaDistance = Math.abs(distance(r1, clientX, clientY) - distance(r2, clientX, clientY));\n          if (deltaDistance < 2) {\n            if (isText$a(r1.node)) {\n              return Optional.some(r1);\n            } else if (isText$a(r2.node)) {\n              return Optional.some(r2);\n            }\n          }\n        }\n        return Optional.none();\n      };\n      const findClosestCaretCandidateNodeRect = (rects, distance) => {\n        const sortedRects = sort(rects, (r1, r2) => distance(r1, clientX, clientY) - distance(r2, clientX, clientY));\n        return getClosestTextNode(sortedRects, distance).orThunk(() => findMap(sortedRects, caretCandidateRect));\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), prevScope => {\n          const uncheckedChildren = filter$5(childNodesWithoutGhost, node => node !== prevScope.dom);\n          return closestChildCaretCandidateNodeRect(uncheckedChildren, clientX, clientY);\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 scrollPixelsPerInterval = 32;\n    const scrollIntervalValue = 100;\n    const mouseRangeToTriggerScrollInsideEditor = 8;\n    const mouseRangeToTriggerScrollOutsideEditor = 16;\n    const isContentEditableFalse$1 = isContentEditableFalse$a;\n    const isContentEditable = or(isContentEditableFalse$1, isContentEditableTrue$3);\n    const isDraggable = (rootElm, elm) => isContentEditableFalse$1(elm) && elm !== rootElm;\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 !isContentEditableFalse$1(targetElement);\n      }\n    };\n    const cloneElement = elm => {\n      const cloneElm = elm.cloneNode(true);\n      cloneElm.removeAttribute('data-mce-selected');\n      return cloneElm;\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 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.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            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 move = (state, editor) => {\n      const throttledPlaceCaretAt = first$1((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      }, 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 = editor.dispatch('dragstart', { target: state.element });\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$a(startContainer) ? startContainer.parentNode : startContainer;\n      } else {\n        return null;\n      }\n    };\n    const drop = (state, editor) => e => {\n      state.on(state => {\n        state.intervalId.clear();\n        if (state.dragging) {\n          if (isValidDropTarget(editor, getRawTarget(editor.selection), state.element)) {\n            const targetClone = cloneElement(state.element);\n            const args = editor.dispatch('drop', {\n              clientX: e.clientX,\n              clientY: e.clientY\n            });\n            if (!args.isDefaultPrevented()) {\n              editor.undoManager.transact(() => {\n                removeElement(state.element);\n                editor.insertContent(editor.dom.getOuterHTML(targetClone));\n                editor._selectionOverrides.hideFakeCaret();\n              });\n            }\n          }\n          editor.dispatch('dragend');\n        }\n      });\n      removeDragState(state);\n    };\n    const stop = (state, editor) => () => {\n      state.on(state => {\n        state.intervalId.clear();\n        if (state.dragging) {\n          editor.dispatch('dragend');\n        }\n      });\n      removeDragState(state);\n    };\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          dragEndHandler();\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$a(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$a;\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);\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          const contentEditableRoot = getContentEditableRoot(editor, e.target);\n          if (contentEditableRoot) {\n            if (isContentEditableFalse(contentEditableRoot)) {\n              e.preventDefault();\n              editor.focus();\n            }\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 (isElement$6(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(body, '#' + realSelectionId).getOrThunk(() => {\n          const newContainer = SugarElement.fromHtml('<div data-mce-bogus=\"all\" class=\"mce-offscreen-selection\"></div>', doc);\n          set$2(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$b(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$a(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$a(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$a(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(SugarElement.fromDom(editor.getBody()), '#' + realSelectionId).each(remove$6);\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$a(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$a(node) && (offset < 0 || offset > node.data.length)) {\n        return [];\n      }\n      const p = normalized && isText$a(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$a(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);\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$a(rng.startContainer) && rng.startContainer.data.length === 0) {\n          dom.remove(rng.startContainer);\n        }\n        if (isText$a(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 stripPattern = (dom, block, pattern) => {\n      const firstTextNode = textAfter(block, 0, block);\n      firstTextNode.each(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      });\n    };\n    const applyPattern$1 = (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$1 = patterns => sort(patterns, (a, b) => b.start.length - a.start.length);\n    const findPattern$1 = (patterns, text) => {\n      const sortedPatterns = sortPatterns$1(patterns);\n      const nuText = text.replace(nbsp, ' ');\n      return find$2(sortedPatterns, pattern => text.indexOf(pattern.start) === 0 || nuText.indexOf(pattern.start) === 0);\n    };\n    const findPatterns$1 = (editor, block, patternSet, normalizedMatches) => {\n      var _a;\n      const dom = editor.dom;\n      const forcedRootBlock = getForcedRootBlock(editor);\n      if (!dom.is(block, forcedRootBlock)) {\n        return [];\n      }\n      const blockText = (_a = block.textContent) !== null && _a !== void 0 ? _a : '';\n      return findPattern$1(patternSet.blockPatterns, blockText).map(pattern => {\n        if (Tools.trim(blockText).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    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 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 = (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(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 = (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(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(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 = 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 = (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(patternSet.inlinePatterns), node, offset, block, normalizedMatches).fold(() => [], result => result.matches);\n      return getBestMatches(matches, matchesWithSortedPatterns);\n    };\n    const applyMatches = (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 handleEnter = (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(editor, block, rng.startContainer, offset, dynamicPatternSet, true);\n        const blockMatches = findPatterns$1(editor, block, dynamicPatternSet, true);\n        if (blockMatches.length > 0 || inlineMatches.length > 0) {\n          editor.undoManager.add();\n          editor.undoManager.extra(() => {\n            editor.execCommand('mceInsertNewLine');\n          }, () => {\n            editor.insertContent(zeroWidth);\n            applyMatches(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        return false;\n      }).getOr(false);\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(editor, block, rng.startContainer, offset, dynamicPatternSet, false);\n        if (inlineMatches.length > 0) {\n          editor.undoManager.transact(() => {\n            applyMatches(editor, inlineMatches);\n          });\n        }\n      });\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 = getPatternSet();\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      const handleInlineTrigger = () => {\n        if (editor.selection.isCollapsed()) {\n          const patternSet = getPatternSet();\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)) {\n            const isCollapsed = editor.selection.isCollapsed();\n            const body = editor.getBody();\n            if (isCollapsed && !dom.isEmpty(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.getContentEditableParent(target) !== 'false') {\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) {\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$2(style, 'type', 'text/css');\n      append$1(style, SugarElement.fromText(text));\n      append$1(container, style);\n      editor.on('remove', () => {\n        remove$6(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_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        remove_trailing_brs: getOption('remove_trailing_brs'),\n        inline_styles: getOption('inline_styles'),\n        root_name: getRootName(editor),\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          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 promises = [getStyleSheetLoader$1(editor).loadAll(css)];\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 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      if (!editor.readonly) {\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      });\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$o(editor);\n      setup$6(editor);\n      setup$m(editor);\n      if (!isRtc(editor)) {\n        setup$5(editor);\n        setup$1(editor);\n      }\n      const caret = setup$b(editor);\n      setup$p(editor, caret);\n      setup$n(editor);\n      setup$q(editor);\n      setup$7(editor);\n      const setupRtcThunk = setup$s(editor);\n      preInit(editor);\n      setupRtcThunk.fold(() => {\n        loadContentCss(editor).then(() => initEditorWithInitialContent(editor));\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    const initContentBody = (editor, skipWrite) => {\n      if (!editor.inline) {\n        editor.getElement().style.visibility = editor.orgVisibility;\n      }\n      if (!skipWrite && !editor.inline) {\n        const iframe = editor.iframeElement;\n        const binder = bind$1(SugarElement.fromDom(iframe), 'load', () => {\n          binder.unbind();\n          editor.contentDocument = iframe.contentDocument;\n          contentBodyLoaded(editor);\n        });\n        if (Env.browser.isFirefox()) {\n          const doc = editor.getDoc();\n          doc.open();\n          doc.write(editor.iframeHTML);\n          doc.close();\n        } else {\n          iframe.srcdoc = editor.iframeHTML;\n        }\n      } else {\n        contentBodyLoaded(editor);\n      }\n    };\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$2(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 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      initContentBody(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 = editor => {\n      editor.dispatch('ScriptsLoaded');\n      initIcons(editor);\n      initTheme(editor);\n      initModel(editor);\n      initPlugins(editor);\n      const renderInfo = renderThemeUi(editor);\n      augmentEditorUiApi(editor, Optional.from(renderInfo.api).getOr({}));\n      editor.editorContainer = renderInfo.editorContainer;\n      appendContentCssFromSettings(editor);\n      if (editor.inline) {\n        initContentBody(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$b(element, attr.name));\n        setAll$1(element, snapshot);\n      });\n      editor.ui.styleSheetLoader = getStyleSheetLoader(element, editor);\n      if (!isInline(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 sectionResult = (sections, settings) => ({\n      sections: constant(sections),\n      options: constant(settings)\n    });\n    const deviceDetection = detect$2().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$3);\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$3 = 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$1 = 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$3(editor);\n      registerQueryStateCommands$1(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) => {\n      const root = SugarElement.fromDom(dom.getRoot());\n      if (needsToBeNbspLeft(root, CaretPosition.fromRangeStart(rng))) {\n        html = html.replace(/^ /, '&nbsp;');\n      } else {\n        html = html.replace(/^&nbsp;/, ' ');\n      }\n      if (needsToBeNbspRight(root, CaretPosition.fromRangeEnd(rng))) {\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);\n      } else {\n        return value;\n      }\n    };\n    const insertAtCaret = (editor, value) => {\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    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('');\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$1(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$2(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$a(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$2(elm, elm => getRaw$1(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$2 = 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$2(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.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        mceInsertLink: applyLinkToSelection,\n        createLink: applyLinkToSelection\n      });\n    };\n\n    const registerExecCommands$1 = editor => {\n      editor.editorCommands.addCommands({\n        'InsertUnorderedList,InsertOrderedList': command => {\n          editor.getDoc().execCommand(command);\n          const listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul');\n          if (listElm) {\n            const listParent = listElm.parentNode;\n            if (listParent && /^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) {\n              const bm = editor.selection.getBookmark();\n              editor.dom.split(listParent, listElm);\n              editor.selection.moveToBookmark(bm);\n            }\n          }\n        }\n      });\n    };\n    const registerQueryStateCommands = editor => {\n      editor.editorCommands.addCommands({\n        'InsertUnorderedList,InsertOrderedList': command => {\n          const list = editor.dom.getParent(editor.selection.getNode(), 'ul,ol');\n          return list && (command === 'insertunorderedlist' && list.tagName === 'UL' || command === 'insertorderedlist' && list.tagName === 'OL');\n        }\n      }, 'state');\n    };\n    const registerCommands$3 = editor => {\n      registerExecCommands$1(editor);\n      registerQueryStateCommands(editor);\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(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$2(editor);\n      registerCommands$3(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$8(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$2(elm, internalContentEditableAttr, 'true');\n        setContentEditable(elm, false);\n      });\n    };\n    const switchOnContentEditableTrue = elm => {\n      each$e(descendants(elm, `*[${ internalContentEditableAttr }=\"true\"]`), elm => {\n        remove$b(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        setContentEditable(body, true);\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      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      static isNative(name) {\n        return !!nativeEvents[name.toLowerCase()];\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.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(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        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      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: '6',\n      minorVersion: '3.1',\n      releaseDate: '2022-12-06',\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.tinymce || window.tinyMCEPreInit;\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 (/tinymce(\\.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$v(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('TinyMCE does not support the browser you are using. For a list of supported' + ' browsers please see: https://www.tiny.cloud/docs/tinymce/6/support/#supportedwebbrowsers');\n            return [];\n          } else if (isQuirksMode) {\n            initError('Failed to initialize the editor as the document is not in standards mode. ' + 'TinyMCE 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 load = (id, url) => {\n        const loadErrMsg = `Script at URL \"${ url }\" failed to load`;\n        const runErrMsg = `Script at URL \"${ url }\" did not call \\`tinymce.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      };\n      const unload = id => {\n        delete tasks[id];\n      };\n      return {\n        load,\n        add,\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 tinymce = Tools.extend(EditorManager, publicApi);\n\n    const exportToModuleLoaders = tinymce => {\n      if (typeof module === 'object') {\n        try {\n          module.exports = tinymce;\n        } catch (_) {\n        }\n      }\n    };\n    const exportToWindowGlobal = tinymce => {\n      window.tinymce = tinymce;\n      window.tinyMCE = tinymce;\n    };\n    exportToWindowGlobal(tinymce);\n    exportToModuleLoaders(tinymce);\n\n})();\n"],"sourceRoot":""}