diff --git a/composer.lock b/composer.lock
index fdef57dabe..f61110aceb 100644
--- a/composer.lock
+++ b/composer.lock
@@ -534,7 +534,7 @@
             "dist": {
                 "type": "path",
                 "url": "core",
-                "reference": "107b1d4f65408eb2844facd227005517de15343b"
+                "reference": "1878827866afdec864cb4652a3d8b813d970f710"
             },
             "require": {
                 "asm89/stack-cors": "^1.1",
@@ -597,6 +597,7 @@
                 "drupal/book": "self.version",
                 "drupal/breakpoint": "self.version",
                 "drupal/ckeditor": "self.version",
+                "drupal/ckeditor5": "self.version",
                 "drupal/claro": "self.version",
                 "drupal/classy": "self.version",
                 "drupal/color": "self.version",
diff --git a/core/.eslintignore b/core/.eslintignore
index 0cf12c6e25..d06be16821 100644
--- a/core/.eslintignore
+++ b/core/.eslintignore
@@ -3,6 +3,7 @@ node_modules/**/*
 **/js_test_files/**/*
 *.js
 !*.es6.js
+modules/ckeditor5/modules/ckeditor5_dev/js/ckeditor5_dev.es6.js
 modules/locale/tests/locale_test.es6.js
 !tests/Drupal/Nightwatch/**/*.js
 misc/polyfills/array.find.es6.js
@@ -14,3 +15,6 @@ modules/system/tests/fixtures/HtaccessTest/access_test.yml
 modules/system/tests/themes/test_theme_libraries_empty/test_theme_libraries_empty.info.yml
 tests/Drupal/Tests/Core/Asset/library_test_files/empty.libraries.yml
 tests/Drupal/Tests/Core/Asset/library_test_files/invalid_file.libraries.yml
+
+# TODO: get rid of this!
+modules/ckeditor5/js/ckeditor5.admin.es6.js
diff --git a/core/assets/vendor/ckeditor5/build/alignment.js b/core/assets/vendor/ckeditor5/build/alignment.js
new file mode 100644
index 0000000000..9c07cac3f4
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/alignment.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Align center","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":"Text alignment toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.alignment=function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=4)}([function(t,e,n){t.exports=n(3)("./src/core.js")},function(t,e,n){t.exports=n(3)("./src/utils.js")},function(t,e,n){t.exports=n(3)("./src/ui.js")},function(t,e){t.exports=CKEditor5.dll},function(t,e,n){"use strict";n.r(e),n.d(e,"Alignment",(function(){return f})),n.d(e,"AlignmentEditing",(function(){return u})),n.d(e,"AlignmentUI",(function(){return m}));var i=n(0),o=n(1);const r=["left","right","center","justify"];function a(t){return r.includes(t)}function l(t,e){return"rtl"==e.contentLanguageDirection?"right"===t:"left"===t}function s(t){const e=t.map(t=>{let e;return e="string"==typeof t?{name:t}:t,e}).filter(t=>{const e=!!r.includes(t.name);return e||Object(o.logWarning)("alignment-config-name-not-recognized",{option:t}),e}),n=e.filter(t=>!!t.className).length;if(n&&n<e.length)throw new o.CKEditorError("alignment-config-classnames-are-missing",{configuredOptions:t});return e.forEach((e,n,i)=>{const r=i.slice(n+1);if(r.some(t=>t.name==e.name))throw new o.CKEditorError("alignment-config-name-already-defined",{option:e,configuredOptions:t});if(e.className){if(r.some(t=>t.className==e.className))throw new o.CKEditorError("alignment-config-classname-already-defined",{option:e,configuredOptions:t})}}),e}class c extends i.Command{refresh(){const t=this.editor.locale,e=Object(o.first)(this.editor.model.document.selection.getSelectedBlocks());this.isEnabled=!!e&&this._canBeAligned(e),this.isEnabled&&e.hasAttribute("alignment")?this.value=e.getAttribute("alignment"):this.value="rtl"===t.contentLanguageDirection?"right":"left"}execute(t={}){const e=this.editor,n=e.locale,i=e.model,o=i.document,r=t.value;i.change(t=>{const e=Array.from(o.selection.getSelectedBlocks()).filter(t=>this._canBeAligned(t)),i=e[0].getAttribute("alignment");l(r,n)||i===r||!r?function(t,e){for(const n of t)e.removeAttribute("alignment",n)}(e,t):function(t,e,n){for(const i of t)e.setAttribute("alignment",n,i)}(e,t,r)})}_canBeAligned(t){return this.editor.model.schema.checkAttribute(t,"alignment")}}class u extends i.Plugin{static get pluginName(){return"AlignmentEditing"}constructor(t){super(t),t.config.define("alignment",{options:[...r.map(t=>({name:t}))]})}init(){const t=this.editor,e=t.locale,n=t.model.schema,i=s(t.config.get("alignment.options")).filter(t=>a(t.name)&&!l(t.name,e)),o=i.some(t=>!!t.className);n.extend("$block",{allowAttributes:"alignment"}),t.model.schema.setAttributeProperties("alignment",{isFormatting:!0}),o?t.conversion.attributeToAttribute(function(t){const e={model:{key:"alignment",values:t.map(t=>t.name)},view:{}};for(const n of t)e.view[n.name]={key:"class",value:n.className};return e}(i)):t.conversion.for("downcast").attributeToAttribute(function(t){const e={model:{key:"alignment",values:t.map(t=>t.name)},view:{}};for(const{name:n}of t)e.view[n]={key:"style",value:{"text-align":n}};return e}(i));const r=function(t){const e=[];for(const{name:n}of t)e.push({view:{key:"style",value:{"text-align":n}},model:{key:"alignment",value:n}});return e}(i);for(const e of r)t.conversion.for("upcast").attributeToAttribute(e);const u=function(t){const e=[];for(const{name:n}of t)e.push({view:{key:"align",value:n},model:{key:"alignment",value:n}});return e}(i);for(const e of u)t.conversion.for("upcast").attributeToAttribute(e);t.commands.add("alignment",new c(t))}}var g=n(2);const d=new Map([["left",i.icons.alignLeft],["right",i.icons.alignRight],["center",i.icons.alignCenter],["justify",i.icons.alignJustify]]);class m extends i.Plugin{get localizedOptionTitles(){const t=this.editor.t;return{left:t("Align left"),right:t("Align right"),center:t("Align center"),justify:t("Justify")}}static get pluginName(){return"AlignmentUI"}init(){const t=this.editor,e=t.ui.componentFactory,n=t.t,i=s(t.config.get("alignment.options"));i.map(t=>t.name).filter(a).forEach(t=>this._addButton(t)),e.add("alignment",t=>{const o=Object(g.createDropdown)(t),r=i.map(t=>e.create("alignment:"+t.name));Object(g.addToolbarToDropdown)(o,r),o.buttonView.set({label:n("Text alignment"),tooltip:!0}),o.toolbarView.isVertical=!0,o.toolbarView.ariaLabel=n("Text alignment toolbar"),o.extendTemplate({attributes:{class:"ck-alignment-dropdown"}});const a="rtl"===t.contentLanguageDirection?d.get("right"):d.get("left");return o.buttonView.bind("icon").toMany(r,"isOn",(...t)=>{const e=t.findIndex(t=>t);return e<0?a:r[e].icon}),o.bind("isEnabled").toMany(r,"isEnabled",(...t)=>t.some(t=>t)),o})}_addButton(t){const e=this.editor;e.ui.componentFactory.add("alignment:"+t,n=>{const i=e.commands.get("alignment"),o=new g.ButtonView(n);return o.set({label:this.localizedOptionTitles[t],icon:d.get(t),tooltip:!0,isToggleable:!0}),o.bind("isEnabled").to(i),o.bind("isOn").to(i,"value",e=>e===t),this.listenTo(o,"execute",()=>{e.execute("alignment",{value:t}),e.editing.view.focus()}),o})}}class f extends i.Plugin{static get requires(){return[u,m]}static get pluginName(){return"Alignment"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/basic-styles.js b/core/assets/vendor/ckeditor5/build/basic-styles.js
new file mode 100644
index 0000000000..8a8c7c10d7
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/basic-styles.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Bold",Code:"Code",Italic:"Italic",Strikethrough:"Strikethrough",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.basicStyles=function(t){var e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=t,i.c=e,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)i.d(n,r,function(e){return t[e]}.bind(null,r));return n},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=7)}([function(t,e,i){t.exports=i(3)("./src/core.js")},function(t,e,i){t.exports=i(3)("./src/ui.js")},function(t,e,i){t.exports=i(3)("./src/typing.js")},function(t,e){t.exports=CKEditor5.dll},function(t,e,i){var n=i(5),r=i(6);"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[t.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(r,s);t.exports=r.locals||{}},function(t,e,i){"use strict";var n,r=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},s=function(){var t={};return function(e){if(void 0===t[e]){var i=document.querySelector(e);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(t){i=null}t[e]=i}return t[e]}}(),o=[];function c(t){for(var e=-1,i=0;i<o.length;i++)if(o[i].identifier===t){e=i;break}return e}function a(t,e){for(var i={},n=[],r=0;r<t.length;r++){var s=t[r],a=e.base?s[0]+e.base:s[0],u=i[a]||0,l="".concat(a," ").concat(u);i[a]=u+1;var d=c(l),g={css:s[1],media:s[2],sourceMap:s[3]};-1!==d?(o[d].references++,o[d].updater(g)):o.push({identifier:l,updater:b(g,e),references:1}),n.push(l)}return n}function u(t){var e=document.createElement("style"),n=t.attributes||{};if(void 0===n.nonce){var r=i.nc;r&&(n.nonce=r)}if(Object.keys(n).forEach((function(t){e.setAttribute(t,n[t])})),"function"==typeof t.insert)t.insert(e);else{var o=s(t.insert||"head");if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(e)}return e}var l,d=(l=[],function(t,e){return l[t]=e,l.filter(Boolean).join("\n")});function g(t,e,i,n){var r=i?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(t.styleSheet)t.styleSheet.cssText=d(e,r);else{var s=document.createTextNode(r),o=t.childNodes;o[e]&&t.removeChild(o[e]),o.length?t.insertBefore(s,o[e]):t.appendChild(s)}}function p(t,e,i){var n=i.css,r=i.media,s=i.sourceMap;if(r?t.setAttribute("media",r):t.removeAttribute("media"),s&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(s))))," */")),t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}var m=null,h=0;function b(t,e){var i,n,r;if(e.singleton){var s=h++;i=m||(m=u(e)),n=g.bind(null,i,s,!1),r=g.bind(null,i,s,!0)}else i=u(e),n=p.bind(null,i,e),r=function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(i)};return n(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;n(t=e)}else r()}}t.exports=function(t,e){(e=e||{}).singleton||"boolean"==typeof e.singleton||(e.singleton=r());var i=a(t=t||[],e);return function(t){if(t=t||[],"[object Array]"===Object.prototype.toString.call(t)){for(var n=0;n<i.length;n++){var r=c(i[n]);o[r].references--}for(var s=a(t,e),u=0;u<i.length;u++){var l=c(i[u]);0===o[l].references&&(o[l].updater(),o.splice(l,1))}i=s}}}},function(t,e){t.exports=".ck-content code{background-color:hsla(0,0%,78%,.3);padding:.15em;border-radius:2px}.ck.ck-editor__editable .ck-code_selected{background-color:hsla(0,0%,78%,.5)}"},function(t,e,i){"use strict";i.r(e),i.d(e,"Bold",(function(){return a})),i.d(e,"BoldEditing",(function(){return s})),i.d(e,"BoldUI",(function(){return c})),i.d(e,"Code",(function(){return p})),i.d(e,"CodeEditing",(function(){return d})),i.d(e,"CodeUI",(function(){return g})),i.d(e,"Italic",(function(){return b})),i.d(e,"ItalicEditing",(function(){return m})),i.d(e,"ItalicUI",(function(){return h})),i.d(e,"Strikethrough",(function(){return w})),i.d(e,"StrikethroughEditing",(function(){return f})),i.d(e,"StrikethroughUI",(function(){return v})),i.d(e,"Subscript",(function(){return E})),i.d(e,"SubscriptEditing",(function(){return x})),i.d(e,"SubscriptUI",(function(){return y})),i.d(e,"Superscript",(function(){return k})),i.d(e,"SuperscriptEditing",(function(){return S})),i.d(e,"SuperscriptUI",(function(){return T})),i.d(e,"Underline",(function(){return I})),i.d(e,"UnderlineEditing",(function(){return A})),i.d(e,"UnderlineUI",(function(){return C}));var n=i(0);class r extends n.Command{constructor(t,e){super(t),this.attributeKey=e}refresh(){const t=this.editor.model,e=t.document;this.value=this._getValueFromFirstAllowedNode(),this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model,i=e.document.selection,n=void 0===t.forceValue?!this.value:t.forceValue;e.change(t=>{if(i.isCollapsed)n?t.setSelectionAttribute(this.attributeKey,!0):t.removeSelectionAttribute(this.attributeKey);else{const r=e.schema.getValidRanges(i.getRanges(),this.attributeKey);for(const e of r)n?t.setAttribute(this.attributeKey,n,e):t.removeAttribute(this.attributeKey,e)}})}_getValueFromFirstAllowedNode(){const t=this.editor.model,e=t.schema,i=t.document.selection;if(i.isCollapsed)return i.hasAttribute(this.attributeKey);for(const t of i.getRanges())for(const i of t.getItems())if(e.checkAttribute(i,this.attributeKey))return i.hasAttribute(this.attributeKey);return!1}}class s extends n.Plugin{static get pluginName(){return"BoldEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"bold"}),t.model.schema.setAttributeProperties("bold",{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:"bold",view:"strong",upcastAlso:["b",t=>{const e=t.getStyle("font-weight");return e?"bold"==e||Number(e)>=600?{name:!0,styles:["font-weight"]}:void 0:null}]}),t.commands.add("bold",new r(t,"bold")),t.keystrokes.set("CTRL+B","bold")}}var o=i(1);class c extends n.Plugin{static get pluginName(){return"BoldUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("bold",i=>{const n=t.commands.get("bold"),r=new o.ButtonView(i);return r.set({label:e("Bold"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10.187 17H5.773c-.637 0-1.092-.138-1.364-.415-.273-.277-.409-.718-.409-1.323V4.738c0-.617.14-1.062.419-1.332.279-.27.73-.406 1.354-.406h4.68c.69 0 1.288.041 1.793.124.506.083.96.242 1.36.478.341.197.644.447.906.75a3.262 3.262 0 0 1 .808 2.162c0 1.401-.722 2.426-2.167 3.075C15.05 10.175 16 11.315 16 13.01a3.756 3.756 0 0 1-2.296 3.504 6.1 6.1 0 0 1-1.517.377c-.571.073-1.238.11-2 .11zm-.217-6.217H7v4.087h3.069c1.977 0 2.965-.69 2.965-2.072 0-.707-.256-1.22-.768-1.537-.512-.319-1.277-.478-2.296-.478zM7 5.13v3.619h2.606c.729 0 1.292-.067 1.69-.2a1.6 1.6 0 0 0 .91-.765c.165-.267.247-.566.247-.897 0-.707-.26-1.176-.778-1.409-.519-.232-1.31-.348-2.375-.348H7z"/></svg>',keystroke:"CTRL+B",tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("bold"),t.editing.view.focus()}),r})}}class a extends n.Plugin{static get requires(){return[s,c]}static get pluginName(){return"Bold"}}var u=i(2);const l="code";class d extends n.Plugin{static get pluginName(){return"CodeEditing"}static get requires(){return[u.TwoStepCaretMovement]}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:l}),t.model.schema.setAttributeProperties(l,{isFormatting:!0,copyOnEnter:!1}),t.conversion.attributeToElement({model:l,view:"code",upcastAlso:{styles:{"word-wrap":"break-word"}}}),t.commands.add(l,new r(t,l)),t.plugins.get(u.TwoStepCaretMovement).registerAttribute(l),Object(u.inlineHighlight)(t,l,"code","ck-code_selected")}}i(4);class g extends n.Plugin{static get pluginName(){return"CodeUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("code",i=>{const n=t.commands.get("code"),r=new o.ButtonView(i);return r.set({label:e("Code"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m12.5 5.7 5.2 3.9v1.3l-5.6 4c-.1.2-.3.2-.5.2-.3-.1-.6-.7-.6-1l.3-.4 4.7-3.5L11.5 7l-.2-.2c-.1-.3-.1-.6 0-.8.2-.2.5-.4.8-.4a.8.8 0 0 1 .4.1zm-5.2 0L2 9.6v1.3l5.6 4c.1.2.3.2.5.2.3-.1.7-.7.6-1 0-.1 0-.3-.2-.4l-5-3.5L8.2 7l.2-.2c.1-.3.1-.6 0-.8-.2-.2-.5-.4-.8-.4a.8.8 0 0 0-.3.1z"/></svg>',tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("code"),t.editing.view.focus()}),r})}}class p extends n.Plugin{static get requires(){return[d,g]}static get pluginName(){return"Code"}}class m extends n.Plugin{static get pluginName(){return"ItalicEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"italic"}),t.model.schema.setAttributeProperties("italic",{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:"italic",view:"i",upcastAlso:["em",{styles:{"font-style":"italic"}}]}),t.commands.add("italic",new r(t,"italic")),t.keystrokes.set("CTRL+I","italic")}}class h extends n.Plugin{static get pluginName(){return"ItalicUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("italic",i=>{const n=t.commands.get("italic"),r=new o.ButtonView(i);return r.set({label:e("Italic"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m9.586 14.633.021.004c-.036.335.095.655.393.962.082.083.173.15.274.201h1.474a.6.6 0 1 1 0 1.2H5.304a.6.6 0 0 1 0-1.2h1.15c.474-.07.809-.182 1.005-.334.157-.122.291-.32.404-.597l2.416-9.55a1.053 1.053 0 0 0-.281-.823 1.12 1.12 0 0 0-.442-.296H8.15a.6.6 0 0 1 0-1.2h6.443a.6.6 0 1 1 0 1.2h-1.195c-.376.056-.65.155-.823.296-.215.175-.423.439-.623.79l-2.366 9.347z"/></svg>',keystroke:"CTRL+I",tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("italic"),t.editing.view.focus()}),r})}}class b extends n.Plugin{static get requires(){return[m,h]}static get pluginName(){return"Italic"}}class f extends n.Plugin{static get pluginName(){return"StrikethroughEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"strikethrough"}),t.model.schema.setAttributeProperties("strikethrough",{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:"strikethrough",view:"s",upcastAlso:["del","strike",{styles:{"text-decoration":"line-through"}}]}),t.commands.add("strikethrough",new r(t,"strikethrough")),t.keystrokes.set("CTRL+SHIFT+X","strikethrough")}}class v extends n.Plugin{static get pluginName(){return"StrikethroughUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("strikethrough",i=>{const n=t.commands.get("strikethrough"),r=new o.ButtonView(i);return r.set({label:e("Strikethrough"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 16.4c-.8-.4-1.5-.9-2.2-1.5a.6.6 0 0 1-.2-.5l.3-.6h1c1 1.2 2.1 1.7 3.7 1.7 1 0 1.8-.3 2.3-.6.6-.4.6-1.2.6-1.3.2-1.2-.9-2.1-.9-2.1h2.1c.3.7.4 1.2.4 1.7v.8l-.6 1.2c-.6.8-1.1 1-1.6 1.2a6 6 0 0 1-2.4.6c-1 0-1.8-.3-2.5-.6zM6.8 9 6 8.3c-.4-.5-.5-.8-.5-1.6 0-.7.1-1.3.5-1.8.4-.6 1-1 1.6-1.3a6.3 6.3 0 0 1 4.7 0 4 4 0 0 1 1.7 1l.3.7c0 .1.2.4-.2.7-.4.2-.9.1-1 0a3 3 0 0 0-1.2-1c-.4-.2-1-.3-2-.4-.7 0-1.4.2-2 .6-.8.6-1 .8-1 1.5 0 .8.5 1 1.2 1.5.6.4 1.1.7 1.9 1H6.8z"/><path d="M3 10.5V9h14v1.5z"/></svg>',keystroke:"CTRL+SHIFT+X",tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("strikethrough"),t.editing.view.focus()}),r})}}class w extends n.Plugin{static get requires(){return[f,v]}static get pluginName(){return"Strikethrough"}}class x extends n.Plugin{static get pluginName(){return"SubscriptEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"subscript"}),t.model.schema.setAttributeProperties("subscript",{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:"subscript",view:"sub",upcastAlso:[{styles:{"vertical-align":"sub"}}]}),t.commands.add("subscript",new r(t,"subscript"))}}class y extends n.Plugin{static get pluginName(){return"SubscriptUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("subscript",i=>{const n=t.commands.get("subscript"),r=new o.ButtonView(i);return r.set({label:e("Subscript"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m7.03 10.349 3.818-3.819a.8.8 0 1 1 1.132 1.132L8.16 11.48l3.819 3.818a.8.8 0 1 1-1.132 1.132L7.03 12.61l-3.818 3.82a.8.8 0 1 1-1.132-1.132L5.9 11.48 2.08 7.662A.8.8 0 1 1 3.212 6.53l3.818 3.82zm8.147 7.829h2.549c.254 0 .447.05.58.152a.49.49 0 0 1 .201.413.54.54 0 0 1-.159.393c-.105.108-.266.162-.48.162h-3.594c-.245 0-.435-.066-.572-.197a.621.621 0 0 1-.205-.463c0-.114.044-.265.132-.453a1.62 1.62 0 0 1 .288-.444c.433-.436.824-.81 1.172-1.122.348-.312.597-.517.747-.615.267-.183.49-.368.667-.553.177-.185.312-.375.405-.57.093-.194.139-.384.139-.57a1.008 1.008 0 0 0-.554-.917 1.197 1.197 0 0 0-.56-.133c-.426 0-.761.182-1.005.546a2.332 2.332 0 0 0-.164.39 1.609 1.609 0 0 1-.258.488c-.096.114-.237.17-.423.17a.558.558 0 0 1-.405-.156.568.568 0 0 1-.161-.427c0-.218.05-.446.151-.683.101-.238.252-.453.452-.646s.454-.349.762-.467a2.998 2.998 0 0 1 1.081-.178c.498 0 .923.076 1.274.228a1.916 1.916 0 0 1 1.004 1.032 1.984 1.984 0 0 1-.156 1.794c-.2.32-.405.572-.613.754-.208.182-.558.468-1.048.857-.49.39-.826.691-1.008.906a2.703 2.703 0 0 0-.24.309z"/></svg>',tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("subscript"),t.editing.view.focus()}),r})}}class E extends n.Plugin{static get requires(){return[x,y]}static get pluginName(){return"Subscript"}}class S extends n.Plugin{static get pluginName(){return"SuperscriptEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"superscript"}),t.model.schema.setAttributeProperties("superscript",{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:"superscript",view:"sup",upcastAlso:[{styles:{"vertical-align":"super"}}]}),t.commands.add("superscript",new r(t,"superscript"))}}class T extends n.Plugin{static get pluginName(){return"SuperscriptUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("superscript",i=>{const n=t.commands.get("superscript"),r=new o.ButtonView(i);return r.set({label:e("Superscript"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M15.677 8.678h2.549c.254 0 .447.05.58.152a.49.49 0 0 1 .201.413.54.54 0 0 1-.159.393c-.105.108-.266.162-.48.162h-3.594c-.245 0-.435-.066-.572-.197a.621.621 0 0 1-.205-.463c0-.114.044-.265.132-.453a1.62 1.62 0 0 1 .288-.444c.433-.436.824-.81 1.172-1.122.348-.312.597-.517.747-.615.267-.183.49-.368.667-.553.177-.185.312-.375.405-.57.093-.194.139-.384.139-.57a1.008 1.008 0 0 0-.554-.917 1.197 1.197 0 0 0-.56-.133c-.426 0-.761.182-1.005.546a2.332 2.332 0 0 0-.164.39 1.609 1.609 0 0 1-.258.488c-.096.114-.237.17-.423.17a.558.558 0 0 1-.405-.156.568.568 0 0 1-.161-.427c0-.218.05-.446.151-.683.101-.238.252-.453.452-.646s.454-.349.762-.467a2.998 2.998 0 0 1 1.081-.178c.498 0 .923.076 1.274.228a1.916 1.916 0 0 1 1.004 1.032 1.984 1.984 0 0 1-.156 1.794c-.2.32-.405.572-.613.754-.208.182-.558.468-1.048.857-.49.39-.826.691-1.008.906a2.703 2.703 0 0 0-.24.309zM7.03 10.349l3.818-3.819a.8.8 0 1 1 1.132 1.132L8.16 11.48l3.819 3.818a.8.8 0 1 1-1.132 1.132L7.03 12.61l-3.818 3.82a.8.8 0 1 1-1.132-1.132L5.9 11.48 2.08 7.662A.8.8 0 1 1 3.212 6.53l3.818 3.82z"/></svg>',tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("superscript"),t.editing.view.focus()}),r})}}class k extends n.Plugin{static get requires(){return[S,T]}static get pluginName(){return"Superscript"}}class A extends n.Plugin{static get pluginName(){return"UnderlineEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"underline"}),t.model.schema.setAttributeProperties("underline",{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:"underline",view:"u",upcastAlso:{styles:{"text-decoration":"underline"}}}),t.commands.add("underline",new r(t,"underline")),t.keystrokes.set("CTRL+U","underline")}}class C extends n.Plugin{static get pluginName(){return"UnderlineUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("underline",i=>{const n=t.commands.get("underline"),r=new o.ButtonView(i);return r.set({label:e("Underline"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 18v-1.5h14V18zm2.2-8V3.6c0-.4.4-.6.8-.6.3 0 .7.2.7.6v6.2c0 2 1.3 2.8 3.2 2.8 1.9 0 3.4-.9 3.4-2.9V3.6c0-.3.4-.5.8-.5.3 0 .7.2.7.5V10c0 2.7-2.2 4-4.9 4-2.6 0-4.7-1.2-4.7-4z"/></svg>',keystroke:"CTRL+U",tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(r,"execute",()=>{t.execute("underline"),t.editing.view.focus()}),r})}}class I extends n.Plugin{static get requires(){return[A,C]}static get pluginName(){return"Underline"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/block-quote.js b/core/assets/vendor/ckeditor5/build/block-quote.js
new file mode 100644
index 0000000000..8900c3492a
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/block-quote.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.blockQuote=function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=9)}([function(e,t,n){e.exports=n(1)("./src/core.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,n){e.exports=n(1)("./src/utils.js")},function(e,t,n){e.exports=n(1)("./src/enter.js")},function(e,t,n){e.exports=n(1)("./src/typing.js")},function(e,t,n){e.exports=n(1)("./src/ui.js")},function(e,t,n){var o=n(7),r=n(8);"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var i={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};o(r,i);e.exports=r.locals||{}},function(e,t,n){"use strict";var o,r=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},i=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),c=[];function s(e){for(var t=-1,n=0;n<c.length;n++)if(c[n].identifier===e){t=n;break}return t}function l(e,t){for(var n={},o=[],r=0;r<e.length;r++){var i=e[r],l=t.base?i[0]+t.base:i[0],u=n[l]||0,a="".concat(l," ").concat(u);n[l]=u+1;var d=s(a),f={css:i[1],media:i[2],sourceMap:i[3]};-1!==d?(c[d].references++,c[d].updater(f)):c.push({identifier:a,updater:b(f,t),references:1}),o.push(a)}return o}function u(e){var t=document.createElement("style"),o=e.attributes||{};if(void 0===o.nonce){var r=n.nc;r&&(o.nonce=r)}if(Object.keys(o).forEach((function(e){t.setAttribute(e,o[e])})),"function"==typeof e.insert)e.insert(t);else{var c=i(e.insert||"head");if(!c)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");c.appendChild(t)}return t}var a,d=(a=[],function(e,t){return a[e]=t,a.filter(Boolean).join("\n")});function f(e,t,n,o){var r=n?"":o.media?"@media ".concat(o.media," {").concat(o.css,"}"):o.css;if(e.styleSheet)e.styleSheet.cssText=d(t,r);else{var i=document.createTextNode(r),c=e.childNodes;c[t]&&e.removeChild(c[t]),c.length?e.insertBefore(i,c[t]):e.appendChild(i)}}function p(e,t,n){var o=n.css,r=n.media,i=n.sourceMap;if(r?e.setAttribute("media",r):e.removeAttribute("media"),i&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleSheet)e.styleSheet.cssText=o;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(o))}}var m=null,h=0;function b(e,t){var n,o,r;if(t.singleton){var i=h++;n=m||(m=u(t)),o=f.bind(null,n,i,!1),r=f.bind(null,n,i,!0)}else n=u(t),o=p.bind(null,n,t),r=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else r()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=r());var n=l(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var o=0;o<n.length;o++){var r=s(n[o]);c[r].references--}for(var i=l(e,t),u=0;u<n.length;u++){var a=s(n[u]);0===c[a].references&&(c[a].updater(),c.splice(a,1))}n=i}}}},function(e,t){e.exports=".ck-content blockquote{overflow:hidden;padding-right:1.5em;padding-left:1.5em;margin-left:0;margin-right:0;font-style:italic;border-left:5px solid #ccc}.ck-content[dir=rtl] blockquote{border-left:0;border-right:5px solid #ccc}"},function(e,t,n){"use strict";n.r(t),n.d(t,"BlockQuote",(function(){return m})),n.d(t,"BlockQuoteEditing",(function(){return d})),n.d(t,"BlockQuoteUI",(function(){return p}));var o=n(0),r=n(3),i=n(4),c=n(2);class s extends o.Command{refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(e={}){const t=this.editor.model,n=t.schema,o=t.document.selection,r=Array.from(o.getSelectedBlocks()),i=void 0===e.forceValue?!this.value:e.forceValue;t.change(e=>{if(i){const t=r.filter(e=>l(e)||a(n,e));this._applyQuote(e,t)}else this._removeQuote(e,r.filter(l))})}_getValue(){const e=this.editor.model.document.selection,t=Object(c.first)(e.getSelectedBlocks());return!(!t||!l(t))}_checkEnabled(){if(this.value)return!0;const e=this.editor.model.document.selection,t=this.editor.model.schema,n=Object(c.first)(e.getSelectedBlocks());return!!n&&a(t,n)}_removeQuote(e,t){u(e,t).reverse().forEach(t=>{if(t.start.isAtStart&&t.end.isAtEnd)return void e.unwrap(t.start.parent);if(t.start.isAtStart){const n=e.createPositionBefore(t.start.parent);return void e.move(t,n)}t.end.isAtEnd||e.split(t.end);const n=e.createPositionAfter(t.end.parent);e.move(t,n)})}_applyQuote(e,t){const n=[];u(e,t).reverse().forEach(t=>{let o=l(t.start);o||(o=e.createElement("blockQuote"),e.wrap(t,o)),n.push(o)}),n.reverse().reduce((t,n)=>t.nextSibling==n?(e.merge(e.createPositionAfter(t)),t):n)}}function l(e){return"blockQuote"==e.parent.name?e.parent:null}function u(e,t){let n,o=0;const r=[];for(;o<t.length;){const i=t[o],c=t[o+1];n||(n=e.createPositionBefore(i)),c&&i.nextSibling==c||(r.push(e.createRange(n,e.createPositionAfter(i))),n=null),o++}return r}function a(e,t){const n=e.checkChild(t.parent,"blockQuote"),o=e.checkChild(["$root","blockQuote"],t);return n&&o}class d extends o.Plugin{static get pluginName(){return"BlockQuoteEditing"}static get requires(){return[r.Enter,i.Delete]}init(){const e=this.editor,t=e.model.schema;e.commands.add("blockQuote",new s(e)),t.register("blockQuote",{allowWhere:"$block",allowContentOf:"$root"}),e.conversion.elementToElement({model:"blockQuote",view:"blockquote"}),e.model.document.registerPostFixer(n=>{const o=e.model.document.differ.getChanges();for(const e of o)if("insert"==e.type){const o=e.position.nodeAfter;if(!o)continue;if(o.is("element","blockQuote")&&o.isEmpty)return n.remove(o),!0;if(o.is("element","blockQuote")&&!t.checkChild(e.position,o))return n.unwrap(o),!0;if(o.is("element")){const e=n.createRangeIn(o);for(const o of e.getItems())if(o.is("element","blockQuote")&&!t.checkChild(n.createPositionBefore(o),o))return n.unwrap(o),!0}}else if("remove"==e.type){const t=e.position.parent;if(t.is("element","blockQuote")&&t.isEmpty)return n.remove(t),!0}return!1});const n=this.editor.editing.view.document,o=e.model.document.selection,r=e.commands.get("blockQuote");this.listenTo(n,"enter",(t,n)=>{if(!o.isCollapsed||!r.value)return;o.getLastPosition().parent.isEmpty&&(e.execute("blockQuote"),e.editing.view.scrollToTheSelection(),n.preventDefault(),t.stop())},{context:"blockquote"}),this.listenTo(n,"delete",(t,n)=>{if("backward"!=n.direction||!o.isCollapsed||!r.value)return;const i=o.getLastPosition().parent;i.isEmpty&&!i.previousSibling&&(e.execute("blockQuote"),e.editing.view.scrollToTheSelection(),n.preventDefault(),t.stop())},{context:"blockquote"})}}var f=n(5);n(6);class p extends o.Plugin{static get pluginName(){return"BlockQuoteUI"}init(){const e=this.editor,t=e.t;e.ui.componentFactory.add("blockQuote",n=>{const r=e.commands.get("blockQuote"),i=new f.ButtonView(n);return i.set({label:t("Block quote"),icon:o.icons.quote,tooltip:!0,isToggleable:!0}),i.bind("isOn","isEnabled").to(r,"value","isEnabled"),this.listenTo(i,"execute",()=>{e.execute("blockQuote"),e.editing.view.focus()}),i})}}class m extends o.Plugin{static get requires(){return[d,p]}static get pluginName(){return"BlockQuote"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/ckeditor5-dll.js b/core/assets/vendor/ckeditor5/build/ckeditor5-dll.js
new file mode 100644
index 0000000000..125f0f2779
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/ckeditor5-dll.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"%0 of %1":"%0 of %1",Aquamarine:"Aquamarine",Black:"Black",Blue:"Blue",Cancel:"Cancel","Dim grey":"Dim grey","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Editor toolbar":"Editor toolbar",Green:"Green",Grey:"Grey","Insert paragraph after block":"Insert paragraph after block","Insert paragraph before block":"Insert paragraph before block","Light blue":"Light blue","Light green":"Light green","Light grey":"Light grey",Next:"Next",Orange:"Orange",Previous:"Previous",Purple:"Purple",Red:"Red",Redo:"Redo","Remove color":"Remove color","Restore default":"Restore default","Rich Text Editor":"Rich Text Editor","Rich Text Editor, %0":"Rich Text Editor, %0",Save:"Save","Select all":"Select all","Show more items":"Show more items",Turquoise:"Turquoise",Undo:"Undo","Upload in progress":"Upload in progress",White:"White","Widget toolbar":"Widget toolbar",Yellow:"Yellow"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.dll=function(e){var t={};function o(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,o),r.l=!0,r.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)o.d(i,r,function(t){return e[t]}.bind(null,r));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}({"./node_modules/lodash-es/_ListCache.js":function(e,t,o){"use strict";var i=function(){this.__data__=[],this.size=0},r=o("./node_modules/lodash-es/eq.js");var s=function(e,t){for(var o=e.length;o--;)if(Object(r.a)(e[o][0],t))return o;return-1},n=Array.prototype.splice;var a=function(e){var t=this.__data__,o=s(t,e);return!(o<0)&&(o==t.length-1?t.pop():n.call(t,o,1),--this.size,!0)};var c=function(e){var t=this.__data__,o=s(t,e);return o<0?void 0:t[o][1]};var l=function(e){return s(this.__data__,e)>-1};var d=function(e,t){var o=this.__data__,i=s(o,e);return i<0?(++this.size,o.push([e,t])):o[i][1]=t,this};function u(e){var t=-1,o=null==e?0:e.length;for(this.clear();++t<o;){var i=e[t];this.set(i[0],i[1])}}u.prototype.clear=i,u.prototype.delete=a,u.prototype.get=c,u.prototype.has=l,u.prototype.set=d;t.a=u},"./node_modules/lodash-es/_Map.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_getNative.js"),r=o("./node_modules/lodash-es/_root.js"),s=Object(i.a)(r.a,"Map");t.a=s},"./node_modules/lodash-es/_MapCache.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_getNative.js"),r=Object(i.a)(Object,"create");var s=function(){this.__data__=r?r(null):{},this.size=0};var n=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},a=Object.prototype.hasOwnProperty;var c=function(e){var t=this.__data__;if(r){var o=t[e];return"__lodash_hash_undefined__"===o?void 0:o}return a.call(t,e)?t[e]:void 0},l=Object.prototype.hasOwnProperty;var d=function(e){var t=this.__data__;return r?void 0!==t[e]:l.call(t,e)};var u=function(e,t){var o=this.__data__;return this.size+=this.has(e)?0:1,o[e]=r&&void 0===t?"__lodash_hash_undefined__":t,this};function h(e){var t=-1,o=null==e?0:e.length;for(this.clear();++t<o;){var i=e[t];this.set(i[0],i[1])}}h.prototype.clear=s,h.prototype.delete=n,h.prototype.get=c,h.prototype.has=d,h.prototype.set=u;var p=h,g=o("./node_modules/lodash-es/_ListCache.js"),f=o("./node_modules/lodash-es/_Map.js");var m=function(){this.size=0,this.__data__={hash:new p,map:new(f.a||g.a),string:new p}};var k=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e};var b=function(e,t){var o=e.__data__;return k(t)?o["string"==typeof t?"string":"hash"]:o.map};var _=function(e){var t=b(this,e).delete(e);return this.size-=t?1:0,t};var w=function(e){return b(this,e).get(e)};var v=function(e){return b(this,e).has(e)};var y=function(e,t){var o=b(this,e),i=o.size;return o.set(e,t),this.size+=o.size==i?0:1,this};function j(e){var t=-1,o=null==e?0:e.length;for(this.clear();++t<o;){var i=e[t];this.set(i[0],i[1])}}j.prototype.clear=m,j.prototype.delete=_,j.prototype.get=w,j.prototype.has=v,j.prototype.set=y;t.a=j},"./node_modules/lodash-es/_Stack.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_ListCache.js");var r=function(){this.__data__=new i.a,this.size=0};var s=function(e){var t=this.__data__,o=t.delete(e);return this.size=t.size,o};var n=function(e){return this.__data__.get(e)};var a=function(e){return this.__data__.has(e)},c=o("./node_modules/lodash-es/_Map.js"),l=o("./node_modules/lodash-es/_MapCache.js");var d=function(e,t){var o=this.__data__;if(o instanceof i.a){var r=o.__data__;if(!c.a||r.length<199)return r.push([e,t]),this.size=++o.size,this;o=this.__data__=new l.a(r)}return o.set(e,t),this.size=o.size,this};function u(e){var t=this.__data__=new i.a(e);this.size=t.size}u.prototype.clear=r,u.prototype.delete=s,u.prototype.get=n,u.prototype.has=a,u.prototype.set=d;t.a=u},"./node_modules/lodash-es/_Symbol.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_root.js").a.Symbol;t.a=i},"./node_modules/lodash-es/_Uint8Array.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_root.js").a.Uint8Array;t.a=i},"./node_modules/lodash-es/_arrayLikeKeys.js":function(e,t,o){"use strict";var i=function(e,t){for(var o=-1,i=Array(e);++o<e;)i[o]=t(o);return i},r=o("./node_modules/lodash-es/isArguments.js"),s=o("./node_modules/lodash-es/isArray.js"),n=o("./node_modules/lodash-es/isBuffer.js"),a=o("./node_modules/lodash-es/_isIndex.js"),c=o("./node_modules/lodash-es/isTypedArray.js"),l=Object.prototype.hasOwnProperty;t.a=function(e,t){var o=Object(s.a)(e),d=!o&&Object(r.a)(e),u=!o&&!d&&Object(n.a)(e),h=!o&&!d&&!u&&Object(c.a)(e),p=o||d||u||h,g=p?i(e.length,String):[],f=g.length;for(var m in e)!t&&!l.call(e,m)||p&&("length"==m||u&&("offset"==m||"parent"==m)||h&&("buffer"==m||"byteLength"==m||"byteOffset"==m)||Object(a.a)(m,f))||g.push(m);return g}},"./node_modules/lodash-es/_arrayPush.js":function(e,t,o){"use strict";t.a=function(e,t){for(var o=-1,i=t.length,r=e.length;++o<i;)e[r+o]=t[o];return e}},"./node_modules/lodash-es/_assignValue.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseAssignValue.js"),r=o("./node_modules/lodash-es/eq.js"),s=Object.prototype.hasOwnProperty;t.a=function(e,t,o){var n=e[t];s.call(e,t)&&Object(r.a)(n,o)&&(void 0!==o||t in e)||Object(i.a)(e,t,o)}},"./node_modules/lodash-es/_baseAssignValue.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_defineProperty.js");t.a=function(e,t,o){"__proto__"==t&&i.a?Object(i.a)(e,t,{configurable:!0,enumerable:!0,value:o,writable:!0}):e[t]=o}},"./node_modules/lodash-es/_baseClone.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_Stack.js");var r=function(e,t){for(var o=-1,i=null==e?0:e.length;++o<i&&!1!==t(e[o],o,e););return e},s=o("./node_modules/lodash-es/_assignValue.js"),n=o("./node_modules/lodash-es/_copyObject.js"),a=o("./node_modules/lodash-es/keys.js");var c=function(e,t){return e&&Object(n.a)(t,Object(a.a)(t),e)},l=o("./node_modules/lodash-es/keysIn.js");var d=function(e,t){return e&&Object(n.a)(t,Object(l.a)(t),e)},u=o("./node_modules/lodash-es/_cloneBuffer.js"),h=o("./node_modules/lodash-es/_copyArray.js"),p=o("./node_modules/lodash-es/_getSymbols.js");var g=function(e,t){return Object(n.a)(e,Object(p.a)(e),t)},f=o("./node_modules/lodash-es/_arrayPush.js"),m=o("./node_modules/lodash-es/_getPrototype.js"),k=o("./node_modules/lodash-es/stubArray.js"),b=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)Object(f.a)(t,Object(p.a)(e)),e=Object(m.a)(e);return t}:k.a;var _=function(e,t){return Object(n.a)(e,b(e),t)},w=o("./node_modules/lodash-es/_getAllKeys.js"),v=o("./node_modules/lodash-es/_baseGetAllKeys.js");var y=function(e){return Object(v.a)(e,l.a,b)},j=o("./node_modules/lodash-es/_getTag.js"),x=Object.prototype.hasOwnProperty;var P=function(e){var t=e.length,o=new e.constructor(t);return t&&"string"==typeof e[0]&&x.call(e,"index")&&(o.index=e.index,o.input=e.input),o},O=o("./node_modules/lodash-es/_cloneArrayBuffer.js");var A=function(e,t){var o=t?Object(O.a)(e.buffer):e.buffer;return new e.constructor(o,e.byteOffset,e.byteLength)},T=/\w*$/;var C=function(e){var t=new e.constructor(e.source,T.exec(e));return t.lastIndex=e.lastIndex,t},E=o("./node_modules/lodash-es/_Symbol.js"),S=E.a?E.a.prototype:void 0,R=S?S.valueOf:void 0;var M=function(e){return R?Object(R.call(e)):{}},N=o("./node_modules/lodash-es/_cloneTypedArray.js");var I=function(e,t,o){var i=e.constructor;switch(t){case"[object ArrayBuffer]":return Object(O.a)(e);case"[object Boolean]":case"[object Date]":return new i(+e);case"[object DataView]":return A(e,o);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return Object(N.a)(e,o);case"[object Map]":return new i;case"[object Number]":case"[object String]":return new i(e);case"[object RegExp]":return C(e);case"[object Set]":return new i;case"[object Symbol]":return M(e)}},z=o("./node_modules/lodash-es/_initCloneObject.js"),V=o("./node_modules/lodash-es/isArray.js"),D=o("./node_modules/lodash-es/isBuffer.js"),B=o("./node_modules/lodash-es/isObjectLike.js");var F=function(e){return Object(B.a)(e)&&"[object Map]"==Object(j.a)(e)},L=o("./node_modules/lodash-es/_baseUnary.js"),W=o("./node_modules/lodash-es/_nodeUtil.js"),H=W.a&&W.a.isMap,q=H?Object(L.a)(H):F,$=o("./node_modules/lodash-es/isObject.js");var U=function(e){return Object(B.a)(e)&&"[object Set]"==Object(j.a)(e)},K=W.a&&W.a.isSet,G=K?Object(L.a)(K):U,J={};J["[object Arguments]"]=J["[object Array]"]=J["[object ArrayBuffer]"]=J["[object DataView]"]=J["[object Boolean]"]=J["[object Date]"]=J["[object Float32Array]"]=J["[object Float64Array]"]=J["[object Int8Array]"]=J["[object Int16Array]"]=J["[object Int32Array]"]=J["[object Map]"]=J["[object Number]"]=J["[object Object]"]=J["[object RegExp]"]=J["[object Set]"]=J["[object String]"]=J["[object Symbol]"]=J["[object Uint8Array]"]=J["[object Uint8ClampedArray]"]=J["[object Uint16Array]"]=J["[object Uint32Array]"]=!0,J["[object Error]"]=J["[object Function]"]=J["[object WeakMap]"]=!1;t.a=function e(t,o,n,p,f,m){var k,b=1&o,v=2&o,x=4&o;if(n&&(k=f?n(t,p,f,m):n(t)),void 0!==k)return k;if(!Object($.a)(t))return t;var O=Object(V.a)(t);if(O){if(k=P(t),!b)return Object(h.a)(t,k)}else{var A=Object(j.a)(t),T="[object Function]"==A||"[object GeneratorFunction]"==A;if(Object(D.a)(t))return Object(u.a)(t,b);if("[object Object]"==A||"[object Arguments]"==A||T&&!f){if(k=v||T?{}:Object(z.a)(t),!b)return v?_(t,d(k,t)):g(t,c(k,t))}else{if(!J[A])return f?t:{};k=I(t,A,b)}}m||(m=new i.a);var C=m.get(t);if(C)return C;m.set(t,k),G(t)?t.forEach((function(i){k.add(e(i,o,n,i,t,m))})):q(t)&&t.forEach((function(i,r){k.set(r,e(i,o,n,r,t,m))}));var E=x?v?y:w.a:v?l.a:a.a,S=O?void 0:E(t);return r(S||t,(function(i,r){S&&(i=t[r=i]),Object(s.a)(k,r,e(i,o,n,r,t,m))})),k}},"./node_modules/lodash-es/_baseGetAllKeys.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_arrayPush.js"),r=o("./node_modules/lodash-es/isArray.js");t.a=function(e,t,o){var s=t(e);return Object(r.a)(e)?s:Object(i.a)(s,o(e))}},"./node_modules/lodash-es/_baseGetTag.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_Symbol.js"),r=Object.prototype,s=r.hasOwnProperty,n=r.toString,a=i.a?i.a.toStringTag:void 0;var c=function(e){var t=s.call(e,a),o=e[a];try{e[a]=void 0;var i=!0}catch(e){}var r=n.call(e);return i&&(t?e[a]=o:delete e[a]),r},l=Object.prototype.toString;var d=function(e){return l.call(e)},u=i.a?i.a.toStringTag:void 0;t.a=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":u&&u in Object(e)?c(e):d(e)}},"./node_modules/lodash-es/_baseIsEqual.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_Stack.js"),r=o("./node_modules/lodash-es/_MapCache.js");var s=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this};var n=function(e){return this.__data__.has(e)};function a(e){var t=-1,o=null==e?0:e.length;for(this.__data__=new r.a;++t<o;)this.add(e[t])}a.prototype.add=a.prototype.push=s,a.prototype.has=n;var c=a;var l=function(e,t){for(var o=-1,i=null==e?0:e.length;++o<i;)if(t(e[o],o,e))return!0;return!1};var d=function(e,t){return e.has(t)};var u=function(e,t,o,i,r,s){var n=1&o,a=e.length,u=t.length;if(a!=u&&!(n&&u>a))return!1;var h=s.get(e),p=s.get(t);if(h&&p)return h==t&&p==e;var g=-1,f=!0,m=2&o?new c:void 0;for(s.set(e,t),s.set(t,e);++g<a;){var k=e[g],b=t[g];if(i)var _=n?i(b,k,g,t,e,s):i(k,b,g,e,t,s);if(void 0!==_){if(_)continue;f=!1;break}if(m){if(!l(t,(function(e,t){if(!d(m,t)&&(k===e||r(k,e,o,i,s)))return m.push(t)}))){f=!1;break}}else if(k!==b&&!r(k,b,o,i,s)){f=!1;break}}return s.delete(e),s.delete(t),f},h=o("./node_modules/lodash-es/_Symbol.js"),p=o("./node_modules/lodash-es/_Uint8Array.js"),g=o("./node_modules/lodash-es/eq.js");var f=function(e){var t=-1,o=Array(e.size);return e.forEach((function(e,i){o[++t]=[i,e]})),o};var m=function(e){var t=-1,o=Array(e.size);return e.forEach((function(e){o[++t]=e})),o},k=h.a?h.a.prototype:void 0,b=k?k.valueOf:void 0;var _=function(e,t,o,i,r,s,n){switch(o){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!s(new p.a(e),new p.a(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return Object(g.a)(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var a=f;case"[object Set]":var c=1&i;if(a||(a=m),e.size!=t.size&&!c)return!1;var l=n.get(e);if(l)return l==t;i|=2,n.set(e,t);var d=u(a(e),a(t),i,r,s,n);return n.delete(e),d;case"[object Symbol]":if(b)return b.call(e)==b.call(t)}return!1},w=o("./node_modules/lodash-es/_getAllKeys.js"),v=Object.prototype.hasOwnProperty;var y=function(e,t,o,i,r,s){var n=1&o,a=Object(w.a)(e),c=a.length;if(c!=Object(w.a)(t).length&&!n)return!1;for(var l=c;l--;){var d=a[l];if(!(n?d in t:v.call(t,d)))return!1}var u=s.get(e),h=s.get(t);if(u&&h)return u==t&&h==e;var p=!0;s.set(e,t),s.set(t,e);for(var g=n;++l<c;){var f=e[d=a[l]],m=t[d];if(i)var k=n?i(m,f,d,t,e,s):i(f,m,d,e,t,s);if(!(void 0===k?f===m||r(f,m,o,i,s):k)){p=!1;break}g||(g="constructor"==d)}if(p&&!g){var b=e.constructor,_=t.constructor;b==_||!("constructor"in e)||!("constructor"in t)||"function"==typeof b&&b instanceof b&&"function"==typeof _&&_ instanceof _||(p=!1)}return s.delete(e),s.delete(t),p},j=o("./node_modules/lodash-es/_getTag.js"),x=o("./node_modules/lodash-es/isArray.js"),P=o("./node_modules/lodash-es/isBuffer.js"),O=o("./node_modules/lodash-es/isTypedArray.js"),A="[object Object]",T=Object.prototype.hasOwnProperty;var C=function(e,t,o,r,s,n){var a=Object(x.a)(e),c=Object(x.a)(t),l=a?"[object Array]":Object(j.a)(e),d=c?"[object Array]":Object(j.a)(t),h=(l="[object Arguments]"==l?A:l)==A,p=(d="[object Arguments]"==d?A:d)==A,g=l==d;if(g&&Object(P.a)(e)){if(!Object(P.a)(t))return!1;a=!0,h=!1}if(g&&!h)return n||(n=new i.a),a||Object(O.a)(e)?u(e,t,o,r,s,n):_(e,t,l,o,r,s,n);if(!(1&o)){var f=h&&T.call(e,"__wrapped__"),m=p&&T.call(t,"__wrapped__");if(f||m){var k=f?e.value():e,b=m?t.value():t;return n||(n=new i.a),s(k,b,o,r,n)}}return!!g&&(n||(n=new i.a),y(e,t,o,r,s,n))},E=o("./node_modules/lodash-es/isObjectLike.js");t.a=function e(t,o,i,r,s){return t===o||(null==t||null==o||!Object(E.a)(t)&&!Object(E.a)(o)?t!=t&&o!=o:C(t,o,i,r,e,s))}},"./node_modules/lodash-es/_baseUnary.js":function(e,t,o){"use strict";t.a=function(e){return function(t){return e(t)}}},"./node_modules/lodash-es/_cloneArrayBuffer.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_Uint8Array.js");t.a=function(e){var t=new e.constructor(e.byteLength);return new i.a(t).set(new i.a(e)),t}},"./node_modules/lodash-es/_cloneBuffer.js":function(e,t,o){"use strict";(function(e){var i=o("./node_modules/lodash-es/_root.js"),r="object"==typeof exports&&exports&&!exports.nodeType&&exports,s=r&&"object"==typeof e&&e&&!e.nodeType&&e,n=s&&s.exports===r?i.a.Buffer:void 0,a=n?n.allocUnsafe:void 0;t.a=function(e,t){if(t)return e.slice();var o=e.length,i=a?a(o):new e.constructor(o);return e.copy(i),i}}).call(this,o("./node_modules/webpack/buildin/harmony-module.js")(e))},"./node_modules/lodash-es/_cloneTypedArray.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_cloneArrayBuffer.js");t.a=function(e,t){var o=t?Object(i.a)(e.buffer):e.buffer;return new e.constructor(o,e.byteOffset,e.length)}},"./node_modules/lodash-es/_copyArray.js":function(e,t,o){"use strict";t.a=function(e,t){var o=-1,i=e.length;for(t||(t=Array(i));++o<i;)t[o]=e[o];return t}},"./node_modules/lodash-es/_copyObject.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_assignValue.js"),r=o("./node_modules/lodash-es/_baseAssignValue.js");t.a=function(e,t,o,s){var n=!o;o||(o={});for(var a=-1,c=t.length;++a<c;){var l=t[a],d=s?s(o[l],e[l],l,o,e):void 0;void 0===d&&(d=e[l]),n?Object(r.a)(o,l,d):Object(i.a)(o,l,d)}return o}},"./node_modules/lodash-es/_createAssigner.js":function(e,t,o){"use strict";var i=function(e){return e};var r=function(e,t,o){switch(o.length){case 0:return e.call(t);case 1:return e.call(t,o[0]);case 2:return e.call(t,o[0],o[1]);case 3:return e.call(t,o[0],o[1],o[2])}return e.apply(t,o)},s=Math.max;var n=function(e,t,o){return t=s(void 0===t?e.length-1:t,0),function(){for(var i=arguments,n=-1,a=s(i.length-t,0),c=Array(a);++n<a;)c[n]=i[t+n];n=-1;for(var l=Array(t+1);++n<t;)l[n]=i[n];return l[t]=o(c),r(e,this,l)}};var a=function(e){return function(){return e}},c=o("./node_modules/lodash-es/_defineProperty.js"),l=c.a?function(e,t){return Object(c.a)(e,"toString",{configurable:!0,enumerable:!1,value:a(t),writable:!0})}:i,d=Date.now;var u=function(e){var t=0,o=0;return function(){var i=d(),r=16-(i-o);if(o=i,r>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(l);var h=function(e,t){return u(n(e,t,i),e+"")},p=o("./node_modules/lodash-es/eq.js"),g=o("./node_modules/lodash-es/isArrayLike.js"),f=o("./node_modules/lodash-es/_isIndex.js"),m=o("./node_modules/lodash-es/isObject.js");var k=function(e,t,o){if(!Object(m.a)(o))return!1;var i=typeof t;return!!("number"==i?Object(g.a)(o)&&Object(f.a)(t,o.length):"string"==i&&t in o)&&Object(p.a)(o[t],e)};t.a=function(e){return h((function(t,o){var i=-1,r=o.length,s=r>1?o[r-1]:void 0,n=r>2?o[2]:void 0;for(s=e.length>3&&"function"==typeof s?(r--,s):void 0,n&&k(o[0],o[1],n)&&(s=r<3?void 0:s,r=1),t=Object(t);++i<r;){var a=o[i];a&&e(t,a,i,s)}return t}))}},"./node_modules/lodash-es/_defineProperty.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_getNative.js"),r=function(){try{var e=Object(i.a)(Object,"defineProperty");return e({},"",{}),e}catch(e){}}();t.a=r},"./node_modules/lodash-es/_freeGlobal.js":function(e,t,o){"use strict";(function(e){var o="object"==typeof e&&e&&e.Object===Object&&e;t.a=o}).call(this,o("./node_modules/webpack/buildin/global.js"))},"./node_modules/lodash-es/_getAllKeys.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseGetAllKeys.js"),r=o("./node_modules/lodash-es/_getSymbols.js"),s=o("./node_modules/lodash-es/keys.js");t.a=function(e){return Object(i.a)(e,s.a,r.a)}},"./node_modules/lodash-es/_getNative.js":function(e,t,o){"use strict";var i,r=o("./node_modules/lodash-es/isFunction.js"),s=o("./node_modules/lodash-es/_root.js").a["__core-js_shared__"],n=(i=/[^.]+$/.exec(s&&s.keys&&s.keys.IE_PROTO||""))?"Symbol(src)_1."+i:"";var a=function(e){return!!n&&n in e},c=o("./node_modules/lodash-es/isObject.js"),l=o("./node_modules/lodash-es/_toSource.js"),d=/^\[object .+?Constructor\]$/,u=Function.prototype,h=Object.prototype,p=u.toString,g=h.hasOwnProperty,f=RegExp("^"+p.call(g).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");var m=function(e){return!(!Object(c.a)(e)||a(e))&&(Object(r.a)(e)?f:d).test(Object(l.a)(e))};var k=function(e,t){return null==e?void 0:e[t]};t.a=function(e,t){var o=k(e,t);return m(o)?o:void 0}},"./node_modules/lodash-es/_getPrototype.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_overArg.js"),r=Object(i.a)(Object.getPrototypeOf,Object);t.a=r},"./node_modules/lodash-es/_getSymbols.js":function(e,t,o){"use strict";var i=function(e,t){for(var o=-1,i=null==e?0:e.length,r=0,s=[];++o<i;){var n=e[o];t(n,o,e)&&(s[r++]=n)}return s},r=o("./node_modules/lodash-es/stubArray.js"),s=Object.prototype.propertyIsEnumerable,n=Object.getOwnPropertySymbols,a=n?function(e){return null==e?[]:(e=Object(e),i(n(e),(function(t){return s.call(e,t)})))}:r.a;t.a=a},"./node_modules/lodash-es/_getTag.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_getNative.js"),r=o("./node_modules/lodash-es/_root.js"),s=Object(i.a)(r.a,"DataView"),n=o("./node_modules/lodash-es/_Map.js"),a=Object(i.a)(r.a,"Promise"),c=Object(i.a)(r.a,"Set"),l=Object(i.a)(r.a,"WeakMap"),d=o("./node_modules/lodash-es/_baseGetTag.js"),u=o("./node_modules/lodash-es/_toSource.js"),h=Object(u.a)(s),p=Object(u.a)(n.a),g=Object(u.a)(a),f=Object(u.a)(c),m=Object(u.a)(l),k=d.a;(s&&"[object DataView]"!=k(new s(new ArrayBuffer(1)))||n.a&&"[object Map]"!=k(new n.a)||a&&"[object Promise]"!=k(a.resolve())||c&&"[object Set]"!=k(new c)||l&&"[object WeakMap]"!=k(new l))&&(k=function(e){var t=Object(d.a)(e),o="[object Object]"==t?e.constructor:void 0,i=o?Object(u.a)(o):"";if(i)switch(i){case h:return"[object DataView]";case p:return"[object Map]";case g:return"[object Promise]";case f:return"[object Set]";case m:return"[object WeakMap]"}return t});t.a=k},"./node_modules/lodash-es/_initCloneObject.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/isObject.js"),r=Object.create,s=function(){function e(){}return function(t){if(!Object(i.a)(t))return{};if(r)return r(t);e.prototype=t;var o=new e;return e.prototype=void 0,o}}(),n=o("./node_modules/lodash-es/_getPrototype.js"),a=o("./node_modules/lodash-es/_isPrototype.js");t.a=function(e){return"function"!=typeof e.constructor||Object(a.a)(e)?{}:s(Object(n.a)(e))}},"./node_modules/lodash-es/_isIndex.js":function(e,t,o){"use strict";var i=/^(?:0|[1-9]\d*)$/;t.a=function(e,t){var o=typeof e;return!!(t=null==t?9007199254740991:t)&&("number"==o||"symbol"!=o&&i.test(e))&&e>-1&&e%1==0&&e<t}},"./node_modules/lodash-es/_isPrototype.js":function(e,t,o){"use strict";var i=Object.prototype;t.a=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||i)}},"./node_modules/lodash-es/_nodeUtil.js":function(e,t,o){"use strict";(function(e){var i=o("./node_modules/lodash-es/_freeGlobal.js"),r="object"==typeof exports&&exports&&!exports.nodeType&&exports,s=r&&"object"==typeof e&&e&&!e.nodeType&&e,n=s&&s.exports===r&&i.a.process,a=function(){try{var e=s&&s.require&&s.require("util").types;return e||n&&n.binding&&n.binding("util")}catch(e){}}();t.a=a}).call(this,o("./node_modules/webpack/buildin/harmony-module.js")(e))},"./node_modules/lodash-es/_overArg.js":function(e,t,o){"use strict";t.a=function(e,t){return function(o){return e(t(o))}}},"./node_modules/lodash-es/_root.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_freeGlobal.js"),r="object"==typeof self&&self&&self.Object===Object&&self,s=i.a||r||Function("return this")();t.a=s},"./node_modules/lodash-es/_toSource.js":function(e,t,o){"use strict";var i=Function.prototype.toString;t.a=function(e){if(null!=e){try{return i.call(e)}catch(e){}try{return e+""}catch(e){}}return""}},"./node_modules/lodash-es/assignIn.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_copyObject.js"),r=o("./node_modules/lodash-es/_createAssigner.js"),s=o("./node_modules/lodash-es/keysIn.js"),n=Object(r.a)((function(e,t){Object(i.a)(t,Object(s.a)(t),e)}));t.a=n},"./node_modules/lodash-es/clone.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseClone.js");t.a=function(e){return Object(i.a)(e,4)}},"./node_modules/lodash-es/cloneDeep.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseClone.js");t.a=function(e){return Object(i.a)(e,5)}},"./node_modules/lodash-es/cloneDeepWith.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseClone.js");t.a=function(e,t){return t="function"==typeof t?t:void 0,Object(i.a)(e,5,t)}},"./node_modules/lodash-es/debounce.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/isObject.js"),r=o("./node_modules/lodash-es/_root.js"),s=function(){return r.a.Date.now()},n=/\s/;var a=function(e){for(var t=e.length;t--&&n.test(e.charAt(t)););return t},c=/^\s+/;var l=function(e){return e?e.slice(0,a(e)+1).replace(c,""):e},d=o("./node_modules/lodash-es/isSymbol.js"),u=/^[-+]0x[0-9a-f]+$/i,h=/^0b[01]+$/i,p=/^0o[0-7]+$/i,g=parseInt;var f=function(e){if("number"==typeof e)return e;if(Object(d.a)(e))return NaN;if(Object(i.a)(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Object(i.a)(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=l(e);var o=h.test(e);return o||p.test(e)?g(e.slice(2),o?2:8):u.test(e)?NaN:+e},m=Math.max,k=Math.min;t.a=function(e,t,o){var r,n,a,c,l,d,u=0,h=!1,p=!1,g=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function b(t){var o=r,i=n;return r=n=void 0,u=t,c=e.apply(i,o)}function _(e){return u=e,l=setTimeout(v,t),h?b(e):c}function w(e){var o=e-d;return void 0===d||o>=t||o<0||p&&e-u>=a}function v(){var e=s();if(w(e))return y(e);l=setTimeout(v,function(e){var o=t-(e-d);return p?k(o,a-(e-u)):o}(e))}function y(e){return l=void 0,g&&r?b(e):(r=n=void 0,c)}function j(){var e=s(),o=w(e);if(r=arguments,n=this,d=e,o){if(void 0===l)return _(d);if(p)return clearTimeout(l),l=setTimeout(v,t),b(d)}return void 0===l&&(l=setTimeout(v,t)),c}return t=f(t)||0,Object(i.a)(o)&&(h=!!o.leading,a=(p="maxWait"in o)?m(f(o.maxWait)||0,t):a,g="trailing"in o?!!o.trailing:g),j.cancel=function(){void 0!==l&&clearTimeout(l),u=0,r=d=n=l=void 0},j.flush=function(){return void 0===l?c:y(s())},j}},"./node_modules/lodash-es/eq.js":function(e,t,o){"use strict";t.a=function(e,t){return e===t||e!=e&&t!=t}},"./node_modules/lodash-es/isArguments.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseGetTag.js"),r=o("./node_modules/lodash-es/isObjectLike.js");var s=function(e){return Object(r.a)(e)&&"[object Arguments]"==Object(i.a)(e)},n=Object.prototype,a=n.hasOwnProperty,c=n.propertyIsEnumerable,l=s(function(){return arguments}())?s:function(e){return Object(r.a)(e)&&a.call(e,"callee")&&!c.call(e,"callee")};t.a=l},"./node_modules/lodash-es/isArray.js":function(e,t,o){"use strict";var i=Array.isArray;t.a=i},"./node_modules/lodash-es/isArrayLike.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/isFunction.js"),r=o("./node_modules/lodash-es/isLength.js");t.a=function(e){return null!=e&&Object(r.a)(e.length)&&!Object(i.a)(e)}},"./node_modules/lodash-es/isBuffer.js":function(e,t,o){"use strict";(function(e){var i=o("./node_modules/lodash-es/_root.js"),r=o("./node_modules/lodash-es/stubFalse.js"),s="object"==typeof exports&&exports&&!exports.nodeType&&exports,n=s&&"object"==typeof e&&e&&!e.nodeType&&e,a=n&&n.exports===s?i.a.Buffer:void 0,c=(a?a.isBuffer:void 0)||r.a;t.a=c}).call(this,o("./node_modules/webpack/buildin/harmony-module.js")(e))},"./node_modules/lodash-es/isElement.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/isObjectLike.js"),r=o("./node_modules/lodash-es/isPlainObject.js");t.a=function(e){return Object(i.a)(e)&&1===e.nodeType&&!Object(r.a)(e)}},"./node_modules/lodash-es/isFunction.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseGetTag.js"),r=o("./node_modules/lodash-es/isObject.js");t.a=function(e){if(!Object(r.a)(e))return!1;var t=Object(i.a)(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}},"./node_modules/lodash-es/isLength.js":function(e,t,o){"use strict";t.a=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},"./node_modules/lodash-es/isObject.js":function(e,t,o){"use strict";t.a=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},"./node_modules/lodash-es/isObjectLike.js":function(e,t,o){"use strict";t.a=function(e){return null!=e&&"object"==typeof e}},"./node_modules/lodash-es/isPlainObject.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseGetTag.js"),r=o("./node_modules/lodash-es/_getPrototype.js"),s=o("./node_modules/lodash-es/isObjectLike.js"),n=Function.prototype,a=Object.prototype,c=n.toString,l=a.hasOwnProperty,d=c.call(Object);t.a=function(e){if(!Object(s.a)(e)||"[object Object]"!=Object(i.a)(e))return!1;var t=Object(r.a)(e);if(null===t)return!0;var o=l.call(t,"constructor")&&t.constructor;return"function"==typeof o&&o instanceof o&&c.call(o)==d}},"./node_modules/lodash-es/isSymbol.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseGetTag.js"),r=o("./node_modules/lodash-es/isObjectLike.js");t.a=function(e){return"symbol"==typeof e||Object(r.a)(e)&&"[object Symbol]"==Object(i.a)(e)}},"./node_modules/lodash-es/isTypedArray.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_baseGetTag.js"),r=o("./node_modules/lodash-es/isLength.js"),s=o("./node_modules/lodash-es/isObjectLike.js"),n={};n["[object Float32Array]"]=n["[object Float64Array]"]=n["[object Int8Array]"]=n["[object Int16Array]"]=n["[object Int32Array]"]=n["[object Uint8Array]"]=n["[object Uint8ClampedArray]"]=n["[object Uint16Array]"]=n["[object Uint32Array]"]=!0,n["[object Arguments]"]=n["[object Array]"]=n["[object ArrayBuffer]"]=n["[object Boolean]"]=n["[object DataView]"]=n["[object Date]"]=n["[object Error]"]=n["[object Function]"]=n["[object Map]"]=n["[object Number]"]=n["[object Object]"]=n["[object RegExp]"]=n["[object Set]"]=n["[object String]"]=n["[object WeakMap]"]=!1;var a=function(e){return Object(s.a)(e)&&Object(r.a)(e.length)&&!!n[Object(i.a)(e)]},c=o("./node_modules/lodash-es/_baseUnary.js"),l=o("./node_modules/lodash-es/_nodeUtil.js"),d=l.a&&l.a.isTypedArray,u=d?Object(c.a)(d):a;t.a=u},"./node_modules/lodash-es/keys.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_arrayLikeKeys.js"),r=o("./node_modules/lodash-es/_isPrototype.js"),s=o("./node_modules/lodash-es/_overArg.js"),n=Object(s.a)(Object.keys,Object),a=Object.prototype.hasOwnProperty;var c=function(e){if(!Object(r.a)(e))return n(e);var t=[];for(var o in Object(e))a.call(e,o)&&"constructor"!=o&&t.push(o);return t},l=o("./node_modules/lodash-es/isArrayLike.js");t.a=function(e){return Object(l.a)(e)?Object(i.a)(e):c(e)}},"./node_modules/lodash-es/keysIn.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_arrayLikeKeys.js"),r=o("./node_modules/lodash-es/isObject.js"),s=o("./node_modules/lodash-es/_isPrototype.js");var n=function(e){var t=[];if(null!=e)for(var o in Object(e))t.push(o);return t},a=Object.prototype.hasOwnProperty;var c=function(e){if(!Object(r.a)(e))return n(e);var t=Object(s.a)(e),o=[];for(var i in e)("constructor"!=i||!t&&a.call(e,i))&&o.push(i);return o},l=o("./node_modules/lodash-es/isArrayLike.js");t.a=function(e){return Object(l.a)(e)?Object(i.a)(e,!0):c(e)}},"./node_modules/lodash-es/stubArray.js":function(e,t,o){"use strict";t.a=function(){return[]}},"./node_modules/lodash-es/stubFalse.js":function(e,t,o){"use strict";t.a=function(){return!1}},"./node_modules/lodash-es/throttle.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/debounce.js"),r=o("./node_modules/lodash-es/isObject.js");t.a=function(e,t,o){var s=!0,n=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return Object(r.a)(o)&&(s="leading"in o?!!o.leading:s,n="trailing"in o?!!o.trailing:n),Object(i.a)(e,t,{leading:s,maxWait:t,trailing:n})}},"./node_modules/lodash-es/toString.js":function(e,t,o){"use strict";var i=o("./node_modules/lodash-es/_Symbol.js");var r=function(e,t){for(var o=-1,i=null==e?0:e.length,r=Array(i);++o<i;)r[o]=t(e[o],o,e);return r},s=o("./node_modules/lodash-es/isArray.js"),n=o("./node_modules/lodash-es/isSymbol.js"),a=i.a?i.a.prototype:void 0,c=a?a.toString:void 0;var l=function e(t){if("string"==typeof t)return t;if(Object(s.a)(t))return r(t,e)+"";if(Object(n.a)(t))return c?c.call(t):"";var o=t+"";return"0"==o&&1/t==-1/0?"-0":o};t.a=function(e){return null==e?"":l(e)}},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-clipboard/theme/clipboard.css":function(e,t){e.exports='.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position{display:inline;position:relative;pointer-events:none}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{position:absolute;width:0}.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__selection-handle,.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__type-around{display:none}:root{--ck-clipboard-drop-target-dot-width:12px;--ck-clipboard-drop-target-dot-height:8px;--ck-clipboard-drop-target-color:var(--ck-color-focus-border)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{bottom:calc(var(--ck-clipboard-drop-target-dot-height)*-0.5);top:calc(var(--ck-clipboard-drop-target-dot-height)*-0.5);border:1px solid var(--ck-clipboard-drop-target-color);background:var(--ck-clipboard-drop-target-color);margin-left:-1px}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span:after{content:"";width:0;height:0;display:block;position:absolute;left:50%;top:calc(var(--ck-clipboard-drop-target-dot-height)*-0.5);transform:translateX(-50%);border-left:calc(var(--ck-clipboard-drop-target-dot-width)*0.5) solid transparent;border-bottom:0 solid transparent;border-right:calc(var(--ck-clipboard-drop-target-dot-width)*0.5) solid transparent;border-top:calc(var(--ck-clipboard-drop-target-dot-height)) solid var(--ck-clipboard-drop-target-color)}.ck.ck-editor__editable .ck-widget.ck-clipboard-drop-target-range{outline:var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color)!important}.ck.ck-editor__editable .ck-widget:-webkit-drag{zoom:.6;outline:none!important}'},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-engine/theme/placeholder.css":function(e,t){e.exports=".ck.ck-placeholder,.ck .ck-placeholder{position:relative}.ck.ck-placeholder:before,.ck .ck-placeholder:before{position:absolute;left:0;right:0;content:attr(data-placeholder);pointer-events:none}.ck.ck-read-only .ck-placeholder:before{display:none}.ck.ck-placeholder:before,.ck .ck-placeholder:before{cursor:text;color:var(--ck-color-engine-placeholder-text)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/button/button.css":function(e,t){e.exports=".ck.ck-button,a.ck.ck-button{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ck.ck-button .ck-tooltip,a.ck.ck-button .ck-tooltip{display:block}@media (hover:none){.ck.ck-button .ck-tooltip,a.ck.ck-button .ck-tooltip{display:none}}.ck.ck-button,a.ck.ck-button{position:relative;display:inline-flex;align-items:center;justify-content:left}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{display:none}.ck.ck-button.ck-button_with-text .ck-button__label,a.ck.ck-button.ck-button_with-text .ck-button__label{display:inline-block}.ck.ck-button:not(.ck-button_with-text),a.ck.ck-button:not(.ck-button_with-text){justify-content:center}.ck.ck-button:hover .ck-tooltip,a.ck.ck-button:hover .ck-tooltip{visibility:visible;opacity:1}.ck.ck-button:focus:not(:hover) .ck-tooltip,a.ck.ck-button:focus:not(:hover) .ck-tooltip{display:none}.ck.ck-button,a.ck.ck-button{background:var(--ck-color-button-default-background)}.ck.ck-button:not(.ck-disabled):hover,a.ck.ck-button:not(.ck-disabled):hover{background:var(--ck-color-button-default-hover-background)}.ck.ck-button:not(.ck-disabled):active,a.ck.ck-button:not(.ck-disabled):active{background:var(--ck-color-button-default-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-default-active-shadow)}.ck.ck-button.ck-disabled,a.ck.ck-button.ck-disabled{background:var(--ck-color-button-default-disabled-background)}.ck.ck-button,a.ck.ck-button{border-radius:0}.ck-rounded-corners .ck.ck-button,.ck-rounded-corners a.ck.ck-button,.ck.ck-button.ck-rounded-corners,a.ck.ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-button,a.ck.ck-button{white-space:nowrap;cursor:default;vertical-align:middle;padding:var(--ck-spacing-tiny);text-align:center;min-width:var(--ck-ui-component-min-height);min-height:var(--ck-ui-component-min-height);line-height:1;font-size:inherit;border:1px solid transparent;transition:box-shadow .2s ease-in-out,border .2s ease-in-out;-webkit-appearance:none}.ck.ck-button:active,.ck.ck-button:focus,a.ck.ck-button:active,a.ck.ck-button:focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-button .ck-button__icon use,.ck.ck-button .ck-button__icon use *,a.ck.ck-button .ck-button__icon use,a.ck.ck-button .ck-button__icon use *{color:inherit}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{font-size:inherit;font-weight:inherit;color:inherit;cursor:inherit;vertical-align:middle}[dir=ltr] .ck.ck-button .ck-button__label,[dir=ltr] a.ck.ck-button .ck-button__label{text-align:left}[dir=rtl] .ck.ck-button .ck-button__label,[dir=rtl] a.ck.ck-button .ck-button__label{text-align:right}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{color:inherit}[dir=ltr] .ck.ck-button .ck-button__keystroke,[dir=ltr] a.ck.ck-button .ck-button__keystroke{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-button .ck-button__keystroke,[dir=rtl] a.ck.ck-button .ck-button__keystroke{margin-right:var(--ck-spacing-large)}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{font-weight:700;opacity:.7}.ck.ck-button.ck-disabled:active,.ck.ck-button.ck-disabled:focus,a.ck.ck-button.ck-disabled:active,a.ck.ck-button.ck-disabled:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-button.ck-disabled .ck-button__icon,a.ck.ck-button.ck-disabled .ck-button__icon{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-disabled .ck-button__label,a.ck.ck-button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-disabled .ck-button__keystroke,a.ck.ck-button.ck-disabled .ck-button__keystroke{opacity:.3}.ck.ck-button.ck-button_with-text,a.ck.ck-button.ck-button_with-text{padding:var(--ck-spacing-tiny) var(--ck-spacing-standard)}[dir=ltr] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=ltr] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-left:calc(var(--ck-spacing-small)*-1);margin-right:var(--ck-spacing-small)}[dir=rtl] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=rtl] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-right:calc(var(--ck-spacing-small)*-1);margin-left:var(--ck-spacing-small)}.ck.ck-button.ck-button_with-keystroke .ck-button__label,a.ck.ck-button.ck-button_with-keystroke .ck-button__label{flex-grow:1}.ck.ck-button.ck-on,a.ck.ck-button.ck-on{background:var(--ck-color-button-on-background)}.ck.ck-button.ck-on:not(.ck-disabled):hover,a.ck.ck-button.ck-on:not(.ck-disabled):hover{background:var(--ck-color-button-on-hover-background)}.ck.ck-button.ck-on:not(.ck-disabled):active,a.ck.ck-button.ck-on:not(.ck-disabled):active{background:var(--ck-color-button-on-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-on-active-shadow)}.ck.ck-button.ck-on.ck-disabled,a.ck.ck-button.ck-on.ck-disabled{background:var(--ck-color-button-on-disabled-background)}.ck.ck-button.ck-button-save,a.ck.ck-button.ck-button-save{color:var(--ck-color-button-save)}.ck.ck-button.ck-button-cancel,a.ck.ck-button.ck-button-cancel{color:var(--ck-color-button-cancel)}.ck.ck-button-action,a.ck.ck-button-action{background:var(--ck-color-button-action-background)}.ck.ck-button-action:not(.ck-disabled):hover,a.ck.ck-button-action:not(.ck-disabled):hover{background:var(--ck-color-button-action-hover-background)}.ck.ck-button-action:not(.ck-disabled):active,a.ck.ck-button-action:not(.ck-disabled):active{background:var(--ck-color-button-action-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-action-active-shadow)}.ck.ck-button-action.ck-disabled,a.ck.ck-button-action.ck-disabled{background:var(--ck-color-button-action-disabled-background)}.ck.ck-button-action,a.ck.ck-button-action{color:var(--ck-color-button-action-text)}.ck.ck-button-bold,a.ck.ck-button-bold{font-weight:700}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/button/switchbutton.css":function(e,t){e.exports=".ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{display:block}:root{--ck-switch-button-toggle-width:2.6153846154em;--ck-switch-button-toggle-inner-size:1.0769230769em;--ck-switch-button-toggle-spacing:1px;--ck-switch-button-translation:calc(var(--ck-switch-button-toggle-width) - var(--ck-switch-button-toggle-inner-size) - var(--ck-switch-button-toggle-spacing)*2)}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__label{margin-right:calc(var(--ck-spacing-large)*2)}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__label{margin-left:calc(var(--ck-spacing-large)*2)}.ck.ck-button.ck-switchbutton .ck-button__toggle{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle.ck-rounded-corners{border-radius:var(--ck-border-radius)}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-left:auto}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-right:auto}.ck.ck-button.ck-switchbutton .ck-button__toggle{transition:background .4s ease;width:var(--ck-switch-button-toggle-width);background:var(--ck-color-switch-button-off-background)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner.ck-rounded-corners{border-radius:var(--ck-border-radius);border-radius:calc(var(--ck-border-radius)*0.5)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{margin:var(--ck-switch-button-toggle-spacing);width:var(--ck-switch-button-toggle-inner-size);height:var(--ck-switch-button-toggle-inner-size);background:var(--ck-color-switch-button-inner-background);transition:all .3s ease}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover{background:var(--ck-color-switch-button-off-hover-background)}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover .ck-button__toggle__inner{box-shadow:0 0 0 5px var(--ck-color-switch-button-inner-shadow)}.ck.ck-button.ck-switchbutton.ck-disabled .ck-button__toggle{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle{background:var(--ck-color-switch-button-on-background)}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle:hover{background:var(--ck-color-switch-button-on-hover-background)}[dir=ltr] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(var(--ck-switch-button-translation))}[dir=rtl] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(calc(var(--ck-switch-button-translation)*-1))}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/colorgrid/colorgrid.css":function(e,t){e.exports=".ck.ck-color-grid{display:grid}:root{--ck-color-grid-tile-size:24px;--ck-color-color-grid-check-icon:#000}.ck.ck-color-grid{grid-gap:5px;padding:8px}.ck.ck-color-grid__tile{width:var(--ck-color-grid-tile-size);height:var(--ck-color-grid-tile-size);min-width:var(--ck-color-grid-tile-size);min-height:var(--ck-color-grid-tile-size);padding:0;transition:box-shadow .2s ease;border:0}.ck.ck-color-grid__tile.ck-disabled{cursor:unset;transition:unset}.ck.ck-color-grid__tile.ck-color-table__color-tile_bordered{box-shadow:0 0 0 1px var(--ck-color-base-border)}.ck.ck-color-grid__tile .ck.ck-icon{display:none;color:var(--ck-color-color-grid-check-icon)}.ck.ck-color-grid__tile.ck-on{box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-base-text)}.ck.ck-color-grid__tile.ck-on .ck.ck-icon{display:block}.ck.ck-color-grid__tile.ck-on,.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){border:0}.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-focus-border)}.ck.ck-color-grid__label{padding:0 var(--ck-spacing-standard)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/dropdown.css":function(e,t){e.exports=":root{--ck-dropdown-max-width:75vw}.ck.ck-dropdown{display:inline-block;position:relative}.ck.ck-dropdown .ck-dropdown__arrow{pointer-events:none;z-index:var(--ck-z-default)}.ck.ck-dropdown .ck-button.ck-dropdown__button{width:100%}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on .ck-tooltip{display:none}.ck.ck-dropdown .ck-dropdown__panel{-webkit-backface-visibility:hidden;display:none;z-index:var(--ck-z-modal);max-width:var(--ck-dropdown-max-width);position:absolute}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel-visible{display:inline-block}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw{bottom:100%}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{top:100%;bottom:auto}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se{left:0}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{right:0}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s{left:50%;transform:translateX(-50%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw{left:75%;transform:translateX(-75%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme{left:25%;transform:translateX(-25%)}.ck.ck-toolbar .ck-dropdown__panel{z-index:calc(var(--ck-z-modal) + 1)}:root{--ck-dropdown-arrow-size:calc(var(--ck-icon-size)*0.5)}.ck.ck-dropdown{font-size:inherit}.ck.ck-dropdown .ck-dropdown__arrow{width:var(--ck-dropdown-arrow-size)}[dir=ltr] .ck.ck-dropdown .ck-dropdown__arrow{right:var(--ck-spacing-standard);margin-left:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-dropdown .ck-dropdown__arrow{left:var(--ck-spacing-standard);margin-right:var(--ck-spacing-small)}.ck.ck-dropdown.ck-disabled .ck-dropdown__arrow{opacity:var(--ck-disabled-opacity)}[dir=ltr] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-left:var(--ck-spacing-small)}[dir=rtl] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-right:var(--ck-spacing-small)}.ck.ck-dropdown .ck-button.ck-dropdown__button .ck-button__label{width:7em;overflow:hidden;text-overflow:ellipsis}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on{border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-dropdown__button_label-width_auto .ck-button__label{width:auto}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active{box-shadow:none}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active:focus,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active:focus{box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-dropdown__panel{border-radius:0}.ck-rounded-corners .ck.ck-dropdown__panel,.ck.ck-dropdown__panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-dropdown__panel{box-shadow:var(--ck-drop-shadow),0 0;background:var(--ck-color-dropdown-panel-background);border:1px solid var(--ck-color-dropdown-panel-border);bottom:0;min-width:100%}.ck.ck-dropdown__panel.ck-dropdown__panel_se{border-top-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_sw{border-top-right-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_ne{border-bottom-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_nw{border-bottom-right-radius:0}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/listdropdown.css":function(e,t){e.exports=".ck.ck-dropdown .ck-dropdown__panel .ck-list{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list,.ck.ck-dropdown .ck-dropdown__panel .ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0}.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button,.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button,.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/splitbutton.css":function(e,t){e.exports='.ck.ck-splitbutton{font-size:inherit}.ck.ck-splitbutton .ck-splitbutton__action:focus{z-index:calc(var(--ck-z-default) + 1)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-button .ck-tooltip{display:none}:root{--ck-color-split-button-hover-background:#ebebeb;--ck-color-split-button-hover-border:#b3b3b3}[dir=ltr] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,[dir=ltr] .ck.ck-splitbutton:hover>.ck-splitbutton__action{border-top-right-radius:unset;border-bottom-right-radius:unset}[dir=rtl] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,[dir=rtl] .ck.ck-splitbutton:hover>.ck-splitbutton__action{border-top-left-radius:unset;border-bottom-left-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow{min-width:unset}[dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-top-left-radius:unset;border-bottom-left-radius:unset}[dir=rtl] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-top-right-radius:unset;border-bottom-right-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow svg{width:var(--ck-dropdown-arrow-size)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover),.ck.ck-splitbutton:hover>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover){background:var(--ck-color-split-button-hover-background)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{content:"";position:absolute;width:1px;height:100%;background-color:var(--ck-color-split-button-hover-border)}[dir=ltr] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,[dir=ltr] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{left:-1px}[dir=rtl] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,[dir=rtl] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{right:-1px}.ck.ck-splitbutton.ck-splitbutton_open{border-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__action{border-bottom-left-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__arrow{border-bottom-right-radius:0}'},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css":function(e,t){e.exports=":root{--ck-toolbar-dropdown-max-width:60vw}.ck.ck-toolbar-dropdown>.ck-dropdown__panel{width:max-content;max-width:var(--ck-toolbar-dropdown-max-width)}.ck.ck-toolbar-dropdown>.ck-dropdown__panel .ck-button:focus{z-index:calc(var(--ck-z-default) + 1)}.ck.ck-toolbar-dropdown .ck-toolbar{border:0}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/editorui/editorui.css":function(e,t){e.exports=":root{--ck-color-editable-blur-selection:#d9d9d9}.ck.ck-editor__editable:not(.ck-editor__nested-editable){border-radius:0}.ck-rounded-corners .ck.ck-editor__editable:not(.ck-editor__nested-editable),.ck.ck-editor__editable:not(.ck-editor__nested-editable).ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-editor__editable:not(.ck-editor__nested-editable).ck-focused{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0}.ck.ck-editor__editable_inline{overflow:auto;padding:0 var(--ck-spacing-standard);border:1px solid transparent}.ck.ck-editor__editable_inline[dir=ltr]{text-align:left}.ck.ck-editor__editable_inline[dir=rtl]{text-align:right}.ck.ck-editor__editable_inline>:first-child{margin-top:var(--ck-spacing-large)}.ck.ck-editor__editable_inline>:last-child{margin-bottom:var(--ck-spacing-large)}.ck.ck-editor__editable_inline.ck-blurred ::selection{background:var(--ck-color-editable-blur-selection)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_n]:after{border-bottom-color:var(--ck-color-base-foreground)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_s]:after{border-top-color:var(--ck-color-base-foreground)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/formheader/formheader.css":function(e,t){e.exports=".ck.ck-form__header{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:space-between}:root{--ck-form-header-height:38px}.ck.ck-form__header{padding:var(--ck-spacing-small) var(--ck-spacing-large);height:var(--ck-form-header-height);line-height:var(--ck-form-header-height);border-bottom:1px solid var(--ck-color-base-border)}.ck.ck-form__header .ck-form__header__label{font-weight:700}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/icon/icon.css":function(e,t){e.exports=".ck.ck-icon{vertical-align:middle}:root{--ck-icon-size:calc(var(--ck-line-height-base)*var(--ck-font-size-normal))}.ck.ck-icon{width:var(--ck-icon-size);height:var(--ck-icon-size);font-size:.8333350694em;will-change:transform}.ck.ck-icon,.ck.ck-icon *{color:inherit;cursor:inherit}.ck.ck-icon :not([fill]){fill:currentColor}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/inputtext/inputtext.css":function(e,t){e.exports=":root{--ck-input-text-width:18em}.ck.ck-input-text{border-radius:0}.ck-rounded-corners .ck.ck-input-text,.ck.ck-input-text.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input-text{background:var(--ck-color-input-background);border:1px solid var(--ck-color-input-border);padding:var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);min-width:var(--ck-input-text-width);min-height:var(--ck-ui-component-min-height);transition:box-shadow .1s ease-in-out,border .1s ease-in-out}.ck.ck-input-text:focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-input-text[readonly]{border:1px solid var(--ck-color-input-disabled-border);background:var(--ck-color-input-disabled-background);color:var(--ck-color-input-disabled-text)}.ck.ck-input-text[readonly]:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-input-text.ck-error{border-color:var(--ck-color-input-error-border);animation:ck-text-input-shake .3s ease both}.ck.ck-input-text.ck-error:focus{box-shadow:var(--ck-focus-error-outer-shadow),0 0}@keyframes ck-text-input-shake{20%{transform:translateX(-2px)}40%{transform:translateX(2px)}60%{transform:translateX(-1px)}80%{transform:translateX(1px)}}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/label/label.css":function(e,t){e.exports=".ck.ck-label{display:block}.ck.ck-voice-label{display:none}.ck.ck-label{font-weight:700}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css":function(e,t){e.exports=".ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{display:flex;position:relative}.ck.ck-labeled-field-view .ck.ck-label{display:block;position:absolute}:root{--ck-labeled-field-view-transition:.1s cubic-bezier(0,0,0.24,0.95);--ck-labeled-field-empty-unfocused-max-width:100% - 2 * var(--ck-spacing-medium);--ck-color-labeled-field-label-background:var(--ck-color-base-background)}.ck.ck-labeled-field-view{border-radius:0}.ck-rounded-corners .ck.ck-labeled-field-view,.ck.ck-labeled-field-view.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{width:100%}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{top:0}[dir=ltr] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{left:0}[dir=rtl] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{right:0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{pointer-events:none;transform-origin:0 0;transform:translate(var(--ck-spacing-medium),-6px) scale(.75);background:var(--ck-color-labeled-field-label-background);padding:0 calc(var(--ck-font-size-tiny)*0.5);line-height:normal;font-weight:400;text-overflow:ellipsis;overflow:hidden;max-width:100%;transition:transform var(--ck-labeled-field-view-transition),padding var(--ck-labeled-field-view-transition),background var(--ck-labeled-field-view-transition)}.ck.ck-labeled-field-view.ck-error .ck-input:not([readonly])+.ck.ck-label,.ck.ck-labeled-field-view.ck-error>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view .ck-labeled-field-view__status{font-size:var(--ck-font-size-small);margin-top:var(--ck-spacing-small);white-space:normal}.ck.ck-labeled-field-view .ck-labeled-field-view__status.ck-labeled-field-view__status_error{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view.ck-disabled>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-input-disabled-text)}[dir=ltr] .ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=ltr] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(var(--ck-spacing-medium),calc(var(--ck-font-size-base)*0.6)) scale(1)}[dir=rtl] .ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=rtl] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(calc(var(--ck-spacing-medium)*-1),calc(var(--ck-font-size-base)*0.6)) scale(1)}.ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width));background:transparent;padding:0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck.ck-button{background:transparent}.ck.ck-labeled-field-view.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck-button>.ck-button__label{opacity:0}.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown+.ck-label{max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width) - var(--ck-dropdown-arrow-size) - var(--ck-spacing-standard))}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/list/list.css":function(e,t){e.exports=".ck.ck-list{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:column}.ck.ck-list .ck-list__item,.ck.ck-list .ck-list__separator{display:block}.ck.ck-list .ck-list__item>:focus{position:relative;z-index:var(--ck-z-default)}.ck.ck-list{border-radius:0}.ck-rounded-corners .ck.ck-list,.ck.ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-list{list-style-type:none;background:var(--ck-color-list-background)}.ck.ck-list__item{cursor:default;min-width:12em}.ck.ck-list__item .ck-button{min-height:unset;width:100%;text-align:left;border-radius:0;padding:calc(var(--ck-line-height-base)*0.2*var(--ck-font-size-base)) calc(var(--ck-line-height-base)*0.4*var(--ck-font-size-base))}.ck.ck-list__item .ck-button .ck-button__label{line-height:calc(var(--ck-line-height-base)*1.2*var(--ck-font-size-base))}.ck.ck-list__item .ck-button:active{box-shadow:none}.ck.ck-list__item .ck-button.ck-on{background:var(--ck-color-list-button-on-background);color:var(--ck-color-list-button-on-text)}.ck.ck-list__item .ck-button.ck-on:active{box-shadow:none}.ck.ck-list__item .ck-button.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-on-background-focus)}.ck.ck-list__item .ck-button.ck-on:focus:not(.ck-disabled){border-color:var(--ck-color-base-background)}.ck.ck-list__item .ck-button:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background)}.ck.ck-list__item .ck-switchbutton.ck-on{background:var(--ck-color-list-background);color:inherit}.ck.ck-list__item .ck-switchbutton.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background);color:inherit}.ck.ck-list__separator{height:1px;width:100%;background:var(--ck-color-base-border)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/balloonpanel.css":function(e,t){e.exports=':root{--ck-balloon-panel-arrow-z-index:calc(var(--ck-z-default) - 3)}.ck.ck-balloon-panel{display:none;position:absolute;z-index:var(--ck-z-modal)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{content:"";position:absolute}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_n]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_n]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_s]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_s]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel.ck-balloon-panel_visible{display:block}:root{--ck-balloon-arrow-offset:2px;--ck-balloon-arrow-height:10px;--ck-balloon-arrow-half-width:8px;--ck-balloon-arrow-drop-shadow:0 2px 2px var(--ck-color-shadow-drop)}.ck.ck-balloon-panel{border-radius:0}.ck-rounded-corners .ck.ck-balloon-panel,.ck.ck-balloon-panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-balloon-panel{box-shadow:var(--ck-drop-shadow),0 0;min-height:15px;background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{width:0;height:0;border-style:solid}.ck.ck-balloon-panel[class*=arrow_n]:after,.ck.ck-balloon-panel[class*=arrow_n]:before{border-left-width:var(--ck-balloon-arrow-half-width);border-bottom-width:var(--ck-balloon-arrow-height);border-right-width:var(--ck-balloon-arrow-half-width);border-top-width:0}.ck.ck-balloon-panel[class*=arrow_n]:before{border-bottom-color:var(--ck-color-panel-border)}.ck.ck-balloon-panel[class*=arrow_n]:after,.ck.ck-balloon-panel[class*=arrow_n]:before{border-left-color:transparent;border-right-color:transparent;border-top-color:transparent}.ck.ck-balloon-panel[class*=arrow_n]:after{border-bottom-color:var(--ck-color-panel-background);margin-top:var(--ck-balloon-arrow-offset)}.ck.ck-balloon-panel[class*=arrow_s]:after,.ck.ck-balloon-panel[class*=arrow_s]:before{border-left-width:var(--ck-balloon-arrow-half-width);border-bottom-width:0;border-right-width:var(--ck-balloon-arrow-half-width);border-top-width:var(--ck-balloon-arrow-height)}.ck.ck-balloon-panel[class*=arrow_s]:before{border-top-color:var(--ck-color-panel-border);filter:drop-shadow(var(--ck-balloon-arrow-drop-shadow))}.ck.ck-balloon-panel[class*=arrow_s]:after,.ck.ck-balloon-panel[class*=arrow_s]:before{border-left-color:transparent;border-bottom-color:transparent;border-right-color:transparent}.ck.ck-balloon-panel[class*=arrow_s]:after{border-top-color:var(--ck-color-panel-background);margin-bottom:var(--ck-balloon-arrow-offset)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:before{left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:before{left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:before{right:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:before{left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:before{left:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:before{right:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:before{right:25%;margin-right:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:before{left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2);bottom:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:before{right:25%;margin-right:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:before{left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}'},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/balloonrotator.css":function(e,t){e.exports=".ck .ck-balloon-rotator__navigation{display:flex;align-items:center;justify-content:center}.ck .ck-balloon-rotator__content .ck-toolbar{justify-content:center}.ck .ck-balloon-rotator__navigation{background:var(--ck-color-toolbar-background);border-bottom:1px solid var(--ck-color-toolbar-border);padding:0 var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation>*{margin-right:var(--ck-spacing-small);margin-top:var(--ck-spacing-small);margin-bottom:var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation .ck-balloon-rotator__counter{margin-right:var(--ck-spacing-standard);margin-left:var(--ck-spacing-small)}.ck .ck-balloon-rotator__content .ck.ck-annotation-wrapper{box-shadow:none}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/fakepanel.css":function(e,t){e.exports=".ck .ck-fake-panel{position:absolute;z-index:calc(var(--ck-z-modal) - 1)}.ck .ck-fake-panel div{position:absolute}.ck .ck-fake-panel div:first-child{z-index:2}.ck .ck-fake-panel div:nth-child(2){z-index:1}:root{--ck-balloon-fake-panel-offset-horizontal:6px;--ck-balloon-fake-panel-offset-vertical:6px}.ck .ck-fake-panel div{box-shadow:var(--ck-drop-shadow),0 0;min-height:15px;background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border);border-radius:var(--ck-border-radius);width:100%;height:100%}.ck .ck-fake-panel div:first-child{margin-left:var(--ck-balloon-fake-panel-offset-horizontal);margin-top:var(--ck-balloon-fake-panel-offset-vertical)}.ck .ck-fake-panel div:nth-child(2){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*2);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*2)}.ck .ck-fake-panel div:nth-child(3){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*3);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*3)}.ck .ck-balloon-panel_arrow_s+.ck-fake-panel,.ck .ck-balloon-panel_arrow_se+.ck-fake-panel,.ck .ck-balloon-panel_arrow_sw+.ck-fake-panel{--ck-balloon-fake-panel-offset-vertical:-6px}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/stickypanel.css":function(e,t){e.exports=".ck.ck-sticky-panel .ck-sticky-panel__content_sticky{z-index:var(--ck-z-modal);position:fixed;top:0}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky_bottom-limit{top:auto;position:absolute}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky{box-shadow:var(--ck-drop-shadow),0 0;border-width:0 1px 1px;border-top-left-radius:0;border-top-right-radius:0}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css":function(e,t){e.exports=".ck.ck-block-toolbar-button{position:absolute;z-index:var(--ck-z-default)}:root{--ck-color-block-toolbar-button:var(--ck-color-text);--ck-block-toolbar-button-size:var(--ck-font-size-normal)}.ck.ck-block-toolbar-button{color:var(--ck-color-block-toolbar-button);font-size:var(--ck-block-toolbar-size)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/toolbar/toolbar.css":function(e,t){e.exports=".ck.ck-toolbar{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-flow:row nowrap;align-items:center}.ck.ck-toolbar>.ck-toolbar__items{display:flex;flex-flow:row wrap;align-items:center;flex-grow:1}.ck.ck-toolbar .ck.ck-toolbar__separator{display:inline-block}.ck.ck-toolbar .ck.ck-toolbar__separator:first-child,.ck.ck-toolbar .ck.ck-toolbar__separator:last-child{display:none}.ck.ck-toolbar .ck-toolbar__line-break{flex-basis:100%}.ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items{flex-direction:column}.ck.ck-toolbar.ck-toolbar_floating>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck-dropdown__button .ck-dropdown__arrow{display:none}.ck.ck-toolbar{border-radius:0}.ck-rounded-corners .ck.ck-toolbar,.ck.ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-toolbar{background:var(--ck-color-toolbar-background);padding:0 var(--ck-spacing-small);border:1px solid var(--ck-color-toolbar-border)}.ck.ck-toolbar .ck.ck-toolbar__separator{align-self:stretch;width:1px;min-width:1px;background:var(--ck-color-toolbar-border);margin-top:var(--ck-spacing-small);margin-bottom:var(--ck-spacing-small)}.ck.ck-toolbar .ck-toolbar__line-break{height:0}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break){margin-right:var(--ck-spacing-small)}.ck.ck-toolbar>.ck-toolbar__items:empty+.ck.ck-toolbar__separator{display:none}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break),.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown{margin-top:var(--ck-spacing-small);margin-bottom:var(--ck-spacing-small)}.ck.ck-toolbar.ck-toolbar_vertical{padding:0}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items>.ck{width:100%;margin:0;border-radius:0;border:0}.ck.ck-toolbar.ck-toolbar_compact{padding:0}.ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>*{margin:0}.ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>:not(:first-child):not(:last-child){border-radius:0}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck.ck-button.ck-dropdown__button{padding-left:var(--ck-spacing-tiny)}.ck-toolbar-container .ck.ck-toolbar{border:0}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck{margin-right:0}.ck.ck-toolbar[dir=rtl]:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-left:0}.ck.ck-toolbar[dir=rtl].ck-toolbar_compact>.ck-toolbar__items>.ck:first-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.ck.ck-toolbar[dir=rtl].ck-toolbar_compact>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.ck.ck-toolbar[dir=rtl]>.ck.ck-toolbar__separator,[dir=rtl] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=rtl].ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=rtl] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child){margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=ltr]>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-right:0}.ck.ck-toolbar[dir=ltr].ck-toolbar_compact>.ck-toolbar__items>.ck:first-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ck.ck-toolbar[dir=ltr].ck-toolbar_compact>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.ck.ck-toolbar[dir=ltr]>.ck.ck-toolbar__separator,[dir=ltr] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-right:var(--ck-spacing-small)}.ck.ck-toolbar[dir=ltr].ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=ltr] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child){margin-right:var(--ck-spacing-small)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/tooltip/tooltip.css":function(e,t){e.exports='.ck.ck-tooltip,.ck.ck-tooltip .ck-tooltip__text:after{position:absolute;pointer-events:none;-webkit-backface-visibility:hidden}.ck.ck-tooltip{visibility:hidden;opacity:0;display:none;z-index:var(--ck-z-modal)}.ck.ck-tooltip .ck-tooltip__text{display:inline-block}.ck.ck-tooltip .ck-tooltip__text:after{content:"";width:0;height:0}:root{--ck-tooltip-arrow-size:5px}.ck.ck-tooltip{left:50%;top:0;transition:opacity .2s ease-in-out .2s}.ck.ck-tooltip .ck-tooltip__text{border-radius:0}.ck-rounded-corners .ck.ck-tooltip .ck-tooltip__text,.ck.ck-tooltip .ck-tooltip__text.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-tooltip .ck-tooltip__text{font-size:.9em;line-height:1.5;color:var(--ck-color-tooltip-text);padding:var(--ck-spacing-small) var(--ck-spacing-medium);background:var(--ck-color-tooltip-background);position:relative;left:-50%}.ck.ck-tooltip .ck-tooltip__text:after{transition:opacity .2s ease-in-out .2s;border-style:solid;left:50%}.ck.ck-tooltip.ck-tooltip_s,.ck.ck-tooltip.ck-tooltip_se,.ck.ck-tooltip.ck-tooltip_sw{bottom:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateY(100%)}.ck.ck-tooltip.ck-tooltip_s .ck-tooltip__text:after,.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text:after,.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text:after{top:calc(var(--ck-tooltip-arrow-size)*-1 + 1px);transform:translateX(-50%);border-left-color:transparent;border-bottom-color:var(--ck-color-tooltip-background);border-right-color:transparent;border-top-color:transparent;border-left-width:var(--ck-tooltip-arrow-size);border-bottom-width:var(--ck-tooltip-arrow-size);border-right-width:var(--ck-tooltip-arrow-size);border-top-width:0}.ck.ck-tooltip.ck-tooltip_sw{right:50%;left:auto}.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text{left:auto;right:calc(var(--ck-tooltip-arrow-size)*-2)}.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text:after{left:auto;right:0}.ck.ck-tooltip.ck-tooltip_se{left:50%;right:auto}.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text{right:auto;left:calc(var(--ck-tooltip-arrow-size)*-2)}.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text:after{right:auto;left:0;transform:translateX(50%)}.ck.ck-tooltip.ck-tooltip_n{top:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateY(-100%)}.ck.ck-tooltip.ck-tooltip_n .ck-tooltip__text:after{bottom:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateX(-50%);border-left-color:transparent;border-bottom-color:transparent;border-right-color:transparent;border-top-color:var(--ck-color-tooltip-background);border-left-width:var(--ck-tooltip-arrow-size);border-bottom-width:0;border-right-width:var(--ck-tooltip-arrow-size);border-top-width:var(--ck-tooltip-arrow-size)}.ck.ck-tooltip.ck-tooltip_e{left:calc(100% + var(--ck-tooltip-arrow-size));top:50%}.ck.ck-tooltip.ck-tooltip_e .ck-tooltip__text{left:0;transform:translateY(-50%)}.ck.ck-tooltip.ck-tooltip_e .ck-tooltip__text:after{left:calc(var(--ck-tooltip-arrow-size)*-1);top:calc(50% - var(--ck-tooltip-arrow-size)*1);border-left-color:transparent;border-bottom-color:transparent;border-right-color:var(--ck-color-tooltip-background);border-top-color:transparent;border-left-width:0;border-bottom-width:var(--ck-tooltip-arrow-size);border-right-width:var(--ck-tooltip-arrow-size);border-top-width:var(--ck-tooltip-arrow-size)}.ck.ck-tooltip.ck-tooltip_w{right:calc(100% + var(--ck-tooltip-arrow-size));left:auto;top:50%}.ck.ck-tooltip.ck-tooltip_w .ck-tooltip__text{left:0;transform:translateY(-50%)}.ck.ck-tooltip.ck-tooltip_w .ck-tooltip__text:after{left:100%;top:calc(50% - var(--ck-tooltip-arrow-size)*1);border-left-color:var(--ck-color-tooltip-background);border-bottom-color:transparent;border-right-color:transparent;border-top-color:transparent;border-left-width:var(--ck-tooltip-arrow-size);border-bottom-width:var(--ck-tooltip-arrow-size);border-right-width:0;border-top-width:var(--ck-tooltip-arrow-size)}'},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/globals/globals.css":function(e,t){e.exports=".ck-hidden{display:none!important}.ck.ck-reset,.ck.ck-reset_all,.ck.ck-reset_all *{box-sizing:border-box;width:auto;height:auto;position:static}:root{--ck-z-default:1;--ck-z-modal:calc(var(--ck-z-default) + 999)}.ck-transitions-disabled,.ck-transitions-disabled *{transition:none!important}:root{--ck-color-base-foreground:#fafafa;--ck-color-base-background:#fff;--ck-color-base-border:#c4c4c4;--ck-color-base-action:#61b045;--ck-color-base-focus:#6cb5f9;--ck-color-base-text:#333;--ck-color-base-active:#198cf0;--ck-color-base-active-focus:#0e7fe1;--ck-color-base-error:#db3700;--ck-color-focus-border-coordinates:208,79%,51%;--ck-color-focus-border:hsl(var(--ck-color-focus-border-coordinates));--ck-color-focus-outer-shadow:#bcdefb;--ck-color-focus-disabled-shadow:rgba(119,186,248,0.3);--ck-color-focus-error-shadow:rgba(255,64,31,0.3);--ck-color-text:var(--ck-color-base-text);--ck-color-shadow-drop:rgba(0,0,0,0.15);--ck-color-shadow-drop-active:rgba(0,0,0,0.2);--ck-color-shadow-inner:rgba(0,0,0,0.1);--ck-color-button-default-background:transparent;--ck-color-button-default-hover-background:#e6e6e6;--ck-color-button-default-active-background:#d9d9d9;--ck-color-button-default-active-shadow:#bfbfbf;--ck-color-button-default-disabled-background:transparent;--ck-color-button-on-background:#dedede;--ck-color-button-on-hover-background:#c4c4c4;--ck-color-button-on-active-background:#bababa;--ck-color-button-on-active-shadow:#a1a1a1;--ck-color-button-on-disabled-background:#dedede;--ck-color-button-action-background:var(--ck-color-base-action);--ck-color-button-action-hover-background:#579e3d;--ck-color-button-action-active-background:#53973b;--ck-color-button-action-active-shadow:#498433;--ck-color-button-action-disabled-background:#7ec365;--ck-color-button-action-text:var(--ck-color-base-background);--ck-color-button-save:#008a00;--ck-color-button-cancel:#db3700;--ck-color-switch-button-off-background:#b0b0b0;--ck-color-switch-button-off-hover-background:#a3a3a3;--ck-color-switch-button-on-background:var(--ck-color-button-action-background);--ck-color-switch-button-on-hover-background:#579e3d;--ck-color-switch-button-inner-background:var(--ck-color-base-background);--ck-color-switch-button-inner-shadow:rgba(0,0,0,0.1);--ck-color-dropdown-panel-background:var(--ck-color-base-background);--ck-color-dropdown-panel-border:var(--ck-color-base-border);--ck-color-input-background:var(--ck-color-base-background);--ck-color-input-border:#c7c7c7;--ck-color-input-error-border:var(--ck-color-base-error);--ck-color-input-text:var(--ck-color-base-text);--ck-color-input-disabled-background:#f2f2f2;--ck-color-input-disabled-border:#c7c7c7;--ck-color-input-disabled-text:#757575;--ck-color-list-background:var(--ck-color-base-background);--ck-color-list-button-hover-background:var(--ck-color-button-default-hover-background);--ck-color-list-button-on-background:var(--ck-color-base-active);--ck-color-list-button-on-background-focus:var(--ck-color-base-active-focus);--ck-color-list-button-on-text:var(--ck-color-base-background);--ck-color-panel-background:var(--ck-color-base-background);--ck-color-panel-border:var(--ck-color-base-border);--ck-color-toolbar-background:var(--ck-color-base-foreground);--ck-color-toolbar-border:var(--ck-color-base-border);--ck-color-tooltip-background:var(--ck-color-base-text);--ck-color-tooltip-text:var(--ck-color-base-background);--ck-color-engine-placeholder-text:#707070;--ck-color-upload-bar-background:#6cb5f9;--ck-color-link-default:#0000f0;--ck-color-link-selected-background:rgba(31,177,255,0.1);--ck-color-link-fake-selection:rgba(31,177,255,0.3);--ck-disabled-opacity:.5;--ck-focus-outer-shadow-geometry:0 0 0 3px;--ck-focus-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);--ck-focus-disabled-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);--ck-focus-error-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);--ck-focus-ring:1px solid var(--ck-color-focus-border);--ck-font-size-base:13px;--ck-line-height-base:1.84615;--ck-font-face:Helvetica,Arial,Tahoma,Verdana,Sans-Serif;--ck-font-size-tiny:0.7em;--ck-font-size-small:0.75em;--ck-font-size-normal:1em;--ck-font-size-big:1.4em;--ck-font-size-large:1.8em;--ck-ui-component-min-height:2.3em}.ck.ck-reset,.ck.ck-reset_all,.ck.ck-reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;vertical-align:middle;transition:none;word-wrap:break-word}.ck.ck-reset_all,.ck.ck-reset_all *{border-collapse:collapse;font:normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);color:var(--ck-color-text);text-align:left;white-space:nowrap;cursor:auto;float:none}.ck.ck-reset_all .ck-rtl *{text-align:right}.ck.ck-reset_all iframe{vertical-align:inherit}.ck.ck-reset_all textarea{white-space:pre-wrap}.ck.ck-reset_all input[type=password],.ck.ck-reset_all input[type=text],.ck.ck-reset_all textarea{cursor:text}.ck.ck-reset_all input[type=password][disabled],.ck.ck-reset_all input[type=text][disabled],.ck.ck-reset_all textarea[disabled]{cursor:default}.ck.ck-reset_all fieldset{padding:10px;border:2px groove #dfdee3}.ck.ck-reset_all button::-moz-focus-inner{padding:0;border:0}.ck[dir=rtl],.ck[dir=rtl] .ck{text-align:right}:root{--ck-border-radius:2px;--ck-inner-shadow:2px 2px 3px var(--ck-color-shadow-inner) inset;--ck-drop-shadow:0 1px 2px 1px var(--ck-color-shadow-drop);--ck-drop-shadow-active:0 3px 6px 1px var(--ck-color-shadow-drop-active);--ck-spacing-unit:0.6em;--ck-spacing-large:calc(var(--ck-spacing-unit)*1.5);--ck-spacing-standard:var(--ck-spacing-unit);--ck-spacing-medium:calc(var(--ck-spacing-unit)*0.8);--ck-spacing-small:calc(var(--ck-spacing-unit)*0.5);--ck-spacing-tiny:calc(var(--ck-spacing-unit)*0.3);--ck-spacing-extra-tiny:calc(var(--ck-spacing-unit)*0.16)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-widget/theme/widget.css":function(e,t){e.exports=":root{--ck-color-resizer:var(--ck-color-focus-border);--ck-color-resizer-tooltip-background:#262626;--ck-color-resizer-tooltip-text:#f2f2f2;--ck-resizer-border-radius:var(--ck-border-radius);--ck-resizer-tooltip-offset:10px;--ck-resizer-tooltip-height:calc(var(--ck-spacing-small)*2 + 10px)}.ck .ck-widget,.ck .ck-widget.ck-widget_with-selection-handle{position:relative}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{position:absolute}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{display:block}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle{visibility:visible}.ck .ck-size-view{background:var(--ck-color-resizer-tooltip-background);color:var(--ck-color-resizer-tooltip-text);border:1px solid var(--ck-color-resizer-tooltip-text);border-radius:var(--ck-resizer-border-radius);font-size:var(--ck-font-size-tiny);display:block;padding:0 var(--ck-spacing-small);height:var(--ck-resizer-tooltip-height);line-height:var(--ck-resizer-tooltip-height)}.ck .ck-size-view.ck-orientation-above-center,.ck .ck-size-view.ck-orientation-bottom-left,.ck .ck-size-view.ck-orientation-bottom-right,.ck .ck-size-view.ck-orientation-top-left,.ck .ck-size-view.ck-orientation-top-right{position:absolute}.ck .ck-size-view.ck-orientation-top-left{top:var(--ck-resizer-tooltip-offset);left:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-top-right{top:var(--ck-resizer-tooltip-offset);right:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-right{bottom:var(--ck-resizer-tooltip-offset);right:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-left{bottom:var(--ck-resizer-tooltip-offset);left:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-above-center{top:calc(var(--ck-resizer-tooltip-height)*-1);left:50%;transform:translate(-50%)}:root{--ck-widget-outline-thickness:3px;--ck-widget-handler-icon-size:16px;--ck-widget-handler-animation-duration:200ms;--ck-widget-handler-animation-curve:ease;--ck-color-widget-blurred-border:#dedede;--ck-color-widget-hover-border:#ffc83d;--ck-color-widget-editable-focus-background:var(--ck-color-base-background);--ck-color-widget-drag-handler-icon-color:var(--ck-color-base-background)}.ck .ck-widget{outline-width:var(--ck-widget-outline-thickness);outline-style:solid;outline-color:transparent;transition:outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_selected,.ck .ck-widget.ck-widget_selected:hover{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border)}.ck .ck-widget:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-editor__nested-editable{border:1px solid transparent}.ck .ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck .ck-editor__nested-editable:focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;background-color:var(--ck-color-widget-editable-focus-background)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{padding:4px;box-sizing:border-box;background-color:transparent;opacity:0;transition:background-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),visibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);border-radius:var(--ck-border-radius) var(--ck-border-radius) 0 0;transform:translateY(-100%);left:calc(0px - var(--ck-widget-outline-thickness));top:0}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{width:var(--ck-widget-handler-icon-size);height:var(--ck-widget-handler-icon-size);color:var(--ck-color-widget-drag-handler-icon-color)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:0;transition:opacity .3s var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover .ck-icon .ck-icon__selected-indicator{opacity:1}.ck .ck-widget.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle{opacity:1;background-color:var(--ck-color-widget-hover-border)}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{opacity:1;background-color:var(--ck-color-focus-border)}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:1}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{left:auto;right:calc(0px - var(--ck-widget-outline-thickness))}.ck.ck-editor__editable.ck-read-only .ck-widget{transition:none}.ck.ck-editor__editable.ck-read-only .ck-widget:not(.ck-widget_selected){--ck-widget-outline-thickness:0px}.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover{outline-color:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle>.ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle>.ck-widget__selection-handle:hover,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover.ck-widget_with-selection-handle>.ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover.ck-widget_with-selection-handle>.ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable>.ck-widget.ck-widget_with-selection-handle:first-child,.ck.ck-editor__editable blockquote>.ck-widget.ck-widget_with-selection-handle:first-child{margin-top:calc(1em + var(--ck-widget-handler-icon-size))}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-widget/theme/widgetresize.css":function(e,t){e.exports=".ck .ck-widget_with-resizer{position:relative}.ck .ck-widget__resizer{display:none;position:absolute;pointer-events:none;left:0;top:0}.ck-focused .ck-widget_with-resizer.ck-widget_selected>.ck-widget__resizer{display:block}.ck .ck-widget__resizer__handle{position:absolute;pointer-events:all}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{cursor:nwse-resize}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{cursor:nesw-resize}:root{--ck-resizer-size:10px;--ck-resizer-offset:calc(var(--ck-resizer-size)/-2 - 2px);--ck-resizer-border-width:1px}.ck .ck-widget__resizer{outline:1px solid var(--ck-color-resizer)}.ck .ck-widget__resizer__handle{width:var(--ck-resizer-size);height:var(--ck-resizer-size);background:var(--ck-color-focus-border);border:var(--ck-resizer-border-width) solid #fff;border-radius:var(--ck-resizer-border-radius)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{top:var(--ck-resizer-offset);left:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{top:var(--ck-resizer-offset);right:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right{bottom:var(--ck-resizer-offset);right:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left{bottom:var(--ck-resizer-offset);left:var(--ck-resizer-offset)}"},"./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-widget/theme/widgettypearound.css":function(e,t){e.exports='.ck .ck-widget .ck-widget__type-around__button{display:block;position:absolute;overflow:hidden;z-index:var(--ck-z-default)}.ck .ck-widget .ck-widget__type-around__button svg{position:absolute;top:50%;left:50%;z-index:calc(var(--ck-z-default) + 2)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_before{top:calc(var(--ck-widget-outline-thickness)*-0.5);left:min(10%,30px);transform:translateY(-50%)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_after{bottom:calc(var(--ck-widget-outline-thickness)*-0.5);right:min(10%,30px);transform:translateY(50%)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{content:"";display:block;position:absolute;top:1px;left:1px;z-index:calc(var(--ck-z-default) + 1)}.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__fake-caret{display:none;position:absolute;left:0;right:0}.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__fake-caret{left:calc(var(--ck-widget-outline-thickness)*-1);right:calc(var(--ck-widget-outline-thickness)*-1)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__fake-caret{top:calc(var(--ck-widget-outline-thickness)*-1 - 1px);display:block}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__fake-caret{bottom:calc(var(--ck-widget-outline-thickness)*-1 - 1px);display:block}.ck.ck-editor__editable.ck-read-only .ck-widget__type-around,.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around,.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around{display:none}:root{--ck-widget-type-around-button-size:20px;--ck-color-widget-type-around-button-active:var(--ck-color-focus-border);--ck-color-widget-type-around-button-hover:var(--ck-color-widget-hover-border);--ck-color-widget-type-around-button-blurred-editable:var(--ck-color-widget-blurred-border);--ck-color-widget-type-around-button-radar-start-alpha:0;--ck-color-widget-type-around-button-radar-end-alpha:.3;--ck-color-widget-type-around-button-icon:var(--ck-color-base-background)}.ck .ck-widget .ck-widget__type-around__button{width:var(--ck-widget-type-around-button-size);height:var(--ck-widget-type-around-button-size);background:var(--ck-color-widget-type-around-button);border-radius:100px;transition:opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);opacity:0;pointer-events:none}.ck .ck-widget .ck-widget__type-around__button svg{width:10px;height:8px;transform:translate(-50%,-50%);transition:transform .5s ease;margin-top:1px}.ck .ck-widget .ck-widget__type-around__button svg *{stroke-dasharray:10;stroke-dashoffset:0;fill:none;stroke:var(--ck-color-widget-type-around-button-icon);stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.ck .ck-widget .ck-widget__type-around__button svg line{stroke-dasharray:7}.ck .ck-widget .ck-widget__type-around__button:hover{animation:ck-widget-type-around-button-sonar 1s ease infinite}.ck .ck-widget .ck-widget__type-around__button:hover svg polyline{animation:ck-widget-type-around-arrow-dash 2s linear}.ck .ck-widget .ck-widget__type-around__button:hover svg line{animation:ck-widget-type-around-arrow-tip-dash 2s linear}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:1;pointer-events:auto}.ck .ck-widget:not(.ck-widget_selected)>.ck-widget__type-around>.ck-widget__type-around__button{background:var(--ck-color-widget-type-around-button-hover)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover{background:var(--ck-color-widget-type-around-button-active)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{width:calc(var(--ck-widget-type-around-button-size) - 2px);height:calc(var(--ck-widget-type-around-button-size) - 2px);border-radius:100px;background:linear-gradient(135deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.3))}.ck .ck-widget.ck-widget_with-selection-handle>.ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:20px}.ck .ck-widget .ck-widget__type-around__fake-caret{pointer-events:none;height:1px;animation:ck-widget-type-around-fake-caret-pulse 1s linear infinite normal forwards;outline:1px solid hsla(0,0%,100%,.5);background:var(--ck-color-base-text)}.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_after,.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_before{outline-color:transparent}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected:hover,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{opacity:0}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer{opacity:0}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:0;margin-right:20px}.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover){background:var(--ck-color-widget-type-around-button-blurred-editable)}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover) svg *{stroke:#999}@keyframes ck-widget-type-around-arrow-dash{0%{stroke-dashoffset:10}20%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-arrow-tip-dash{0%,20%{stroke-dashoffset:7}40%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-button-sonar{0%{box-shadow:0 0 0 0 hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}50%{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-end-alpha))}to{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}}@keyframes ck-widget-type-around-fake-caret-pulse{0%{opacity:1}49%{opacity:1}50%{opacity:0}99%{opacity:0}to{opacity:1}}'},"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":function(e,t,o){"use strict";var i,r=function(){return void 0===i&&(i=Boolean(window&&document&&document.all&&!window.atob)),i},s=function(){var e={};return function(t){if(void 0===e[t]){var o=document.querySelector(t);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement)try{o=o.contentDocument.head}catch(e){o=null}e[t]=o}return e[t]}}(),n=[];function a(e){for(var t=-1,o=0;o<n.length;o++)if(n[o].identifier===e){t=o;break}return t}function c(e,t){for(var o={},i=[],r=0;r<e.length;r++){var s=e[r],c=t.base?s[0]+t.base:s[0],l=o[c]||0,d="".concat(c," ").concat(l);o[c]=l+1;var u=a(d),h={css:s[1],media:s[2],sourceMap:s[3]};-1!==u?(n[u].references++,n[u].updater(h)):n.push({identifier:d,updater:m(h,t),references:1}),i.push(d)}return i}function l(e){var t=document.createElement("style"),i=e.attributes||{};if(void 0===i.nonce){var r=o.nc;r&&(i.nonce=r)}if(Object.keys(i).forEach((function(e){t.setAttribute(e,i[e])})),"function"==typeof e.insert)e.insert(t);else{var n=s(e.insert||"head");if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");n.appendChild(t)}return t}var d,u=(d=[],function(e,t){return d[e]=t,d.filter(Boolean).join("\n")});function h(e,t,o,i){var r=o?"":i.media?"@media ".concat(i.media," {").concat(i.css,"}"):i.css;if(e.styleSheet)e.styleSheet.cssText=u(t,r);else{var s=document.createTextNode(r),n=e.childNodes;n[t]&&e.removeChild(n[t]),n.length?e.insertBefore(s,n[t]):e.appendChild(s)}}function p(e,t,o){var i=o.css,r=o.media,s=o.sourceMap;if(r?e.setAttribute("media",r):e.removeAttribute("media"),s&&"undefined"!=typeof btoa&&(i+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(s))))," */")),e.styleSheet)e.styleSheet.cssText=i;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(i))}}var g=null,f=0;function m(e,t){var o,i,r;if(t.singleton){var s=f++;o=g||(g=l(t)),i=h.bind(null,o,s,!1),r=h.bind(null,o,s,!0)}else o=l(t),i=p.bind(null,o,t),r=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(o)};return i(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;i(e=t)}else r()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=r());var o=c(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var i=0;i<o.length;i++){var r=a(o[i]);n[r].references--}for(var s=c(e,t),l=0;l<o.length;l++){var d=a(o[l]);0===n[d].references&&(n[d].updater(),n.splice(d,1))}o=s}}}},"./node_modules/webpack/buildin/global.js":function(e,t){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(e){"object"==typeof window&&(o=window)}e.exports=o},"./node_modules/webpack/buildin/harmony-module.js":function(e,t){e.exports=function(e){if(!e.webpackPolyfill){var t=Object.create(e);t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),Object.defineProperty(t,"exports",{enumerable:!0}),t.webpackPolyfill=1}return t}},"./packages/ckeditor5-clipboard/theme/clipboard.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-clipboard/theme/clipboard.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-core/src/command.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-utils/src/observablemixin.js"),r=o("./packages/ckeditor5-utils/src/mix.js");class s{constructor(e){this.editor=e,this.set("value",void 0),this.set("isEnabled",!1),this._disableStack=new Set,this.decorate("execute"),this.listenTo(this.editor.model.document,"change",()=>{this.refresh()}),this.on("execute",e=>{this.isEnabled||e.stop()},{priority:"high"}),this.listenTo(e,"change:isReadOnly",(e,t,o)=>{o?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")})}refresh(){this.isEnabled=!0}forceDisabled(e){this._disableStack.add(e),1==this._disableStack.size&&(this.on("set:isEnabled",n,{priority:"highest"}),this.isEnabled=!1)}clearForceDisabled(e){this._disableStack.delete(e),0==this._disableStack.size&&(this.off("set:isEnabled",n),this.refresh())}execute(){}destroy(){this.stopListening()}}function n(e){e.return=!1,e.stop()}Object(r.a)(s,i.a)},"./packages/ckeditor5-core/src/contextplugin.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-utils/src/observablemixin.js"),r=o("./packages/ckeditor5-utils/src/mix.js");class s{constructor(e){this.context=e}destroy(){this.stopListening()}static get isContextPlugin(){return!0}}Object(r.a)(s,i.a)},"./packages/ckeditor5-core/src/pendingactions.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-core/src/contextplugin.js"),r=o("./packages/ckeditor5-utils/src/observablemixin.js"),s=o("./packages/ckeditor5-utils/src/collection.js"),n=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class a extends i.a{static get pluginName(){return"PendingActions"}init(){this.set("hasAny",!1),this._actions=new s.a({idProperty:"_id"}),this._actions.delegate("add","remove").to(this)}add(e){if("string"!=typeof e)throw new n.a("pendingactions-add-invalid-message",this);const t=Object.create(r.a);return t.set("message",e),this._actions.add(t),this.hasAny=!0,t}remove(e){this._actions.remove(e),this.hasAny=!!this._actions.length}get first(){return this._actions.get(0)}[Symbol.iterator](){return this._actions[Symbol.iterator]()}}},"./packages/ckeditor5-core/src/plugin.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-utils/src/observablemixin.js"),r=o("./packages/ckeditor5-utils/src/mix.js");class s{constructor(e){this.editor=e,this.set("isEnabled",!0),this._disableStack=new Set}forceDisabled(e){this._disableStack.add(e),1==this._disableStack.size&&(this.on("set:isEnabled",n,{priority:"highest"}),this.isEnabled=!1)}clearForceDisabled(e){this._disableStack.delete(e),0==this._disableStack.size&&(this.off("set:isEnabled",n),this.isEnabled=!0)}destroy(){this.stopListening()}static get isContextPlugin(){return!1}}function n(e){e.return=!1,e.stop()}Object(r.a)(s,i.a)},"./packages/ckeditor5-engine/src/controller/datacontroller.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return j}));var i=o("./packages/ckeditor5-utils/src/mix.js"),r=o("./packages/ckeditor5-utils/src/observablemixin.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-engine/src/conversion/mapper.js"),a=o("./packages/ckeditor5-engine/src/conversion/downcastdispatcher.js"),c=o("./packages/ckeditor5-engine/src/conversion/downcasthelpers.js"),l=o("./node_modules/lodash-es/isArray.js");class d{constructor(){this._consumables=new Map}add(e,t){let o;e.is("$text")||e.is("documentFragment")?this._consumables.set(e,!0):(this._consumables.has(e)?o=this._consumables.get(e):(o=new u(e),this._consumables.set(e,o)),o.add(t))}test(e,t){const o=this._consumables.get(e);return void 0===o?null:e.is("$text")||e.is("documentFragment")?o:o.test(t)}consume(e,t){return!!this.test(e,t)&&(e.is("$text")||e.is("documentFragment")?this._consumables.set(e,!1):this._consumables.get(e).consume(t),!0)}revert(e,t){const o=this._consumables.get(e);void 0!==o&&(e.is("$text")||e.is("documentFragment")?this._consumables.set(e,!0):o.revert(t))}static consumablesFromElement(e){const t={element:e,name:!0,attributes:[],classes:[],styles:[]},o=e.getAttributeKeys();for(const e of o)"style"!=e&&"class"!=e&&t.attributes.push(e);const i=e.getClassNames();for(const e of i)t.classes.push(e);const r=e.getStyleNames();for(const e of r)t.styles.push(e);return t}static createFrom(e,t){if(t||(t=new d(e)),e.is("$text"))return t.add(e),t;e.is("element")&&t.add(e,d.consumablesFromElement(e)),e.is("documentFragment")&&t.add(e);for(const o of e.getChildren())t=d.createFrom(o,t);return t}}class u{constructor(e){this.element=e,this._canConsumeName=null,this._consumables={attributes:new Map,styles:new Map,classes:new Map}}add(e){e.name&&(this._canConsumeName=!0);for(const t in this._consumables)t in e&&this._add(t,e[t])}test(e){if(e.name&&!this._canConsumeName)return this._canConsumeName;for(const t in this._consumables)if(t in e){const o=this._test(t,e[t]);if(!0!==o)return o}return!0}consume(e){e.name&&(this._canConsumeName=!1);for(const t in this._consumables)t in e&&this._consume(t,e[t])}revert(e){e.name&&(this._canConsumeName=!0);for(const t in this._consumables)t in e&&this._revert(t,e[t])}_add(e,t){const o=Object(l.a)(t)?t:[t],i=this._consumables[e];for(const t of o){if("attributes"===e&&("class"===t||"style"===t))throw new s.a("viewconsumable-invalid-attribute",this);if(i.set(t,!0),"styles"===e)for(const e of this.element.document.stylesProcessor.getRelatedStyles(t))i.set(e,!0)}}_test(e,t){const o=Object(l.a)(t)?t:[t],i=this._consumables[e];for(const t of o)if("attributes"!==e||"class"!==t&&"style"!==t){const e=i.get(t);if(void 0===e)return null;if(!e)return!1}else{const e="class"==t?"classes":"styles",o=this._test(e,[...this._consumables[e].keys()]);if(!0!==o)return o}return!0}_consume(e,t){const o=Object(l.a)(t)?t:[t],i=this._consumables[e];for(const t of o)if("attributes"!==e||"class"!==t&&"style"!==t){if(i.set(t,!1),"styles"==e)for(const e of this.element.document.stylesProcessor.getRelatedStyles(t))i.set(e,!1)}else{const e="class"==t?"classes":"styles";this._consume(e,[...this._consumables[e].keys()])}}_revert(e,t){const o=Object(l.a)(t)?t:[t],i=this._consumables[e];for(const t of o)if("attributes"!==e||"class"!==t&&"style"!==t){!1===i.get(t)&&i.set(t,!0)}else{const e="class"==t?"classes":"styles";this._revert(e,[...this._consumables[e].keys()])}}}var h=o("./packages/ckeditor5-engine/src/model/range.js"),p=o("./packages/ckeditor5-engine/src/model/position.js"),g=o("./packages/ckeditor5-engine/src/model/schema.js"),f=o("./packages/ckeditor5-engine/src/model/utils/autoparagraphing.js"),m=o("./packages/ckeditor5-utils/src/emittermixin.js");class k{constructor(e={}){this._splitParts=new Map,this._cursorParents=new Map,this._modelCursor=null,this.conversionApi=Object.assign({},e),this.conversionApi.convertItem=this._convertItem.bind(this),this.conversionApi.convertChildren=this._convertChildren.bind(this),this.conversionApi.safeInsert=this._safeInsert.bind(this),this.conversionApi.updateConversionResult=this._updateConversionResult.bind(this),this.conversionApi.splitToAllowedParent=this._splitToAllowedParent.bind(this),this.conversionApi.getSplitParts=this._getSplitParts.bind(this)}convert(e,t,o=["$root"]){this.fire("viewCleanup",e),this._modelCursor=function(e,t){let o;for(const i of new g.a(e)){const e={};for(const t of i.getAttributeKeys())e[t]=i.getAttribute(t);const r=t.createElement(i.name,e);o&&t.append(r,o),o=p.a._createAt(r,0)}return o}(o,t),this.conversionApi.writer=t,this.conversionApi.consumable=d.createFrom(e),this.conversionApi.store={};const{modelRange:i}=this._convertItem(e,this._modelCursor),r=t.createDocumentFragment();if(i){this._removeEmptyElements();for(const e of Array.from(this._modelCursor.parent.getChildren()))t.append(e,r);r.markers=function(e,t){const o=new Set,i=new Map,r=h.a._createIn(e).getItems();for(const e of r)"$marker"==e.name&&o.add(e);for(const e of o){const o=e.getAttribute("data-name"),r=t.createPositionBefore(e);i.has(o)?i.get(o).end=r.clone():i.set(o,new h.a(r.clone())),t.remove(e)}return i}(r,t)}return this._modelCursor=null,this._splitParts.clear(),this._cursorParents.clear(),this.conversionApi.writer=null,this.conversionApi.store=null,r}_convertItem(e,t){const o=Object.assign({viewItem:e,modelCursor:t,modelRange:null});if(e.is("element")?this.fire("element:"+e.name,o,this.conversionApi):e.is("$text")?this.fire("text",o,this.conversionApi):this.fire("documentFragment",o,this.conversionApi),o.modelRange&&!(o.modelRange instanceof h.a))throw new s.a("view-conversion-dispatcher-incorrect-result",this);return{modelRange:o.modelRange,modelCursor:o.modelCursor}}_convertChildren(e,t){let o=t.is("position")?t:p.a._createAt(t,0);const i=new h.a(o);for(const t of Array.from(e.getChildren())){const e=this._convertItem(t,o);e.modelRange instanceof h.a&&(i.end=e.modelRange.end,o=e.modelCursor)}return{modelRange:i,modelCursor:o}}_safeInsert(e,t){const o=this._splitToAllowedParent(e,t);return!!o&&(this.conversionApi.writer.insert(e,o.position),!0)}_updateConversionResult(e,t){const o=this._getSplitParts(e),i=this.conversionApi.writer;t.modelRange||(t.modelRange=i.createRange(i.createPositionBefore(e),i.createPositionAfter(o[o.length-1])));const r=this._cursorParents.get(e);t.modelCursor=r?i.createPositionAt(r,0):t.modelRange.end}_splitToAllowedParent(e,t){const{schema:o,writer:i}=this.conversionApi;let r=o.findAllowedParent(t,e);if(r){if(r===t.parent)return{position:t};this._modelCursor.parent.getAncestors().includes(r)&&(r=null)}if(!r)return Object(f.b)(t,e,o)?{position:Object(f.c)(t,i)}:null;const s=this.conversionApi.writer.split(t,r),n=[];for(const e of s.range.getWalker())if("elementEnd"==e.type)n.push(e.item);else{const t=n.pop(),o=e.item;this._registerSplitPair(t,o)}const a=s.range.end.parent;return this._cursorParents.set(e,a),{position:s.position,cursorParent:a}}_registerSplitPair(e,t){this._splitParts.has(e)||this._splitParts.set(e,[e]);const o=this._splitParts.get(e);this._splitParts.set(t,o),o.push(t)}_getSplitParts(e){let t;return t=this._splitParts.has(e)?this._splitParts.get(e):[e],t}_removeEmptyElements(){let e=!1;for(const t of this._splitParts.keys())t.isEmpty&&(this.conversionApi.writer.remove(t),this._splitParts.delete(t),e=!0);e&&this._removeEmptyElements()}}Object(i.a)(k,m.c);var b=o("./packages/ckeditor5-engine/src/conversion/upcasthelpers.js"),_=o("./packages/ckeditor5-engine/src/view/documentfragment.js"),w=o("./packages/ckeditor5-engine/src/view/document.js"),v=o("./packages/ckeditor5-engine/src/view/downcastwriter.js"),y=o("./packages/ckeditor5-engine/src/dataprocessor/htmldataprocessor.js");class j{constructor(e,t){this.model=e,this.mapper=new n.a,this.downcastDispatcher=new a.a({mapper:this.mapper,schema:e.schema}),this.downcastDispatcher.on("insert:$text",Object(c.e)(),{priority:"lowest"}),this.upcastDispatcher=new k({schema:e.schema}),this.viewDocument=new w.a(t),this.stylesProcessor=t,this.htmlProcessor=new y.a(this.viewDocument),this.processor=this.htmlProcessor,this._viewWriter=new v.a(this.viewDocument),this.upcastDispatcher.on("text",Object(b.b)(),{priority:"lowest"}),this.upcastDispatcher.on("element",Object(b.c)(),{priority:"lowest"}),this.upcastDispatcher.on("documentFragment",Object(b.c)(),{priority:"lowest"}),this.decorate("init"),this.decorate("set"),this.on("init",()=>{this.fire("ready")},{priority:"lowest"}),this.on("ready",()=>{this.model.enqueueChange("transparent",f.a)},{priority:"lowest"})}get(e={}){const{rootName:t="main",trim:o="empty"}=e;if(!this._checkIfRootsExists([t]))throw new s.a("datacontroller-get-non-existent-root",this);const i=this.model.document.getRoot(t);return"empty"!==o||this.model.hasContent(i,{ignoreWhitespaces:!0})?this.stringify(i,e):""}stringify(e,t={}){const o=this.toView(e,t);return this.processor.toData(o)}toView(e,t={}){const o=this.viewDocument,i=this._viewWriter;this.mapper.clearBindings();const r=h.a._createIn(e),s=new _.a(o);this.mapper.bindElements(e,s),this.downcastDispatcher.conversionApi.options=t,this.downcastDispatcher.convertInsert(r,i);const n=e.is("documentFragment")?Array.from(e.markers):function(e){const t=[],o=e.root.document;if(!o)return[];const i=h.a._createIn(e);for(const e of o.model.markers){const o=e.getRange(),r=o.isCollapsed,s=o.start.isEqual(i.start)||o.end.isEqual(i.end);if(r&&s)t.push([e.name,o]);else{const r=i.getIntersection(o);r&&t.push([e.name,r])}}return t}(e);for(const[e,t]of n)this.downcastDispatcher.convertMarkerAdd(e,t,i);return delete this.downcastDispatcher.conversionApi.options,s}init(e){if(this.model.document.version)throw new s.a("datacontroller-init-document-not-empty",this);let t={};if("string"==typeof e?t.main=e:t=e,!this._checkIfRootsExists(Object.keys(t)))throw new s.a("datacontroller-init-non-existent-root",this);return this.model.enqueueChange("transparent",e=>{for(const o of Object.keys(t)){const i=this.model.document.getRoot(o);e.insert(this.parse(t[o],i),i,0)}}),Promise.resolve()}set(e,t={}){let o={};if("string"==typeof e?o.main=e:o=e,!this._checkIfRootsExists(Object.keys(o)))throw new s.a("datacontroller-set-non-existent-root",this);const i=t.batchType||"default";this.model.enqueueChange(i,e=>{e.setSelection(null),e.removeSelectionAttribute(this.model.document.selection.getAttributeKeys());for(const t of Object.keys(o)){const i=this.model.document.getRoot(t);e.remove(e.createRangeIn(i)),e.insert(this.parse(o[t],i),i,0)}})}parse(e,t="$root"){const o=this.processor.toView(e);return this.toModel(o,t)}toModel(e,t="$root"){return this.model.change(o=>this.upcastDispatcher.convert(e,o,t))}addStyleProcessorRules(e){e(this.stylesProcessor)}registerRawContentMatcher(e){this.processor&&this.processor!==this.htmlProcessor&&this.processor.registerRawContentMatcher(e),this.htmlProcessor.registerRawContentMatcher(e)}destroy(){this.stopListening()}_checkIfRootsExists(e){for(const t of e)if(!this.model.document.getRootNames().includes(t))return!1;return!0}}Object(i.a)(j,r.a)},"./packages/ckeditor5-engine/src/controller/editingcontroller.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return Q}));var i=o("./packages/ckeditor5-engine/src/view/editableelement.js");const r=Symbol("rootName");class s extends i.a{constructor(e,t){super(e,t),this.rootName="main"}is(e,t=null){return t?t===this.name&&("rootElement"===e||"view:rootElement"===e||"editableElement"===e||"view:editableElement"===e||"containerElement"===e||"view:containerElement"===e||"element"===e||"view:element"===e):"rootElement"===e||"view:rootElement"===e||"editableElement"===e||"view:editableElement"===e||"containerElement"===e||"view:containerElement"===e||"element"===e||"view:element"===e||"node"===e||"view:node"===e}get rootName(){return this.getCustomProperty(r)}set rootName(e){this._setCustomProperty(r,e)}set _name(e){this.name=e}}var n=o("./packages/ckeditor5-engine/src/view/document.js"),a=o("./packages/ckeditor5-engine/src/view/downcastwriter.js"),c=o("./packages/ckeditor5-engine/src/view/renderer.js"),l=o("./packages/ckeditor5-engine/src/view/domconverter.js"),d=o("./packages/ckeditor5-engine/src/view/position.js"),u=o("./packages/ckeditor5-engine/src/view/range.js"),h=o("./packages/ckeditor5-engine/src/view/selection.js"),p=o("./packages/ckeditor5-engine/src/view/observer/observer.js"),g=o("./packages/ckeditor5-engine/src/view/filler.js"),f=o("./node_modules/lodash-es/_baseIsEqual.js");var m=function(e,t,o){var i=(o="function"==typeof o?o:void 0)?o(e,t):void 0;return void 0===i?Object(f.a)(e,t,void 0,o):!!i};class k extends p.a{constructor(e){super(e),this._config={childList:!0,characterData:!0,characterDataOldValue:!0,subtree:!0},this.domConverter=e.domConverter,this.renderer=e._renderer,this._domElements=[],this._mutationObserver=new window.MutationObserver(this._onMutations.bind(this))}flush(){this._onMutations(this._mutationObserver.takeRecords())}observe(e){this._domElements.push(e),this.isEnabled&&this._mutationObserver.observe(e,this._config)}enable(){super.enable();for(const e of this._domElements)this._mutationObserver.observe(e,this._config)}disable(){super.disable(),this._mutationObserver.disconnect()}destroy(){super.destroy(),this._mutationObserver.disconnect()}_onMutations(e){if(0===e.length)return;const t=this.domConverter,o=new Map,i=new Set;for(const o of e)if("childList"===o.type){const e=t.mapDomToView(o.target);if(e&&(e.is("uiElement")||e.is("rawElement")))continue;e&&!this._isBogusBrMutation(o)&&i.add(e)}for(const r of e){const e=t.mapDomToView(r.target);if((!e||!e.is("uiElement")&&!e.is("rawElement"))&&"characterData"===r.type){const e=t.findCorrespondingViewText(r.target);e&&!i.has(e.parent)?o.set(e,{type:"text",oldText:e.data,newText:Object(g.f)(r.target),node:e}):!e&&Object(g.i)(r.target)&&i.add(t.mapDomToView(r.target.parentNode))}}const r=[];for(const e of o.values())this.renderer.markToSync("text",e.node),r.push(e);for(const e of i){const o=t.mapViewToDom(e),i=Array.from(e.getChildren()),s=Array.from(t.domChildrenToView(o,{withChildren:!1}));m(i,s,a)||(this.renderer.markToSync("children",e),r.push({type:"children",oldChildren:i,newChildren:s,node:e}))}const s=e[0].target.ownerDocument.getSelection();let n=null;if(s&&s.anchorNode){const e=t.domPositionToView(s.anchorNode,s.anchorOffset),o=t.domPositionToView(s.focusNode,s.focusOffset);e&&o&&(n=new h.a(e),n.setFocus(o))}function a(e,t){if(!Array.isArray(e))return e===t||!(!e.is("$text")||!t.is("$text"))&&e.data===t.data}r.length&&(this.document.fire("mutations",r,n),this.view.forceRender())}_isBogusBrMutation(e){let t=null;return null===e.nextSibling&&0===e.removedNodes.length&&1==e.addedNodes.length&&(t=this.domConverter.domToView(e.addedNodes[0],{withChildren:!1})),t&&t.is("element","br")}}var b=o("./packages/ckeditor5-engine/src/view/observer/domeventobserver.js"),_=o("./packages/ckeditor5-utils/src/keyboard.js");class w extends b.a{constructor(e){super(e),this.domEventType=["keydown","keyup"]}onDomEvent(e){this.fire(e.type,e,{keyCode:e.keyCode,altKey:e.altKey,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,metaKey:e.metaKey,get keystroke(){return Object(_.a)(this)}})}}var v=o("./node_modules/lodash-es/debounce.js");class y extends p.a{constructor(e){super(e),this._fireSelectionChangeDoneDebounced=Object(v.a)(e=>this.document.fire("selectionChangeDone",e),200)}observe(){const e=this.document;e.on("arrowKey",(t,o)=>{e.selection.isFake&&this.isEnabled&&o.preventDefault()},{context:"$capture"}),e.on("arrowKey",(t,o)=>{e.selection.isFake&&this.isEnabled&&this._handleSelectionMove(o.keyCode)},{priority:"lowest"})}destroy(){super.destroy(),this._fireSelectionChangeDoneDebounced.cancel()}_handleSelectionMove(e){const t=this.document.selection,o=new h.a(t.getRanges(),{backward:t.isBackward,fake:!1});e!=_.f.arrowleft&&e!=_.f.arrowup||o.setTo(o.getFirstPosition()),e!=_.f.arrowright&&e!=_.f.arrowdown||o.setTo(o.getLastPosition());const i={oldSelection:t,newSelection:o,domSelection:null};this.document.fire("selectionChange",i),this._fireSelectionChangeDoneDebounced(i)}}class j extends p.a{constructor(e){super(e),this.mutationObserver=e.getObserver(k),this.selection=this.document.selection,this.domConverter=e.domConverter,this._documents=new WeakSet,this._fireSelectionChangeDoneDebounced=Object(v.a)(e=>this.document.fire("selectionChangeDone",e),200),this._clearInfiniteLoopInterval=setInterval(()=>this._clearInfiniteLoop(),1e3),this._loopbackCounter=0}observe(e){const t=e.ownerDocument;this._documents.has(t)||(this.listenTo(t,"selectionchange",(e,o)=>{this._handleSelectionChange(o,t)}),this._documents.add(t))}destroy(){super.destroy(),clearInterval(this._clearInfiniteLoopInterval),this._fireSelectionChangeDoneDebounced.cancel()}_handleSelectionChange(e,t){if(!this.isEnabled)return;const o=t.defaultView.getSelection();if(this.checkShouldIgnoreEventFromTarget(o.anchorNode))return;this.mutationObserver.flush();const i=this.domConverter.domSelectionToView(o);if(0!=i.rangeCount){if(this.view.hasDomSelection=!0,!(this.selection.isEqual(i)&&this.domConverter.isDomSelectionCorrect(o)||++this._loopbackCounter>60))if(this.selection.isSimilar(i))this.view.forceRender();else{const e={oldSelection:this.selection,newSelection:i,domSelection:o};this.document.fire("selectionChange",e),this._fireSelectionChangeDoneDebounced(e)}}else this.view.hasDomSelection=!1}_clearInfiniteLoop(){this._loopbackCounter=0}}class x extends b.a{constructor(e){super(e),this.domEventType=["focus","blur"],this.useCapture=!0;const t=this.document;t.on("focus",()=>{t.isFocused=!0,this._renderTimeoutId=setTimeout(()=>e.change(()=>{}),50)}),t.on("blur",(o,i)=>{const r=t.selection.editableElement;null!==r&&r!==i.target||(t.isFocused=!1,e.change(()=>{}))})}onDomEvent(e){this.fire(e.type,e)}destroy(){this._renderTimeoutId&&clearTimeout(this._renderTimeoutId),super.destroy()}}class P extends b.a{constructor(e){super(e),this.domEventType=["compositionstart","compositionupdate","compositionend"];const t=this.document;t.on("compositionstart",()=>{t.isComposing=!0}),t.on("compositionend",()=>{t.isComposing=!1})}onDomEvent(e){this.fire(e.type,e)}}class O extends b.a{constructor(e){super(e),this.domEventType=["beforeinput"]}onDomEvent(e){this.fire(e.type,e)}}var A=o("./packages/ckeditor5-engine/src/view/observer/bubblingeventinfo.js"),T=o("./packages/ckeditor5-utils/src/index.js");class C extends p.a{constructor(e){super(e),this.document.on("keydown",(e,t)=>{if(this.isEnabled&&Object(T.v)(t.keyCode)){const o=new A.a(this.document,"arrowKey",this.document.selection.getFirstRange());this.document.fire(o,t),o.stop.called&&e.stop()}})}observe(){}}var E=o("./packages/ckeditor5-utils/src/observablemixin.js"),S=o("./packages/ckeditor5-utils/src/mix.js"),R=o("./packages/ckeditor5-utils/src/dom/isrange.js"),M=o("./packages/ckeditor5-utils/src/dom/rect.js"),N=o("./packages/ckeditor5-utils/src/dom/istext.js");function I({target:e,viewportOffset:t=0}){const o=W(e);let i=o,r=null;for(;i;){let s;s=H(i==o?e:r),V(s,()=>q(e,i));const n=q(e,i);if(z(i,n,t),i.parent!=i){if(r=i.frameElement,i=i.parent,!r)return}else i=null}}function z(e,t,o){const i=t.clone().moveBy(0,o),r=t.clone().moveBy(0,-o),s=new M.a(e).excludeScrollbarsAndBorders();if(![r,i].every(e=>s.contains(e))){let{scrollX:n,scrollY:a}=e;B(r,s)?a-=s.top-t.top+o:D(i,s)&&(a+=t.bottom-s.bottom+o),F(t,s)?n-=s.left-t.left+o:L(t,s)&&(n+=t.right-s.right+o),e.scrollTo(n,a)}}function V(e,t){const o=W(e);let i,r;for(;e!=o.document.body;)r=t(),i=new M.a(e).excludeScrollbarsAndBorders(),i.contains(r)||(B(r,i)?e.scrollTop-=i.top-r.top:D(r,i)&&(e.scrollTop+=r.bottom-i.bottom),F(r,i)?e.scrollLeft-=i.left-r.left:L(r,i)&&(e.scrollLeft+=r.right-i.right)),e=e.parentNode}function D(e,t){return e.bottom>t.bottom}function B(e,t){return e.top<t.top}function F(e,t){return e.left<t.left}function L(e,t){return e.right>t.right}function W(e){return Object(R.a)(e)?e.startContainer.ownerDocument.defaultView:e.ownerDocument.defaultView}function H(e){if(Object(R.a)(e)){let t=e.commonAncestorContainer;return Object(N.a)(t)&&(t=t.parentNode),t}return e.parentNode}function q(e,t){const o=W(e),i=new M.a(e);if(o===t)return i;{let e=o;for(;e!=t;){const t=e.frameElement,o=new M.a(t).excludeScrollbarsAndBorders();i.moveBy(o.left,o.top),e=e.parent}}return i}Object.assign({},{scrollViewportToShowTarget:I,scrollAncestorsToShowTarget:function(e){V(H(e),()=>new M.a(e))}});var $=o("./packages/ckeditor5-engine/src/view/uielement.js"),U=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),K=o("./packages/ckeditor5-utils/src/env.js");class G{constructor(e){this.document=new n.a(e),this.domConverter=new l.a(this.document),this.domRoots=new Map,this.set("isRenderingInProgress",!1),this.set("hasDomSelection",!1),this._renderer=new c.a(this.domConverter,this.document.selection),this._renderer.bind("isFocused").to(this.document),this._initialDomRootAttributes=new WeakMap,this._observers=new Map,this._ongoingChange=!1,this._postFixersInProgress=!1,this._renderingDisabled=!1,this._hasChangedSinceTheLastRendering=!1,this._writer=new a.a(this.document),this.addObserver(k),this.addObserver(j),this.addObserver(x),this.addObserver(w),this.addObserver(y),this.addObserver(P),this.addObserver(C),K.a.isAndroid&&this.addObserver(O),Object(g.g)(this),Object($.b)(this),this.on("render",()=>{this._render(),this.document.fire("layoutChanged"),this._hasChangedSinceTheLastRendering=!1}),this.listenTo(this.document.selection,"change",()=>{this._hasChangedSinceTheLastRendering=!0}),this.listenTo(this.document,"change:isFocused",()=>{this._hasChangedSinceTheLastRendering=!0})}attachDomRoot(e,t="main"){const o=this.document.getRoot(t);o._name=e.tagName.toLowerCase();const i={};for(const{name:t,value:r}of Array.from(e.attributes))i[t]=r,"class"===t?this._writer.addClass(r.split(" "),o):this._writer.setAttribute(t,r,o);this._initialDomRootAttributes.set(e,i);const r=()=>{this._writer.setAttribute("contenteditable",!o.isReadOnly,o),o.isReadOnly?this._writer.addClass("ck-read-only",o):this._writer.removeClass("ck-read-only",o)};r(),this.domRoots.set(t,e),this.domConverter.bindElements(e,o),this._renderer.markToSync("children",o),this._renderer.markToSync("attributes",o),this._renderer.domDocuments.add(e.ownerDocument),o.on("change:children",(e,t)=>this._renderer.markToSync("children",t)),o.on("change:attributes",(e,t)=>this._renderer.markToSync("attributes",t)),o.on("change:text",(e,t)=>this._renderer.markToSync("text",t)),o.on("change:isReadOnly",()=>this.change(r)),o.on("change",()=>{this._hasChangedSinceTheLastRendering=!0});for(const o of this._observers.values())o.observe(e,t)}detachDomRoot(e){const t=this.domRoots.get(e);Array.from(t.attributes).forEach(({name:e})=>t.removeAttribute(e));const o=this._initialDomRootAttributes.get(t);for(const e in o)t.setAttribute(e,o[e]);this.domRoots.delete(e),this.domConverter.unbindDomElement(t)}getDomRoot(e="main"){return this.domRoots.get(e)}addObserver(e){let t=this._observers.get(e);if(t)return t;t=new e(this),this._observers.set(e,t);for(const[e,o]of this.domRoots)t.observe(o,e);return t.enable(),t}getObserver(e){return this._observers.get(e)}disableObservers(){for(const e of this._observers.values())e.disable()}enableObservers(){for(const e of this._observers.values())e.enable()}scrollToTheSelection(){const e=this.document.selection.getFirstRange();e&&I({target:this.domConverter.viewRangeToDom(e),viewportOffset:20})}focus(){if(!this.document.isFocused){const e=this.document.selection.editableElement;e&&(this.domConverter.focus(e),this.forceRender())}}change(e){if(this.isRenderingInProgress||this._postFixersInProgress)throw new U.a("cannot-change-view-tree",this);try{if(this._ongoingChange)return e(this._writer);this._ongoingChange=!0;const t=e(this._writer);return this._ongoingChange=!1,!this._renderingDisabled&&this._hasChangedSinceTheLastRendering&&(this._postFixersInProgress=!0,this.document._callPostFixers(this._writer),this._postFixersInProgress=!1,this.fire("render")),t}catch(e){U.a.rethrowUnexpectedError(e,this)}}forceRender(){this._hasChangedSinceTheLastRendering=!0,this.change(()=>{})}destroy(){for(const e of this._observers.values())e.destroy();this.document.destroy(),this.stopListening()}createPositionAt(e,t){return d.a._createAt(e,t)}createPositionAfter(e){return d.a._createAfter(e)}createPositionBefore(e){return d.a._createBefore(e)}createRange(e,t){return new u.a(e,t)}createRangeOn(e){return u.a._createOn(e)}createRangeIn(e){return u.a._createIn(e)}createSelection(e,t,o){return new h.a(e,t,o)}_disableRendering(e){this._renderingDisabled=e,0==e&&this.change(()=>{})}_render(){this.isRenderingInProgress=!0,this.disableObservers(),this._renderer.render(),this.enableObservers(),this.isRenderingInProgress=!1}}Object(S.a)(G,E.a);var J=o("./packages/ckeditor5-engine/src/conversion/mapper.js"),Y=o("./packages/ckeditor5-engine/src/conversion/downcastdispatcher.js"),X=o("./packages/ckeditor5-engine/src/conversion/downcasthelpers.js"),Z=o("./packages/ckeditor5-engine/src/conversion/upcasthelpers.js");class Q{constructor(e,t){this.model=e,this.view=new G(t),this.mapper=new J.a,this.downcastDispatcher=new Y.a({mapper:this.mapper,schema:e.schema});const o=this.model.document,i=o.selection,r=this.model.markers;this.listenTo(this.model,"_beforeChanges",()=>{this.view._disableRendering(!0)},{priority:"highest"}),this.listenTo(this.model,"_afterChanges",()=>{this.view._disableRendering(!1)},{priority:"lowest"}),this.listenTo(o,"change",()=>{this.view.change(e=>{this.downcastDispatcher.convertChanges(o.differ,r,e),this.downcastDispatcher.convertSelection(i,r,e)})},{priority:"low"}),this.listenTo(this.view.document,"selectionChange",Object(Z.a)(this.model,this.mapper)),this.downcastDispatcher.on("insert:$text",Object(X.e)(),{priority:"lowest"}),this.downcastDispatcher.on("remove",Object(X.f)(),{priority:"low"}),this.downcastDispatcher.on("selection",Object(X.a)(),{priority:"high"}),this.downcastDispatcher.on("selection",Object(X.c)(),{priority:"low"}),this.downcastDispatcher.on("selection",Object(X.b)(),{priority:"low"}),this.view.document.roots.bindTo(this.model.document.roots).using(e=>{if("$graveyard"==e.rootName)return null;const t=new s(this.view.document,e.name);return t.rootName=e.rootName,this.mapper.bindElements(e,t),t})}destroy(){this.view.destroy(),this.stopListening()}}Object(S.a)(Q,E.a)},"./packages/ckeditor5-engine/src/conversion/conversion.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),r=o("./packages/ckeditor5-engine/src/conversion/upcasthelpers.js"),s=o("./packages/ckeditor5-engine/src/conversion/downcasthelpers.js"),n=o("./packages/ckeditor5-utils/src/toarray.js");class a{constructor(e,t){this._helpers=new Map,this._downcast=Object(n.a)(e),this._createConversionHelpers({name:"downcast",dispatchers:this._downcast,isDowncast:!0}),this._upcast=Object(n.a)(t),this._createConversionHelpers({name:"upcast",dispatchers:this._upcast,isDowncast:!1})}addAlias(e,t){const o=this._downcast.includes(t);if(!this._upcast.includes(t)&&!o)throw new i.a("conversion-add-alias-dispatcher-not-registered",this);this._createConversionHelpers({name:e,dispatchers:[t],isDowncast:o})}for(e){if(!this._helpers.has(e))throw new i.a("conversion-for-unknown-group",this);return this._helpers.get(e)}elementToElement(e){this.for("downcast").elementToElement(e);for(const{model:t,view:o}of c(e))this.for("upcast").elementToElement({model:t,view:o,converterPriority:e.converterPriority})}attributeToElement(e){this.for("downcast").attributeToElement(e);for(const{model:t,view:o}of c(e))this.for("upcast").elementToAttribute({view:o,model:t,converterPriority:e.converterPriority})}attributeToAttribute(e){this.for("downcast").attributeToAttribute(e);for(const{model:t,view:o}of c(e))this.for("upcast").attributeToAttribute({view:o,model:t})}_createConversionHelpers({name:e,dispatchers:t,isDowncast:o}){if(this._helpers.has(e))throw new i.a("conversion-group-exists",this);const n=o?new s.d(t):new r.d(t);this._helpers.set(e,n)}}function*c(e){if(e.model.values)for(const t of e.model.values){const o={key:e.model.key,value:t},i=e.view[t],r=e.upcastAlso?e.upcastAlso[t]:void 0;yield*l(o,i,r)}else yield*l(e.model,e.view,e.upcastAlso)}function*l(e,t,o){if(yield{model:e,view:t},o)for(const t of Object(n.a)(o))yield{model:e,view:t}}},"./packages/ckeditor5-engine/src/conversion/conversionhelpers.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return i}));class i{constructor(e){this._dispatchers=e}add(e){for(const t of this._dispatchers)e(t);return this}}},"./packages/ckeditor5-engine/src/conversion/downcastdispatcher.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return d}));var i=o("./packages/ckeditor5-engine/src/model/textproxy.js");class r{constructor(){this._consumable=new Map,this._textProxyRegistry=new Map}add(e,t){t=s(t),e instanceof i.a&&(e=this._getSymbolForTextProxy(e)),this._consumable.has(e)||this._consumable.set(e,new Map),this._consumable.get(e).set(t,!0)}consume(e,t){return t=s(t),e instanceof i.a&&(e=this._getSymbolForTextProxy(e)),!!this.test(e,t)&&(this._consumable.get(e).set(t,!1),!0)}test(e,t){t=s(t),e instanceof i.a&&(e=this._getSymbolForTextProxy(e));const o=this._consumable.get(e);if(void 0===o)return null;const r=o.get(t);return void 0===r?null:r}revert(e,t){t=s(t),e instanceof i.a&&(e=this._getSymbolForTextProxy(e));const o=this.test(e,t);return!1===o?(this._consumable.get(e).set(t,!0),!0):!0!==o&&null}_getSymbolForTextProxy(e){let t=null;const o=this._textProxyRegistry.get(e.startOffset);if(o){const i=o.get(e.endOffset);i&&(t=i.get(e.parent))}return t||(t=this._addSymbolForTextProxy(e.startOffset,e.endOffset,e.parent)),t}_addSymbolForTextProxy(e,t,o){const i=Symbol("textProxySymbol");let r,s;return r=this._textProxyRegistry.get(e),r||(r=new Map,this._textProxyRegistry.set(e,r)),s=r.get(t),s||(s=new Map,r.set(t,s)),s.set(o,i),i}}function s(e){const t=e.split(":");return"addMarker"==t[0]||"removeMarker"==t[0]?e:t.length>1?t[0]+":"+t[1]:t[0]}var n=o("./packages/ckeditor5-engine/src/model/range.js"),a=o("./packages/ckeditor5-engine/src/model/position.js"),c=o("./packages/ckeditor5-utils/src/emittermixin.js"),l=o("./packages/ckeditor5-utils/src/mix.js");class d{constructor(e){this.conversionApi=Object.assign({dispatcher:this},e),this._reconversionEventsMapping=new Map}convertChanges(e,t,o){for(const t of e.getMarkersToRemove())this.convertMarkerRemove(t.name,t.range,o);const i=this._mapChangesWithAutomaticReconversion(e);for(const e of i)"insert"===e.type?this.convertInsert(n.a._createFromPositionAndShift(e.position,e.length),o):"remove"===e.type?this.convertRemove(e.position,e.length,e.name,o):"reconvert"===e.type?this.reconvertElement(e.element,o):this.convertAttribute(e.range,e.attributeKey,e.attributeOldValue,e.attributeNewValue,o);for(const e of this.conversionApi.mapper.flushUnboundMarkerNames()){const i=t.get(e).getRange();this.convertMarkerRemove(e,i,o),this.convertMarkerAdd(e,i,o)}for(const t of e.getMarkersToAdd())this.convertMarkerAdd(t.name,t.range,o)}convertInsert(e,t){this.conversionApi.writer=t,this.conversionApi.consumable=this._createInsertConsumable(e);for(const t of Array.from(e).map(h))this._convertInsertWithAttributes(t);this._clearConversionApi()}convertRemove(e,t,o,i){this.conversionApi.writer=i,this.fire("remove:"+o,{position:e,length:t},this.conversionApi),this._clearConversionApi()}convertAttribute(e,t,o,i,r){this.conversionApi.writer=r,this.conversionApi.consumable=this._createConsumableForRange(e,"attribute:"+t);for(const r of e){const e={item:r.item,range:n.a._createFromPositionAndShift(r.previousPosition,r.length),attributeKey:t,attributeOldValue:o,attributeNewValue:i};this._testAndFire("attribute:"+t,e)}this._clearConversionApi()}reconvertElement(e,t){const o=n.a._createOn(e);this.conversionApi.writer=t,this.conversionApi.consumable=this._createInsertConsumable(o);const i=this.conversionApi.mapper,r=i.toViewElement(e);t.remove(r),this._convertInsertWithAttributes({item:e,range:o});const s=i.toViewElement(e);for(const o of n.a._createIn(e)){const{item:e}=o,r=p(e,i);r?r.root!==s.root&&t.move(t.createRangeOn(r),i.toViewPosition(a.a._createBefore(e))):this._convertInsertWithAttributes(h(o))}i.unbindViewElement(r),this._clearConversionApi()}convertSelection(e,t,o){const i=Array.from(t.getMarkersAtPosition(e.getFirstPosition()));if(this.conversionApi.writer=o,this.conversionApi.consumable=this._createSelectionConsumable(e,i),this.fire("selection",{selection:e},this.conversionApi),e.isCollapsed){for(const t of i){const o=t.getRange();if(!u(e.getFirstPosition(),t,this.conversionApi.mapper))continue;const i={item:e,markerName:t.name,markerRange:o};this.conversionApi.consumable.test(e,"addMarker:"+t.name)&&this.fire("addMarker:"+t.name,i,this.conversionApi)}for(const t of e.getAttributeKeys()){const o={item:e,range:e.getFirstRange(),attributeKey:t,attributeOldValue:null,attributeNewValue:e.getAttribute(t)};this.conversionApi.consumable.test(e,"attribute:"+o.attributeKey)&&this.fire("attribute:"+o.attributeKey+":$text",o,this.conversionApi)}this._clearConversionApi()}else this._clearConversionApi()}convertMarkerAdd(e,t,o){if("$graveyard"==t.root.rootName)return;this.conversionApi.writer=o;const i="addMarker:"+e,s=new r;if(s.add(t,i),this.conversionApi.consumable=s,this.fire(i,{markerName:e,markerRange:t},this.conversionApi),s.test(t,i)){this.conversionApi.consumable=this._createConsumableForRange(t,i);for(const o of t.getItems()){if(!this.conversionApi.consumable.test(o,i))continue;const r={item:o,range:n.a._createOn(o),markerName:e,markerRange:t};this.fire(i,r,this.conversionApi)}this._clearConversionApi()}else this._clearConversionApi()}convertMarkerRemove(e,t,o){"$graveyard"!=t.root.rootName&&(this.conversionApi.writer=o,this.fire("removeMarker:"+e,{markerName:e,markerRange:t},this.conversionApi),this._clearConversionApi())}_mapReconversionTriggerEvent(e,t){this._reconversionEventsMapping.set(t,e)}_createInsertConsumable(e){const t=new r;for(const o of e){const e=o.item;t.add(e,"insert");for(const o of e.getAttributeKeys())t.add(e,"attribute:"+o)}return t}_createConsumableForRange(e,t){const o=new r;for(const i of e.getItems())o.add(i,t);return o}_createSelectionConsumable(e,t){const o=new r;o.add(e,"selection");for(const i of t)o.add(e,"addMarker:"+i.name);for(const t of e.getAttributeKeys())o.add(e,"attribute:"+t);return o}_testAndFire(e,t){this.conversionApi.consumable.test(t.item,e)&&this.fire(function(e,t){const o=t.item.name||"$text";return`${e}:${o}`}(e,t),t,this.conversionApi)}_clearConversionApi(){delete this.conversionApi.writer,delete this.conversionApi.consumable}_convertInsertWithAttributes(e){this._testAndFire("insert",e);for(const t of e.item.getAttributeKeys())e.attributeKey=t,e.attributeOldValue=null,e.attributeNewValue=e.item.getAttribute(t),this._testAndFire("attribute:"+t,e)}_mapChangesWithAutomaticReconversion(e){const t=new Set,o=[];for(const i of e.getChanges()){const e=i.position||i.range.start,r=e.parent;if(Object(a.d)(e,r)){o.push(i);continue}const s="attribute"===i.type?Object(a.b)(e,r,null):r;if(s.is("$text")){o.push(i);continue}let n;if(n="attribute"===i.type?`attribute:${i.attributeKey}:${s.name}`:`${i.type}:${i.name}`,this._isReconvertTriggerEvent(n,s.name)){if(t.has(s))continue;t.add(s),o.push({type:"reconvert",element:s})}else o.push(i)}return o}_isReconvertTriggerEvent(e,t){return this._reconversionEventsMapping.get(e)===t}}function u(e,t,o){const i=t.getRange(),r=Array.from(e.getAncestors());r.shift(),r.reverse();return!r.some(e=>{if(i.containsItem(e)){return!!o.toViewElement(e).getCustomProperty("addHighlight")}})}function h(e){return{item:e.item,range:n.a._createFromPositionAndShift(e.previousPosition,e.length)}}function p(e,t){if(e.is("textProxy")){const o=t.toViewPosition(a.a._createBefore(e)).parent;return o.is("$text")?o:null}return t.toViewElement(e)}Object(l.a)(d,c.c)},"./packages/ckeditor5-engine/src/conversion/downcasthelpers.js":function(e,t,o){"use strict";o.d(t,"d",(function(){return h})),o.d(t,"e",(function(){return p})),o.d(t,"f",(function(){return g})),o.d(t,"c",(function(){return m})),o.d(t,"b",(function(){return k})),o.d(t,"a",(function(){return b}));var i=o("./packages/ckeditor5-engine/src/model/range.js"),r=o("./packages/ckeditor5-engine/src/model/selection.js"),s=o("./packages/ckeditor5-engine/src/model/element.js"),n=o("./packages/ckeditor5-engine/src/view/attributeelement.js"),a=o("./packages/ckeditor5-engine/src/model/documentselection.js"),c=o("./packages/ckeditor5-engine/src/conversion/conversionhelpers.js"),l=o("./node_modules/lodash-es/cloneDeep.js"),d=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),u=o("./packages/ckeditor5-utils/src/toarray.js");class h extends c.a{elementToElement(e){return this.add(function(e){return(e=Object(l.a)(e)).view=w(e.view,"container"),t=>{var o;if(t.on("insert:"+e.model,(o=e.view,(e,t,i)=>{const r=o(t.item,i);if(!r)return;if(!i.consumable.consume(t.item,"insert"))return;const s=i.mapper.toViewPosition(t.range.start);i.mapper.bindElements(t.item,r),i.writer.insert(s,r)}),{priority:e.converterPriority||"normal"}),e.triggerBy){if(e.triggerBy.attributes)for(const o of e.triggerBy.attributes)t._mapReconversionTriggerEvent(e.model,`attribute:${o}:${e.model}`);if(e.triggerBy.children)for(const o of e.triggerBy.children)t._mapReconversionTriggerEvent(e.model,"insert:"+o),t._mapReconversionTriggerEvent(e.model,"remove:"+o)}}}(e))}attributeToElement(e){return this.add(function(e){e=Object(l.a)(e);let t="attribute:"+(e.model.key?e.model.key:e.model);e.model.name&&(t+=":"+e.model.name);if(e.model.values)for(const t of e.model.values)e.view[t]=w(e.view[t],"attribute");else e.view=w(e.view,"attribute");const o=v(e);return i=>{i.on(t,function(e){return(t,o,i)=>{const s=e(o.attributeOldValue,i),n=e(o.attributeNewValue,i);if(!s&&!n)return;if(!i.consumable.consume(o.item,t.name))return;const c=i.writer,l=c.document.selection;if(o.item instanceof r.a||o.item instanceof a.a)c.wrap(l.getFirstRange(),n);else{let e=i.mapper.toViewRange(o.range);null!==o.attributeOldValue&&s&&(e=c.unwrap(e,s)),null!==o.attributeNewValue&&n&&c.wrap(e,n)}}}(o),{priority:e.converterPriority||"normal"})}}(e))}attributeToAttribute(e){return this.add(function(e){e=Object(l.a)(e);let t="attribute:"+(e.model.key?e.model.key:e.model);e.model.name&&(t+=":"+e.model.name);if(e.model.values)for(const t of e.model.values)e.view[t]=y(e.view[t]);else e.view=y(e.view);const o=v(e);return i=>{var r;i.on(t,(r=o,(e,t,o)=>{const i=r(t.attributeOldValue,o),s=r(t.attributeNewValue,o);if(!i&&!s)return;if(!o.consumable.consume(t.item,e.name))return;const n=o.mapper.toViewElement(t.item),a=o.writer;if(!n)throw new d.a("conversion-attribute-to-attribute-on-text",[t,o]);if(null!==t.attributeOldValue&&i)if("class"==i.key){const e=Object(u.a)(i.value);for(const t of e)a.removeClass(t,n)}else if("style"==i.key){const e=Object.keys(i.value);for(const t of e)a.removeStyle(t,n)}else a.removeAttribute(i.key,n);if(null!==t.attributeNewValue&&s)if("class"==s.key){const e=Object(u.a)(s.value);for(const t of e)a.addClass(t,n)}else if("style"==s.key){const e=Object.keys(s.value);for(const t of e)a.setStyle(t,s.value[t],n)}else a.setAttribute(s.key,s.value,n)}),{priority:e.converterPriority||"normal"})}}(e))}markerToElement(e){return this.add(function(e){return(e=Object(l.a)(e)).view=w(e.view,"ui"),t=>{var o;t.on("addMarker:"+e.model,(o=e.view,(e,t,i)=>{t.isOpening=!0;const r=o(t,i);t.isOpening=!1;const s=o(t,i);if(!r||!s)return;const n=t.markerRange;if(n.isCollapsed&&!i.consumable.consume(n,e.name))return;for(const t of n)if(!i.consumable.consume(t.item,e.name))return;const a=i.mapper,c=i.writer;c.insert(a.toViewPosition(n.start),r),i.mapper.bindElementToMarker(r,t.markerName),n.isCollapsed||(c.insert(a.toViewPosition(n.end),s),i.mapper.bindElementToMarker(s,t.markerName)),e.stop()}),{priority:e.converterPriority||"normal"}),t.on("removeMarker:"+e.model,(e.view,(e,t,o)=>{const i=o.mapper.markerNameToElements(t.markerName);if(i){for(const e of i)o.mapper.unbindElementFromMarkerName(e,t.markerName),o.writer.clear(o.writer.createRangeOn(e),e);o.writer.clearClonedElementsGroup(t.markerName),e.stop()}}),{priority:e.converterPriority||"normal"})}}(e))}markerToHighlight(e){return this.add(function(e){return t=>{var o;t.on("addMarker:"+e.model,(o=e.view,(e,t,i)=>{if(!t.item)return;if(!(t.item instanceof r.a||t.item instanceof a.a||t.item.is("$textProxy")))return;const s=j(o,t,i);if(!s)return;if(!i.consumable.consume(t.item,e.name))return;const n=i.writer,c=f(n,s),l=n.document.selection;if(t.item instanceof r.a||t.item instanceof a.a)n.wrap(l.getFirstRange(),c,l);else{const e=i.mapper.toViewRange(t.range),o=n.wrap(e,c);for(const e of o.getItems())if(e.is("attributeElement")&&e.isSimilar(c)){i.mapper.bindElementToMarker(e,t.markerName);break}}}),{priority:e.converterPriority||"normal"}),t.on("addMarker:"+e.model,function(e){return(t,o,r)=>{if(!o.item)return;if(!(o.item instanceof s.a))return;const n=j(e,o,r);if(!n)return;if(!r.consumable.test(o.item,t.name))return;const a=r.mapper.toViewElement(o.item);if(a&&a.getCustomProperty("addHighlight")){r.consumable.consume(o.item,t.name);for(const e of i.a._createIn(o.item))r.consumable.consume(e.item,t.name);a.getCustomProperty("addHighlight")(a,n,r.writer),r.mapper.bindElementToMarker(a,o.markerName)}}}(e.view),{priority:e.converterPriority||"normal"}),t.on("removeMarker:"+e.model,function(e){return(t,o,i)=>{if(o.markerRange.isCollapsed)return;const r=j(e,o,i);if(!r)return;const s=f(i.writer,r),n=i.mapper.markerNameToElements(o.markerName);if(n){for(const e of n)i.mapper.unbindElementFromMarkerName(e,o.markerName),e.is("attributeElement")?i.writer.unwrap(i.writer.createRangeOn(e),s):e.getCustomProperty("removeHighlight")(e,r.id,i.writer);i.writer.clearClonedElementsGroup(o.markerName),t.stop()}}}(e.view),{priority:e.converterPriority||"normal"})}}(e))}markerToData(e){return this.add(function(e){const t=(e=Object(l.a)(e)).model;e.view||(e.view=o=>({group:t,name:o.substr(e.model.length+1)}));return o=>{var i;o.on("addMarker:"+t,(i=e.view,(e,t,o)=>{const r=i(t.markerName,o);if(!r)return;const s=t.markerRange;o.consumable.consume(s,e.name)&&(_(s,!1,o,t,r),_(s,!0,o,t,r),e.stop())}),{priority:e.converterPriority||"normal"}),o.on("removeMarker:"+t,function(e){return(t,o,i)=>{const r=e(o.markerName,i);if(!r)return;const s=i.mapper.markerNameToElements(o.markerName);if(s){for(const e of s)i.mapper.unbindElementFromMarkerName(e,o.markerName),e.is("containerElement")?(n(`data-${r.group}-start-before`,e),n(`data-${r.group}-start-after`,e),n(`data-${r.group}-end-before`,e),n(`data-${r.group}-end-after`,e)):i.writer.clear(i.writer.createRangeOn(e),e);i.writer.clearClonedElementsGroup(o.markerName),t.stop()}function n(e,t){if(t.hasAttribute(e)){const o=new Set(t.getAttribute(e).split(","));o.delete(r.name),0==o.size?i.writer.removeAttribute(e,t):i.writer.setAttribute(e,Array.from(o).join(","),t)}}}}(e.view),{priority:e.converterPriority||"normal"})}}(e))}}function p(){return(e,t,o)=>{if(!o.consumable.consume(t.item,"insert"))return;const i=o.writer,r=o.mapper.toViewPosition(t.range.start),s=i.createText(t.item.data);i.insert(r,s)}}function g(){return(e,t,o)=>{const i=o.mapper.toViewPosition(t.position),r=t.position.getShiftedBy(t.length),s=o.mapper.toViewPosition(r,{isPhantom:!0}),n=o.writer.createRange(i,s),a=o.writer.remove(n.getTrimmed());for(const e of o.writer.createRangeIn(a).getItems())o.mapper.unbindViewElement(e)}}function f(e,t){const o=e.createAttributeElement("span",t.attributes);return t.classes&&o._addClass(t.classes),"number"==typeof t.priority&&(o._priority=t.priority),o._id=t.id,o}function m(){return(e,t,o)=>{const i=t.selection;if(i.isCollapsed)return;if(!o.consumable.consume(i,"selection"))return;const r=[];for(const e of i.getRanges()){const t=o.mapper.toViewRange(e);r.push(t)}o.writer.setSelection(r,{backward:i.isBackward})}}function k(){return(e,t,o)=>{const i=t.selection;if(!i.isCollapsed)return;if(!o.consumable.consume(i,"selection"))return;const r=o.writer,s=i.getFirstPosition(),n=o.mapper.toViewPosition(s),a=r.breakAttributes(n);r.setSelection(a)}}function b(){return(e,t,o)=>{const i=o.writer,r=i.document.selection;for(const e of r.getRanges())e.isCollapsed&&e.end.parent.isAttached()&&o.writer.mergeAttributes(e.start);i.setSelection(null)}}function _(e,t,o,i,r){const s=t?e.start:e.end,n=s.nodeAfter&&s.nodeAfter.is("element")?s.nodeAfter:null,a=s.nodeBefore&&s.nodeBefore.is("element")?s.nodeBefore:null;if(n||a){let e,s;t&&n||!t&&!a?(e=n,s=!0):(e=a,s=!1);const c=o.mapper.toViewElement(e);if(c)return void function(e,t,o,i,r,s){const n=`data-${s.group}-${t?"start":"end"}-${o?"before":"after"}`,a=e.hasAttribute(n)?e.getAttribute(n).split(","):[];a.unshift(s.name),i.writer.setAttribute(n,a.join(","),e),i.mapper.bindElementToMarker(e,r.markerName)}(c,t,s,o,i,r)}!function(e,t,o,i,r){const s=`${r.group}-${t?"start":"end"}`,n=r.name?{name:r.name}:null,a=o.writer.createUIElement(s,n);o.writer.insert(e,a),o.mapper.bindElementToMarker(a,i.markerName)}(o.mapper.toViewPosition(s),t,o,i,r)}function w(e,t){return"function"==typeof e?e:(o,i)=>function(e,t,o){"string"==typeof e&&(e={name:e});let i;const r=t.writer,s=Object.assign({},e.attributes);if("container"==o)i=r.createContainerElement(e.name,s);else if("attribute"==o){const t={priority:e.priority||n.a.DEFAULT_PRIORITY};i=r.createAttributeElement(e.name,s,t)}else i=r.createUIElement(e.name,s);if(e.styles){const t=Object.keys(e.styles);for(const o of t)r.setStyle(o,e.styles[o],i)}if(e.classes){const t=e.classes;if("string"==typeof t)r.addClass(t,i);else for(const e of t)r.addClass(e,i)}return i}(e,i,t)}function v(e){return e.model.values?(t,o)=>{const i=e.view[t];return i?i(t,o):null}:e.view}function y(e){return"string"==typeof e?t=>({key:e,value:t}):"object"==typeof e?e.value?()=>e:t=>({key:e.key,value:t}):e}function j(e,t,o){const i="function"==typeof e?e(t,o):e;return i?(i.priority||(i.priority=10),i.id||(i.id=t.markerName),i):null}},"./packages/ckeditor5-engine/src/conversion/mapper.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return d}));var i=o("./packages/ckeditor5-engine/src/model/position.js"),r=o("./packages/ckeditor5-engine/src/model/range.js"),s=o("./packages/ckeditor5-engine/src/view/position.js"),n=o("./packages/ckeditor5-engine/src/view/range.js"),a=o("./packages/ckeditor5-engine/src/view/text.js"),c=o("./packages/ckeditor5-utils/src/emittermixin.js"),l=o("./packages/ckeditor5-utils/src/mix.js");class d{constructor(){this._modelToViewMapping=new WeakMap,this._viewToModelMapping=new WeakMap,this._viewToModelLengthCallbacks=new Map,this._markerNameToElements=new Map,this._elementToMarkerNames=new Map,this._unboundMarkerNames=new Set,this.on("modelToViewPosition",(e,t)=>{if(t.viewPosition)return;const o=this._modelToViewMapping.get(t.modelPosition.parent);t.viewPosition=this.findPositionIn(o,t.modelPosition.offset)},{priority:"low"}),this.on("viewToModelPosition",(e,t)=>{if(t.modelPosition)return;const o=this.findMappedViewAncestor(t.viewPosition),r=this._viewToModelMapping.get(o),s=this._toModelOffset(t.viewPosition.parent,t.viewPosition.offset,o);t.modelPosition=i.a._createAt(r,s)},{priority:"low"})}bindElements(e,t){this._modelToViewMapping.set(e,t),this._viewToModelMapping.set(t,e)}unbindViewElement(e){const t=this.toModelElement(e);if(this._viewToModelMapping.delete(e),this._elementToMarkerNames.has(e))for(const t of this._elementToMarkerNames.get(e))this._unboundMarkerNames.add(t);this._modelToViewMapping.get(t)==e&&this._modelToViewMapping.delete(t)}unbindModelElement(e){const t=this.toViewElement(e);this._modelToViewMapping.delete(e),this._viewToModelMapping.get(t)==e&&this._viewToModelMapping.delete(t)}bindElementToMarker(e,t){const o=this._markerNameToElements.get(t)||new Set;o.add(e);const i=this._elementToMarkerNames.get(e)||new Set;i.add(t),this._markerNameToElements.set(t,o),this._elementToMarkerNames.set(e,i)}unbindElementFromMarkerName(e,t){const o=this._markerNameToElements.get(t);o&&(o.delete(e),0==o.size&&this._markerNameToElements.delete(t));const i=this._elementToMarkerNames.get(e);i&&(i.delete(t),0==i.size&&this._elementToMarkerNames.delete(e))}flushUnboundMarkerNames(){const e=Array.from(this._unboundMarkerNames);return this._unboundMarkerNames.clear(),e}clearBindings(){this._modelToViewMapping=new WeakMap,this._viewToModelMapping=new WeakMap,this._markerNameToElements=new Map,this._elementToMarkerNames=new Map,this._unboundMarkerNames=new Set}toModelElement(e){return this._viewToModelMapping.get(e)}toViewElement(e){return this._modelToViewMapping.get(e)}toModelRange(e){return new r.a(this.toModelPosition(e.start),this.toModelPosition(e.end))}toViewRange(e){return new n.a(this.toViewPosition(e.start),this.toViewPosition(e.end))}toModelPosition(e){const t={viewPosition:e,mapper:this};return this.fire("viewToModelPosition",t),t.modelPosition}toViewPosition(e,t={isPhantom:!1}){const o={modelPosition:e,mapper:this,isPhantom:t.isPhantom};return this.fire("modelToViewPosition",o),o.viewPosition}markerNameToElements(e){const t=this._markerNameToElements.get(e);if(!t)return null;const o=new Set;for(const e of t)if(e.is("attributeElement"))for(const t of e.getElementsWithSameId())o.add(t);else o.add(e);return o}registerViewToModelLength(e,t){this._viewToModelLengthCallbacks.set(e,t)}findMappedViewAncestor(e){let t=e.parent;for(;!this._viewToModelMapping.has(t);)t=t.parent;return t}_toModelOffset(e,t,o){if(o!=e){return this._toModelOffset(e.parent,e.index,o)+this._toModelOffset(e,t,e)}if(e.is("$text"))return t;let i=0;for(let o=0;o<t;o++)i+=this.getModelLength(e.getChild(o));return i}getModelLength(e){if(this._viewToModelLengthCallbacks.get(e.name)){return this._viewToModelLengthCallbacks.get(e.name)(e)}if(this._viewToModelMapping.has(e))return 1;if(e.is("$text"))return e.data.length;if(e.is("uiElement"))return 0;{let t=0;for(const o of e.getChildren())t+=this.getModelLength(o);return t}}findPositionIn(e,t){let o,i=0,r=0,n=0;if(e.is("$text"))return new s.a(e,t);for(;r<t;)o=e.getChild(n),i=this.getModelLength(o),r+=i,n++;return r==t?this._moveViewPositionToTextNode(new s.a(e,n)):this.findPositionIn(o,t-(r-i))}_moveViewPositionToTextNode(e){const t=e.nodeBefore,o=e.nodeAfter;return t instanceof a.a?new s.a(t,t.data.length):o instanceof a.a?new s.a(o,0):e}}Object(l.a)(d,c.c)},"./packages/ckeditor5-engine/src/conversion/upcasthelpers.js":function(e,t,o){"use strict";o.d(t,"d",(function(){return c})),o.d(t,"c",(function(){return l})),o.d(t,"b",(function(){return d})),o.d(t,"a",(function(){return u}));var i=o("./packages/ckeditor5-engine/src/view/matcher.js"),r=o("./packages/ckeditor5-engine/src/conversion/conversionhelpers.js"),s=o("./node_modules/lodash-es/cloneDeep.js"),n=o("./packages/ckeditor5-utils/src/priorities.js"),a=o("./packages/ckeditor5-engine/src/model/utils/autoparagraphing.js");class c extends r.a{elementToElement(e){return this.add(h(e))}elementToAttribute(e){return this.add(function(e){f(e=Object(s.a)(e));const t=m(e,!1),o=p(e.view),i=o?"element:"+o:"element";return o=>{o.on(i,t,{priority:e.converterPriority||"low"})}}(e))}attributeToAttribute(e){return this.add(function(e){e=Object(s.a)(e);let t=null;("string"==typeof e.view||e.view.key)&&(t=function(e){"string"==typeof e.view&&(e.view={key:e.view});const t=e.view.key;let o;if("class"==t||"style"==t){o={["class"==t?"classes":"styles"]:e.view.value}}else{const i=void 0===e.view.value?/[\s\S]*/:e.view.value;o={attributes:{[t]:i}}}e.view.name&&(o.name=e.view.name);return e.view=o,t}(e));f(e,t);const o=m(e,!0);return t=>{t.on("element",o,{priority:e.converterPriority||"low"})}}(e))}elementToMarker(e){return this.add(function(e){return function(e){const t=e.model;e.model=(e,o)=>{const i="string"==typeof t?t:t(e,o);return o.writer.createElement("$marker",{"data-name":i})}}(e=Object(s.a)(e)),h(e)}(e))}dataToMarker(e){return this.add(function(e){(e=Object(s.a)(e)).model||(e.model=t=>t?e.view+":"+t:e.view);const t=g(k(e,"start")),o=g(k(e,"end"));return i=>{i.on("element:"+e.view+"-start",t,{priority:e.converterPriority||"normal"}),i.on("element:"+e.view+"-end",o,{priority:e.converterPriority||"normal"});const r=n.a.get("low"),s=n.a.get("highest"),a=n.a.get(e.converterPriority)/s;i.on("element",function(e){return(t,o,i)=>{const r="data-"+e.view;function s(t,r){for(const s of r){const r=e.model(s,i),n=i.writer.createElement("$marker",{"data-name":r});i.writer.insert(n,t),o.modelCursor.isEqual(t)?o.modelCursor=o.modelCursor.getShiftedBy(1):o.modelCursor=o.modelCursor._getTransformedByInsertion(t,1),o.modelRange=o.modelRange._getTransformedByInsertion(t,1)[0]}}(i.consumable.test(o.viewItem,{attributes:r+"-end-after"})||i.consumable.test(o.viewItem,{attributes:r+"-start-after"})||i.consumable.test(o.viewItem,{attributes:r+"-end-before"})||i.consumable.test(o.viewItem,{attributes:r+"-start-before"}))&&(o.modelRange||Object.assign(o,i.convertChildren(o.viewItem,o.modelCursor)),i.consumable.consume(o.viewItem,{attributes:r+"-end-after"})&&s(o.modelRange.end,o.viewItem.getAttribute(r+"-end-after").split(",")),i.consumable.consume(o.viewItem,{attributes:r+"-start-after"})&&s(o.modelRange.end,o.viewItem.getAttribute(r+"-start-after").split(",")),i.consumable.consume(o.viewItem,{attributes:r+"-end-before"})&&s(o.modelRange.start,o.viewItem.getAttribute(r+"-end-before").split(",")),i.consumable.consume(o.viewItem,{attributes:r+"-start-before"})&&s(o.modelRange.start,o.viewItem.getAttribute(r+"-start-before").split(",")))}}(e),{priority:r+a})}}(e))}}function l(){return(e,t,o)=>{if(!t.modelRange&&o.consumable.consume(t.viewItem,{name:!0})){const{modelRange:e,modelCursor:i}=o.convertChildren(t.viewItem,t.modelCursor);t.modelRange=e,t.modelCursor=i}}}function d(){return(e,t,{schema:o,consumable:i,writer:r})=>{let s=t.modelCursor;if(!i.test(t.viewItem))return;if(!o.checkChild(s,"$text")){if(!Object(a.b)(s,"$text",o))return;s=Object(a.c)(s,r)}i.consume(t.viewItem);const n=r.createText(t.viewItem.data);r.insert(n,s),t.modelRange=r.createRange(s,s.getShiftedBy(n.offsetSize)),t.modelCursor=t.modelRange.end}}function u(e,t){return(o,i)=>{const r=i.newSelection,s=[];for(const e of r.getRanges())s.push(t.toModelRange(e));const n=e.createSelection(s,{backward:r.isBackward});n.isEqual(e.document.selection)||e.change(e=>{e.setSelection(n)})}}function h(e){const t=g(e=Object(s.a)(e)),o=p(e.view),i=o?"element:"+o:"element";return o=>{o.on(i,t,{priority:e.converterPriority||"normal"})}}function p(e){return"string"==typeof e?e:"object"==typeof e&&"string"==typeof e.name?e.name:null}function g(e){const t=new i.a(e.view);return(o,i,r)=>{const s=t.match(i.viewItem);if(!s)return;const n=s.match;if(n.name=!0,!r.consumable.test(i.viewItem,n))return;const a=function(e,t,o){return e instanceof Function?e(t,o):o.writer.createElement(e)}(e.model,i.viewItem,r);a&&r.safeInsert(a,i.modelCursor)&&(r.consumable.consume(i.viewItem,n),r.convertChildren(i.viewItem,a),r.updateConversionResult(a,i))}}function f(e,t=null){const o=null===t||(e=>e.getAttribute(t)),i="object"!=typeof e.model?e.model:e.model.key,r="object"!=typeof e.model||void 0===e.model.value?o:e.model.value;e.model={key:i,value:r}}function m(e,t){const o=new i.a(e.view);return(i,r,s)=>{const n=o.match(r.viewItem);if(!n)return;if(!function(e,t){const o="function"==typeof e?e(t):e;if("object"==typeof o&&!p(o))return!1;return!o.classes&&!o.attributes&&!o.styles}(e.view,r.viewItem)?delete n.match.name:n.match.name=!0,!s.consumable.test(r.viewItem,n.match))return;const a=e.model.key,c="function"==typeof e.model.value?e.model.value(r.viewItem,s):e.model.value;if(null===c)return;r.modelRange||Object.assign(r,s.convertChildren(r.viewItem,r.modelCursor));(function(e,t,o,i){let r=!1;for(const s of Array.from(e.getItems({shallow:o})))i.schema.checkAttribute(s,t.key)&&(r=!0,s.hasAttribute(t.key)||i.writer.setAttribute(t.key,t.value,s));return r})(r.modelRange,{key:a,value:c},t,s)&&s.consumable.consume(r.viewItem,n.match)}}function k(e,t){const o={};return o.view=e.view+"-"+t,o.model=(t,o)=>{const i=t.getAttribute("name"),r=e.model(i,o);return o.writer.createElement("$marker",{"data-name":r})},o}},"./packages/ckeditor5-engine/src/dataprocessor/htmldataprocessor.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));class i{getHtml(e){const t=document.implementation.createHTMLDocument("").createElement("div");return t.appendChild(e),t.innerHTML}}var r=o("./packages/ckeditor5-engine/src/view/domconverter.js");class s{constructor(e){this._domParser=new DOMParser,this._domConverter=new r.a(e,{blockFillerMode:"nbsp"}),this._htmlWriter=new i}toData(e){const t=this._domConverter.viewToDom(e,document);return this._htmlWriter.getHtml(t)}toView(e){const t=this._toDom(e);return this._domConverter.domToView(t)}registerRawContentMatcher(e){this._domConverter.registerRawContentMatcher(e)}useFillerType(e){this._domConverter.blockFillerMode="marked"==e?"markedNbsp":"nbsp"}_toDom(e){const t=this._domParser.parseFromString(e,"text/html"),o=t.createDocumentFragment();let i=t.firstChild;for(;!i.isSameNode(t.documentElement);){const e=i;i=i.nextSibling,e.nodeType==Node.COMMENT_NODE&&o.appendChild(e)}const r=t.body.childNodes;for(;r.length>0;)o.appendChild(r[0]);return o}}},"./packages/ckeditor5-engine/src/model/documentfragment.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-engine/src/model/nodelist.js"),r=o("./packages/ckeditor5-engine/src/model/element.js"),s=o("./packages/ckeditor5-engine/src/model/text.js"),n=o("./packages/ckeditor5-engine/src/model/textproxy.js"),a=o("./packages/ckeditor5-utils/src/isiterable.js");class c{constructor(e){this.markers=new Map,this._children=new i.a,e&&this._insertChild(0,e)}[Symbol.iterator](){return this.getChildren()}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return 0===this.childCount}get root(){return this}get parent(){return null}is(e){return"documentFragment"===e||"model:documentFragment"===e}getChild(e){return this._children.getNode(e)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(e){return this._children.getNodeIndex(e)}getChildStartOffset(e){return this._children.getNodeStartOffset(e)}getPath(){return[]}getNodeByPath(e){let t=this;for(const o of e)t=t.getChild(t.offsetToIndex(o));return t}offsetToIndex(e){return this._children.offsetToIndex(e)}toJSON(){const e=[];for(const t of this._children)e.push(t.toJSON());return e}static fromJSON(e){const t=[];for(const o of e)o.name?t.push(r.a.fromJSON(o)):t.push(s.a.fromJSON(o));return new c(t)}_appendChild(e){this._insertChild(this.childCount,e)}_insertChild(e,t){const o=function(e){if("string"==typeof e)return[new s.a(e)];Object(a.a)(e)||(e=[e]);return Array.from(e).map(e=>"string"==typeof e?new s.a(e):e instanceof n.a?new s.a(e.data,e.getAttributes()):e)}(t);for(const e of o)null!==e.parent&&e._remove(),e.parent=this;this._children._insertNodes(e,o)}_removeChildren(e,t=1){const o=this._children._removeNodes(e,t);for(const e of o)e.parent=null;return o}}},"./packages/ckeditor5-engine/src/model/documentselection.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return p}));var i=o("./packages/ckeditor5-utils/src/mix.js"),r=o("./packages/ckeditor5-utils/src/emittermixin.js"),s=o("./packages/ckeditor5-engine/src/model/selection.js"),n=o("./packages/ckeditor5-engine/src/model/liverange.js"),a=o("./packages/ckeditor5-engine/src/model/text.js"),c=o("./packages/ckeditor5-engine/src/model/textproxy.js"),l=o("./packages/ckeditor5-utils/src/tomap.js"),d=o("./packages/ckeditor5-utils/src/collection.js"),u=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),h=o("./packages/ckeditor5-utils/src/uid.js");class p{constructor(e){this._selection=new g(e),this._selection.delegate("change:range").to(this),this._selection.delegate("change:attribute").to(this),this._selection.delegate("change:marker").to(this)}get isCollapsed(){return this._selection.isCollapsed}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get rangeCount(){return this._selection.rangeCount}get hasOwnRange(){return this._selection.hasOwnRange}get isBackward(){return this._selection.isBackward}get isGravityOverridden(){return this._selection.isGravityOverridden}get markers(){return this._selection.markers}get _ranges(){return this._selection._ranges}getRanges(){return this._selection.getRanges()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getSelectedBlocks(){return this._selection.getSelectedBlocks()}getSelectedElement(){return this._selection.getSelectedElement()}containsEntireContent(e){return this._selection.containsEntireContent(e)}destroy(){this._selection.destroy()}getAttributeKeys(){return this._selection.getAttributeKeys()}getAttributes(){return this._selection.getAttributes()}getAttribute(e){return this._selection.getAttribute(e)}hasAttribute(e){return this._selection.hasAttribute(e)}refresh(){this._selection._updateMarkers(),this._selection._updateAttributes(!1)}observeMarkers(e){this._selection.observeMarkers(e)}is(e){return"selection"===e||"model:selection"==e||"documentSelection"==e||"model:documentSelection"==e}_setFocus(e,t){this._selection.setFocus(e,t)}_setTo(e,t,o){this._selection.setTo(e,t,o)}_setAttribute(e,t){this._selection.setAttribute(e,t)}_removeAttribute(e){this._selection.removeAttribute(e)}_getStoredAttributes(){return this._selection._getStoredAttributes()}_overrideGravity(){return this._selection.overrideGravity()}_restoreGravity(e){this._selection.restoreGravity(e)}static _getStoreAttributeKey(e){return"selection:"+e}static _isStoreAttributeKey(e){return e.startsWith("selection:")}}Object(i.a)(p,r.c);class g extends s.a{constructor(e){super(),this.markers=new d.a({idProperty:"name"}),this._model=e.model,this._document=e,this._attributePriority=new Map,this._selectionRestorePosition=null,this._hasChangedRange=!1,this._overriddenGravityRegister=new Set,this._observedMarkers=new Set,this.listenTo(this._model,"applyOperation",(e,t)=>{const o=t[0];o.isDocumentOperation&&"marker"!=o.type&&"rename"!=o.type&&"noop"!=o.type&&(0==this._ranges.length&&this._selectionRestorePosition&&this._fixGraveyardSelection(this._selectionRestorePosition),this._selectionRestorePosition=null,this._hasChangedRange&&(this._hasChangedRange=!1,this.fire("change:range",{directChange:!1})))},{priority:"lowest"}),this.on("change:range",()=>{for(const e of this.getRanges())if(!this._document._validateSelectionRange(e))throw new u.a("document-selection-wrong-position",this,{range:e})}),this.listenTo(this._model.markers,"update",(e,t,o,i)=>{this._updateMarker(t,i)}),this.listenTo(this._document,"change",(e,t)=>{!function(e,t){const o=e.document.differ;for(const i of o.getChanges()){if("insert"!=i.type)continue;const o=i.position.parent;i.length===o.maxOffset&&e.enqueueChange(t,e=>{const t=Array.from(o.getAttributeKeys()).filter(e=>e.startsWith("selection:"));for(const i of t)e.removeAttribute(i,o)})}}(this._model,t)})}get isCollapsed(){return 0===this._ranges.length?this._document._getDefaultRange().isCollapsed:super.isCollapsed}get anchor(){return super.anchor||this._document._getDefaultRange().start}get focus(){return super.focus||this._document._getDefaultRange().end}get rangeCount(){return this._ranges.length?this._ranges.length:1}get hasOwnRange(){return this._ranges.length>0}get isGravityOverridden(){return!!this._overriddenGravityRegister.size}destroy(){for(let e=0;e<this._ranges.length;e++)this._ranges[e].detach();this.stopListening()}*getRanges(){this._ranges.length?yield*super.getRanges():yield this._document._getDefaultRange()}getFirstRange(){return super.getFirstRange()||this._document._getDefaultRange()}getLastRange(){return super.getLastRange()||this._document._getDefaultRange()}setTo(e,t,o){super.setTo(e,t,o),this._updateAttributes(!0),this._updateMarkers()}setFocus(e,t){super.setFocus(e,t),this._updateAttributes(!0),this._updateMarkers()}setAttribute(e,t){if(this._setAttribute(e,t)){const t=[e];this.fire("change:attribute",{attributeKeys:t,directChange:!0})}}removeAttribute(e){if(this._removeAttribute(e)){const t=[e];this.fire("change:attribute",{attributeKeys:t,directChange:!0})}}overrideGravity(){const e=Object(h.a)();return this._overriddenGravityRegister.add(e),1===this._overriddenGravityRegister.size&&this._updateAttributes(!0),e}restoreGravity(e){if(!this._overriddenGravityRegister.has(e))throw new u.a("document-selection-gravity-wrong-restore",this,{uid:e});this._overriddenGravityRegister.delete(e),this.isGravityOverridden||this._updateAttributes(!0)}observeMarkers(e){this._observedMarkers.add(e),this._updateMarkers()}_popRange(){this._ranges.pop().detach()}_pushRange(e){const t=this._prepareRange(e);t&&this._ranges.push(t)}_prepareRange(e){if(this._checkRange(e),e.root==this._document.graveyard)return;const t=n.a.fromRange(e);return t.on("change:range",(e,o,i)=>{if(this._hasChangedRange=!0,t.root==this._document.graveyard){this._selectionRestorePosition=i.deletionPosition;const e=this._ranges.indexOf(t);this._ranges.splice(e,1),t.detach()}}),t}_updateMarkers(){if(!this._observedMarkers.size)return;const e=[];let t=!1;for(const t of this._model.markers){const o=t.name.split(":",1)[0];if(!this._observedMarkers.has(o))continue;const i=t.getRange();for(const o of this.getRanges())i.containsRange(o,!o.isCollapsed)&&e.push(t)}const o=Array.from(this.markers);for(const o of e)this.markers.has(o)||(this.markers.add(o),t=!0);for(const o of Array.from(this.markers))e.includes(o)||(this.markers.remove(o),t=!0);t&&this.fire("change:marker",{oldMarkers:o,directChange:!1})}_updateMarker(e,t){const o=e.name.split(":",1)[0];if(!this._observedMarkers.has(o))return;let i=!1;const r=Array.from(this.markers),s=this.markers.has(e);if(t){let o=!1;for(const e of this.getRanges())if(t.containsRange(e,!e.isCollapsed)){o=!0;break}o&&!s?(this.markers.add(e),i=!0):!o&&s&&(this.markers.remove(e),i=!0)}else s&&(this.markers.remove(e),i=!0);i&&this.fire("change:marker",{oldMarkers:r,directChange:!1})}_updateAttributes(e){const t=Object(l.a)(this._getSurroundingAttributes()),o=Object(l.a)(this.getAttributes());if(e)this._attributePriority=new Map,this._attrs=new Map;else for(const[e,t]of this._attributePriority)"low"==t&&(this._attrs.delete(e),this._attributePriority.delete(e));this._setAttributesTo(t);const i=[];for(const[e,t]of this.getAttributes())o.has(e)&&o.get(e)===t||i.push(e);for(const[e]of o)this.hasAttribute(e)||i.push(e);i.length>0&&this.fire("change:attribute",{attributeKeys:i,directChange:!1})}_setAttribute(e,t,o=!0){const i=o?"normal":"low";if("low"==i&&"normal"==this._attributePriority.get(e))return!1;return super.getAttribute(e)!==t&&(this._attrs.set(e,t),this._attributePriority.set(e,i),!0)}_removeAttribute(e,t=!0){const o=t?"normal":"low";return("low"!=o||"normal"!=this._attributePriority.get(e))&&(this._attributePriority.set(e,o),!!super.hasAttribute(e)&&(this._attrs.delete(e),!0))}_setAttributesTo(e){const t=new Set;for(const[t,o]of this.getAttributes())e.get(t)!==o&&this._removeAttribute(t,!1);for(const[o,i]of e){this._setAttribute(o,i,!1)&&t.add(o)}return t}*_getStoredAttributes(){const e=this.getFirstPosition().parent;if(this.isCollapsed&&e.isEmpty)for(const t of e.getAttributeKeys())if(t.startsWith("selection:")){const o=t.substr("selection:".length);yield[o,e.getAttribute(t)]}}_getSurroundingAttributes(){const e=this.getFirstPosition(),t=this._model.schema;let o=null;if(this.isCollapsed){const i=e.textNode?e.textNode:e.nodeBefore,r=e.textNode?e.textNode:e.nodeAfter;if(this.isGravityOverridden||(o=f(i)),o||(o=f(r)),!this.isGravityOverridden&&!o){let e=i;for(;e&&!t.isInline(e)&&!o;)e=e.previousSibling,o=f(e)}if(!o){let e=r;for(;e&&!t.isInline(e)&&!o;)e=e.nextSibling,o=f(e)}o||(o=this._getStoredAttributes())}else{const e=this.getFirstRange();for(const i of e){if(i.item.is("element")&&t.isObject(i.item))break;if("text"==i.type){o=i.item.getAttributes();break}}}return o}_fixGraveyardSelection(e){const t=this._model.schema.getNearestSelectionRange(e);t&&this._pushRange(t)}}function f(e){return e instanceof c.a||e instanceof a.a?e.getAttributes():null}},"./packages/ckeditor5-engine/src/model/element.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-engine/src/model/node.js"),r=o("./packages/ckeditor5-engine/src/model/nodelist.js"),s=o("./packages/ckeditor5-engine/src/model/text.js"),n=o("./packages/ckeditor5-engine/src/model/textproxy.js"),a=o("./packages/ckeditor5-utils/src/isiterable.js");class c extends i.a{constructor(e,t,o){super(t),this.name=e,this._children=new r.a,o&&this._insertChild(0,o)}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return 0===this.childCount}is(e,t=null){return t?t===this.name&&("element"===e||"model:element"===e):"element"===e||"model:element"===e||"node"===e||"model:node"===e}getChild(e){return this._children.getNode(e)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(e){return this._children.getNodeIndex(e)}getChildStartOffset(e){return this._children.getNodeStartOffset(e)}offsetToIndex(e){return this._children.offsetToIndex(e)}getNodeByPath(e){let t=this;for(const o of e)t=t.getChild(t.offsetToIndex(o));return t}findAncestor(e,t={includeSelf:!1}){let o=t.includeSelf?this:this.parent;for(;o;){if(o.name===e)return o;o=o.parent}return null}toJSON(){const e=super.toJSON();if(e.name=this.name,this._children.length>0){e.children=[];for(const t of this._children)e.children.push(t.toJSON())}return e}_clone(e=!1){const t=e?Array.from(this._children).map(e=>e._clone(!0)):null;return new c(this.name,this.getAttributes(),t)}_appendChild(e){this._insertChild(this.childCount,e)}_insertChild(e,t){const o=function(e){if("string"==typeof e)return[new s.a(e)];Object(a.a)(e)||(e=[e]);return Array.from(e).map(e=>"string"==typeof e?new s.a(e):e instanceof n.a?new s.a(e.data,e.getAttributes()):e)}(t);for(const e of o)null!==e.parent&&e._remove(),e.parent=this;this._children._insertNodes(e,o)}_removeChildren(e,t=1){const o=this._children._removeNodes(e,t);for(const e of o)e.parent=null;return o}static fromJSON(e){let t=null;if(e.children){t=[];for(const o of e.children)o.name?t.push(c.fromJSON(o)):t.push(s.a.fromJSON(o))}return new c(e.name,e.attributes,t)}}},"./packages/ckeditor5-engine/src/model/liveposition.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-engine/src/model/position.js"),r=o("./packages/ckeditor5-utils/src/emittermixin.js"),s=o("./packages/ckeditor5-utils/src/mix.js"),n=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class a extends i.a{constructor(e,t,o="toNone"){if(super(e,t,o),!this.root.is("rootElement"))throw new n.a("model-liveposition-root-not-rootelement",e);c.call(this)}detach(){this.stopListening()}is(e){return"livePosition"===e||"model:livePosition"===e||"position"==e||"model:position"===e}toPosition(){return new i.a(this.root,this.path.slice(),this.stickiness)}static fromPosition(e,t){return new this(e.root,e.path.slice(),t||e.stickiness)}}function c(){this.listenTo(this.root.document.model,"applyOperation",(e,t)=>{const o=t[0];o.isDocumentOperation&&l.call(this,o)},{priority:"low"})}function l(e){const t=this.getTransformedByOperation(e);if(!this.isEqual(t)){const e=this.toPosition();this.path=t.path,this.root=t.root,this.fire("change",e)}}Object(s.a)(a,r.c)},"./packages/ckeditor5-engine/src/model/liverange.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return n}));var i=o("./packages/ckeditor5-engine/src/model/range.js"),r=o("./packages/ckeditor5-utils/src/emittermixin.js"),s=o("./packages/ckeditor5-utils/src/mix.js");class n extends i.a{constructor(e,t){super(e,t),a.call(this)}detach(){this.stopListening()}is(e){return"liveRange"===e||"model:liveRange"===e||"range"==e||"model:range"===e}toRange(){return new i.a(this.start,this.end)}static fromRange(e){return new n(e.start,e.end)}}function a(){this.listenTo(this.root.document.model,"applyOperation",(e,t)=>{const o=t[0];o.isDocumentOperation&&c.call(this,o)},{priority:"low"})}function c(e){const t=this.getTransformedByOperation(e),o=i.a._createFromRanges(t),r=!o.isEqual(this),s=function(e,t){switch(t.type){case"insert":return e.containsPosition(t.position);case"move":case"remove":case"reinsert":case"merge":return e.containsPosition(t.sourcePosition)||e.start.isEqual(t.sourcePosition)||e.containsPosition(t.targetPosition);case"split":return e.containsPosition(t.splitPosition)||e.containsPosition(t.insertionPosition)}return!1}(this,e);let n=null;if(r){"$graveyard"==o.root.rootName&&(n="remove"==e.type?e.sourcePosition:e.deletionPosition);const t=this.toRange();this.start=o.start,this.end=o.end,this.fire("change:range",t,{deletionPosition:n})}else s&&this.fire("change:content",this.toRange(),{deletionPosition:n})}Object(s.a)(n,r.c)},"./packages/ckeditor5-engine/src/model/model.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return pe}));class i{constructor(e="default"){this.operations=[],this.type=e}get baseVersion(){for(const e of this.operations)if(null!==e.baseVersion)return e.baseVersion;return null}addOperation(e){return e.batch=this,this.operations.push(e),e}}var r=o("./packages/ckeditor5-engine/src/model/operation/attributeoperation.js"),s=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),n=o("./packages/ckeditor5-engine/src/model/range.js"),a=o("./packages/ckeditor5-engine/src/model/operation/utils.js"),c=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class l extends s.a{constructor(e,t){super(null),this.sourcePosition=e.clone(),this.howMany=t}get type(){return"detach"}toJSON(){const e=super.toJSON();return e.sourcePosition=this.sourcePosition.toJSON(),e}_validate(){if(this.sourcePosition.root.document)throw new c.a("detach-operation-on-document-node",this)}_execute(){Object(a.d)(n.a._createFromPositionAndShift(this.sourcePosition,this.howMany))}static get className(){return"DetachOperation"}}var d=o("./packages/ckeditor5-engine/src/model/operation/insertoperation.js"),u=o("./packages/ckeditor5-engine/src/model/operation/markeroperation.js"),h=o("./packages/ckeditor5-engine/src/model/operation/moveoperation.js"),p=o("./packages/ckeditor5-engine/src/model/operation/renameoperation.js"),g=o("./packages/ckeditor5-engine/src/model/operation/rootattributeoperation.js"),f=o("./packages/ckeditor5-engine/src/model/operation/splitoperation.js"),m=o("./packages/ckeditor5-engine/src/model/operation/mergeoperation.js"),k=o("./packages/ckeditor5-engine/src/model/documentfragment.js"),b=o("./packages/ckeditor5-engine/src/model/text.js"),_=o("./packages/ckeditor5-engine/src/model/element.js");class w extends _.a{constructor(e,t,o="main"){super(t),this._document=e,this.rootName=o}get document(){return this._document}is(e,t){return t?t===this.name&&("rootElement"===e||"model:rootElement"===e||"element"===e||"model:element"===e):"rootElement"===e||"model:rootElement"===e||"element"===e||"model:element"===e||"node"===e||"model:node"===e}toJSON(){return this.rootName}}var v=o("./packages/ckeditor5-engine/src/model/position.js"),y=o("./packages/ckeditor5-engine/src/model/documentselection.js"),j=o("./packages/ckeditor5-utils/src/tomap.js");class x{constructor(e,t){this.model=e,this.batch=t}createText(e,t){return new b.a(e,t)}createElement(e,t){return new _.a(e,t)}createDocumentFragment(){return new k.a}cloneElement(e,t=!0){return e._clone(t)}insert(e,t,o=0){if(this._assertWriterUsedCorrectly(),e instanceof b.a&&""==e.data)return;const i=v.a._createAt(t,o);if(e.parent){if(C(e.root,i.root))return void this.move(n.a._createOn(e),i);if(e.root.document)throw new c.a("model-writer-insert-forbidden-move",this);this.remove(e)}const r=i.root.document?i.root.document.version:null,s=new d.a(i,e,r);if(e instanceof b.a&&(s.shouldReceiveAttributes=!0),this.batch.addOperation(s),this.model.applyOperation(s),e instanceof k.a)for(const[t,o]of e.markers){const e=v.a._createAt(o.root,0),r={range:new n.a(o.start._getCombined(e,i),o.end._getCombined(e,i)),usingOperation:!0,affectsData:!0};this.model.markers.has(t)?this.updateMarker(t,r):this.addMarker(t,r)}}insertText(e,t,o,i){t instanceof k.a||t instanceof _.a||t instanceof v.a?this.insert(this.createText(e),t,o):this.insert(this.createText(e,t),o,i)}insertElement(e,t,o,i){t instanceof k.a||t instanceof _.a||t instanceof v.a?this.insert(this.createElement(e),t,o):this.insert(this.createElement(e,t),o,i)}append(e,t){this.insert(e,t,"end")}appendText(e,t,o){t instanceof k.a||t instanceof _.a?this.insert(this.createText(e),t,"end"):this.insert(this.createText(e,t),o,"end")}appendElement(e,t,o){t instanceof k.a||t instanceof _.a?this.insert(this.createElement(e),t,"end"):this.insert(this.createElement(e,t),o,"end")}setAttribute(e,t,o){if(this._assertWriterUsedCorrectly(),o instanceof n.a){const i=o.getMinimalFlatRanges();for(const o of i)P(this,e,t,o)}else O(this,e,t,o)}setAttributes(e,t){for(const[o,i]of Object(j.a)(e))this.setAttribute(o,i,t)}removeAttribute(e,t){if(this._assertWriterUsedCorrectly(),t instanceof n.a){const o=t.getMinimalFlatRanges();for(const t of o)P(this,e,null,t)}else O(this,e,null,t)}clearAttributes(e){this._assertWriterUsedCorrectly();const t=e=>{for(const t of e.getAttributeKeys())this.removeAttribute(t,e)};if(e instanceof n.a)for(const o of e.getItems())t(o);else t(e)}move(e,t,o){if(this._assertWriterUsedCorrectly(),!(e instanceof n.a))throw new c.a("writer-move-invalid-range",this);if(!e.isFlat)throw new c.a("writer-move-range-not-flat",this);const i=v.a._createAt(t,o);if(i.isEqual(e.start))return;if(this._addOperationForAffectedMarkers("move",e),!C(e.root,i.root))throw new c.a("writer-move-different-document",this);const r=e.root.document?e.root.document.version:null,s=new h.a(e.start,e.end.offset-e.start.offset,i,r);this.batch.addOperation(s),this.model.applyOperation(s)}remove(e){this._assertWriterUsedCorrectly();const t=(e instanceof n.a?e:n.a._createOn(e)).getMinimalFlatRanges().reverse();for(const e of t)this._addOperationForAffectedMarkers("move",e),T(e.start,e.end.offset-e.start.offset,this.batch,this.model)}merge(e){this._assertWriterUsedCorrectly();const t=e.nodeBefore,o=e.nodeAfter;if(this._addOperationForAffectedMarkers("merge",e),!(t instanceof _.a))throw new c.a("writer-merge-no-element-before",this);if(!(o instanceof _.a))throw new c.a("writer-merge-no-element-after",this);e.root.document?this._merge(e):this._mergeDetached(e)}createPositionFromPath(e,t,o){return this.model.createPositionFromPath(e,t,o)}createPositionAt(e,t){return this.model.createPositionAt(e,t)}createPositionAfter(e){return this.model.createPositionAfter(e)}createPositionBefore(e){return this.model.createPositionBefore(e)}createRange(e,t){return this.model.createRange(e,t)}createRangeIn(e){return this.model.createRangeIn(e)}createRangeOn(e){return this.model.createRangeOn(e)}createSelection(e,t,o){return this.model.createSelection(e,t,o)}_mergeDetached(e){const t=e.nodeBefore,o=e.nodeAfter;this.move(n.a._createIn(o),v.a._createAt(t,"end")),this.remove(o)}_merge(e){const t=v.a._createAt(e.nodeBefore,"end"),o=v.a._createAt(e.nodeAfter,0),i=e.root.document.graveyard,r=new v.a(i,[0]),s=e.root.document.version,n=new m.a(o,e.nodeAfter.maxOffset,t,r,s);this.batch.addOperation(n),this.model.applyOperation(n)}rename(e,t){if(this._assertWriterUsedCorrectly(),!(e instanceof _.a))throw new c.a("writer-rename-not-element-instance",this);const o=e.root.document?e.root.document.version:null,i=new p.a(v.a._createBefore(e),e.name,t,o);this.batch.addOperation(i),this.model.applyOperation(i)}split(e,t){this._assertWriterUsedCorrectly();let o,i,r=e.parent;if(!r.parent)throw new c.a("writer-split-element-no-parent",this);if(t||(t=r.parent),!e.parent.getAncestors({includeSelf:!0}).includes(t))throw new c.a("writer-split-invalid-limit-element",this);do{const t=r.root.document?r.root.document.version:null,s=r.maxOffset-e.offset,n=f.a.getInsertionPosition(e),a=new f.a(e,s,n,null,t);this.batch.addOperation(a),this.model.applyOperation(a),o||i||(o=r,i=e.parent.nextSibling),r=(e=this.createPositionAfter(e.parent)).parent}while(r!==t);return{position:e,range:new n.a(v.a._createAt(o,"end"),v.a._createAt(i,0))}}wrap(e,t){if(this._assertWriterUsedCorrectly(),!e.isFlat)throw new c.a("writer-wrap-range-not-flat",this);const o=t instanceof _.a?t:new _.a(t);if(o.childCount>0)throw new c.a("writer-wrap-element-not-empty",this);if(null!==o.parent)throw new c.a("writer-wrap-element-attached",this);this.insert(o,e.start);const i=new n.a(e.start.getShiftedBy(1),e.end.getShiftedBy(1));this.move(i,v.a._createAt(o,0))}unwrap(e){if(this._assertWriterUsedCorrectly(),null===e.parent)throw new c.a("writer-unwrap-element-no-parent",this);this.move(n.a._createIn(e),this.createPositionAfter(e)),this.remove(e)}addMarker(e,t){if(this._assertWriterUsedCorrectly(),!t||"boolean"!=typeof t.usingOperation)throw new c.a("writer-addmarker-no-usingoperation",this);const o=t.usingOperation,i=t.range,r=void 0!==t.affectsData&&t.affectsData;if(this.model.markers.has(e))throw new c.a("writer-addmarker-marker-exists",this);if(!i)throw new c.a("writer-addmarker-no-range",this);return o?(A(this,e,null,i,r),this.model.markers.get(e)):this.model.markers._set(e,i,o,r)}updateMarker(e,t){this._assertWriterUsedCorrectly();const o="string"==typeof e?e:e.name,i=this.model.markers.get(o);if(!i)throw new c.a("writer-updatemarker-marker-not-exists",this);if(!t)return void this.model.markers._refresh(i);const r="boolean"==typeof t.usingOperation,s="boolean"==typeof t.affectsData,n=s?t.affectsData:i.affectsData;if(!r&&!t.range&&!s)throw new c.a("writer-updatemarker-wrong-options",this);const a=i.getRange(),l=t.range?t.range:a;r&&t.usingOperation!==i.managedUsingOperations?t.usingOperation?A(this,o,null,l,n):(A(this,o,a,null,n),this.model.markers._set(o,l,void 0,n)):i.managedUsingOperations?A(this,o,a,l,n):this.model.markers._set(o,l,void 0,n)}removeMarker(e){this._assertWriterUsedCorrectly();const t="string"==typeof e?e:e.name;if(!this.model.markers.has(t))throw new c.a("writer-removemarker-no-marker",this);const o=this.model.markers.get(t);if(!o.managedUsingOperations)return void this.model.markers._remove(t);A(this,t,o.getRange(),null,o.affectsData)}setSelection(e,t,o){this._assertWriterUsedCorrectly(),this.model.document.selection._setTo(e,t,o)}setSelectionFocus(e,t){this._assertWriterUsedCorrectly(),this.model.document.selection._setFocus(e,t)}setSelectionAttribute(e,t){if(this._assertWriterUsedCorrectly(),"string"==typeof e)this._setSelectionAttribute(e,t);else for(const[t,o]of Object(j.a)(e))this._setSelectionAttribute(t,o)}removeSelectionAttribute(e){if(this._assertWriterUsedCorrectly(),"string"==typeof e)this._removeSelectionAttribute(e);else for(const t of e)this._removeSelectionAttribute(t)}overrideSelectionGravity(){return this.model.document.selection._overrideGravity()}restoreSelectionGravity(e){this.model.document.selection._restoreGravity(e)}_setSelectionAttribute(e,t){const o=this.model.document.selection;if(o.isCollapsed&&o.anchor.parent.isEmpty){const i=y.a._getStoreAttributeKey(e);this.setAttribute(i,t,o.anchor.parent)}o._setAttribute(e,t)}_removeSelectionAttribute(e){const t=this.model.document.selection;if(t.isCollapsed&&t.anchor.parent.isEmpty){const o=y.a._getStoreAttributeKey(e);this.removeAttribute(o,t.anchor.parent)}t._removeAttribute(e)}_assertWriterUsedCorrectly(){if(this.model._currentWriter!==this)throw new c.a("writer-incorrect-use",this)}_addOperationForAffectedMarkers(e,t){for(const o of this.model.markers){if(!o.managedUsingOperations)continue;const i=o.getRange();let r=!1;if("move"===e)r=t.containsPosition(i.start)||t.start.isEqual(i.start)||t.containsPosition(i.end)||t.end.isEqual(i.end);else{const e=t.nodeBefore,o=t.nodeAfter,s=i.start.parent==e&&i.start.isAtEnd,n=i.end.parent==o&&0==i.end.offset,a=i.end.nodeAfter==o,c=i.start.nodeAfter==o;r=s||n||a||c}r&&this.updateMarker(o.name,{range:i})}}}function P(e,t,o,i){const s=e.model,a=s.document;let c,l,d,u=i.start;for(const e of i.getWalker({shallow:!0}))d=e.item.getAttribute(t),c&&l!=d&&(l!=o&&h(),u=c),c=e.nextPosition,l=d;function h(){const i=new n.a(u,c),d=i.root.document?a.version:null,h=new r.a(i,t,l,o,d);e.batch.addOperation(h),s.applyOperation(h)}c instanceof v.a&&c!=u&&l!=o&&h()}function O(e,t,o,i){const s=e.model,a=s.document,c=i.getAttribute(t);let l,d;if(c!=o){if(i.root===i){const e=i.document?a.version:null;d=new g.a(i,t,c,o,e)}else{l=new n.a(v.a._createBefore(i),e.createPositionAfter(i));const s=l.root.document?a.version:null;d=new r.a(l,t,c,o,s)}e.batch.addOperation(d),s.applyOperation(d)}}function A(e,t,o,i,r){const s=e.model,n=s.document,a=new u.a(t,o,i,s.markers,r,n.version);e.batch.addOperation(a),s.applyOperation(a)}function T(e,t,o,i){let r;if(e.root.document){const o=i.document,s=new v.a(o.graveyard,[0]);r=new h.a(e,t,s,o.version)}else r=new l(e,t);o.addOperation(r),i.applyOperation(r)}function C(e,t){return e===t||e instanceof w&&t instanceof w}var E=o("./packages/ckeditor5-engine/src/model/schema.js");class S{constructor(e){this._markerCollection=e,this._changesInElement=new Map,this._elementSnapshots=new Map,this._changedMarkers=new Map,this._changeCount=0,this._cachedChanges=null,this._cachedChangesWithGraveyard=null}get isEmpty(){return 0==this._changesInElement.size&&0==this._changedMarkers.size}refreshItem(e){if(this._isInInsertedElement(e.parent))return;this._markRemove(e.parent,e.startOffset,e.offsetSize),this._markInsert(e.parent,e.startOffset,e.offsetSize);const t=n.a._createOn(e);for(const e of this._markerCollection.getMarkersIntersectingRange(t)){const t=e.getRange();this.bufferMarkerChange(e.name,t,t,e.affectsData)}this._cachedChanges=null}bufferOperation(e){switch(e.type){case"insert":if(this._isInInsertedElement(e.position.parent))return;this._markInsert(e.position.parent,e.position.offset,e.nodes.maxOffset);break;case"addAttribute":case"removeAttribute":case"changeAttribute":for(const t of e.range.getItems({shallow:!0}))this._isInInsertedElement(t.parent)||this._markAttribute(t);break;case"remove":case"move":case"reinsert":{if(e.sourcePosition.isEqual(e.targetPosition)||e.sourcePosition.getShiftedBy(e.howMany).isEqual(e.targetPosition))return;const t=this._isInInsertedElement(e.sourcePosition.parent),o=this._isInInsertedElement(e.targetPosition.parent);t||this._markRemove(e.sourcePosition.parent,e.sourcePosition.offset,e.howMany),o||this._markInsert(e.targetPosition.parent,e.getMovedRangeStart().offset,e.howMany);break}case"rename":{if(this._isInInsertedElement(e.position.parent))return;this._markRemove(e.position.parent,e.position.offset,1),this._markInsert(e.position.parent,e.position.offset,1);const t=n.a._createFromPositionAndShift(e.position,1);for(const e of this._markerCollection.getMarkersIntersectingRange(t)){const t=e.getRange();this.bufferMarkerChange(e.name,t,t,e.affectsData)}break}case"split":{const t=e.splitPosition.parent;this._isInInsertedElement(t)||this._markRemove(t,e.splitPosition.offset,e.howMany),this._isInInsertedElement(e.insertionPosition.parent)||this._markInsert(e.insertionPosition.parent,e.insertionPosition.offset,1),e.graveyardPosition&&this._markRemove(e.graveyardPosition.parent,e.graveyardPosition.offset,1);break}case"merge":{const t=e.sourcePosition.parent;this._isInInsertedElement(t.parent)||this._markRemove(t.parent,t.startOffset,1);const o=e.graveyardPosition.parent;this._markInsert(o,e.graveyardPosition.offset,1);const i=e.targetPosition.parent;this._isInInsertedElement(i)||this._markInsert(i,e.targetPosition.offset,t.maxOffset);break}}this._cachedChanges=null}bufferMarkerChange(e,t,o,i){const r=this._changedMarkers.get(e);r?(r.newRange=o,r.affectsData=i,null==r.oldRange&&null==r.newRange&&this._changedMarkers.delete(e)):this._changedMarkers.set(e,{oldRange:t,newRange:o,affectsData:i})}getMarkersToRemove(){const e=[];for(const[t,o]of this._changedMarkers)null!=o.oldRange&&e.push({name:t,range:o.oldRange});return e}getMarkersToAdd(){const e=[];for(const[t,o]of this._changedMarkers)null!=o.newRange&&e.push({name:t,range:o.newRange});return e}getChangedMarkers(){return Array.from(this._changedMarkers).map(e=>({name:e[0],data:{oldRange:e[1].oldRange,newRange:e[1].newRange}}))}hasDataChanges(){for(const[,e]of this._changedMarkers)if(e.affectsData)return!0;return this._changesInElement.size>0}getChanges(e={includeChangesInGraveyard:!1}){if(this._cachedChanges)return e.includeChangesInGraveyard?this._cachedChangesWithGraveyard.slice():this._cachedChanges.slice();let t=[];for(const e of this._changesInElement.keys()){const o=this._changesInElement.get(e).sort((e,t)=>e.offset===t.offset?e.type!=t.type?"remove"==e.type?-1:1:0:e.offset<t.offset?-1:1),i=this._elementSnapshots.get(e),r=R(e.getChildren()),s=M(i.length,o);let a=0,c=0;for(const o of s)if("i"===o)t.push(this._getInsertDiff(e,a,r[a].name)),a++;else if("r"===o)t.push(this._getRemoveDiff(e,a,i[c].name)),c++;else if("a"===o){const o=r[a].attributes,s=i[c].attributes;let l;if("$text"==r[a].name)l=new n.a(v.a._createAt(e,a),v.a._createAt(e,a+1));else{const t=e.offsetToIndex(a);l=new n.a(v.a._createAt(e,a),v.a._createAt(e.getChild(t),0))}t.push(...this._getAttributesDiff(l,s,o)),a++,c++}else a++,c++}t.sort((e,t)=>e.position.root!=t.position.root?e.position.root.rootName<t.position.root.rootName?-1:1:e.position.isEqual(t.position)?e.changeCount-t.changeCount:e.position.isBefore(t.position)?-1:1);for(let e=1,o=0;e<t.length;e++){const i=t[o],r=t[e],s="remove"==i.type&&"remove"==r.type&&"$text"==i.name&&"$text"==r.name&&i.position.isEqual(r.position),n="insert"==i.type&&"insert"==r.type&&"$text"==i.name&&"$text"==r.name&&i.position.parent==r.position.parent&&i.position.offset+i.length==r.position.offset,a="attribute"==i.type&&"attribute"==r.type&&i.position.parent==r.position.parent&&i.range.isFlat&&r.range.isFlat&&i.position.offset+i.length==r.position.offset&&i.attributeKey==r.attributeKey&&i.attributeOldValue==r.attributeOldValue&&i.attributeNewValue==r.attributeNewValue;s||n||a?(i.length++,a&&(i.range.end=i.range.end.getShiftedBy(1)),t[e]=null):o=e}t=t.filter(e=>e);for(const e of t)delete e.changeCount,"attribute"==e.type&&(delete e.position,delete e.length);return this._changeCount=0,this._cachedChangesWithGraveyard=t.slice(),this._cachedChanges=t.filter(N),e.includeChangesInGraveyard?this._cachedChangesWithGraveyard:this._cachedChanges}reset(){this._changesInElement.clear(),this._elementSnapshots.clear(),this._changedMarkers.clear(),this._cachedChanges=null}_markInsert(e,t,o){const i={type:"insert",offset:t,howMany:o,count:this._changeCount++};this._markChange(e,i)}_markRemove(e,t,o){const i={type:"remove",offset:t,howMany:o,count:this._changeCount++};this._markChange(e,i),this._removeAllNestedChanges(e,t,o)}_markAttribute(e){const t={type:"attribute",offset:e.startOffset,howMany:e.offsetSize,count:this._changeCount++};this._markChange(e.parent,t)}_markChange(e,t){this._makeSnapshot(e);const o=this._getChangesForElement(e);this._handleChange(t,o),o.push(t);for(let e=0;e<o.length;e++)o[e].howMany<1&&(o.splice(e,1),e--)}_getChangesForElement(e){let t;return this._changesInElement.has(e)?t=this._changesInElement.get(e):(t=[],this._changesInElement.set(e,t)),t}_makeSnapshot(e){this._elementSnapshots.has(e)||this._elementSnapshots.set(e,R(e.getChildren()))}_handleChange(e,t){e.nodesToHandle=e.howMany;for(const o of t){const i=e.offset+e.howMany,r=o.offset+o.howMany;if("insert"==e.type&&("insert"==o.type&&(e.offset<=o.offset?o.offset+=e.howMany:e.offset<r&&(o.howMany+=e.nodesToHandle,e.nodesToHandle=0)),"remove"==o.type&&e.offset<o.offset&&(o.offset+=e.howMany),"attribute"==o.type))if(e.offset<=o.offset)o.offset+=e.howMany;else if(e.offset<r){const r=o.howMany;o.howMany=e.offset-o.offset,t.unshift({type:"attribute",offset:i,howMany:r-o.howMany,count:this._changeCount++})}if("remove"==e.type){if("insert"==o.type)if(i<=o.offset)o.offset-=e.howMany;else if(i<=r)if(e.offset<o.offset){const t=i-o.offset;o.offset=e.offset,o.howMany-=t,e.nodesToHandle-=t}else o.howMany-=e.nodesToHandle,e.nodesToHandle=0;else if(e.offset<=o.offset)e.nodesToHandle-=o.howMany,o.howMany=0;else if(e.offset<r){const t=r-e.offset;o.howMany-=t,e.nodesToHandle-=t}if("remove"==o.type&&(i<=o.offset?o.offset-=e.howMany:e.offset<o.offset&&(e.nodesToHandle+=o.howMany,o.howMany=0)),"attribute"==o.type)if(i<=o.offset)o.offset-=e.howMany;else if(e.offset<o.offset){const t=i-o.offset;o.offset=e.offset,o.howMany-=t}else if(e.offset<r)if(i<=r){const i=o.howMany;o.howMany=e.offset-o.offset;const r=i-o.howMany-e.nodesToHandle;t.unshift({type:"attribute",offset:e.offset,howMany:r,count:this._changeCount++})}else o.howMany-=r-e.offset}if("attribute"==e.type){if("insert"==o.type)if(e.offset<o.offset&&i>o.offset){if(i>r){const e={type:"attribute",offset:r,howMany:i-r,count:this._changeCount++};this._handleChange(e,t),t.push(e)}e.nodesToHandle=o.offset-e.offset,e.howMany=e.nodesToHandle}else e.offset>=o.offset&&e.offset<r&&(i>r?(e.nodesToHandle=i-r,e.offset=r):e.nodesToHandle=0);if("remove"==o.type&&e.offset<o.offset&&i>o.offset){const r={type:"attribute",offset:o.offset,howMany:i-o.offset,count:this._changeCount++};this._handleChange(r,t),t.push(r),e.nodesToHandle=o.offset-e.offset,e.howMany=e.nodesToHandle}"attribute"==o.type&&(e.offset>=o.offset&&i<=r?(e.nodesToHandle=0,e.howMany=0,e.offset=0):e.offset<=o.offset&&i>=r&&(o.howMany=0))}}e.howMany=e.nodesToHandle,delete e.nodesToHandle}_getInsertDiff(e,t,o){return{type:"insert",position:v.a._createAt(e,t),name:o,length:1,changeCount:this._changeCount++}}_getRemoveDiff(e,t,o){return{type:"remove",position:v.a._createAt(e,t),name:o,length:1,changeCount:this._changeCount++}}_getAttributesDiff(e,t,o){const i=[];o=new Map(o);for(const[r,s]of t){const t=o.has(r)?o.get(r):null;t!==s&&i.push({type:"attribute",position:e.start,range:e.clone(),length:1,attributeKey:r,attributeOldValue:s,attributeNewValue:t,changeCount:this._changeCount++}),o.delete(r)}for(const[t,r]of o)i.push({type:"attribute",position:e.start,range:e.clone(),length:1,attributeKey:t,attributeOldValue:null,attributeNewValue:r,changeCount:this._changeCount++});return i}_isInInsertedElement(e){const t=e.parent;if(!t)return!1;const o=this._changesInElement.get(t),i=e.startOffset;if(o)for(const e of o)if("insert"==e.type&&i>=e.offset&&i<e.offset+e.howMany)return!0;return this._isInInsertedElement(t)}_removeAllNestedChanges(e,t,o){const i=new n.a(v.a._createAt(e,t),v.a._createAt(e,t+o));for(const e of i.getItems({shallow:!0}))e.is("element")&&(this._elementSnapshots.delete(e),this._changesInElement.delete(e),this._removeAllNestedChanges(e,0,e.maxOffset))}}function R(e){const t=[];for(const o of e)if(o.is("$text"))for(let e=0;e<o.data.length;e++)t.push({name:"$text",attributes:new Map(o.getAttributes())});else t.push({name:o.name,attributes:new Map(o.getAttributes())});return t}function M(e,t){const o=[];let i=0,r=0;for(const e of t){if(e.offset>i){for(let t=0;t<e.offset-i;t++)o.push("e");r+=e.offset-i}if("insert"==e.type){for(let t=0;t<e.howMany;t++)o.push("i");i=e.offset+e.howMany}else if("remove"==e.type){for(let t=0;t<e.howMany;t++)o.push("r");i=e.offset,r+=e.howMany}else o.push(..."a".repeat(e.howMany).split("")),i=e.offset+e.howMany,r+=e.howMany}if(r<e)for(let t=0;t<e-r-i;t++)o.push("e");return o}function N(e){const t=e.position&&"$graveyard"==e.position.root.rootName,o=e.range&&"$graveyard"==e.range.root.rootName;return!t&&!o}class I{constructor(){this._operations=[],this._undoPairs=new Map,this._undoneOperations=new Set}addOperation(e){this._operations.includes(e)||this._operations.push(e)}getOperations(e=Number.NEGATIVE_INFINITY,t=Number.POSITIVE_INFINITY){const o=[];for(const i of this._operations)i.baseVersion>=e&&i.baseVersion<t&&o.push(i);return o}getOperation(e){for(const t of this._operations)if(t.baseVersion==e)return t}setOperationAsUndone(e,t){this._undoPairs.set(t,e),this._undoneOperations.add(e)}isUndoingOperation(e){return this._undoPairs.has(e)}isUndoneOperation(e){return this._undoneOperations.has(e)}getUndoneOperation(e){return this._undoPairs.get(e)}}var z=o("./packages/ckeditor5-utils/src/collection.js"),V=o("./packages/ckeditor5-utils/src/emittermixin.js"),D=o("./packages/ckeditor5-utils/src/mix.js");function B(e,t){return!!(o=e.charAt(t-1))&&1==o.length&&/[\ud800-\udbff]/.test(o)&&function(e){return!!e&&1==e.length&&/[\udc00-\udfff]/.test(e)}(e.charAt(t));var o}function F(e,t){return!!(o=e.charAt(t))&&1==o.length&&/[\u0300-\u036f\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]/.test(o);var o}var L=o("./node_modules/lodash-es/clone.js");class W{constructor(e){this.model=e,this.version=0,this.history=new I(this),this.selection=new y.a(this),this.roots=new z.a({idProperty:"rootName"}),this.differ=new S(e.markers),this._postFixers=new Set,this._hasSelectionChangedFromTheLastChangeBlock=!1,this.createRoot("$root","$graveyard"),this.listenTo(e,"applyOperation",(e,t)=>{const o=t[0];if(o.isDocumentOperation&&o.baseVersion!==this.version)throw new c.a("model-document-applyoperation-wrong-version",this,{operation:o})},{priority:"highest"}),this.listenTo(e,"applyOperation",(e,t)=>{const o=t[0];o.isDocumentOperation&&this.differ.bufferOperation(o)},{priority:"high"}),this.listenTo(e,"applyOperation",(e,t)=>{const o=t[0];o.isDocumentOperation&&(this.version++,this.history.addOperation(o))},{priority:"low"}),this.listenTo(this.selection,"change",()=>{this._hasSelectionChangedFromTheLastChangeBlock=!0}),this.listenTo(e.markers,"update",(e,t,o,i)=>{this.differ.bufferMarkerChange(t.name,o,i,t.affectsData),null===o&&t.on("change",(e,o)=>{this.differ.bufferMarkerChange(t.name,o,t.getRange(),t.affectsData)})})}get graveyard(){return this.getRoot("$graveyard")}createRoot(e="$root",t="main"){if(this.roots.get(t))throw new c.a("model-document-createroot-name-exists",this,{name:t});const o=new w(this,e,t);return this.roots.add(o),o}destroy(){this.selection.destroy(),this.stopListening()}getRoot(e="main"){return this.roots.get(e)}getRootNames(){return Array.from(this.roots,e=>e.rootName).filter(e=>"$graveyard"!=e)}registerPostFixer(e){this._postFixers.add(e)}toJSON(){const e=Object(L.a)(this);return e.selection="[engine.model.DocumentSelection]",e.model="[engine.model.Model]",e}_handleChangeBlock(e){this._hasDocumentChangedFromTheLastChangeBlock()&&(this._callPostFixers(e),this.selection.refresh(),this.differ.hasDataChanges()?this.fire("change:data",e.batch):this.fire("change",e.batch),this.selection.refresh(),this.differ.reset()),this._hasSelectionChangedFromTheLastChangeBlock=!1}_hasDocumentChangedFromTheLastChangeBlock(){return!this.differ.isEmpty||this._hasSelectionChangedFromTheLastChangeBlock}_getDefaultRoot(){for(const e of this.roots)if(e!==this.graveyard)return e;return this.graveyard}_getDefaultRange(){const e=this._getDefaultRoot(),t=this.model,o=t.schema,i=t.createPositionFromPath(e,[0]);return o.getNearestSelectionRange(i)||t.createRange(i)}_validateSelectionRange(e){return H(e.start)&&H(e.end)}_callPostFixers(e){let t=!1;do{for(const o of this._postFixers)if(this.selection.refresh(),t=o(e),t)break}while(t)}}function H(e){const t=e.textNode;if(t){const o=t.data,i=e.offset-t.startOffset;return!B(o,i)&&!F(o,i)}return!0}Object(D.a)(W,V.c);var q=o("./packages/ckeditor5-engine/src/model/liverange.js");class ${constructor(){this._markers=new Map}[Symbol.iterator](){return this._markers.values()}has(e){return this._markers.has(e)}get(e){return this._markers.get(e)||null}_set(e,t,o=!1,i=!1){const r=e instanceof U?e.name:e;if(r.includes(","))throw new c.a("markercollection-incorrect-marker-name",this);const s=this._markers.get(r);if(s){const e=s.getRange();let n=!1;return e.isEqual(t)||(s._attachLiveRange(q.a.fromRange(t)),n=!0),o!=s.managedUsingOperations&&(s._managedUsingOperations=o,n=!0),"boolean"==typeof i&&i!=s.affectsData&&(s._affectsData=i,n=!0),n&&this.fire("update:"+r,s,e,t),s}const n=q.a.fromRange(t),a=new U(r,n,o,i);return this._markers.set(r,a),this.fire("update:"+r,a,null,t),a}_remove(e){const t=e instanceof U?e.name:e,o=this._markers.get(t);return!!o&&(this._markers.delete(t),this.fire("update:"+t,o,o.getRange(),null),this._destroyMarker(o),!0)}_refresh(e){const t=e instanceof U?e.name:e,o=this._markers.get(t);if(!o)throw new c.a("markercollection-refresh-marker-not-exists",this);const i=o.getRange();this.fire("update:"+t,o,i,i,o.managedUsingOperations,o.affectsData)}*getMarkersAtPosition(e){for(const t of this)t.getRange().containsPosition(e)&&(yield t)}*getMarkersIntersectingRange(e){for(const t of this)null!==t.getRange().getIntersection(e)&&(yield t)}destroy(){for(const e of this._markers.values())this._destroyMarker(e);this._markers=null,this.stopListening()}*getMarkersGroup(e){for(const t of this._markers.values())t.name.startsWith(e+":")&&(yield t)}_destroyMarker(e){e.stopListening(),e._detachLiveRange()}}Object(D.a)($,V.c);class U{constructor(e,t,o,i){this.name=e,this._liveRange=this._attachLiveRange(t),this._managedUsingOperations=o,this._affectsData=i}get managedUsingOperations(){if(!this._liveRange)throw new c.a("marker-destroyed",this);return this._managedUsingOperations}get affectsData(){if(!this._liveRange)throw new c.a("marker-destroyed",this);return this._affectsData}getStart(){if(!this._liveRange)throw new c.a("marker-destroyed",this);return this._liveRange.start.clone()}getEnd(){if(!this._liveRange)throw new c.a("marker-destroyed",this);return this._liveRange.end.clone()}getRange(){if(!this._liveRange)throw new c.a("marker-destroyed",this);return this._liveRange.toRange()}is(e){return"marker"===e||"model:marker"===e}_attachLiveRange(e){return this._liveRange&&this._detachLiveRange(),e.delegate("change:range").to(this),e.delegate("change:content").to(this),this._liveRange=e,e}_detachLiveRange(){this._liveRange.stopDelegating("change:range",this),this._liveRange.stopDelegating("change:content",this),this._liveRange.detach(),this._liveRange=null}}Object(D.a)(U,V.c);var K=o("./packages/ckeditor5-utils/src/observablemixin.js"),G=o("./packages/ckeditor5-engine/src/model/selection.js"),J=o("./packages/ckeditor5-engine/src/model/operation/operationfactory.js"),Y=o("./packages/ckeditor5-engine/src/model/liveposition.js");class X{constructor(e,t,o){this.model=e,this.writer=t,this.position=o,this.canMergeWith=new Set([this.position.parent]),this.schema=e.schema,this._documentFragment=t.createDocumentFragment(),this._documentFragmentPosition=t.createPositionAt(this._documentFragment,0),this._firstNode=null,this._lastNode=null,this._lastAutoParagraph=null,this._filterAttributesOf=[],this._affectedStart=null,this._affectedEnd=null}handleNodes(e){for(const t of Array.from(e))this._handleNode(t);this._insertPartialFragment(),this._lastAutoParagraph&&this._updateLastNodeFromAutoParagraph(this._lastAutoParagraph),this._mergeOnRight(),this.schema.removeDisallowedAttributes(this._filterAttributesOf,this.writer),this._filterAttributesOf=[]}_updateLastNodeFromAutoParagraph(e){const t=this.writer.createPositionAfter(this._lastNode),o=this.writer.createPositionAfter(e);if(o.isAfter(t)){if(this._lastNode=e,this.position.parent!=e||!this.position.isAtEnd)throw new c.a("insertcontent-invalid-insertion-position",this);this.position=o,this._setAffectedBoundaries(this.position)}}getSelectionRange(){return this.nodeToSelect?n.a._createOn(this.nodeToSelect):this.model.schema.getNearestSelectionRange(this.position)}getAffectedRange(){return this._affectedStart?new n.a(this._affectedStart,this._affectedEnd):null}destroy(){this._affectedStart&&this._affectedStart.detach(),this._affectedEnd&&this._affectedEnd.detach()}_handleNode(e){if(this.schema.isObject(e))return void this._handleObject(e);let t=this._checkAndAutoParagraphToAllowedPosition(e);t||(t=this._checkAndSplitToAllowedPosition(e),t)?(this._appendToFragment(e),this._firstNode||(this._firstNode=e),this._lastNode=e):this._handleDisallowedNode(e)}_insertPartialFragment(){if(this._documentFragment.isEmpty)return;const e=Y.a.fromPosition(this.position,"toNext");this._setAffectedBoundaries(this.position),this._documentFragment.getChild(0)==this._firstNode&&(this.writer.insert(this._firstNode,this.position),this._mergeOnLeft(),this.position=e.toPosition()),this._documentFragment.isEmpty||this.writer.insert(this._documentFragment,this.position),this._documentFragmentPosition=this.writer.createPositionAt(this._documentFragment,0),this.position=e.toPosition(),e.detach()}_handleObject(e){this._checkAndSplitToAllowedPosition(e)?this._appendToFragment(e):this._tryAutoparagraphing(e)}_handleDisallowedNode(e){e.is("element")?this.handleNodes(e.getChildren()):this._tryAutoparagraphing(e)}_appendToFragment(e){if(!this.schema.checkChild(this.position,e))throw new c.a("insertcontent-wrong-position",this,{node:e,position:this.position});this.writer.insert(e,this._documentFragmentPosition),this._documentFragmentPosition=this._documentFragmentPosition.getShiftedBy(e.offsetSize),this.schema.isObject(e)&&!this.schema.checkChild(this.position,"$text")?this.nodeToSelect=e:this.nodeToSelect=null,this._filterAttributesOf.push(e)}_setAffectedBoundaries(e){this._affectedStart||(this._affectedStart=Y.a.fromPosition(e,"toPrevious")),this._affectedEnd&&!this._affectedEnd.isBefore(e)||(this._affectedEnd&&this._affectedEnd.detach(),this._affectedEnd=Y.a.fromPosition(e,"toNext"))}_mergeOnLeft(){const e=this._firstNode;if(!(e instanceof _.a))return;if(!this._canMergeLeft(e))return;const t=Y.a._createBefore(e);t.stickiness="toNext";const o=Y.a.fromPosition(this.position,"toNext");this._affectedStart.isEqual(t)&&(this._affectedStart.detach(),this._affectedStart=Y.a._createAt(t.nodeBefore,"end","toPrevious")),this._firstNode===this._lastNode&&(this._firstNode=t.nodeBefore,this._lastNode=t.nodeBefore),this.writer.merge(t),t.isEqual(this._affectedEnd)&&this._firstNode===this._lastNode&&(this._affectedEnd.detach(),this._affectedEnd=Y.a._createAt(t.nodeBefore,"end","toNext")),this.position=o.toPosition(),o.detach(),this._filterAttributesOf.push(this.position.parent),t.detach()}_mergeOnRight(){const e=this._lastNode;if(!(e instanceof _.a))return;if(!this._canMergeRight(e))return;const t=Y.a._createAfter(e);if(t.stickiness="toNext",!this.position.isEqual(t))throw new c.a("insertcontent-invalid-insertion-position",this);this.position=v.a._createAt(t.nodeBefore,"end");const o=Y.a.fromPosition(this.position,"toPrevious");this._affectedEnd.isEqual(t)&&(this._affectedEnd.detach(),this._affectedEnd=Y.a._createAt(t.nodeBefore,"end","toNext")),this._firstNode===this._lastNode&&(this._firstNode=t.nodeBefore,this._lastNode=t.nodeBefore),this.writer.merge(t),t.getShiftedBy(-1).isEqual(this._affectedStart)&&this._firstNode===this._lastNode&&(this._affectedStart.detach(),this._affectedStart=Y.a._createAt(t.nodeBefore,0,"toPrevious")),this.position=o.toPosition(),o.detach(),this._filterAttributesOf.push(this.position.parent),t.detach()}_canMergeLeft(e){const t=e.previousSibling;return t instanceof _.a&&this.canMergeWith.has(t)&&this.model.schema.checkMerge(t,e)}_canMergeRight(e){const t=e.nextSibling;return t instanceof _.a&&this.canMergeWith.has(t)&&this.model.schema.checkMerge(e,t)}_tryAutoparagraphing(e){const t=this.writer.createElement("paragraph");this._getAllowedIn(this.position.parent,t)&&this.schema.checkChild(t,e)&&(t._appendChild(e),this._handleNode(t))}_checkAndAutoParagraphToAllowedPosition(e){if(this.schema.checkChild(this.position.parent,e))return!0;if(!this.schema.checkChild(this.position.parent,"paragraph")||!this.schema.checkChild("paragraph",e))return!1;this._insertPartialFragment();const t=this.writer.createElement("paragraph");return this.writer.insert(t,this.position),this._setAffectedBoundaries(this.position),this._lastAutoParagraph=t,this.position=this.writer.createPositionAt(t,0),!0}_checkAndSplitToAllowedPosition(e){const t=this._getAllowedIn(this.position.parent,e);if(!t)return!1;for(t!=this.position.parent&&this._insertPartialFragment();t!=this.position.parent;)if(this.position.isAtStart){const e=this.position.parent;this.position=this.writer.createPositionBefore(e),e.isEmpty&&e.parent===t&&this.writer.remove(e)}else if(this.position.isAtEnd)this.position=this.writer.createPositionAfter(this.position.parent);else{const e=this.writer.createPositionAfter(this.position.parent);this._setAffectedBoundaries(this.position),this.writer.split(this.position),this.position=e,this.canMergeWith.add(this.position.nodeAfter)}return!0}_getAllowedIn(e,t){return this.schema.checkChild(e,t)?e:this.schema.isLimit(e)?null:this._getAllowedIn(e.parent,t)}}function Z(e,t,o={}){if(t.isCollapsed)return;const i=t.getFirstRange();if("$graveyard"==i.root.rootName)return;const r=e.schema;e.change(e=>{if(!o.doNotResetEntireContent&&function(e,t){const o=e.getLimitElement(t);if(!t.containsEntireContent(o))return!1;const i=t.getFirstRange();if(i.start.parent==i.end.parent)return!1;return e.checkChild(o,"paragraph")}(r,t))return void function(e,t){const o=e.model.schema.getLimitElement(t);e.remove(e.createRangeIn(o)),ee(e,e.createPositionAt(o,0),t)}(e,t);const[s,n]=function(e){const t=e.root.document.model,o=e.start;let i=e.end;if(t.hasContent(e,{ignoreMarkers:!0})){const o=function(e){const t=e.parent,o=t.root.document.model.schema,i=t.getAncestors({parentFirst:!0,includeSelf:!0});for(const e of i){if(o.isLimit(e))return null;if(o.isBlock(e))return e}}(i);if(o&&i.isTouching(t.createPositionAt(o,0))){const o=t.createSelection(e);t.modifySelection(o,{direction:"backward"});const r=o.getLastPosition(),s=t.createRange(r,i);t.hasContent(s,{ignoreMarkers:!0})||(i=r)}}return[Y.a.fromPosition(o,"toPrevious"),Y.a.fromPosition(i,"toNext")]}(i);s.isTouching(n)||e.remove(e.createRange(s,n)),o.leaveUnmerged||(!function(e,t,o){const i=e.model;if(!Q(e.model.schema,t,o))return;const[r,s]=function(e,t){const o=e.getAncestors(),i=t.getAncestors();let r=0;for(;o[r]&&o[r]==i[r];)r++;return[o[r],i[r]]}(t,o);if(!r||!s)return;!i.hasContent(r,{ignoreMarkers:!0})&&i.hasContent(s,{ignoreMarkers:!0})?function e(t,o,i,r){const s=o.parent,n=i.parent;if(s==r||n==r)return;o=t.createPositionAfter(s),(i=t.createPositionBefore(n)).isEqual(o)||t.insert(s,i);for(;o.parent.isEmpty;){const e=o.parent;o=t.createPositionBefore(e),t.remove(e)}if(i=t.createPositionBefore(n),function(e,t){const o=t.nodeBefore,i=t.nodeAfter;o.name!=i.name&&e.rename(o,i.name);e.clearAttributes(o),e.setAttributes(Object.fromEntries(i.getAttributes()),o),e.merge(t)}(t,i),!Q(t.model.schema,o,i))return;e(t,o,i,r)}(e,t,o,r.parent):function e(t,o,i,r){const s=o.parent,n=i.parent;if(s==r||n==r)return;o=t.createPositionAfter(s),(i=t.createPositionBefore(n)).isEqual(o)||t.insert(n,o);t.merge(o);for(;i.parent.isEmpty;){const e=i.parent;i=t.createPositionBefore(e),t.remove(e)}if(!Q(t.model.schema,o,i))return;e(t,o,i,r)}(e,t,o,r.parent)}(e,s,n),r.removeDisallowedAttributes(s.parent.getChildren(),e)),te(e,t,s),!o.doNotAutoparagraph&&function(e,t){const o=e.checkChild(t,"$text"),i=e.checkChild(t,"paragraph");return!o&&i}(r,s)&&ee(e,s,t),s.detach(),n.detach()})}function Q(e,t,o){const i=t.parent,r=o.parent;return i!=r&&(!e.isLimit(i)&&!e.isLimit(r)&&function(e,t,o){const i=new n.a(e,t);for(const e of i.getWalker())if(o.isLimit(e.item))return!1;return!0}(t,o,e))}function ee(e,t,o){const i=e.createElement("paragraph");e.insert(i,t),te(e,o,e.createPositionAt(i,0))}function te(e,t,o){t instanceof y.a?e.setSelection(o):t.setTo(o)}var oe=o("./packages/ckeditor5-engine/src/model/treewalker.js");function ie(e,t){const{isForward:o,walker:i,unit:r,schema:s}=e,{type:n,item:a,nextPosition:c}=t;if("text"==n)return"word"===e.unit?function(e,t){let o=e.position.textNode;if(o){let i=e.position.offset-o.startOffset;for(;!se(o.data,i,t)&&!ne(o,i,t);){e.next();const r=t?e.position.nodeAfter:e.position.nodeBefore;if(r&&r.is("$text")){const i=r.data.charAt(t?0:r.data.length-1);' ,.?!:;"-()'.includes(i)||(e.next(),o=e.position.textNode)}i=e.position.offset-o.startOffset}}return e.position}(i,o):function(e,t){const o=e.position.textNode;if(o){const i=o.data;let r=e.position.offset-o.startOffset;for(;B(i,r)||"character"==t&&F(i,r);)e.next(),r=e.position.offset-o.startOffset}return e.position}(i,r);if(n==(o?"elementStart":"elementEnd")){if(s.isSelectable(a))return v.a._createAt(a,o?"after":"before");if(s.checkChild(c,"$text"))return c}else{if(s.isLimit(a))return void i.skip(()=>!0);if(s.checkChild(c,"$text"))return c}}function re(e,t){const o=e.root,i=v.a._createAt(o,t?"end":0);return t?new n.a(e,i):new n.a(i,e)}function se(e,t,o){const i=t+(o?0:-1);return' ,.?!:;"-()'.includes(e.charAt(i))}function ne(e,t,o){return t===(o?e.endOffset:0)}function ae(e,t){const o=[];Array.from(e.getItems({direction:"backward"})).map(e=>t.createRangeOn(e)).filter(t=>(t.start.isAfter(e.start)||t.start.isEqual(e.start))&&(t.end.isBefore(e.end)||t.end.isEqual(e.end))).forEach(e=>{o.push(e.start.parent),t.remove(e)}),o.forEach(e=>{let o=e;for(;o.parent&&o.isEmpty;){const e=t.createRangeOn(o);o=o.parent,t.remove(e)}})}function ce(e){e.document.registerPostFixer(t=>function(e,t){const o=t.document.selection,i=t.schema,r=[];let s=!1;for(const e of o.getRanges()){const t=le(e,i);t&&!t.isEqual(e)?(r.push(t),s=!0):r.push(e)}s&&e.setSelection(function(e){const t=[];t.push(e.shift());for(const o of e){const e=t.pop();if(o.isEqual(e))t.push(e);else if(o.isIntersecting(e)){const i=e.start.isAfter(o.start)?o.start:e.start,r=e.end.isAfter(o.end)?e.end:o.end,s=new n.a(i,r);t.push(s)}else t.push(e),t.push(o)}return t}(r),{backward:o.isBackward})}(t,e))}function le(e,t){return e.isCollapsed?function(e,t){const o=e.start,i=t.getNearestSelectionRange(o);if(!i)return null;if(!i.isCollapsed)return i;const r=i.start;if(o.isEqual(r))return null;return new n.a(r)}(e,t):function(e,t){const{start:o,end:i}=e,r=t.checkChild(o,"$text"),s=t.checkChild(i,"$text"),a=t.getLimitElement(o),c=t.getLimitElement(i);if(a===c){if(r&&s)return null;if(function(e,t,o){const i=e.nodeAfter&&!o.isLimit(e.nodeAfter)||o.checkChild(e,"$text"),r=t.nodeBefore&&!o.isLimit(t.nodeBefore)||o.checkChild(t,"$text");return i||r}(o,i,t)){const e=o.nodeAfter&&t.isSelectable(o.nodeAfter)?null:t.getNearestSelectionRange(o,"forward"),r=i.nodeBefore&&t.isSelectable(i.nodeBefore)?null:t.getNearestSelectionRange(i,"backward"),s=e?e.start:o,a=r?r.end:i;return new n.a(s,a)}}const l=a&&!a.is("rootElement"),d=c&&!c.is("rootElement");if(l||d){const e=o.nodeAfter&&i.nodeBefore&&o.nodeAfter.parent===i.nodeBefore.parent,r=l&&(!e||!ue(o.nodeAfter,t)),s=d&&(!e||!ue(i.nodeBefore,t));let u=o,h=i;return r&&(u=v.a._createBefore(de(a,t))),s&&(h=v.a._createAfter(de(c,t))),new n.a(u,h)}return null}(e,t)}function de(e,t){let o=e,i=o;for(;t.isLimit(i)&&i.parent;)o=i,i=i.parent;return o}function ue(e,t){return e&&t.isSelectable(e)}var he=o("./packages/ckeditor5-engine/src/model/utils/autoparagraphing.js");class pe{constructor(){this.markers=new $,this.document=new W(this),this.schema=new E.b,this._pendingChanges=[],this._currentWriter=null,["insertContent","deleteContent","modifySelection","getSelectedContent","applyOperation"].forEach(e=>this.decorate(e)),this.on("applyOperation",(e,t)=>{t[0]._validate()},{priority:"highest"}),this.schema.register("$root",{isLimit:!0}),this.schema.register("$block",{allowIn:"$root",isBlock:!0}),this.schema.register("$text",{allowIn:"$block",isInline:!0,isContent:!0}),this.schema.register("$clipboardHolder",{allowContentOf:"$root",allowChildren:"$text",isLimit:!0}),this.schema.register("$documentFragment",{allowContentOf:"$root",allowChildren:"$text",isLimit:!0}),this.schema.register("$marker"),this.schema.addChildCheck((e,t)=>{if("$marker"===t.name)return!0}),ce(this),this.document.registerPostFixer(he.a)}change(e){try{return 0===this._pendingChanges.length?(this._pendingChanges.push({batch:new i,callback:e}),this._runPendingChanges()[0]):e(this._currentWriter)}catch(e){c.a.rethrowUnexpectedError(e,this)}}enqueueChange(e,t){try{"string"==typeof e?e=new i(e):"function"==typeof e&&(t=e,e=new i),this._pendingChanges.push({batch:e,callback:t}),1==this._pendingChanges.length&&this._runPendingChanges()}catch(e){c.a.rethrowUnexpectedError(e,this)}}applyOperation(e){e._execute()}insertContent(e,t,o){return function(e,t,o,i){return e.change(r=>{let s;s=o?o instanceof G.a||o instanceof y.a?o:r.createSelection(o,i):e.document.selection,s.isCollapsed||e.deleteContent(s,{doNotAutoparagraph:!0});const n=new X(e,r,s.anchor);let a;a=t.is("documentFragment")?t.getChildren():[t],n.handleNodes(a);const c=n.getSelectionRange();c&&(s instanceof y.a?r.setSelection(c):s.setTo(c));const l=n.getAffectedRange()||e.createRange(s.anchor);return n.destroy(),l})}(this,e,t,o)}deleteContent(e,t){Z(this,e,t)}modifySelection(e,t){!function(e,t,o={}){const i=e.schema,r="backward"!=o.direction,s=o.unit?o.unit:"character",n=t.focus,a=new oe.a({boundaries:re(n,r),singleCharacters:!0,direction:r?"forward":"backward"}),c={walker:a,schema:i,isForward:r,unit:s};let l;for(;l=a.next();){if(l.done)return;const o=ie(c,l.value);if(o)return void(t instanceof y.a?e.change(e=>{e.setSelectionFocus(o)}):t.setFocus(o))}}(this,e,t)}getSelectedContent(e){return function(e,t){return e.change(e=>{const o=e.createDocumentFragment(),i=t.getFirstRange();if(!i||i.isCollapsed)return o;const r=i.start.root,s=i.start.getCommonPath(i.end),n=r.getNodeByPath(s);let a;a=i.start.parent==i.end.parent?i:e.createRange(e.createPositionAt(n,i.start.path[s.length]),e.createPositionAt(n,i.end.path[s.length]+1));const c=a.end.offset-a.start.offset;for(const t of a.getItems({shallow:!0}))t.is("$textProxy")?e.appendText(t.data,t.getAttributes(),o):e.append(e.cloneElement(t,!0),o);if(a!=i){const t=i._getTransformedByMove(a.start,e.createPositionAt(o,0),c)[0],r=e.createRange(e.createPositionAt(o,0),t.start);ae(e.createRange(t.end,e.createPositionAt(o,"end")),e),ae(r,e)}return o})}(this,e)}hasContent(e,t={}){const o=e instanceof _.a?n.a._createIn(e):e;if(o.isCollapsed)return!1;const{ignoreWhitespaces:i=!1,ignoreMarkers:r=!1}=t;if(!r)for(const e of this.markers.getMarkersIntersectingRange(o))if(e.affectsData)return!0;for(const e of o.getItems())if(this.schema.isContent(e)){if(!e.is("$textProxy"))return!0;if(!i)return!0;if(-1!==e.data.search(/\S/))return!0}return!1}createPositionFromPath(e,t,o){return new v.a(e,t,o)}createPositionAt(e,t){return v.a._createAt(e,t)}createPositionAfter(e){return v.a._createAfter(e)}createPositionBefore(e){return v.a._createBefore(e)}createRange(e,t){return new n.a(e,t)}createRangeIn(e){return n.a._createIn(e)}createRangeOn(e){return n.a._createOn(e)}createSelection(e,t,o){return new G.a(e,t,o)}createBatch(e){return new i(e)}createOperationFromJSON(e){return J.a.fromJSON(e,this.document)}destroy(){this.document.destroy(),this.stopListening()}_runPendingChanges(){const e=[];for(this.fire("_beforeChanges");this._pendingChanges.length;){const t=this._pendingChanges[0].batch;this._currentWriter=new x(this,t);const o=this._pendingChanges[0].callback(this._currentWriter);e.push(o),this.document._handleChangeBlock(this._currentWriter),this._pendingChanges.shift(),this._currentWriter=null}return this.fire("_afterChanges"),e}}Object(D.a)(pe,K.a)},"./packages/ckeditor5-engine/src/model/node.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return n}));var i=o("./packages/ckeditor5-utils/src/tomap.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),s=o("./packages/ckeditor5-utils/src/comparearrays.js");o("./packages/ckeditor5-utils/src/version.js");class n{constructor(e){this.parent=null,this._attrs=Object(i.a)(e)}get index(){let e;if(!this.parent)return null;if(null===(e=this.parent.getChildIndex(this)))throw new r.a("model-node-not-found-in-parent",this);return e}get startOffset(){let e;if(!this.parent)return null;if(null===(e=this.parent.getChildStartOffset(this)))throw new r.a("model-node-not-found-in-parent",this);return e}get offsetSize(){return 1}get endOffset(){return this.parent?this.startOffset+this.offsetSize:null}get nextSibling(){const e=this.index;return null!==e&&this.parent.getChild(e+1)||null}get previousSibling(){const e=this.index;return null!==e&&this.parent.getChild(e-1)||null}get root(){let e=this;for(;e.parent;)e=e.parent;return e}isAttached(){return this.root.is("rootElement")}getPath(){const e=[];let t=this;for(;t.parent;)e.unshift(t.startOffset),t=t.parent;return e}getAncestors(e={includeSelf:!1,parentFirst:!1}){const t=[];let o=e.includeSelf?this:this.parent;for(;o;)t[e.parentFirst?"push":"unshift"](o),o=o.parent;return t}getCommonAncestor(e,t={}){const o=this.getAncestors(t),i=e.getAncestors(t);let r=0;for(;o[r]==i[r]&&o[r];)r++;return 0===r?null:o[r-1]}isBefore(e){if(this==e)return!1;if(this.root!==e.root)return!1;const t=this.getPath(),o=e.getPath(),i=Object(s.a)(t,o);switch(i){case"prefix":return!0;case"extension":return!1;default:return t[i]<o[i]}}isAfter(e){return this!=e&&(this.root===e.root&&!this.isBefore(e))}hasAttribute(e){return this._attrs.has(e)}getAttribute(e){return this._attrs.get(e)}getAttributes(){return this._attrs.entries()}getAttributeKeys(){return this._attrs.keys()}toJSON(){const e={};return this._attrs.size&&(e.attributes=Array.from(this._attrs).reduce((e,t)=>(e[t[0]]=t[1],e),{})),e}is(e){return"node"===e||"model:node"===e}_clone(){return new n(this._attrs)}_remove(){this.parent._removeChildren(this.index)}_setAttribute(e,t){this._attrs.set(e,t)}_setAttributesTo(e){this._attrs=Object(i.a)(e)}_removeAttribute(e){return this._attrs.delete(e)}_clearAttributes(){this._attrs.clear()}}},"./packages/ckeditor5-engine/src/model/nodelist.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-engine/src/model/node.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class s{constructor(e){this._nodes=[],e&&this._insertNodes(0,e)}[Symbol.iterator](){return this._nodes[Symbol.iterator]()}get length(){return this._nodes.length}get maxOffset(){return this._nodes.reduce((e,t)=>e+t.offsetSize,0)}getNode(e){return this._nodes[e]||null}getNodeIndex(e){const t=this._nodes.indexOf(e);return-1==t?null:t}getNodeStartOffset(e){const t=this.getNodeIndex(e);return null===t?null:this._nodes.slice(0,t).reduce((e,t)=>e+t.offsetSize,0)}indexToOffset(e){if(e==this._nodes.length)return this.maxOffset;const t=this._nodes[e];if(!t)throw new r.a("model-nodelist-index-out-of-bounds",this);return this.getNodeStartOffset(t)}offsetToIndex(e){let t=0;for(const o of this._nodes){if(e>=t&&e<t+o.offsetSize)return this.getNodeIndex(o);t+=o.offsetSize}if(t!=e)throw new r.a("model-nodelist-offset-out-of-bounds",this,{offset:e,nodeList:this});return this.length}_insertNodes(e,t){for(const e of t)if(!(e instanceof i.a))throw new r.a("model-nodelist-insertnodes-not-node",this);this._nodes.splice(e,0,...t)}_removeNodes(e,t=1){return this._nodes.splice(e,t)}toJSON(){return this._nodes.map(e=>e.toJSON())}}},"./packages/ckeditor5-engine/src/model/operation/attributeoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return l}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),r=o("./packages/ckeditor5-engine/src/model/range.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-engine/src/model/operation/utils.js"),a=o("./node_modules/lodash-es/_baseIsEqual.js");var c=function(e,t){return Object(a.a)(e,t)};class l extends i.a{constructor(e,t,o,i,r){super(r),this.range=e.clone(),this.key=t,this.oldValue=void 0===o?null:o,this.newValue=void 0===i?null:i}get type(){return null===this.oldValue?"addAttribute":null===this.newValue?"removeAttribute":"changeAttribute"}clone(){return new l(this.range,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new l(this.range,this.key,this.newValue,this.oldValue,this.baseVersion+1)}toJSON(){const e=super.toJSON();return e.range=this.range.toJSON(),e}_validate(){if(!this.range.isFlat)throw new s.a("attribute-operation-range-not-flat",this);for(const e of this.range.getItems({shallow:!0})){if(null!==this.oldValue&&!c(e.getAttribute(this.key),this.oldValue))throw new s.a("attribute-operation-wrong-old-value",this,{item:e,key:this.key,value:this.oldValue});if(null===this.oldValue&&null!==this.newValue&&e.hasAttribute(this.key))throw new s.a("attribute-operation-attribute-exists",this,{node:e,key:this.key})}}_execute(){c(this.oldValue,this.newValue)||Object(n.e)(this.range,this.key,this.newValue)}static get className(){return"AttributeOperation"}static fromJSON(e,t){return new l(r.a.fromJSON(e.range,t),e.key,e.oldValue,e.newValue,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/insertoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return u}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),r=o("./packages/ckeditor5-engine/src/model/position.js"),s=o("./packages/ckeditor5-engine/src/model/nodelist.js"),n=o("./packages/ckeditor5-engine/src/model/operation/moveoperation.js"),a=o("./packages/ckeditor5-engine/src/model/operation/utils.js"),c=o("./packages/ckeditor5-engine/src/model/text.js"),l=o("./packages/ckeditor5-engine/src/model/element.js"),d=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class u extends i.a{constructor(e,t,o){super(o),this.position=e.clone(),this.position.stickiness="toNone",this.nodes=new s.a(Object(a.c)(t)),this.shouldReceiveAttributes=!1}get type(){return"insert"}get howMany(){return this.nodes.maxOffset}clone(){const e=new s.a([...this.nodes].map(e=>e._clone(!0))),t=new u(this.position,e,this.baseVersion);return t.shouldReceiveAttributes=this.shouldReceiveAttributes,t}getReversed(){const e=this.position.root.document.graveyard,t=new r.a(e,[0]);return new n.a(this.position,this.nodes.maxOffset,t,this.baseVersion+1)}_validate(){const e=this.position.parent;if(!e||e.maxOffset<this.position.offset)throw new d.a("insert-operation-position-invalid",this)}_execute(){const e=this.nodes;this.nodes=new s.a([...e].map(e=>e._clone(!0))),Object(a.a)(this.position,e)}toJSON(){const e=super.toJSON();return e.position=this.position.toJSON(),e.nodes=this.nodes.toJSON(),e}static get className(){return"InsertOperation"}static fromJSON(e,t){const o=[];for(const t of e.nodes)t.name?o.push(l.a.fromJSON(t)):o.push(c.a.fromJSON(t));const i=new u(r.a.fromJSON(e.position,t),o,e.baseVersion);return i.shouldReceiveAttributes=e.shouldReceiveAttributes,i}}},"./packages/ckeditor5-engine/src/model/operation/markeroperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),r=o("./packages/ckeditor5-engine/src/model/range.js");class s extends i.a{constructor(e,t,o,i,r,s){super(s),this.name=e,this.oldRange=t?t.clone():null,this.newRange=o?o.clone():null,this.affectsData=r,this._markers=i}get type(){return"marker"}clone(){return new s(this.name,this.oldRange,this.newRange,this._markers,this.affectsData,this.baseVersion)}getReversed(){return new s(this.name,this.newRange,this.oldRange,this._markers,this.affectsData,this.baseVersion+1)}_execute(){const e=this.newRange?"_set":"_remove";this._markers[e](this.name,this.newRange,!0,this.affectsData)}toJSON(){const e=super.toJSON();return this.oldRange&&(e.oldRange=this.oldRange.toJSON()),this.newRange&&(e.newRange=this.newRange.toJSON()),delete e._markers,e}static get className(){return"MarkerOperation"}static fromJSON(e,t){return new s(e.name,e.oldRange?r.a.fromJSON(e.oldRange,t):null,e.newRange?r.a.fromJSON(e.newRange,t):null,t.model.markers,e.affectsData,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/mergeoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return l}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),r=o("./packages/ckeditor5-engine/src/model/operation/splitoperation.js"),s=o("./packages/ckeditor5-engine/src/model/position.js"),n=o("./packages/ckeditor5-engine/src/model/range.js"),a=o("./packages/ckeditor5-engine/src/model/operation/utils.js"),c=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class l extends i.a{constructor(e,t,o,i,r){super(r),this.sourcePosition=e.clone(),this.sourcePosition.stickiness="toPrevious",this.howMany=t,this.targetPosition=o.clone(),this.targetPosition.stickiness="toNext",this.graveyardPosition=i.clone()}get type(){return"merge"}get deletionPosition(){return new s.a(this.sourcePosition.root,this.sourcePosition.path.slice(0,-1))}get movedRange(){const e=this.sourcePosition.getShiftedBy(Number.POSITIVE_INFINITY);return new n.a(this.sourcePosition,e)}clone(){return new this.constructor(this.sourcePosition,this.howMany,this.targetPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const e=this.targetPosition._getTransformedByMergeOperation(this),t=this.sourcePosition.path.slice(0,-1),o=new s.a(this.sourcePosition.root,t)._getTransformedByMergeOperation(this);return new r.a(e,this.howMany,o,this.graveyardPosition,this.baseVersion+1)}_validate(){const e=this.sourcePosition.parent,t=this.targetPosition.parent;if(!e.parent)throw new c.a("merge-operation-source-position-invalid",this);if(!t.parent)throw new c.a("merge-operation-target-position-invalid",this);if(this.howMany!=e.maxOffset)throw new c.a("merge-operation-how-many-invalid",this)}_execute(){const e=this.sourcePosition.parent,t=n.a._createIn(e);Object(a.b)(t,this.targetPosition),Object(a.b)(n.a._createOn(e),this.graveyardPosition)}toJSON(){const e=super.toJSON();return e.sourcePosition=e.sourcePosition.toJSON(),e.targetPosition=e.targetPosition.toJSON(),e.graveyardPosition=e.graveyardPosition.toJSON(),e}static get className(){return"MergeOperation"}static fromJSON(e,t){const o=s.a.fromJSON(e.sourcePosition,t),i=s.a.fromJSON(e.targetPosition,t),r=s.a.fromJSON(e.graveyardPosition,t);return new this(o,e.howMany,i,r,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/moveoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return l}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),r=o("./packages/ckeditor5-engine/src/model/position.js"),s=o("./packages/ckeditor5-engine/src/model/range.js"),n=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),a=o("./packages/ckeditor5-utils/src/comparearrays.js"),c=o("./packages/ckeditor5-engine/src/model/operation/utils.js");class l extends i.a{constructor(e,t,o,i){super(i),this.sourcePosition=e.clone(),this.sourcePosition.stickiness="toNext",this.howMany=t,this.targetPosition=o.clone(),this.targetPosition.stickiness="toNone"}get type(){return"$graveyard"==this.targetPosition.root.rootName?"remove":"$graveyard"==this.sourcePosition.root.rootName?"reinsert":"move"}clone(){return new this.constructor(this.sourcePosition,this.howMany,this.targetPosition,this.baseVersion)}getMovedRangeStart(){return this.targetPosition._getTransformedByDeletion(this.sourcePosition,this.howMany)}getReversed(){const e=this.sourcePosition._getTransformedByInsertion(this.targetPosition,this.howMany);return new this.constructor(this.getMovedRangeStart(),this.howMany,e,this.baseVersion+1)}_validate(){const e=this.sourcePosition.parent,t=this.targetPosition.parent,o=this.sourcePosition.offset,i=this.targetPosition.offset;if(o+this.howMany>e.maxOffset)throw new n.a("move-operation-nodes-do-not-exist",this);if(e===t&&o<i&&i<o+this.howMany)throw new n.a("move-operation-range-into-itself",this);if(this.sourcePosition.root==this.targetPosition.root&&"prefix"==Object(a.a)(this.sourcePosition.getParentPath(),this.targetPosition.getParentPath())){const e=this.sourcePosition.path.length-1;if(this.targetPosition.path[e]>=o&&this.targetPosition.path[e]<o+this.howMany)throw new n.a("move-operation-node-into-itself",this)}}_execute(){Object(c.b)(s.a._createFromPositionAndShift(this.sourcePosition,this.howMany),this.targetPosition)}toJSON(){const e=super.toJSON();return e.sourcePosition=this.sourcePosition.toJSON(),e.targetPosition=this.targetPosition.toJSON(),e}static get className(){return"MoveOperation"}static fromJSON(e,t){const o=r.a.fromJSON(e.sourcePosition,t),i=r.a.fromJSON(e.targetPosition,t);return new this(o,e.howMany,i,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/nooperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js");class r extends i.a{get type(){return"noop"}clone(){return new r(this.baseVersion)}getReversed(){return new r(this.baseVersion+1)}_execute(){}static get className(){return"NoOperation"}}},"./packages/ckeditor5-engine/src/model/operation/operation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return i}));class i{constructor(e){this.baseVersion=e,this.isDocumentOperation=null!==this.baseVersion,this.batch=null}_validate(){}toJSON(){const e=Object.assign({},this);return e.__className=this.constructor.className,delete e.batch,delete e.isDocumentOperation,e}static get className(){return"Operation"}static fromJSON(e){return new this(e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/operationfactory.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return g}));var i=o("./packages/ckeditor5-engine/src/model/operation/attributeoperation.js"),r=o("./packages/ckeditor5-engine/src/model/operation/insertoperation.js"),s=o("./packages/ckeditor5-engine/src/model/operation/markeroperation.js"),n=o("./packages/ckeditor5-engine/src/model/operation/moveoperation.js"),a=o("./packages/ckeditor5-engine/src/model/operation/nooperation.js"),c=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),l=o("./packages/ckeditor5-engine/src/model/operation/renameoperation.js"),d=o("./packages/ckeditor5-engine/src/model/operation/rootattributeoperation.js"),u=o("./packages/ckeditor5-engine/src/model/operation/splitoperation.js"),h=o("./packages/ckeditor5-engine/src/model/operation/mergeoperation.js");const p={};p[i.a.className]=i.a,p[r.a.className]=r.a,p[s.a.className]=s.a,p[n.a.className]=n.a,p[a.a.className]=a.a,p[c.a.className]=c.a,p[l.a.className]=l.a,p[d.a.className]=d.a,p[u.a.className]=u.a,p[h.a.className]=h.a;class g{static fromJSON(e,t){return p[e.__className].fromJSON(e,t)}}},"./packages/ckeditor5-engine/src/model/operation/renameoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),r=o("./packages/ckeditor5-engine/src/model/element.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-engine/src/model/position.js");class a extends i.a{constructor(e,t,o,i){super(i),this.position=e,this.position.stickiness="toNext",this.oldName=t,this.newName=o}get type(){return"rename"}clone(){return new a(this.position.clone(),this.oldName,this.newName,this.baseVersion)}getReversed(){return new a(this.position.clone(),this.newName,this.oldName,this.baseVersion+1)}_validate(){const e=this.position.nodeAfter;if(!(e instanceof r.a))throw new s.a("rename-operation-wrong-position",this);if(e.name!==this.oldName)throw new s.a("rename-operation-wrong-name",this)}_execute(){this.position.nodeAfter.name=this.newName}toJSON(){const e=super.toJSON();return e.position=this.position.toJSON(),e}static get className(){return"RenameOperation"}static fromJSON(e,t){return new a(n.a.fromJSON(e.position,t),e.oldName,e.newName,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/rootattributeoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class s extends i.a{constructor(e,t,o,i,r){super(r),this.root=e,this.key=t,this.oldValue=o,this.newValue=i}get type(){return null===this.oldValue?"addRootAttribute":null===this.newValue?"removeRootAttribute":"changeRootAttribute"}clone(){return new s(this.root,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new s(this.root,this.key,this.newValue,this.oldValue,this.baseVersion+1)}_validate(){if(this.root!=this.root.root||this.root.is("documentFragment"))throw new r.a("rootattribute-operation-not-a-root",this,{root:this.root,key:this.key});if(null!==this.oldValue&&this.root.getAttribute(this.key)!==this.oldValue)throw new r.a("rootattribute-operation-wrong-old-value",this,{root:this.root,key:this.key});if(null===this.oldValue&&null!==this.newValue&&this.root.hasAttribute(this.key))throw new r.a("rootattribute-operation-attribute-exists",this,{root:this.root,key:this.key})}_execute(){null!==this.newValue?this.root._setAttribute(this.key,this.newValue):this.root._removeAttribute(this.key)}toJSON(){const e=super.toJSON();return e.root=this.root.toJSON(),e}static get className(){return"RootAttributeOperation"}static fromJSON(e,t){if(!t.getRoot(e.root))throw new r.a("rootattribute-operation-fromjson-no-root",this,{rootName:e.root});return new s(t.getRoot(e.root),e.key,e.oldValue,e.newValue,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/splitoperation.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return l}));var i=o("./packages/ckeditor5-engine/src/model/operation/operation.js"),r=o("./packages/ckeditor5-engine/src/model/operation/mergeoperation.js"),s=o("./packages/ckeditor5-engine/src/model/position.js"),n=o("./packages/ckeditor5-engine/src/model/range.js"),a=o("./packages/ckeditor5-engine/src/model/operation/utils.js"),c=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class l extends i.a{constructor(e,t,o,i,r){super(r),this.splitPosition=e.clone(),this.splitPosition.stickiness="toNext",this.howMany=t,this.insertionPosition=o,this.graveyardPosition=i?i.clone():null,this.graveyardPosition&&(this.graveyardPosition.stickiness="toNext")}get type(){return"split"}get moveTargetPosition(){const e=this.insertionPosition.path.slice();return e.push(0),new s.a(this.insertionPosition.root,e)}get movedRange(){const e=this.splitPosition.getShiftedBy(Number.POSITIVE_INFINITY);return new n.a(this.splitPosition,e)}clone(){return new this.constructor(this.splitPosition,this.howMany,this.insertionPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const e=this.splitPosition.root.document.graveyard,t=new s.a(e,[0]);return new r.a(this.moveTargetPosition,this.howMany,this.splitPosition,t,this.baseVersion+1)}_validate(){const e=this.splitPosition.parent,t=this.splitPosition.offset;if(!e||e.maxOffset<t)throw new c.a("split-operation-position-invalid",this);if(!e.parent)throw new c.a("split-operation-split-in-root",this);if(this.howMany!=e.maxOffset-this.splitPosition.offset)throw new c.a("split-operation-how-many-invalid",this);if(this.graveyardPosition&&!this.graveyardPosition.nodeAfter)throw new c.a("split-operation-graveyard-position-invalid",this)}_execute(){const e=this.splitPosition.parent;if(this.graveyardPosition)Object(a.b)(n.a._createFromPositionAndShift(this.graveyardPosition,1),this.insertionPosition);else{const t=e._clone();Object(a.a)(this.insertionPosition,t)}const t=new n.a(s.a._createAt(e,this.splitPosition.offset),s.a._createAt(e,e.maxOffset));Object(a.b)(t,this.moveTargetPosition)}toJSON(){const e=super.toJSON();return e.splitPosition=this.splitPosition.toJSON(),e.insertionPosition=this.insertionPosition.toJSON(),this.graveyardPosition&&(e.graveyardPosition=this.graveyardPosition.toJSON()),e}static get className(){return"SplitOperation"}static getInsertionPosition(e){const t=e.path.slice(0,-1);return t[t.length-1]++,new s.a(e.root,t,"toPrevious")}static fromJSON(e,t){const o=s.a.fromJSON(e.splitPosition,t),i=s.a.fromJSON(e.insertionPosition,t),r=e.graveyardPosition?s.a.fromJSON(e.graveyardPosition,t):null;return new this(o,e.howMany,i,r,e.baseVersion)}}},"./packages/ckeditor5-engine/src/model/operation/transform.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return _}));var i=o("./packages/ckeditor5-engine/src/model/operation/insertoperation.js"),r=o("./packages/ckeditor5-engine/src/model/operation/attributeoperation.js"),s=o("./packages/ckeditor5-engine/src/model/operation/renameoperation.js"),n=o("./packages/ckeditor5-engine/src/model/operation/markeroperation.js"),a=o("./packages/ckeditor5-engine/src/model/operation/moveoperation.js"),c=o("./packages/ckeditor5-engine/src/model/operation/rootattributeoperation.js"),l=o("./packages/ckeditor5-engine/src/model/operation/mergeoperation.js"),d=o("./packages/ckeditor5-engine/src/model/operation/splitoperation.js"),u=o("./packages/ckeditor5-engine/src/model/operation/nooperation.js"),h=o("./packages/ckeditor5-engine/src/model/range.js"),p=o("./packages/ckeditor5-engine/src/model/position.js"),g=o("./packages/ckeditor5-utils/src/comparearrays.js");const f=new Map;function m(e,t,o){let i=f.get(e);i||(i=new Map,f.set(e,i)),i.set(t,o)}function k(e){return[e]}function b(e,t,o={}){const i=function(e,t){const o=f.get(e);return o&&o.has(t)?o.get(t):k}(e.constructor,t.constructor);try{return i(e=e.clone(),t,o)}catch(e){throw e}}function _(e,t,o){e=e.slice(),t=t.slice();const i=new w(o.document,o.useRelations,o.forceWeakRemove);i.setOriginalOperations(e),i.setOriginalOperations(t);const r=i.originalOperations;if(0==e.length||0==t.length)return{operationsA:e,operationsB:t,originalOperations:r};const s=new WeakMap;for(const t of e)s.set(t,0);const n={nextBaseVersionA:e[e.length-1].baseVersion+1,nextBaseVersionB:t[t.length-1].baseVersion+1,originalOperationsACount:e.length,originalOperationsBCount:t.length};let a=0;for(;a<e.length;){const o=e[a],r=s.get(o);if(r==t.length){a++;continue}const n=t[r],c=b(o,n,i.getContext(o,n,!0)),l=b(n,o,i.getContext(n,o,!1));i.updateRelation(o,n),i.setOriginalOperations(c,o),i.setOriginalOperations(l,n);for(const e of c)s.set(e,r+l.length);e.splice(a,1,...c),t.splice(r,1,...l)}if(o.padWithNoOps){const o=e.length-n.originalOperationsACount,i=t.length-n.originalOperationsBCount;y(e,i-o),y(t,o-i)}return v(e,n.nextBaseVersionB),v(t,n.nextBaseVersionA),{operationsA:e,operationsB:t,originalOperations:r}}class w{constructor(e,t,o=!1){this.originalOperations=new Map,this._history=e.history,this._useRelations=t,this._forceWeakRemove=!!o,this._relations=new Map}setOriginalOperations(e,t=null){const o=t?this.originalOperations.get(t):null;for(const t of e)this.originalOperations.set(t,o||t)}updateRelation(e,t){switch(e.constructor){case a.a:switch(t.constructor){case l.a:e.targetPosition.isEqual(t.sourcePosition)||t.movedRange.containsPosition(e.targetPosition)?this._setRelation(e,t,"insertAtSource"):e.targetPosition.isEqual(t.deletionPosition)?this._setRelation(e,t,"insertBetween"):e.targetPosition.isAfter(t.sourcePosition)&&this._setRelation(e,t,"moveTargetAfter");break;case a.a:e.targetPosition.isEqual(t.sourcePosition)||e.targetPosition.isBefore(t.sourcePosition)?this._setRelation(e,t,"insertBefore"):this._setRelation(e,t,"insertAfter")}break;case d.a:switch(t.constructor){case l.a:e.splitPosition.isBefore(t.sourcePosition)&&this._setRelation(e,t,"splitBefore");break;case a.a:if(e.splitPosition.isEqual(t.sourcePosition)||e.splitPosition.isBefore(t.sourcePosition))this._setRelation(e,t,"splitBefore");else{const o=h.a._createFromPositionAndShift(t.sourcePosition,t.howMany);if(e.splitPosition.hasSameParentAs(t.sourcePosition)&&o.containsPosition(e.splitPosition)){const i=o.end.offset-e.splitPosition.offset,r=e.splitPosition.offset-o.start.offset;this._setRelation(e,t,{howMany:i,offset:r})}}}break;case l.a:switch(t.constructor){case l.a:e.targetPosition.isEqual(t.sourcePosition)||this._setRelation(e,t,"mergeTargetNotMoved"),e.sourcePosition.isEqual(t.targetPosition)&&this._setRelation(e,t,"mergeSourceNotMoved"),e.sourcePosition.isEqual(t.sourcePosition)&&this._setRelation(e,t,"mergeSameElement");break;case d.a:e.sourcePosition.isEqual(t.splitPosition)&&this._setRelation(e,t,"splitAtSource")}break;case n.a:{const o=e.newRange;if(!o)return;switch(t.constructor){case a.a:{const i=h.a._createFromPositionAndShift(t.sourcePosition,t.howMany),r=i.containsPosition(o.start)||i.start.isEqual(o.start),s=i.containsPosition(o.end)||i.end.isEqual(o.end);!r&&!s||i.containsRange(o)||this._setRelation(e,t,{side:r?"left":"right",path:r?o.start.path.slice():o.end.path.slice()});break}case l.a:{const i=o.start.isEqual(t.targetPosition),r=o.start.isEqual(t.deletionPosition),s=o.end.isEqual(t.deletionPosition),n=o.end.isEqual(t.sourcePosition);(i||r||s||n)&&this._setRelation(e,t,{wasInLeftElement:i,wasStartBeforeMergedElement:r,wasEndBeforeMergedElement:s,wasInRightElement:n});break}}break}}}getContext(e,t,o){return{aIsStrong:o,aWasUndone:this._wasUndone(e),bWasUndone:this._wasUndone(t),abRelation:this._useRelations?this._getRelation(e,t):null,baRelation:this._useRelations?this._getRelation(t,e):null,forceWeakRemove:this._forceWeakRemove}}_wasUndone(e){const t=this.originalOperations.get(e);return t.wasUndone||this._history.isUndoneOperation(t)}_getRelation(e,t){const o=this.originalOperations.get(t),i=this._history.getUndoneOperation(o);if(!i)return null;const r=this.originalOperations.get(e),s=this._relations.get(r);return s&&s.get(i)||null}_setRelation(e,t,o){const i=this.originalOperations.get(e),r=this.originalOperations.get(t);let s=this._relations.get(i);s||(s=new Map,this._relations.set(i,s)),s.set(r,o)}}function v(e,t){for(const o of e)o.baseVersion=t++}function y(e,t){for(let o=0;o<t;o++)e.push(new u.a(0))}function j(e,t,o){const i=e.nodes.getNode(0).getAttribute(t);if(i==o)return null;const s=new h.a(e.position,e.position.getShiftedBy(e.howMany));return new r.a(s,t,i,o,0)}function x(e,t){return null===e.targetPosition._getTransformedByDeletion(t.sourcePosition,t.howMany)}function P(e,t){const o=[];for(let i=0;i<e.length;i++){const r=e[i],s=new a.a(r.start,r.end.offset-r.start.offset,t,0);o.push(s);for(let t=i+1;t<e.length;t++)e[t]=e[t]._getTransformedByMove(s.sourcePosition,s.targetPosition,s.howMany)[0];t=t._getTransformedByMove(s.sourcePosition,s.targetPosition,s.howMany)}return o}m(r.a,r.a,(e,t,o)=>{if(e.key===t.key&&e.range.start.hasSameParentAs(t.range.start)){const i=e.range.getDifference(t.range).map(t=>new r.a(t,e.key,e.oldValue,e.newValue,0)),s=e.range.getIntersection(t.range);return s&&o.aIsStrong&&i.push(new r.a(s,t.key,t.newValue,e.newValue,0)),0==i.length?[new u.a(0)]:i}return[e]}),m(r.a,i.a,(e,t)=>{if(e.range.start.hasSameParentAs(t.position)&&e.range.containsPosition(t.position)){const o=e.range._getTransformedByInsertion(t.position,t.howMany,!t.shouldReceiveAttributes).map(t=>new r.a(t,e.key,e.oldValue,e.newValue,e.baseVersion));if(t.shouldReceiveAttributes){const i=j(t,e.key,e.oldValue);i&&o.unshift(i)}return o}return e.range=e.range._getTransformedByInsertion(t.position,t.howMany,!1)[0],[e]}),m(r.a,l.a,(e,t)=>{const o=[];e.range.start.hasSameParentAs(t.deletionPosition)&&(e.range.containsPosition(t.deletionPosition)||e.range.start.isEqual(t.deletionPosition))&&o.push(h.a._createFromPositionAndShift(t.graveyardPosition,1));const i=e.range._getTransformedByMergeOperation(t);return i.isCollapsed||o.push(i),o.map(t=>new r.a(t,e.key,e.oldValue,e.newValue,e.baseVersion))}),m(r.a,a.a,(e,t)=>function(e,t){const o=h.a._createFromPositionAndShift(t.sourcePosition,t.howMany);let i=null,r=[];o.containsRange(e,!0)?i=e:e.start.hasSameParentAs(o.start)?(r=e.getDifference(o),i=e.getIntersection(o)):r=[e];const s=[];for(let e of r){e=e._getTransformedByDeletion(t.sourcePosition,t.howMany);const o=t.getMovedRangeStart(),i=e.start.hasSameParentAs(o);e=e._getTransformedByInsertion(o,t.howMany,i),s.push(...e)}i&&s.push(i._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany,!1)[0]);return s}(e.range,t).map(t=>new r.a(t,e.key,e.oldValue,e.newValue,e.baseVersion))),m(r.a,d.a,(e,t)=>{if(e.range.end.isEqual(t.insertionPosition))return t.graveyardPosition||e.range.end.offset++,[e];if(e.range.start.hasSameParentAs(t.splitPosition)&&e.range.containsPosition(t.splitPosition)){const o=e.clone();return o.range=new h.a(t.moveTargetPosition.clone(),e.range.end._getCombined(t.splitPosition,t.moveTargetPosition)),e.range.end=t.splitPosition.clone(),e.range.end.stickiness="toPrevious",[e,o]}return e.range=e.range._getTransformedBySplitOperation(t),[e]}),m(i.a,r.a,(e,t)=>{const o=[e];if(e.shouldReceiveAttributes&&e.position.hasSameParentAs(t.range.start)&&t.range.containsPosition(e.position)){const i=j(e,t.key,t.newValue);i&&o.push(i)}return o}),m(i.a,i.a,(e,t,o)=>(e.position.isEqual(t.position)&&o.aIsStrong||(e.position=e.position._getTransformedByInsertOperation(t)),[e])),m(i.a,a.a,(e,t)=>(e.position=e.position._getTransformedByMoveOperation(t),[e])),m(i.a,d.a,(e,t)=>(e.position=e.position._getTransformedBySplitOperation(t),[e])),m(i.a,l.a,(e,t)=>(e.position=e.position._getTransformedByMergeOperation(t),[e])),m(n.a,i.a,(e,t)=>(e.oldRange&&(e.oldRange=e.oldRange._getTransformedByInsertOperation(t)[0]),e.newRange&&(e.newRange=e.newRange._getTransformedByInsertOperation(t)[0]),[e])),m(n.a,n.a,(e,t,o)=>{if(e.name==t.name){if(!o.aIsStrong)return[new u.a(0)];e.oldRange=t.newRange?t.newRange.clone():null}return[e]}),m(n.a,l.a,(e,t)=>(e.oldRange&&(e.oldRange=e.oldRange._getTransformedByMergeOperation(t)),e.newRange&&(e.newRange=e.newRange._getTransformedByMergeOperation(t)),[e])),m(n.a,a.a,(e,t,o)=>{if(e.oldRange&&(e.oldRange=h.a._createFromRanges(e.oldRange._getTransformedByMoveOperation(t))),e.newRange){if(o.abRelation){const i=h.a._createFromRanges(e.newRange._getTransformedByMoveOperation(t));if("left"==o.abRelation.side&&t.targetPosition.isEqual(e.newRange.start))return e.newRange.start.path=o.abRelation.path,e.newRange.end=i.end,[e];if("right"==o.abRelation.side&&t.targetPosition.isEqual(e.newRange.end))return e.newRange.start=i.start,e.newRange.end.path=o.abRelation.path,[e]}e.newRange=h.a._createFromRanges(e.newRange._getTransformedByMoveOperation(t))}return[e]}),m(n.a,d.a,(e,t,o)=>{if(e.oldRange&&(e.oldRange=e.oldRange._getTransformedBySplitOperation(t)),e.newRange){if(o.abRelation){const i=e.newRange._getTransformedBySplitOperation(t);return e.newRange.start.isEqual(t.splitPosition)&&o.abRelation.wasStartBeforeMergedElement?e.newRange.start=p.a._createAt(t.insertionPosition):e.newRange.start.isEqual(t.splitPosition)&&!o.abRelation.wasInLeftElement&&(e.newRange.start=p.a._createAt(t.moveTargetPosition)),e.newRange.end.isEqual(t.splitPosition)&&o.abRelation.wasInRightElement?e.newRange.end=p.a._createAt(t.moveTargetPosition):e.newRange.end.isEqual(t.splitPosition)&&o.abRelation.wasEndBeforeMergedElement?e.newRange.end=p.a._createAt(t.insertionPosition):e.newRange.end=i.end,[e]}e.newRange=e.newRange._getTransformedBySplitOperation(t)}return[e]}),m(l.a,i.a,(e,t)=>(e.sourcePosition.hasSameParentAs(t.position)&&(e.howMany+=t.howMany),e.sourcePosition=e.sourcePosition._getTransformedByInsertOperation(t),e.targetPosition=e.targetPosition._getTransformedByInsertOperation(t),[e])),m(l.a,l.a,(e,t,o)=>{if(e.sourcePosition.isEqual(t.sourcePosition)&&e.targetPosition.isEqual(t.targetPosition)){if(o.bWasUndone){const o=t.graveyardPosition.path.slice();return o.push(0),e.sourcePosition=new p.a(t.graveyardPosition.root,o),e.howMany=0,[e]}return[new u.a(0)]}if(e.sourcePosition.isEqual(t.sourcePosition)&&!e.targetPosition.isEqual(t.targetPosition)&&!o.bWasUndone&&"splitAtSource"!=o.abRelation){const i="$graveyard"==e.targetPosition.root.rootName,r="$graveyard"==t.targetPosition.root.rootName,s=i&&!r;if(r&&!i||!s&&o.aIsStrong){const o=t.targetPosition._getTransformedByMergeOperation(t),i=e.targetPosition._getTransformedByMergeOperation(t);return[new a.a(o,e.howMany,i,0)]}return[new u.a(0)]}return e.sourcePosition.hasSameParentAs(t.targetPosition)&&(e.howMany+=t.howMany),e.sourcePosition=e.sourcePosition._getTransformedByMergeOperation(t),e.targetPosition=e.targetPosition._getTransformedByMergeOperation(t),e.graveyardPosition.isEqual(t.graveyardPosition)&&o.aIsStrong||(e.graveyardPosition=e.graveyardPosition._getTransformedByMergeOperation(t)),[e]}),m(l.a,a.a,(e,t,o)=>{const i=h.a._createFromPositionAndShift(t.sourcePosition,t.howMany);return"remove"==t.type&&!o.bWasUndone&&!o.forceWeakRemove&&e.deletionPosition.hasSameParentAs(t.sourcePosition)&&i.containsPosition(e.sourcePosition)?[new u.a(0)]:(e.sourcePosition.hasSameParentAs(t.targetPosition)&&(e.howMany+=t.howMany),e.sourcePosition.hasSameParentAs(t.sourcePosition)&&(e.howMany-=t.howMany),e.sourcePosition=e.sourcePosition._getTransformedByMoveOperation(t),e.targetPosition=e.targetPosition._getTransformedByMoveOperation(t),e.graveyardPosition.isEqual(t.targetPosition)||(e.graveyardPosition=e.graveyardPosition._getTransformedByMoveOperation(t)),[e])}),m(l.a,d.a,(e,t,o)=>{if(t.graveyardPosition&&(e.graveyardPosition=e.graveyardPosition._getTransformedByDeletion(t.graveyardPosition,1),e.deletionPosition.isEqual(t.graveyardPosition)&&(e.howMany=t.howMany)),e.targetPosition.isEqual(t.splitPosition)){const i=0!=t.howMany,r=t.graveyardPosition&&e.deletionPosition.isEqual(t.graveyardPosition);if(i||r||"mergeTargetNotMoved"==o.abRelation)return e.sourcePosition=e.sourcePosition._getTransformedBySplitOperation(t),[e]}if(e.sourcePosition.isEqual(t.splitPosition)){if("mergeSourceNotMoved"==o.abRelation)return e.howMany=0,e.targetPosition=e.targetPosition._getTransformedBySplitOperation(t),[e];if("mergeSameElement"==o.abRelation||e.sourcePosition.offset>0)return e.sourcePosition=t.moveTargetPosition.clone(),e.targetPosition=e.targetPosition._getTransformedBySplitOperation(t),[e]}return e.sourcePosition.hasSameParentAs(t.splitPosition)&&(e.howMany=t.splitPosition.offset),e.sourcePosition=e.sourcePosition._getTransformedBySplitOperation(t),e.targetPosition=e.targetPosition._getTransformedBySplitOperation(t),[e]}),m(a.a,i.a,(e,t)=>{const o=h.a._createFromPositionAndShift(e.sourcePosition,e.howMany)._getTransformedByInsertOperation(t,!1)[0];return e.sourcePosition=o.start,e.howMany=o.end.offset-o.start.offset,e.targetPosition.isEqual(t.position)||(e.targetPosition=e.targetPosition._getTransformedByInsertOperation(t)),[e]}),m(a.a,a.a,(e,t,o)=>{const i=h.a._createFromPositionAndShift(e.sourcePosition,e.howMany),r=h.a._createFromPositionAndShift(t.sourcePosition,t.howMany);let s,n=o.aIsStrong,a=!o.aIsStrong;if("insertBefore"==o.abRelation||"insertAfter"==o.baRelation?a=!0:"insertAfter"!=o.abRelation&&"insertBefore"!=o.baRelation||(a=!1),s=e.targetPosition.isEqual(t.targetPosition)&&a?e.targetPosition._getTransformedByDeletion(t.sourcePosition,t.howMany):e.targetPosition._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany),x(e,t)&&x(t,e))return[t.getReversed()];if(i.containsPosition(t.targetPosition)&&i.containsRange(r,!0))return i.start=i.start._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany),i.end=i.end._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany),P([i],s);if(r.containsPosition(e.targetPosition)&&r.containsRange(i,!0))return i.start=i.start._getCombined(t.sourcePosition,t.getMovedRangeStart()),i.end=i.end._getCombined(t.sourcePosition,t.getMovedRangeStart()),P([i],s);const c=Object(g.a)(e.sourcePosition.getParentPath(),t.sourcePosition.getParentPath());if("prefix"==c||"extension"==c)return i.start=i.start._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany),i.end=i.end._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany),P([i],s);"remove"!=e.type||"remove"==t.type||o.aWasUndone||o.forceWeakRemove?"remove"==e.type||"remove"!=t.type||o.bWasUndone||o.forceWeakRemove||(n=!1):n=!0;const l=[],d=i.getDifference(r);for(const e of d){e.start=e.start._getTransformedByDeletion(t.sourcePosition,t.howMany),e.end=e.end._getTransformedByDeletion(t.sourcePosition,t.howMany);const o="same"==Object(g.a)(e.start.getParentPath(),t.getMovedRangeStart().getParentPath()),i=e._getTransformedByInsertion(t.getMovedRangeStart(),t.howMany,o);l.push(...i)}const p=i.getIntersection(r);return null!==p&&n&&(p.start=p.start._getCombined(t.sourcePosition,t.getMovedRangeStart()),p.end=p.end._getCombined(t.sourcePosition,t.getMovedRangeStart()),0===l.length?l.push(p):1==l.length?r.start.isBefore(i.start)||r.start.isEqual(i.start)?l.unshift(p):l.push(p):l.splice(1,0,p)),0===l.length?[new u.a(e.baseVersion)]:P(l,s)}),m(a.a,d.a,(e,t,o)=>{let i=e.targetPosition.clone();e.targetPosition.isEqual(t.insertionPosition)&&t.graveyardPosition&&"moveTargetAfter"!=o.abRelation||(i=e.targetPosition._getTransformedBySplitOperation(t));const r=h.a._createFromPositionAndShift(e.sourcePosition,e.howMany);if(r.end.isEqual(t.insertionPosition))return t.graveyardPosition||e.howMany++,e.targetPosition=i,[e];if(r.start.hasSameParentAs(t.splitPosition)&&r.containsPosition(t.splitPosition)){let e=new h.a(t.splitPosition,r.end);e=e._getTransformedBySplitOperation(t);return P([new h.a(r.start,t.splitPosition),e],i)}e.targetPosition.isEqual(t.splitPosition)&&"insertAtSource"==o.abRelation&&(i=t.moveTargetPosition),e.targetPosition.isEqual(t.insertionPosition)&&"insertBetween"==o.abRelation&&(i=e.targetPosition);const s=[r._getTransformedBySplitOperation(t)];if(t.graveyardPosition){const i=r.start.isEqual(t.graveyardPosition)||r.containsPosition(t.graveyardPosition);e.howMany>1&&i&&!o.aWasUndone&&s.push(h.a._createFromPositionAndShift(t.insertionPosition,1))}return P(s,i)}),m(a.a,l.a,(e,t,o)=>{const i=h.a._createFromPositionAndShift(e.sourcePosition,e.howMany);if(t.deletionPosition.hasSameParentAs(e.sourcePosition)&&i.containsPosition(t.sourcePosition))if("remove"!=e.type||o.forceWeakRemove){if(1==e.howMany)return o.bWasUndone?(e.sourcePosition=t.graveyardPosition.clone(),e.targetPosition=e.targetPosition._getTransformedByMergeOperation(t),[e]):[new u.a(0)]}else if(!o.aWasUndone){const o=[];let i=t.graveyardPosition.clone(),r=t.targetPosition._getTransformedByMergeOperation(t);e.howMany>1&&(o.push(new a.a(e.sourcePosition,e.howMany-1,e.targetPosition,0)),i=i._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany-1),r=r._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany-1));const s=t.deletionPosition._getCombined(e.sourcePosition,e.targetPosition),n=new a.a(i,1,s,0),c=n.getMovedRangeStart().path.slice();c.push(0);const l=new p.a(n.targetPosition.root,c);r=r._getTransformedByMove(i,s,1);const d=new a.a(r,t.howMany,l,0);return o.push(n),o.push(d),o}const r=h.a._createFromPositionAndShift(e.sourcePosition,e.howMany)._getTransformedByMergeOperation(t);return e.sourcePosition=r.start,e.howMany=r.end.offset-r.start.offset,e.targetPosition=e.targetPosition._getTransformedByMergeOperation(t),[e]}),m(s.a,i.a,(e,t)=>(e.position=e.position._getTransformedByInsertOperation(t),[e])),m(s.a,l.a,(e,t)=>e.position.isEqual(t.deletionPosition)?(e.position=t.graveyardPosition.clone(),e.position.stickiness="toNext",[e]):(e.position=e.position._getTransformedByMergeOperation(t),[e])),m(s.a,a.a,(e,t)=>(e.position=e.position._getTransformedByMoveOperation(t),[e])),m(s.a,s.a,(e,t,o)=>{if(e.position.isEqual(t.position)){if(!o.aIsStrong)return[new u.a(0)];e.oldName=t.newName}return[e]}),m(s.a,d.a,(e,t)=>{const o=e.position.path,i=t.splitPosition.getParentPath();if("same"==Object(g.a)(o,i)&&!t.graveyardPosition){const t=new s.a(e.position.getShiftedBy(1),e.oldName,e.newName,0);return[e,t]}return e.position=e.position._getTransformedBySplitOperation(t),[e]}),m(c.a,c.a,(e,t,o)=>{if(e.root===t.root&&e.key===t.key){if(!o.aIsStrong||e.newValue===t.newValue)return[new u.a(0)];e.oldValue=t.newValue}return[e]}),m(d.a,i.a,(e,t)=>(e.splitPosition.hasSameParentAs(t.position)&&e.splitPosition.offset<t.position.offset&&(e.howMany+=t.howMany),e.splitPosition=e.splitPosition._getTransformedByInsertOperation(t),e.insertionPosition=e.insertionPosition._getTransformedByInsertOperation(t),[e])),m(d.a,l.a,(e,t,o)=>{if(!e.graveyardPosition&&!o.bWasUndone&&e.splitPosition.hasSameParentAs(t.sourcePosition)){const o=t.graveyardPosition.path.slice();o.push(0);const i=new p.a(t.graveyardPosition.root,o),r=d.a.getInsertionPosition(new p.a(t.graveyardPosition.root,o)),s=new d.a(i,0,r,null,0);return e.splitPosition=e.splitPosition._getTransformedByMergeOperation(t),e.insertionPosition=d.a.getInsertionPosition(e.splitPosition),e.graveyardPosition=s.insertionPosition.clone(),e.graveyardPosition.stickiness="toNext",[s,e]}return e.splitPosition.hasSameParentAs(t.deletionPosition)&&!e.splitPosition.isAfter(t.deletionPosition)&&e.howMany--,e.splitPosition.hasSameParentAs(t.targetPosition)&&(e.howMany+=t.howMany),e.splitPosition=e.splitPosition._getTransformedByMergeOperation(t),e.insertionPosition=d.a.getInsertionPosition(e.splitPosition),e.graveyardPosition&&(e.graveyardPosition=e.graveyardPosition._getTransformedByMergeOperation(t)),[e]}),m(d.a,a.a,(e,t,o)=>{const i=h.a._createFromPositionAndShift(t.sourcePosition,t.howMany);if(e.graveyardPosition){const r=i.start.isEqual(e.graveyardPosition)||i.containsPosition(e.graveyardPosition);if(!o.bWasUndone&&r){const o=e.splitPosition._getTransformedByMoveOperation(t),i=e.graveyardPosition._getTransformedByMoveOperation(t),r=i.path.slice();r.push(0);const s=new p.a(i.root,r);return[new a.a(o,e.howMany,s,0)]}e.graveyardPosition=e.graveyardPosition._getTransformedByMoveOperation(t)}const r=e.splitPosition.isEqual(t.targetPosition);if(r&&("insertAtSource"==o.baRelation||"splitBefore"==o.abRelation))return e.howMany+=t.howMany,e.splitPosition=e.splitPosition._getTransformedByDeletion(t.sourcePosition,t.howMany),e.insertionPosition=d.a.getInsertionPosition(e.splitPosition),[e];if(r&&o.abRelation&&o.abRelation.howMany){const{howMany:t,offset:i}=o.abRelation;return e.howMany+=t,e.splitPosition=e.splitPosition.getShiftedBy(i),[e]}if(e.splitPosition.hasSameParentAs(t.sourcePosition)&&i.containsPosition(e.splitPosition)){const o=t.howMany-(e.splitPosition.offset-t.sourcePosition.offset);return e.howMany-=o,e.splitPosition.hasSameParentAs(t.targetPosition)&&e.splitPosition.offset<t.targetPosition.offset&&(e.howMany+=t.howMany),e.splitPosition=t.sourcePosition.clone(),e.insertionPosition=d.a.getInsertionPosition(e.splitPosition),[e]}return t.sourcePosition.isEqual(t.targetPosition)||(e.splitPosition.hasSameParentAs(t.sourcePosition)&&e.splitPosition.offset<=t.sourcePosition.offset&&(e.howMany-=t.howMany),e.splitPosition.hasSameParentAs(t.targetPosition)&&e.splitPosition.offset<t.targetPosition.offset&&(e.howMany+=t.howMany)),e.splitPosition.stickiness="toNone",e.splitPosition=e.splitPosition._getTransformedByMoveOperation(t),e.splitPosition.stickiness="toNext",e.graveyardPosition?e.insertionPosition=e.insertionPosition._getTransformedByMoveOperation(t):e.insertionPosition=d.a.getInsertionPosition(e.splitPosition),[e]}),m(d.a,d.a,(e,t,o)=>{if(e.splitPosition.isEqual(t.splitPosition)){if(!e.graveyardPosition&&!t.graveyardPosition)return[new u.a(0)];if(e.graveyardPosition&&t.graveyardPosition&&e.graveyardPosition.isEqual(t.graveyardPosition))return[new u.a(0)];if("splitBefore"==o.abRelation)return e.howMany=0,e.graveyardPosition=e.graveyardPosition._getTransformedBySplitOperation(t),[e]}if(e.graveyardPosition&&t.graveyardPosition&&e.graveyardPosition.isEqual(t.graveyardPosition)){const i="$graveyard"==e.splitPosition.root.rootName,r="$graveyard"==t.splitPosition.root.rootName,s=i&&!r;if(r&&!i||!s&&o.aIsStrong){const o=[];return t.howMany&&o.push(new a.a(t.moveTargetPosition,t.howMany,t.splitPosition,0)),e.howMany&&o.push(new a.a(e.splitPosition,e.howMany,e.moveTargetPosition,0)),o}return[new u.a(0)]}if(e.graveyardPosition&&(e.graveyardPosition=e.graveyardPosition._getTransformedBySplitOperation(t)),e.splitPosition.isEqual(t.insertionPosition)&&"splitBefore"==o.abRelation)return e.howMany++,[e];if(t.splitPosition.isEqual(e.insertionPosition)&&"splitBefore"==o.baRelation){const o=t.insertionPosition.path.slice();o.push(0);const i=new p.a(t.insertionPosition.root,o);return[e,new a.a(e.insertionPosition,1,i,0)]}return e.splitPosition.hasSameParentAs(t.splitPosition)&&e.splitPosition.offset<t.splitPosition.offset&&(e.howMany-=t.howMany),e.splitPosition=e.splitPosition._getTransformedBySplitOperation(t),e.insertionPosition=d.a.getInsertionPosition(e.splitPosition),[e]})},"./packages/ckeditor5-engine/src/model/operation/utils.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return d})),o.d(t,"d",(function(){return u})),o.d(t,"b",(function(){return h})),o.d(t,"e",(function(){return p})),o.d(t,"c",(function(){return g}));var i=o("./packages/ckeditor5-engine/src/model/node.js"),r=o("./packages/ckeditor5-engine/src/model/text.js"),s=o("./packages/ckeditor5-engine/src/model/textproxy.js"),n=o("./packages/ckeditor5-engine/src/model/range.js"),a=o("./packages/ckeditor5-engine/src/model/documentfragment.js"),c=o("./packages/ckeditor5-engine/src/model/nodelist.js"),l=o("./packages/ckeditor5-utils/src/ckeditorerror.js");function d(e,t){const o=(t=g(t)).reduce((e,t)=>e+t.offsetSize,0),i=e.parent;m(e);const r=e.index;return i._insertChild(r,t),f(i,r+t.length),f(i,r),new n.a(e,e.getShiftedBy(o))}function u(e){if(!e.isFlat)throw new l.a("operation-utils-remove-range-not-flat",this);const t=e.start.parent;m(e.start),m(e.end);const o=t._removeChildren(e.start.index,e.end.index-e.start.index);return f(t,e.start.index),o}function h(e,t){if(!e.isFlat)throw new l.a("operation-utils-move-range-not-flat",this);const o=u(e);return d(t=t._getTransformedByDeletion(e.start,e.end.offset-e.start.offset),o)}function p(e,t,o){m(e.start),m(e.end);for(const i of e.getItems({shallow:!0})){const e=i.is("$textProxy")?i.textNode:i;null!==o?e._setAttribute(t,o):e._removeAttribute(t),f(e.parent,e.index)}f(e.end.parent,e.end.index)}function g(e){const t=[];e instanceof Array||(e=[e]);for(let o=0;o<e.length;o++)if("string"==typeof e[o])t.push(new r.a(e[o]));else if(e[o]instanceof s.a)t.push(new r.a(e[o].data,e[o].getAttributes()));else if(e[o]instanceof a.a||e[o]instanceof c.a)for(const i of e[o])t.push(i);else e[o]instanceof i.a&&t.push(e[o]);for(let e=1;e<t.length;e++){const o=t[e],i=t[e-1];o instanceof r.a&&i instanceof r.a&&k(o,i)&&(t.splice(e-1,2,new r.a(i.data+o.data,i.getAttributes())),e--)}return t}function f(e,t){const o=e.getChild(t-1),i=e.getChild(t);if(o&&i&&o.is("$text")&&i.is("$text")&&k(o,i)){const s=new r.a(o.data+i.data,o.getAttributes());e._removeChildren(t-1,2),e._insertChild(t-1,s)}}function m(e){const t=e.textNode,o=e.parent;if(t){const i=e.offset-t.startOffset,s=t.index;o._removeChildren(s,1);const n=new r.a(t.data.substr(0,i),t.getAttributes()),a=new r.a(t.data.substr(i),t.getAttributes());o._insertChild(s,[n,a])}}function k(e,t){const o=e.getAttributes(),i=t.getAttributes();for(const e of o){if(e[1]!==t.getAttribute(e[0]))return!1;i.next()}return i.next().done}},"./packages/ckeditor5-engine/src/model/position.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return n})),o.d(t,"d",(function(){return a})),o.d(t,"b",(function(){return c})),o.d(t,"c",(function(){return l}));var i=o("./packages/ckeditor5-engine/src/model/treewalker.js"),r=o("./packages/ckeditor5-utils/src/comparearrays.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js");o("./packages/ckeditor5-utils/src/version.js");class n{constructor(e,t,o="toNone"){if(!e.is("element")&&!e.is("documentFragment"))throw new s.a("model-position-root-invalid",e);if(!(t instanceof Array)||0===t.length)throw new s.a("model-position-path-incorrect-format",e,{path:t});e.is("rootElement")?t=t.slice():(t=[...e.getPath(),...t],e=e.root),this.root=e,this.path=t,this.stickiness=o}get offset(){return this.path[this.path.length-1]}set offset(e){this.path[this.path.length-1]=e}get parent(){let e=this.root;for(let t=0;t<this.path.length-1;t++)if(e=e.getChild(e.offsetToIndex(this.path[t])),!e)throw new s.a("model-position-path-incorrect",this,{position:this});if(e.is("$text"))throw new s.a("model-position-path-incorrect",this,{position:this});return e}get index(){return this.parent.offsetToIndex(this.offset)}get textNode(){return a(this,this.parent)}get nodeAfter(){const e=this.parent;return c(this,e,a(this,e))}get nodeBefore(){const e=this.parent;return l(this,e,a(this,e))}get isAtStart(){return 0===this.offset}get isAtEnd(){return this.offset==this.parent.maxOffset}compareWith(e){if(this.root!=e.root)return"different";const t=Object(r.a)(this.path,e.path);switch(t){case"same":return"same";case"prefix":return"before";case"extension":return"after";default:return this.path[t]<e.path[t]?"before":"after"}}getLastMatchingPosition(e,t={}){t.startPosition=this;const o=new i.a(t);return o.skip(e),o.position}getParentPath(){return this.path.slice(0,-1)}getAncestors(){const e=this.parent;return e.is("documentFragment")?[e]:e.getAncestors({includeSelf:!0})}findAncestor(e){const t=this.parent;return t.is("element")?t.findAncestor(e,{includeSelf:!0}):null}getCommonPath(e){if(this.root!=e.root)return[];const t=Object(r.a)(this.path,e.path),o="string"==typeof t?Math.min(this.path.length,e.path.length):t;return this.path.slice(0,o)}getCommonAncestor(e){const t=this.getAncestors(),o=e.getAncestors();let i=0;for(;t[i]==o[i]&&t[i];)i++;return 0===i?null:t[i-1]}getShiftedBy(e){const t=this.clone(),o=t.offset+e;return t.offset=o<0?0:o,t}isAfter(e){return"after"==this.compareWith(e)}isBefore(e){return"before"==this.compareWith(e)}isEqual(e){return"same"==this.compareWith(e)}isTouching(e){let t=null,o=null;switch(this.compareWith(e)){case"same":return!0;case"before":t=n._createAt(this),o=n._createAt(e);break;case"after":t=n._createAt(e),o=n._createAt(this);break;default:return!1}let i=t.parent;for(;t.path.length+o.path.length;){if(t.isEqual(o))return!0;if(t.path.length>o.path.length){if(t.offset!==i.maxOffset)return!1;t.path=t.path.slice(0,-1),i=i.parent,t.offset++}else{if(0!==o.offset)return!1;o.path=o.path.slice(0,-1)}}}is(e){return"position"===e||"model:position"===e}hasSameParentAs(e){if(this.root!==e.root)return!1;const t=this.getParentPath(),o=e.getParentPath();return"same"==Object(r.a)(t,o)}getTransformedByOperation(e){let t;switch(e.type){case"insert":t=this._getTransformedByInsertOperation(e);break;case"move":case"remove":case"reinsert":t=this._getTransformedByMoveOperation(e);break;case"split":t=this._getTransformedBySplitOperation(e);break;case"merge":t=this._getTransformedByMergeOperation(e);break;default:t=n._createAt(this)}return t}_getTransformedByInsertOperation(e){return this._getTransformedByInsertion(e.position,e.howMany)}_getTransformedByMoveOperation(e){return this._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany)}_getTransformedBySplitOperation(e){const t=e.movedRange;return t.containsPosition(this)||t.start.isEqual(this)&&"toNext"==this.stickiness?this._getCombined(e.splitPosition,e.moveTargetPosition):e.graveyardPosition?this._getTransformedByMove(e.graveyardPosition,e.insertionPosition,1):this._getTransformedByInsertion(e.insertionPosition,1)}_getTransformedByMergeOperation(e){const t=e.movedRange;let o;return t.containsPosition(this)||t.start.isEqual(this)?(o=this._getCombined(e.sourcePosition,e.targetPosition),e.sourcePosition.isBefore(e.targetPosition)&&(o=o._getTransformedByDeletion(e.deletionPosition,1))):o=this.isEqual(e.deletionPosition)?n._createAt(e.deletionPosition):this._getTransformedByMove(e.deletionPosition,e.graveyardPosition,1),o}_getTransformedByDeletion(e,t){const o=n._createAt(this);if(this.root!=e.root)return o;if("same"==Object(r.a)(e.getParentPath(),this.getParentPath())){if(e.offset<this.offset){if(e.offset+t>this.offset)return null;o.offset-=t}}else if("prefix"==Object(r.a)(e.getParentPath(),this.getParentPath())){const i=e.path.length-1;if(e.offset<=this.path[i]){if(e.offset+t>this.path[i])return null;o.path[i]-=t}}return o}_getTransformedByInsertion(e,t){const o=n._createAt(this);if(this.root!=e.root)return o;if("same"==Object(r.a)(e.getParentPath(),this.getParentPath()))(e.offset<this.offset||e.offset==this.offset&&"toPrevious"!=this.stickiness)&&(o.offset+=t);else if("prefix"==Object(r.a)(e.getParentPath(),this.getParentPath())){const i=e.path.length-1;e.offset<=this.path[i]&&(o.path[i]+=t)}return o}_getTransformedByMove(e,t,o){if(t=t._getTransformedByDeletion(e,o),e.isEqual(t))return n._createAt(this);const i=this._getTransformedByDeletion(e,o);return null===i||e.isEqual(this)&&"toNext"==this.stickiness||e.getShiftedBy(o).isEqual(this)&&"toPrevious"==this.stickiness?this._getCombined(e,t):i._getTransformedByInsertion(t,o)}_getCombined(e,t){const o=e.path.length-1,i=n._createAt(t);return i.stickiness=this.stickiness,i.offset=i.offset+this.path[o]-e.offset,i.path=[...i.path,...this.path.slice(o+1)],i}toJSON(){return{root:this.root.toJSON(),path:Array.from(this.path),stickiness:this.stickiness}}clone(){return new this.constructor(this.root,this.path,this.stickiness)}static _createAt(e,t,o="toNone"){if(e instanceof n)return new n(e.root,e.path,e.stickiness);{const i=e;if("end"==t)t=i.maxOffset;else{if("before"==t)return this._createBefore(i,o);if("after"==t)return this._createAfter(i,o);if(0!==t&&!t)throw new s.a("model-createpositionat-offset-required",[this,e])}if(!i.is("element")&&!i.is("documentFragment"))throw new s.a("model-position-parent-incorrect",[this,e]);const r=i.getPath();return r.push(t),new this(i.root,r,o)}}static _createAfter(e,t){if(!e.parent)throw new s.a("model-position-after-root",[this,e],{root:e});return this._createAt(e.parent,e.endOffset,t)}static _createBefore(e,t){if(!e.parent)throw new s.a("model-position-before-root",e,{root:e});return this._createAt(e.parent,e.startOffset,t)}static fromJSON(e,t){if("$graveyard"===e.root){const o=new n(t.graveyard,e.path);return o.stickiness=e.stickiness,o}if(!t.getRoot(e.root))throw new s.a("model-position-fromjson-no-root",t,{rootName:e.root});return new n(t.getRoot(e.root),e.path,e.stickiness)}}function a(e,t){const o=t.getChild(t.offsetToIndex(e.offset));return o&&o.is("$text")&&o.startOffset<e.offset?o:null}function c(e,t,o){return null!==o?null:t.getChild(t.offsetToIndex(e.offset))}function l(e,t,o){return null!==o?null:t.getChild(t.offsetToIndex(e.offset)-1)}},"./packages/ckeditor5-engine/src/model/range.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-engine/src/model/position.js"),r=o("./packages/ckeditor5-engine/src/model/treewalker.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-utils/src/comparearrays.js");class a{constructor(e,t=null){this.start=i.a._createAt(e),this.end=t?i.a._createAt(t):i.a._createAt(e),this.start.stickiness=this.isCollapsed?"toNone":"toNext",this.end.stickiness=this.isCollapsed?"toNone":"toPrevious"}*[Symbol.iterator](){yield*new r.a({boundaries:this,ignoreElementEnd:!0})}get isCollapsed(){return this.start.isEqual(this.end)}get isFlat(){const e=this.start.getParentPath(),t=this.end.getParentPath();return"same"==Object(n.a)(e,t)}get root(){return this.start.root}containsPosition(e){return e.isAfter(this.start)&&e.isBefore(this.end)}containsRange(e,t=!1){e.isCollapsed&&(t=!1);const o=this.containsPosition(e.start)||t&&this.start.isEqual(e.start),i=this.containsPosition(e.end)||t&&this.end.isEqual(e.end);return o&&i}containsItem(e){const t=i.a._createBefore(e);return this.containsPosition(t)||this.start.isEqual(t)}is(e){return"range"===e||"model:range"===e}isEqual(e){return this.start.isEqual(e.start)&&this.end.isEqual(e.end)}isIntersecting(e){return this.start.isBefore(e.end)&&this.end.isAfter(e.start)}getDifference(e){const t=[];return this.isIntersecting(e)?(this.containsPosition(e.start)&&t.push(new a(this.start,e.start)),this.containsPosition(e.end)&&t.push(new a(e.end,this.end))):t.push(new a(this.start,this.end)),t}getIntersection(e){if(this.isIntersecting(e)){let t=this.start,o=this.end;return this.containsPosition(e.start)&&(t=e.start),this.containsPosition(e.end)&&(o=e.end),new a(t,o)}return null}getJoined(e,t=!1){let o=this.isIntersecting(e);if(o||(o=this.start.isBefore(e.start)?t?this.end.isTouching(e.start):this.end.isEqual(e.start):t?e.end.isTouching(this.start):e.end.isEqual(this.start)),!o)return null;let i=this.start,r=this.end;return e.start.isBefore(i)&&(i=e.start),e.end.isAfter(r)&&(r=e.end),new a(i,r)}getMinimalFlatRanges(){const e=[],t=this.start.getCommonPath(this.end).length,o=i.a._createAt(this.start);let r=o.parent;for(;o.path.length>t+1;){const t=r.maxOffset-o.offset;0!==t&&e.push(new a(o,o.getShiftedBy(t))),o.path=o.path.slice(0,-1),o.offset++,r=r.parent}for(;o.path.length<=this.end.path.length;){const t=this.end.path[o.path.length-1],i=t-o.offset;0!==i&&e.push(new a(o,o.getShiftedBy(i))),o.offset=t,o.path.push(0)}return e}getWalker(e={}){return e.boundaries=this,new r.a(e)}*getItems(e={}){e.boundaries=this,e.ignoreElementEnd=!0;const t=new r.a(e);for(const e of t)yield e.item}*getPositions(e={}){e.boundaries=this;const t=new r.a(e);yield t.position;for(const e of t)yield e.nextPosition}getTransformedByOperation(e){switch(e.type){case"insert":return this._getTransformedByInsertOperation(e);case"move":case"remove":case"reinsert":return this._getTransformedByMoveOperation(e);case"split":return[this._getTransformedBySplitOperation(e)];case"merge":return[this._getTransformedByMergeOperation(e)]}return[new a(this.start,this.end)]}getTransformedByOperations(e){const t=[new a(this.start,this.end)];for(const o of e)for(let e=0;e<t.length;e++){const i=t[e].getTransformedByOperation(o);t.splice(e,1,...i),e+=i.length-1}for(let e=0;e<t.length;e++){const o=t[e];for(let i=e+1;i<t.length;i++){const e=t[i];(o.containsRange(e)||e.containsRange(o)||o.isEqual(e))&&t.splice(i,1)}}return t}getCommonAncestor(){return this.start.getCommonAncestor(this.end)}getContainedElement(){if(this.isCollapsed)return null;const e=this.start.nodeAfter,t=this.end.nodeBefore;return e&&e.is("element")&&e===t?e:null}toJSON(){return{start:this.start.toJSON(),end:this.end.toJSON()}}clone(){return new this.constructor(this.start,this.end)}_getTransformedByInsertOperation(e,t=!1){return this._getTransformedByInsertion(e.position,e.howMany,t)}_getTransformedByMoveOperation(e,t=!1){const o=e.sourcePosition,i=e.howMany,r=e.targetPosition;return this._getTransformedByMove(o,r,i,t)}_getTransformedBySplitOperation(e){const t=this.start._getTransformedBySplitOperation(e);let o=this.end._getTransformedBySplitOperation(e);return this.end.isEqual(e.insertionPosition)&&(o=this.end.getShiftedBy(1)),t.root!=o.root&&(o=this.end.getShiftedBy(-1)),new a(t,o)}_getTransformedByMergeOperation(e){if(this.start.isEqual(e.targetPosition)&&this.end.isEqual(e.deletionPosition))return new a(this.start);let t=this.start._getTransformedByMergeOperation(e),o=this.end._getTransformedByMergeOperation(e);return t.root!=o.root&&(o=this.end.getShiftedBy(-1)),t.isAfter(o)?(e.sourcePosition.isBefore(e.targetPosition)?(t=i.a._createAt(o),t.offset=0):(e.deletionPosition.isEqual(t)||(o=e.deletionPosition),t=e.targetPosition),new a(t,o)):new a(t,o)}_getTransformedByInsertion(e,t,o=!1){if(o&&this.containsPosition(e))return[new a(this.start,e),new a(e.getShiftedBy(t),this.end._getTransformedByInsertion(e,t))];{const o=new a(this.start,this.end);return o.start=o.start._getTransformedByInsertion(e,t),o.end=o.end._getTransformedByInsertion(e,t),[o]}}_getTransformedByMove(e,t,o,i=!1){if(this.isCollapsed){const i=this.start._getTransformedByMove(e,t,o);return[new a(i)]}const r=a._createFromPositionAndShift(e,o),s=t._getTransformedByDeletion(e,o);if(this.containsPosition(t)&&!i&&(r.containsPosition(this.start)||r.containsPosition(this.end))){const i=this.start._getTransformedByMove(e,t,o),r=this.end._getTransformedByMove(e,t,o);return[new a(i,r)]}let n;const c=this.getDifference(r);let l=null;const d=this.getIntersection(r);if(1==c.length?l=new a(c[0].start._getTransformedByDeletion(e,o),c[0].end._getTransformedByDeletion(e,o)):2==c.length&&(l=new a(this.start,this.end._getTransformedByDeletion(e,o))),n=l?l._getTransformedByInsertion(s,o,null!==d||i):[],d){const e=new a(d.start._getCombined(r.start,s),d.end._getCombined(r.start,s));2==n.length?n.splice(1,0,e):n.push(e)}return n}_getTransformedByDeletion(e,t){let o=this.start._getTransformedByDeletion(e,t),i=this.end._getTransformedByDeletion(e,t);return null==o&&null==i?null:(null==o&&(o=e),null==i&&(i=e),new a(o,i))}static _createFromPositionAndShift(e,t){const o=e,i=e.getShiftedBy(t);return t>0?new this(o,i):new this(i,o)}static _createIn(e){return new this(i.a._createAt(e,0),i.a._createAt(e,e.maxOffset))}static _createOn(e){return this._createFromPositionAndShift(i.a._createBefore(e),e.offsetSize)}static _createFromRanges(e){if(0===e.length)throw new s.a("range-create-from-ranges-empty-array",null);if(1==e.length)return e[0].clone();const t=e[0];e.sort((e,t)=>e.start.isAfter(t.start)?1:-1);const o=e.indexOf(t),r=new this(t.start,t.end);if(o>0)for(let t=o-1;e[t].end.isEqual(r.start);t++)r.start=i.a._createAt(e[t].start);for(let t=o+1;t<e.length&&e[t].start.isEqual(r.end);t++)r.end=i.a._createAt(e[t].end);return r}static fromJSON(e,t){return new this(i.a.fromJSON(e.start,t),i.a.fromJSON(e.end,t))}}},"./packages/ckeditor5-engine/src/model/schema.js":function(e,t,o){"use strict";o.d(t,"b",(function(){return u})),o.d(t,"a",(function(){return h}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),r=o("./packages/ckeditor5-utils/src/observablemixin.js"),s=o("./packages/ckeditor5-utils/src/mix.js"),n=o("./packages/ckeditor5-engine/src/model/range.js"),a=o("./packages/ckeditor5-engine/src/model/position.js"),c=o("./packages/ckeditor5-engine/src/model/element.js"),l=o("./packages/ckeditor5-engine/src/model/text.js"),d=o("./packages/ckeditor5-engine/src/model/treewalker.js");class u{constructor(){this._sourceDefinitions={},this._attributeProperties={},this.decorate("checkChild"),this.decorate("checkAttribute"),this.on("checkAttribute",(e,t)=>{t[0]=new h(t[0])},{priority:"highest"}),this.on("checkChild",(e,t)=>{t[0]=new h(t[0]),t[1]=this.getDefinition(t[1])},{priority:"highest"})}register(e,t){if(this._sourceDefinitions[e])throw new i.a("schema-cannot-register-item-twice",this,{itemName:e});this._sourceDefinitions[e]=[Object.assign({},t)],this._clearCache()}extend(e,t){if(!this._sourceDefinitions[e])throw new i.a("schema-cannot-extend-missing-item",this,{itemName:e});this._sourceDefinitions[e].push(Object.assign({},t)),this._clearCache()}getDefinitions(){return this._compiledDefinitions||this._compile(),this._compiledDefinitions}getDefinition(e){let t;return t="string"==typeof e?e:e.is&&(e.is("$text")||e.is("$textProxy"))?"$text":e.name,this.getDefinitions()[t]}isRegistered(e){return!!this.getDefinition(e)}isBlock(e){const t=this.getDefinition(e);return!(!t||!t.isBlock)}isLimit(e){const t=this.getDefinition(e);return!!t&&!(!t.isLimit&&!t.isObject)}isObject(e){const t=this.getDefinition(e);return!!t&&!!(t.isObject||t.isLimit&&t.isSelectable&&t.isContent)}isInline(e){const t=this.getDefinition(e);return!(!t||!t.isInline)}isSelectable(e){const t=this.getDefinition(e);return!!t&&!(!t.isSelectable&&!t.isObject)}isContent(e){const t=this.getDefinition(e);return!!t&&!(!t.isContent&&!t.isObject)}checkChild(e,t){return!!t&&this._checkContextMatch(t,e)}checkAttribute(e,t){const o=this.getDefinition(e.last);return!!o&&o.allowAttributes.includes(t)}checkMerge(e,t=null){if(e instanceof a.a){const t=e.nodeBefore,o=e.nodeAfter;if(!(t instanceof c.a))throw new i.a("schema-check-merge-no-element-before",this);if(!(o instanceof c.a))throw new i.a("schema-check-merge-no-element-after",this);return this.checkMerge(t,o)}for(const o of t.getChildren())if(!this.checkChild(e,o))return!1;return!0}addChildCheck(e){this.on("checkChild",(t,[o,i])=>{if(!i)return;const r=e(o,i);"boolean"==typeof r&&(t.stop(),t.return=r)},{priority:"high"})}addAttributeCheck(e){this.on("checkAttribute",(t,[o,i])=>{const r=e(o,i);"boolean"==typeof r&&(t.stop(),t.return=r)},{priority:"high"})}setAttributeProperties(e,t){this._attributeProperties[e]=Object.assign(this.getAttributeProperties(e),t)}getAttributeProperties(e){return this._attributeProperties[e]||{}}getLimitElement(e){let t;if(e instanceof a.a)t=e.parent;else{t=(e instanceof n.a?[e]:Array.from(e.getRanges())).reduce((e,t)=>{const o=t.getCommonAncestor();return e?e.getCommonAncestor(o,{includeSelf:!0}):o},null)}for(;!this.isLimit(t)&&t.parent;)t=t.parent;return t}checkAttributeInSelection(e,t){if(e.isCollapsed){const o=[...e.getFirstPosition().getAncestors(),new l.a("",e.getAttributes())];return this.checkAttribute(o,t)}{const o=e.getRanges();for(const e of o)for(const o of e)if(this.checkAttribute(o.item,t))return!0}return!1}*getValidRanges(e,t){e=function*(e){for(const t of e)yield*t.getMinimalFlatRanges()}(e);for(const o of e)yield*this._getValidRangesForRange(o,t)}getNearestSelectionRange(e,t="both"){if(this.checkChild(e,"$text"))return new n.a(e);let o,i;const r=e.getAncestors().reverse().find(e=>this.isLimit(e))||e.root;"both"!=t&&"backward"!=t||(o=new d.a({boundaries:n.a._createIn(r),startPosition:e,direction:"backward"})),"both"!=t&&"forward"!=t||(i=new d.a({boundaries:n.a._createIn(r),startPosition:e}));for(const e of function*(e,t){let o=!1;for(;!o;){if(o=!0,e){const t=e.next();t.done||(o=!1,yield{walker:e,value:t.value})}if(t){const e=t.next();e.done||(o=!1,yield{walker:t,value:e.value})}}}(o,i)){const t=e.walker==o?"elementEnd":"elementStart",i=e.value;if(i.type==t&&this.isObject(i.item))return n.a._createOn(i.item);if(this.checkChild(i.nextPosition,"$text"))return new n.a(i.nextPosition)}return null}findAllowedParent(e,t){let o=e.parent;for(;o;){if(this.checkChild(o,t))return o;if(this.isLimit(o))return null;o=o.parent}return null}removeDisallowedAttributes(e,t){for(const o of e)if(o.is("$text"))P(this,o,t);else{const e=n.a._createIn(o).getPositions();for(const o of e){P(this,o.nodeBefore||o.parent,t)}}}createContext(e){return new h(e)}_clearCache(){this._compiledDefinitions=null}_compile(){const e={},t=this._sourceDefinitions,o=Object.keys(t);for(const i of o)e[i]=p(t[i],i);for(const t of o)g(e,t);for(const t of o)f(e,t);for(const t of o)m(e,t);for(const t of o)k(e,t),b(e,t);for(const t of o)_(e,t),w(e,t),v(e,t);this._compiledDefinitions=e}_checkContextMatch(e,t,o=t.length-1){const i=t.getItem(o);if(e.allowIn.includes(i.name)){if(0==o)return!0;{const e=this.getDefinition(i);return this._checkContextMatch(e,t,o-1)}}return!1}*_getValidRangesForRange(e,t){let o=e.start,i=e.start;for(const r of e.getItems({shallow:!0}))r.is("element")&&(yield*this._getValidRangesForRange(n.a._createIn(r),t)),this.checkAttribute(r,t)||(o.isEqual(i)||(yield new n.a(o,i)),o=a.a._createAfter(r)),i=a.a._createAfter(r);o.isEqual(i)||(yield new n.a(o,i))}}Object(s.a)(u,r.a);class h{constructor(e){if(e instanceof h)return e;"string"==typeof e?e=[e]:Array.isArray(e)||(e=e.getAncestors({includeSelf:!0})),this._items=e.map(x)}get length(){return this._items.length}get last(){return this._items[this._items.length-1]}[Symbol.iterator](){return this._items[Symbol.iterator]()}push(e){const t=new h([e]);return t._items=[...this._items,...t._items],t}getItem(e){return this._items[e]}*getNames(){yield*this._items.map(e=>e.name)}endsWith(e){return Array.from(this.getNames()).join(" ").endsWith(e)}startsWith(e){return Array.from(this.getNames()).join(" ").startsWith(e)}}function p(e,t){const o={name:t,allowIn:[],allowContentOf:[],allowWhere:[],allowAttributes:[],allowAttributesOf:[],allowChildren:[],inheritTypesFrom:[]};return function(e,t){for(const o of e){const e=Object.keys(o).filter(e=>e.startsWith("is"));for(const i of e)t[i]=o[i]}}(e,o),y(e,o,"allowIn"),y(e,o,"allowContentOf"),y(e,o,"allowWhere"),y(e,o,"allowAttributes"),y(e,o,"allowAttributesOf"),y(e,o,"allowChildren"),y(e,o,"inheritTypesFrom"),function(e,t){for(const o of e){const e=o.inheritAllFrom;e&&(t.allowContentOf.push(e),t.allowWhere.push(e),t.allowAttributesOf.push(e),t.inheritTypesFrom.push(e))}}(e,o),o}function g(e,t){const o=e[t];for(const i of o.allowChildren){const o=e[i];o&&o.allowIn.push(t)}o.allowChildren.length=0}function f(e,t){for(const o of e[t].allowContentOf)if(e[o]){j(e,o).forEach(e=>{e.allowIn.push(t)})}delete e[t].allowContentOf}function m(e,t){for(const o of e[t].allowWhere){const i=e[o];if(i){const o=i.allowIn;e[t].allowIn.push(...o)}}delete e[t].allowWhere}function k(e,t){for(const o of e[t].allowAttributesOf){const i=e[o];if(i){const o=i.allowAttributes;e[t].allowAttributes.push(...o)}}delete e[t].allowAttributesOf}function b(e,t){const o=e[t];for(const t of o.inheritTypesFrom){const i=e[t];if(i){const e=Object.keys(i).filter(e=>e.startsWith("is"));for(const t of e)t in o||(o[t]=i[t])}}delete o.inheritTypesFrom}function _(e,t){const o=e[t],i=o.allowIn.filter(t=>e[t]);o.allowIn=Array.from(new Set(i))}function w(e,t){const o=e[t];for(const i of o.allowIn){e[i].allowChildren.push(t)}}function v(e,t){const o=e[t];o.allowAttributes=Array.from(new Set(o.allowAttributes))}function y(e,t,o){for(const i of e)"string"==typeof i[o]?t[o].push(i[o]):Array.isArray(i[o])&&t[o].push(...i[o])}function j(e,t){const o=e[t];return(i=e,Object.keys(i).map(e=>i[e])).filter(e=>e.allowIn.includes(o.name));var i}function x(e){return"string"==typeof e||e.is("documentFragment")?{name:"string"==typeof e?e:"$documentFragment",*getAttributeKeys(){},getAttribute(){}}:{name:e.is("element")?e.name:"$text",*getAttributeKeys(){yield*e.getAttributeKeys()},getAttribute:t=>e.getAttribute(t)}}function P(e,t,o){for(const i of t.getAttributeKeys())e.checkAttribute(t,i)||o.removeAttribute(i,t)}},"./packages/ckeditor5-engine/src/model/selection.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return d}));var i=o("./packages/ckeditor5-engine/src/model/position.js"),r=o("./packages/ckeditor5-engine/src/model/node.js"),s=o("./packages/ckeditor5-engine/src/model/range.js"),n=o("./packages/ckeditor5-utils/src/emittermixin.js"),a=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),c=o("./packages/ckeditor5-utils/src/mix.js"),l=o("./packages/ckeditor5-utils/src/isiterable.js");class d{constructor(e,t,o){this._lastRangeBackward=!1,this._ranges=[],this._attrs=new Map,e&&this.setTo(e,t,o)}get anchor(){if(this._ranges.length>0){const e=this._ranges[this._ranges.length-1];return this._lastRangeBackward?e.end:e.start}return null}get focus(){if(this._ranges.length>0){const e=this._ranges[this._ranges.length-1];return this._lastRangeBackward?e.start:e.end}return null}get isCollapsed(){return 1===this._ranges.length&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}isEqual(e){if(this.rangeCount!=e.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(e.anchor)||!this.focus.isEqual(e.focus))return!1;for(const t of this._ranges){let o=!1;for(const i of e._ranges)if(t.isEqual(i)){o=!0;break}if(!o)return!1}return!0}*getRanges(){for(const e of this._ranges)yield new s.a(e.start,e.end)}getFirstRange(){let e=null;for(const t of this._ranges)e&&!t.start.isBefore(e.start)||(e=t);return e?new s.a(e.start,e.end):null}getLastRange(){let e=null;for(const t of this._ranges)e&&!t.end.isAfter(e.end)||(e=t);return e?new s.a(e.start,e.end):null}getFirstPosition(){const e=this.getFirstRange();return e?e.start.clone():null}getLastPosition(){const e=this.getLastRange();return e?e.end.clone():null}setTo(e,t,o){if(null===e)this._setRanges([]);else if(e instanceof d)this._setRanges(e.getRanges(),e.isBackward);else if(e&&"function"==typeof e.getRanges)this._setRanges(e.getRanges(),e.isBackward);else if(e instanceof s.a)this._setRanges([e],!!t&&!!t.backward);else if(e instanceof i.a)this._setRanges([new s.a(e)]);else if(e instanceof r.a){const r=!!o&&!!o.backward;let n;if("in"==t)n=s.a._createIn(e);else if("on"==t)n=s.a._createOn(e);else{if(void 0===t)throw new a.a("model-selection-setto-required-second-parameter",[this,e]);n=new s.a(i.a._createAt(e,t))}this._setRanges([n],r)}else{if(!Object(l.a)(e))throw new a.a("model-selection-setto-not-selectable",[this,e]);this._setRanges(e,t&&!!t.backward)}}_setRanges(e,t=!1){const o=(e=Array.from(e)).some(t=>{if(!(t instanceof s.a))throw new a.a("model-selection-set-ranges-not-range",[this,e]);return this._ranges.every(e=>!e.isEqual(t))});if(e.length!==this._ranges.length||o){this._removeAllRanges();for(const t of e)this._pushRange(t);this._lastRangeBackward=!!t,this.fire("change:range",{directChange:!0})}}setFocus(e,t){if(null===this.anchor)throw new a.a("model-selection-setfocus-no-ranges",[this,e]);const o=i.a._createAt(e,t);if("same"==o.compareWith(this.focus))return;const r=this.anchor;this._ranges.length&&this._popRange(),"before"==o.compareWith(r)?(this._pushRange(new s.a(o,r)),this._lastRangeBackward=!0):(this._pushRange(new s.a(r,o)),this._lastRangeBackward=!1),this.fire("change:range",{directChange:!0})}getAttribute(e){return this._attrs.get(e)}getAttributes(){return this._attrs.entries()}getAttributeKeys(){return this._attrs.keys()}hasAttribute(e){return this._attrs.has(e)}removeAttribute(e){this.hasAttribute(e)&&(this._attrs.delete(e),this.fire("change:attribute",{attributeKeys:[e],directChange:!0}))}setAttribute(e,t){this.getAttribute(e)!==t&&(this._attrs.set(e,t),this.fire("change:attribute",{attributeKeys:[e],directChange:!0}))}getSelectedElement(){return 1!==this.rangeCount?null:this.getFirstRange().getContainedElement()}is(e){return"selection"===e||"model:selection"===e}*getSelectedBlocks(){const e=new WeakSet;for(const t of this.getRanges()){const o=p(t.start,e);o&&g(o,t)&&(yield o);for(const o of t.getWalker()){const i=o.item;"elementEnd"==o.type&&h(i,e,t)&&(yield i)}const r=p(t.end,e);r&&!t.end.isTouching(i.a._createAt(r,0))&&g(r,t)&&(yield r)}}containsEntireContent(e=this.anchor.root){const t=i.a._createAt(e,0),o=i.a._createAt(e,"end");return t.isTouching(this.getFirstPosition())&&o.isTouching(this.getLastPosition())}_pushRange(e){this._checkRange(e),this._ranges.push(new s.a(e.start,e.end))}_checkRange(e){for(let t=0;t<this._ranges.length;t++)if(e.isIntersecting(this._ranges[t]))throw new a.a("model-selection-range-intersects",[this,e],{addedRange:e,intersectingRange:this._ranges[t]})}_removeAllRanges(){for(;this._ranges.length>0;)this._popRange()}_popRange(){this._ranges.pop()}}function u(e,t){return!t.has(e)&&(t.add(e),e.root.document.model.schema.isBlock(e)&&e.parent)}function h(e,t,o){return u(e,t)&&g(e,o)}function p(e,t){const o=e.parent.root.document.model.schema,i=e.parent.getAncestors({parentFirst:!0,includeSelf:!0});let r=!1;const s=i.find(e=>!r&&(r=o.isLimit(e),!r&&u(e,t)));return i.forEach(e=>t.add(e)),s}function g(e,t){const o=function(e){const t=e.root.document.model.schema;let o=e.parent;for(;o;){if(t.isBlock(o))return o;o=o.parent}}(e);if(!o)return!0;return!t.containsRange(s.a._createOn(o),!0)}Object(c.a)(d,n.c)},"./packages/ckeditor5-engine/src/model/text.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-engine/src/model/node.js");class r extends i.a{constructor(e,t){super(t),this._data=e||""}get offsetSize(){return this.data.length}get data(){return this._data}is(e){return"$text"===e||"model:$text"===e||"text"===e||"model:text"===e||"node"===e||"model:node"===e}toJSON(){const e=super.toJSON();return e.data=this.data,e}_clone(){return new r(this.data,this.getAttributes())}static fromJSON(e){return new r(e.data,e.attributes)}}},"./packages/ckeditor5-engine/src/model/textproxy.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class r{constructor(e,t,o){if(this.textNode=e,t<0||t>e.offsetSize)throw new i.a("model-textproxy-wrong-offsetintext",this);if(o<0||t+o>e.offsetSize)throw new i.a("model-textproxy-wrong-length",this);this.data=e.data.substring(t,t+o),this.offsetInText=t}get startOffset(){return null!==this.textNode.startOffset?this.textNode.startOffset+this.offsetInText:null}get offsetSize(){return this.data.length}get endOffset(){return null!==this.startOffset?this.startOffset+this.offsetSize:null}get isPartial(){return this.offsetSize!==this.textNode.offsetSize}get parent(){return this.textNode.parent}get root(){return this.textNode.root}is(e){return"$textProxy"===e||"model:$textProxy"===e||"textProxy"===e||"model:textProxy"===e}getPath(){const e=this.textNode.getPath();return e.length>0&&(e[e.length-1]+=this.offsetInText),e}getAncestors(e={includeSelf:!1,parentFirst:!1}){const t=[];let o=e.includeSelf?this:this.parent;for(;o;)t[e.parentFirst?"push":"unshift"](o),o=o.parent;return t}hasAttribute(e){return this.textNode.hasAttribute(e)}getAttribute(e){return this.textNode.getAttribute(e)}getAttributes(){return this.textNode.getAttributes()}getAttributeKeys(){return this.textNode.getAttributeKeys()}}},"./packages/ckeditor5-engine/src/model/treewalker.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-engine/src/model/text.js"),r=o("./packages/ckeditor5-engine/src/model/textproxy.js"),s=o("./packages/ckeditor5-engine/src/model/element.js"),n=o("./packages/ckeditor5-engine/src/model/position.js"),a=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class c{constructor(e={}){if(!e.boundaries&&!e.startPosition)throw new a.a("model-tree-walker-no-start-position",null);const t=e.direction||"forward";if("forward"!=t&&"backward"!=t)throw new a.a("model-tree-walker-unknown-direction",e,{direction:t});this.direction=t,this.boundaries=e.boundaries||null,e.startPosition?this.position=e.startPosition.clone():this.position=n.a._createAt(this.boundaries["backward"==this.direction?"end":"start"]),this.position.stickiness="toNone",this.singleCharacters=!!e.singleCharacters,this.shallow=!!e.shallow,this.ignoreElementEnd=!!e.ignoreElementEnd,this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null,this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null,this._visitedParent=this.position.parent}[Symbol.iterator](){return this}skip(e){let t,o,i,r;do{i=this.position,r=this._visitedParent,({done:t,value:o}=this.next())}while(!t&&e(o));t||(this.position=i,this._visitedParent=r)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){const e=this.position,t=this.position.clone(),o=this._visitedParent;if(null===o.parent&&t.offset===o.maxOffset)return{done:!0};if(o===this._boundaryEndParent&&t.offset==this.boundaries.end.offset)return{done:!0};const a=t.parent,c=Object(n.d)(t,a),d=c||Object(n.b)(t,a,c);if(d instanceof s.a)return this.shallow?t.offset++:(t.path.push(0),this._visitedParent=d),this.position=t,l("elementStart",d,e,t,1);if(d instanceof i.a){let i;if(this.singleCharacters)i=1;else{let e=d.endOffset;this._boundaryEndParent==o&&this.boundaries.end.offset<e&&(e=this.boundaries.end.offset),i=e-t.offset}const s=t.offset-d.startOffset,n=new r.a(d,s,i);return t.offset+=i,this.position=t,l("text",n,e,t,i)}return t.path.pop(),t.offset++,this.position=t,this._visitedParent=o.parent,this.ignoreElementEnd?this._next():l("elementEnd",o,e,t)}_previous(){const e=this.position,t=this.position.clone(),o=this._visitedParent;if(null===o.parent&&0===t.offset)return{done:!0};if(o==this._boundaryStartParent&&t.offset==this.boundaries.start.offset)return{done:!0};const a=t.parent,c=Object(n.d)(t,a),d=c||Object(n.c)(t,a,c);if(d instanceof s.a)return t.offset--,this.shallow?(this.position=t,l("elementStart",d,e,t,1)):(t.path.push(d.maxOffset),this.position=t,this._visitedParent=d,this.ignoreElementEnd?this._previous():l("elementEnd",d,e,t));if(d instanceof i.a){let i;if(this.singleCharacters)i=1;else{let e=d.startOffset;this._boundaryStartParent==o&&this.boundaries.start.offset>e&&(e=this.boundaries.start.offset),i=t.offset-e}const s=t.offset-d.startOffset,n=new r.a(d,s-i,i);return t.offset-=i,this.position=t,l("text",n,e,t,i)}return t.path.pop(),this.position=t,this._visitedParent=o.parent,l("elementStart",o,e,t,1)}}function l(e,t,o,i,r){return{done:!1,value:{type:e,item:t,previousPosition:o,nextPosition:i,length:r}}}},"./packages/ckeditor5-engine/src/model/utils/autoparagraphing.js":function(e,t,o){"use strict";function i(e){const{schema:t,document:o}=e.model;for(const i of o.getRootNames()){const r=o.getRoot(i);if(r.isEmpty&&!t.checkChild(r,"$text")&&t.checkChild(r,"paragraph"))return e.insertElement("paragraph",r),!0}return!1}function r(e,t,o){const i=o.createContext(e);return!!o.checkChild(i,"paragraph")&&!!o.checkChild(i.push("paragraph"),t)}function s(e,t){const o=t.createElement("paragraph");return t.insert(o,e),t.createPositionAt(o,0)}o.d(t,"a",(function(){return i})),o.d(t,"b",(function(){return r})),o.d(t,"c",(function(){return s}))},"./packages/ckeditor5-engine/src/view/attributeelement.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-engine/src/view/element.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class s extends i.a{constructor(e,t,o,i){super(e,t,o,i),this.getFillerOffset=n,this._priority=10,this._id=null,this._clonesGroup=null}get priority(){return this._priority}get id(){return this._id}getElementsWithSameId(){if(null===this.id)throw new r.a("attribute-element-get-elements-with-same-id-no-id",this);return new Set(this._clonesGroup)}is(e,t=null){return t?t===this.name&&("attributeElement"===e||"view:attributeElement"===e||"element"===e||"view:element"===e):"attributeElement"===e||"view:attributeElement"===e||"element"===e||"view:element"===e||"node"===e||"view:node"===e}isSimilar(e){return null!==this.id||null!==e.id?this.id===e.id:super.isSimilar(e)&&this.priority==e.priority}_clone(e){const t=super._clone(e);return t._priority=this._priority,t._id=this._id,t}}function n(){if(a(this))return null;let e=this.parent;for(;e&&e.is("attributeElement");){if(a(e)>1)return null;e=e.parent}return!e||a(e)>1?null:this.childCount}function a(e){return Array.from(e.getChildren()).filter(e=>!e.is("uiElement")).length}s.DEFAULT_PRIORITY=10},"./packages/ckeditor5-engine/src/view/containerelement.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r})),o.d(t,"b",(function(){return s}));var i=o("./packages/ckeditor5-engine/src/view/element.js");class r extends i.a{constructor(e,t,o,i){super(e,t,o,i),this.getFillerOffset=s}is(e,t=null){return t?t===this.name&&("containerElement"===e||"view:containerElement"===e||"element"===e||"view:element"===e):"containerElement"===e||"view:containerElement"===e||"element"===e||"view:element"===e||"node"===e||"view:node"===e}}function s(){const e=[...this.getChildren()],t=e[this.childCount-1];if(t&&t.is("element","br"))return this.childCount;for(const t of e)if(!t.is("uiElement"))return null;return this.childCount}},"./packages/ckeditor5-engine/src/view/document.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return b}));var i=o("./packages/ckeditor5-engine/src/view/documentselection.js"),r=o("./packages/ckeditor5-utils/src/collection.js"),s=o("./packages/ckeditor5-utils/src/mix.js"),n=o("./packages/ckeditor5-utils/src/eventinfo.js"),a=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),c=o("./packages/ckeditor5-utils/src/emittermixin.js"),l=o("./packages/ckeditor5-utils/src/toarray.js"),d=o("./packages/ckeditor5-engine/src/view/observer/bubblingeventinfo.js");const u=Symbol("bubbling contexts");var h={fire(e,...t){try{const o=e instanceof n.a?e:new n.a(this,e),i=m(this);if(!i.size)return;if(p(o,"capturing",this),g(i,"$capture",o,...t))return o.return;const r=o.startRange||this.selection.getFirstRange(),s=r?r.getContainedElement():null,a=!!s&&Boolean(f(i,s));let c=s||function(e){if(!e)return null;const t=e.start.parent,o=e.end.parent,i=t.getPath(),r=o.getPath();return i.length>r.length?t:o}(r);if(p(o,"atTarget",c),!a){if(g(i,"$text",o,...t))return o.return;p(o,"bubbling",c)}for(;c;){if(c.is("rootElement")){if(g(i,"$root",o,...t))return o.return}else if(c.is("element")&&g(i,c.name,o,...t))return o.return;if(g(i,c,o,...t))return o.return;c=c.parent,p(o,"bubbling",c)}return p(o,"bubbling",this),g(i,"$document",o,...t),o.return}catch(e){a.a.rethrowUnexpectedError(e,this)}},_addEventListener(e,t,o){const i=Object(l.a)(o.context||"$document"),r=m(this);for(const s of i){let i=r.get(s);i||(i=Object.create(c.c),r.set(s,i)),this.listenTo(i,e,t,o)}},_removeEventListener(e,t){const o=m(this);for(const i of o.values())this.stopListening(i,e,t)}};function p(e,t,o){e instanceof d.a&&(e._eventPhase=t,e._currentTarget=o)}function g(e,t,o,...i){const r="string"==typeof t?e.get(t):f(e,t);return!!r&&(r.fire(o,...i),o.stop.called)}function f(e,t){for(const[o,i]of e)if("function"==typeof o&&o(t))return i;return null}function m(e){return e[u]||(e[u]=new Map),e[u]}var k=o("./packages/ckeditor5-utils/src/observablemixin.js");class b{constructor(e){this.selection=new i.a,this.roots=new r.a({idProperty:"rootName"}),this.stylesProcessor=e,this.set("isReadOnly",!1),this.set("isFocused",!1),this.set("isComposing",!1),this._postFixers=new Set}getRoot(e="main"){return this.roots.get(e)}registerPostFixer(e){this._postFixers.add(e)}destroy(){this.roots.map(e=>e.destroy()),this.stopListening()}_callPostFixers(e){let t=!1;do{for(const o of this._postFixers)if(t=o(e),t)break}while(t)}}Object(s.a)(b,h),Object(s.a)(b,k.a)},"./packages/ckeditor5-engine/src/view/documentfragment.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-engine/src/view/text.js"),r=o("./packages/ckeditor5-engine/src/view/textproxy.js"),s=o("./packages/ckeditor5-utils/src/mix.js"),n=o("./packages/ckeditor5-utils/src/isiterable.js"),a=o("./packages/ckeditor5-utils/src/emittermixin.js");class c{constructor(e,t){this.document=e,this._children=[],t&&this._insertChild(0,t)}[Symbol.iterator](){return this._children[Symbol.iterator]()}get childCount(){return this._children.length}get isEmpty(){return 0===this.childCount}get root(){return this}get parent(){return null}is(e){return"documentFragment"===e||"view:documentFragment"===e}_appendChild(e){return this._insertChild(this.childCount,e)}getChild(e){return this._children[e]}getChildIndex(e){return this._children.indexOf(e)}getChildren(){return this._children[Symbol.iterator]()}_insertChild(e,t){this._fireChange("children",this);let o=0;const s=function(e,t){if("string"==typeof t)return[new i.a(e,t)];Object(n.a)(t)||(t=[t]);return Array.from(t).map(t=>"string"==typeof t?new i.a(e,t):t instanceof r.a?new i.a(e,t.data):t)}(this.document,t);for(const t of s)null!==t.parent&&t._remove(),t.parent=this,this._children.splice(e,0,t),e++,o++;return o}_removeChildren(e,t=1){this._fireChange("children",this);for(let o=e;o<e+t;o++)this._children[o].parent=null;return this._children.splice(e,t)}_fireChange(e,t){this.fire("change:"+e,t)}}Object(s.a)(c,a.c)},"./packages/ckeditor5-engine/src/view/documentselection.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return n}));var i=o("./packages/ckeditor5-engine/src/view/selection.js"),r=o("./packages/ckeditor5-utils/src/mix.js"),s=o("./packages/ckeditor5-utils/src/emittermixin.js");class n{constructor(e=null,t,o){this._selection=new i.a,this._selection.delegate("change").to(this),this._selection.setTo(e,t,o)}get isFake(){return this._selection.isFake}get fakeSelectionLabel(){return this._selection.fakeSelectionLabel}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get isCollapsed(){return this._selection.isCollapsed}get rangeCount(){return this._selection.rangeCount}get isBackward(){return this._selection.isBackward}get editableElement(){return this._selection.editableElement}get _ranges(){return this._selection._ranges}*getRanges(){yield*this._selection.getRanges()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getSelectedElement(){return this._selection.getSelectedElement()}isEqual(e){return this._selection.isEqual(e)}isSimilar(e){return this._selection.isSimilar(e)}is(e){return"selection"===e||"documentSelection"==e||"view:selection"==e||"view:documentSelection"==e}_setTo(e,t,o){this._selection.setTo(e,t,o)}_setFocus(e,t){this._selection.setFocus(e,t)}}Object(r.a)(n,s.c)},"./packages/ckeditor5-engine/src/view/domconverter.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return w}));var i=o("./packages/ckeditor5-engine/src/view/text.js"),r=o("./packages/ckeditor5-engine/src/view/element.js"),s=o("./packages/ckeditor5-engine/src/view/uielement.js"),n=o("./packages/ckeditor5-engine/src/view/position.js"),a=o("./packages/ckeditor5-engine/src/view/range.js"),c=o("./packages/ckeditor5-engine/src/view/selection.js"),l=o("./packages/ckeditor5-engine/src/view/documentfragment.js"),d=o("./packages/ckeditor5-engine/src/view/treewalker.js"),u=o("./packages/ckeditor5-engine/src/view/matcher.js"),h=o("./packages/ckeditor5-engine/src/view/filler.js"),p=o("./packages/ckeditor5-utils/src/dom/global.js");function g(e){let t=0;for(;e.previousSibling;)e=e.previousSibling,t++;return t}function f(e){const t=[];for(;e&&e.nodeType!=Node.DOCUMENT_NODE;)t.unshift(e),e=e.parentNode;return t}var m=o("./packages/ckeditor5-utils/src/dom/istext.js");const k=Object(h.a)(document),b=Object(h.e)(document),_=Object(h.d)(document);class w{constructor(e,t={}){this.document=e,this.blockFillerMode=t.blockFillerMode||"br",this.preElements=["pre"],this.blockElements=["address","article","aside","blockquote","caption","center","dd","details","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","legend","li","main","menu","nav","ol","p","pre","section","summary","table","tbody","td","tfoot","th","thead","tr","ul"],this.inlineObjectElements=["object","iframe","input","button","textarea","select","option","video","embed","audio","img","canvas"],this._domToViewMapping=new WeakMap,this._viewToDomMapping=new WeakMap,this._fakeSelectionMapping=new WeakMap,this._rawContentElementMatcher=new u.a,this._encounteredRawContentDomNodes=new WeakSet}bindFakeSelection(e,t){this._fakeSelectionMapping.set(e,new c.a(t))}fakeSelectionToView(e){return this._fakeSelectionMapping.get(e)}bindElements(e,t){this._domToViewMapping.set(e,t),this._viewToDomMapping.set(t,e)}unbindDomElement(e){const t=this._domToViewMapping.get(e);if(t){this._domToViewMapping.delete(e),this._viewToDomMapping.delete(t);for(const t of e.childNodes)this.unbindDomElement(t)}}bindDocumentFragments(e,t){this._domToViewMapping.set(e,t),this._viewToDomMapping.set(t,e)}viewToDom(e,t,o={}){if(e.is("$text")){const o=this._processDataFromViewText(e);return t.createTextNode(o)}{if(this.mapViewToDom(e))return this.mapViewToDom(e);let i;if(e.is("documentFragment"))i=t.createDocumentFragment(),o.bind&&this.bindDocumentFragments(i,e);else{if(e.is("uiElement"))return i="$comment"===e.name?t.createComment(e.getCustomProperty("$rawContent")):e.render(t),o.bind&&this.bindElements(i,e),i;i=e.hasAttribute("xmlns")?t.createElementNS(e.getAttribute("xmlns"),e.name):t.createElement(e.name),e.is("rawElement")&&e.render(i),o.bind&&this.bindElements(i,e);for(const t of e.getAttributeKeys())i.setAttribute(t,e.getAttribute(t))}if(!1!==o.withChildren)for(const r of this.viewChildrenToDom(e,t,o))i.appendChild(r);return i}}*viewChildrenToDom(e,t,o={}){const i=e.getFillerOffset&&e.getFillerOffset();let r=0;for(const s of e.getChildren())i===r&&(yield this._getBlockFiller(t)),yield this.viewToDom(s,t,o),r++;i===r&&(yield this._getBlockFiller(t))}viewRangeToDom(e){const t=this.viewPositionToDom(e.start),o=this.viewPositionToDom(e.end),i=document.createRange();return i.setStart(t.parent,t.offset),i.setEnd(o.parent,o.offset),i}viewPositionToDom(e){const t=e.parent;if(t.is("$text")){const o=this.findCorrespondingDomText(t);if(!o)return null;let i=e.offset;return Object(h.i)(o)&&(i+=h.c),{parent:o,offset:i}}{let o,i,r;if(0===e.offset){if(o=this.mapViewToDom(t),!o)return null;r=o.childNodes[0]}else{const t=e.nodeBefore;if(i=t.is("$text")?this.findCorrespondingDomText(t):this.mapViewToDom(e.nodeBefore),!i)return null;o=i.parentNode,r=i.nextSibling}if(Object(m.a)(r)&&Object(h.i)(r))return{parent:r,offset:h.c};return{parent:o,offset:i?g(i)+1:0}}}domToView(e,t={}){if(this.isBlockFiller(e))return null;const o=this.getHostViewElement(e);if(o)return o;if(this.isComment(e)&&t.skipComments)return null;if(Object(m.a)(e)){if(Object(h.h)(e))return null;{const t=this._processDataFromDomText(e);return""===t?null:new i.a(this.document,t)}}{if(this.mapDomToView(e))return this.mapDomToView(e);let o;if(this.isDocumentFragment(e))o=new l.a(this.document),t.bind&&this.bindDocumentFragments(e,o);else{o=this._createViewElement(e,t),t.bind&&this.bindElements(e,o);const i=e.attributes;if(i)for(let e=i.length-1;e>=0;e--)o._setAttribute(i[e].name,i[e].value);if(this._isViewElementWithRawContent(o,t)||this.isComment(e)){const t=this.isComment(e)?e.data:e.innerHTML;return o._setCustomProperty("$rawContent",t),this._encounteredRawContentDomNodes.add(e),o}}if(!1!==t.withChildren)for(const i of this.domChildrenToView(e,t))o._appendChild(i);return o}}*domChildrenToView(e,t={}){for(let o=0;o<e.childNodes.length;o++){const i=e.childNodes[o],r=this.domToView(i,t);null!==r&&(yield r)}}domSelectionToView(e){if(1===e.rangeCount){let t=e.getRangeAt(0).startContainer;Object(m.a)(t)&&(t=t.parentNode);const o=this.fakeSelectionToView(t);if(o)return o}const t=this.isDomSelectionBackward(e),o=[];for(let t=0;t<e.rangeCount;t++){const i=e.getRangeAt(t),r=this.domRangeToView(i);r&&o.push(r)}return new c.a(o,{backward:t})}domRangeToView(e){const t=this.domPositionToView(e.startContainer,e.startOffset),o=this.domPositionToView(e.endContainer,e.endOffset);return t&&o?new a.a(t,o):null}domPositionToView(e,t){if(this.isBlockFiller(e))return this.domPositionToView(e.parentNode,g(e));const o=this.mapDomToView(e);if(o&&(o.is("uiElement")||o.is("rawElement")))return n.a._createBefore(o);if(Object(m.a)(e)){if(Object(h.h)(e))return this.domPositionToView(e.parentNode,g(e));const o=this.findCorrespondingViewText(e);let i=t;return o?(Object(h.i)(e)&&(i-=h.c,i=i<0?0:i),new n.a(o,i)):null}if(0===t){const t=this.mapDomToView(e);if(t)return new n.a(t,0)}else{const o=e.childNodes[t-1],i=Object(m.a)(o)?this.findCorrespondingViewText(o):this.mapDomToView(o);if(i&&i.parent)return new n.a(i.parent,i.index+1)}return null}mapDomToView(e){return this.getHostViewElement(e)||this._domToViewMapping.get(e)}findCorrespondingViewText(e){if(Object(h.h)(e))return null;const t=this.getHostViewElement(e);if(t)return t;const o=e.previousSibling;if(o){if(!this.isElement(o))return null;const e=this.mapDomToView(o);if(e){return e.nextSibling instanceof i.a?e.nextSibling:null}}else{const t=this.mapDomToView(e.parentNode);if(t){const e=t.getChild(0);return e instanceof i.a?e:null}}return null}mapViewToDom(e){return this._viewToDomMapping.get(e)}findCorrespondingDomText(e){const t=e.previousSibling;return t&&this.mapViewToDom(t)?this.mapViewToDom(t).nextSibling:!t&&e.parent&&this.mapViewToDom(e.parent)?this.mapViewToDom(e.parent).childNodes[0]:null}focus(e){const t=this.mapViewToDom(e);if(t&&t.ownerDocument.activeElement!==t){const{scrollX:e,scrollY:o}=p.a.window,i=[];v(t,e=>{const{scrollLeft:t,scrollTop:o}=e;i.push([t,o])}),t.focus(),v(t,e=>{const[t,o]=i.shift();e.scrollLeft=t,e.scrollTop=o}),p.a.window.scrollTo(e,o)}}isElement(e){return e&&e.nodeType==Node.ELEMENT_NODE}isDocumentFragment(e){return e&&e.nodeType==Node.DOCUMENT_FRAGMENT_NODE}isComment(e){return e&&e.nodeType==Node.COMMENT_NODE}isBlockFiller(e){return"br"==this.blockFillerMode?e.isEqualNode(k):!("BR"!==e.tagName||!y(e,this.blockElements)||1!==e.parentNode.childNodes.length)||(e.isEqualNode(_)||function(e,t){return e.isEqualNode(b)&&y(e,t)&&1===e.parentNode.childNodes.length}(e,this.blockElements))}isDomSelectionBackward(e){if(e.isCollapsed)return!1;const t=document.createRange();t.setStart(e.anchorNode,e.anchorOffset),t.setEnd(e.focusNode,e.focusOffset);const o=t.collapsed;return t.detach(),o}getHostViewElement(e){const t=f(e);for(t.pop();t.length;){const e=t.pop(),o=this._domToViewMapping.get(e);if(o&&(o.is("uiElement")||o.is("rawElement")))return o}return null}isDomSelectionCorrect(e){return this._isDomSelectionPositionCorrect(e.anchorNode,e.anchorOffset)&&this._isDomSelectionPositionCorrect(e.focusNode,e.focusOffset)}registerRawContentMatcher(e){this._rawContentElementMatcher.add(e)}_getBlockFiller(e){switch(this.blockFillerMode){case"nbsp":return Object(h.e)(e);case"markedNbsp":return Object(h.d)(e);case"br":return Object(h.a)(e)}}_isDomSelectionPositionCorrect(e,t){if(Object(m.a)(e)&&Object(h.i)(e)&&t<h.c)return!1;if(this.isElement(e)&&Object(h.i)(e.childNodes[t]))return!1;const o=this.mapDomToView(e);return!o||!o.is("uiElement")&&!o.is("rawElement")}_processDataFromViewText(e){let t=e.data;if(e.getAncestors().some(e=>this.preElements.includes(e.name)))return t;if(" "==t.charAt(0)){const o=this._getTouchingInlineViewNode(e,!1);!(o&&o.is("$textProxy")&&this._nodeEndsWithSpace(o))&&o||(t=" "+t.substr(1))}if(" "==t.charAt(t.length-1)){const o=this._getTouchingInlineViewNode(e,!0),i=o&&o.is("$textProxy")&&" "==o.data.charAt(0);" "!=t.charAt(t.length-2)&&o&&!i||(t=t.substr(0,t.length-1)+" ")}return t.replace(/ {2}/g,"  ")}_nodeEndsWithSpace(e){if(e.getAncestors().some(e=>this.preElements.includes(e.name)))return!1;const t=this._processDataFromViewText(e);return" "==t.charAt(t.length-1)}_processDataFromDomText(e){let t=e.data;if(function(e,t){return f(e).some(e=>e.tagName&&t.includes(e.tagName.toLowerCase()))}(e,this.preElements))return Object(h.f)(e);t=t.replace(/[ \n\t\r]{1,}/g," ");const o=this._getTouchingInlineDomNode(e,!1),i=this._getTouchingInlineDomNode(e,!0),r=this._checkShouldLeftTrimDomText(e,o),s=this._checkShouldRightTrimDomText(e,i);r&&(t=t.replace(/^ /,"")),s&&(t=t.replace(/ $/,"")),t=Object(h.f)(new Text(t)),t=t.replace(/ \u00A0/g,"  ");const n=i&&this.isElement(i)&&"BR"!=i.tagName,a=i&&Object(m.a)(i)&&" "==i.data.charAt(0);return(/( |\u00A0)\u00A0$/.test(t)||!i||n||a)&&(t=t.replace(/\u00A0$/," ")),(r||o&&this.isElement(o)&&"BR"!=o.tagName)&&(t=t.replace(/^\u00A0/," ")),t}_checkShouldLeftTrimDomText(e,t){return!t||(this.isElement(t)?"BR"===t.tagName:!this._encounteredRawContentDomNodes.has(e.previousSibling)&&/[^\S\u00A0]/.test(t.data.charAt(t.data.length-1)))}_checkShouldRightTrimDomText(e,t){return!t&&!Object(h.i)(e)}_getTouchingInlineViewNode(e,t){const o=new d.a({startPosition:t?n.a._createAfter(e):n.a._createBefore(e),direction:t?"forward":"backward"});for(const e of o){if(e.item.is("element")&&this.inlineObjectElements.includes(e.item.name))return e.item;if(e.item.is("containerElement"))return null;if(e.item.is("element","br"))return null;if(e.item.is("$textProxy"))return e.item}return null}_getTouchingInlineDomNode(e,t){if(!e.parentNode)return null;const o=t?"firstChild":"lastChild",i=t?"nextSibling":"previousSibling";let r=!0;do{if(!r&&e[o]?e=e[o]:e[i]?(e=e[i],r=!1):(e=e.parentNode,r=!0),!e||this._isBlockElement(e))return null}while(!Object(m.a)(e)&&"BR"!=e.tagName&&!this._isInlineObjectElement(e));return e}_isBlockElement(e){return this.isElement(e)&&this.blockElements.includes(e.tagName.toLowerCase())}_isInlineObjectElement(e){return this.isElement(e)&&this.inlineObjectElements.includes(e.tagName.toLowerCase())}_createViewElement(e,t){if(this.isComment(e))return new s.a(this.document,"$comment");const o=t.keepOriginalCase?e.tagName:e.tagName.toLowerCase();return new r.a(this.document,o)}_isViewElementWithRawContent(e,t){return!1!==t.withChildren&&this._rawContentElementMatcher.match(e)}}function v(e,t){for(;e&&e!=p.a.document;)t(e),e=e.parentNode}function y(e,t){const o=e.parentNode;return o&&o.tagName&&t.includes(o.tagName.toLowerCase())}},"./packages/ckeditor5-engine/src/view/downcastwriter.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return v}));var i=o("./packages/ckeditor5-engine/src/view/position.js"),r=o("./packages/ckeditor5-engine/src/view/range.js"),s=o("./packages/ckeditor5-engine/src/view/selection.js"),n=o("./packages/ckeditor5-engine/src/view/containerelement.js"),a=o("./packages/ckeditor5-engine/src/view/attributeelement.js"),c=o("./packages/ckeditor5-engine/src/view/element.js"),l=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),d=o("./packages/ckeditor5-engine/src/view/node.js");class u extends c.a{constructor(e,t,o,i){super(e,t,o,i),this._isAllowedInsideAttributeElement=!0,this.getFillerOffset=h}is(e,t=null){return t?t===this.name&&("emptyElement"===e||"view:emptyElement"===e||"element"===e||"view:element"===e):"emptyElement"===e||"view:emptyElement"===e||"element"===e||"view:element"===e||"node"===e||"view:node"===e}_insertChild(e,t){if(t&&(t instanceof d.a||Array.from(t).length>0))throw new l.a("view-emptyelement-cannot-add",[this,t])}}function h(){return null}var p=o("./packages/ckeditor5-engine/src/view/uielement.js");class g extends c.a{constructor(e,t,o,i){super(e,t,o,i),this._isAllowedInsideAttributeElement=!0,this.getFillerOffset=f}is(e,t=null){return t?t===this.name&&("rawElement"===e||"view:rawElement"===e||"element"===e||"view:element"===e):"rawElement"===e||"view:rawElement"===e||e===this.name||e==="view:"+this.name||"element"===e||"view:element"===e||"node"===e||"view:node"===e}_insertChild(e,t){if(t&&(t instanceof d.a||Array.from(t).length>0))throw new l.a("view-rawelement-cannot-add",[this,t])}}function f(){return null}var m=o("./packages/ckeditor5-engine/src/view/documentfragment.js"),k=o("./packages/ckeditor5-utils/src/isiterable.js"),b=o("./packages/ckeditor5-engine/src/view/text.js"),_=o("./packages/ckeditor5-engine/src/view/editableelement.js"),w=o("./node_modules/lodash-es/isPlainObject.js");class v{constructor(e){this.document=e,this._cloneGroups=new Map}setSelection(e,t,o){this.document.selection._setTo(e,t,o)}setSelectionFocus(e,t){this.document.selection._setFocus(e,t)}createDocumentFragment(e){return new m.a(this.document,e)}createText(e){return new b.a(this.document,e)}createAttributeElement(e,t,o={}){const i=new a.a(this.document,e,t);return"number"==typeof o.priority&&(i._priority=o.priority),o.id&&(i._id=o.id),i}createContainerElement(e,t,o={}){const i=new n.a(this.document,e,t);return void 0!==o.isAllowedInsideAttributeElement&&(i._isAllowedInsideAttributeElement=o.isAllowedInsideAttributeElement),i}createEditableElement(e,t){const o=new _.a(this.document,e,t);return o._document=this.document,o}createEmptyElement(e,t,o={}){const i=new u(this.document,e,t);return void 0!==o.isAllowedInsideAttributeElement&&(i._isAllowedInsideAttributeElement=o.isAllowedInsideAttributeElement),i}createUIElement(e,t,o,i={}){const r=new p.a(this.document,e,t);return o&&(r.render=o),void 0!==i.isAllowedInsideAttributeElement&&(r._isAllowedInsideAttributeElement=i.isAllowedInsideAttributeElement),r}createRawElement(e,t,o,i={}){const r=new g(this.document,e,t);return r.render=o||(()=>{}),void 0!==i.isAllowedInsideAttributeElement&&(r._isAllowedInsideAttributeElement=i.isAllowedInsideAttributeElement),r}setAttribute(e,t,o){o._setAttribute(e,t)}removeAttribute(e,t){t._removeAttribute(e)}addClass(e,t){t._addClass(e)}removeClass(e,t){t._removeClass(e)}setStyle(e,t,o){Object(w.a)(e)&&void 0===o&&(o=t),o._setStyle(e,t)}removeStyle(e,t){t._removeStyle(e)}setCustomProperty(e,t,o){o._setCustomProperty(e,t)}removeCustomProperty(e,t){return t._removeCustomProperty(e)}breakAttributes(e){return e instanceof i.a?this._breakAttributes(e):this._breakAttributesRange(e)}breakContainer(e){const t=e.parent;if(!t.is("containerElement"))throw new l.a("view-writer-break-non-container-element",this.document);if(!t.parent)throw new l.a("view-writer-break-root",this.document);if(e.isAtStart)return i.a._createBefore(t);if(!e.isAtEnd){const o=t._clone(!1);this.insert(i.a._createAfter(t),o);const s=new r.a(e,i.a._createAt(t,"end")),n=new i.a(o,0);this.move(s,n)}return i.a._createAfter(t)}mergeAttributes(e){const t=e.offset,o=e.parent;if(o.is("$text"))return e;if(o.is("attributeElement")&&0===o.childCount){const e=o.parent,t=o.index;return o._remove(),this._removeFromClonedElementsGroup(o),this.mergeAttributes(new i.a(e,t))}const r=o.getChild(t-1),s=o.getChild(t);if(!r||!s)return e;if(r.is("$text")&&s.is("$text"))return O(r,s);if(r.is("attributeElement")&&s.is("attributeElement")&&r.isSimilar(s)){const e=r.childCount;return r._appendChild(s.getChildren()),s._remove(),this._removeFromClonedElementsGroup(s),this.mergeAttributes(new i.a(r,e))}return e}mergeContainers(e){const t=e.nodeBefore,o=e.nodeAfter;if(!(t&&o&&t.is("containerElement")&&o.is("containerElement")))throw new l.a("view-writer-merge-containers-invalid-position",this.document);const s=t.getChild(t.childCount-1),n=s instanceof b.a?i.a._createAt(s,"end"):i.a._createAt(t,"end");return this.move(r.a._createIn(o),i.a._createAt(t,"end")),this.remove(r.a._createOn(o)),n}insert(e,t){(function e(t,o){for(const i of t){if(!A.some(e=>i instanceof e))throw new l.a("view-writer-insert-invalid-node-type",o);i.is("$text")||e(i.getChildren(),o)}})(t=Object(k.a)(t)?[...t]:[t],this.document);const o=t.reduce((e,t)=>{const o=e[e.length-1],i=!(t.is("uiElement")&&t.isAllowedInsideAttributeElement);return o&&o.breakAttributes==i?o.nodes.push(t):e.push({breakAttributes:i,nodes:[t]}),e},[]);let i=null,s=e;for(const{nodes:e,breakAttributes:t}of o){const o=this._insertNodes(s,e,t);i||(i=o.start),s=o.end}return i?new r.a(i,s):new r.a(e)}remove(e){const t=e instanceof r.a?e:r.a._createOn(e);if(C(t,this.document),t.isCollapsed)return new m.a(this.document);const{start:o,end:i}=this._breakAttributesRange(t,!0),s=o.parent,n=i.offset-o.offset,a=s._removeChildren(o.offset,n);for(const e of a)this._removeFromClonedElementsGroup(e);const c=this.mergeAttributes(o);return t.start=c,t.end=c.clone(),new m.a(this.document,a)}clear(e,t){C(e,this.document);const o=e.getWalker({direction:"backward",ignoreElementEnd:!0});for(const i of o){const o=i.item;let s;if(o.is("element")&&t.isSimilar(o))s=r.a._createOn(o);else if(!i.nextPosition.isAfter(e.start)&&o.is("$textProxy")){const e=o.getAncestors().find(e=>e.is("element")&&t.isSimilar(e));e&&(s=r.a._createIn(e))}s&&(s.end.isAfter(e.end)&&(s.end=e.end),s.start.isBefore(e.start)&&(s.start=e.start),this.remove(s))}}move(e,t){let o;if(t.isAfter(e.end)){const i=(t=this._breakAttributes(t,!0)).parent,r=i.childCount;e=this._breakAttributesRange(e,!0),o=this.remove(e),t.offset+=i.childCount-r}else o=this.remove(e);return this.insert(t,o)}wrap(e,t){if(!(t instanceof a.a))throw new l.a("view-writer-wrap-invalid-attribute",this.document);if(C(e,this.document),e.isCollapsed){let i=e.start;i.parent.is("element")&&(o=i.parent,!Array.from(o.getChildren()).some(e=>!e.is("uiElement")))&&(i=i.getLastMatchingPosition(e=>e.item.is("uiElement"))),i=this._wrapPosition(i,t);const s=this.document.selection;return s.isCollapsed&&s.getFirstPosition().isEqual(e.start)&&this.setSelection(i),new r.a(i)}return this._wrapRange(e,t);var o}unwrap(e,t){if(!(t instanceof a.a))throw new l.a("view-writer-unwrap-invalid-attribute",this.document);if(C(e,this.document),e.isCollapsed)return e;const{start:o,end:i}=this._breakAttributesRange(e,!0),s=o.parent,n=this._unwrapChildren(s,o.offset,i.offset,t),c=this.mergeAttributes(n.start);c.isEqual(n.start)||n.end.offset--;const d=this.mergeAttributes(n.end);return new r.a(c,d)}rename(e,t){const o=new n.a(this.document,e,t.getAttributes());return this.insert(i.a._createAfter(t),o),this.move(r.a._createIn(t),i.a._createAt(o,0)),this.remove(r.a._createOn(t)),o}clearClonedElementsGroup(e){this._cloneGroups.delete(e)}createPositionAt(e,t){return i.a._createAt(e,t)}createPositionAfter(e){return i.a._createAfter(e)}createPositionBefore(e){return i.a._createBefore(e)}createRange(e,t){return new r.a(e,t)}createRangeOn(e){return r.a._createOn(e)}createRangeIn(e){return r.a._createIn(e)}createSelection(e,t,o){return new s.a(e,t,o)}_insertNodes(e,t,o){let i,s;if(i=o?y(e):e.parent.is("$text")?e.parent.parent:e.parent,!i)throw new l.a("view-writer-invalid-position-container",this.document);s=o?this._breakAttributes(e,!0):e.parent.is("$text")?P(e):e;const n=i._insertChild(s.offset,t);for(const e of t)this._addToClonedElementsGroup(e);const a=s.getShiftedBy(n),c=this.mergeAttributes(s);c.isEqual(s)||a.offset--;const d=this.mergeAttributes(a);return new r.a(c,d)}_wrapChildren(e,t,o,s){let n=t;const a=[];for(;n<o;){const t=e.getChild(n),o=t.is("$text"),r=t.is("attributeElement"),c=t.isAllowedInsideAttributeElement;if(r&&this._wrapAttributeElement(s,t))a.push(new i.a(e,n));else if(o||c||r&&j(s,t)){const o=s._clone();t._remove(),o._appendChild(t),e._insertChild(n,o),this._addToClonedElementsGroup(o),a.push(new i.a(e,n))}else r&&this._wrapChildren(t,0,t.childCount,s);n++}let c=0;for(const e of a){if(e.offset-=c,e.offset==t)continue;this.mergeAttributes(e).isEqual(e)||(c++,o--)}return r.a._createFromParentsAndOffsets(e,t,e,o)}_unwrapChildren(e,t,o,s){let n=t;const a=[];for(;n<o;){const t=e.getChild(n);if(t.is("attributeElement"))if(t.isSimilar(s)){const r=t.getChildren(),s=t.childCount;t._remove(),e._insertChild(n,r),this._removeFromClonedElementsGroup(t),a.push(new i.a(e,n),new i.a(e,n+s)),n+=s,o+=s-1}else this._unwrapAttributeElement(s,t)?(a.push(new i.a(e,n),new i.a(e,n+1)),n++):(this._unwrapChildren(t,0,t.childCount,s),n++);else n++}let c=0;for(const e of a){if(e.offset-=c,e.offset==t||e.offset==o)continue;this.mergeAttributes(e).isEqual(e)||(c++,o--)}return r.a._createFromParentsAndOffsets(e,t,e,o)}_wrapRange(e,t){const{start:o,end:i}=this._breakAttributesRange(e,!0),s=o.parent,n=this._wrapChildren(s,o.offset,i.offset,t),a=this.mergeAttributes(n.start);a.isEqual(n.start)||n.end.offset--;const c=this.mergeAttributes(n.end);return new r.a(a,c)}_wrapPosition(e,t){if(t.isSimilar(e.parent))return x(e.clone());e.parent.is("$text")&&(e=P(e));const o=this.createAttributeElement();o._priority=Number.POSITIVE_INFINITY,o.isSimilar=()=>!1,e.parent._insertChild(e.offset,o);const s=new r.a(e,e.getShiftedBy(1));this.wrap(s,t);const n=new i.a(o.parent,o.index);o._remove();const a=n.nodeBefore,c=n.nodeAfter;return a instanceof b.a&&c instanceof b.a?O(a,c):x(n)}_wrapAttributeElement(e,t){if(!E(e,t))return!1;if(e.name!==t.name||e.priority!==t.priority)return!1;for(const o of e.getAttributeKeys())if("class"!==o&&"style"!==o&&t.hasAttribute(o)&&t.getAttribute(o)!==e.getAttribute(o))return!1;for(const o of e.getStyleNames())if(t.hasStyle(o)&&t.getStyle(o)!==e.getStyle(o))return!1;for(const o of e.getAttributeKeys())"class"!==o&&"style"!==o&&(t.hasAttribute(o)||this.setAttribute(o,e.getAttribute(o),t));for(const o of e.getStyleNames())t.hasStyle(o)||this.setStyle(o,e.getStyle(o),t);for(const o of e.getClassNames())t.hasClass(o)||this.addClass(o,t);return!0}_unwrapAttributeElement(e,t){if(!E(e,t))return!1;if(e.name!==t.name||e.priority!==t.priority)return!1;for(const o of e.getAttributeKeys())if("class"!==o&&"style"!==o&&(!t.hasAttribute(o)||t.getAttribute(o)!==e.getAttribute(o)))return!1;if(!t.hasClass(...e.getClassNames()))return!1;for(const o of e.getStyleNames())if(!t.hasStyle(o)||t.getStyle(o)!==e.getStyle(o))return!1;for(const o of e.getAttributeKeys())"class"!==o&&"style"!==o&&this.removeAttribute(o,t);return this.removeClass(Array.from(e.getClassNames()),t),this.removeStyle(Array.from(e.getStyleNames()),t),!0}_breakAttributesRange(e,t=!1){const o=e.start,i=e.end;if(C(e,this.document),e.isCollapsed){const o=this._breakAttributes(e.start,t);return new r.a(o,o)}const s=this._breakAttributes(i,t),n=s.parent.childCount,a=this._breakAttributes(o,t);return s.offset+=s.parent.childCount-n,new r.a(a,s)}_breakAttributes(e,t=!1){const o=e.offset,r=e.parent;if(e.parent.is("emptyElement"))throw new l.a("view-writer-cannot-break-empty-element",this.document);if(e.parent.is("uiElement"))throw new l.a("view-writer-cannot-break-ui-element",this.document);if(e.parent.is("rawElement"))throw new l.a("view-writer-cannot-break-raw-element",this.document);if(!t&&r.is("$text")&&T(r.parent))return e.clone();if(T(r))return e.clone();if(r.is("$text"))return this._breakAttributes(P(e),t);if(o==r.childCount){const e=new i.a(r.parent,r.index+1);return this._breakAttributes(e,t)}if(0===o){const e=new i.a(r.parent,r.index);return this._breakAttributes(e,t)}{const e=r.index+1,s=r._clone();r.parent._insertChild(e,s),this._addToClonedElementsGroup(s);const n=r.childCount-o,a=r._removeChildren(o,n);s._appendChild(a);const c=new i.a(r.parent,e);return this._breakAttributes(c,t)}}_addToClonedElementsGroup(e){if(!e.root.is("rootElement"))return;if(e.is("element"))for(const t of e.getChildren())this._addToClonedElementsGroup(t);const t=e.id;if(!t)return;let o=this._cloneGroups.get(t);o||(o=new Set,this._cloneGroups.set(t,o)),o.add(e),e._clonesGroup=o}_removeFromClonedElementsGroup(e){if(e.is("element"))for(const t of e.getChildren())this._removeFromClonedElementsGroup(t);const t=e.id;if(!t)return;const o=this._cloneGroups.get(t);o&&o.delete(e)}}function y(e){let t=e.parent;for(;!T(t);){if(!t)return;t=t.parent}return t}function j(e,t){return e.priority<t.priority||!(e.priority>t.priority)&&e.getIdentity()<t.getIdentity()}function x(e){const t=e.nodeBefore;if(t&&t.is("$text"))return new i.a(t,t.data.length);const o=e.nodeAfter;return o&&o.is("$text")?new i.a(o,0):e}function P(e){if(e.offset==e.parent.data.length)return new i.a(e.parent.parent,e.parent.index+1);if(0===e.offset)return new i.a(e.parent.parent,e.parent.index);const t=e.parent.data.slice(e.offset);return e.parent._data=e.parent.data.slice(0,e.offset),e.parent.parent._insertChild(e.parent.index+1,new b.a(e.root.document,t)),new i.a(e.parent.parent,e.parent.index+1)}function O(e,t){const o=e.data.length;return e._data+=t.data,t._remove(),new i.a(e,o)}const A=[b.a,a.a,n.a,u,g,p.a];function T(e){return e&&(e.is("containerElement")||e.is("documentFragment"))}function C(e,t){const o=y(e.start),i=y(e.end);if(!o||!i||o!==i)throw new l.a("view-writer-invalid-range-container",t)}function E(e,t){return null===e.id&&null===t.id}},"./packages/ckeditor5-engine/src/view/editableelement.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return n}));var i=o("./packages/ckeditor5-engine/src/view/containerelement.js"),r=o("./packages/ckeditor5-utils/src/mix.js"),s=o("./packages/ckeditor5-utils/src/observablemixin.js");class n extends i.a{constructor(e,t,o,i){super(e,t,o,i),this.set("isReadOnly",!1),this.set("isFocused",!1),this.bind("isReadOnly").to(e),this.bind("isFocused").to(e,"isFocused",t=>t&&e.selection.editableElement==this),this.listenTo(e.selection,"change",()=>{this.isFocused=e.isFocused&&e.selection.editableElement==this})}is(e,t=null){return t?t===this.name&&("editableElement"===e||"view:editableElement"===e||"containerElement"===e||"view:containerElement"===e||"element"===e||"view:element"===e):"editableElement"===e||"view:editableElement"===e||"containerElement"===e||"view:containerElement"===e||"element"===e||"view:element"===e||"node"===e||"view:node"===e}destroy(){this.stopListening()}}Object(r.a)(n,s.a)},"./packages/ckeditor5-engine/src/view/element.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return u}));var i=o("./packages/ckeditor5-engine/src/view/node.js"),r=o("./packages/ckeditor5-engine/src/view/text.js"),s=o("./packages/ckeditor5-engine/src/view/textproxy.js"),n=o("./packages/ckeditor5-utils/src/tomap.js"),a=o("./packages/ckeditor5-utils/src/toarray.js"),c=o("./packages/ckeditor5-utils/src/isiterable.js"),l=o("./packages/ckeditor5-engine/src/view/matcher.js"),d=o("./packages/ckeditor5-engine/src/view/stylesmap.js");class u extends i.a{constructor(e,t,o,i){if(super(e),this.name=t,this._attrs=function(e){e=Object(n.a)(e);for(const[t,o]of e)null===o?e.delete(t):"string"!=typeof o&&e.set(t,String(o));return e}(o),this._children=[],i&&this._insertChild(0,i),this._classes=new Set,this._attrs.has("class")){const e=this._attrs.get("class");h(this._classes,e),this._attrs.delete("class")}this._styles=new d.b(this.document.stylesProcessor),this._attrs.has("style")&&(this._styles.setTo(this._attrs.get("style")),this._attrs.delete("style")),this._customProperties=new Map,this._isAllowedInsideAttributeElement=!1}get childCount(){return this._children.length}get isEmpty(){return 0===this._children.length}get isAllowedInsideAttributeElement(){return this._isAllowedInsideAttributeElement}is(e,t=null){return t?t===this.name&&("element"===e||"view:element"===e):"element"===e||"view:element"===e||"node"===e||"view:node"===e}getChild(e){return this._children[e]}getChildIndex(e){return this._children.indexOf(e)}getChildren(){return this._children[Symbol.iterator]()}*getAttributeKeys(){this._classes.size>0&&(yield"class"),this._styles.isEmpty||(yield"style"),yield*this._attrs.keys()}*getAttributes(){yield*this._attrs.entries(),this._classes.size>0&&(yield["class",this.getAttribute("class")]),this._styles.isEmpty||(yield["style",this.getAttribute("style")])}getAttribute(e){if("class"==e)return this._classes.size>0?[...this._classes].join(" "):void 0;if("style"==e){const e=this._styles.toString();return""==e?void 0:e}return this._attrs.get(e)}hasAttribute(e){return"class"==e?this._classes.size>0:"style"==e?!this._styles.isEmpty:this._attrs.has(e)}isSimilar(e){if(!(e instanceof u))return!1;if(this===e)return!0;if(this.name!=e.name)return!1;if(this.isAllowedInsideAttributeElement!=e.isAllowedInsideAttributeElement)return!1;if(this._attrs.size!==e._attrs.size||this._classes.size!==e._classes.size||this._styles.size!==e._styles.size)return!1;for(const[t,o]of this._attrs)if(!e._attrs.has(t)||e._attrs.get(t)!==o)return!1;for(const t of this._classes)if(!e._classes.has(t))return!1;for(const t of this._styles.getStyleNames())if(!e._styles.has(t)||e._styles.getAsString(t)!==this._styles.getAsString(t))return!1;return!0}hasClass(...e){for(const t of e)if(!this._classes.has(t))return!1;return!0}getClassNames(){return this._classes.keys()}getStyle(e){return this._styles.getAsString(e)}getNormalizedStyle(e){return this._styles.getNormalized(e)}getStyleNames(e=!1){return this._styles.getStyleNames(e)}hasStyle(...e){for(const t of e)if(!this._styles.has(t))return!1;return!0}findAncestor(...e){const t=new l.a(...e);let o=this.parent;for(;o;){if(t.match(o))return o;o=o.parent}return null}getCustomProperty(e){return this._customProperties.get(e)}*getCustomProperties(){yield*this._customProperties.entries()}getIdentity(){const e=Array.from(this._classes).sort().join(","),t=this._styles.toString(),o=Array.from(this._attrs).map(e=>`${e[0]}="${e[1]}"`).sort().join(" ");return this.name+(""==e?"":` class="${e}"`)+(t?` style="${t}"`:"")+(""==o?"":" "+o)}_clone(e=!1){const t=[];if(e)for(const o of this.getChildren())t.push(o._clone(e));const o=new this.constructor(this.document,this.name,this._attrs,t);return o._classes=new Set(this._classes),o._styles.set(this._styles.getNormalized()),o._customProperties=new Map(this._customProperties),o.getFillerOffset=this.getFillerOffset,o._isAllowedInsideAttributeElement=this.isAllowedInsideAttributeElement,o}_appendChild(e){return this._insertChild(this.childCount,e)}_insertChild(e,t){this._fireChange("children",this);let o=0;const i=function(e,t){if("string"==typeof t)return[new r.a(e,t)];Object(c.a)(t)||(t=[t]);return Array.from(t).map(t=>"string"==typeof t?new r.a(e,t):t instanceof s.a?new r.a(e,t.data):t)}(this.document,t);for(const t of i)null!==t.parent&&t._remove(),t.parent=this,t.document=this.document,this._children.splice(e,0,t),e++,o++;return o}_removeChildren(e,t=1){this._fireChange("children",this);for(let o=e;o<e+t;o++)this._children[o].parent=null;return this._children.splice(e,t)}_setAttribute(e,t){t=String(t),this._fireChange("attributes",this),"class"==e?h(this._classes,t):"style"==e?this._styles.setTo(t):this._attrs.set(e,t)}_removeAttribute(e){return this._fireChange("attributes",this),"class"==e?this._classes.size>0&&(this._classes.clear(),!0):"style"==e?!this._styles.isEmpty&&(this._styles.clear(),!0):this._attrs.delete(e)}_addClass(e){this._fireChange("attributes",this);for(const t of Object(a.a)(e))this._classes.add(t)}_removeClass(e){this._fireChange("attributes",this);for(const t of Object(a.a)(e))this._classes.delete(t)}_setStyle(e,t){this._fireChange("attributes",this),this._styles.set(e,t)}_removeStyle(e){this._fireChange("attributes",this);for(const t of Object(a.a)(e))this._styles.remove(t)}_setCustomProperty(e,t){this._customProperties.set(e,t)}_removeCustomProperty(e){return this._customProperties.delete(e)}}function h(e,t){const o=t.split(/\s+/);e.clear(),o.forEach(t=>e.add(t))}},"./packages/ckeditor5-engine/src/view/filler.js":function(e,t,o){"use strict";o.d(t,"e",(function(){return s})),o.d(t,"d",(function(){return n})),o.d(t,"a",(function(){return a})),o.d(t,"c",(function(){return c})),o.d(t,"b",(function(){return l})),o.d(t,"i",(function(){return d})),o.d(t,"h",(function(){return u})),o.d(t,"f",(function(){return h})),o.d(t,"g",(function(){return p}));var i=o("./packages/ckeditor5-utils/src/keyboard.js"),r=o("./packages/ckeditor5-utils/src/dom/istext.js");const s=e=>e.createTextNode(" "),n=e=>{const t=e.createElement("span");return t.dataset.ckeFiller=!0,t.innerHTML=" ",t},a=e=>{const t=e.createElement("br");return t.dataset.ckeFiller=!0,t},c=7,l="⁠".repeat(c);function d(e){return Object(r.a)(e)&&e.data.substr(0,c)===l}function u(e){return e.data.length==c&&d(e)}function h(e){return d(e)?e.data.slice(c):e.data}function p(e){e.document.on("arrowKey",g,{priority:"low"})}function g(e,t){if(t.keyCode==i.f.arrowleft){const e=t.domTarget.ownerDocument.defaultView.getSelection();if(1==e.rangeCount&&e.getRangeAt(0).collapsed){const t=e.getRangeAt(0).startContainer,o=e.getRangeAt(0).startOffset;d(t)&&o<=c&&e.collapse(t,0)}}}},"./packages/ckeditor5-engine/src/view/matcher.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./node_modules/lodash-es/isPlainObject.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class s{constructor(...e){this._patterns=[],this.add(...e)}add(...e){for(let t of e)("string"==typeof t||t instanceof RegExp)&&(t={name:t}),this._patterns.push(t)}match(...e){for(const t of e)for(const e of this._patterns){const o=n(t,e);if(o)return{element:t,pattern:e,match:o}}return null}matchAll(...e){const t=[];for(const o of e)for(const e of this._patterns){const i=n(o,e);i&&t.push({element:o,pattern:e,match:i})}return t.length>0?t:null}getElementName(){if(1!==this._patterns.length)return null;const e=this._patterns[0],t=e.name;return"function"==typeof e||!t||t instanceof RegExp?null:t}}function n(e,t){if("function"==typeof t)return t(e);const o={};return t.name&&(o.name=function(e,t){if(e instanceof RegExp)return e.test(t);return e===t}(t.name,e.name),!o.name)||t.attributes&&(o.attributes=function(e,t){const o=new Set(t.getAttributeKeys());Object(i.a)(e)?(void 0!==e.style&&Object(r.c)("matcher-pattern-deprecated-attributes-style-key",e),void 0!==e.class&&Object(r.c)("matcher-pattern-deprecated-attributes-class-key",e)):(o.delete("style"),o.delete("class"));return a(e,o,e=>t.getAttribute(e))}(t.attributes,e),!o.attributes)?null:!(t.classes&&(o.classes=function(e,t){return a(e,t.getClassNames())}(t.classes,e),!o.classes))&&(!(t.styles&&(o.styles=function(e,t){return a(e,t.getStyleNames(!0),e=>t.getStyle(e))}(t.styles,e),!o.styles))&&o)}function a(e,t,o){const s=function(e){if(Array.isArray(e))return e.map(e=>Object(i.a)(e)?(void 0!==e.key&&void 0!==e.value||Object(r.c)("matcher-pattern-missing-key-or-value",e),[e.key,e.value]):[e,!0]);if(Object(i.a)(e))return Object.entries(e);return[[e,!0]]}(e),n=Array.from(t),a=[];return s.forEach(([e,t])=>{n.forEach(i=>{(function(e,t){return!0===e||e===t||e instanceof RegExp&&e.test(t)})(e,i)&&function(e,t,o){if(!0===e)return!0;const i=o(t);return e===i||e instanceof RegExp&&e.test(i)}(t,i,o)&&a.push(i)})}),!s.length||a.length<s.length?null:a}},"./packages/ckeditor5-engine/src/view/node.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),r=o("./packages/ckeditor5-utils/src/emittermixin.js"),s=o("./packages/ckeditor5-utils/src/mix.js"),n=o("./packages/ckeditor5-utils/src/comparearrays.js"),a=o("./node_modules/lodash-es/clone.js");o("./packages/ckeditor5-utils/src/version.js");class c{constructor(e){this.document=e,this.parent=null}get index(){let e;if(!this.parent)return null;if(-1==(e=this.parent.getChildIndex(this)))throw new i.a("view-node-not-found-in-parent",this);return e}get nextSibling(){const e=this.index;return null!==e&&this.parent.getChild(e+1)||null}get previousSibling(){const e=this.index;return null!==e&&this.parent.getChild(e-1)||null}get root(){let e=this;for(;e.parent;)e=e.parent;return e}isAttached(){return this.root.is("rootElement")}getPath(){const e=[];let t=this;for(;t.parent;)e.unshift(t.index),t=t.parent;return e}getAncestors(e={includeSelf:!1,parentFirst:!1}){const t=[];let o=e.includeSelf?this:this.parent;for(;o;)t[e.parentFirst?"push":"unshift"](o),o=o.parent;return t}getCommonAncestor(e,t={}){const o=this.getAncestors(t),i=e.getAncestors(t);let r=0;for(;o[r]==i[r]&&o[r];)r++;return 0===r?null:o[r-1]}isBefore(e){if(this==e)return!1;if(this.root!==e.root)return!1;const t=this.getPath(),o=e.getPath(),i=Object(n.a)(t,o);switch(i){case"prefix":return!0;case"extension":return!1;default:return t[i]<o[i]}}isAfter(e){return this!=e&&(this.root===e.root&&!this.isBefore(e))}_remove(){this.parent._removeChildren(this.index)}_fireChange(e,t){this.fire("change:"+e,t),this.parent&&this.parent._fireChange(e,t)}toJSON(){const e=Object(a.a)(this);return delete e.parent,e}is(e){return"node"===e||"view:node"===e}}Object(s.a)(c,r.c)},"./packages/ckeditor5-engine/src/view/observer/bubblingeventinfo.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-utils/src/eventinfo.js");class r extends i.a{constructor(e,t,o){super(e,t),this.startRange=o,this._eventPhase="none",this._currentTarget=null}get eventPhase(){return this._eventPhase}get currentTarget(){return this._currentTarget}}},"./packages/ckeditor5-engine/src/view/observer/domeventdata.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./node_modules/lodash-es/assignIn.js");class r{constructor(e,t,o){this.view=e,this.document=e.document,this.domEvent=t,this.domTarget=t.target,Object(i.a)(this,o)}get target(){return this.view.domConverter.mapDomToView(this.domTarget)}preventDefault(){this.domEvent.preventDefault()}stopPropagation(){this.domEvent.stopPropagation()}}},"./packages/ckeditor5-engine/src/view/observer/domeventobserver.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-engine/src/view/observer/observer.js"),r=o("./packages/ckeditor5-engine/src/view/observer/domeventdata.js");class s extends i.a{constructor(e){super(e),this.useCapture=!1}observe(e){("string"==typeof this.domEventType?[this.domEventType]:this.domEventType).forEach(t=>{this.listenTo(e,t,(e,t)=>{this.isEnabled&&!this.checkShouldIgnoreEventFromTarget(t.target)&&this.onDomEvent(t)},{useCapture:this.useCapture})})}fire(e,t,o){this.isEnabled&&this.document.fire(e,new r.a(this.view,t,o))}}},"./packages/ckeditor5-engine/src/view/observer/mouseobserver.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-engine/src/view/observer/domeventobserver.js");class r extends i.a{constructor(e){super(e),this.domEventType=["mousedown","mouseup","mouseover","mouseout"]}onDomEvent(e){this.fire(e.type,e)}}},"./packages/ckeditor5-engine/src/view/observer/observer.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-utils/src/dom/emittermixin.js"),r=o("./packages/ckeditor5-utils/src/mix.js");class s{constructor(e){this.view=e,this.document=e.document,this.isEnabled=!1}enable(){this.isEnabled=!0}disable(){this.isEnabled=!1}destroy(){this.disable(),this.stopListening()}checkShouldIgnoreEventFromTarget(e){return e&&3===e.nodeType&&(e=e.parentNode),!(!e||1!==e.nodeType)&&e.matches("[data-cke-ignore-events], [data-cke-ignore-events] *")}}Object(r.a)(s,i.a)},"./packages/ckeditor5-engine/src/view/position.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-engine/src/view/treewalker.js"),r=o("./packages/ckeditor5-utils/src/comparearrays.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-engine/src/view/editableelement.js");o("./packages/ckeditor5-utils/src/version.js");class a{constructor(e,t){this.parent=e,this.offset=t}get nodeAfter(){return this.parent.is("$text")?null:this.parent.getChild(this.offset)||null}get nodeBefore(){return this.parent.is("$text")?null:this.parent.getChild(this.offset-1)||null}get isAtStart(){return 0===this.offset}get isAtEnd(){const e=this.parent.is("$text")?this.parent.data.length:this.parent.childCount;return this.offset===e}get root(){return this.parent.root}get editableElement(){let e=this.parent;for(;!(e instanceof n.a);){if(!e.parent)return null;e=e.parent}return e}getShiftedBy(e){const t=a._createAt(this),o=t.offset+e;return t.offset=o<0?0:o,t}getLastMatchingPosition(e,t={}){t.startPosition=this;const o=new i.a(t);return o.skip(e),o.position}getAncestors(){return this.parent.is("documentFragment")?[this.parent]:this.parent.getAncestors({includeSelf:!0})}getCommonAncestor(e){const t=this.getAncestors(),o=e.getAncestors();let i=0;for(;t[i]==o[i]&&t[i];)i++;return 0===i?null:t[i-1]}is(e){return"position"===e||"view:position"===e}isEqual(e){return this.parent==e.parent&&this.offset==e.offset}isBefore(e){return"before"==this.compareWith(e)}isAfter(e){return"after"==this.compareWith(e)}compareWith(e){if(this.root!==e.root)return"different";if(this.isEqual(e))return"same";const t=this.parent.is("node")?this.parent.getPath():[],o=e.parent.is("node")?e.parent.getPath():[];t.push(this.offset),o.push(e.offset);const i=Object(r.a)(t,o);switch(i){case"prefix":return"before";case"extension":return"after";default:return t[i]<o[i]?"before":"after"}}getWalker(e={}){return e.startPosition=this,new i.a(e)}clone(){return new a(this.parent,this.offset)}static _createAt(e,t){if(e instanceof a)return new this(e.parent,e.offset);{const o=e;if("end"==t)t=o.is("$text")?o.data.length:o.childCount;else{if("before"==t)return this._createBefore(o);if("after"==t)return this._createAfter(o);if(0!==t&&!t)throw new s.a("view-createpositionat-offset-required",o)}return new a(o,t)}}static _createAfter(e){if(e.is("$textProxy"))return new a(e.textNode,e.offsetInText+e.data.length);if(!e.parent)throw new s.a("view-position-after-root",e,{root:e});return new a(e.parent,e.index+1)}static _createBefore(e){if(e.is("$textProxy"))return new a(e.textNode,e.offsetInText);if(!e.parent)throw new s.a("view-position-before-root",e,{root:e});return new a(e.parent,e.index)}}},"./packages/ckeditor5-engine/src/view/range.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-engine/src/view/position.js"),r=o("./packages/ckeditor5-engine/src/view/treewalker.js");class s{constructor(e,t=null){this.start=e.clone(),this.end=t?t.clone():e.clone()}*[Symbol.iterator](){yield*new r.a({boundaries:this,ignoreElementEnd:!0})}get isCollapsed(){return this.start.isEqual(this.end)}get isFlat(){return this.start.parent===this.end.parent}get root(){return this.start.root}getEnlarged(){let e=this.start.getLastMatchingPosition(n,{direction:"backward"}),t=this.end.getLastMatchingPosition(n);return e.parent.is("$text")&&e.isAtStart&&(e=i.a._createBefore(e.parent)),t.parent.is("$text")&&t.isAtEnd&&(t=i.a._createAfter(t.parent)),new s(e,t)}getTrimmed(){let e=this.start.getLastMatchingPosition(n);if(e.isAfter(this.end)||e.isEqual(this.end))return new s(e,e);let t=this.end.getLastMatchingPosition(n,{direction:"backward"});const o=e.nodeAfter,r=t.nodeBefore;return o&&o.is("$text")&&(e=new i.a(o,0)),r&&r.is("$text")&&(t=new i.a(r,r.data.length)),new s(e,t)}isEqual(e){return this==e||this.start.isEqual(e.start)&&this.end.isEqual(e.end)}containsPosition(e){return e.isAfter(this.start)&&e.isBefore(this.end)}containsRange(e,t=!1){e.isCollapsed&&(t=!1);const o=this.containsPosition(e.start)||t&&this.start.isEqual(e.start),i=this.containsPosition(e.end)||t&&this.end.isEqual(e.end);return o&&i}getDifference(e){const t=[];return this.isIntersecting(e)?(this.containsPosition(e.start)&&t.push(new s(this.start,e.start)),this.containsPosition(e.end)&&t.push(new s(e.end,this.end))):t.push(this.clone()),t}getIntersection(e){if(this.isIntersecting(e)){let t=this.start,o=this.end;return this.containsPosition(e.start)&&(t=e.start),this.containsPosition(e.end)&&(o=e.end),new s(t,o)}return null}getWalker(e={}){return e.boundaries=this,new r.a(e)}getCommonAncestor(){return this.start.getCommonAncestor(this.end)}getContainedElement(){if(this.isCollapsed)return null;let e=this.start.nodeAfter,t=this.end.nodeBefore;return this.start.parent.is("$text")&&this.start.isAtEnd&&this.start.parent.nextSibling&&(e=this.start.parent.nextSibling),this.end.parent.is("$text")&&this.end.isAtStart&&this.end.parent.previousSibling&&(t=this.end.parent.previousSibling),e&&e.is("element")&&e===t?e:null}clone(){return new s(this.start,this.end)}*getItems(e={}){e.boundaries=this,e.ignoreElementEnd=!0;const t=new r.a(e);for(const e of t)yield e.item}*getPositions(e={}){e.boundaries=this;const t=new r.a(e);yield t.position;for(const e of t)yield e.nextPosition}is(e){return"range"===e||"view:range"===e}isIntersecting(e){return this.start.isBefore(e.end)&&this.end.isAfter(e.start)}static _createFromParentsAndOffsets(e,t,o,r){return new this(new i.a(e,t),new i.a(o,r))}static _createFromPositionAndShift(e,t){const o=e,i=e.getShiftedBy(t);return t>0?new this(o,i):new this(i,o)}static _createIn(e){return this._createFromParentsAndOffsets(e,0,e,e.childCount)}static _createOn(e){const t=e.is("$textProxy")?e.offsetSize:1;return this._createFromPositionAndShift(i.a._createBefore(e),t)}}function n(e){return!(!e.item.is("attributeElement")&&!e.item.is("uiElement"))}},"./packages/ckeditor5-engine/src/view/renderer.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return m}));var i=o("./packages/ckeditor5-engine/src/view/text.js"),r=o("./packages/ckeditor5-engine/src/view/position.js"),s=o("./packages/ckeditor5-engine/src/view/filler.js"),n=o("./packages/ckeditor5-utils/src/mix.js"),a=o("./packages/ckeditor5-utils/src/diff.js");function c(e,t,o){e.insertBefore(o,e.childNodes[t]||null)}function l(e){const t=e.parentNode;t&&t.removeChild(e)}var d=o("./packages/ckeditor5-utils/src/observablemixin.js"),u=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),h=o("./packages/ckeditor5-utils/src/dom/istext.js"),p=o("./packages/ckeditor5-utils/src/dom/isnode.js"),g=o("./packages/ckeditor5-utils/src/fastdiff.js"),f=o("./packages/ckeditor5-utils/src/env.js");class m{constructor(e,t){this.domDocuments=new Set,this.domConverter=e,this.markedAttributes=new Set,this.markedChildren=new Set,this.markedTexts=new Set,this.selection=t,this.isFocused=!1,this._inlineFiller=null,this._fakeSelectionContainer=null}markToSync(e,t){if("text"===e)this.domConverter.mapViewToDom(t.parent)&&this.markedTexts.add(t);else{if(!this.domConverter.mapViewToDom(t))return;if("attributes"===e)this.markedAttributes.add(t);else{if("children"!==e)throw new u.a("view-renderer-unknown-type",this);this.markedChildren.add(t)}}}render(){let e;for(const e of this.markedChildren)this._updateChildrenMappings(e);this._inlineFiller&&!this._isSelectionInInlineFiller()&&this._removeInlineFiller(),this._inlineFiller?e=this._getInlineFillerPosition():this._needsInlineFillerAtSelection()&&(e=this.selection.getFirstPosition(),this.markedChildren.add(e.parent));for(const e of this.markedAttributes)this._updateAttrs(e);for(const t of this.markedChildren)this._updateChildren(t,{inlineFillerPosition:e});for(const t of this.markedTexts)!this.markedChildren.has(t.parent)&&this.domConverter.mapViewToDom(t.parent)&&this._updateText(t,{inlineFillerPosition:e});if(e){const t=this.domConverter.viewPositionToDom(e),o=t.parent.ownerDocument;Object(s.i)(t.parent)?this._inlineFiller=t.parent:this._inlineFiller=k(o,t.parent,t.offset)}else this._inlineFiller=null;this._updateFocus(),this._updateSelection(),this.markedTexts.clear(),this.markedAttributes.clear(),this.markedChildren.clear()}_updateChildrenMappings(e){const t=this.domConverter.mapViewToDom(e);if(!t)return;const o=Array.from(this.domConverter.mapViewToDom(e).childNodes),i=Array.from(this.domConverter.viewChildrenToDom(e,t.ownerDocument,{withChildren:!1})),r=this._diffNodeLists(o,i),s=this._findReplaceActions(r,o,i);if(-1!==s.indexOf("replace")){const t={equal:0,insert:0,delete:0};for(const r of s)if("replace"===r){const r=t.equal+t.insert,s=t.equal+t.delete,n=e.getChild(r);!n||n.is("uiElement")||n.is("rawElement")||this._updateElementMappings(n,o[s]),l(i[r]),t.equal++}else t[r]++}}_updateElementMappings(e,t){this.domConverter.unbindDomElement(t),this.domConverter.bindElements(t,e),this.markedChildren.add(e),this.markedAttributes.add(e)}_getInlineFillerPosition(){const e=this.selection.getFirstPosition();return e.parent.is("$text")?r.a._createBefore(this.selection.getFirstPosition().parent):e}_isSelectionInInlineFiller(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const e=this.selection.getFirstPosition(),t=this.domConverter.viewPositionToDom(e);return!!(t&&Object(h.a)(t.parent)&&Object(s.i)(t.parent))}_removeInlineFiller(){const e=this._inlineFiller;if(!Object(s.i)(e))throw new u.a("view-renderer-filler-was-lost",this);Object(s.h)(e)?e.parentNode.removeChild(e):e.data=e.data.substr(s.c),this._inlineFiller=null}_needsInlineFillerAtSelection(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const e=this.selection.getFirstPosition(),t=e.parent,o=e.offset;if(!this.domConverter.mapViewToDom(t.root))return!1;if(!t.is("element"))return!1;if(!function(e){if("false"==e.getAttribute("contenteditable"))return!1;const t=e.findAncestor(e=>e.hasAttribute("contenteditable"));return!t||"true"==t.getAttribute("contenteditable")}(t))return!1;if(o===t.getFillerOffset())return!1;const r=e.nodeBefore,s=e.nodeAfter;return!(r instanceof i.a||s instanceof i.a)}_updateText(e,t){const o=this.domConverter.findCorrespondingDomText(e),i=this.domConverter.viewToDom(e,o.ownerDocument),r=o.data;let n=i.data;const a=t.inlineFillerPosition;if(a&&a.parent==e.parent&&a.offset==e.index&&(n=s.b+n),r!=n){const e=Object(g.a)(r,n);for(const t of e)"insert"===t.type?o.insertData(t.index,t.values.join("")):o.deleteData(t.index,t.howMany)}}_updateAttrs(e){const t=this.domConverter.mapViewToDom(e);if(!t)return;const o=Array.from(t.attributes).map(e=>e.name),i=e.getAttributeKeys();for(const o of i)t.setAttribute(o,e.getAttribute(o));for(const i of o)e.hasAttribute(i)||t.removeAttribute(i)}_updateChildren(e,t){const o=this.domConverter.mapViewToDom(e);if(!o)return;const i=t.inlineFillerPosition,r=this.domConverter.mapViewToDom(e).childNodes,s=Array.from(this.domConverter.viewChildrenToDom(e,o.ownerDocument,{bind:!0,inlineFillerPosition:i}));i&&i.parent===e&&k(o.ownerDocument,s,i.offset);const n=this._diffNodeLists(r,s);let a=0;const d=new Set;for(const e of n)"delete"===e?(d.add(r[a]),l(r[a])):"equal"===e&&a++;a=0;for(const e of n)"insert"===e?(c(o,a,s[a]),a++):"equal"===e&&(this._markDescendantTextToSync(this.domConverter.domToView(s[a])),a++);for(const e of d)e.parentNode||this.domConverter.unbindDomElement(e)}_diffNodeLists(e,t){return e=function(e,t){const o=Array.from(e);if(0==o.length||!t)return o;o[o.length-1]==t&&o.pop();return o}(e,this._fakeSelectionContainer),Object(a.a)(e,t,_.bind(null,this.domConverter))}_findReplaceActions(e,t,o){if(-1===e.indexOf("insert")||-1===e.indexOf("delete"))return e;let i=[],r=[],s=[];const n={equal:0,insert:0,delete:0};for(const c of e)"insert"===c?s.push(o[n.equal+n.insert]):"delete"===c?r.push(t[n.equal+n.delete]):(i=i.concat(Object(a.a)(r,s,b).map(e=>"equal"===e?"replace":e)),i.push("equal"),r=[],s=[]),n[c]++;return i.concat(Object(a.a)(r,s,b).map(e=>"equal"===e?"replace":e))}_markDescendantTextToSync(e){if(e)if(e.is("$text"))this.markedTexts.add(e);else if(e.is("element"))for(const t of e.getChildren())this._markDescendantTextToSync(t)}_updateSelection(){if(0===this.selection.rangeCount)return this._removeDomSelection(),void this._removeFakeSelection();const e=this.domConverter.mapViewToDom(this.selection.editableElement);this.isFocused&&e&&(this.selection.isFake?this._updateFakeSelection(e):(this._removeFakeSelection(),this._updateDomSelection(e)))}_updateFakeSelection(e){const t=e.ownerDocument;this._fakeSelectionContainer||(this._fakeSelectionContainer=function(e){const t=e.createElement("div");return t.className="ck-fake-selection-container",Object.assign(t.style,{position:"fixed",top:0,left:"-9999px",width:"42px"}),t.textContent=" ",t}(t));const o=this._fakeSelectionContainer;if(this.domConverter.bindFakeSelection(o,this.selection),!this._fakeSelectionNeedsUpdate(e))return;o.parentElement&&o.parentElement==e||e.appendChild(o),o.textContent=this.selection.fakeSelectionLabel||" ";const i=t.getSelection(),r=t.createRange();i.removeAllRanges(),r.selectNodeContents(o),i.addRange(r)}_updateDomSelection(e){const t=e.ownerDocument.defaultView.getSelection();if(!this._domSelectionNeedsUpdate(t))return;const o=this.domConverter.viewPositionToDom(this.selection.anchor),i=this.domConverter.viewPositionToDom(this.selection.focus);t.collapse(o.parent,o.offset),t.extend(i.parent,i.offset),f.a.isGecko&&function(e,t){const o=e.parent;if(o.nodeType!=Node.ELEMENT_NODE||e.offset!=o.childNodes.length-1)return;const i=o.childNodes[e.offset];i&&"BR"==i.tagName&&t.addRange(t.getRangeAt(0))}(i,t)}_domSelectionNeedsUpdate(e){if(!this.domConverter.isDomSelectionCorrect(e))return!0;const t=e&&this.domConverter.domSelectionToView(e);return(!t||!this.selection.isEqual(t))&&!(!this.selection.isCollapsed&&this.selection.isSimilar(t))}_fakeSelectionNeedsUpdate(e){const t=this._fakeSelectionContainer,o=e.ownerDocument.getSelection();return!t||t.parentElement!==e||(o.anchorNode!==t&&!t.contains(o.anchorNode)||t.textContent!==this.selection.fakeSelectionLabel)}_removeDomSelection(){for(const e of this.domDocuments){if(e.getSelection().rangeCount){const t=e.activeElement,o=this.domConverter.mapDomToView(t);t&&o&&e.getSelection().removeAllRanges()}}}_removeFakeSelection(){const e=this._fakeSelectionContainer;e&&e.remove()}_updateFocus(){if(this.isFocused){const e=this.selection.editableElement;e&&this.domConverter.focus(e)}}}function k(e,t,o){const i=t instanceof Array?t:t.childNodes,r=i[o];if(Object(h.a)(r))return r.data=s.b+r.data,r;{const r=e.createTextNode(s.b);return Array.isArray(t)?i.splice(o,0,r):c(t,o,r),r}}function b(e,t){return Object(p.a)(e)&&Object(p.a)(t)&&!Object(h.a)(e)&&!Object(h.a)(t)&&e.nodeType!==Node.COMMENT_NODE&&t.nodeType!==Node.COMMENT_NODE&&e.tagName.toLowerCase()===t.tagName.toLowerCase()}function _(e,t,o){return t===o||(Object(h.a)(t)&&Object(h.a)(o)?t.data===o.data:!(!e.isBlockFiller(t)||!e.isBlockFiller(o)))}Object(n.a)(m,d.a)},"./packages/ckeditor5-engine/src/view/selection.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return h}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),r=o("./packages/ckeditor5-engine/src/view/range.js"),s=o("./packages/ckeditor5-engine/src/view/position.js"),n=o("./packages/ckeditor5-utils/src/mix.js"),a=o("./packages/ckeditor5-utils/src/emittermixin.js"),c=o("./packages/ckeditor5-engine/src/view/node.js"),l=o("./packages/ckeditor5-utils/src/count.js"),d=o("./packages/ckeditor5-utils/src/isiterable.js"),u=o("./packages/ckeditor5-engine/src/view/documentselection.js");class h{constructor(e=null,t,o){this._ranges=[],this._lastRangeBackward=!1,this._isFake=!1,this._fakeSelectionLabel="",this.setTo(e,t,o)}get isFake(){return this._isFake}get fakeSelectionLabel(){return this._fakeSelectionLabel}get anchor(){if(!this._ranges.length)return null;const e=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?e.end:e.start).clone()}get focus(){if(!this._ranges.length)return null;const e=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?e.start:e.end).clone()}get isCollapsed(){return 1===this.rangeCount&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}get editableElement(){return this.anchor?this.anchor.editableElement:null}*getRanges(){for(const e of this._ranges)yield e.clone()}getFirstRange(){let e=null;for(const t of this._ranges)e&&!t.start.isBefore(e.start)||(e=t);return e?e.clone():null}getLastRange(){let e=null;for(const t of this._ranges)e&&!t.end.isAfter(e.end)||(e=t);return e?e.clone():null}getFirstPosition(){const e=this.getFirstRange();return e?e.start.clone():null}getLastPosition(){const e=this.getLastRange();return e?e.end.clone():null}isEqual(e){if(this.isFake!=e.isFake)return!1;if(this.isFake&&this.fakeSelectionLabel!=e.fakeSelectionLabel)return!1;if(this.rangeCount!=e.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(e.anchor)||!this.focus.isEqual(e.focus))return!1;for(const t of this._ranges){let o=!1;for(const i of e._ranges)if(t.isEqual(i)){o=!0;break}if(!o)return!1}return!0}isSimilar(e){if(this.isBackward!=e.isBackward)return!1;const t=Object(l.a)(this.getRanges());if(t!=Object(l.a)(e.getRanges()))return!1;if(0==t)return!0;for(let t of this.getRanges()){t=t.getTrimmed();let o=!1;for(let i of e.getRanges())if(i=i.getTrimmed(),t.start.isEqual(i.start)&&t.end.isEqual(i.end)){o=!0;break}if(!o)return!1}return!0}getSelectedElement(){return 1!==this.rangeCount?null:this.getFirstRange().getContainedElement()}setTo(e,t,o){if(null===e)this._setRanges([]),this._setFakeOptions(t);else if(e instanceof h||e instanceof u.a)this._setRanges(e.getRanges(),e.isBackward),this._setFakeOptions({fake:e.isFake,label:e.fakeSelectionLabel});else if(e instanceof r.a)this._setRanges([e],t&&t.backward),this._setFakeOptions(t);else if(e instanceof s.a)this._setRanges([new r.a(e)]),this._setFakeOptions(t);else if(e instanceof c.a){const n=!!o&&!!o.backward;let a;if(void 0===t)throw new i.a("view-selection-setto-required-second-parameter",this);a="in"==t?r.a._createIn(e):"on"==t?r.a._createOn(e):new r.a(s.a._createAt(e,t)),this._setRanges([a],n),this._setFakeOptions(o)}else{if(!Object(d.a)(e))throw new i.a("view-selection-setto-not-selectable",this);this._setRanges(e,t&&t.backward),this._setFakeOptions(t)}this.fire("change")}setFocus(e,t){if(null===this.anchor)throw new i.a("view-selection-setfocus-no-ranges",this);const o=s.a._createAt(e,t);if("same"==o.compareWith(this.focus))return;const n=this.anchor;this._ranges.pop(),"before"==o.compareWith(n)?this._addRange(new r.a(o,n),!0):this._addRange(new r.a(n,o)),this.fire("change")}is(e){return"selection"===e||"view:selection"===e}_setRanges(e,t=!1){e=Array.from(e),this._ranges=[];for(const t of e)this._addRange(t);this._lastRangeBackward=!!t}_setFakeOptions(e={}){this._isFake=!!e.fake,this._fakeSelectionLabel=e.fake&&e.label||""}_addRange(e,t=!1){if(!(e instanceof r.a))throw new i.a("view-selection-add-range-not-range",this);this._pushRange(e),this._lastRangeBackward=!!t}_pushRange(e){for(const t of this._ranges)if(e.isIntersecting(t))throw new i.a("view-selection-range-intersects",this,{addedRange:e,intersectingRange:t});this._ranges.push(new r.a(e.start,e.end))}}Object(n.a)(h,a.c)},"./packages/ckeditor5-engine/src/view/stylesmap.js":function(e,t,o){"use strict";o.d(t,"b",(function(){return ee})),o.d(t,"a",(function(){return te}));var i=o("./node_modules/lodash-es/isObject.js"),r=o("./node_modules/lodash-es/isArray.js"),s=o("./node_modules/lodash-es/isSymbol.js"),n=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;var c=function(e,t){if(Object(r.a)(e))return!1;var o=typeof e;return!("number"!=o&&"symbol"!=o&&"boolean"!=o&&null!=e&&!Object(s.a)(e))||(a.test(e)||!n.test(e)||null!=t&&e in Object(t))},l=o("./node_modules/lodash-es/_MapCache.js");function d(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var o=function(){var i=arguments,r=t?t.apply(this,i):i[0],s=o.cache;if(s.has(r))return s.get(r);var n=e.apply(this,i);return o.cache=s.set(r,n)||s,n};return o.cache=new(d.Cache||l.a),o}d.Cache=l.a;var u=d;var h=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,p=/\\(\\)?/g,g=function(e){var t=u(e,(function(e){return 500===o.size&&o.clear(),e})),o=t.cache;return t}((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(h,(function(e,o,i,r){t.push(i?r.replace(p,"$1"):o||e)})),t})),f=o("./node_modules/lodash-es/toString.js");var m=function(e,t){return Object(r.a)(e)?e:c(e,t)?[e]:g(Object(f.a)(e))};var k=function(e){var t=null==e?0:e.length;return t?e[t-1]:void 0};var b=function(e){if("string"==typeof e||Object(s.a)(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t};var _=function(e,t){for(var o=0,i=(t=m(t,e)).length;null!=e&&o<i;)e=e[b(t[o++])];return o&&o==i?e:void 0};var w=function(e,t,o){var i=-1,r=e.length;t<0&&(t=-t>r?0:r+t),(o=o>r?r:o)<0&&(o+=r),r=t>o?0:o-t>>>0,t>>>=0;for(var s=Array(r);++i<r;)s[i]=e[i+t];return s};var v=function(e,t){return t.length<2?e:_(e,w(t,0,-1))};var y=function(e,t){return t=m(t,e),null==(e=v(e,t))||delete e[b(k(t))]};var j=function(e,t){return null==e||y(e,t)};var x=function(e,t,o){var i=null==e?void 0:_(e,t);return void 0===i?o:i},P=o("./node_modules/lodash-es/_Stack.js"),O=o("./node_modules/lodash-es/_baseAssignValue.js"),A=o("./node_modules/lodash-es/eq.js");var T=function(e,t,o){(void 0!==o&&!Object(A.a)(e[t],o)||void 0===o&&!(t in e))&&Object(O.a)(e,t,o)};var C=function(e){return function(t,o,i){for(var r=-1,s=Object(t),n=i(t),a=n.length;a--;){var c=n[e?a:++r];if(!1===o(s[c],c,s))break}return t}}(),E=o("./node_modules/lodash-es/_cloneBuffer.js"),S=o("./node_modules/lodash-es/_cloneTypedArray.js"),R=o("./node_modules/lodash-es/_copyArray.js"),M=o("./node_modules/lodash-es/_initCloneObject.js"),N=o("./node_modules/lodash-es/isArguments.js"),I=o("./node_modules/lodash-es/isArrayLike.js"),z=o("./node_modules/lodash-es/isObjectLike.js");var V=function(e){return Object(z.a)(e)&&Object(I.a)(e)},D=o("./node_modules/lodash-es/isBuffer.js"),B=o("./node_modules/lodash-es/isFunction.js"),F=o("./node_modules/lodash-es/isPlainObject.js"),L=o("./node_modules/lodash-es/isTypedArray.js");var W=function(e,t){if(("constructor"!==t||"function"!=typeof e[t])&&"__proto__"!=t)return e[t]},H=o("./node_modules/lodash-es/_copyObject.js"),q=o("./node_modules/lodash-es/keysIn.js");var $=function(e){return Object(H.a)(e,Object(q.a)(e))};var U=function(e,t,o,s,n,a,c){var l=W(e,o),d=W(t,o),u=c.get(d);if(u)T(e,o,u);else{var h=a?a(l,d,o+"",e,t,c):void 0,p=void 0===h;if(p){var g=Object(r.a)(d),f=!g&&Object(D.a)(d),m=!g&&!f&&Object(L.a)(d);h=d,g||f||m?Object(r.a)(l)?h=l:V(l)?h=Object(R.a)(l):f?(p=!1,h=Object(E.a)(d,!0)):m?(p=!1,h=Object(S.a)(d,!0)):h=[]:Object(F.a)(d)||Object(N.a)(d)?(h=l,Object(N.a)(l)?h=$(l):Object(i.a)(l)&&!Object(B.a)(l)||(h=Object(M.a)(d))):p=!1}p&&(c.set(d,h),n(h,d,s,a,c),c.delete(d)),T(e,o,h)}};var K=function e(t,o,r,s,n){t!==o&&C(o,(function(a,c){if(n||(n=new P.a),Object(i.a)(a))U(t,o,c,r,e,s,n);else{var l=s?s(W(t,c),a,c+"",t,o,n):void 0;void 0===l&&(l=a),T(t,c,l)}}),q.a)},G=o("./node_modules/lodash-es/_createAssigner.js"),J=Object(G.a)((function(e,t,o){K(e,t,o)})),Y=o("./node_modules/lodash-es/_assignValue.js"),X=o("./node_modules/lodash-es/_isIndex.js");var Z=function(e,t,o,r){if(!Object(i.a)(e))return e;for(var s=-1,n=(t=m(t,e)).length,a=n-1,c=e;null!=c&&++s<n;){var l=b(t[s]),d=o;if("__proto__"===l||"constructor"===l||"prototype"===l)return e;if(s!=a){var u=c[l];void 0===(d=r?r(u,l,c):void 0)&&(d=Object(i.a)(u)?u:Object(X.a)(t[s+1])?[]:{})}Object(Y.a)(c,l,d),c=c[l]}return e};var Q=function(e,t,o){return null==e?e:Z(e,t,o)};class ee{constructor(e){this._styles={},this._styleProcessor=e}get isEmpty(){const e=Object.entries(this._styles);return!Array.from(e).length}get size(){return this.isEmpty?0:this.getStyleNames().length}setTo(e){this.clear();const t=Array.from(function(e){let t=null,o=0,i=0,r=null;const s=new Map;if(""===e)return s;";"!=e.charAt(e.length-1)&&(e+=";");for(let n=0;n<e.length;n++){const a=e.charAt(n);if(null===t)switch(a){case":":r||(r=e.substr(o,n-o),i=n+1);break;case'"':case"'":t=a;break;case";":{const t=e.substr(i,n-i);r&&s.set(r.trim(),t.trim()),r=null,o=n+1;break}}else a===t&&(t=null)}return s}(e).entries());for(const[e,o]of t)this._styleProcessor.toNormalizedForm(e,o,this._styles)}has(e){if(this.isEmpty)return!1;const t=this._styleProcessor.getReducedForm(e,this._styles).find(([t])=>t===e);return Array.isArray(t)}set(e,t){if(Object(i.a)(e))for(const[t,o]of Object.entries(e))this._styleProcessor.toNormalizedForm(t,o,this._styles);else this._styleProcessor.toNormalizedForm(e,t,this._styles)}remove(e){const t=oe(e);j(this._styles,t),delete this._styles[e],this._cleanEmptyObjectsOnPath(t)}getNormalized(e){return this._styleProcessor.getNormalized(e,this._styles)}toString(){return this.isEmpty?"":this._getStylesEntries().map(e=>e.join(":")).sort().join(";")+";"}getAsString(e){if(this.isEmpty)return;if(this._styles[e]&&!Object(i.a)(this._styles[e]))return this._styles[e];const t=this._styleProcessor.getReducedForm(e,this._styles).find(([t])=>t===e);return Array.isArray(t)?t[1]:void 0}getStyleNames(e=!1){if(this.isEmpty)return[];if(e)return this._styleProcessor.getStyleNames(this._styles);return this._getStylesEntries().map(([e])=>e)}clear(){this._styles={}}_getStylesEntries(){const e=[],t=Object.keys(this._styles);for(const o of t)e.push(...this._styleProcessor.getReducedForm(o,this._styles));return e}_cleanEmptyObjectsOnPath(e){const t=e.split(".");if(!(t.length>1))return;const o=t.splice(0,t.length-1).join("."),i=x(this._styles,o);if(!i)return;!Array.from(Object.keys(i)).length&&this.remove(o)}}class te{constructor(){this._normalizers=new Map,this._extractors=new Map,this._reducers=new Map,this._consumables=new Map}toNormalizedForm(e,t,o){if(Object(i.a)(t))ie(o,oe(e),t);else if(this._normalizers.has(e)){const i=this._normalizers.get(e),{path:r,value:s}=i(t);ie(o,r,s)}else ie(o,e,t)}getNormalized(e,t){if(!e)return J({},t);if(void 0!==t[e])return t[e];if(this._extractors.has(e)){const o=this._extractors.get(e);if("string"==typeof o)return x(t,o);const i=o(e,t);if(i)return i}return x(t,oe(e))}getReducedForm(e,t){const o=this.getNormalized(e,t);if(void 0===o)return[];if(this._reducers.has(e)){return this._reducers.get(e)(o)}return[[e,o]]}getStyleNames(e){const t=Array.from(this._consumables.keys()).filter(t=>{const o=this.getNormalized(t,e);return o&&"object"==typeof o?Object.keys(o).length:o}),o=new Set([...t,...Object.keys(e)]);return Array.from(o.values())}getRelatedStyles(e){return this._consumables.get(e)||[]}setNormalizer(e,t){this._normalizers.set(e,t)}setExtractor(e,t){this._extractors.set(e,t)}setReducer(e,t){this._reducers.set(e,t)}setStyleRelation(e,t){this._mapStyleNames(e,t);for(const o of t)this._mapStyleNames(o,[e])}_mapStyleNames(e,t){this._consumables.has(e)||this._consumables.set(e,[]),this._consumables.get(e).push(...t)}}function oe(e){return e.replace("-",".")}function ie(e,t,o){let r=o;Object(i.a)(o)&&(r=J({},x(e,t),o)),Q(e,t,r)}},"./packages/ckeditor5-engine/src/view/text.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-engine/src/view/node.js");class r extends i.a{constructor(e,t){super(e),this._textData=t}is(e){return"$text"===e||"view:$text"===e||"text"===e||"view:text"===e||"node"===e||"view:node"===e}get data(){return this._textData}get _data(){return this.data}set _data(e){this._fireChange("text",this),this._textData=e}isSimilar(e){return e instanceof r&&(this===e||this.data===e.data)}_clone(){return new r(this.document,this.data)}}},"./packages/ckeditor5-engine/src/view/textproxy.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class r{constructor(e,t,o){if(this.textNode=e,t<0||t>e.data.length)throw new i.a("view-textproxy-wrong-offsetintext",this);if(o<0||t+o>e.data.length)throw new i.a("view-textproxy-wrong-length",this);this.data=e.data.substring(t,t+o),this.offsetInText=t}get offsetSize(){return this.data.length}get isPartial(){return this.data.length!==this.textNode.data.length}get parent(){return this.textNode.parent}get root(){return this.textNode.root}get document(){return this.textNode.document}is(e){return"$textProxy"===e||"view:$textProxy"===e||"textProxy"===e||"view:textProxy"===e}getAncestors(e={includeSelf:!1,parentFirst:!1}){const t=[];let o=e.includeSelf?this.textNode:this.parent;for(;null!==o;)t[e.parentFirst?"push":"unshift"](o),o=o.parent;return t}}},"./packages/ckeditor5-engine/src/view/treewalker.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-engine/src/view/element.js"),r=o("./packages/ckeditor5-engine/src/view/text.js"),s=o("./packages/ckeditor5-engine/src/view/textproxy.js"),n=o("./packages/ckeditor5-engine/src/view/position.js"),a=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class c{constructor(e={}){if(!e.boundaries&&!e.startPosition)throw new a.a("view-tree-walker-no-start-position",null);if(e.direction&&"forward"!=e.direction&&"backward"!=e.direction)throw new a.a("view-tree-walker-unknown-direction",e.startPosition,{direction:e.direction});this.boundaries=e.boundaries||null,e.startPosition?this.position=n.a._createAt(e.startPosition):this.position=n.a._createAt(e.boundaries["backward"==e.direction?"end":"start"]),this.direction=e.direction||"forward",this.singleCharacters=!!e.singleCharacters,this.shallow=!!e.shallow,this.ignoreElementEnd=!!e.ignoreElementEnd,this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null,this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null}[Symbol.iterator](){return this}skip(e){let t,o,i;do{i=this.position,({done:t,value:o}=this.next())}while(!t&&e(o));t||(this.position=i)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){let e=this.position.clone();const t=this.position,o=e.parent;if(null===o.parent&&e.offset===o.childCount)return{done:!0};if(o===this._boundaryEndParent&&e.offset==this.boundaries.end.offset)return{done:!0};let a;if(o instanceof r.a){if(e.isAtEnd)return this.position=n.a._createAfter(o),this._next();a=o.data[e.offset]}else a=o.getChild(e.offset);if(a instanceof i.a)return this.shallow?e.offset++:e=new n.a(a,0),this.position=e,this._formatReturnValue("elementStart",a,t,e,1);if(a instanceof r.a){if(this.singleCharacters)return e=new n.a(a,0),this.position=e,this._next();{let o,i=a.data.length;return a==this._boundaryEndParent?(i=this.boundaries.end.offset,o=new s.a(a,0,i),e=n.a._createAfter(o)):(o=new s.a(a,0,a.data.length),e.offset++),this.position=e,this._formatReturnValue("text",o,t,e,i)}}if("string"==typeof a){let i;if(this.singleCharacters)i=1;else{i=(o===this._boundaryEndParent?this.boundaries.end.offset:o.data.length)-e.offset}const r=new s.a(o,e.offset,i);return e.offset+=i,this.position=e,this._formatReturnValue("text",r,t,e,i)}return e=n.a._createAfter(o),this.position=e,this.ignoreElementEnd?this._next():this._formatReturnValue("elementEnd",o,t,e)}_previous(){let e=this.position.clone();const t=this.position,o=e.parent;if(null===o.parent&&0===e.offset)return{done:!0};if(o==this._boundaryStartParent&&e.offset==this.boundaries.start.offset)return{done:!0};let a;if(o instanceof r.a){if(e.isAtStart)return this.position=n.a._createBefore(o),this._previous();a=o.data[e.offset-1]}else a=o.getChild(e.offset-1);if(a instanceof i.a)return this.shallow?(e.offset--,this.position=e,this._formatReturnValue("elementStart",a,t,e,1)):(e=new n.a(a,a.childCount),this.position=e,this.ignoreElementEnd?this._previous():this._formatReturnValue("elementEnd",a,t,e));if(a instanceof r.a){if(this.singleCharacters)return e=new n.a(a,a.data.length),this.position=e,this._previous();{let o,i=a.data.length;if(a==this._boundaryStartParent){const t=this.boundaries.start.offset;o=new s.a(a,t,a.data.length-t),i=o.data.length,e=n.a._createBefore(o)}else o=new s.a(a,0,a.data.length),e.offset--;return this.position=e,this._formatReturnValue("text",o,t,e,i)}}if("string"==typeof a){let i;if(this.singleCharacters)i=1;else{const t=o===this._boundaryStartParent?this.boundaries.start.offset:0;i=e.offset-t}e.offset-=i;const r=new s.a(o,e.offset,i);return this.position=e,this._formatReturnValue("text",r,t,e,i)}return e=n.a._createBefore(o),this.position=e,this._formatReturnValue("elementStart",o,t,e,1)}_formatReturnValue(e,t,o,i,r){return t instanceof s.a&&(t.offsetInText+t.data.length==t.textNode.data.length&&("forward"!=this.direction||this.boundaries&&this.boundaries.end.isEqual(this.position)?o=n.a._createAfter(t.textNode):(i=n.a._createAfter(t.textNode),this.position=i)),0===t.offsetInText&&("backward"!=this.direction||this.boundaries&&this.boundaries.start.isEqual(this.position)?o=n.a._createBefore(t.textNode):(i=n.a._createBefore(t.textNode),this.position=i))),{done:!1,value:{type:e,item:t,previousPosition:o,nextPosition:i,length:r}}}}},"./packages/ckeditor5-engine/src/view/uielement.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a})),o.d(t,"b",(function(){return c}));var i=o("./packages/ckeditor5-engine/src/view/element.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),s=o("./packages/ckeditor5-engine/src/view/node.js"),n=o("./packages/ckeditor5-utils/src/keyboard.js");class a extends i.a{constructor(e,t,o,i){super(e,t,o,i),this._isAllowedInsideAttributeElement=!0,this.getFillerOffset=l}is(e,t=null){return t?t===this.name&&("uiElement"===e||"view:uiElement"===e||"element"===e||"view:element"===e):"uiElement"===e||"view:uiElement"===e||"element"===e||"view:element"===e||"node"===e||"view:node"===e}_insertChild(e,t){if(t&&(t instanceof s.a||Array.from(t).length>0))throw new r.a("view-uielement-cannot-add",this)}render(e){return this.toDomElement(e)}toDomElement(e){const t=e.createElement(this.name);for(const e of this.getAttributeKeys())t.setAttribute(e,this.getAttribute(e));return t}}function c(e){e.document.on("arrowKey",(t,o)=>function(e,t,o){if(t.keyCode==n.f.arrowright){const e=t.domTarget.ownerDocument.defaultView.getSelection(),i=1==e.rangeCount&&e.getRangeAt(0).collapsed;if(i||t.shiftKey){const t=e.focusNode,r=e.focusOffset,s=o.domPositionToView(t,r);if(null===s)return;let n=!1;const a=s.getLastMatchingPosition(e=>(e.item.is("uiElement")&&(n=!0),!(!e.item.is("uiElement")&&!e.item.is("attributeElement"))));if(n){const t=o.viewPositionToDom(a);i?e.collapse(t.parent,t.offset):e.extend(t.parent,t.offset)}}}}(0,o,e.domConverter),{priority:"low"})}function l(){return null}},"./packages/ckeditor5-engine/theme/placeholder.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-engine/theme/placeholder.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-enter/src/enter.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return l}));var i=o("./packages/ckeditor5-core/src/plugin.js"),r=o("./packages/ckeditor5-core/src/command.js"),s=o("./packages/ckeditor5-enter/src/utils.js");class n extends r.a{execute(){const e=this.editor.model,t=e.document;e.change(o=>{!function(e,t,o,i){const r=o.isCollapsed,n=o.getFirstRange(),c=n.start.parent,l=n.end.parent;if(i.isLimit(c)||i.isLimit(l))return void(r||c!=l||e.deleteContent(o));if(r){const e=Object(s.a)(t.model.schema,o.getAttributes());a(t,n.start),t.setSelectionAttribute(e)}else{const i=!(n.start.isAtStart&&n.end.isAtEnd),r=c==l;e.deleteContent(o,{leaveUnmerged:i}),i&&(r?a(t,o.focus):t.setSelection(l,0))}}(this.editor.model,o,t.selection,e.schema),this.fire("afterExecute",{writer:o})})}}function a(e,t){e.split(t),e.setSelection(t.parent.nextSibling,0)}var c=o("./packages/ckeditor5-enter/src/enterobserver.js");class l extends i.a{static get pluginName(){return"Enter"}init(){const e=this.editor,t=e.editing.view,o=t.document;t.addObserver(c.a),e.commands.add("enter",new n(e)),this.listenTo(o,"enter",(o,i)=>{i.preventDefault(),i.isSoft||(e.execute("enter"),t.scrollToTheSelection())},{priority:"low"})}}},"./packages/ckeditor5-enter/src/enterobserver.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-engine/src/view/observer/observer.js"),r=o("./packages/ckeditor5-engine/src/view/observer/domeventdata.js"),s=o("./packages/ckeditor5-engine/src/view/observer/bubblingeventinfo.js"),n=o("./packages/ckeditor5-utils/src/keyboard.js");class a extends i.a{constructor(e){super(e);const t=this.document;t.on("keydown",(e,o)=>{if(this.isEnabled&&o.keyCode==n.f.enter){const i=new s.a(t,"enter",t.selection.getFirstRange());t.fire(i,new r.a(t,o.domEvent,{isSoft:o.shiftKey})),i.stop.called&&e.stop()}})}observe(){}}},"./packages/ckeditor5-enter/src/utils.js":function(e,t,o){"use strict";function*i(e,t){for(const o of t)o&&e.getAttributeProperties(o[0]).copyOnEnter&&(yield o)}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-typing/src/delete.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return g}));var i=o("./packages/ckeditor5-core/src/plugin.js"),r=o("./packages/ckeditor5-core/src/command.js"),s=o("./packages/ckeditor5-utils/src/count.js"),n=o("./packages/ckeditor5-typing/src/utils/changebuffer.js");class a extends r.a{constructor(e,t){super(e),this.direction=t,this._buffer=new n.a(e.model,e.config.get("typing.undoStep"))}get buffer(){return this._buffer}execute(e={}){const t=this.editor.model,o=t.document;t.enqueueChange(this._buffer.batch,i=>{this._buffer.lock();const r=i.createSelection(e.selection||o.selection),n=e.sequence||1,a=r.isCollapsed;if(r.isCollapsed&&t.modifySelection(r,{direction:this.direction,unit:e.unit}),this._shouldEntireContentBeReplacedWithParagraph(n))return void this._replaceEntireContentWithParagraph(i);if(this._shouldReplaceFirstBlockWithParagraph(r,n))return void this.editor.execute("paragraph",{selection:r});if(r.isCollapsed)return;let c=0;r.getFirstRange().getMinimalFlatRanges().forEach(e=>{c+=Object(s.a)(e.getWalker({singleCharacters:!0,ignoreElementEnd:!0,shallow:!0}))}),t.deleteContent(r,{doNotResetEntireContent:a,direction:this.direction}),this._buffer.input(c),i.setSelection(r),this._buffer.unlock()})}_shouldEntireContentBeReplacedWithParagraph(e){if(e>1)return!1;const t=this.editor.model,o=t.document.selection,i=t.schema.getLimitElement(o);if(!(o.isCollapsed&&o.containsEntireContent(i)))return!1;if(!t.schema.checkChild(i,"paragraph"))return!1;const r=i.getChild(0);return!r||"paragraph"!==r.name}_replaceEntireContentWithParagraph(e){const t=this.editor.model,o=t.document.selection,i=t.schema.getLimitElement(o),r=e.createElement("paragraph");e.remove(e.createRangeIn(i)),e.insert(r,i),e.setSelection(r,0)}_shouldReplaceFirstBlockWithParagraph(e,t){const o=this.editor.model;if(t>1||"backward"!=this.direction)return!1;if(!e.isCollapsed)return!1;const i=e.getFirstPosition(),r=o.schema.getLimitElement(i),s=r.getChild(0);return i.parent==s&&(!!e.containsEntireContent(s)&&(!!o.schema.checkChild(r,"paragraph")&&"paragraph"!=s.name))}}var c=o("./packages/ckeditor5-engine/src/view/observer/observer.js"),l=o("./packages/ckeditor5-engine/src/view/observer/domeventdata.js"),d=o("./packages/ckeditor5-engine/src/view/observer/bubblingeventinfo.js"),u=o("./packages/ckeditor5-utils/src/keyboard.js"),h=o("./packages/ckeditor5-utils/src/env.js");class p extends c.a{constructor(e){super(e);const t=e.document;let o=0;function i(e,o,i){const r=new d.a(t,"delete",t.selection.getFirstRange());t.fire(r,new l.a(t,o,i)),r.stop.called&&e.stop()}t.on("keyup",(e,t)=>{t.keyCode!=u.f.delete&&t.keyCode!=u.f.backspace||(o=0)}),t.on("keydown",(e,t)=>{const r={};if(t.keyCode==u.f.delete)r.direction="forward",r.unit="character";else{if(t.keyCode!=u.f.backspace)return;r.direction="backward",r.unit="codePoint"}const s=h.a.isMac?t.altKey:t.ctrlKey;r.unit=s?"word":r.unit,r.sequence=++o,i(e,t.domEvent,r)}),h.a.isAndroid&&t.on("beforeinput",(t,o)=>{if("deleteContentBackward"!=o.domEvent.inputType)return;const r={unit:"codepoint",direction:"backward",sequence:1},s=o.domTarget.ownerDocument.defaultView.getSelection();s.anchorNode==s.focusNode&&s.anchorOffset+1!=s.focusOffset&&(r.selectionToRemove=e.domConverter.domSelectionToView(s)),i(t,o.domEvent,r)})}observe(){}}class g extends i.a{static get pluginName(){return"Delete"}init(){const e=this.editor,t=e.editing.view,o=t.document;t.addObserver(p);const i=new a(e,"forward");if(e.commands.add("deleteForward",i),e.commands.add("forwardDelete",i),e.commands.add("delete",new a(e,"backward")),this.listenTo(o,"delete",(o,i)=>{const r={unit:i.unit,sequence:i.sequence};if(i.selectionToRemove){const t=e.model.createSelection(),o=[];for(const t of i.selectionToRemove.getRanges())o.push(e.editing.mapper.toModelRange(t));t.setTo(o),r.selection=t}e.execute("forward"==i.direction?"deleteForward":"delete",r),i.preventDefault(),t.scrollToTheSelection()},{priority:"low"}),h.a.isAndroid){let e=null;this.listenTo(o,"delete",(t,o)=>{const i=o.domTarget.ownerDocument.defaultView.getSelection();e={anchorNode:i.anchorNode,anchorOffset:i.anchorOffset,focusNode:i.focusNode,focusOffset:i.focusOffset}},{priority:"lowest"}),this.listenTo(o,"keyup",(t,o)=>{if(e){const t=o.domTarget.ownerDocument.defaultView.getSelection();t.collapse(e.anchorNode,e.anchorOffset),t.extend(e.focusNode,e.focusOffset),e=null}})}}}},"./packages/ckeditor5-typing/src/utils/changebuffer.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return i}));class i{constructor(e,t=20){this.model=e,this.size=0,this.limit=t,this.isLocked=!1,this._changeCallback=(e,t)=>{"transparent"!=t.type&&t!==this._batch&&this._reset(!0)},this._selectionChangeCallback=()=>{this._reset()},this.model.document.on("change",this._changeCallback),this.model.document.selection.on("change:range",this._selectionChangeCallback),this.model.document.selection.on("change:attribute",this._selectionChangeCallback)}get batch(){return this._batch||(this._batch=this.model.createBatch()),this._batch}input(e){this.size+=e,this.size>=this.limit&&this._reset(!0)}lock(){this.isLocked=!0}unlock(){this.isLocked=!1}destroy(){this.model.document.off("change",this._changeCallback),this.model.document.selection.off("change:range",this._selectionChangeCallback),this.model.document.selection.off("change:attribute",this._selectionChangeCallback)}_reset(e){this.isLocked&&!e||(this._batch=null,this.size=0)}}},"./packages/ckeditor5-typing/src/utils/injectunsafekeystrokeshandling.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s})),o.d(t,"b",(function(){return a}));var i=o("./packages/ckeditor5-utils/src/keyboard.js"),r=o("./packages/ckeditor5-utils/src/env.js");function s(e){let t=null;const o=e.model,i=e.editing.view,s=e.commands.get("input");function n(e){const r=o.document,n=i.document.isComposing,l=t&&t.isEqual(r.selection);t=null,s.isEnabled&&(a(e)||r.selection.isCollapsed||n&&229===e.keyCode||!n&&229===e.keyCode&&l||c())}function c(){const e=s.buffer;e.lock();const t=e.batch;s._batches.add(t),o.enqueueChange(t,()=>{o.deleteContent(o.document.selection)}),e.unlock()}r.a.isAndroid?i.document.on("beforeinput",(e,t)=>n(t),{priority:"lowest"}):i.document.on("keydown",(e,t)=>n(t),{priority:"lowest"}),i.document.on("compositionstart",(function(){const e=o.document,t=1!==e.selection.rangeCount||e.selection.getFirstRange().isFlat;if(e.selection.isCollapsed||t)return;c()}),{priority:"lowest"}),i.document.on("compositionend",()=>{t=o.createSelection(o.document.selection)},{priority:"lowest"})}const n=[Object(i.a)("arrowUp"),Object(i.a)("arrowRight"),Object(i.a)("arrowDown"),Object(i.a)("arrowLeft"),9,16,17,18,19,20,27,33,34,35,36,45,91,93,144,145,173,174,175,176,177,178,179,255];for(let e=112;e<=135;e++)n.push(e);function a(e){return!(!e.ctrlKey&&!e.metaKey)||n.includes(e.keyCode)}},"./packages/ckeditor5-ui/src/bindings/clickoutsidehandler.js":function(e,t,o){"use strict";function i({emitter:e,activator:t,callback:o,contextElements:i}){e.listenTo(document,"mousedown",(e,r)=>{if(!t())return;const s="function"==typeof r.composedPath?r.composedPath():[];for(const e of i)if(e.contains(r.target)||s.includes(e))return;o()})}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-ui/src/button/buttonview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-ui/src/view.js"),r=o("./packages/ckeditor5-ui/src/icon/iconview.js"),s=o("./packages/ckeditor5-ui/src/tooltip/tooltipview.js"),n=o("./packages/ckeditor5-utils/src/uid.js"),a=o("./packages/ckeditor5-utils/src/keyboard.js");o("./packages/ckeditor5-ui/theme/components/button/button.css");class c extends i.a{constructor(e){super(e);const t=this.bindTemplate,o=Object(n.a)();this.set("class"),this.set("labelStyle"),this.set("icon"),this.set("isEnabled",!0),this.set("isOn",!1),this.set("isVisible",!0),this.set("isToggleable",!1),this.set("keystroke"),this.set("label"),this.set("tabindex",-1),this.set("tooltip"),this.set("tooltipPosition","s"),this.set("type","button"),this.set("withText",!1),this.set("withKeystroke",!1),this.children=this.createCollection(),this.tooltipView=this._createTooltipView(),this.labelView=this._createLabelView(o),this.iconView=new r.a,this.iconView.extendTemplate({attributes:{class:"ck-button__icon"}}),this.keystrokeView=this._createKeystrokeView(),this.bind("_tooltipString").to(this,"tooltip",this,"label",this,"keystroke",this._getTooltipString.bind(this)),this.setTemplate({tag:"button",attributes:{class:["ck","ck-button",t.to("class"),t.if("isEnabled","ck-disabled",e=>!e),t.if("isVisible","ck-hidden",e=>!e),t.to("isOn",e=>e?"ck-on":"ck-off"),t.if("withText","ck-button_with-text"),t.if("withKeystroke","ck-button_with-keystroke")],type:t.to("type",e=>e||"button"),tabindex:t.to("tabindex"),"aria-labelledby":"ck-editor__aria-label_"+o,"aria-disabled":t.if("isEnabled",!0,e=>!e),"aria-pressed":t.to("isOn",e=>!!this.isToggleable&&String(e))},children:this.children,on:{mousedown:t.to(e=>{e.preventDefault()}),click:t.to(e=>{this.isEnabled?this.fire("execute"):e.preventDefault()})}})}render(){super.render(),this.icon&&(this.iconView.bind("content").to(this,"icon"),this.children.add(this.iconView)),this.children.add(this.tooltipView),this.children.add(this.labelView),this.withKeystroke&&this.children.add(this.keystrokeView)}focus(){this.element.focus()}_createTooltipView(){const e=new s.a;return e.bind("text").to(this,"_tooltipString"),e.bind("position").to(this,"tooltipPosition"),e}_createLabelView(e){const t=new i.a,o=this.bindTemplate;return t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__label"],style:o.to("labelStyle"),id:"ck-editor__aria-label_"+e},children:[{text:this.bindTemplate.to("label")}]}),t}_createKeystrokeView(){const e=new i.a;return e.setTemplate({tag:"span",attributes:{class:["ck","ck-button__keystroke"]},children:[{text:this.bindTemplate.to("keystroke",e=>Object(a.b)(e))}]}),e}_getTooltipString(e,t,o){return e?"string"==typeof e?e:(o&&(o=Object(a.b)(o)),e instanceof Function?e(t,o):`${t}${o?` (${o})`:""}`):""}}},"./packages/ckeditor5-ui/src/button/switchbuttonview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-ui/src/view.js"),r=o("./packages/ckeditor5-ui/src/button/buttonview.js");o("./packages/ckeditor5-ui/theme/components/button/switchbutton.css");class s extends r.a{constructor(e){super(e),this.isToggleable=!0,this.toggleSwitchView=this._createToggleView(),this.extendTemplate({attributes:{class:"ck-switchbutton"}})}render(){super.render(),this.children.add(this.toggleSwitchView)}_createToggleView(){const e=new i.a;return e.setTemplate({tag:"span",attributes:{class:["ck","ck-button__toggle"]},children:[{tag:"span",attributes:{class:["ck","ck-button__toggle__inner"]}}]}),e}}},"./packages/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return n}));var i=o("./packages/ckeditor5-ui/src/button/buttonview.js"),r=o("./packages/ckeditor5-ui/theme/icons/dropdown-arrow.svg"),s=o("./packages/ckeditor5-ui/src/icon/iconview.js");class n extends i.a{constructor(e){super(e),this.arrowView=this._createArrowView(),this.extendTemplate({attributes:{"aria-haspopup":!0}}),this.delegate("execute").to(this,"open")}render(){super.render(),this.children.add(this.arrowView)}_createArrowView(){const e=new s.a;return e.content=r.a,e.extendTemplate({attributes:{class:"ck-dropdown__arrow"}}),e}}},"./packages/ckeditor5-ui/src/dropdown/utils.js":function(e,t,o){"use strict";o.d(t,"c",(function(){return m})),o.d(t,"b",(function(){return k})),o.d(t,"a",(function(){return b}));var i=o("./packages/ckeditor5-ui/src/view.js");class r extends i.a{constructor(e){super(e);const t=this.bindTemplate;this.set("isVisible",!1),this.set("position","se"),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-dropdown__panel",t.to("position",e=>"ck-dropdown__panel_"+e),t.if("isVisible","ck-dropdown__panel-visible")]},children:this.children,on:{selectstart:t.to(e=>e.preventDefault())}})}focus(){this.children.length&&this.children.first.focus()}focusLast(){if(this.children.length){const e=this.children.last;"function"==typeof e.focusLast?e.focusLast():e.focus()}}}var s=o("./packages/ckeditor5-utils/src/keystrokehandler.js"),n=(o("./packages/ckeditor5-ui/theme/components/dropdown/dropdown.css"),o("./packages/ckeditor5-utils/src/dom/position.js"));class a extends i.a{constructor(e,t,o){super(e);const i=this.bindTemplate;this.buttonView=t,this.panelView=o,this.set("isOpen",!1),this.set("isEnabled",!0),this.set("class"),this.set("id"),this.set("panelPosition","auto"),this.keystrokes=new s.a,this.setTemplate({tag:"div",attributes:{class:["ck","ck-dropdown",i.to("class"),i.if("isEnabled","ck-disabled",e=>!e)],id:i.to("id"),"aria-describedby":i.to("ariaDescribedById")},children:[t,o]}),t.extendTemplate({attributes:{class:["ck-dropdown__button"]}})}render(){super.render(),this.listenTo(this.buttonView,"open",()=>{this.isOpen=!this.isOpen}),this.panelView.bind("isVisible").to(this,"isOpen"),this.on("change:isOpen",()=>{this.isOpen&&("auto"===this.panelPosition?this.panelView.position=a._getOptimalPosition({element:this.panelView.element,target:this.buttonView.element,fitInViewport:!0,positions:this._panelPositions}).name:this.panelView.position=this.panelPosition)}),this.keystrokes.listenTo(this.element);const e=(e,t)=>{this.isOpen&&(this.buttonView.focus(),this.isOpen=!1,t())};this.keystrokes.set("arrowdown",(e,t)=>{this.buttonView.isEnabled&&!this.isOpen&&(this.isOpen=!0,t())}),this.keystrokes.set("arrowright",(e,t)=>{this.isOpen&&t()}),this.keystrokes.set("arrowleft",e),this.keystrokes.set("esc",e)}focus(){this.buttonView.focus()}get _panelPositions(){const{south:e,north:t,southEast:o,southWest:i,northEast:r,northWest:s,southMiddleEast:n,southMiddleWest:c,northMiddleEast:l,northMiddleWest:d}=a.defaultPanelPositions;return"rtl"!==this.locale.uiLanguageDirection?[o,i,n,c,e,r,s,l,d,t]:[i,o,c,n,e,s,r,d,l,t]}}a.defaultPanelPositions={south:(e,t)=>({top:e.bottom,left:e.left-(t.width-e.width)/2,name:"s"}),southEast:e=>({top:e.bottom,left:e.left,name:"se"}),southWest:(e,t)=>({top:e.bottom,left:e.left-t.width+e.width,name:"sw"}),southMiddleEast:(e,t)=>({top:e.bottom,left:e.left-(t.width-e.width)/4,name:"sme"}),southMiddleWest:(e,t)=>({top:e.bottom,left:e.left-3*(t.width-e.width)/4,name:"smw"}),north:(e,t)=>({top:e.top-t.height,left:e.left-(t.width-e.width)/2,name:"n"}),northEast:(e,t)=>({top:e.top-t.height,left:e.left,name:"ne"}),northWest:(e,t)=>({top:e.top-t.height,left:e.left-t.width+e.width,name:"nw"}),northMiddleEast:(e,t)=>({top:e.top-t.height,left:e.left-(t.width-e.width)/4,name:"nme"}),northMiddleWest:(e,t)=>({top:e.top-t.height,left:e.left-3*(t.width-e.width)/4,name:"nmw"})},a._getOptimalPosition=n.a;var c=o("./packages/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js"),l=o("./packages/ckeditor5-ui/src/toolbar/toolbarview.js"),d=o("./packages/ckeditor5-ui/src/list/listview.js"),u=o("./packages/ckeditor5-ui/src/list/listitemview.js");class h extends i.a{constructor(e){super(e),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__separator"]}})}}var p=o("./packages/ckeditor5-ui/src/button/buttonview.js"),g=o("./packages/ckeditor5-ui/src/button/switchbuttonview.js"),f=o("./packages/ckeditor5-ui/src/bindings/clickoutsidehandler.js");o("./packages/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css"),o("./packages/ckeditor5-ui/theme/components/dropdown/listdropdown.css");function m(e,t=c.a){const o=new t(e),i=new r(e),s=new a(e,o,i);return o.bind("isEnabled").to(s),o instanceof c.a?o.bind("isOn").to(s,"isOpen"):o.arrowView.bind("isOn").to(s,"isOpen"),function(e){(function(e){e.on("render",()=>{Object(f.a)({emitter:e,activator:()=>e.isOpen,callback:()=>{e.isOpen=!1},contextElements:[e.element]})})})(e),function(e){e.on("execute",t=>{t.source instanceof g.a||(e.isOpen=!1)})}(e),function(e){e.keystrokes.set("arrowdown",(t,o)=>{e.isOpen&&(e.panelView.focus(),o())}),e.keystrokes.set("arrowup",(t,o)=>{e.isOpen&&(e.panelView.focusLast(),o())})}(e)}(s),s}function k(e,t){const o=e.locale,i=o.t,r=e.toolbarView=new l.a(o);r.set("ariaLabel",i("Dropdown toolbar")),e.extendTemplate({attributes:{class:["ck-toolbar-dropdown"]}}),t.map(e=>r.items.add(e)),e.panelView.children.add(r),r.items.delegate("execute").to(e)}function b(e,t){const o=e.locale,i=e.listView=new d.a(o);i.items.bindTo(t).using(({type:e,model:t})=>{if("separator"===e)return new h(o);if("button"===e||"switchbutton"===e){const i=new u.a(o);let r;return r="button"===e?new p.a(o):new g.a(o),r.bind(...Object.keys(t)).to(t),r.delegate("execute").to(i),i.children.add(r),i}}),e.panelView.children.add(i),i.items.delegate("execute").to(e)}},"./packages/ckeditor5-ui/src/focuscycler.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-utils/src/dom/global.js");class r{constructor(e){if(Object.assign(this,e),e.actions&&e.keystrokeHandler)for(const t in e.actions){let o=e.actions[t];"string"==typeof o&&(o=[o]);for(const i of o)e.keystrokeHandler.set(i,(e,o)=>{this[t](),o()})}}get first(){return this.focusables.find(s)||null}get last(){return this.focusables.filter(s).slice(-1)[0]||null}get next(){return this._getFocusableItem(1)}get previous(){return this._getFocusableItem(-1)}get current(){let e=null;return null===this.focusTracker.focusedElement?null:(this.focusables.find((t,o)=>{const i=t.element===this.focusTracker.focusedElement;return i&&(e=o),i}),e)}focusFirst(){this._focus(this.first)}focusLast(){this._focus(this.last)}focusNext(){this._focus(this.next)}focusPrevious(){this._focus(this.previous)}_focus(e){e&&e.focus()}_getFocusableItem(e){const t=this.current,o=this.focusables.length;if(!o)return null;if(null===t)return this[1===e?"first":"last"];let i=(t+o+e)%o;do{const t=this.focusables.get(i);if(s(t))return t;i=(i+o+e)%o}while(i!==t);return null}}function s(e){return!(!e.focus||"none"==i.a.window.getComputedStyle(e.element).display)}},"./packages/ckeditor5-ui/src/icon/iconview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-ui/src/view.js");o("./packages/ckeditor5-ui/theme/components/icon/icon.css");class r extends i.a{constructor(){super();const e=this.bindTemplate;this.set("content",""),this.set("viewBox","0 0 20 20"),this.set("fillColor",""),this.setTemplate({tag:"svg",ns:"http://www.w3.org/2000/svg",attributes:{class:["ck","ck-icon"],viewBox:e.to("viewBox")}})}render(){super.render(),this._updateXMLContent(),this._colorFillPaths(),this.on("change:content",()=>{this._updateXMLContent(),this._colorFillPaths()}),this.on("change:fillColor",()=>{this._colorFillPaths()})}_updateXMLContent(){if(this.content){const e=(new DOMParser).parseFromString(this.content.trim(),"image/svg+xml").querySelector("svg"),t=e.getAttribute("viewBox");for(t&&(this.viewBox=t),this.element.innerHTML="";e.childNodes.length>0;)this.element.appendChild(e.childNodes[0])}}_colorFillPaths(){this.fillColor&&this.element.querySelectorAll(".ck-icon__fill").forEach(e=>{e.style.fill=this.fillColor})}}},"./packages/ckeditor5-ui/src/list/listitemview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-ui/src/view.js");class r extends i.a{constructor(e){super(e),this.children=this.createCollection(),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__item"]},children:this.children})}focus(){this.children.first.focus()}}},"./packages/ckeditor5-ui/src/list/listview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-ui/src/view.js"),r=o("./packages/ckeditor5-utils/src/focustracker.js"),s=o("./packages/ckeditor5-ui/src/focuscycler.js"),n=o("./packages/ckeditor5-utils/src/keystrokehandler.js");o("./packages/ckeditor5-ui/theme/components/list/list.css");class a extends i.a{constructor(){super(),this.items=this.createCollection(),this.focusTracker=new r.a,this.keystrokes=new n.a,this._focusCycler=new s.a({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowup",focusNext:"arrowdown"}}),this.setTemplate({tag:"ul",attributes:{class:["ck","ck-reset","ck-list"]},children:this.items})}render(){super.render();for(const e of this.items)this.focusTracker.add(e.element);this.items.on("add",(e,t)=>{this.focusTracker.add(t.element)}),this.items.on("remove",(e,t)=>{this.focusTracker.remove(t.element)}),this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}}},"./packages/ckeditor5-ui/src/panel/balloon/balloonpanelview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return u}));var i=o("./packages/ckeditor5-ui/src/view.js"),r=o("./packages/ckeditor5-utils/src/dom/position.js"),s=o("./packages/ckeditor5-utils/src/dom/isrange.js"),n=o("./packages/ckeditor5-utils/src/dom/tounit.js"),a=o("./packages/ckeditor5-utils/src/dom/global.js"),c=o("./node_modules/lodash-es/isElement.js");o("./packages/ckeditor5-ui/theme/components/panel/balloonpanel.css");const l=Object(n.a)("px"),d=a.a.document.body;class u extends i.a{constructor(e){super(e);const t=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("position","arrow_nw"),this.set("isVisible",!1),this.set("withArrow",!0),this.set("class"),this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-panel",t.to("position",e=>"ck-balloon-panel_"+e),t.if("isVisible","ck-balloon-panel_visible"),t.if("withArrow","ck-balloon-panel_with-arrow"),t.to("class")],style:{top:t.to("top",l),left:t.to("left",l)}},children:this.content})}show(){this.isVisible=!0}hide(){this.isVisible=!1}attachTo(e){this.show();const t=u.defaultPositions,o=Object.assign({},{element:this.element,positions:[t.southArrowNorth,t.southArrowNorthMiddleWest,t.southArrowNorthMiddleEast,t.southArrowNorthWest,t.southArrowNorthEast,t.northArrowSouth,t.northArrowSouthMiddleWest,t.northArrowSouthMiddleEast,t.northArrowSouthWest,t.northArrowSouthEast],limiter:d,fitInViewport:!0},e),i=u._getOptimalPosition(o),r=parseInt(i.left),s=parseInt(i.top),n=i.name;Object.assign(this,{top:s,left:r,position:n})}pin(e){this.unpin(),this._pinWhenIsVisibleCallback=()=>{this.isVisible?this._startPinning(e):this._stopPinning()},this._startPinning(e),this.listenTo(this,"change:isVisible",this._pinWhenIsVisibleCallback)}unpin(){this._pinWhenIsVisibleCallback&&(this._stopPinning(),this.stopListening(this,"change:isVisible",this._pinWhenIsVisibleCallback),this._pinWhenIsVisibleCallback=null,this.hide())}_startPinning(e){this.attachTo(e);const t=h(e.target),o=e.limiter?h(e.limiter):d;this.listenTo(a.a.document,"scroll",(i,r)=>{const s=r.target,n=t&&s.contains(t),a=o&&s.contains(o);!n&&!a&&t&&o||this.attachTo(e)},{useCapture:!0}),this.listenTo(a.a.window,"resize",()=>{this.attachTo(e)})}_stopPinning(){this.stopListening(a.a.document,"scroll"),this.stopListening(a.a.window,"resize")}}function h(e){return Object(c.a)(e)?e:Object(s.a)(e)?e.commonAncestorContainer:"function"==typeof e?h(e()):null}function p(e,t){return e.top-t.height-u.arrowVerticalOffset}function g(e){return e.bottom+u.arrowVerticalOffset}u.arrowHorizontalOffset=25,u.arrowVerticalOffset=10,u._getOptimalPosition=r.a,u.defaultPositions={northWestArrowSouthWest:(e,t)=>({top:p(e,t),left:e.left-u.arrowHorizontalOffset,name:"arrow_sw"}),northWestArrowSouthMiddleWest:(e,t)=>({top:p(e,t),left:e.left-.25*t.width-u.arrowHorizontalOffset,name:"arrow_smw"}),northWestArrowSouth:(e,t)=>({top:p(e,t),left:e.left-t.width/2,name:"arrow_s"}),northWestArrowSouthMiddleEast:(e,t)=>({top:p(e,t),left:e.left-.75*t.width+u.arrowHorizontalOffset,name:"arrow_sme"}),northWestArrowSouthEast:(e,t)=>({top:p(e,t),left:e.left-t.width+u.arrowHorizontalOffset,name:"arrow_se"}),northArrowSouthWest:(e,t)=>({top:p(e,t),left:e.left+e.width/2-u.arrowHorizontalOffset,name:"arrow_sw"}),northArrowSouthMiddleWest:(e,t)=>({top:p(e,t),left:e.left+e.width/2-.25*t.width-u.arrowHorizontalOffset,name:"arrow_smw"}),northArrowSouth:(e,t)=>({top:p(e,t),left:e.left+e.width/2-t.width/2,name:"arrow_s"}),northArrowSouthMiddleEast:(e,t)=>({top:p(e,t),left:e.left+e.width/2-.75*t.width+u.arrowHorizontalOffset,name:"arrow_sme"}),northArrowSouthEast:(e,t)=>({top:p(e,t),left:e.left+e.width/2-t.width+u.arrowHorizontalOffset,name:"arrow_se"}),northEastArrowSouthWest:(e,t)=>({top:p(e,t),left:e.right-u.arrowHorizontalOffset,name:"arrow_sw"}),northEastArrowSouthMiddleWest:(e,t)=>({top:p(e,t),left:e.right-.25*t.width-u.arrowHorizontalOffset,name:"arrow_smw"}),northEastArrowSouth:(e,t)=>({top:p(e,t),left:e.right-t.width/2,name:"arrow_s"}),northEastArrowSouthMiddleEast:(e,t)=>({top:p(e,t),left:e.right-.75*t.width+u.arrowHorizontalOffset,name:"arrow_sme"}),northEastArrowSouthEast:(e,t)=>({top:p(e,t),left:e.right-t.width+u.arrowHorizontalOffset,name:"arrow_se"}),southWestArrowNorthWest:(e,t)=>({top:g(e),left:e.left-u.arrowHorizontalOffset,name:"arrow_nw"}),southWestArrowNorthMiddleWest:(e,t)=>({top:g(e),left:e.left-.25*t.width-u.arrowHorizontalOffset,name:"arrow_nmw"}),southWestArrowNorth:(e,t)=>({top:g(e),left:e.left-t.width/2,name:"arrow_n"}),southWestArrowNorthMiddleEast:(e,t)=>({top:g(e),left:e.left-.75*t.width+u.arrowHorizontalOffset,name:"arrow_nme"}),southWestArrowNorthEast:(e,t)=>({top:g(e),left:e.left-t.width+u.arrowHorizontalOffset,name:"arrow_ne"}),southArrowNorthWest:(e,t)=>({top:g(e),left:e.left+e.width/2-u.arrowHorizontalOffset,name:"arrow_nw"}),southArrowNorthMiddleWest:(e,t)=>({top:g(e),left:e.left+e.width/2-.25*t.width-u.arrowHorizontalOffset,name:"arrow_nmw"}),southArrowNorth:(e,t)=>({top:g(e),left:e.left+e.width/2-t.width/2,name:"arrow_n"}),southArrowNorthMiddleEast:(e,t)=>({top:g(e),left:e.left+e.width/2-.75*t.width+u.arrowHorizontalOffset,name:"arrow_nme"}),southArrowNorthEast:(e,t)=>({top:g(e),left:e.left+e.width/2-t.width+u.arrowHorizontalOffset,name:"arrow_ne"}),southEastArrowNorthWest:(e,t)=>({top:g(e),left:e.right-u.arrowHorizontalOffset,name:"arrow_nw"}),southEastArrowNorthMiddleWest:(e,t)=>({top:g(e),left:e.right-.25*t.width-u.arrowHorizontalOffset,name:"arrow_nmw"}),southEastArrowNorth:(e,t)=>({top:g(e),left:e.right-t.width/2,name:"arrow_n"}),southEastArrowNorthMiddleEast:(e,t)=>({top:g(e),left:e.right-.75*t.width+u.arrowHorizontalOffset,name:"arrow_nme"}),southEastArrowNorthEast:(e,t)=>({top:g(e),left:e.right-t.width+u.arrowHorizontalOffset,name:"arrow_ne"})}},"./packages/ckeditor5-ui/src/panel/balloon/contextualballoon.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return h}));var i=o("./src/core.js"),r=o("./packages/ckeditor5-ui/src/panel/balloon/balloonpanelview.js"),s=o("./packages/ckeditor5-ui/src/view.js"),n=o("./packages/ckeditor5-ui/src/button/buttonview.js"),a=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),c=o("./packages/ckeditor5-utils/src/focustracker.js"),l=o("./packages/ckeditor5-utils/src/dom/tounit.js"),d=o("./packages/ckeditor5-utils/src/dom/rect.js");o("./packages/ckeditor5-ui/theme/components/panel/balloonrotator.css"),o("./packages/ckeditor5-ui/theme/components/panel/fakepanel.css");const u=Object(l.a)("px");class h extends i.Plugin{static get pluginName(){return"ContextualBalloon"}constructor(e){super(e),this.positionLimiter=()=>{const e=this.editor.editing.view,t=e.document.selection.editableElement;return t?e.domConverter.mapViewToDom(t.root):null},this.set("visibleView",null),this.view=new r.a(e.locale),e.ui.view.body.add(this.view),e.ui.focusTracker.add(this.view.element),this._viewToStack=new Map,this._idToStack=new Map,this.set("_numberOfStacks",0),this.set("_singleViewMode",!1),this._rotatorView=this._createRotatorView(),this._fakePanelsView=this._createFakePanelsView()}hasView(e){return Array.from(this._viewToStack.keys()).includes(e)}add(e){if(this.hasView(e.view))throw new a.a("contextualballoon-add-view-exist",[this,e]);const t=e.stackId||"main";if(!this._idToStack.has(t))return this._idToStack.set(t,new Map([[e.view,e]])),this._viewToStack.set(e.view,this._idToStack.get(t)),this._numberOfStacks=this._idToStack.size,void(this._visibleStack&&!e.singleViewMode||this.showStack(t));const o=this._idToStack.get(t);e.singleViewMode&&this.showStack(t),o.set(e.view,e),this._viewToStack.set(e.view,o),o===this._visibleStack&&this._showView(e)}remove(e){if(!this.hasView(e))throw new a.a("contextualballoon-remove-view-not-exist",[this,e]);const t=this._viewToStack.get(e);this._singleViewMode&&this.visibleView===e&&(this._singleViewMode=!1),this.visibleView===e&&(1===t.size?this._idToStack.size>1?this._showNextStack():(this.view.hide(),this.visibleView=null,this._rotatorView.hideView()):this._showView(Array.from(t.values())[t.size-2])),1===t.size?(this._idToStack.delete(this._getStackId(t)),this._numberOfStacks=this._idToStack.size):t.delete(e),this._viewToStack.delete(e)}updatePosition(e){e&&(this._visibleStack.get(this.visibleView).position=e),this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition()}showStack(e){this.visibleStack=e;const t=this._idToStack.get(e);if(!t)throw new a.a("contextualballoon-showstack-stack-not-exist",this);this._visibleStack!==t&&this._showView(Array.from(t.values()).pop())}get _visibleStack(){return this._viewToStack.get(this.visibleView)}_getStackId(e){return Array.from(this._idToStack.entries()).find(t=>t[1]===e)[0]}_showNextStack(){const e=Array.from(this._idToStack.values());let t=e.indexOf(this._visibleStack)+1;e[t]||(t=0),this.showStack(this._getStackId(e[t]))}_showPrevStack(){const e=Array.from(this._idToStack.values());let t=e.indexOf(this._visibleStack)-1;e[t]||(t=e.length-1),this.showStack(this._getStackId(e[t]))}_createRotatorView(){const e=new p(this.editor.locale),t=this.editor.locale.t;return this.view.content.add(e),e.bind("isNavigationVisible").to(this,"_numberOfStacks",this,"_singleViewMode",(e,t)=>!t&&e>1),e.on("change:isNavigationVisible",()=>this.updatePosition(),{priority:"low"}),e.bind("counter").to(this,"visibleView",this,"_numberOfStacks",(e,o)=>{if(o<2)return"";const i=Array.from(this._idToStack.values()).indexOf(this._visibleStack)+1;return t("%0 of %1",[i,o])}),e.buttonNextView.on("execute",()=>{e.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showNextStack()}),e.buttonPrevView.on("execute",()=>{e.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showPrevStack()}),e}_createFakePanelsView(){const e=new g(this.editor.locale,this.view);return e.bind("numberOfPanels").to(this,"_numberOfStacks",this,"_singleViewMode",(e,t)=>!t&&e>=2?Math.min(e-1,2):0),e.listenTo(this.view,"change:top",()=>e.updatePosition()),e.listenTo(this.view,"change:left",()=>e.updatePosition()),this.editor.ui.view.body.add(e),e}_showView({view:e,balloonClassName:t="",withArrow:o=!0,singleViewMode:i=!1}){this.view.class=t,this.view.withArrow=o,this._rotatorView.showView(e),this.visibleView=e,this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition(),i&&(this._singleViewMode=!0)}_getBalloonPosition(){let e=Array.from(this._visibleStack.values()).pop().position;return e&&!e.limiter&&(e=Object.assign({},e,{limiter:this.positionLimiter})),e}}class p extends s.a{constructor(e){super(e);const t=e.t,o=this.bindTemplate;this.set("isNavigationVisible",!0),this.focusTracker=new c.a,this.buttonPrevView=this._createButtonView(t("Previous"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M11.463 5.187a.888.888 0 1 1 1.254 1.255L9.16 10l3.557 3.557a.888.888 0 1 1-1.254 1.255L7.26 10.61a.888.888 0 0 1 .16-1.382l4.043-4.042z"/></svg>'),this.buttonNextView=this._createButtonView(t("Next"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M8.537 14.813a.888.888 0 1 1-1.254-1.255L10.84 10 7.283 6.442a.888.888 0 1 1 1.254-1.255L12.74 9.39a.888.888 0 0 1-.16 1.382l-4.043 4.042z"/></svg>'),this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-rotator"],"z-index":"-1"},children:[{tag:"div",attributes:{class:["ck-balloon-rotator__navigation",o.to("isNavigationVisible",e=>e?"":"ck-hidden")]},children:[this.buttonPrevView,{tag:"span",attributes:{class:["ck-balloon-rotator__counter"]},children:[{text:o.to("counter")}]},this.buttonNextView]},{tag:"div",attributes:{class:"ck-balloon-rotator__content"},children:this.content}]})}render(){super.render(),this.focusTracker.add(this.element)}showView(e){this.hideView(),this.content.add(e)}hideView(){this.content.clear()}_createButtonView(e,t){const o=new n.a(this.locale);return o.set({label:e,icon:t,tooltip:!0}),o}}class g extends s.a{constructor(e,t){super(e);const o=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("height",0),this.set("width",0),this.set("numberOfPanels",0),this.content=this.createCollection(),this._balloonPanelView=t,this.setTemplate({tag:"div",attributes:{class:["ck-fake-panel",o.to("numberOfPanels",e=>e?"":"ck-hidden")],style:{top:o.to("top",u),left:o.to("left",u),width:o.to("width",u),height:o.to("height",u)}},children:this.content}),this.on("change:numberOfPanels",(e,t,o,i)=>{o>i?this._addPanels(o-i):this._removePanels(i-o),this.updatePosition()})}_addPanels(e){for(;e--;){const e=new s.a;e.setTemplate({tag:"div"}),this.content.add(e),this.registerChild(e)}}_removePanels(e){for(;e--;){const e=this.content.last;this.content.remove(e),this.deregisterChild(e),e.destroy()}}updatePosition(){if(this.numberOfPanels){const{top:e,left:t}=this._balloonPanelView,{width:o,height:i}=new d.a(this._balloonPanelView.element);Object.assign(this,{top:e,left:t,width:o,height:i})}}}},"./packages/ckeditor5-ui/src/template.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return h}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),r=o("./packages/ckeditor5-utils/src/mix.js"),s=o("./packages/ckeditor5-utils/src/emittermixin.js"),n=o("./packages/ckeditor5-ui/src/view.js"),a=o("./packages/ckeditor5-ui/src/viewcollection.js"),c=o("./packages/ckeditor5-utils/src/dom/isnode.js"),l=o("./node_modules/lodash-es/isObject.js"),d=o("./node_modules/lodash-es/cloneDeepWith.js"),u=o("./packages/ckeditor5-utils/src/toarray.js");class h{constructor(e){Object.assign(this,y(v(e))),this._isRendered=!1,this._revertData=null}render(){const e=this._renderNode({intoFragment:!0});return this._isRendered=!0,e}apply(e){return this._revertData={children:[],bindings:[],attributes:{}},this._renderNode({node:e,isApplying:!0,revertData:this._revertData}),e}revert(e){if(!this._revertData)throw new i.a("ui-template-revert-not-applied",[this,e]);this._revertTemplateFromNode(e,this._revertData)}*getViews(){yield*function*e(t){if(t.children)for(const o of t.children)A(o)?yield o:T(o)&&(yield*e(o))}(this)}static bind(e,t){return{to:(o,i)=>new g({eventNameOrFunction:o,attribute:o,observable:e,emitter:t,callback:i}),if:(o,i,r)=>new f({observable:e,emitter:t,attribute:o,valueIfTrue:i,callback:r})}}static extend(e,t){if(e._isRendered)throw new i.a("template-extend-render",[this,e]);!function e(t,o){o.attributes&&(t.attributes||(t.attributes={}),P(t.attributes,o.attributes));o.eventListeners&&(t.eventListeners||(t.eventListeners={}),P(t.eventListeners,o.eventListeners));o.text&&t.text.push(...o.text);if(o.children&&o.children.length){if(t.children.length!=o.children.length)throw new i.a("ui-template-extend-children-mismatch",t);let r=0;for(const i of o.children)e(t.children[r++],i)}}(e,y(v(t)))}_renderNode(e){let t;if(t=e.node?this.tag&&this.text:this.tag?this.text:!this.text,t)throw new i.a("ui-template-wrong-syntax",this);return this.text?this._renderText(e):this._renderElement(e)}_renderElement(e){let t=e.node;return t||(t=e.node=document.createElementNS(this.ns||"http://www.w3.org/1999/xhtml",this.tag)),this._renderAttributes(e),this._renderElementChildren(e),this._setUpListeners(e),t}_renderText(e){let t=e.node;return t?e.revertData.text=t.textContent:t=e.node=document.createTextNode(""),m(this.text)?this._bindToObservable({schema:this.text,updater:b(t),data:e}):t.textContent=this.text.join(""),t}_renderAttributes(e){let t,o,i,r;if(!this.attributes)return;const s=e.node,n=e.revertData;for(t in this.attributes)if(i=s.getAttribute(t),o=this.attributes[t],n&&(n.attributes[t]=i),r=Object(l.a)(o[0])&&o[0].ns?o[0].ns:null,m(o)){const a=r?o[0].value:o;n&&E(t)&&a.unshift(i),this._bindToObservable({schema:a,updater:_(s,t,r),data:e})}else"style"==t&&"string"!=typeof o[0]?this._renderStyleAttribute(o[0],e):(n&&i&&E(t)&&o.unshift(i),o=o.map(e=>e&&e.value||e).reduce((e,t)=>e.concat(t),[]).reduce(x,""),O(o)||s.setAttributeNS(r,t,o))}_renderStyleAttribute(e,t){const o=t.node;for(const i in e){const r=e[i];m(r)?this._bindToObservable({schema:[r],updater:w(o,i),data:t}):o.style[i]=r}}_renderElementChildren(e){const t=e.node,o=e.intoFragment?document.createDocumentFragment():t,i=e.isApplying;let r=0;for(const s of this.children)if(C(s)){if(!i){s.setParent(t);for(const e of s)o.appendChild(e.element)}}else if(A(s))i||(s.isRendered||s.render(),o.appendChild(s.element));else if(Object(c.a)(s))o.appendChild(s);else if(i){const t={children:[],bindings:[],attributes:{}};e.revertData.children.push(t),s._renderNode({node:o.childNodes[r++],isApplying:!0,revertData:t})}else o.appendChild(s.render());e.intoFragment&&t.appendChild(o)}_setUpListeners(e){if(this.eventListeners)for(const t in this.eventListeners){const o=this.eventListeners[t].map(o=>{const[i,r]=t.split("@");return o.activateDomEventListener(i,r,e)});e.revertData&&e.revertData.bindings.push(o)}}_bindToObservable({schema:e,updater:t,data:o}){const i=o.revertData;k(e,t,o);const r=e.filter(e=>!O(e)).filter(e=>e.observable).map(i=>i.activateAttributeListener(e,t,o));i&&i.bindings.push(r)}_revertTemplateFromNode(e,t){for(const e of t.bindings)for(const t of e)t();if(t.text)e.textContent=t.text;else{for(const o in t.attributes){const i=t.attributes[o];null===i?e.removeAttribute(o):e.setAttribute(o,i)}for(let o=0;o<t.children.length;++o)this._revertTemplateFromNode(e.childNodes[o],t.children[o])}}}Object(r.a)(h,s.c);class p{constructor(e){Object.assign(this,e)}getValue(e){const t=this.observable[this.attribute];return this.callback?this.callback(t,e):t}activateAttributeListener(e,t,o){const i=()=>k(e,t,o);return this.emitter.listenTo(this.observable,"change:"+this.attribute,i),()=>{this.emitter.stopListening(this.observable,"change:"+this.attribute,i)}}}class g extends p{activateDomEventListener(e,t,o){const i=(e,o)=>{t&&!o.target.matches(t)||("function"==typeof this.eventNameOrFunction?this.eventNameOrFunction(o):this.observable.fire(this.eventNameOrFunction,o))};return this.emitter.listenTo(o.node,e,i),()=>{this.emitter.stopListening(o.node,e,i)}}}class f extends p{getValue(e){return!O(super.getValue(e))&&(this.valueIfTrue||!0)}}function m(e){return!!e&&(e.value&&(e=e.value),Array.isArray(e)?e.some(m):e instanceof p)}function k(e,t,{node:o}){let i=function(e,t){return e.map(e=>e instanceof p?e.getValue(t):e)}(e,o);i=1==e.length&&e[0]instanceof f?i[0]:i.reduce(x,""),O(i)?t.remove():t.set(i)}function b(e){return{set(t){e.textContent=t},remove(){e.textContent=""}}}function _(e,t,o){return{set(i){e.setAttributeNS(o,t,i)},remove(){e.removeAttributeNS(o,t)}}}function w(e,t){return{set(o){e.style[t]=o},remove(){e.style[t]=null}}}function v(e){return Object(d.a)(e,e=>{if(e&&(e instanceof p||T(e)||A(e)||C(e)))return e})}function y(e){if("string"==typeof e?e=function(e){return{text:[e]}}(e):e.text&&function(e){e.text=Object(u.a)(e.text)}(e),e.on&&(e.eventListeners=function(e){for(const t in e)j(e,t);return e}(e.on),delete e.on),!e.text){e.attributes&&function(e){for(const t in e)e[t].value&&(e[t].value=Object(u.a)(e[t].value)),j(e,t)}(e.attributes);const t=[];if(e.children)if(C(e.children))t.push(e.children);else for(const o of e.children)T(o)||A(o)||Object(c.a)(o)?t.push(o):t.push(new h(o));e.children=t}return e}function j(e,t){e[t]=Object(u.a)(e[t])}function x(e,t){return O(t)?e:O(e)?t:`${e} ${t}`}function P(e,t){for(const o in t)e[o]?e[o].push(...t[o]):e[o]=t[o]}function O(e){return!e&&0!==e}function A(e){return e instanceof n.a}function T(e){return e instanceof h}function C(e){return e instanceof a.a}function E(e){return"class"==e||"style"==e}},"./packages/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.js":function(e,t,o){"use strict";function i(e){return Array.isArray(e)?{items:e,removeItems:[]}:e?Object.assign({items:[],removeItems:[]},e):{items:[],removeItems:[]}}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-ui/src/toolbar/toolbarseparatorview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-ui/src/view.js");class r extends i.a{constructor(e){super(e),this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__separator"]}})}}},"./packages/ckeditor5-ui/src/toolbar/toolbarview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return k}));var i=o("./packages/ckeditor5-ui/src/view.js"),r=o("./packages/ckeditor5-utils/src/focustracker.js"),s=o("./packages/ckeditor5-ui/src/focuscycler.js"),n=o("./packages/ckeditor5-utils/src/keystrokehandler.js"),a=o("./packages/ckeditor5-ui/src/toolbar/toolbarseparatorview.js");class c extends i.a{constructor(e){super(e),this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__line-break"]}})}}var l=o("./packages/ckeditor5-utils/src/dom/resizeobserver.js");function d(e){return e.bindTemplate.to(t=>{t.target===e.element&&t.preventDefault()})}var u=o("./packages/ckeditor5-utils/src/dom/rect.js"),h=o("./packages/ckeditor5-utils/src/dom/global.js"),p=o("./packages/ckeditor5-ui/src/dropdown/utils.js"),g=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),f=o("./packages/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.js"),m=o("./src/core.js");o("./packages/ckeditor5-ui/theme/components/toolbar/toolbar.css");class k extends i.a{constructor(e,t){super(e);const o=this.bindTemplate,i=this.t;this.options=t||{},this.set("ariaLabel",i("Editor toolbar")),this.set("maxWidth","auto"),this.items=this.createCollection(),this.focusTracker=new r.a,this.keystrokes=new n.a,this.set("class"),this.set("isCompact",!1),this.itemsView=new b(e),this.children=this.createCollection(),this.children.add(this.itemsView),this.focusables=this.createCollection();const a="rtl"===e.uiLanguageDirection;this._focusCycler=new s.a({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:[a?"arrowright":"arrowleft","arrowup"],focusNext:[a?"arrowleft":"arrowright","arrowdown"]}});const c=["ck","ck-toolbar",o.to("class"),o.if("isCompact","ck-toolbar_compact")];this.options.shouldGroupWhenFull&&this.options.isFloating&&c.push("ck-toolbar_floating"),this.setTemplate({tag:"div",attributes:{class:c,role:"toolbar","aria-label":o.to("ariaLabel"),style:{maxWidth:o.to("maxWidth")}},children:this.children,on:{mousedown:d(this)}}),this._behavior=this.options.shouldGroupWhenFull?new w(this):new _(this)}render(){super.render();for(const e of this.items)this.focusTracker.add(e.element);this.items.on("add",(e,t)=>{this.focusTracker.add(t.element)}),this.items.on("remove",(e,t)=>{this.focusTracker.remove(t.element)}),this.keystrokes.listenTo(this.element),this._behavior.render(this)}destroy(){return this._behavior.destroy(),super.destroy()}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}fillFromConfig(e,t){const o=Object(f.a)(e),i=o.items.filter((e,i,r)=>"|"===e||-1===o.removeItems.indexOf(e)&&("-"===e?!this.options.shouldGroupWhenFull||(Object(g.c)("toolbarview-line-break-ignored-when-grouping-items",r),!1):!!t.has(e)||(Object(g.c)("toolbarview-item-unavailable",{name:e}),!1))),r=this._cleanSeparators(i).map(e=>"|"===e?new a.a:"-"===e?new c:t.create(e));this.items.addMany(r)}_cleanSeparators(e){const t=e=>"-"!==e&&"|"!==e,o=e.length,i=e.findIndex(t),r=o-e.slice().reverse().findIndex(t);return e.slice(i,r).filter((e,o,i)=>{if(t(e))return!0;return!(o>0&&i[o-1]===e)})}}class b extends i.a{constructor(e){super(e),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-toolbar__items"]},children:this.children})}}class _{constructor(e){const t=e.bindTemplate;e.set("isVertical",!1),e.itemsView.children.bindTo(e.items).using(e=>e),e.focusables.bindTo(e.items).using(e=>e),e.extendTemplate({attributes:{class:[t.if("isVertical","ck-toolbar_vertical")]}})}render(){}destroy(){}}class w{constructor(e){this.view=e,this.viewChildren=e.children,this.viewFocusables=e.focusables,this.viewItemsView=e.itemsView,this.viewFocusTracker=e.focusTracker,this.viewLocale=e.locale,this.ungroupedItems=e.createCollection(),this.groupedItems=e.createCollection(),this.groupedItemsDropdown=this._createGroupedItemsDropdown(),this.resizeObserver=null,this.cachedPadding=null,this.shouldUpdateGroupingOnNextResize=!1,e.itemsView.children.bindTo(this.ungroupedItems).using(e=>e),this.ungroupedItems.on("add",this._updateFocusCycleableItems.bind(this)),this.ungroupedItems.on("remove",this._updateFocusCycleableItems.bind(this)),e.children.on("add",this._updateFocusCycleableItems.bind(this)),e.children.on("remove",this._updateFocusCycleableItems.bind(this)),e.items.on("change",(e,t)=>{const o=t.index;for(const e of t.removed)o>=this.ungroupedItems.length?this.groupedItems.remove(e):this.ungroupedItems.remove(e);for(let e=o;e<o+t.added.length;e++){const i=t.added[e-o];e>this.ungroupedItems.length?this.groupedItems.add(i,e-this.ungroupedItems.length):this.ungroupedItems.add(i,e)}this._updateGrouping()}),e.extendTemplate({attributes:{class:["ck-toolbar_grouping"]}})}render(e){this.viewElement=e.element,this._enableGroupingOnResize(),this._enableGroupingOnMaxWidthChange(e)}destroy(){this.groupedItemsDropdown.destroy(),this.resizeObserver.destroy()}_updateGrouping(){if(!this.viewElement.ownerDocument.body.contains(this.viewElement))return;if(!this.viewElement.offsetParent)return void(this.shouldUpdateGroupingOnNextResize=!0);const e=this.groupedItems.length;let t;for(;this._areItemsOverflowing;)this._groupLastItem(),t=!0;if(!t&&this.groupedItems.length){for(;this.groupedItems.length&&!this._areItemsOverflowing;)this._ungroupFirstItem();this._areItemsOverflowing&&this._groupLastItem()}this.groupedItems.length!==e&&this.view.fire("groupedItemsUpdate")}get _areItemsOverflowing(){if(!this.ungroupedItems.length)return!1;const e=this.viewElement,t=this.viewLocale.uiLanguageDirection,o=new u.a(e.lastChild),i=new u.a(e);if(!this.cachedPadding){const o=h.a.window.getComputedStyle(e),i="ltr"===t?"paddingRight":"paddingLeft";this.cachedPadding=Number.parseInt(o[i])}return"ltr"===t?o.right>i.right-this.cachedPadding:o.left<i.left+this.cachedPadding}_enableGroupingOnResize(){let e;this.resizeObserver=new l.a(this.viewElement,t=>{e&&e===t.contentRect.width&&!this.shouldUpdateGroupingOnNextResize||(this.shouldUpdateGroupingOnNextResize=!1,this._updateGrouping(),e=t.contentRect.width)}),this._updateGrouping()}_enableGroupingOnMaxWidthChange(e){e.on("change:maxWidth",()=>{this._updateGrouping()})}_groupLastItem(){this.groupedItems.length||(this.viewChildren.add(new a.a),this.viewChildren.add(this.groupedItemsDropdown),this.viewFocusTracker.add(this.groupedItemsDropdown.element)),this.groupedItems.add(this.ungroupedItems.remove(this.ungroupedItems.last),0)}_ungroupFirstItem(){this.ungroupedItems.add(this.groupedItems.remove(this.groupedItems.first)),this.groupedItems.length||(this.viewChildren.remove(this.groupedItemsDropdown),this.viewChildren.remove(this.viewChildren.last),this.viewFocusTracker.remove(this.groupedItemsDropdown.element))}_createGroupedItemsDropdown(){const e=this.viewLocale,t=e.t,o=Object(p.c)(e);return o.class="ck-toolbar__grouped-dropdown",o.panelPosition="ltr"===e.uiLanguageDirection?"sw":"se",Object(p.b)(o,[]),o.buttonView.set({label:t("Show more items"),tooltip:!0,tooltipPosition:"rtl"===e.uiLanguageDirection?"se":"sw",icon:m.icons.threeVerticalDots}),o.toolbarView.items.bindTo(this.groupedItems).using(e=>e),o}_updateFocusCycleableItems(){this.viewFocusables.clear(),this.ungroupedItems.map(e=>{this.viewFocusables.add(e)}),this.groupedItems.length&&this.viewFocusables.add(this.groupedItemsDropdown)}}},"./packages/ckeditor5-ui/src/tooltip/tooltipview.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-ui/src/view.js");o("./packages/ckeditor5-ui/theme/components/tooltip/tooltip.css");class r extends i.a{constructor(e){super(e),this.set("text",""),this.set("position","s");const t=this.bindTemplate;this.setTemplate({tag:"span",attributes:{class:["ck","ck-tooltip",t.to("position",e=>"ck-tooltip_"+e),t.if("text","ck-hidden",e=>!e.trim())]},children:[{tag:"span",attributes:{class:["ck","ck-tooltip__text"]},children:[{text:t.to("text")}]}]})}}},"./packages/ckeditor5-ui/src/view.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return u}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),r=o("./packages/ckeditor5-ui/src/viewcollection.js"),s=o("./packages/ckeditor5-ui/src/template.js"),n=o("./packages/ckeditor5-utils/src/dom/emittermixin.js"),a=o("./packages/ckeditor5-utils/src/observablemixin.js"),c=o("./packages/ckeditor5-utils/src/collection.js"),l=o("./packages/ckeditor5-utils/src/mix.js"),d=o("./packages/ckeditor5-utils/src/isiterable.js");o("./packages/ckeditor5-ui/theme/globals/globals.css");class u{constructor(e){this.element=null,this.isRendered=!1,this.locale=e,this.t=e&&e.t,this._viewCollections=new c.a,this._unboundChildren=this.createCollection(),this._viewCollections.on("add",(t,o)=>{o.locale=e}),this.decorate("render")}get bindTemplate(){return this._bindTemplate?this._bindTemplate:this._bindTemplate=s.a.bind(this,this)}createCollection(e){const t=new r.a(e);return this._viewCollections.add(t),t}registerChild(e){Object(d.a)(e)||(e=[e]);for(const t of e)this._unboundChildren.add(t)}deregisterChild(e){Object(d.a)(e)||(e=[e]);for(const t of e)this._unboundChildren.remove(t)}setTemplate(e){this.template=new s.a(e)}extendTemplate(e){s.a.extend(this.template,e)}render(){if(this.isRendered)throw new i.a("ui-view-render-already-rendered",this);this.template&&(this.element=this.template.render(),this.registerChild(this.template.getViews())),this.isRendered=!0}destroy(){this.stopListening(),this._viewCollections.map(e=>e.destroy()),this.template&&this.template._revertData&&this.template.revert(this.element)}}Object(l.a)(u,n.a),Object(l.a)(u,a.a)},"./packages/ckeditor5-ui/src/viewcollection.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),r=o("./packages/ckeditor5-utils/src/collection.js");class s extends r.a{constructor(e=[]){super(e,{idProperty:"viewUid"}),this.on("add",(e,t,o)=>{this._renderViewIntoCollectionParent(t,o)}),this.on("remove",(e,t)=>{t.element&&this._parentElement&&t.element.remove()}),this._parentElement=null}destroy(){this.map(e=>e.destroy())}setParent(e){this._parentElement=e;for(const e of this)this._renderViewIntoCollectionParent(e)}delegate(...e){if(!e.length||!e.every(e=>"string"==typeof e))throw new i.a("ui-viewcollection-delegate-wrong-events",this);return{to:t=>{for(const o of this)for(const i of e)o.delegate(i).to(t);this.on("add",(o,i)=>{for(const o of e)i.delegate(o).to(t)}),this.on("remove",(o,i)=>{for(const o of e)i.stopDelegating(o,t)})}}}_renderViewIntoCollectionParent(e,t){e.isRendered||e.render(),e.element&&this._parentElement&&this._parentElement.insertBefore(e.element,this._parentElement.children[t])}}},"./packages/ckeditor5-ui/theme/components/button/button.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/button/button.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/button/switchbutton.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/button/switchbutton.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/colorgrid/colorgrid.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/colorgrid/colorgrid.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/dropdown/dropdown.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/dropdown.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/dropdown/listdropdown.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/listdropdown.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/dropdown/splitbutton.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/splitbutton.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/editorui/editorui.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/editorui/editorui.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/formheader/formheader.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/formheader/formheader.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/icon/icon.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/icon/icon.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/inputtext/inputtext.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/inputtext/inputtext.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/label/label.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/label/label.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/list/list.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/list/list.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/panel/balloonpanel.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/balloonpanel.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/panel/balloonrotator.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/balloonrotator.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/panel/fakepanel.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/fakepanel.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/panel/stickypanel.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/panel/stickypanel.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/toolbar/toolbar.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/toolbar/toolbar.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/components/tooltip/tooltip.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/components/tooltip/tooltip.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/globals/globals.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-ui/theme/globals/globals.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-ui/theme/icons/dropdown-arrow.svg":function(e,t,o){"use strict";t.a='<svg viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg"><path d="M.941 4.523a.75.75 0 1 1 1.06-1.06l3.006 3.005 3.005-3.005a.75.75 0 1 1 1.06 1.06l-3.549 3.55a.75.75 0 0 1-1.168-.136L.941 4.523z"/></svg>'},"./packages/ckeditor5-utils/src/ckeditorerror.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return i})),o.d(t,"c",(function(){return r})),o.d(t,"b",(function(){return s}));class i extends Error{constructor(e,t,o){super(`${e}${o?" "+JSON.stringify(o):""}${n(e)}`),this.name="CKEditorError",this.context=t,this.data=o}is(e){return"CKEditorError"===e}static rethrowUnexpectedError(e,t){if(e.is&&e.is("CKEditorError"))throw e;const o=new i(e.message,t);throw o.stack=e.stack,o}}function r(e,t){console.warn(...a(e,t))}function s(e,t){console.error(...a(e,t))}function n(e){return"\nRead more: https://ckeditor.com/docs/ckeditor5/latest/framework/guides/support/error-codes.html#error-"+e}function a(e,t){const o=n(e);return t?[e,t,o]:[e,o]}},"./packages/ckeditor5-utils/src/collection.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-utils/src/emittermixin.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),s=o("./packages/ckeditor5-utils/src/uid.js"),n=o("./packages/ckeditor5-utils/src/isiterable.js"),a=o("./packages/ckeditor5-utils/src/mix.js");class c{constructor(e={},t={}){const o=Object(n.a)(e);if(o||(t=e),this._items=[],this._itemMap=new Map,this._idProperty=t.idProperty||"id",this._bindToExternalToInternalMap=new WeakMap,this._bindToInternalToExternalMap=new WeakMap,this._skippedIndexesFromExternal=[],o)for(const t of e)this._items.push(t),this._itemMap.set(this._getItemIdBeforeAdding(t),t)}get length(){return this._items.length}get first(){return this._items[0]||null}get last(){return this._items[this.length-1]||null}add(e,t){return this.addMany([e],t)}addMany(e,t){if(void 0===t)t=this._items.length;else if(t>this._items.length||t<0)throw new r.a("collection-add-item-invalid-index",this);for(let o=0;o<e.length;o++){const i=e[o],r=this._getItemIdBeforeAdding(i),s=t+o;this._items.splice(s,0,i),this._itemMap.set(r,i),this.fire("add",i,s)}return this.fire("change",{added:e,removed:[],index:t}),this}get(e){let t;if("string"==typeof e)t=this._itemMap.get(e);else{if("number"!=typeof e)throw new r.a("collection-get-invalid-arg",this);t=this._items[e]}return t||null}has(e){if("string"==typeof e)return this._itemMap.has(e);{const t=e[this._idProperty];return this._itemMap.has(t)}}getIndex(e){let t;return t="string"==typeof e?this._itemMap.get(e):e,this._items.indexOf(t)}remove(e){const[t,o]=this._remove(e);return this.fire("change",{added:[],removed:[t],index:o}),t}map(e,t){return this._items.map(e,t)}find(e,t){return this._items.find(e,t)}filter(e,t){return this._items.filter(e,t)}clear(){this._bindToCollection&&(this.stopListening(this._bindToCollection),this._bindToCollection=null);const e=Array.from(this._items);for(;this.length;)this._remove(0);this.fire("change",{added:[],removed:e,index:0})}bindTo(e){if(this._bindToCollection)throw new r.a("collection-bind-to-rebind",this);return this._bindToCollection=e,{as:e=>{this._setUpBindToBinding(t=>new e(t))},using:e=>{"function"==typeof e?this._setUpBindToBinding(t=>e(t)):this._setUpBindToBinding(t=>t[e])}}}_setUpBindToBinding(e){const t=this._bindToCollection,o=(o,i,r)=>{const s=t._bindToCollection==this,n=t._bindToInternalToExternalMap.get(i);if(s&&n)this._bindToExternalToInternalMap.set(i,n),this._bindToInternalToExternalMap.set(n,i);else{const o=e(i);if(!o)return void this._skippedIndexesFromExternal.push(r);let s=r;for(const e of this._skippedIndexesFromExternal)r>e&&s--;for(const e of t._skippedIndexesFromExternal)s>=e&&s++;this._bindToExternalToInternalMap.set(i,o),this._bindToInternalToExternalMap.set(o,i),this.add(o,s);for(let e=0;e<t._skippedIndexesFromExternal.length;e++)s<=t._skippedIndexesFromExternal[e]&&t._skippedIndexesFromExternal[e]++}};for(const e of t)o(0,e,t.getIndex(e));this.listenTo(t,"add",o),this.listenTo(t,"remove",(e,t,o)=>{const i=this._bindToExternalToInternalMap.get(t);i&&this.remove(i),this._skippedIndexesFromExternal=this._skippedIndexesFromExternal.reduce((e,t)=>(o<t&&e.push(t-1),o>t&&e.push(t),e),[])})}_getItemIdBeforeAdding(e){const t=this._idProperty;let o;if(t in e){if(o=e[t],"string"!=typeof o)throw new r.a("collection-add-invalid-id",this);if(this.get(o))throw new r.a("collection-add-item-already-exists",this)}else e[t]=o=Object(s.a)();return o}_remove(e){let t,o,i,s=!1;const n=this._idProperty;if("string"==typeof e?(o=e,i=this._itemMap.get(o),s=!i,i&&(t=this._items.indexOf(i))):"number"==typeof e?(t=e,i=this._items[t],s=!i,i&&(o=i[n])):(i=e,o=i[n],t=this._items.indexOf(i),s=-1==t||!this._itemMap.get(o)),s)throw new r.a("collection-remove-404",this);this._items.splice(t,1),this._itemMap.delete(o);const a=this._bindToInternalToExternalMap.get(i);return this._bindToInternalToExternalMap.delete(i),this._bindToExternalToInternalMap.delete(a),this.fire("remove",i,t),[i,t]}[Symbol.iterator](){return this._items[Symbol.iterator]()}}Object(a.a)(c,i.c)},"./packages/ckeditor5-utils/src/comparearrays.js":function(e,t,o){"use strict";function i(e,t){const o=Math.min(e.length,t.length);for(let i=0;i<o;i++)if(e[i]!=t[i])return i;return e.length==t.length?"same":e.length<t.length?"prefix":"extension"}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/count.js":function(e,t,o){"use strict";function i(e){let t=0;for(const o of e)t++;return t}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/diff.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-utils/src/fastdiff.js");function r(e,t,o){o=o||function(e,t){return e===t};const i=e.length,s=t.length;if(i>200||s>200||i+s>300)return r.fastDiff(e,t,o,!0);let n,a;if(s<i){const o=e;e=t,t=o,n="delete",a="insert"}else n="insert",a="delete";const c=e.length,l=t.length,d=l-c,u={},h={};function p(i){const r=(void 0!==h[i-1]?h[i-1]:-1)+1,s=void 0!==h[i+1]?h[i+1]:-1,d=r>s?-1:1;u[i+d]&&(u[i]=u[i+d].slice(0)),u[i]||(u[i]=[]),u[i].push(r>s?n:a);let p=Math.max(r,s),g=p-i;for(;g<c&&p<l&&o(e[g],t[p]);)g++,p++,u[i].push("equal");return p}let g,f=0;do{for(g=-f;g<d;g++)h[g]=p(g);for(g=d+f;g>d;g--)h[g]=p(g);h[d]=p(d),f++}while(h[d]!==l);return u[d].slice(1)}r.fastDiff=i.a},"./packages/ckeditor5-utils/src/dom/createelement.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return c}));var i=o("./packages/ckeditor5-utils/src/isiterable.js"),r=o("./node_modules/lodash-es/_baseGetTag.js"),s=o("./node_modules/lodash-es/isArray.js"),n=o("./node_modules/lodash-es/isObjectLike.js");var a=function(e){return"string"==typeof e||!Object(s.a)(e)&&Object(n.a)(e)&&"[object String]"==Object(r.a)(e)};function c(e,t,o={},r=[]){const s=o&&o.xmlns,n=s?e.createElementNS(s,t):e.createElement(t);for(const e in o)n.setAttribute(e,o[e]);!a(r)&&Object(i.a)(r)||(r=[r]);for(let t of r)a(t)&&(t=e.createTextNode(t)),n.appendChild(t);return n}},"./packages/ckeditor5-utils/src/dom/emittermixin.js":function(e,t,o){"use strict";var i=o("./packages/ckeditor5-utils/src/emittermixin.js"),r=o("./packages/ckeditor5-utils/src/uid.js"),s=o("./packages/ckeditor5-utils/src/dom/isnode.js"),n=o("./packages/ckeditor5-utils/src/dom/iswindow.js"),a=o("./node_modules/lodash-es/assignIn.js");const c=Object(a.a)({},i.c,{listenTo(e,...t){if(Object(s.a)(e)||Object(n.a)(e)){const o=this._getProxyEmitter(e)||new l(e);o.attach(...t),e=o}i.c.listenTo.call(this,e,...t)},stopListening(e,t,o){if(Object(s.a)(e)||Object(n.a)(e)){const t=this._getProxyEmitter(e);if(!t)return;e=t}i.c.stopListening.call(this,e,t,o),e instanceof l&&e.detach(t)},_getProxyEmitter(e){return Object(i.a)(this,d(e))}});t.a=c;class l{constructor(e){Object(i.b)(this,d(e)),this._domNode=e}}function d(e){return e["data-ck-expando"]||(e["data-ck-expando"]=Object(r.a)())}Object(a.a)(l.prototype,i.c,{attach(e,t,o={}){if(this._domListeners&&this._domListeners[e])return;const i={capture:!!o.useCapture,passive:!!o.usePassive},r=this._createDomListener(e,i);this._domNode.addEventListener(e,r,i),this._domListeners||(this._domListeners={}),this._domListeners[e]=r},detach(e){let t;!this._domListeners[e]||(t=this._events[e])&&t.callbacks.length||this._domListeners[e].removeListener()},_createDomListener(e,t){const o=t=>{this.fire(e,t)};return o.removeListener=()=>{this._domNode.removeEventListener(e,o,t),delete this._domListeners[e]},o}})},"./packages/ckeditor5-utils/src/dom/getborderwidths.js":function(e,t,o){"use strict";function i(e){const t=e.ownerDocument.defaultView.getComputedStyle(e);return{top:parseInt(t.borderTopWidth,10),right:parseInt(t.borderRightWidth,10),bottom:parseInt(t.borderBottomWidth,10),left:parseInt(t.borderLeftWidth,10)}}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/dom/global.js":function(e,t,o){"use strict";t.a={window:window,document:document}},"./packages/ckeditor5-utils/src/dom/isnode.js":function(e,t,o){"use strict";function i(e){if(e){if(e.defaultView)return e instanceof e.defaultView.Document;if(e.ownerDocument&&e.ownerDocument.defaultView)return e instanceof e.ownerDocument.defaultView.Node}return!1}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/dom/isrange.js":function(e,t,o){"use strict";function i(e){return"[object Range]"==Object.prototype.toString.apply(e)}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/dom/istext.js":function(e,t,o){"use strict";function i(e){return"[object Text]"==Object.prototype.toString.call(e)}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/dom/iswindow.js":function(e,t,o){"use strict";function i(e){const t=Object.prototype.toString.apply(e);return"[object Window]"==t||"[object global]"==t}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/dom/position.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-utils/src/dom/global.js"),r=o("./packages/ckeditor5-utils/src/dom/rect.js");var s=o("./packages/ckeditor5-utils/src/dom/getborderwidths.js"),n=o("./node_modules/lodash-es/isFunction.js");function a({element:e,target:t,positions:o,limiter:a,fitInViewport:u}){Object(n.a)(t)&&(t=t()),Object(n.a)(a)&&(a=a());const h=function(e){return e&&e.parentNode?e.offsetParent===i.a.document.body?null:e.offsetParent:null}(e),p=new r.a(e),g=new r.a(t);let f,m;if(a||u){const e=function(e,t){const{elementRect:o,viewportRect:i}=t,r=o.getArea(),s=function(e,{targetRect:t,elementRect:o,limiterRect:i,viewportRect:r}){const s=[],n=o.getArea();for(const a of e){const e=c(a,t,o);if(!e)continue;const[l,d]=e;let u=0,h=0;if(i)if(r){const e=i.getIntersection(r);e&&(u=e.getIntersectionArea(d))}else u=i.getIntersectionArea(d);r&&(h=r.getIntersectionArea(d));const p={positionName:l,positionRect:d,limiterIntersectArea:u,viewportIntersectArea:h};if(u===n)return[p];s.push(p)}return s}(e,t);if(i){const e=l(s.filter(({viewportIntersectArea:e})=>e===r),r);if(e)return e}return l(s,r)}(o,{targetRect:g,elementRect:p,limiterRect:a&&new r.a(a).getVisible(),viewportRect:u&&new r.a(i.a.window)});[m,f]=e||c(o[0],g,p)}else[m,f]=c(o[0],g,p);let k=d(f);return h&&(k=function({left:e,top:t},o){const i=d(new r.a(o)),n=Object(s.a)(o);return e-=i.left,t-=i.top,e+=o.scrollLeft,t+=o.scrollTop,e-=n.left,t-=n.top,{left:e,top:t}}(k,h)),{left:k.left,top:k.top,name:m}}function c(e,t,o){const i=e(t,o);if(!i)return null;const{left:r,top:s,name:n}=i;return[n,o.clone().moveTo(r,s)]}function l(e,t){let o,i,r=0;for(const{positionName:s,positionRect:n,limiterIntersectArea:a,viewportIntersectArea:c}of e){if(a===t)return[s,n];const e=c**2+a**2;e>r&&(r=e,o=n,i=s)}return o?[i,o]:null}function d({left:e,top:t}){const{scrollX:o,scrollY:r}=i.a.window;return{left:e+o,top:t+r}}},"./packages/ckeditor5-utils/src/dom/rect.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return l}));var i=o("./packages/ckeditor5-utils/src/dom/isrange.js"),r=o("./packages/ckeditor5-utils/src/dom/iswindow.js"),s=o("./packages/ckeditor5-utils/src/dom/getborderwidths.js"),n=o("./packages/ckeditor5-utils/src/dom/istext.js"),a=o("./node_modules/lodash-es/isElement.js");const c=["top","right","bottom","left","width","height"];class l{constructor(e){const t=Object(i.a)(e);if(Object.defineProperty(this,"_source",{value:e._source||e,writable:!0,enumerable:!1}),Object(a.a)(e)||t)if(t){const t=l.getDomRangeRects(e);d(this,l.getBoundingRect(t))}else d(this,e.getBoundingClientRect());else if(Object(r.a)(e)){const{innerWidth:t,innerHeight:o}=e;d(this,{top:0,right:t,bottom:o,left:0,width:t,height:o})}else d(this,e)}clone(){return new l(this)}moveTo(e,t){return this.top=t,this.right=e+this.width,this.bottom=t+this.height,this.left=e,this}moveBy(e,t){return this.top+=t,this.right+=e,this.left+=e,this.bottom+=t,this}getIntersection(e){const t={top:Math.max(this.top,e.top),right:Math.min(this.right,e.right),bottom:Math.min(this.bottom,e.bottom),left:Math.max(this.left,e.left)};return t.width=t.right-t.left,t.height=t.bottom-t.top,t.width<0||t.height<0?null:new l(t)}getIntersectionArea(e){const t=this.getIntersection(e);return t?t.getArea():0}getArea(){return this.width*this.height}getVisible(){const e=this._source;let t=this.clone();if(!u(e)){let o=e.parentNode||e.commonAncestorContainer;for(;o&&!u(o);){const e=new l(o),i=t.getIntersection(e);if(!i)return null;i.getArea()<t.getArea()&&(t=i),o=o.parentNode}}return t}isEqual(e){for(const t of c)if(this[t]!==e[t])return!1;return!0}contains(e){const t=this.getIntersection(e);return!(!t||!t.isEqual(e))}excludeScrollbarsAndBorders(){const e=this._source;let t,o,i;if(Object(r.a)(e))t=e.innerWidth-e.document.documentElement.clientWidth,o=e.innerHeight-e.document.documentElement.clientHeight,i=e.getComputedStyle(e.document.documentElement).direction;else{const r=Object(s.a)(this._source);t=e.offsetWidth-e.clientWidth-r.left-r.right,o=e.offsetHeight-e.clientHeight-r.top-r.bottom,i=e.ownerDocument.defaultView.getComputedStyle(e).direction,this.left+=r.left,this.top+=r.top,this.right-=r.right,this.bottom-=r.bottom,this.width=this.right-this.left,this.height=this.bottom-this.top}return this.width-=t,"ltr"===i?this.right-=t:this.left+=t,this.height-=o,this.bottom-=o,this}static getDomRangeRects(e){const t=[],o=Array.from(e.getClientRects());if(o.length)for(const e of o)t.push(new l(e));else{let o=e.startContainer;Object(n.a)(o)&&(o=o.parentNode);const i=new l(o.getBoundingClientRect());i.right=i.left,i.width=0,t.push(i)}return t}static getBoundingRect(e){const t={left:Number.POSITIVE_INFINITY,top:Number.POSITIVE_INFINITY,right:Number.NEGATIVE_INFINITY,bottom:Number.NEGATIVE_INFINITY};let o=0;for(const i of e)o++,t.left=Math.min(t.left,i.left),t.top=Math.min(t.top,i.top),t.right=Math.max(t.right,i.right),t.bottom=Math.max(t.bottom,i.bottom);return 0==o?null:(t.width=t.right-t.left,t.height=t.bottom-t.top,new l(t))}}function d(e,t){for(const o of c)e[o]=t[o]}function u(e){return!!Object(a.a)(e)&&e===e.ownerDocument.body}},"./packages/ckeditor5-utils/src/dom/resizeobserver.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-utils/src/mix.js"),r=o("./packages/ckeditor5-utils/src/dom/global.js"),s=o("./packages/ckeditor5-utils/src/dom/rect.js"),n=o("./packages/ckeditor5-utils/src/dom/emittermixin.js");class a{constructor(e,t){a._observerInstance||a._createObserver(),this._element=e,this._callback=t,a._addElementCallback(e,t),a._observerInstance.observe(e)}destroy(){a._deleteElementCallback(this._element,this._callback)}static _addElementCallback(e,t){a._elementCallbacks||(a._elementCallbacks=new Map);let o=a._elementCallbacks.get(e);o||(o=new Set,a._elementCallbacks.set(e,o)),o.add(t)}static _deleteElementCallback(e,t){const o=a._getElementCallbacks(e);o&&(o.delete(t),o.size||(a._elementCallbacks.delete(e),a._observerInstance.unobserve(e))),a._elementCallbacks&&!a._elementCallbacks.size&&(a._observerInstance=null,a._elementCallbacks=null)}static _getElementCallbacks(e){return a._elementCallbacks?a._elementCallbacks.get(e):null}static _createObserver(){let e;e="function"==typeof r.a.window.ResizeObserver?r.a.window.ResizeObserver:c,a._observerInstance=new e(e=>{for(const t of e){const e=a._getElementCallbacks(t.target);if(e)for(const o of e)o(t)}})}}a._observerInstance=null,a._elementCallbacks=null;class c{constructor(e){this._callback=e,this._elements=new Set,this._previousRects=new Map,this._periodicCheckTimeout=null}observe(e){this._elements.add(e),this._checkElementRectsAndExecuteCallback(),1===this._elements.size&&this._startPeriodicCheck()}unobserve(e){this._elements.delete(e),this._previousRects.delete(e),this._elements.size||this._stopPeriodicCheck()}_startPeriodicCheck(){const e=()=>{this._checkElementRectsAndExecuteCallback(),this._periodicCheckTimeout=setTimeout(e,100)};this.listenTo(r.a.window,"resize",()=>{this._checkElementRectsAndExecuteCallback()}),this._periodicCheckTimeout=setTimeout(e,100)}_stopPeriodicCheck(){clearTimeout(this._periodicCheckTimeout),this.stopListening(),this._previousRects.clear()}_checkElementRectsAndExecuteCallback(){const e=[];for(const t of this._elements)this._hasRectChanged(t)&&e.push({target:t,contentRect:this._previousRects.get(t)});e.length&&this._callback(e)}_hasRectChanged(e){if(!e.ownerDocument.body.contains(e))return!1;const t=new s.a(e),o=this._previousRects.get(e),i=!o||!o.isEqual(t);return this._previousRects.set(e,t),i}}Object(i.a)(c,n.a)},"./packages/ckeditor5-utils/src/dom/setdatainelement.js":function(e,t,o){"use strict";function i(e,t){e instanceof HTMLTextAreaElement&&(e.value=t),e.innerHTML=t}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/dom/tounit.js":function(e,t,o){"use strict";function i(e){return t=>t+e}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/emittermixin.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return d})),o.d(t,"b",(function(){return u}));var i=o("./packages/ckeditor5-utils/src/eventinfo.js"),r=o("./packages/ckeditor5-utils/src/uid.js"),s=o("./packages/ckeditor5-utils/src/priorities.js"),n=(o("./packages/ckeditor5-utils/src/version.js"),o("./packages/ckeditor5-utils/src/ckeditorerror.js"));const a=Symbol("listeningTo"),c=Symbol("emitterId"),l={on(e,t,o={}){this.listenTo(this,e,t,o)},once(e,t,o){let i=!1;this.listenTo(this,e,(function(e,...o){i||(i=!0,e.off(),t.call(this,e,...o))}),o)},off(e,t){this.stopListening(this,e,t)},listenTo(e,t,o,i={}){let r,s;this[a]||(this[a]={});const n=this[a];h(e)||u(e);const c=h(e);(r=n[c])||(r=n[c]={emitter:e,callbacks:{}}),(s=r.callbacks[t])||(s=r.callbacks[t]=[]),s.push(o),function(e,t,o,i,r){t._addEventListener?t._addEventListener(o,i,r):e._addEventListener.call(t,o,i,r)}(this,e,t,o,i)},stopListening(e,t,o){const i=this[a];let r=e&&h(e);const s=i&&r&&i[r],n=s&&t&&s.callbacks[t];if(!(!i||e&&!s||t&&!n))if(o){m(this,e,t,o);-1!==n.indexOf(o)&&(1===n.length?delete s.callbacks[t]:m(this,e,t,o))}else if(n){for(;o=n.pop();)m(this,e,t,o);delete s.callbacks[t]}else if(s){for(t in s.callbacks)this.stopListening(e,t);delete i[r]}else{for(r in i)this.stopListening(i[r].emitter);delete this[a]}},fire(e,...t){try{const o=e instanceof i.a?e:new i.a(this,e),r=o.name;let s=function e(t,o){let i;if(!t._events||!(i=t._events[o])||!i.callbacks.length)return o.indexOf(":")>-1?e(t,o.substr(0,o.lastIndexOf(":"))):null;return i.callbacks}(this,r);if(o.path.push(this),s){const e=[o,...t];s=Array.from(s);for(let t=0;t<s.length&&(s[t].callback.apply(this,e),o.off.called&&(delete o.off.called,this._removeEventListener(r,s[t].callback)),!o.stop.called);t++);}if(this._delegations){const e=this._delegations.get(r),i=this._delegations.get("*");e&&f(e,o,t),i&&f(i,o,t)}return o.return}catch(e){n.a.rethrowUnexpectedError(e,this)}},delegate(...e){return{to:(t,o)=>{this._delegations||(this._delegations=new Map),e.forEach(e=>{const i=this._delegations.get(e);i?i.set(t,o):this._delegations.set(e,new Map([[t,o]]))})}}},stopDelegating(e,t){if(this._delegations)if(e)if(t){const o=this._delegations.get(e);o&&o.delete(t)}else this._delegations.delete(e);else this._delegations.clear()},_addEventListener(e,t,o){!function(e,t){const o=p(e);if(o[t])return;let i=t,r=null;const s=[];for(;""!==i&&!o[i];)o[i]={callbacks:[],childEvents:[]},s.push(o[i]),r&&o[i].childEvents.push(r),r=i,i=i.substr(0,i.lastIndexOf(":"));if(""!==i){for(const e of s)e.callbacks=o[i].callbacks.slice();o[i].childEvents.push(r)}}(this,e);const i=g(this,e),r=s.a.get(o.priority),n={callback:t,priority:r};for(const e of i){let t=!1;for(let o=0;o<e.length;o++)if(e[o].priority<r){e.splice(o,0,n),t=!0;break}t||e.push(n)}},_removeEventListener(e,t){const o=g(this,e);for(const e of o)for(let o=0;o<e.length;o++)e[o].callback==t&&(e.splice(o,1),o--)}};function d(e,t){return e[a]&&e[a][t]?e[a][t].emitter:null}function u(e,t){e[c]||(e[c]=t||Object(r.a)())}function h(e){return e[c]}function p(e){return e._events||Object.defineProperty(e,"_events",{value:{}}),e._events}function g(e,t){const o=p(e)[t];if(!o)return[];let i=[o.callbacks];for(let t=0;t<o.childEvents.length;t++){const r=g(e,o.childEvents[t]);i=i.concat(r)}return i}function f(e,t,o){for(let[r,s]of e){s?"function"==typeof s&&(s=s(t.name)):s=t.name;const e=new i.a(t.source,s);e.path=[...t.path],r.fire(e,...o)}}function m(e,t,o,i){t._removeEventListener?t._removeEventListener(o,i):e._removeEventListener.call(t,o,i)}t.c=l},"./packages/ckeditor5-utils/src/env.js":function(e,t,o){"use strict";const i=navigator.userAgent.toLowerCase(),r={isMac:function(e){return e.indexOf("macintosh")>-1}(i),isGecko:function(e){return!!e.match(/gecko\/\d+/)}(i),isSafari:function(e){return e.indexOf(" applewebkit/")>-1&&-1===e.indexOf("chrome")}(i),isAndroid:function(e){return e.indexOf("android")>-1}(i),isBlink:function(e){return e.indexOf("chrome/")>-1&&e.indexOf("edge/")<0}(i),features:{isRegExpUnicodePropertySupported:function(){let e=!1;try{e=0==="ć".search(new RegExp("[\\p{L}]","u"))}catch(e){}return e}()}};t.a=r},"./packages/ckeditor5-utils/src/eventinfo.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=function(){return function e(){e.called=!0}};class r{constructor(e,t){this.source=e,this.name=t,this.path=[],this.stop=i(),this.off=i()}}},"./packages/ckeditor5-utils/src/fastdiff.js":function(e,t,o){"use strict";function i(e,t,o,i=!1){o=o||function(e,t){return e===t},Array.isArray(e)||(e=Array.prototype.slice.call(e)),Array.isArray(t)||(t=Array.prototype.slice.call(t));const n=function(e,t,o){const i=r(e,t,o);if(-1===i)return{firstIndex:-1,lastIndexOld:-1,lastIndexNew:-1};const n=s(e,i),a=s(t,i),c=r(n,a,o),l=e.length-c,d=t.length-c;return{firstIndex:i,lastIndexOld:l,lastIndexNew:d}}(e,t,o);return i?function(e,t){const{firstIndex:o,lastIndexOld:i,lastIndexNew:r}=e;if(-1===o)return Array(t).fill("equal");let s=[];o>0&&(s=s.concat(Array(o).fill("equal")));r-o>0&&(s=s.concat(Array(r-o).fill("insert")));i-o>0&&(s=s.concat(Array(i-o).fill("delete")));r<t&&(s=s.concat(Array(t-r).fill("equal")));return s}(n,t.length):function(e,t){const o=[],{firstIndex:i,lastIndexOld:r,lastIndexNew:s}=t;s-i>0&&o.push({index:i,type:"insert",values:e.slice(i,s)});r-i>0&&o.push({index:i+(s-i),type:"delete",howMany:r-i});return o}(t,n)}function r(e,t,o){for(let i=0;i<Math.max(e.length,t.length);i++)if(void 0===e[i]||void 0===t[i]||!o(e[i],t[i]))return i;return-1}function s(e,t){return e.slice(t).reverse()}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/first.js":function(e,t,o){"use strict";function i(e){const t=e.next();return t.done?null:t.value}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/focustracker.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-utils/src/dom/emittermixin.js"),r=o("./packages/ckeditor5-utils/src/observablemixin.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-utils/src/mix.js");class a{constructor(){this.set("isFocused",!1),this.set("focusedElement",null),this._elements=new Set,this._nextEventLoopTimeout=null}add(e){if(this._elements.has(e))throw new s.a("focustracker-add-element-already-exist",this);this.listenTo(e,"focus",()=>this._focus(e),{useCapture:!0}),this.listenTo(e,"blur",()=>this._blur(),{useCapture:!0}),this._elements.add(e)}remove(e){e===this.focusedElement&&this._blur(e),this._elements.has(e)&&(this.stopListening(e),this._elements.delete(e))}destroy(){this.stopListening()}_focus(e){clearTimeout(this._nextEventLoopTimeout),this.focusedElement=e,this.isFocused=!0}_blur(){clearTimeout(this._nextEventLoopTimeout),this._nextEventLoopTimeout=setTimeout(()=>{this.focusedElement=null,this.isFocused=!1},0)}}Object(n.a)(a,i.a),Object(n.a)(a,r.a)},"./packages/ckeditor5-utils/src/index.js":function(e,t,o){"use strict";o.d(t,"n",(function(){return i.a})),o.d(t,"m",(function(){return r.a})),o.d(t,"A",(function(){return s.a})),o.d(t,"e",(function(){return n.c})),o.d(t,"i",(function(){return a.a})),o.d(t,"a",(function(){return c.a})),o.d(t,"y",(function(){return c.b})),o.d(t,"z",(function(){return c.c})),o.d(t,"d",(function(){return l})),o.d(t,"l",(function(){return d.a})),o.d(t,"c",(function(){return u.a})),o.d(t,"u",(function(){return h.a})),o.d(t,"q",(function(){return p})),o.d(t,"j",(function(){return g.a})),o.d(t,"k",(function(){return f.a})),o.d(t,"D",(function(){return m.a})),o.d(t,"G",(function(){return k.a})),o.d(t,"x",(function(){return b.f})),o.d(t,"p",(function(){return b.a})),o.d(t,"B",(function(){return b.g})),o.d(t,"r",(function(){return b.b})),o.d(t,"v",(function(){return b.d})),o.d(t,"t",(function(){return b.c})),o.d(t,"w",(function(){return b.e})),o.d(t,"s",(function(){return _.a})),o.d(t,"h",(function(){return w.a})),o.d(t,"b",(function(){return v.a})),o.d(t,"o",(function(){return y.a})),o.d(t,"f",(function(){return j.a})),o.d(t,"g",(function(){return x.a})),o.d(t,"E",(function(){return P.a})),o.d(t,"F",(function(){return O.a})),o.d(t,"C",(function(){return A.a})),o.d(t,"H",(function(){return T.a})),o.d(t,"I",(function(){return C.a}));var i=o("./packages/ckeditor5-utils/src/env.js"),r=o("./packages/ckeditor5-utils/src/diff.js"),s=o("./packages/ckeditor5-utils/src/mix.js"),n=o("./packages/ckeditor5-utils/src/emittermixin.js"),a=o("./packages/ckeditor5-utils/src/observablemixin.js"),c=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class l{constructor(){this._replacedElements=[]}replace(e,t){this._replacedElements.push({element:e,newElement:t}),e.style.display="none",t&&e.parentNode.insertBefore(t,e.nextSibling)}restore(){this._replacedElements.forEach(({element:e,newElement:t})=>{e.style.display="",t&&t.remove()}),this._replacedElements=[]}}var d=o("./packages/ckeditor5-utils/src/dom/createelement.js"),u=o("./packages/ckeditor5-utils/src/dom/emittermixin.js"),h=o("./packages/ckeditor5-utils/src/dom/global.js");function p(e){return e instanceof HTMLTextAreaElement?e.value:e.innerHTML}var g=o("./packages/ckeditor5-utils/src/dom/rect.js"),f=o("./packages/ckeditor5-utils/src/dom/resizeobserver.js"),m=o("./packages/ckeditor5-utils/src/dom/setdatainelement.js"),k=o("./packages/ckeditor5-utils/src/dom/tounit.js"),b=o("./packages/ckeditor5-utils/src/keyboard.js"),_=o("./packages/ckeditor5-utils/src/language.js"),w=o("./packages/ckeditor5-utils/src/locale.js"),v=o("./packages/ckeditor5-utils/src/collection.js"),y=o("./packages/ckeditor5-utils/src/first.js"),j=o("./packages/ckeditor5-utils/src/focustracker.js"),x=o("./packages/ckeditor5-utils/src/keystrokehandler.js"),P=o("./packages/ckeditor5-utils/src/toarray.js"),O=o("./packages/ckeditor5-utils/src/tomap.js"),A=o("./packages/ckeditor5-utils/src/priorities.js"),T=o("./packages/ckeditor5-utils/src/uid.js"),C=o("./packages/ckeditor5-utils/src/version.js")},"./packages/ckeditor5-utils/src/isiterable.js":function(e,t,o){"use strict";function i(e){return!(!e||!e[Symbol.iterator])}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/keyboard.js":function(e,t,o){"use strict";o.d(t,"f",(function(){return a})),o.d(t,"a",(function(){return l})),o.d(t,"g",(function(){return d})),o.d(t,"b",(function(){return u})),o.d(t,"d",(function(){return h})),o.d(t,"c",(function(){return p})),o.d(t,"e",(function(){return g}));var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),r=o("./packages/ckeditor5-utils/src/env.js");const s={ctrl:"⌃",cmd:"⌘",alt:"⌥",shift:"⇧"},n={ctrl:"Ctrl+",alt:"Alt+",shift:"Shift+"},a=function(){const e={arrowleft:37,arrowup:38,arrowright:39,arrowdown:40,backspace:8,delete:46,enter:13,space:32,esc:27,tab:9,ctrl:1114112,shift:2228224,alt:4456448,cmd:8912896};for(let t=65;t<=90;t++){const o=String.fromCharCode(t);e[o.toLowerCase()]=t}for(let t=48;t<=57;t++)e[t-48]=t;for(let t=112;t<=123;t++)e["f"+(t-111)]=t;return e}(),c=Object.fromEntries(Object.entries(a).map(([e,t])=>[t,e.charAt(0).toUpperCase()+e.slice(1)]));function l(e){let t;if("string"==typeof e){if(t=a[e.toLowerCase()],!t)throw new i.a("keyboard-unknown-key",null,{key:e})}else t=e.keyCode+(e.altKey?a.alt:0)+(e.ctrlKey?a.ctrl:0)+(e.shiftKey?a.shift:0)+(e.metaKey?a.cmd:0);return t}function d(e){return"string"==typeof e&&(e=function(e){return e.split("+").map(e=>e.trim())}(e)),e.map(e=>"string"==typeof e?function(e){if(e.endsWith("!"))return l(e.slice(0,-1));const t=l(e);return r.a.isMac&&t==a.ctrl?a.cmd:t}(e):e).reduce((e,t)=>t+e,0)}function u(e){let t=d(e);return Object.entries(r.a.isMac?s:n).reduce((e,[o,i])=>(0!=(t&a[o])&&(t&=~a[o],e+=i),e),"")+(t?c[t]:"")}function h(e){return e==a.arrowright||e==a.arrowleft||e==a.arrowup||e==a.arrowdown}function p(e,t){const o="ltr"===t;switch(e){case a.arrowleft:return o?"left":"right";case a.arrowright:return o?"right":"left";case a.arrowup:return"up";case a.arrowdown:return"down"}}function g(e,t){const o=p(e,t);return"down"===o||"right"===o}},"./packages/ckeditor5-utils/src/keystrokehandler.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return s}));var i=o("./packages/ckeditor5-utils/src/dom/emittermixin.js"),r=o("./packages/ckeditor5-utils/src/keyboard.js");class s{constructor(){this._listener=Object.create(i.a)}listenTo(e){this._listener.listenTo(e,"keydown",(e,t)=>{this._listener.fire("_keydown:"+Object(r.a)(t),t)})}set(e,t,o={}){const i=Object(r.g)(e),s=o.priority;this._listener.listenTo(this._listener,"_keydown:"+i,(e,o)=>{t(o,()=>{o.preventDefault(),o.stopPropagation(),e.stop()}),e.return=!0},{priority:s})}press(e){return!!this._listener.fire("_keydown:"+Object(r.a)(e),e)}destroy(){this._listener.stopListening()}}},"./packages/ckeditor5-utils/src/language.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));const i=["ar","ara","fa","per","fas","he","heb","ku","kur","ug","uig"];function r(e){return i.includes(e)?"rtl":"ltr"}},"./packages/ckeditor5-utils/src/locale.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return a}));var i=o("./packages/ckeditor5-utils/src/toarray.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js");function s(e,t,o=1){if("number"!=typeof o)throw new r.a("translation-service-quantity-not-a-number",null,{quantity:o});const i=Object.keys(window.CKEDITOR_TRANSLATIONS).length;1===i&&(e=Object.keys(window.CKEDITOR_TRANSLATIONS)[0]);const s=t.id||t.string;if(0===i||!function(e,t){return!!window.CKEDITOR_TRANSLATIONS[e]&&!!window.CKEDITOR_TRANSLATIONS[e].dictionary[t]}(e,s))return 1!==o?t.plural:t.string;const n=window.CKEDITOR_TRANSLATIONS[e].dictionary,a=window.CKEDITOR_TRANSLATIONS[e].getPluralForm||(e=>1===e?0:1);if("string"==typeof n[s])return n[s];const c=Number(a(o));return n[s][c]}window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={});var n=o("./packages/ckeditor5-utils/src/language.js");class a{constructor(e={}){this.uiLanguage=e.uiLanguage||"en",this.contentLanguage=e.contentLanguage||this.uiLanguage,this.uiLanguageDirection=Object(n.a)(this.uiLanguage),this.contentLanguageDirection=Object(n.a)(this.contentLanguage),this.t=(e,t)=>this._t(e,t)}get language(){return console.warn("locale-deprecated-language-property: The Locale#language property has been deprecated and will be removed in the near future. Please use #uiLanguage and #contentLanguage properties instead."),this.uiLanguage}_t(e,t=[]){t=Object(i.a)(t),"string"==typeof e&&(e={string:e});const o=!!e.plural?t[0]:1;return function(e,t){return e.replace(/%(\d+)/g,(e,o)=>o<t.length?t[o]:e)}(s(this.uiLanguage,e,o),t)}}},"./packages/ckeditor5-utils/src/mix.js":function(e,t,o){"use strict";function i(e,...t){t.forEach(t=>{Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t)).forEach(o=>{if(o in e.prototype)return;const i=Object.getOwnPropertyDescriptor(t,o);i.enumerable=!1,Object.defineProperty(e.prototype,o,i)})})}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/observablemixin.js":function(e,t,o){"use strict";var i=o("./packages/ckeditor5-utils/src/emittermixin.js"),r=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),s=o("./node_modules/lodash-es/isObject.js"),n=o("./node_modules/lodash-es/assignIn.js");const a=Symbol("observableProperties"),c=Symbol("boundObservables"),l=Symbol("boundProperties"),d=Symbol("decoratedMethods"),u=Symbol("decoratedOriginal"),h={set(e,t){if(Object(s.a)(e))return void Object.keys(e).forEach(t=>{this.set(t,e[t])},this);p(this);const o=this[a];if(e in this&&!o.has(e))throw new r.a("observable-set-cannot-override",this);Object.defineProperty(this,e,{enumerable:!0,configurable:!0,get:()=>o.get(e),set(t){const i=o.get(e);let r=this.fire("set:"+e,e,t,i);void 0===r&&(r=t),i===r&&o.has(e)||(o.set(e,r),this.fire("change:"+e,e,r,i))}}),this[e]=t},bind(...e){if(!e.length||!m(e))throw new r.a("observable-bind-wrong-properties",this);if(new Set(e).size!==e.length)throw new r.a("observable-bind-duplicate-properties",this);p(this);const t=this[l];e.forEach(e=>{if(t.has(e))throw new r.a("observable-bind-rebind",this)});const o=new Map;return e.forEach(e=>{const i={property:e,to:[]};t.set(e,i),o.set(e,i)}),{to:g,toMany:f,_observable:this,_bindProperties:e,_to:[],_bindings:o}},unbind(...e){if(!this[a])return;const t=this[l],o=this[c];if(e.length){if(!m(e))throw new r.a("observable-unbind-wrong-properties",this);e.forEach(e=>{const i=t.get(e);if(!i)return;let r,s,n,a;i.to.forEach(e=>{r=e[0],s=e[1],n=o.get(r),a=n[s],a.delete(i),a.size||delete n[s],Object.keys(n).length||(o.delete(r),this.stopListening(r,"change"))}),t.delete(e)})}else o.forEach((e,t)=>{this.stopListening(t,"change")}),o.clear(),t.clear()},decorate(e){const t=this[e];if(!t)throw new r.a("observablemixin-cannot-decorate-undefined",this,{object:this,methodName:e});this.on(e,(e,o)=>{e.return=t.apply(this,o)}),this[e]=function(...t){return this.fire(e,t)},this[e][u]=t,this[d]||(this[d]=[]),this[d].push(e)}};function p(e){e[a]||(Object.defineProperty(e,a,{value:new Map}),Object.defineProperty(e,c,{value:new Map}),Object.defineProperty(e,l,{value:new Map}))}function g(...e){const t=function(...e){if(!e.length)throw new r.a("observable-bind-to-parse-error",null);const t={to:[]};let o;"function"==typeof e[e.length-1]&&(t.callback=e.pop());return e.forEach(e=>{if("string"==typeof e)o.properties.push(e);else{if("object"!=typeof e)throw new r.a("observable-bind-to-parse-error",null);o={observable:e,properties:[]},t.to.push(o)}}),t}(...e),o=Array.from(this._bindings.keys()),i=o.length;if(!t.callback&&t.to.length>1)throw new r.a("observable-bind-to-no-callback",this);if(i>1&&t.callback)throw new r.a("observable-bind-to-extra-callback",this);var s;t.to.forEach(e=>{if(e.properties.length&&e.properties.length!==i)throw new r.a("observable-bind-to-properties-length",this);e.properties.length||(e.properties=this._bindProperties)}),this._to=t.to,t.callback&&(this._bindings.get(o[0]).callback=t.callback),s=this._observable,this._to.forEach(e=>{const t=s[c];let o;t.get(e.observable)||s.listenTo(e.observable,"change",(i,r)=>{o=t.get(e.observable)[r],o&&o.forEach(e=>{k(s,e.property)})})}),function(e){let t;e._bindings.forEach((o,i)=>{e._to.forEach(r=>{t=r.properties[o.callback?0:e._bindProperties.indexOf(i)],o.to.push([r.observable,t]),function(e,t,o,i){const r=e[c],s=r.get(o),n=s||{};n[i]||(n[i]=new Set);n[i].add(t),s||r.set(o,n)}(e._observable,o,r.observable,t)})})}(this),this._bindProperties.forEach(e=>{k(this._observable,e)})}function f(e,t,o){if(this._bindings.size>1)throw new r.a("observable-bind-to-many-not-one-binding",this);this.to(...function(e,t){const o=e.map(e=>[e,t]);return Array.prototype.concat.apply([],o)}(e,t),o)}function m(e){return e.every(e=>"string"==typeof e)}function k(e,t){const o=e[l].get(t);let i;o.callback?i=o.callback.apply(e,o.to.map(e=>e[0][e[1]])):(i=o.to[0],i=i[0][i[1]]),Object.prototype.hasOwnProperty.call(e,t)?e[t]=i:e.set(t,i)}Object(n.a)(h,i.c),h.stopListening=function(e,t,o){if(!e&&this[d]){for(const e of this[d])this[e]=this[e][u];delete this[d]}i.c.stopListening.call(this,e,t,o)},t.a=h},"./packages/ckeditor5-utils/src/priorities.js":function(e,t,o){"use strict";const i={get(e){return"number"!=typeof e?this[e]||this.normal:e},highest:1e5,high:1e3,normal:0,low:-1e3,lowest:-1e5};t.a=i},"./packages/ckeditor5-utils/src/toarray.js":function(e,t,o){"use strict";function i(e){return Array.isArray(e)?e:[e]}o.d(t,"a",(function(){return i}))},"./packages/ckeditor5-utils/src/tomap.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));var i=o("./packages/ckeditor5-utils/src/isiterable.js");function r(e){return Object(i.a)(e)?new Map(e):function(e){const t=new Map;for(const o in e)t.set(o,e[o]);return t}(e)}},"./packages/ckeditor5-utils/src/uid.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r}));const i=new Array(256).fill().map((e,t)=>("0"+t.toString(16)).slice(-2));function r(){const e=4294967296*Math.random()>>>0,t=4294967296*Math.random()>>>0,o=4294967296*Math.random()>>>0,r=4294967296*Math.random()>>>0;return"e"+i[e>>0&255]+i[e>>8&255]+i[e>>16&255]+i[e>>24&255]+i[t>>0&255]+i[t>>8&255]+i[t>>16&255]+i[t>>24&255]+i[o>>0&255]+i[o>>8&255]+i[o>>16&255]+i[o>>24&255]+i[r>>0&255]+i[r>>8&255]+i[r>>16&255]+i[r>>24&255]}},"./packages/ckeditor5-utils/src/version.js":function(e,t,o){"use strict";(function(e){var i=o("./packages/ckeditor5-utils/src/ckeditorerror.js");t.a="29.2.0";const r="object"==typeof window?window:e;if(r.CKEDITOR_VERSION)throw new i.a("ckeditor-duplicated-modules",null);r.CKEDITOR_VERSION="29.2.0"}).call(this,o("./node_modules/webpack/buildin/global.js"))},"./packages/ckeditor5-widget/src/utils.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return m})),o.d(t,"b",(function(){return k})),o.d(t,"f",(function(){return b})),o.d(t,"i",(function(){return _})),o.d(t,"g",(function(){return y})),o.d(t,"h",(function(){return j})),o.d(t,"e",(function(){return x})),o.d(t,"j",(function(){return P})),o.d(t,"d",(function(){return O})),o.d(t,"k",(function(){return A})),o.d(t,"c",(function(){return T}));var i=o("./packages/ckeditor5-ui/src/panel/balloon/balloonpanelview.js"),r=o("./packages/ckeditor5-utils/src/dom/global.js"),s=o("./packages/ckeditor5-utils/src/dom/rect.js"),n=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),a=o("./packages/ckeditor5-utils/src/toarray.js"),c=o("./packages/ckeditor5-utils/src/emittermixin.js"),l=o("./packages/ckeditor5-utils/src/mix.js");class d{constructor(){this._stack=[]}add(e,t){const o=this._stack,i=o[0];this._insertDescriptor(e);const r=o[0];i===r||u(i,r)||this.fire("change:top",{oldDescriptor:i,newDescriptor:r,writer:t})}remove(e,t){const o=this._stack,i=o[0];this._removeDescriptor(e);const r=o[0];i===r||u(i,r)||this.fire("change:top",{oldDescriptor:i,newDescriptor:r,writer:t})}_insertDescriptor(e){const t=this._stack,o=t.findIndex(t=>t.id===e.id);if(u(e,t[o]))return;o>-1&&t.splice(o,1);let i=0;for(;t[i]&&h(t[i],e);)i++;t.splice(i,0,e)}_removeDescriptor(e){const t=this._stack,o=t.findIndex(t=>t.id===e);o>-1&&t.splice(o,1)}}function u(e,t){return e&&t&&e.priority==t.priority&&p(e.classes)==p(t.classes)}function h(e,t){return e.priority>t.priority||!(e.priority<t.priority)&&p(e.classes)>p(t.classes)}function p(e){return Array.isArray(e)?e.sort().join(","):e}Object(l.a)(d,c.c);var g=o("./packages/ckeditor5-widget/src/widgettypearound/utils.js"),f=o("./packages/ckeditor5-ui/src/icon/iconview.js");const m="ck-widget",k="ck-widget_selected";function b(e){return!!e.is("element")&&!!e.getCustomProperty("widget")}function _(e,t,o={}){if(!e.is("containerElement"))throw new n.a("widget-to-widget-wrong-element-type",null,{element:e});return t.setAttribute("contenteditable","false",e),t.addClass(m,e),t.setCustomProperty("widget",!0,e),e.getFillerOffset=C,o.label&&j(e,o.label,t),o.hasSelectionHandle&&function(e,t){const o=t.createUIElement("div",{class:"ck ck-widget__selection-handle"},(function(e){const t=this.toDomElement(e),o=new f.a;return o.set("content",'<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M4 0v1H1v3H0V.5A.5.5 0 0 1 .5 0H4zm8 0h3.5a.5.5 0 0 1 .5.5V4h-1V1h-3V0zM4 16H.5a.5.5 0 0 1-.5-.5V12h1v3h3v1zm8 0v-1h3v-3h1v3.5a.5.5 0 0 1-.5.5H12z"/><path fill-opacity=".256" d="M1 1h14v14H1z"/><g class="ck-icon__selected-indicator"><path d="M7 0h2v1H7V0zM0 7h1v2H0V7zm15 0h1v2h-1V7zm-8 8h2v1H7v-1z"/><path fill-opacity=".254" d="M1 1h14v14H1z"/></g></svg>'),o.render(),t.appendChild(o.element),t}));t.insert(t.createPositionAt(e,0),o),t.addClass(["ck-widget_with-selection-handle"],e)}(e,t),y(e,t,w,v),e}function w(e,t,o){if(t.classes&&o.addClass(Object(a.a)(t.classes),e),t.attributes)for(const i in t.attributes)o.setAttribute(i,t.attributes[i],e)}function v(e,t,o){if(t.classes&&o.removeClass(Object(a.a)(t.classes),e),t.attributes)for(const i in t.attributes)o.removeAttribute(i,e)}function y(e,t,o,i){const r=new d;r.on("change:top",(t,r)=>{r.oldDescriptor&&i(e,r.oldDescriptor,r.writer),r.newDescriptor&&o(e,r.newDescriptor,r.writer)}),t.setCustomProperty("addHighlight",(e,t,o)=>r.add(t,o),e),t.setCustomProperty("removeHighlight",(e,t,o)=>r.remove(t,o),e)}function j(e,t,o){o.setCustomProperty("widgetLabel",t,e)}function x(e){const t=e.getCustomProperty("widgetLabel");return t?"function"==typeof t?t():t:""}function P(e,t){return t.addClass(["ck-editor__editable","ck-editor__nested-editable"],e),t.setAttribute("contenteditable",e.isReadOnly?"false":"true",e),e.on("change:isReadOnly",(o,i,r)=>{t.setAttribute("contenteditable",r?"false":"true",e)}),e.on("change:isFocused",(o,i,r)=>{r?t.addClass("ck-editor__nested-editable_focused",e):t.removeClass("ck-editor__nested-editable_focused",e)}),e}function O(e,t){const o=e.getSelectedElement();if(o){const i=Object(g.e)(e);if(i)return t.createRange(t.createPositionAt(o,i));if(t.schema.isObject(o)&&!t.schema.isInline(o))return t.createRangeOn(o)}const i=e.getSelectedBlocks().next().value;if(i){if(i.isEmpty)return t.createRange(t.createPositionAt(i,0));const o=t.createPositionAfter(i);return e.focus.isTouching(o)?t.createRange(o):t.createRange(t.createPositionBefore(i))}return t.createRange(e.focus)}function A(e,t){return(o,i)=>{const{mapper:r,viewPosition:s}=i,n=r.findMappedViewAncestor(s);if(!t(n))return;const a=r.toModelElement(n);i.modelPosition=e.createPositionAt(a,s.isAtStart?"before":"after")}}function T(e,t){const o=new s.a(r.a.window),n=o.getIntersection(e),a=t.height+i.a.arrowVerticalOffset;if(e.top-a>o.top||e.bottom+a<o.bottom)return null;const c=n||e,l=c.left+c.width/2-t.width/2;return{top:Math.max(e.top,0)+i.a.arrowVerticalOffset,left:l,name:"arrow_n"}}function C(){return null}},"./packages/ckeditor5-widget/src/widget.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return g}));var i=o("./packages/ckeditor5-core/src/plugin.js"),r=o("./packages/ckeditor5-engine/src/view/observer/mouseobserver.js"),s=o("./packages/ckeditor5-widget/src/widgettypearound/widgettypearound.js"),n=o("./packages/ckeditor5-typing/src/delete.js"),a=o("./packages/ckeditor5-widget/src/utils.js"),c=o("./packages/ckeditor5-utils/src/keyboard.js"),l=o("./packages/ckeditor5-utils/src/env.js"),d=(o("./packages/ckeditor5-widget/theme/widget.css"),o("./packages/ckeditor5-utils/src/dom/rect.js"));function u(e){const t=e.model;return(o,i)=>{const r=i.keyCode==c.f.arrowup,s=i.keyCode==c.f.arrowdown,n=i.shiftKey,a=t.document.selection;if(!r&&!s)return;const l=s;if(n&&function(e,t){return!e.isCollapsed&&e.isBackward==t}(a,l))return;const u=function(e,t,o){const i=e.model;if(o){const e=t.isCollapsed?t.focus:t.getLastPosition(),o=h(i,e,"forward");if(!o)return null;const r=i.createRange(e,o),s=p(i.schema,r,"backward");return s&&e.isBefore(s)?i.createRange(e,s):null}{const e=t.isCollapsed?t.focus:t.getFirstPosition(),o=h(i,e,"backward");if(!o)return null;const r=i.createRange(o,e),s=p(i.schema,r,"forward");return s&&e.isAfter(s)?i.createRange(s,e):null}}(e,a,l);u&&!u.isCollapsed&&function(e,t,o){const i=e.model,r=e.view.domConverter;if(o){const e=i.createSelection(t.start);i.modifySelection(e),e.focus.isAtEnd||t.start.isEqual(e.focus)||(t=i.createRange(e.focus,t.end))}const s=e.mapper.toViewRange(t),n=r.viewRangeToDom(s),a=d.a.getDomRangeRects(n);let c;for(const e of a)if(void 0!==c){if(Math.round(e.top)>=c)return!1;c=Math.max(c,Math.round(e.bottom))}else c=Math.round(e.bottom);return!0}(e,u,l)&&(t.change(e=>{const o=l?u.end:u.start;if(n){const i=t.createSelection(a.anchor);i.setFocus(o),e.setSelection(i)}else e.setSelection(o)}),o.stop(),i.preventDefault(),i.stopPropagation())}}function h(e,t,o){const i=e.schema,r=e.createRangeIn(t.root),s="forward"==o?"elementStart":"elementEnd";for(const{previousPosition:e,item:n,type:a}of r.getWalker({startPosition:t,direction:o})){if(i.isLimit(n)&&!i.isInline(n))return e;if(a==s&&i.isBlock(n))return null}return null}function p(e,t,o){const i="backward"==o?t.end:t.start;if(e.checkChild(i,"$text"))return i;for(const{nextPosition:i}of t.getWalker({direction:o}))if(e.checkChild(i,"$text"))return i}class g extends i.a{static get pluginName(){return"Widget"}static get requires(){return[s.a,n.a]}init(){const e=this.editor,t=e.editing.view,o=t.document;this._previouslySelected=new Set,this.editor.editing.downcastDispatcher.on("selection",(t,o,i)=>{const r=i.writer,s=o.selection;if(s.isCollapsed)return;const n=s.getSelectedElement();if(!n)return;const c=e.editing.mapper.toViewElement(n);Object(a.f)(c)&&i.consumable.consume(s,"selection")&&r.setSelection(r.createRangeOn(c),{fake:!0,label:Object(a.e)(c)})}),this.editor.editing.downcastDispatcher.on("selection",(e,t,o)=>{this._clearPreviouslySelectedWidgets(o.writer);const i=o.writer,r=i.document.selection;let s=null;for(const e of r.getRanges())for(const t of e){const e=t.item;Object(a.f)(e)&&!f(e,s)&&(i.addClass(a.b,e),this._previouslySelected.add(e),s=e)}},{priority:"low"}),t.addObserver(r.a),this.listenTo(o,"mousedown",(...e)=>this._onMousedown(...e)),this.listenTo(o,"arrowKey",(...e)=>{this._handleSelectionChangeOnArrowKeyPress(...e)},{context:[a.f,"$text"]}),this.listenTo(o,"arrowKey",(...e)=>{this._preventDefaultOnArrowKeyPress(...e)},{context:"$root"}),this.listenTo(o,"arrowKey",u(this.editor.editing),{context:"$text"}),this.listenTo(o,"delete",(e,t)=>{this._handleDelete("forward"==t.direction)&&(t.preventDefault(),e.stop())},{context:"$root"})}_onMousedown(e,t){const o=this.editor,i=o.editing.view,r=i.document;let s=t.target;if(function(e){for(;e;){if(e.is("editableElement")&&!e.is("rootElement"))return!0;if(Object(a.f)(e))return!1;e=e.parent}return!1}(s)){if((l.a.isSafari||l.a.isGecko)&&t.domEvent.detail>=3){const e=o.editing.mapper,i=s.is("attributeElement")?s.findAncestor(e=>!e.is("attributeElement")):s,r=e.toModelElement(i);t.preventDefault(),this.editor.model.change(e=>{e.setSelection(r,"in")})}return}if(!Object(a.f)(s)&&(s=s.findAncestor(a.f),!s))return;l.a.isAndroid&&t.preventDefault(),r.isFocused||i.focus();const n=o.editing.mapper.toModelElement(s);this._setSelectionOverElement(n)}_handleSelectionChangeOnArrowKeyPress(e,t){const o=t.keyCode,i=this.editor.model,r=i.schema,s=i.document.selection,n=s.getSelectedElement(),a=Object(c.e)(o,this.editor.locale.contentLanguageDirection);if(n&&r.isObject(n)){const o=a?s.getLastPosition():s.getFirstPosition(),n=r.getNearestSelectionRange(o,a?"forward":"backward");return void(n&&(i.change(e=>{e.setSelection(n)}),t.preventDefault(),e.stop()))}if(!s.isCollapsed)return;const l=this._getObjectElementNextToSelection(a);l&&r.isObject(l)&&(this._setSelectionOverElement(l),t.preventDefault(),e.stop())}_preventDefaultOnArrowKeyPress(e,t){const o=this.editor.model,i=o.schema,r=o.document.selection.getSelectedElement();r&&i.isObject(r)&&(t.preventDefault(),e.stop())}_handleDelete(e){if(this.editor.isReadOnly)return;const t=this.editor.model.document.selection;if(!t.isCollapsed)return;const o=this._getObjectElementNextToSelection(e);return o?(this.editor.model.change(e=>{let i=t.anchor.parent;for(;i.isEmpty;){const t=i;i=t.parent,e.remove(t)}this._setSelectionOverElement(o)}),!0):void 0}_setSelectionOverElement(e){this.editor.model.change(t=>{t.setSelection(t.createRangeOn(e))})}_getObjectElementNextToSelection(e){const t=this.editor.model,o=t.schema,i=t.document.selection,r=t.createSelection(i);t.modifySelection(r,{direction:e?"forward":"backward"});const s=e?r.focus.nodeBefore:r.focus.nodeAfter;return s&&o.isObject(s)?s:null}_clearPreviouslySelectedWidgets(e){for(const t of this._previouslySelected)e.removeClass(a.b,t);this._previouslySelected.clear()}}function f(e,t){return!!t&&Array.from(e.getAncestors()).includes(t)}},"./packages/ckeditor5-widget/src/widgettypearound/utils.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return r})),o.d(t,"f",(function(){return s})),o.d(t,"b",(function(){return n})),o.d(t,"d",(function(){return a})),o.d(t,"c",(function(){return c})),o.d(t,"e",(function(){return l}));var i=o("./packages/ckeditor5-widget/src/utils.js");const r="widget-type-around";function s(e,t,o){return e&&Object(i.f)(e)&&!o.isInline(t)}function n(e){return e.closest(".ck-widget__type-around__button")}function a(e){return e.classList.contains("ck-widget__type-around__button_before")?"before":"after"}function c(e,t){const o=e.closest(".ck-widget");return t.mapDomToView(o)}function l(e){return e.getAttribute(r)}},"./packages/ckeditor5-widget/src/widgettypearound/widgettypearound.js":function(e,t,o){"use strict";o.d(t,"a",(function(){return p}));var i=o("./packages/ckeditor5-core/src/plugin.js"),r=o("./packages/ckeditor5-ui/src/template.js"),s=o("./packages/ckeditor5-enter/src/enter.js"),n=o("./packages/ckeditor5-typing/src/delete.js"),a=o("./packages/ckeditor5-utils/src/keyboard.js"),c=o("./packages/ckeditor5-widget/src/widgettypearound/utils.js"),l=o("./packages/ckeditor5-typing/src/utils/injectunsafekeystrokeshandling.js"),d=o("./packages/ckeditor5-widget/src/utils.js");o("./packages/ckeditor5-widget/theme/widgettypearound.css");const u=["before","after"],h=(new DOMParser).parseFromString('<svg viewBox="0 0 10 8" xmlns="http://www.w3.org/2000/svg"><path d="M9.055.263v3.972h-6.77M1 4.216l2-2.038m-2 2 2 2.038"/></svg>',"image/svg+xml").firstChild;class p extends i.a{static get pluginName(){return"WidgetTypeAround"}static get requires(){return[s.a,n.a]}constructor(e){super(e),this._currentFakeCaretModelElement=null}init(){const e=this.editor,t=e.editing.view;this.on("change:isEnabled",(o,i,r)=>{t.change(e=>{for(const o of t.document.roots)r?e.removeClass("ck-widget__type-around_disabled",o):e.addClass("ck-widget__type-around_disabled",o)}),r||e.model.change(e=>{e.removeSelectionAttribute(c.a)})}),this._enableTypeAroundUIInjection(),this._enableInsertingParagraphsOnButtonClick(),this._enableInsertingParagraphsOnEnterKeypress(),this._enableInsertingParagraphsOnTypingKeystroke(),this._enableTypeAroundFakeCaretActivationUsingKeyboardArrows(),this._enableDeleteIntegration(),this._enableInsertContentIntegration(),this._enableDeleteContentIntegration()}destroy(){this._currentFakeCaretModelElement=null}_insertParagraph(e,t){const o=this.editor,i=o.editing.view;o.execute("insertParagraph",{position:o.model.createPositionAt(e,t)}),i.focus(),i.scrollToTheSelection()}_listenToIfEnabled(e,t,o,i){this.listenTo(e,t,(...e)=>{this.isEnabled&&o(...e)},i)}_insertParagraphAccordingToFakeCaretPosition(){const e=this.editor.model.document.selection,t=Object(c.e)(e);if(!t)return!1;const o=e.getSelectedElement();return this._insertParagraph(o,t),!0}_enableTypeAroundUIInjection(){const e=this.editor,t=e.model.schema,o=e.locale.t,i={before:o("Insert paragraph before block"),after:o("Insert paragraph after block")};e.editing.downcastDispatcher.on("insert",(e,o,s)=>{const n=s.mapper.toViewElement(o.item);Object(c.f)(n,o.item,t)&&function(e,t,o){const i=e.createUIElement("div",{class:"ck ck-reset_all ck-widget__type-around"},(function(e){const o=this.toDomElement(e);return function(e,t){for(const o of u){const i=new r.a({tag:"div",attributes:{class:["ck","ck-widget__type-around__button","ck-widget__type-around__button_"+o],title:t[o]},children:[e.ownerDocument.importNode(h,!0)]});e.appendChild(i.render())}}(o,t),function(e){const t=new r.a({tag:"div",attributes:{class:["ck","ck-widget__type-around__fake-caret"]}});e.appendChild(t.render())}(o),o}));e.insert(e.createPositionAt(o,"end"),i)}(s.writer,i,n)},{priority:"low"})}_enableTypeAroundFakeCaretActivationUsingKeyboardArrows(){const e=this.editor,t=e.model,o=t.document.selection,i=t.schema,r=e.editing.view;function s(e){return"ck-widget_type-around_show-fake-caret_"+e}this._listenToIfEnabled(r.document,"arrowKey",(e,t)=>{this._handleArrowKeyPress(e,t)},{context:[d.f,"$text"],priority:"high"}),this._listenToIfEnabled(o,"change:range",(t,o)=>{o.directChange&&e.model.change(e=>{e.removeSelectionAttribute(c.a)})}),this._listenToIfEnabled(t.document,"change:data",()=>{const t=o.getSelectedElement();if(t){const o=e.editing.mapper.toViewElement(t);if(Object(c.f)(o,t,i))return}e.model.change(e=>{e.removeSelectionAttribute(c.a)})}),this._listenToIfEnabled(e.editing.downcastDispatcher,"selection",(e,t,o)=>{const r=o.writer;if(this._currentFakeCaretModelElement){const e=o.mapper.toViewElement(this._currentFakeCaretModelElement);e&&(r.removeClass(u.map(s),e),this._currentFakeCaretModelElement=null)}const n=t.selection.getSelectedElement();if(!n)return;const a=o.mapper.toViewElement(n);if(!Object(c.f)(a,n,i))return;const l=Object(c.e)(t.selection);l&&(r.addClass(s(l),a),this._currentFakeCaretModelElement=n)}),this._listenToIfEnabled(e.ui.focusTracker,"change:isFocused",(t,o,i)=>{i||e.model.change(e=>{e.removeSelectionAttribute(c.a)})})}_handleArrowKeyPress(e,t){const o=this.editor,i=o.model,r=i.document.selection,s=i.schema,n=o.editing.view,l=t.keyCode,d=Object(a.e)(l,o.locale.contentLanguageDirection),u=n.document.selection.getSelectedElement(),h=o.editing.mapper.toModelElement(u);let p;Object(c.f)(u,h,s)?p=this._handleArrowKeyPressOnSelectedWidget(d):r.isCollapsed&&(p=this._handleArrowKeyPressWhenSelectionNextToAWidget(d)),p&&(t.preventDefault(),e.stop())}_handleArrowKeyPressOnSelectedWidget(e){const t=this.editor.model,o=t.document.selection,i=Object(c.e)(o);return t.change(t=>{if(!i)return t.setSelectionAttribute(c.a,e?"after":"before"),!0;if(!(i===(e?"after":"before")))return t.removeSelectionAttribute(c.a),!0;return!1})}_handleArrowKeyPressWhenSelectionNextToAWidget(e){const t=this.editor,o=t.model,i=o.schema,r=t.plugins.get("Widget"),s=r._getObjectElementNextToSelection(e),n=t.editing.mapper.toViewElement(s);return!!Object(c.f)(n,s,i)&&(o.change(t=>{r._setSelectionOverElement(s),t.setSelectionAttribute(c.a,e?"before":"after")}),!0)}_enableInsertingParagraphsOnButtonClick(){const e=this.editor,t=e.editing.view;this._listenToIfEnabled(t.document,"mousedown",(o,i)=>{const r=Object(c.b)(i.domTarget);if(!r)return;const s=Object(c.d)(r),n=Object(c.c)(r,t.domConverter),a=e.editing.mapper.toModelElement(n);this._insertParagraph(a,s),i.preventDefault(),o.stop()})}_enableInsertingParagraphsOnEnterKeypress(){const e=this.editor,t=e.model.document.selection,o=e.editing.view;this._listenToIfEnabled(o.document,"enter",(o,i)=>{if("atTarget"!=o.eventPhase)return;const r=t.getSelectedElement(),s=e.editing.mapper.toViewElement(r),n=e.model.schema;let a;this._insertParagraphAccordingToFakeCaretPosition()?a=!0:Object(c.f)(s,r,n)&&(this._insertParagraph(r,i.isSoft?"before":"after"),a=!0),a&&(i.preventDefault(),o.stop())},{context:d.f})}_enableInsertingParagraphsOnTypingKeystroke(){const e=this.editor.editing.view,t=[a.f.enter,a.f.delete,a.f.backspace];this._listenToIfEnabled(e.document,"keydown",(e,o)=>{t.includes(o.keyCode)||Object(l.b)(o)||this._insertParagraphAccordingToFakeCaretPosition()},{priority:"high"})}_enableDeleteIntegration(){const e=this.editor,t=e.editing.view,o=e.model,i=o.schema;this._listenToIfEnabled(t.document,"delete",(t,r)=>{if("atTarget"!=t.eventPhase)return;const s=Object(c.e)(o.document.selection);if(!s)return;const n=r.direction,a=o.document.selection.getSelectedElement(),l="forward"==n;if("before"===s===l)e.execute("delete",{selection:o.createSelection(a,"on")});else{const t=i.getNearestSelectionRange(o.createPositionAt(a,s),n);if(t)if(t.isCollapsed){const r=o.createSelection(t.start);if(o.modifySelection(r,{direction:n}),r.focus.isEqual(t.start)){const e=function(e,t){let o=t;for(const i of t.getAncestors({parentFirst:!0})){if(i.childCount>1||e.isLimit(i))break;o=i}return o}(i,t.start.parent);o.deleteContent(o.createSelection(e,"on"),{doNotAutoparagraph:!0})}else o.change(o=>{o.setSelection(t),e.execute(l?"deleteForward":"delete")})}else o.change(o=>{o.setSelection(t),e.execute(l?"deleteForward":"delete")})}r.preventDefault(),t.stop()},{context:d.f})}_enableInsertContentIntegration(){const e=this.editor,t=this.editor.model,o=t.document.selection;this._listenToIfEnabled(e.model,"insertContent",(e,[i,r])=>{if(r&&!r.is("documentSelection"))return;const s=Object(c.e)(o);return s?(e.stop(),t.change(e=>{const r=o.getSelectedElement(),n=t.createPositionAt(r,s),a=e.createSelection(n),c=t.insertContent(i,a);return e.setSelection(a),c})):void 0},{priority:"high"})}_enableDeleteContentIntegration(){const e=this.editor,t=this.editor.model.document.selection;this._listenToIfEnabled(e.model,"deleteContent",(e,[o])=>{if(o&&!o.is("documentSelection"))return;Object(c.e)(t)&&e.stop()},{priority:"high"})}}},"./packages/ckeditor5-widget/theme/widget.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-widget/theme/widget.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-widget/theme/widgetresize.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-widget/theme/widgetresize.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./packages/ckeditor5-widget/theme/widgettypearound.css":function(e,t,o){var i=o("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),r=o("./node_modules/postcss-loader/src/index.js?!./packages/ckeditor5-widget/theme/widgettypearound.css");"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(r,s);e.exports=r.locals||{}},"./src/clipboard.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Clipboard",(function(){return j})),o.d(t,"ClipboardPipeline",(function(){return l})),o.d(t,"DragDrop",(function(){return k})),o.d(t,"PastePlainText",(function(){return y}));var i=o("./packages/ckeditor5-core/src/plugin.js"),r=o("./packages/ckeditor5-utils/src/eventinfo.js"),s=o("./packages/ckeditor5-engine/src/view/observer/domeventobserver.js");class n{constructor(e){this.files=function(e){const t=Array.from(e.files||[]),o=Array.from(e.items||[]);if(t.length)return t;return o.filter(e=>"file"===e.kind).map(e=>e.getAsFile())}(e),this._native=e}get types(){return this._native.types}getData(e){return this._native.getData(e)}setData(e,t){this._native.setData(e,t)}set effectAllowed(e){this._native.effectAllowed=e}get effectAllowed(){return this._native.effectAllowed}set dropEffect(e){this._native.dropEffect=e}get dropEffect(){return this._native.dropEffect}get isCanceled(){return"none"==this._native.dropEffect||!!this._native.mozUserCancelled}}class a extends s.a{constructor(e){super(e);const t=this.document;function o(e){return(o,i)=>{i.preventDefault();const s=i.dropRange?[i.dropRange]:null,n=new r.a(t,e);t.fire(n,{dataTransfer:i.dataTransfer,method:o.name,targetRanges:s,target:i.target}),n.stop.called&&i.stopPropagation()}}this.domEventType=["paste","copy","cut","drop","dragover","dragstart","dragend","dragenter","dragleave"],this.listenTo(t,"paste",o("clipboardInput"),{priority:"low"}),this.listenTo(t,"drop",o("clipboardInput"),{priority:"low"}),this.listenTo(t,"dragover",o("dragging"),{priority:"low"})}onDomEvent(e){const t={dataTransfer:new n(e.clipboardData?e.clipboardData:e.dataTransfer)};"drop"!=e.type&&"dragover"!=e.type||(t.dropRange=function(e,t){const o=t.target.ownerDocument,i=t.clientX,r=t.clientY;let s;o.caretRangeFromPoint&&o.caretRangeFromPoint(i,r)?s=o.caretRangeFromPoint(i,r):t.rangeParent&&(s=o.createRange(),s.setStart(t.rangeParent,t.rangeOffset),s.collapse(!0));if(s)return e.domConverter.domRangeToView(s);return null}(this.view,e)),this.fire(e.type,e,t)}}const c=["figcaption","li"];class l extends i.a{static get pluginName(){return"ClipboardPipeline"}init(){this.editor.editing.view.addObserver(a),this._setupPasteDrop(),this._setupCopyCut()}_setupPasteDrop(){const e=this.editor,t=e.model,o=e.editing.view,i=o.document;this.listenTo(i,"clipboardInput",t=>{e.isReadOnly&&t.stop()},{priority:"highest"}),this.listenTo(i,"clipboardInput",(e,t)=>{const i=t.dataTransfer;let s=t.content||"";var n;s||(i.getData("text/html")?s=function(e){return e.replace(/<span(?: class="Apple-converted-space"|)>(\s+)<\/span>/g,(e,t)=>1==t.length?" ":t).replace(/<!--[\s\S]*?-->/g,"")}(i.getData("text/html")):i.getData("text/plain")&&(((n=(n=i.getData("text/plain")).replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\r?\n\r?\n/g,"</p><p>").replace(/\r?\n/g,"<br>").replace(/^\s/,"&nbsp;").replace(/\s$/,"&nbsp;").replace(/\s\s/g," &nbsp;")).includes("</p><p>")||n.includes("<br>"))&&(n=`<p>${n}</p>`),s=n),s=this.editor.data.htmlProcessor.toView(s));const a=new r.a(this,"inputTransformation");this.fire(a,{content:s,dataTransfer:i,targetRanges:t.targetRanges,method:t.method}),a.stop.called&&e.stop(),o.scrollToTheSelection()},{priority:"low"}),this.listenTo(this,"inputTransformation",(e,o)=>{if(o.content.isEmpty)return;const i=this.editor.data.toModel(o.content,"$clipboardHolder");0!=i.childCount&&(e.stop(),t.change(()=>{this.fire("contentInsertion",{content:i,method:o.method,dataTransfer:o.dataTransfer,targetRanges:o.targetRanges})}))},{priority:"low"}),this.listenTo(this,"contentInsertion",(e,o)=>{o.resultRange=t.insertContent(o.content)},{priority:"low"})}_setupCopyCut(){const e=this.editor,t=e.model.document,o=e.editing.view.document;function i(i,r){const s=r.dataTransfer;r.preventDefault();const n=e.data.toView(e.model.getSelectedContent(t.selection));o.fire("clipboardOutput",{dataTransfer:s,content:n,method:i.name})}this.listenTo(o,"copy",i,{priority:"low"}),this.listenTo(o,"cut",(t,o)=>{e.isReadOnly?o.preventDefault():i(t,o)},{priority:"low"}),this.listenTo(o,"clipboardOutput",(o,i)=>{i.content.isEmpty||(i.dataTransfer.setData("text/html",this.editor.data.htmlProcessor.toData(i.content)),i.dataTransfer.setData("text/plain",function e(t){let o="";if(t.is("$text")||t.is("$textProxy"))o=t.data;else if(t.is("element","img")&&t.hasAttribute("alt"))o=t.getAttribute("alt");else if(t.is("element","br"))o="\n";else{let i=null;for(const r of t.getChildren()){const t=e(r);i&&(i.is("containerElement")||r.is("containerElement"))&&(c.includes(i.name)||c.includes(r.name)?o+="\n":o+="\n\n"),o+=t,i=r}}return o}(i.content))),"cut"==i.method&&e.model.deleteContent(t.selection)},{priority:"low"})}}var d=o("./packages/ckeditor5-engine/src/model/liverange.js"),u=o("./packages/ckeditor5-engine/src/view/observer/mouseobserver.js"),h=o("./packages/ckeditor5-widget/src/widget.js"),p=o("./packages/ckeditor5-utils/src/uid.js"),g=o("./packages/ckeditor5-utils/src/env.js"),f=o("./packages/ckeditor5-widget/src/utils.js"),m=o("./node_modules/lodash-es/throttle.js");o("./packages/ckeditor5-clipboard/theme/clipboard.css");class k extends i.a{static get pluginName(){return"DragDrop"}static get requires(){return[l,h.a]}init(){const e=this.editor,t=e.editing.view;this._draggedRange=null,this._draggingUid="",this._draggableElement=null,this._updateDropMarkerThrottled=Object(m.a)(e=>this._updateDropMarker(e),40),this._removeDropMarkerDelayed=w(()=>this._removeDropMarker(),40),this._clearDraggableAttributesDelayed=w(()=>this._clearDraggableAttributes(),40),t.addObserver(a),t.addObserver(u.a),this._setupDragging(),this._setupContentInsertionIntegration(),this._setupClipboardInputIntegration(),this._setupDropMarker(),this._setupDraggableAttributeHandling(),this.listenTo(e,"change:isReadOnly",(e,t,o)=>{o?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")}),this.on("change:isEnabled",(e,t,o)=>{o||this._finalizeDragging(!1)}),g.a.isAndroid&&this.forceDisabled("noAndroidSupport")}destroy(){return this._draggedRange&&(this._draggedRange.detach(),this._draggedRange=null),this._updateDropMarkerThrottled.cancel(),this._removeDropMarkerDelayed.cancel(),this._clearDraggableAttributesDelayed.cancel(),super.destroy()}_setupDragging(){const e=this.editor,t=e.model,o=t.document,i=e.editing.view,r=i.document;this.listenTo(r,"dragstart",(i,s)=>{const n=o.selection;if(s.target&&s.target.is("editableElement"))return void s.preventDefault();const a=s.target?v(s.target):null;if(a){const o=e.editing.mapper.toModelElement(a);this._draggedRange=d.a.fromRange(t.createRangeOn(o)),e.plugins.has("WidgetToolbarRepository")&&e.plugins.get("WidgetToolbarRepository").forceDisabled("dragDrop")}else if(!r.selection.isCollapsed){const e=r.selection.getSelectedElement();e&&Object(f.f)(e)||(this._draggedRange=d.a.fromRange(n.getFirstRange()))}if(!this._draggedRange)return void s.preventDefault();this._draggingUid=Object(p.a)(),s.dataTransfer.effectAllowed=this.isEnabled?"copyMove":"copy",s.dataTransfer.setData("application/ckeditor5-dragging-uid",this._draggingUid);const c=t.createSelection(this._draggedRange.toRange()),l=e.data.toView(t.getSelectedContent(c));r.fire("clipboardOutput",{dataTransfer:s.dataTransfer,content:l,method:i.name}),this.isEnabled||(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="")},{priority:"low"}),this.listenTo(r,"dragend",(e,t)=>{this._finalizeDragging(!t.dataTransfer.isCanceled&&"move"==t.dataTransfer.dropEffect)},{priority:"low"}),this.listenTo(r,"dragenter",()=>{this.isEnabled&&i.focus()}),this.listenTo(r,"dragleave",()=>{this._removeDropMarkerDelayed()}),this.listenTo(r,"dragging",(t,o)=>{if(!this.isEnabled)return void(o.dataTransfer.dropEffect="none");this._removeDropMarkerDelayed.cancel();const i=b(e,o.targetRanges,o.target);this._draggedRange||(o.dataTransfer.dropEffect="copy"),g.a.isGecko||("copy"==o.dataTransfer.effectAllowed?o.dataTransfer.dropEffect="copy":["all","copyMove"].includes(o.dataTransfer.effectAllowed)&&(o.dataTransfer.dropEffect="move")),i&&this._updateDropMarkerThrottled(i)},{priority:"low"})}_setupClipboardInputIntegration(){const e=this.editor,t=e.editing.view.document;this.listenTo(t,"clipboardInput",(t,o)=>{if("drop"!=o.method)return;const i=b(e,o.targetRanges,o.target);if(this._removeDropMarker(),!i)return this._finalizeDragging(!1),void t.stop();this._draggedRange&&this._draggingUid!=o.dataTransfer.getData("application/ckeditor5-dragging-uid")&&(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="");if("move"==_(o.dataTransfer)&&this._draggedRange&&this._draggedRange.containsRange(i,!0))return this._finalizeDragging(!1),void t.stop();o.targetRanges=[e.editing.mapper.toViewRange(i)]},{priority:"high"})}_setupContentInsertionIntegration(){const e=this.editor.plugins.get(l);e.on("contentInsertion",(e,t)=>{if(!this.isEnabled||"drop"!==t.method)return;const o=t.targetRanges.map(e=>this.editor.editing.mapper.toModelRange(e));this.editor.model.change(e=>e.setSelection(o))},{priority:"high"}),e.on("contentInsertion",(e,t)=>{if(!this.isEnabled||"drop"!==t.method)return;const o="move"==_(t.dataTransfer),i=!t.resultRange||!t.resultRange.isCollapsed;this._finalizeDragging(i&&o)},{priority:"lowest"})}_setupDraggableAttributeHandling(){const e=this.editor,t=e.editing.view,o=t.document;this.listenTo(o,"mousedown",(i,r)=>{if(g.a.isAndroid||!r)return;this._clearDraggableAttributesDelayed.cancel();let s=v(r.target);if(g.a.isBlink&&!e.isReadOnly&&!s&&!o.selection.isCollapsed){const e=o.selection.getSelectedElement();e&&Object(f.f)(e)||(s=o.selection.editableElement)}s&&(t.change(e=>{e.setAttribute("draggable","true",s)}),this._draggableElement=e.editing.mapper.toModelElement(s))}),this.listenTo(o,"mouseup",()=>{g.a.isAndroid||this._clearDraggableAttributesDelayed()})}_clearDraggableAttributes(){const e=this.editor.editing;e.view.change(t=>{this._draggableElement&&"$graveyard"!=this._draggableElement.root.rootName&&t.removeAttribute("draggable",e.mapper.toViewElement(this._draggableElement)),this._draggableElement=null})}_setupDropMarker(){const e=this.editor;e.conversion.for("editingDowncast").markerToHighlight({model:"drop-target",view:{classes:["ck-clipboard-drop-target-range"]}}),e.conversion.for("editingDowncast").markerToElement({model:"drop-target",view:(t,{writer:o})=>{if(e.model.schema.checkChild(t.markerRange.start,"$text"))return o.createUIElement("span",{class:"ck ck-clipboard-drop-target-position"},(function(e){const t=this.toDomElement(e);return t.innerHTML="&NoBreak;<span></span>&NoBreak;",t}))}})}_updateDropMarker(e){const t=this.editor,o=t.model.markers;t.model.change(t=>{o.has("drop-target")?o.get("drop-target").getRange().isEqual(e)||t.updateMarker("drop-target",{range:e}):t.addMarker("drop-target",{range:e,usingOperation:!1,affectsData:!1})})}_removeDropMarker(){const e=this.editor.model;this._removeDropMarkerDelayed.cancel(),this._updateDropMarkerThrottled.cancel(),e.markers.has("drop-target")&&e.change(e=>{e.removeMarker("drop-target")})}_finalizeDragging(e){const t=this.editor,o=t.model;this._removeDropMarker(),this._clearDraggableAttributes(),t.plugins.has("WidgetToolbarRepository")&&t.plugins.get("WidgetToolbarRepository").clearForceDisabled("dragDrop"),this._draggingUid="",this._draggedRange&&(e&&this.isEnabled&&o.deleteContent(o.createSelection(this._draggedRange),{doNotAutoparagraph:!0}),this._draggedRange.detach(),this._draggedRange=null)}}function b(e,t,o){const i=e.model,r=e.editing.mapper;let s=null;const n=t?t[0].start:null;if(o.is("uiElement")&&(o=o.parent),s=function(e,t){const o=e.model,i=e.editing.mapper;if(Object(f.f)(t))return o.createRangeOn(i.toModelElement(t));if(!t.is("editableElement")){const e=t.findAncestor(e=>Object(f.f)(e)||e.is("editableElement"));if(Object(f.f)(e))return o.createRangeOn(i.toModelElement(e))}return null}(e,o),s)return s;const a=function(e,t){const o=e.editing.mapper,i=e.editing.view,r=o.toModelElement(t);if(r)return r;const s=i.createPositionBefore(t),n=o.findMappedViewAncestor(s);return o.toModelElement(n)}(e,o),c=n?r.toModelPosition(n):null;return c?(s=function(e,t,o){const i=e.model;if(!i.schema.checkChild(o,"$block"))return null;const r=i.createPositionAt(o,0),s=t.path.slice(0,r.path.length),n=i.createPositionFromPath(t.root,s).nodeAfter;if(n&&i.schema.isObject(n))return i.createRangeOn(n);return null}(e,c,a),s||(s=i.schema.getNearestSelectionRange(c,g.a.isGecko?"forward":"backward"),s||function(e,t){const o=e.model;for(;t;){if(o.schema.isObject(t))return o.createRangeOn(t);t=t.parent}}(e,c.parent))):function(e,t){const o=e.model,i=o.schema,r=o.createPositionAt(t,0);return i.getNearestSelectionRange(r,"forward")}(e,a)}function _(e){return g.a.isGecko?e.dropEffect:["all","copyMove"].includes(e.effectAllowed)?"move":"copy"}function w(e,t){let o;function i(...r){i.cancel(),o=setTimeout(()=>e(...r),t)}return i.cancel=()=>{clearTimeout(o)},i}function v(e){if(e.is("editableElement"))return null;if(e.hasClass("ck-widget__selection-handle"))return e.findAncestor(f.f);if(Object(f.f)(e))return e;const t=e.findAncestor(e=>Object(f.f)(e)||e.is("editableElement"));return Object(f.f)(t)?t:null}class y extends i.a{static get pluginName(){return"PastePlainText"}static get requires(){return[l]}init(){const e=this.editor,t=e.model,o=e.editing.view,i=o.document,r=t.document.selection;let s=!1;o.addObserver(a),this.listenTo(i,"keydown",(e,t)=>{s=t.shiftKey}),e.plugins.get(l).on("contentInsertion",(e,o)=>{(s||function(e,t){if(e.childCount>1)return!1;const o=e.getChild(0);if(t.isObject(o))return!1;return 0==[...o.getAttributeKeys()].length}(o.content,t.schema))&&t.change(e=>{const i=Array.from(r.getAttributes()).filter(([e])=>t.schema.getAttributeProperties(e).isFormatting);r.isCollapsed||t.deleteContent(r,{doNotAutoparagraph:!0}),i.push(...r.getAttributes());const s=e.createRangeIn(o.content);for(const t of s.getItems())t.is("$textProxy")&&e.setAttributes(i,t)})})}}class j extends i.a{static get pluginName(){return"Clipboard"}static get requires(){return[l,k,y]}}},"./src/core.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Plugin",(function(){return i.a})),o.d(t,"Command",(function(){return r.a})),o.d(t,"MultiCommand",(function(){return s})),o.d(t,"Context",(function(){return b})),o.d(t,"ContextPlugin",(function(){return _.a})),o.d(t,"Editor",(function(){return C})),o.d(t,"EditorUI",(function(){return M})),o.d(t,"attachToForm",(function(){return I})),o.d(t,"DataApiMixin",(function(){return z})),o.d(t,"ElementApiMixin",(function(){return D})),o.d(t,"secureSourceElement",(function(){return B})),o.d(t,"PendingActions",(function(){return F.a})),o.d(t,"icons",(function(){return L}));var i=o("./packages/ckeditor5-core/src/plugin.js"),r=o("./packages/ckeditor5-core/src/command.js");class s extends r.a{constructor(e){super(e),this._childCommands=[]}refresh(){}execute(...e){const t=this._getFirstEnabledCommand();return null!=t&&t.execute(e)}registerChildCommand(e){this._childCommands.push(e),e.on("change:isEnabled",()=>this._checkEnabled()),this._checkEnabled()}_checkEnabled(){this.isEnabled=!!this._getFirstEnabledCommand()}_getFirstEnabledCommand(){return this._childCommands.find(e=>e.isEnabled)}}var n=o("./node_modules/lodash-es/isPlainObject.js"),a=o("./node_modules/lodash-es/cloneDeepWith.js"),c=o("./node_modules/lodash-es/isElement.js");class l{constructor(e,t){this._config={},t&&this.define(d(t)),e&&this._setObjectToTarget(this._config,e)}set(e,t){this._setToTarget(this._config,e,t)}define(e,t){this._setToTarget(this._config,e,t,!0)}get(e){return this._getFromSource(this._config,e)}*names(){for(const e of Object.keys(this._config))yield e}_setToTarget(e,t,o,i=!1){if(Object(n.a)(t))return void this._setObjectToTarget(e,t,i);const r=t.split(".");t=r.pop();for(const t of r)Object(n.a)(e[t])||(e[t]={}),e=e[t];if(Object(n.a)(o))return Object(n.a)(e[t])||(e[t]={}),e=e[t],void this._setObjectToTarget(e,o,i);i&&void 0!==e[t]||(e[t]=o)}_getFromSource(e,t){const o=t.split(".");t=o.pop();for(const t of o){if(!Object(n.a)(e[t])){e=null;break}e=e[t]}return e?d(e[t]):void 0}_setObjectToTarget(e,t,o){Object.keys(t).forEach(i=>{this._setToTarget(e,i,t[i],o)})}}function d(e){return Object(a.a)(e,u)}function u(e){return Object(c.a)(e)?e:void 0}var h=o("./packages/ckeditor5-utils/src/collection.js"),p=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),g=o("./packages/ckeditor5-utils/src/emittermixin.js"),f=o("./packages/ckeditor5-utils/src/mix.js");class m{constructor(e,t=[],o=[]){this._context=e,this._plugins=new Map,this._availablePlugins=new Map;for(const e of t)e.pluginName&&this._availablePlugins.set(e.pluginName,e);this._contextPlugins=new Map;for(const[e,t]of o)this._contextPlugins.set(e,t),this._contextPlugins.set(t,e),e.pluginName&&this._availablePlugins.set(e.pluginName,e)}*[Symbol.iterator](){for(const e of this._plugins)"function"==typeof e[0]&&(yield e)}get(e){const t=this._plugins.get(e);if(!t){let t=e;throw"function"==typeof e&&(t=e.pluginName||e.name),new p.a("plugincollection-plugin-not-loaded",this._context,{plugin:t})}return t}has(e){return this._plugins.has(e)}init(e,t=[],o=[]){const i=this,r=this._context;!function e(t,o=new Set){t.forEach(t=>{a(t)&&(o.has(t)||(o.add(t),t.pluginName&&!i._availablePlugins.has(t.pluginName)&&i._availablePlugins.set(t.pluginName,t),t.requires&&e(t.requires,o)))})}(e),u(e);const s=[...function e(t,o=new Set){return t.map(e=>a(e)?e:i._availablePlugins.get(e)).reduce((t,i)=>o.has(i)?t:(o.add(i),i.requires&&(u(i.requires,i),e(i.requires,o).forEach(e=>t.add(e))),t.add(i)),new Set)}(e.filter(e=>!l(e,t)))];!function(e,t){for(const o of t){if("function"!=typeof o)throw new p.a("plugincollection-replace-plugin-invalid-type",null,{pluginItem:o});const t=o.pluginName;if(!t)throw new p.a("plugincollection-replace-plugin-missing-name",null,{pluginItem:o});if(o.requires&&o.requires.length)throw new p.a("plugincollection-plugin-for-replacing-cannot-have-dependencies",null,{pluginName:t});const r=i._availablePlugins.get(t);if(!r)throw new p.a("plugincollection-plugin-for-replacing-not-exist",null,{pluginName:t});const s=e.indexOf(r);if(-1===s){if(i._contextPlugins.has(r))return;throw new p.a("plugincollection-plugin-for-replacing-not-loaded",null,{pluginName:t})}if(r.requires&&r.requires.length)throw new p.a("plugincollection-replaced-plugin-cannot-have-dependencies",null,{pluginName:t});e.splice(s,1,o),i._availablePlugins.set(t,o)}}(s,o);const n=function(e){return e.map(e=>{const t=i._contextPlugins.get(e)||new e(r);return i._add(e,t),t})}(s);return h(n,"init").then(()=>h(n,"afterInit")).then(()=>n);function a(e){return"function"==typeof e}function c(e){return a(e)&&e.isContextPlugin}function l(e,t){return t.some(t=>t===e||(d(e)===t||d(t)===e))}function d(e){return a(e)?e.pluginName||e.name:e}function u(e,o=null){e.map(e=>a(e)?e:i._availablePlugins.get(e)||e).forEach(e=>{!function(e,t){if(a(e))return;if(t)throw new p.a("plugincollection-soft-required",r,{missingPlugin:e,requiredBy:d(t)});throw new p.a("plugincollection-plugin-not-found",r,{plugin:e})}(e,o),function(e,t){if(!c(t))return;if(c(e))return;throw new p.a("plugincollection-context-required",r,{plugin:d(e),requiredBy:d(t)})}(e,o),function(e,o){if(!o)return;if(!l(e,t))return;throw new p.a("plugincollection-required",r,{plugin:d(e),requiredBy:d(o)})}(e,o)})}function h(e,t){return e.reduce((e,o)=>o[t]?i._contextPlugins.has(o)?e:e.then(o[t].bind(o)):e,Promise.resolve())}}destroy(){const e=[];for(const[,t]of this)"function"!=typeof t.destroy||this._contextPlugins.has(t)||e.push(t.destroy());return Promise.all(e)}_add(e,t){this._plugins.set(e,t);const o=e.pluginName;if(o){if(this._plugins.has(o))throw new p.a("plugincollection-plugin-name-conflict",null,{pluginName:o,plugin1:this._plugins.get(o).constructor,plugin2:e});this._plugins.set(o,t)}}}Object(f.a)(m,g.c);var k=o("./packages/ckeditor5-utils/src/locale.js");class b{constructor(e){this.config=new l(e,this.constructor.defaultConfig);const t=this.constructor.builtinPlugins;this.config.define("plugins",t),this.plugins=new m(this,t);const o=this.config.get("language")||{};this.locale=new k.a({uiLanguage:"string"==typeof o?o:o.ui,contentLanguage:this.config.get("language.content")}),this.t=this.locale.t,this.editors=new h.a,this._contextOwner=null}initPlugins(){const e=this.config.get("plugins")||[],t=this.config.get("substitutePlugins")||[];for(const o of e.concat(t)){if("function"!=typeof o)throw new p.a("context-initplugins-constructor-only",null,{Plugin:o});if(!0!==o.isContextPlugin)throw new p.a("context-initplugins-invalid-plugin",null,{Plugin:o})}return this.plugins.init(e,[],t)}destroy(){return Promise.all(Array.from(this.editors,e=>e.destroy())).then(()=>this.plugins.destroy())}_addEditor(e,t){if(this._contextOwner)throw new p.a("context-addeditor-private-context");this.editors.add(e),t&&(this._contextOwner=e)}_removeEditor(e){return this.editors.has(e)&&this.editors.remove(e),this._contextOwner===e?this.destroy():Promise.resolve()}_getEditorConfig(){const e={};for(const t of this.config.names())["plugins","removePlugins","extraPlugins"].includes(t)||(e[t]=this.config.get(t));return e}static create(e){return new Promise(t=>{const o=new this(e);t(o.initPlugins().then(()=>o))})}}var _=o("./packages/ckeditor5-core/src/contextplugin.js"),w=o("./packages/ckeditor5-engine/src/controller/editingcontroller.js");class v{constructor(){this._commands=new Map}add(e,t){this._commands.set(e,t)}get(e){return this._commands.get(e)}execute(e,...t){const o=this.get(e);if(!o)throw new p.a("commandcollection-command-not-found",this,{commandName:e});return o.execute(...t)}*names(){yield*this._commands.keys()}*commands(){yield*this._commands.values()}[Symbol.iterator](){return this._commands[Symbol.iterator]()}destroy(){for(const e of this.commands())e.destroy()}}var y=o("./packages/ckeditor5-engine/src/controller/datacontroller.js"),j=o("./packages/ckeditor5-engine/src/conversion/conversion.js"),x=o("./packages/ckeditor5-engine/src/model/model.js"),P=o("./packages/ckeditor5-utils/src/keystrokehandler.js");class O extends P.a{constructor(e){super(),this.editor=e}set(e,t,o={}){if("string"==typeof t){const e=t;t=(t,o)=>{this.editor.execute(e),o()}}super.set(e,t,o)}}var A=o("./packages/ckeditor5-utils/src/observablemixin.js"),T=o("./packages/ckeditor5-engine/src/view/stylesmap.js");class C{constructor(e={}){this._context=e.context||new b({language:e.language}),this._context._addEditor(this,!e.context);const t=Array.from(this.constructor.builtinPlugins||[]);this.config=new l(e,this.constructor.defaultConfig),this.config.define("plugins",t),this.config.define(this._context._getEditorConfig()),this.plugins=new m(this,t,this._context.plugins),this.locale=this._context.locale,this.t=this.locale.t,this.commands=new v,this.set("state","initializing"),this.once("ready",()=>this.state="ready",{priority:"high"}),this.once("destroy",()=>this.state="destroyed",{priority:"high"}),this.set("isReadOnly",!1),this.model=new x.a;const o=new T.a;this.data=new y.a(this.model,o),this.editing=new w.a(this.model,o),this.editing.view.document.bind("isReadOnly").to(this),this.conversion=new j.a([this.editing.downcastDispatcher,this.data.downcastDispatcher],this.data.upcastDispatcher),this.conversion.addAlias("dataDowncast",this.data.downcastDispatcher),this.conversion.addAlias("editingDowncast",this.editing.downcastDispatcher),this.keystrokes=new O(this),this.keystrokes.listenTo(this.editing.view.document)}initPlugins(){const e=this.config,t=e.get("plugins"),o=e.get("removePlugins")||[],i=e.get("extraPlugins")||[],r=e.get("substitutePlugins")||[];return this.plugins.init(t.concat(i),o,r)}destroy(){let e=Promise.resolve();return"initializing"==this.state&&(e=new Promise(e=>this.once("ready",e))),e.then(()=>{this.fire("destroy"),this.stopListening(),this.commands.destroy()}).then(()=>this.plugins.destroy()).then(()=>{this.model.destroy(),this.data.destroy(),this.editing.destroy(),this.keystrokes.destroy()}).then(()=>this._context._removeEditor(this))}execute(...e){try{return this.commands.execute(...e)}catch(e){p.a.rethrowUnexpectedError(e,this)}}focus(){this.editing.view.focus()}}Object(f.a)(C,A.a);class E{constructor(e){this.editor=e,this._components=new Map}*names(){for(const e of this._components.values())yield e.originalName}add(e,t){this._components.set(S(e),{callback:t,originalName:e})}create(e){if(!this.has(e))throw new p.a("componentfactory-item-missing",this,{name:e});return this._components.get(S(e)).callback(this.editor.locale)}has(e){return this._components.has(S(e))}}function S(e){return String(e).toLowerCase()}var R=o("./packages/ckeditor5-utils/src/focustracker.js");class M{constructor(e){this.editor=e,this.componentFactory=new E(e),this.focusTracker=new R.a,this._editableElementsMap=new Map,this.listenTo(e.editing.view.document,"layoutChanged",()=>this.update())}get element(){return null}update(){this.fire("update")}destroy(){this.stopListening(),this.focusTracker.destroy();for(const e of this._editableElementsMap.values())e.ckeditorInstance=null;this._editableElementsMap=new Map}setEditableElement(e,t){this._editableElementsMap.set(e,t),t.ckeditorInstance||(t.ckeditorInstance=this.editor)}getEditableElement(e="main"){return this._editableElementsMap.get(e)}getEditableElementsNames(){return this._editableElementsMap.keys()}get _editableElements(){return console.warn("editor-ui-deprecated-editable-elements: The EditorUI#_editableElements property has been deprecated and will be removed in the near future.",{editorUI:this}),this._editableElementsMap}}Object(f.a)(M,g.c);var N=o("./node_modules/lodash-es/isFunction.js");function I(e){if(!Object(N.a)(e.updateSourceElement))throw new p.a("attachtoform-missing-elementapi-interface",e);const t=e.sourceElement;if(t&&"textarea"===t.tagName.toLowerCase()&&t.form){let o;const i=t.form,r=()=>e.updateSourceElement();Object(N.a)(i.submit)&&(o=i.submit,i.submit=()=>{r(),o.apply(i)}),i.addEventListener("submit",r),e.on("destroy",()=>{i.removeEventListener("submit",r),o&&(i.submit=o)})}}var z={setData(e){this.data.set(e)},getData(e){return this.data.get(e)}},V=o("./packages/ckeditor5-utils/src/dom/setdatainelement.js");var D={updateSourceElement(){if(!this.sourceElement)throw new p.a("editor-missing-sourceelement",this);Object(V.a)(this.sourceElement,this.data.get())}};function B(e){const t=e.sourceElement;if(t){if(t.ckeditorInstance)throw new p.a("editor-source-element-already-used",e);t.ckeditorInstance=e,e.once("destroy",()=>{delete t.ckeditorInstance})}}var F=o("./packages/ckeditor5-core/src/pendingactions.js");const L={cancel:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.591 10.177 4.243 4.242a1 1 0 0 1-1.415 1.415l-4.242-4.243-4.243 4.243a1 1 0 0 1-1.414-1.415l4.243-4.242L4.52 5.934A1 1 0 0 1 5.934 4.52l4.243 4.243 4.242-4.243a1 1 0 1 1 1.415 1.414l-4.243 4.243z"/></svg>',caption:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 16h9a1 1 0 0 1 0 2H2a1 1 0 0 1 0-2z"/><path d="M17 1a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h14zm0 1.5H3a.5.5 0 0 0-.492.41L2.5 3v9a.5.5 0 0 0 .41.492L3 12.5h14a.5.5 0 0 0 .492-.41L17.5 12V3a.5.5 0 0 0-.41-.492L17 2.5z" fill-opacity=".6"/></svg>',check:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.972 16.615a.997.997 0 0 1-.744-.292l-4.596-4.596a1 1 0 1 1 1.414-1.414l3.926 3.926 9.937-9.937a1 1 0 0 1 1.414 1.415L7.717 16.323a.997.997 0 0 1-.745.292z"/></svg>',cog:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.333 2 .19 2.263a5.899 5.899 0 0 1 1.458.604L14.714 3.4 16.6 5.286l-1.467 1.733c.263.452.468.942.605 1.46L18 8.666v2.666l-2.263.19a5.899 5.899 0 0 1-.604 1.458l1.467 1.733-1.886 1.886-1.733-1.467a5.899 5.899 0 0 1-1.46.605L11.334 18H8.667l-.19-2.263a5.899 5.899 0 0 1-1.458-.604L5.286 16.6 3.4 14.714l1.467-1.733a5.899 5.899 0 0 1-.604-1.458L2 11.333V8.667l2.262-.189a5.899 5.899 0 0 1 .605-1.459L3.4 5.286 5.286 3.4l1.733 1.467a5.899 5.899 0 0 1 1.46-.605L8.666 2h2.666zM10 6.267a3.733 3.733 0 1 0 0 7.466 3.733 3.733 0 0 0 0-7.466z"/></svg>',eraser:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m8.636 9.531-2.758 3.94a.5.5 0 0 0 .122.696l3.224 2.284h1.314l2.636-3.736L8.636 9.53zm.288 8.451L5.14 15.396a2 2 0 0 1-.491-2.786l6.673-9.53a2 2 0 0 1 2.785-.49l3.742 2.62a2 2 0 0 1 .491 2.785l-7.269 10.053-2.147-.066z"/><path d="M4 18h5.523v-1H4zm-2 0h1v-1H2z"/></svg>',lowVision:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M5.085 6.22 2.943 4.078a.75.75 0 1 1 1.06-1.06l2.592 2.59A11.094 11.094 0 0 1 10 5.068c4.738 0 8.578 3.101 8.578 5.083 0 1.197-1.401 2.803-3.555 3.887l1.714 1.713a.75.75 0 0 1-.09 1.138.488.488 0 0 1-.15.084.75.75 0 0 1-.821-.16L6.17 7.304c-.258.11-.51.233-.757.365l6.239 6.24-.006.005.78.78c-.388.094-.78.166-1.174.215l-1.11-1.11h.011L4.55 8.197a7.2 7.2 0 0 0-.665.514l-.112.098 4.897 4.897-.005.006 1.276 1.276a10.164 10.164 0 0 1-1.477-.117l-.479-.479-.009.009-4.863-4.863-.022.031a2.563 2.563 0 0 0-.124.2c-.043.077-.08.158-.108.241a.534.534 0 0 0-.028.133.29.29 0 0 0 .008.072.927.927 0 0 0 .082.226c.067.133.145.26.234.379l3.242 3.365.025.01.59.623c-3.265-.918-5.59-3.155-5.59-4.668 0-1.194 1.448-2.838 3.663-3.93zm7.07.531a4.632 4.632 0 0 1 1.108 5.992l.345.344.046-.018a9.313 9.313 0 0 0 2-1.112c.256-.187.5-.392.727-.613.137-.134.27-.277.392-.431.072-.091.141-.185.203-.286.057-.093.107-.19.148-.292a.72.72 0 0 0 .036-.12.29.29 0 0 0 .008-.072.492.492 0 0 0-.028-.133.999.999 0 0 0-.036-.096 2.165 2.165 0 0 0-.071-.145 2.917 2.917 0 0 0-.125-.2 3.592 3.592 0 0 0-.263-.335 5.444 5.444 0 0 0-.53-.523 7.955 7.955 0 0 0-1.054-.768 9.766 9.766 0 0 0-1.879-.891c-.337-.118-.68-.219-1.027-.301zm-2.85.21-.069.002a.508.508 0 0 0-.254.097.496.496 0 0 0-.104.679.498.498 0 0 0 .326.199l.045.005c.091.003.181.003.272.012a2.45 2.45 0 0 1 2.017 1.513c.024.061.043.125.069.185a.494.494 0 0 0 .45.287h.008a.496.496 0 0 0 .35-.158.482.482 0 0 0 .13-.335.638.638 0 0 0-.048-.219 3.379 3.379 0 0 0-.36-.723 3.438 3.438 0 0 0-2.791-1.543l-.028-.001h-.013z"/></svg>',image:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.91 10.54c.26-.23.64-.21.88.03l3.36 3.14 2.23-2.06a.64.64 0 0 1 .87 0l2.52 2.97V4.5H3.2v10.12l3.71-4.08zm10.27-7.51c.6 0 1.09.47 1.09 1.05v11.84c0 .59-.49 1.06-1.09 1.06H2.79c-.6 0-1.09-.47-1.09-1.06V4.08c0-.58.49-1.05 1.1-1.05h14.38zm-5.22 5.56a1.96 1.96 0 1 1 3.4-1.96 1.96 1.96 0 0 1-3.4 1.96z"/></svg>',alignBottom:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m9.239 13.938-2.88-1.663a.75.75 0 0 1 .75-1.3L9 12.067V4.75a.75.75 0 1 1 1.5 0v7.318l1.89-1.093a.75.75 0 0 1 .75 1.3l-2.879 1.663a.752.752 0 0 1-.511.187.752.752 0 0 1-.511-.187zM4.25 17a.75.75 0 1 1 0-1.5h10.5a.75.75 0 0 1 0 1.5H4.25z"/></svg>',alignMiddle:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M9.75 11.875a.752.752 0 0 1 .508.184l2.883 1.666a.75.75 0 0 1-.659 1.344l-.091-.044-1.892-1.093.001 4.318a.75.75 0 1 1-1.5 0v-4.317l-1.89 1.092a.75.75 0 0 1-.75-1.3l2.879-1.663a.752.752 0 0 1 .51-.187zM15.25 9a.75.75 0 1 1 0 1.5H4.75a.75.75 0 1 1 0-1.5h10.5zM9.75.375a.75.75 0 0 1 .75.75v4.318l1.89-1.093.092-.045a.75.75 0 0 1 .659 1.344l-2.883 1.667a.752.752 0 0 1-.508.184.752.752 0 0 1-.511-.187L6.359 5.65a.75.75 0 0 1 .75-1.299L9 5.442V1.125a.75.75 0 0 1 .75-.75z"/></svg>',alignTop:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m10.261 7.062 2.88 1.663a.75.75 0 0 1-.75 1.3L10.5 8.933v7.317a.75.75 0 1 1-1.5 0V8.932l-1.89 1.093a.75.75 0 0 1-.75-1.3l2.879-1.663a.752.752 0 0 1 .511-.187.752.752 0 0 1 .511.187zM15.25 4a.75.75 0 1 1 0 1.5H4.75a.75.75 0 0 1 0-1.5h10.5z"/></svg>',alignLeft:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>',alignCenter:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm2.286 4c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75z"/></svg>',alignRight:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M18 3.75a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 8a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 4a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75zm0-8a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75z"/></svg>',alignJustify:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>',objectLeft:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm11.5 9H18v1.5h-4.5zm0-3H18v1.5h-4.5zm0-3H18v1.5h-4.5zM2 15h16v1.5H2z"/><path d="M12.003 7v5.5a1 1 0 0 1-1 1H2.996a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h8.007a1 1 0 0 1 1 1zm-1.506.5H3.5V12h6.997V7.5z"/></svg>',objectCenter:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm0 12h16v1.5H2z"/><path d="M15.003 7v5.5a1 1 0 0 1-1 1H5.996a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h8.007a1 1 0 0 1 1 1zm-1.506.5H6.5V12h6.997V7.5z"/></svg>',objectRight:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm0 12h16v1.5H2zm0-9h5v1.5H2zm0 3h5v1.5H2zm0 3h5v1.5H2z"/><path d="M18.003 7v5.5a1 1 0 0 1-1 1H8.996a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h8.007a1 1 0 0 1 1 1zm-1.506.5H9.5V12h6.997V7.5z"/></svg>',objectFullWidth:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm0 12h16v1.5H2z"/><path d="M18 7v5.5a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1zm-1.505.5H3.504V12h12.991V7.5z"/></svg>',objectInline:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm11.5 9H18v1.5h-4.5zM2 15h16v1.5H2z"/><path d="M12.003 7v5.5a1 1 0 0 1-1 1H2.996a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h8.007a1 1 0 0 1 1 1zm-1.506.5H3.5V12h6.997V7.5z"/></svg>',objectBlockLeft:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm0 12h16v1.5H2z"/><path d="M12.003 7v5.5a1 1 0 0 1-1 1H2.996a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h8.007a1 1 0 0 1 1 1zm-1.506.5H3.5V12h6.997V7.5z"/></svg>',objectBlockRight:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M2 3h16v1.5H2zm0 12h16v1.5H2z"/><path d="M18.003 7v5.5a1 1 0 0 1-1 1H8.996a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h8.007a1 1 0 0 1 1 1zm-1.506.5H9.5V12h6.997V7.5z"/></svg>',objectSizeFull:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M18.095 2H1.905C.853 2 0 2.895 0 4v12c0 1.105.853 2 1.905 2h16.19C19.147 18 20 17.105 20 16V4c0-1.105-.853-2-1.905-2zm0 1.5c.263 0 .476.224.476.5v12c0 .276-.213.5-.476.5H1.905a.489.489 0 0 1-.476-.5V4c0-.276.213-.5.476-.5h16.19z"/></svg>',objectSizeLarge:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M13 6H2a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2zm0 1.5a.5.5 0 0 1 .5.5v8a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5V8a.5.5 0 0 1 .5-.5h11z"/></svg>',objectSizeSmall:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M7 10H2a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h5a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2zm0 1.5a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5v-4a.5.5 0 0 1 .5-.5h5z"/></svg>',objectSizeMedium:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.5 17v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zm2 0v1h-1v-1h1zM1 15.5v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm-19-2v1H0v-1h1zm19 0v1h-1v-1h1zm0-2v1h-1v-1h1zm-19 0v1H0v-1h1zM14.5 2v1h-1V2h1zm2 0v1h-1V2h1zm2 0v1h-1V2h1zm-8 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm-2 0v1h-1V2h1zm8 0v1h-1V2h1zm-10 0v1h-1V2h1z"/><path d="M10 8H2a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2zm0 1.5a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5v-6a.5.5 0 0 1 .5-.5h8z"/></svg>',pencil:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m7.3 17.37-.061.088a1.518 1.518 0 0 1-.934.535l-4.178.663-.806-4.153a1.495 1.495 0 0 1 .187-1.058l.056-.086L8.77 2.639c.958-1.351 2.803-1.076 4.296-.03 1.497 1.047 2.387 2.693 1.433 4.055L7.3 17.37zM9.14 4.728l-5.545 8.346 3.277 2.294 5.544-8.346L9.14 4.728zM6.07 16.512l-3.276-2.295.53 2.73 2.746-.435zM9.994 3.506 13.271 5.8c.316-.452-.16-1.333-1.065-1.966-.905-.634-1.895-.78-2.212-.328zM8 18.5 9.375 17H19v1.5H8z"/></svg>',pilcrow:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.999 2H15a1 1 0 0 1 0 2h-1.004v13a1 1 0 1 1-2 0V4H8.999v13a1 1 0 1 1-2 0v-7A4 4 0 0 1 3 6a4 4 0 0 1 3.999-4z"/></svg>',quote:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 10.423a6.5 6.5 0 0 1 6.056-6.408l.038.67C6.448 5.423 5.354 7.663 5.22 10H9c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574zm8 0a6.5 6.5 0 0 1 6.056-6.408l.038.67c-2.646.739-3.74 2.979-3.873 5.315H17c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574z"/></svg>',threeVerticalDots:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><circle cx="9.5" cy="4.5" r="1.5"/><circle cx="9.5" cy="10.5" r="1.5"/><circle cx="9.5" cy="16.5" r="1.5"/></svg>'}},"./src/engine.js":function(e,t,o){"use strict";o.r(t),o.d(t,"enablePlaceholder",(function(){return r})),o.d(t,"disablePlaceholder",(function(){return s})),o.d(t,"showPlaceholder",(function(){return n})),o.d(t,"hidePlaceholder",(function(){return a})),o.d(t,"needsPlaceholder",(function(){return c})),o.d(t,"EditingController",(function(){return h.a})),o.d(t,"DataController",(function(){return p.a})),o.d(t,"Conversion",(function(){return g.a})),o.d(t,"HtmlDataProcessor",(function(){return f.a})),o.d(t,"InsertOperation",(function(){return m.a})),o.d(t,"MarkerOperation",(function(){return k.a})),o.d(t,"OperationFactory",(function(){return b.a})),o.d(t,"transformSets",(function(){return _.a})),o.d(t,"DocumentSelection",(function(){return w.a})),o.d(t,"Range",(function(){return v.a})),o.d(t,"LiveRange",(function(){return y.a})),o.d(t,"LivePosition",(function(){return j.a})),o.d(t,"Model",(function(){return x.a})),o.d(t,"TreeWalker",(function(){return P.a})),o.d(t,"Element",(function(){return O.a})),o.d(t,"DomConverter",(function(){return A.a})),o.d(t,"Renderer",(function(){return T.a})),o.d(t,"ViewDocument",(function(){return C.a})),o.d(t,"getFillerOffset",(function(){return E.b})),o.d(t,"Observer",(function(){return S.a})),o.d(t,"ClickObserver",(function(){return M})),o.d(t,"DomEventObserver",(function(){return R.a})),o.d(t,"MouseObserver",(function(){return N.a})),o.d(t,"DowncastWriter",(function(){return I.a})),o.d(t,"UpcastWriter",(function(){return H})),o.d(t,"Matcher",(function(){return q.a})),o.d(t,"DomEventData",(function(){return $.a})),o.d(t,"StylesProcessor",(function(){return U.a})),o.d(t,"addBackgroundRules",(function(){return _e})),o.d(t,"addBorderRules",(function(){return ve})),o.d(t,"addMarginRules",(function(){return Re})),o.d(t,"addPaddingRules",(function(){return Me})),o.d(t,"isColor",(function(){return Q})),o.d(t,"isLineStyle",(function(){return te})),o.d(t,"isLength",(function(){return ie})),o.d(t,"isPercentage",(function(){return se})),o.d(t,"isRepeat",(function(){return ae})),o.d(t,"isPosition",(function(){return le})),o.d(t,"isAttachment",(function(){return ue})),o.d(t,"isURL",(function(){return pe})),o.d(t,"getBoxSidesValues",(function(){return ge})),o.d(t,"getBoxSidesValueReducer",(function(){return fe})),o.d(t,"getBoxSidesShorthandValue",(function(){return me})),o.d(t,"getPositionShorthandNormalizer",(function(){return ke})),o.d(t,"getShorthandValues",(function(){return be}));o("./packages/ckeditor5-engine/theme/placeholder.css");const i=new WeakMap;function r(e){const{view:t,element:o,text:r,isDirectHost:s=!0,keepOnFocus:n=!1}=e,a=t.document;i.has(a)||(i.set(a,new Map),a.registerPostFixer(e=>l(a,e))),i.get(a).set(o,{text:r,isDirectHost:s,keepOnFocus:n,hostElement:s?o:null}),t.change(e=>l(a,e))}function s(e,t){const o=t.document;e.change(e=>{if(!i.has(o))return;const r=i.get(o),s=r.get(t);e.removeAttribute("data-placeholder",s.hostElement),a(e,s.hostElement),r.delete(t)})}function n(e,t){return!t.hasClass("ck-placeholder")&&(e.addClass("ck-placeholder",t),!0)}function a(e,t){return!!t.hasClass("ck-placeholder")&&(e.removeClass("ck-placeholder",t),!0)}function c(e,t){if(!e.isAttached())return!1;if(Array.from(e.getChildren()).some(e=>!e.is("uiElement")))return!1;if(t)return!0;const o=e.document;if(!o.isFocused)return!0;const i=o.selection.anchor;return i&&i.parent!==e}function l(e,t){const o=i.get(e),r=[];let s=!1;for(const[e,i]of o)i.isDirectHost&&(r.push(e),d(t,e,i)&&(s=!0));for(const[e,i]of o){if(i.isDirectHost)continue;const o=u(e);o&&(r.includes(o)||(i.hostElement=o,d(t,e,i)&&(s=!0)))}return s}function d(e,t,o){const{text:i,isDirectHost:r,hostElement:s}=o;let l=!1;s.getAttribute("data-placeholder")!==i&&(e.setAttribute("data-placeholder",i,s),l=!0);return(r||1==t.childCount)&&c(s,o.keepOnFocus)?n(e,s)&&(l=!0):a(e,s)&&(l=!0),l}function u(e){if(e.childCount){const t=e.getChild(0);if(t.is("element")&&!t.is("uiElement"))return t}return null}var h=o("./packages/ckeditor5-engine/src/controller/editingcontroller.js"),p=o("./packages/ckeditor5-engine/src/controller/datacontroller.js"),g=o("./packages/ckeditor5-engine/src/conversion/conversion.js"),f=o("./packages/ckeditor5-engine/src/dataprocessor/htmldataprocessor.js"),m=o("./packages/ckeditor5-engine/src/model/operation/insertoperation.js"),k=o("./packages/ckeditor5-engine/src/model/operation/markeroperation.js"),b=o("./packages/ckeditor5-engine/src/model/operation/operationfactory.js"),_=o("./packages/ckeditor5-engine/src/model/operation/transform.js"),w=o("./packages/ckeditor5-engine/src/model/documentselection.js"),v=o("./packages/ckeditor5-engine/src/model/range.js"),y=o("./packages/ckeditor5-engine/src/model/liverange.js"),j=o("./packages/ckeditor5-engine/src/model/liveposition.js"),x=o("./packages/ckeditor5-engine/src/model/model.js"),P=o("./packages/ckeditor5-engine/src/model/treewalker.js"),O=o("./packages/ckeditor5-engine/src/model/element.js"),A=o("./packages/ckeditor5-engine/src/view/domconverter.js"),T=o("./packages/ckeditor5-engine/src/view/renderer.js"),C=o("./packages/ckeditor5-engine/src/view/document.js"),E=o("./packages/ckeditor5-engine/src/view/containerelement.js"),S=o("./packages/ckeditor5-engine/src/view/observer/observer.js"),R=o("./packages/ckeditor5-engine/src/view/observer/domeventobserver.js");class M extends R.a{constructor(e){super(e),this.domEventType="click"}onDomEvent(e){this.fire(e.type,e)}}var N=o("./packages/ckeditor5-engine/src/view/observer/mouseobserver.js"),I=o("./packages/ckeditor5-engine/src/view/downcastwriter.js"),z=o("./packages/ckeditor5-engine/src/view/documentfragment.js"),V=o("./packages/ckeditor5-engine/src/view/element.js"),D=o("./packages/ckeditor5-engine/src/view/text.js"),B=o("./node_modules/lodash-es/isPlainObject.js"),F=o("./packages/ckeditor5-engine/src/view/position.js"),L=o("./packages/ckeditor5-engine/src/view/range.js"),W=o("./packages/ckeditor5-engine/src/view/selection.js");class H{constructor(e){this.document=e}createDocumentFragment(e){return new z.a(this.document,e)}createElement(e,t,o){return new V.a(this.document,e,t,o)}createText(e){return new D.a(this.document,e)}clone(e,t=!1){return e._clone(t)}appendChild(e,t){return t._appendChild(e)}insertChild(e,t,o){return o._insertChild(e,t)}removeChildren(e,t,o){return o._removeChildren(e,t)}remove(e){const t=e.parent;return t?this.removeChildren(t.getChildIndex(e),1,t):[]}replace(e,t){const o=e.parent;if(o){const i=o.getChildIndex(e);return this.removeChildren(i,1,o),this.insertChild(i,t,o),!0}return!1}unwrapElement(e){const t=e.parent;if(t){const o=t.getChildIndex(e);this.remove(e),this.insertChild(o,e.getChildren(),t)}}rename(e,t){const o=new V.a(this.document,e,t.getAttributes(),t.getChildren());return this.replace(t,o)?o:null}setAttribute(e,t,o){o._setAttribute(e,t)}removeAttribute(e,t){t._removeAttribute(e)}addClass(e,t){t._addClass(e)}removeClass(e,t){t._removeClass(e)}setStyle(e,t,o){Object(B.a)(e)&&void 0===o&&(o=t),o._setStyle(e,t)}removeStyle(e,t){t._removeStyle(e)}setCustomProperty(e,t,o){o._setCustomProperty(e,t)}removeCustomProperty(e,t){return t._removeCustomProperty(e)}createPositionAt(e,t){return F.a._createAt(e,t)}createPositionAfter(e){return F.a._createAfter(e)}createPositionBefore(e){return F.a._createBefore(e)}createRange(e,t){return new L.a(e,t)}createRangeOn(e){return L.a._createOn(e)}createRangeIn(e){return L.a._createIn(e)}createSelection(e,t,o){return new W.a(e,t,o)}}var q=o("./packages/ckeditor5-engine/src/view/matcher.js"),$=o("./packages/ckeditor5-engine/src/view/observer/domeventdata.js"),U=o("./packages/ckeditor5-engine/src/view/stylesmap.js");const K=/^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i,G=/^rgb\([ ]?([0-9]{1,3}[ %]?,[ ]?){2,3}[0-9]{1,3}[ %]?\)$/i,J=/^rgba\([ ]?([0-9]{1,3}[ %]?,[ ]?){3}(1|[0-9]+%|[0]?\.?[0-9]+)\)$/i,Y=/^hsl\([ ]?([0-9]{1,3}[ %]?[,]?[ ]*){3}(1|[0-9]+%|[0]?\.?[0-9]+)?\)$/i,X=/^hsla\([ ]?([0-9]{1,3}[ %]?,[ ]?){2,3}(1|[0-9]+%|[0]?\.?[0-9]+)\)$/i,Z=new Set(["black","silver","gray","white","maroon","red","purple","fuchsia","green","lime","olive","yellow","navy","blue","teal","aqua","orange","aliceblue","antiquewhite","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","gainsboro","ghostwhite","gold","goldenrod","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","limegreen","linen","magenta","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","oldlace","olivedrab","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellowgreen","rebeccapurple","currentcolor","transparent"]);function Q(e){return e.startsWith("#")?K.test(e):e.startsWith("rgb")?G.test(e)||J.test(e):e.startsWith("hsl")?Y.test(e)||X.test(e):Z.has(e.toLowerCase())}const ee=["none","hidden","dotted","dashed","solid","double","groove","ridge","inset","outset"];function te(e){return ee.includes(e)}const oe=/^([+-]?[0-9]*([.][0-9]+)?(px|cm|mm|in|pc|pt|ch|em|ex|rem|vh|vw|vmin|vmax)|0)$/;function ie(e){return oe.test(e)}const re=/^[+-]?[0-9]*([.][0-9]+)?%$/;function se(e){return re.test(e)}const ne=["repeat-x","repeat-y","repeat","space","round","no-repeat"];function ae(e){return ne.includes(e)}const ce=["center","top","bottom","left","right"];function le(e){return ce.includes(e)}const de=["fixed","scroll","local"];function ue(e){return de.includes(e)}const he=/^url\(/;function pe(e){return he.test(e)}function ge(e=""){if(""===e)return{top:void 0,right:void 0,bottom:void 0,left:void 0};const t=be(e),o=t[0],i=t[2]||o,r=t[1]||o;return{top:o,bottom:i,right:r,left:t[3]||r}}function fe(e){return t=>{const{top:o,right:i,bottom:r,left:s}=t,n=[];return[o,i,s,r].every(e=>!!e)?n.push([e,me(t)]):(o&&n.push([e+"-top",o]),i&&n.push([e+"-right",i]),r&&n.push([e+"-bottom",r]),s&&n.push([e+"-left",s])),n}}function me({top:e,right:t,bottom:o,left:i}){const r=[];return i!==t?r.push(e,t,o,i):o!==e?r.push(e,t,o):t!==e?r.push(e,t):r.push(e),r.join(" ")}function ke(e){return t=>({path:e,value:ge(t)})}function be(e){return e.replace(/, /g,",").split(" ").map(e=>e.replace(/,/g,", "))}function _e(e){e.setNormalizer("background",we),e.setNormalizer("background-color",e=>({path:"background.color",value:e})),e.setReducer("background",e=>{const t=[];return t.push(["background-color",e.color]),t}),e.setStyleRelation("background",["background-color"])}function we(e){const t={},o=be(e);for(const e of o)ae(e)?(t.repeat=t.repeat||[],t.repeat.push(e)):le(e)?(t.position=t.position||[],t.position.push(e)):ue(e)?t.attachment=e:Q(e)?t.color=e:pe(e)&&(t.image=e);return{path:"background",value:t}}function ve(e){e.setNormalizer("border",ye),e.setNormalizer("border-top",je("top")),e.setNormalizer("border-right",je("right")),e.setNormalizer("border-bottom",je("bottom")),e.setNormalizer("border-left",je("left")),e.setNormalizer("border-color",xe("color")),e.setNormalizer("border-width",xe("width")),e.setNormalizer("border-style",xe("style")),e.setNormalizer("border-top-color",Oe("color","top")),e.setNormalizer("border-top-style",Oe("style","top")),e.setNormalizer("border-top-width",Oe("width","top")),e.setNormalizer("border-right-color",Oe("color","right")),e.setNormalizer("border-right-style",Oe("style","right")),e.setNormalizer("border-right-width",Oe("width","right")),e.setNormalizer("border-bottom-color",Oe("color","bottom")),e.setNormalizer("border-bottom-style",Oe("style","bottom")),e.setNormalizer("border-bottom-width",Oe("width","bottom")),e.setNormalizer("border-left-color",Oe("color","left")),e.setNormalizer("border-left-style",Oe("style","left")),e.setNormalizer("border-left-width",Oe("width","left")),e.setExtractor("border-top",Ae("top")),e.setExtractor("border-right",Ae("right")),e.setExtractor("border-bottom",Ae("bottom")),e.setExtractor("border-left",Ae("left")),e.setExtractor("border-top-color","border.color.top"),e.setExtractor("border-right-color","border.color.right"),e.setExtractor("border-bottom-color","border.color.bottom"),e.setExtractor("border-left-color","border.color.left"),e.setExtractor("border-top-width","border.width.top"),e.setExtractor("border-right-width","border.width.right"),e.setExtractor("border-bottom-width","border.width.bottom"),e.setExtractor("border-left-width","border.width.left"),e.setExtractor("border-top-style","border.style.top"),e.setExtractor("border-right-style","border.style.right"),e.setExtractor("border-bottom-style","border.style.bottom"),e.setExtractor("border-left-style","border.style.left"),e.setReducer("border-color",fe("border-color")),e.setReducer("border-style",fe("border-style")),e.setReducer("border-width",fe("border-width")),e.setReducer("border-top",Ee("top")),e.setReducer("border-right",Ee("right")),e.setReducer("border-bottom",Ee("bottom")),e.setReducer("border-left",Ee("left")),e.setReducer("border",function(){return t=>{const o=Te(t,"top"),i=Te(t,"right"),r=Te(t,"bottom"),s=Te(t,"left"),n=[o,i,r,s],a={width:e(n,"width"),style:e(n,"style"),color:e(n,"color")},c=Se(a,"all");if(c.length)return c;return[...Object.entries(a).reduce((e,[t,o])=>(o&&(e.push(["border-"+t,o]),n.forEach(e=>e[t]=null)),e),[]),...Se(o,"top"),...Se(i,"right"),...Se(r,"bottom"),...Se(s,"left")]};function e(e,t){return e.map(e=>e[t]).reduce((e,t)=>e==t?e:null)}}()),e.setStyleRelation("border",["border-color","border-style","border-width","border-top","border-right","border-bottom","border-left","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","border-top-width","border-right-width","border-bottom-width","border-left-width"]),e.setStyleRelation("border-color",["border-top-color","border-right-color","border-bottom-color","border-left-color"]),e.setStyleRelation("border-style",["border-top-style","border-right-style","border-bottom-style","border-left-style"]),e.setStyleRelation("border-width",["border-top-width","border-right-width","border-bottom-width","border-left-width"]),e.setStyleRelation("border-top",["border-top-color","border-top-style","border-top-width"]),e.setStyleRelation("border-right",["border-right-color","border-right-style","border-right-width"]),e.setStyleRelation("border-bottom",["border-bottom-color","border-bottom-style","border-bottom-width"]),e.setStyleRelation("border-left",["border-left-color","border-left-style","border-left-width"])}function ye(e){const{color:t,style:o,width:i}=Ce(e);return{path:"border",value:{color:ge(t),style:ge(o),width:ge(i)}}}function je(e){return t=>{const{color:o,style:i,width:r}=Ce(t),s={};return void 0!==o&&(s.color={[e]:o}),void 0!==i&&(s.style={[e]:i}),void 0!==r&&(s.width={[e]:r}),{path:"border",value:s}}}function xe(e){return t=>({path:"border",value:Pe(t,e)})}function Pe(e,t){return{[t]:ge(e)}}function Oe(e,t){return o=>({path:"border",value:{[e]:{[t]:o}}})}function Ae(e){return(t,o)=>{if(o.border)return Te(o.border,e)}}function Te(e,t){const o={};return e.width&&e.width[t]&&(o.width=e.width[t]),e.style&&e.style[t]&&(o.style=e.style[t]),e.color&&e.color[t]&&(o.color=e.color[t]),o}function Ce(e){const t={},o=be(e);for(const e of o)ie(e)||/thin|medium|thick/.test(e)?t.width=e:te(e)?t.style=e:t.color=e;return t}function Ee(e){return t=>Se(t,e)}function Se(e,t){const o=[];if(e&&e.width&&o.push("width"),e&&e.style&&o.push("style"),e&&e.color&&o.push("color"),3==o.length){const i=o.map(t=>e[t]).join(" ");return["all"==t?["border",i]:["border-"+t,i]]}return"all"==t?[]:o.map(o=>[`border-${t}-${o}`,e[o]])}function Re(e){e.setNormalizer("margin",ke("margin")),e.setNormalizer("margin-top",e=>({path:"margin.top",value:e})),e.setNormalizer("margin-right",e=>({path:"margin.right",value:e})),e.setNormalizer("margin-bottom",e=>({path:"margin.bottom",value:e})),e.setNormalizer("margin-left",e=>({path:"margin.left",value:e})),e.setReducer("margin",fe("margin")),e.setStyleRelation("margin",["margin-top","margin-right","margin-bottom","margin-left"])}function Me(e){e.setNormalizer("padding",ke("padding")),e.setNormalizer("padding-top",e=>({path:"padding.top",value:e})),e.setNormalizer("padding-right",e=>({path:"padding.right",value:e})),e.setNormalizer("padding-bottom",e=>({path:"padding.bottom",value:e})),e.setNormalizer("padding-left",e=>({path:"padding.left",value:e})),e.setReducer("padding",fe("padding")),e.setStyleRelation("padding",["padding-top","padding-right","padding-bottom","padding-left"])}},"./src/enter.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Enter",(function(){return i.a})),o.d(t,"ShiftEnter",(function(){return u}));var i=o("./packages/ckeditor5-enter/src/enter.js"),r=o("./packages/ckeditor5-core/src/command.js"),s=o("./packages/ckeditor5-enter/src/utils.js");class n extends r.a{execute(){const e=this.editor.model,t=e.document;e.change(o=>{!function(e,t,o){const i=o.isCollapsed,r=o.getFirstRange(),n=r.start.parent,c=r.end.parent,l=n==c;if(i){const i=Object(s.a)(e.schema,o.getAttributes());a(e,t,r.end),t.removeSelectionAttribute(o.getAttributeKeys()),t.setSelectionAttribute(i)}else{const i=!(r.start.isAtStart&&r.end.isAtEnd);e.deleteContent(o,{leaveUnmerged:i}),l?a(e,t,o.focus):i&&t.setSelection(c,0)}}(e,o,t.selection),this.fire("afterExecute",{writer:o})})}refresh(){const e=this.editor.model,t=e.document;this.isEnabled=function(e,t){if(t.rangeCount>1)return!1;const o=t.anchor;if(!o||!e.checkChild(o,"softBreak"))return!1;const i=t.getFirstRange(),r=i.start.parent,s=i.end.parent;if((c(r,e)||c(s,e))&&r!==s)return!1;return!0}(e.schema,t.selection)}}function a(e,t,o){const i=t.createElement("softBreak");e.insertContent(i,o),t.setSelection(i,"after")}function c(e,t){return!e.is("rootElement")&&(t.isLimit(e)||c(e.parent,t))}var l=o("./packages/ckeditor5-enter/src/enterobserver.js"),d=o("./packages/ckeditor5-core/src/plugin.js");class u extends d.a{static get pluginName(){return"ShiftEnter"}init(){const e=this.editor,t=e.model.schema,o=e.conversion,i=e.editing.view,r=i.document;t.register("softBreak",{allowWhere:"$text",isInline:!0}),o.for("upcast").elementToElement({model:"softBreak",view:"br"}),o.for("downcast").elementToElement({model:"softBreak",view:(e,{writer:t})=>t.createEmptyElement("br")}),i.addObserver(l.a),e.commands.add("shiftEnter",new n(e)),this.listenTo(r,"enter",(t,o)=>{o.preventDefault(),o.isSoft&&(e.execute("shiftEnter"),i.scrollToTheSelection())},{priority:"low"})}}},"./src/paragraph.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Paragraph",(function(){return l})),o.d(t,"ParagraphButtonUI",(function(){return u}));var i=o("./packages/ckeditor5-core/src/command.js"),r=o("./packages/ckeditor5-utils/src/first.js");class s extends i.a{refresh(){const e=this.editor.model,t=e.document,o=Object(r.a)(t.selection.getSelectedBlocks());this.value=!!o&&o.is("element","paragraph"),this.isEnabled=!!o&&n(o,e.schema)}execute(e={}){const t=this.editor.model,o=t.document;t.change(i=>{const r=(e.selection||o.selection).getSelectedBlocks();for(const e of r)!e.is("element","paragraph")&&n(e,t.schema)&&i.rename(e,"paragraph")})}}function n(e,t){return t.checkChild(e.parent,"paragraph")&&!t.isObject(e)}class a extends i.a{execute(e){const t=this.editor.model;let o=e.position;t.change(e=>{const i=e.createElement("paragraph");if(!t.schema.checkChild(o.parent,i)){const r=t.schema.findAllowedParent(o,i);if(!r)return;o=e.split(o,r).position}t.insertContent(i,o),e.setSelection(i,"in")})}}var c=o("./packages/ckeditor5-core/src/plugin.js");class l extends c.a{static get pluginName(){return"Paragraph"}init(){const e=this.editor,t=e.model;e.commands.add("paragraph",new s(e)),e.commands.add("insertParagraph",new a(e)),t.schema.register("paragraph",{inheritAllFrom:"$block"}),e.conversion.elementToElement({model:"paragraph",view:"p"}),e.conversion.for("upcast").elementToElement({model:(e,{writer:t})=>l.paragraphLikeElements.has(e.name)?e.isEmpty?null:t.createElement("paragraph"):null,view:/.+/,converterPriority:"low"})}}l.paragraphLikeElements=new Set(["blockquote","dd","div","dt","h1","h2","h3","h4","h5","h6","li","p","td","th"]);var d=o("./packages/ckeditor5-ui/src/button/buttonview.js");class u extends c.a{init(){const e=this.editor,t=e.t;e.ui.componentFactory.add("paragraph",o=>{const i=new d.a(o),r=e.commands.get("paragraph");return i.label=t("Paragraph"),i.icon='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10.5 5.5H7v5h3.5a2.5 2.5 0 1 0 0-5zM5 3h6.5v.025a5 5 0 0 1 0 9.95V13H7v4a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z"/></svg>',i.tooltip=!0,i.isToggleable=!0,i.bind("isEnabled").to(r),i.bind("isOn").to(r,"value"),i.on("execute",()=>{e.execute("paragraph")}),i})}}},"./src/select-all.js":function(e,t,o){"use strict";o.r(t),o.d(t,"SelectAll",(function(){return h})),o.d(t,"SelectAllEditing",(function(){return l})),o.d(t,"SelectAllUI",(function(){return u}));var i=o("./packages/ckeditor5-core/src/plugin.js"),r=o("./packages/ckeditor5-utils/src/keyboard.js"),s=o("./packages/ckeditor5-core/src/command.js");class n extends s.a{execute(){const e=this.editor.model,t=e.document.selection;let o=e.schema.getLimitElement(t);if(t.containsEntireContent(o)||!a(e.schema,o))do{if(o=o.parent,!o)return}while(!a(e.schema,o));e.change(e=>{e.setSelection(o,"in")})}}function a(e,t){return e.isLimit(t)&&(e.checkChild(t,"$text")||e.checkChild(t,"paragraph"))}const c=Object(r.g)("Ctrl+A");class l extends i.a{static get pluginName(){return"SelectAllEditing"}init(){const e=this.editor,t=e.editing.view.document;e.commands.add("selectAll",new n(e)),this.listenTo(t,"keydown",(t,o)=>{Object(r.a)(o)===c&&(e.execute("selectAll"),o.preventDefault())})}}var d=o("./packages/ckeditor5-ui/src/button/buttonview.js");class u extends i.a{static get pluginName(){return"SelectAllUI"}init(){const e=this.editor;e.ui.componentFactory.add("selectAll",t=>{const o=e.commands.get("selectAll"),i=new d.a(t),r=t.t;return i.set({label:r("Select all"),icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M.75 15.5a.75.75 0 0 1 .75.75V18l.008.09A.5.5 0 0 0 2 18.5h1.75a.75.75 0 1 1 0 1.5H1.5l-.144-.007a1.5 1.5 0 0 1-1.35-1.349L0 18.5v-2.25a.75.75 0 0 1 .75-.75zm18.5 0a.75.75 0 0 1 .75.75v2.25l-.007.144a1.5 1.5 0 0 1-1.349 1.35L18.5 20h-2.25a.75.75 0 1 1 0-1.5H18a.5.5 0 0 0 .492-.41L18.5 18v-1.75a.75.75 0 0 1 .75-.75zm-10.45 3c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2H7.2a.2.2 0 0 1-.2-.2v-1.1c0-.11.09-.2.2-.2h1.6zm4 0c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2h-1.6a.2.2 0 0 1-.2-.2v-1.1c0-.11.09-.2.2-.2h1.6zm.45-5.5a.75.75 0 1 1 0 1.5h-8.5a.75.75 0 1 1 0-1.5h8.5zM1.3 11c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2H.2a.2.2 0 0 1-.2-.2v-1.6c0-.11.09-.2.2-.2h1.1zm18.5 0c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2h-1.1a.2.2 0 0 1-.2-.2v-1.6c0-.11.09-.2.2-.2h1.1zm-4.55-2a.75.75 0 1 1 0 1.5H4.75a.75.75 0 1 1 0-1.5h10.5zM1.3 7c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2H.2a.2.2 0 0 1-.2-.2V7.2c0-.11.09-.2.2-.2h1.1zm18.5 0c.11 0 .2.09.2.2v1.6a.2.2 0 0 1-.2.2h-1.1a.2.2 0 0 1-.2-.2V7.2c0-.11.09-.2.2-.2h1.1zm-4.55-2a.75.75 0 1 1 0 1.5h-2.5a.75.75 0 1 1 0-1.5h2.5zm-5 0a.75.75 0 1 1 0 1.5h-5.5a.75.75 0 0 1 0-1.5h5.5zm-6.5-5a.75.75 0 0 1 0 1.5H2a.5.5 0 0 0-.492.41L1.5 2v1.75a.75.75 0 0 1-1.5 0V1.5l.007-.144A1.5 1.5 0 0 1 1.356.006L1.5 0h2.25zM18.5 0l.144.007a1.5 1.5 0 0 1 1.35 1.349L20 1.5v2.25a.75.75 0 1 1-1.5 0V2l-.008-.09A.5.5 0 0 0 18 1.5h-1.75a.75.75 0 1 1 0-1.5h2.25zM8.8 0c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2H7.2a.2.2 0 0 1-.2-.2V.2c0-.11.09-.2.2-.2h1.6zm4 0c.11 0 .2.09.2.2v1.1a.2.2 0 0 1-.2.2h-1.6a.2.2 0 0 1-.2-.2V.2c0-.11.09-.2.2-.2h1.6z"/></svg>',keystroke:"Ctrl+A",tooltip:!0}),i.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(i,"execute",()=>{e.execute("selectAll"),e.editing.view.focus()}),i})}}class h extends i.a{static get requires(){return[l,u]}static get pluginName(){return"SelectAll"}}},"./src/typing.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Typing",(function(){return k})),o.d(t,"Input",(function(){return f})),o.d(t,"Delete",(function(){return m.a})),o.d(t,"TextWatcher",(function(){return v})),o.d(t,"TwoStepCaretMovement",(function(){return j})),o.d(t,"TextTransformation",(function(){return I})),o.d(t,"inlineHighlight",(function(){return W})),o.d(t,"findAttributeRange",(function(){return F})),o.d(t,"getLastTextLine",(function(){return w})),o.d(t,"isNonTypingKeystroke",(function(){return a.b}));var i=o("./packages/ckeditor5-core/src/plugin.js"),r=o("./packages/ckeditor5-core/src/command.js"),s=o("./packages/ckeditor5-typing/src/utils/changebuffer.js");class n extends r.a{constructor(e,t){super(e),this._buffer=new s.a(e.model,t),this._batches=new WeakSet}get buffer(){return this._buffer}destroy(){super.destroy(),this._buffer.destroy()}execute(e={}){const t=this.editor.model,o=t.document,i=e.text||"",r=i.length,s=e.range?t.createSelection(e.range):o.selection,n=e.resultRange;t.enqueueChange(this._buffer.batch,e=>{this._buffer.lock(),this._batches.add(this._buffer.batch),t.deleteContent(s),i&&t.insertContent(e.createText(i,o.selection.getAttributes()),s),n?e.setSelection(n):s.is("documentSelection")||e.setSelection(s),this._buffer.unlock(),this._buffer.input(r)})}}var a=o("./packages/ckeditor5-typing/src/utils/injectunsafekeystrokeshandling.js"),c=o("./packages/ckeditor5-utils/src/diff.js"),l=o("./packages/ckeditor5-engine/src/view/domconverter.js");function d(e){if(e.newChildren.length-e.oldChildren.length!=1)return;const t=function(e,t){const o=[];let i,r=0;return e.forEach(e=>{"equal"==e?(s(),r++):"insert"==e?(n("insert")?i.values.push(t[r]):(s(),i={type:"insert",index:r,values:[t[r]]}),r++):n("delete")?i.howMany++:(s(),i={type:"delete",index:r,howMany:1})}),s(),o;function s(){i&&(o.push(i),i=null)}function n(e){return i&&i.type==e}}(Object(c.a)(e.oldChildren,e.newChildren,u),e.newChildren);if(t.length>1)return;const o=t[0];return o.values[0]&&o.values[0].is("$text")?o:void 0}function u(e,t){return e&&e.is("$text")&&t&&t.is("$text")?e.data===t.data:e===t}class h{constructor(e){this.editor=e,this.editing=this.editor.editing}handle(e,t){if(function(e){if(0==e.length)return!1;for(const t of e)if("children"===t.type&&!d(t))return!0;return!1}(e))this._handleContainerChildrenMutations(e,t);else for(const o of e)this._handleTextMutation(o,t),this._handleTextNodeInsertion(o)}_handleContainerChildrenMutations(e,t){const o=function(e){const t=e.map(e=>e.node).reduce((e,t)=>e.getCommonAncestor(t,{includeSelf:!0}));if(!t)return;return t.getAncestors({includeSelf:!0,parentFirst:!0}).find(e=>e.is("containerElement")||e.is("rootElement"))}(e);if(!o)return;const i=this.editor.editing.view.domConverter.mapViewToDom(o),r=new l.a(this.editor.editing.view.document),s=this.editor.data.toModel(r.domToView(i)).getChild(0),n=this.editor.editing.mapper.toModelElement(o);if(!n)return;const a=Array.from(s.getChildren()),d=Array.from(n.getChildren()),u=a[a.length-1],h=d[d.length-1],f=u&&u.is("element","softBreak"),m=h&&!h.is("element","softBreak");f&&m&&a.pop();const k=this.editor.model.schema;if(!p(a,k)||!p(d,k))return;const b=a.map(e=>e.is("$text")?e.data:"@").join("").replace(/\u00A0/g," "),_=d.map(e=>e.is("$text")?e.data:"@").join("").replace(/\u00A0/g," ");if(_===b)return;const w=Object(c.a)(_,b),{firstChangeAt:v,insertions:y,deletions:j}=g(w);let x=null;t&&(x=this.editing.mapper.toModelRange(t.getFirstRange()));const P=b.substr(v,y),O=this.editor.model.createRange(this.editor.model.createPositionAt(n,v),this.editor.model.createPositionAt(n,v+j));this.editor.execute("input",{text:P,range:O,resultRange:x})}_handleTextMutation(e,t){if("text"!=e.type)return;const o=e.newText.replace(/\u00A0/g," "),i=e.oldText.replace(/\u00A0/g," ");if(i===o)return;const r=Object(c.a)(i,o),{firstChangeAt:s,insertions:n,deletions:a}=g(r);let l=null;t&&(l=this.editing.mapper.toModelRange(t.getFirstRange()));const d=this.editing.view.createPositionAt(e.node,s),u=this.editing.mapper.toModelPosition(d),h=this.editor.model.createRange(u,u.getShiftedBy(a)),p=o.substr(s,n);this.editor.execute("input",{text:p,range:h,resultRange:l})}_handleTextNodeInsertion(e){if("children"!=e.type)return;const t=d(e),o=this.editing.view.createPositionAt(e.node,t.index),i=this.editing.mapper.toModelPosition(o),r=t.values[0].data;this.editor.execute("input",{text:r.replace(/\u00A0/g," "),range:this.editor.model.createRange(i)})}}function p(e,t){return e.every(e=>t.isInline(e))}function g(e){let t=null,o=null;for(let i=0;i<e.length;i++){"equal"!=e[i]&&(t=null===t?i:t,o=i)}let i=0,r=0;for(let s=t;s<=o;s++)"insert"!=e[s]&&i++,"delete"!=e[s]&&r++;return{insertions:r,deletions:i,firstChangeAt:t}}class f extends i.a{static get pluginName(){return"Input"}init(){const e=this.editor,t=new n(e,e.config.get("typing.undoStep")||20);e.commands.add("input",t),Object(a.a)(e),function(e){e.editing.view.document.on("mutations",(t,o,i)=>{new h(e).handle(o,i)})}(e)}isInput(e){return this.editor.commands.get("input")._batches.has(e)}}var m=o("./packages/ckeditor5-typing/src/delete.js");class k extends i.a{static get requires(){return[f,m.a]}static get pluginName(){return"Typing"}}var b=o("./packages/ckeditor5-utils/src/mix.js"),_=o("./packages/ckeditor5-utils/src/observablemixin.js");function w(e,t){let o=e.start;return{text:Array.from(e.getItems()).reduce((e,i)=>i.is("$text")||i.is("$textProxy")?e+i.data:(o=t.createPositionAfter(i),""),""),range:t.createRange(o,e.end)}}class v{constructor(e,t){this.model=e,this.testCallback=t,this.hasMatch=!1,this.set("isEnabled",!0),this.on("change:isEnabled",()=>{this.isEnabled?this._startListening():(this.stopListening(e.document.selection),this.stopListening(e.document))}),this._startListening()}_startListening(){const e=this.model.document;this.listenTo(e.selection,"change:range",(t,{directChange:o})=>{o&&(e.selection.isCollapsed?this._evaluateTextBeforeSelection("selection"):this.hasMatch&&(this.fire("unmatched"),this.hasMatch=!1))}),this.listenTo(e,"change:data",(e,t)=>{"transparent"!=t.type&&this._evaluateTextBeforeSelection("data",{batch:t})})}_evaluateTextBeforeSelection(e,t={}){const o=this.model,i=o.document.selection,r=o.createRange(o.createPositionAt(i.focus.parent,0),i.focus),{text:s,range:n}=w(r,o),a=this.testCallback(s);if(!a&&this.hasMatch&&this.fire("unmatched"),this.hasMatch=!!a,a){const o=Object.assign(t,{text:s,range:n});"object"==typeof a&&Object.assign(o,a),this.fire("matched:"+e,o)}}}Object(b.a)(v,_.a);var y=o("./packages/ckeditor5-utils/src/keyboard.js");class j extends i.a{static get pluginName(){return"TwoStepCaretMovement"}constructor(e){super(e),this.attributes=new Set,this._overrideUid=null}init(){const e=this.editor,t=e.model,o=e.editing.view,i=e.locale,r=t.document.selection;this.listenTo(o.document,"arrowKey",(e,t)=>{if(!r.isCollapsed)return;if(t.shiftKey||t.altKey||t.ctrlKey)return;const o=t.keyCode==y.f.arrowright,s=t.keyCode==y.f.arrowleft;if(!o&&!s)return;const n=i.contentLanguageDirection;let a=!1;a="ltr"===n&&o||"rtl"===n&&s?this._handleForwardMovement(t):this._handleBackwardMovement(t),!0===a&&e.stop()},{context:"$text",priority:"highest"}),this._isNextGravityRestorationSkipped=!1,this.listenTo(r,"change:range",(e,t)=>{this._isNextGravityRestorationSkipped?this._isNextGravityRestorationSkipped=!1:this._isGravityOverridden&&(!t.directChange&&A(r.getFirstPosition(),this.attributes)||this._restoreGravity())})}registerAttribute(e){this.attributes.add(e)}_handleForwardMovement(e){const t=this.attributes,o=this.editor.model.document.selection,i=o.getFirstPosition();return!this._isGravityOverridden&&((!i.isAtStart||!x(o,t))&&(A(i,t)?(O(e),this._overrideGravity(),!0):void 0))}_handleBackwardMovement(e){const t=this.attributes,o=this.editor.model,i=o.document.selection,r=i.getFirstPosition();return this._isGravityOverridden?(O(e),this._restoreGravity(),P(o,t,r),!0):r.isAtStart?!!x(i,t)&&(O(e),P(o,t,r),!0):function(e,t){return A(e.getShiftedBy(-1),t)}(r,t)?r.isAtEnd&&!x(i,t)&&A(r,t)?(O(e),P(o,t,r),!0):(this._isNextGravityRestorationSkipped=!0,this._overrideGravity(),!1):void 0}get _isGravityOverridden(){return!!this._overrideUid}_overrideGravity(){this._overrideUid=this.editor.model.change(e=>e.overrideSelectionGravity())}_restoreGravity(){this.editor.model.change(e=>{e.restoreSelectionGravity(this._overrideUid),this._overrideUid=null})}}function x(e,t){for(const o of t)if(e.hasAttribute(o))return!0;return!1}function P(e,t,o){const i=o.nodeBefore;e.change(e=>{i?e.setSelectionAttribute(i.getAttributes()):e.removeSelectionAttribute(t)})}function O(e){e.preventDefault()}function A(e,t){const{nodeBefore:o,nodeAfter:i}=e;for(const e of t){const t=o?o.getAttribute(e):void 0;if((i?i.getAttribute(e):void 0)!==t)return!0}return!1}var T=o("./node_modules/lodash-es/toString.js"),C=/[\\^$.*+?()[\]{}|]/g,E=RegExp(C.source);var S=function(e){return(e=Object(T.a)(e))&&E.test(e)?e.replace(C,"\\$&"):e};const R={copyright:{from:"(c)",to:"©"},registeredTrademark:{from:"(r)",to:"®"},trademark:{from:"(tm)",to:"™"},oneHalf:{from:"1/2",to:"½"},oneThird:{from:"1/3",to:"⅓"},twoThirds:{from:"2/3",to:"⅔"},oneForth:{from:"1/4",to:"¼"},threeQuarters:{from:"3/4",to:"¾"},lessThanOrEqual:{from:"<=",to:"≤"},greaterThanOrEqual:{from:">=",to:"≥"},notEqual:{from:"!=",to:"≠"},arrowLeft:{from:"<-",to:"←"},arrowRight:{from:"->",to:"→"},horizontalEllipsis:{from:"...",to:"…"},enDash:{from:/(^| )(--)( )$/,to:[null,"–",null]},emDash:{from:/(^| )(---)( )$/,to:[null,"—",null]},quotesPrimary:{from:B('"'),to:[null,"“",null,"”"]},quotesSecondary:{from:B("'"),to:[null,"‘",null,"’"]},quotesPrimaryEnGb:{from:B("'"),to:[null,"‘",null,"’"]},quotesSecondaryEnGb:{from:B('"'),to:[null,"“",null,"”"]},quotesPrimaryPl:{from:B('"'),to:[null,"„",null,"”"]},quotesSecondaryPl:{from:B("'"),to:[null,"‚",null,"’"]}},M={symbols:["copyright","registeredTrademark","trademark"],mathematical:["oneHalf","oneThird","twoThirds","oneForth","threeQuarters","lessThanOrEqual","greaterThanOrEqual","notEqual","arrowLeft","arrowRight"],typography:["horizontalEllipsis","enDash","emDash"],quotes:["quotesPrimary","quotesSecondary"]},N=["symbols","mathematical","typography","quotes"];class I extends i.a{static get pluginName(){return"TextTransformation"}constructor(e){super(e),e.config.define("typing",{transformations:{include:N}})}init(){const e=this.editor.model.document.selection;e.on("change:range",()=>{this.isEnabled=!e.anchor.parent.is("element","codeBlock")}),this._enableTransformationWatchers()}_enableTransformationWatchers(){const e=this.editor,t=e.model,o=e.plugins.get("Input"),i=function(e){const t=e.extra||[],o=e.remove||[],i=e=>!o.includes(e);return function(e){const t=new Set;for(const o of e)if(M[o])for(const e of M[o])t.add(e);else t.add(o);return Array.from(t)}(e.include.concat(t).filter(i)).filter(i).map(e=>R[e]||e).map(e=>({from:z(e.from),to:V(e.to)}))}(e.config.get("typing.transformations")),r=new v(e.model,e=>{for(const t of i){if(t.from.test(e))return{normalizedTransformation:t}}});r.on("matched:data",(e,i)=>{if(!o.isInput(i.batch))return;const{from:r,to:s}=i.normalizedTransformation,n=r.exec(i.text),a=s(n.slice(1)),c=i.range;let l=n.index;t.enqueueChange(e=>{for(let o=1;o<n.length;o++){const i=n[o],r=a[o-1];if(null==r){l+=i.length;continue}const s=c.start.getShiftedBy(l),d=t.createRange(s,s.getShiftedBy(i.length)),u=D(s);t.insertContent(e.createText(r,u),d),l+=r.length}})}),r.bind("isEnabled").to(this)}}function z(e){return"string"==typeof e?new RegExp(`(${S(e)})$`):e}function V(e){return"string"==typeof e?()=>[e]:e instanceof Array?()=>e:e}function D(e){return(e.textNode?e.textNode:e.nodeAfter).getAttributes()}function B(e){return new RegExp(`(^|\\s)(${e})([^${e}]*)(${e})$`)}function F(e,t,o,i){return i.createRange(L(e,t,o,!0,i),L(e,t,o,!1,i))}function L(e,t,o,i,r){let s=e.textNode||(i?e.nodeBefore:e.nodeAfter),n=null;for(;s&&s.getAttribute(t)==o;)n=s,s=i?s.previousSibling:s.nextSibling;return n?r.createPositionAt(n,i?"before":"after"):e}function W(e,t,o,i){const r=e.editing.view,s=new Set;r.document.registerPostFixer(r=>{const n=e.model.document.selection;let a=!1;if(n.hasAttribute(t)){const c=F(n.getFirstPosition(),t,n.getAttribute(t),e.model),l=e.editing.mapper.toViewRange(c);for(const e of l.getItems())e.is("element",o)&&!e.hasClass(i)&&(r.addClass(i,e),s.add(e),a=!0)}return a}),e.conversion.for("editingDowncast").add(e=>{function t(){r.change(e=>{for(const t of s.values())e.removeClass(i,t),s.delete(t)})}e.on("insert",t,{priority:"highest"}),e.on("remove",t,{priority:"highest"}),e.on("attribute",t,{priority:"highest"}),e.on("selection",t,{priority:"highest"})})}},"./src/ui.js":function(e,t,o){"use strict";o.r(t),o.d(t,"clickOutsideHandler",(function(){return i.a})),o.d(t,"injectCssTransitionDisabler",(function(){return r})),o.d(t,"submitHandler",(function(){return s})),o.d(t,"BodyCollection",(function(){return l})),o.d(t,"ButtonView",(function(){return d.a})),o.d(t,"SwitchButtonView",(function(){return u.a})),o.d(t,"getLocalizedColorOptions",(function(){return h})),o.d(t,"normalizeColorOptions",(function(){return p})),o.d(t,"normalizeSingleColorDefinition",(function(){return g})),o.d(t,"ColorGridView",(function(){return w})),o.d(t,"ColorTileView",(function(){return m})),o.d(t,"DropdownButtonView",(function(){return v.a})),o.d(t,"SplitButtonView",(function(){return j})),o.d(t,"createDropdown",(function(){return x.c})),o.d(t,"addToolbarToDropdown",(function(){return x.b})),o.d(t,"addListToDropdown",(function(){return x.a})),o.d(t,"EditorUIView",(function(){return P})),o.d(t,"BoxedEditorUIView",(function(){return T})),o.d(t,"InlineEditableUIView",(function(){return E})),o.d(t,"FormHeaderView",(function(){return S})),o.d(t,"FocusCycler",(function(){return b.a})),o.d(t,"IconView",(function(){return R.a})),o.d(t,"InputTextView",(function(){return M})),o.d(t,"IframeView",(function(){return N})),o.d(t,"LabelView",(function(){return A})),o.d(t,"LabeledFieldView",(function(){return I})),o.d(t,"createLabeledInputText",(function(){return z})),o.d(t,"createLabeledDropdown",(function(){return V})),o.d(t,"ListItemView",(function(){return D.a})),o.d(t,"ListView",(function(){return B.a})),o.d(t,"Notification",(function(){return L})),o.d(t,"Model",(function(){return $})),o.d(t,"BalloonPanelView",(function(){return U.a})),o.d(t,"ContextualBalloon",(function(){return K.a})),o.d(t,"StickyPanelView",(function(){return X})),o.d(t,"TooltipView",(function(){return Z.a})),o.d(t,"Template",(function(){return n.a})),o.d(t,"ToolbarView",(function(){return Q.a})),o.d(t,"ToolbarSeparatorView",(function(){return ee.a})),o.d(t,"enableToolbarKeyboardFocus",(function(){return te})),o.d(t,"normalizeToolbarConfig",(function(){return oe.a})),o.d(t,"BalloonToolbar",(function(){return ae})),o.d(t,"BlockToolbar",(function(){return pe})),o.d(t,"View",(function(){return f.a})),o.d(t,"ViewCollection",(function(){return a.a}));var i=o("./packages/ckeditor5-ui/src/bindings/clickoutsidehandler.js");function r(e){e.set("_isCssTransitionsDisabled",!1),e.disableCssTransitions=()=>{e._isCssTransitionsDisabled=!0},e.enableCssTransitions=()=>{e._isCssTransitionsDisabled=!1},e.extendTemplate({attributes:{class:[e.bindTemplate.if("_isCssTransitionsDisabled","ck-transitions-disabled")]}})}function s({view:e}){e.listenTo(e.element,"submit",(t,o)=>{o.preventDefault(),e.fire("submit")},{useCapture:!0})}var n=o("./packages/ckeditor5-ui/src/template.js"),a=o("./packages/ckeditor5-ui/src/viewcollection.js"),c=o("./packages/ckeditor5-utils/src/dom/createelement.js");class l extends a.a{constructor(e,t=[]){super(t),this.locale=e}attachToDom(){this._bodyCollectionContainer=new n.a({tag:"div",attributes:{class:["ck","ck-reset_all","ck-body","ck-rounded-corners"],dir:this.locale.uiLanguageDirection},children:this}).render();let e=document.querySelector(".ck-body-wrapper");e||(e=Object(c.a)(document,"div",{class:"ck-body-wrapper"}),document.body.appendChild(e)),e.appendChild(this._bodyCollectionContainer)}detachFromDom(){super.destroy(),this._bodyCollectionContainer&&this._bodyCollectionContainer.remove();const e=document.querySelector(".ck-body-wrapper");e&&0==e.childElementCount&&e.remove()}}var d=o("./packages/ckeditor5-ui/src/button/buttonview.js"),u=o("./packages/ckeditor5-ui/src/button/switchbuttonview.js");function h(e,t){const o=e.t,i={Black:o("Black"),"Dim grey":o("Dim grey"),Grey:o("Grey"),"Light grey":o("Light grey"),White:o("White"),Red:o("Red"),Orange:o("Orange"),Yellow:o("Yellow"),"Light green":o("Light green"),Green:o("Green"),Aquamarine:o("Aquamarine"),Turquoise:o("Turquoise"),"Light blue":o("Light blue"),Blue:o("Blue"),Purple:o("Purple")};return t.map(e=>{const t=i[e.label];return t&&t!=e.label&&(e.label=t),e})}function p(e){return e.map(g).filter(e=>!!e)}function g(e){return"string"==typeof e?{model:e,label:e,hasBorder:!1,view:{name:"span",styles:{color:e}}}:{model:e.color,label:e.label||e.color,hasBorder:void 0!==e.hasBorder&&e.hasBorder,view:{name:"span",styles:{color:""+e.color}}}}var f=o("./packages/ckeditor5-ui/src/view.js");class m extends d.a{constructor(e){super(e);const t=this.bindTemplate;this.set("color"),this.set("hasBorder"),this.icon='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path class="ck-icon__fill" d="M16.935 5.328a2 2 0 0 1 0 2.829l-7.778 7.778a2 2 0 0 1-2.829 0L3.5 13.107a1.999 1.999 0 1 1 2.828-2.829l.707.707a1 1 0 0 0 1.414 0l5.658-5.657a2 2 0 0 1 2.828 0z"/><path d="M14.814 6.035 8.448 12.4a1 1 0 0 1-1.414 0l-1.413-1.415A1 1 0 1 0 4.207 12.4l2.829 2.829a1 1 0 0 0 1.414 0l7.778-7.778a1 1 0 1 0-1.414-1.415z"/></svg>',this.extendTemplate({attributes:{style:{backgroundColor:t.to("color")},class:["ck","ck-color-grid__tile",t.if("hasBorder","ck-color-table__color-tile_bordered")]}})}render(){super.render(),this.iconView.fillColor="hsl(0, 0%, 100%)"}}var k=o("./packages/ckeditor5-utils/src/focustracker.js"),b=o("./packages/ckeditor5-ui/src/focuscycler.js"),_=o("./packages/ckeditor5-utils/src/keystrokehandler.js");o("./packages/ckeditor5-ui/theme/components/colorgrid/colorgrid.css");class w extends f.a{constructor(e,t){super(e);const o=t&&t.colorDefinitions||[],i={};t&&t.columns&&(i.gridTemplateColumns=`repeat( ${t.columns}, 1fr)`),this.set("selectedColor"),this.items=this.createCollection(),this.focusTracker=new k.a,this.keystrokes=new _.a,this._focusCycler=new b.a({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowleft",focusNext:"arrowright"}}),this.items.on("add",(e,t)=>{t.isOn=t.color===this.selectedColor}),o.forEach(e=>{const t=new m;t.set({color:e.color,label:e.label,tooltip:!0,hasBorder:e.options.hasBorder}),t.on("execute",()=>{this.fire("execute",{value:e.color,hasBorder:e.options.hasBorder,label:e.label})}),this.items.add(t)}),this.setTemplate({tag:"div",children:this.items,attributes:{class:["ck","ck-color-grid"],style:i}}),this.on("change:selectedColor",(e,t,o)=>{for(const e of this.items)e.isOn=e.color===o})}focus(){this.items.length&&this.items.first.focus()}focusLast(){this.items.length&&this.items.last.focus()}render(){super.render();for(const e of this.items)this.focusTracker.add(e.element);this.items.on("add",(e,t)=>{this.focusTracker.add(t.element)}),this.items.on("remove",(e,t)=>{this.focusTracker.remove(t.element)}),this.keystrokes.listenTo(this.element)}}var v=o("./packages/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js"),y=o("./packages/ckeditor5-ui/theme/icons/dropdown-arrow.svg");o("./packages/ckeditor5-ui/theme/components/dropdown/splitbutton.css");class j extends f.a{constructor(e){super(e);const t=this.bindTemplate;this.set("class"),this.set("icon"),this.set("isEnabled",!0),this.set("isOn",!1),this.set("isToggleable",!1),this.set("isVisible",!0),this.set("keystroke"),this.set("label"),this.set("tabindex",-1),this.set("tooltip"),this.set("tooltipPosition","s"),this.set("type","button"),this.set("withText",!1),this.children=this.createCollection(),this.actionView=this._createActionView(),this.arrowView=this._createArrowView(),this.keystrokes=new _.a,this.focusTracker=new k.a,this.setTemplate({tag:"div",attributes:{class:["ck","ck-splitbutton",t.to("class"),t.if("isVisible","ck-hidden",e=>!e),this.arrowView.bindTemplate.if("isOn","ck-splitbutton_open")]},children:this.children})}render(){super.render(),this.children.add(this.actionView),this.children.add(this.arrowView),this.focusTracker.add(this.actionView.element),this.focusTracker.add(this.arrowView.element),this.keystrokes.listenTo(this.element),this.keystrokes.set("arrowright",(e,t)=>{this.focusTracker.focusedElement===this.actionView.element&&(this.arrowView.focus(),t())}),this.keystrokes.set("arrowleft",(e,t)=>{this.focusTracker.focusedElement===this.arrowView.element&&(this.actionView.focus(),t())})}focus(){this.actionView.focus()}_createActionView(){const e=new d.a;return e.bind("icon","isEnabled","isOn","isToggleable","keystroke","label","tabindex","tooltip","tooltipPosition","type","withText").to(this),e.extendTemplate({attributes:{class:"ck-splitbutton__action"}}),e.delegate("execute").to(this),e}_createArrowView(){const e=new d.a,t=e.bindTemplate;return e.icon=y.a,e.extendTemplate({attributes:{class:"ck-splitbutton__arrow","aria-haspopup":!0,"aria-expanded":t.to("isOn",e=>String(e))}}),e.bind("isEnabled").to(this),e.delegate("execute").to(this,"open"),e}}var x=o("./packages/ckeditor5-ui/src/dropdown/utils.js");o("./packages/ckeditor5-ui/theme/components/editorui/editorui.css");class P extends f.a{constructor(e){super(e),this.body=new l(e)}render(){super.render(),this.body.attachToDom()}destroy(){return this.body.detachFromDom(),super.destroy()}}var O=o("./packages/ckeditor5-utils/src/uid.js");o("./packages/ckeditor5-ui/theme/components/label/label.css");class A extends f.a{constructor(e){super(e),this.set("text"),this.set("for"),this.id="ck-editor__label_"+Object(O.a)();const t=this.bindTemplate;this.setTemplate({tag:"label",attributes:{class:["ck","ck-label"],id:this.id,for:t.to("for")},children:[{text:t.to("text")}]})}}class T extends P{constructor(e){super(e),this.top=this.createCollection(),this.main=this.createCollection(),this._voiceLabelView=this._createVoiceLabel(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-editor","ck-rounded-corners"],role:"application",dir:e.uiLanguageDirection,lang:e.uiLanguage,"aria-labelledby":this._voiceLabelView.id},children:[this._voiceLabelView,{tag:"div",attributes:{class:["ck","ck-editor__top","ck-reset_all"],role:"presentation"},children:this.top},{tag:"div",attributes:{class:["ck","ck-editor__main"],role:"presentation"},children:this.main}]})}_createVoiceLabel(){const e=this.t,t=new A;return t.text=e("Rich Text Editor"),t.extendTemplate({attributes:{class:"ck-voice-label"}}),t}}class C extends f.a{constructor(e,t,o){super(e),this.setTemplate({tag:"div",attributes:{class:["ck","ck-content","ck-editor__editable","ck-rounded-corners"],lang:e.contentLanguage,dir:e.contentLanguageDirection}}),this.name=null,this.set("isFocused",!1),this._editableElement=o,this._hasExternalElement=!!this._editableElement,this._editingView=t}render(){super.render(),this._hasExternalElement?this.template.apply(this.element=this._editableElement):this._editableElement=this.element,this.on("change:isFocused",()=>this._updateIsFocusedClasses()),this._updateIsFocusedClasses()}destroy(){this._hasExternalElement&&this.template.revert(this._editableElement),super.destroy()}_updateIsFocusedClasses(){const e=this._editingView;function t(t){e.change(o=>{const i=e.document.getRoot(t.name);o.addClass(t.isFocused?"ck-focused":"ck-blurred",i),o.removeClass(t.isFocused?"ck-blurred":"ck-focused",i)})}e.isRenderingInProgress?function o(i){e.once("change:isRenderingInProgress",(e,r,s)=>{s?o(i):t(i)})}(this):t(this)}}class E extends C{constructor(e,t,o){super(e,t,o),this.extendTemplate({attributes:{role:"textbox",class:"ck-editor__editable_inline"}})}render(){super.render();const e=this._editingView,t=this.t;e.change(o=>{const i=e.document.getRoot(this.name);o.setAttribute("aria-label",t("Rich Text Editor, %0",this.name),i)})}}o("./packages/ckeditor5-ui/theme/components/formheader/formheader.css");class S extends f.a{constructor(e,t={}){super(e);const o=this.bindTemplate;this.set("label",t.label||""),this.set("class",t.class||null),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__header",o.to("class")]},children:this.children});const i=new f.a(e);i.setTemplate({tag:"span",attributes:{class:["ck","ck-form__header__label"]},children:[{text:o.to("label")}]}),this.children.add(i)}}var R=o("./packages/ckeditor5-ui/src/icon/iconview.js");o("./packages/ckeditor5-ui/theme/components/inputtext/inputtext.css");class M extends f.a{constructor(e){super(e),this.set("value"),this.set("id"),this.set("placeholder"),this.set("isReadOnly",!1),this.set("hasError",!1),this.set("ariaDescribedById"),this.focusTracker=new k.a,this.bind("isFocused").to(this.focusTracker),this.set("isEmpty",!0);const t=this.bindTemplate;this.setTemplate({tag:"input",attributes:{type:"text",class:["ck","ck-input","ck-input-text",t.if("isFocused","ck-input_focused"),t.if("isEmpty","ck-input-text_empty"),t.if("hasError","ck-error")],id:t.to("id"),placeholder:t.to("placeholder"),readonly:t.to("isReadOnly"),"aria-invalid":t.if("hasError",!0),"aria-describedby":t.to("ariaDescribedById")},on:{input:t.to("input"),change:t.to(this._updateIsEmpty.bind(this))}})}render(){super.render(),this.focusTracker.add(this.element),this._setDomElementValue(this.value),this._updateIsEmpty(),this.on("change:value",(e,t,o)=>{this._setDomElementValue(o),this._updateIsEmpty()})}select(){this.element.select()}focus(){this.element.focus()}_updateIsEmpty(){this.isEmpty=!this.element.value}_setDomElementValue(e){this.element.value=e||0===e?e:""}}class N extends f.a{constructor(e){super(e);const t=this.bindTemplate;this.setTemplate({tag:"iframe",attributes:{class:["ck","ck-reset_all"],sandbox:"allow-same-origin allow-scripts"},on:{load:t.to("loaded")}})}render(){return new Promise(e=>{this.on("loaded",e),super.render()})}}o("./packages/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css");class I extends f.a{constructor(e,t){super(e);const o="ck-labeled-field-view-"+Object(O.a)(),i="ck-labeled-field-view-status-"+Object(O.a)();this.fieldView=t(this,o,i),this.set("label"),this.set("isEnabled",!0),this.set("isEmpty",!0),this.set("isFocused",!1),this.set("errorText",null),this.set("infoText",null),this.set("class"),this.set("placeholder"),this.labelView=this._createLabelView(o),this.statusView=this._createStatusView(i),this.bind("_statusText").to(this,"errorText",this,"infoText",(e,t)=>e||t);const r=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view",r.to("class"),r.if("isEnabled","ck-disabled",e=>!e),r.if("isEmpty","ck-labeled-field-view_empty"),r.if("isFocused","ck-labeled-field-view_focused"),r.if("placeholder","ck-labeled-field-view_placeholder"),r.if("errorText","ck-error")]},children:[{tag:"div",attributes:{class:["ck","ck-labeled-field-view__input-wrapper"]},children:[this.fieldView,this.labelView]},this.statusView]})}_createLabelView(e){const t=new A(this.locale);return t.for=e,t.bind("text").to(this,"label"),t}_createStatusView(e){const t=new f.a(this.locale),o=this.bindTemplate;return t.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view__status",o.if("errorText","ck-labeled-field-view__status_error"),o.if("_statusText","ck-hidden",e=>!e)],id:e,role:o.if("errorText","alert")},children:[{text:o.to("_statusText")}]}),t}focus(){this.fieldView.focus()}}function z(e,t,o){const i=new M(e.locale);return i.set({id:t,ariaDescribedById:o}),i.bind("isReadOnly").to(e,"isEnabled",e=>!e),i.bind("hasError").to(e,"errorText",e=>!!e),i.on("input",()=>{e.errorText=null}),e.bind("isEmpty","isFocused","placeholder").to(i),i}function V(e,t,o){const i=Object(x.c)(e.locale);return i.set({id:t,ariaDescribedById:o}),i.bind("isEnabled").to(e),i}var D=o("./packages/ckeditor5-ui/src/list/listitemview.js"),B=o("./packages/ckeditor5-ui/src/list/listview.js"),F=o("./src/core.js");class L extends F.ContextPlugin{static get pluginName(){return"Notification"}init(){this.on("show:warning",(e,t)=>{window.alert(t.message)},{priority:"lowest"})}showSuccess(e,t={}){this._showNotification({message:e,type:"success",namespace:t.namespace,title:t.title})}showInfo(e,t={}){this._showNotification({message:e,type:"info",namespace:t.namespace,title:t.title})}showWarning(e,t={}){this._showNotification({message:e,type:"warning",namespace:t.namespace,title:t.title})}_showNotification(e){const t="show:"+e.type+(e.namespace?":"+e.namespace:"");this.fire(t,{message:e.message,type:e.type,title:e.title||""})}}var W=o("./packages/ckeditor5-utils/src/mix.js"),H=o("./packages/ckeditor5-utils/src/observablemixin.js"),q=o("./node_modules/lodash-es/assignIn.js");class ${constructor(e,t){t&&Object(q.a)(this,t),e&&this.set(e)}}Object(W.a)($,H.a);var U=o("./packages/ckeditor5-ui/src/panel/balloon/balloonpanelview.js"),K=o("./packages/ckeditor5-ui/src/panel/balloon/contextualballoon.js"),G=o("./packages/ckeditor5-utils/src/dom/global.js"),J=o("./packages/ckeditor5-utils/src/dom/tounit.js");o("./packages/ckeditor5-ui/theme/components/panel/stickypanel.css");const Y=Object(J.a)("px");class X extends f.a{constructor(e){super(e);const t=this.bindTemplate;this.set("isActive",!1),this.set("isSticky",!1),this.set("limiterElement",null),this.set("limiterBottomOffset",50),this.set("viewportTopOffset",0),this.set("_marginLeft",null),this.set("_isStickyToTheLimiter",!1),this.set("_hasViewportTopOffset",!1),this.content=this.createCollection(),this._contentPanelPlaceholder=new n.a({tag:"div",attributes:{class:["ck","ck-sticky-panel__placeholder"],style:{display:t.to("isSticky",e=>e?"block":"none"),height:t.to("isSticky",e=>e?Y(this._panelRect.height):null)}}}).render(),this._contentPanel=new n.a({tag:"div",attributes:{class:["ck","ck-sticky-panel__content",t.if("isSticky","ck-sticky-panel__content_sticky"),t.if("_isStickyToTheLimiter","ck-sticky-panel__content_sticky_bottom-limit")],style:{width:t.to("isSticky",e=>e?Y(this._contentPanelPlaceholder.getBoundingClientRect().width):null),top:t.to("_hasViewportTopOffset",e=>e?Y(this.viewportTopOffset):null),bottom:t.to("_isStickyToTheLimiter",e=>e?Y(this.limiterBottomOffset):null),marginLeft:t.to("_marginLeft")}},children:this.content}).render(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-sticky-panel"]},children:[this._contentPanelPlaceholder,this._contentPanel]})}render(){super.render(),this._checkIfShouldBeSticky(),this.listenTo(G.a.window,"scroll",()=>{this._checkIfShouldBeSticky()}),this.listenTo(this,"change:isActive",()=>{this._checkIfShouldBeSticky()})}_checkIfShouldBeSticky(){const e=this._panelRect=this._contentPanel.getBoundingClientRect();let t;this.limiterElement?(t=this._limiterRect=this.limiterElement.getBoundingClientRect(),this.isSticky=this.isActive&&t.top<this.viewportTopOffset&&this._panelRect.height+this.limiterBottomOffset<t.height):this.isSticky=!1,this.isSticky?(this._isStickyToTheLimiter=t.bottom<e.height+this.limiterBottomOffset+this.viewportTopOffset,this._hasViewportTopOffset=!this._isStickyToTheLimiter&&!!this.viewportTopOffset,this._marginLeft=this._isStickyToTheLimiter?null:Y(-G.a.window.scrollX)):(this._isStickyToTheLimiter=!1,this._hasViewportTopOffset=!1,this._marginLeft=null)}}var Z=o("./packages/ckeditor5-ui/src/tooltip/tooltipview.js"),Q=o("./packages/ckeditor5-ui/src/toolbar/toolbarview.js"),ee=o("./packages/ckeditor5-ui/src/toolbar/toolbarseparatorview.js");function te({origin:e,originKeystrokeHandler:t,originFocusTracker:o,toolbar:i,beforeFocus:r,afterBlur:s}){o.add(i.element),t.set("Alt+F10",(e,t)=>{o.isFocused&&!i.focusTracker.isFocused&&(r&&r(),i.focus(),t())}),i.keystrokes.set("Esc",(t,o)=>{i.focusTracker.isFocused&&(e.focus(),s&&s(),o())})}var oe=o("./packages/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.js"),ie=o("./packages/ckeditor5-utils/src/dom/rect.js"),re=o("./node_modules/lodash-es/debounce.js"),se=o("./packages/ckeditor5-utils/src/dom/resizeobserver.js");const ne=Object(J.a)("px");class ae extends F.Plugin{static get pluginName(){return"BalloonToolbar"}static get requires(){return[K.a]}constructor(e){super(e),this._balloonConfig=Object(oe.a)(e.config.get("balloonToolbar")),this.toolbarView=this._createToolbarView(),this.focusTracker=new k.a,e.ui.once("ready",()=>{this.focusTracker.add(e.ui.getEditableElement()),this.focusTracker.add(this.toolbarView.element)}),this._resizeObserver=null,this._balloon=e.plugins.get(K.a),this._fireSelectionChangeDebounced=Object(re.a)(()=>this.fire("_selectionChangeDebounced"),200),this.decorate("show")}init(){const e=this.editor,t=e.model.document.selection;this.listenTo(this.focusTracker,"change:isFocused",(e,t,o)=>{const i=this._balloon.visibleView===this.toolbarView;!o&&i?this.hide():o&&this.show()}),this.listenTo(t,"change:range",(e,o)=>{(o.directChange||t.isCollapsed)&&this.hide(),this._fireSelectionChangeDebounced()}),this.listenTo(this,"_selectionChangeDebounced",()=>{this.editor.editing.view.document.isFocused&&this.show()}),this._balloonConfig.shouldNotGroupWhenFull||this.listenTo(e,"ready",()=>{const t=e.ui.view.editable.element;this._resizeObserver=new se.a(t,()=>{this.toolbarView.maxWidth=ne(.9*new ie.a(t).width)})}),this.listenTo(this.toolbarView,"groupedItemsUpdate",()=>{this._updatePosition()})}afterInit(){const e=this.editor.ui.componentFactory;this.toolbarView.fillFromConfig(this._balloonConfig,e)}_createToolbarView(){const e=!this._balloonConfig.shouldNotGroupWhenFull,t=new Q.a(this.editor.locale,{shouldGroupWhenFull:e,isFloating:!0});return t.render(),t}show(){const e=this.editor,t=e.model.document.selection,o=e.model.schema;this._balloon.hasView(this.toolbarView)||t.isCollapsed||function(e,t){if(1===e.rangeCount)return!1;return[...e.getRanges()].every(e=>{const o=e.getContainedElement();return o&&t.isSelectable(o)})}(t,o)||Array.from(this.toolbarView.items).every(e=>void 0!==e.isEnabled&&!e.isEnabled)||(this.listenTo(this.editor.ui,"update",()=>{this._updatePosition()}),this._balloon.add({view:this.toolbarView,position:this._getBalloonPositionData(),balloonClassName:"ck-toolbar-container"}))}hide(){this._balloon.hasView(this.toolbarView)&&(this.stopListening(this.editor.ui,"update"),this._balloon.remove(this.toolbarView))}_getBalloonPositionData(){const e=this.editor.editing.view,t=e.document,o=t.selection,i=t.selection.isBackward;return{target:()=>{const t=i?o.getFirstRange():o.getLastRange(),r=ie.a.getDomRangeRects(e.domConverter.viewRangeToDom(t));return i?r[0]:(r.length>1&&0===r[r.length-1].width&&r.pop(),r[r.length-1])},positions:ce(i)}}_updatePosition(){this._balloon.updatePosition(this._getBalloonPositionData())}destroy(){super.destroy(),this.stopListening(),this._fireSelectionChangeDebounced.cancel(),this.toolbarView.destroy(),this.focusTracker.destroy(),this._resizeObserver&&this._resizeObserver.destroy()}}function ce(e){const t=U.a.defaultPositions;return e?[t.northWestArrowSouth,t.northWestArrowSouthWest,t.northWestArrowSouthEast,t.northWestArrowSouthMiddleEast,t.northWestArrowSouthMiddleWest,t.southWestArrowNorth,t.southWestArrowNorthWest,t.southWestArrowNorthEast,t.southWestArrowNorthMiddleWest,t.southWestArrowNorthMiddleEast]:[t.southEastArrowNorth,t.southEastArrowNorthEast,t.southEastArrowNorthWest,t.southEastArrowNorthMiddleEast,t.southEastArrowNorthMiddleWest,t.northEastArrowSouth,t.northEastArrowSouthEast,t.northEastArrowSouthWest,t.northEastArrowSouthMiddleEast,t.northEastArrowSouthMiddleWest]}o("./packages/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css");const le=Object(J.a)("px");class de extends d.a{constructor(e){super(e);const t=this.bindTemplate;this.isVisible=!1,this.isToggleable=!0,this.set("top",0),this.set("left",0),this.extendTemplate({attributes:{class:"ck-block-toolbar-button",style:{top:t.to("top",e=>le(e)),left:t.to("left",e=>le(e))}}})}}var ue=o("./packages/ckeditor5-utils/src/dom/position.js");const he=Object(J.a)("px");class pe extends F.Plugin{static get pluginName(){return"BlockToolbar"}constructor(e){super(e),this._blockToolbarConfig=Object(oe.a)(this.editor.config.get("blockToolbar")),this.toolbarView=this._createToolbarView(),this.panelView=this._createPanelView(),this.buttonView=this._createButtonView(),this._resizeObserver=null,Object(i.a)({emitter:this.panelView,contextElements:[this.panelView.element,this.buttonView.element],activator:()=>this.panelView.isVisible,callback:()=>this._hidePanel()})}init(){const e=this.editor;this.listenTo(e.model.document.selection,"change:range",(e,t)=>{t.directChange&&this._hidePanel()}),this.listenTo(e.ui,"update",()=>this._updateButton()),this.listenTo(e,"change:isReadOnly",()=>this._updateButton(),{priority:"low"}),this.listenTo(e.ui.focusTracker,"change:isFocused",()=>this._updateButton()),this.listenTo(this.buttonView,"change:isVisible",(e,t,o)=>{o?this.buttonView.listenTo(window,"resize",()=>this._updateButton()):(this.buttonView.stopListening(window,"resize"),this._hidePanel())})}afterInit(){const e=this.editor.ui.componentFactory,t=this._blockToolbarConfig;this.toolbarView.fillFromConfig(t,e);for(const e of this.toolbarView.items)e.on("execute",()=>this._hidePanel(!0),{priority:"high"});t.shouldNotGroupWhenFull||this.listenTo(this.editor,"ready",()=>{const e=this.editor.ui.view.editable.element;this._resizeObserver=new se.a(e,()=>{this.toolbarView.maxWidth=this._getToolbarMaxWidth()})})}destroy(){super.destroy(),this.panelView.destroy(),this.buttonView.destroy(),this.toolbarView.destroy(),this._resizeObserver&&this._resizeObserver.destroy()}_createToolbarView(){const e=!this._blockToolbarConfig.shouldNotGroupWhenFull,t=new Q.a(this.editor.locale,{shouldGroupWhenFull:e,isFloating:!0});return t.focusTracker.on("change:isFocused",(e,t,o)=>{o||this._hidePanel()}),t}_createPanelView(){const e=this.editor,t=new U.a(e.locale);return t.content.add(this.toolbarView),t.class="ck-toolbar-container",e.ui.view.body.add(t),e.ui.focusTracker.add(t.element),this.toolbarView.keystrokes.set("Esc",(e,t)=>{this._hidePanel(!0),t()}),t}_createButtonView(){const e=this.editor,t=e.t,o=new de(e.locale);return o.set({label:t("Edit block"),icon:F.icons.pilcrow,withText:!1}),o.bind("isOn").to(this.panelView,"isVisible"),o.bind("tooltip").to(this.panelView,"isVisible",e=>!e),this.listenTo(o,"execute",()=>{this.panelView.isVisible?this._hidePanel(!0):this._showPanel()}),e.ui.view.body.add(o),e.ui.focusTracker.add(o.element),o}_updateButton(){const e=this.editor,t=e.model,o=e.editing.view;if(!e.ui.focusTracker.isFocused)return void this._hideButton();if(e.isReadOnly)return void this._hideButton();const i=Array.from(t.document.selection.getSelectedBlocks())[0];if(!i||Array.from(this.toolbarView.items).every(e=>!e.isEnabled))return void this._hideButton();const r=o.domConverter.mapViewToDom(e.editing.mapper.toViewElement(i));this.buttonView.isVisible=!0,this._attachButtonToElement(r),this.panelView.isVisible&&this._showPanel()}_hideButton(){this.buttonView.isVisible=!1}_showPanel(){const e=this.panelView.isVisible;this.panelView.show(),this.toolbarView.maxWidth=this._getToolbarMaxWidth(),this.panelView.pin({target:this.buttonView.element,limiter:this.editor.ui.getEditableElement()}),e||this.toolbarView.items.get(0).focus()}_hidePanel(e){this.panelView.isVisible=!1,e&&this.editor.editing.view.focus()}_attachButtonToElement(e){const t=window.getComputedStyle(e),o=new ie.a(this.editor.ui.getEditableElement()),i=parseInt(t.paddingTop,10),r=parseInt(t.lineHeight,10)||1.2*parseInt(t.fontSize,10),s=Object(ue.a)({element:this.buttonView.element,target:e,positions:[(e,t)=>{let s;return s="ltr"===this.editor.locale.uiLanguageDirection?o.left-t.width:o.right,{top:e.top+i+(r-t.height)/2,left:s}}]});this.buttonView.top=s.top,this.buttonView.left=s.left}_getToolbarMaxWidth(){const e=this.editor.ui.view.editable.element,t=new ie.a(e),o=new ie.a(this.buttonView.element),i="rtl"===this.editor.locale.uiLanguageDirection?o.left-t.right+o.width:t.left-o.left;return he(t.width+i)}}},"./src/undo.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Undo",(function(){return m})),o.d(t,"UndoEditing",(function(){return u})),o.d(t,"UndoUi",(function(){return f}));var i=o("./packages/ckeditor5-core/src/plugin.js"),r=o("./packages/ckeditor5-core/src/command.js"),s=o("./packages/ckeditor5-engine/src/model/operation/transform.js");class n extends r.a{constructor(e){super(e),this._stack=[],this._createdBatches=new WeakSet,this.refresh(),this.listenTo(e.data,"set",(e,t)=>{t[1]={...t[1]};const o=t[1];o.batchType||(o.batchType="transparent")},{priority:"high"}),this.listenTo(e.data,"set",(e,t)=>{"transparent"===t[1].batchType&&this.clearStack()})}refresh(){this.isEnabled=this._stack.length>0}addBatch(e){const t=this.editor.model.document.selection,o={ranges:t.hasOwnRange?Array.from(t.getRanges()):[],isBackward:t.isBackward};this._stack.push({batch:e,selection:o}),this.refresh()}clearStack(){this._stack=[],this.refresh()}_restoreSelection(e,t,o){const i=this.editor.model,r=i.document,s=[],n=e.map(e=>e.getTransformedByOperations(o)),l=n.flat();for(const e of n){const t=e.filter(e=>e.root!=r.graveyard).filter(e=>!c(e,l));t.length&&(a(t),s.push(t[0]))}s.length&&i.change(e=>{e.setSelection(s,{backward:t})})}_undo(e,t){const o=this.editor.model,i=o.document;this._createdBatches.add(t);const r=e.operations.slice().filter(e=>e.isDocumentOperation);r.reverse();for(const e of r){const r=e.baseVersion+1,n=Array.from(i.history.getOperations(r)),a=Object(s.a)([e.getReversed()],n,{useRelations:!0,document:this.editor.model.document,padWithNoOps:!1,forceWeakRemove:!0}).operationsA;for(const r of a)t.addOperation(r),o.applyOperation(r),i.history.setOperationAsUndone(e,r)}}}function a(e){e.sort((e,t)=>e.start.isBefore(t.start)?-1:1);for(let t=1;t<e.length;t++){const o=e[t-1].getJoined(e[t],!0);o&&(t--,e.splice(t,2,o))}}function c(e,t){return t.some(t=>t!==e&&t.containsRange(e,!0))}class l extends n{execute(e=null){const t=e?this._stack.findIndex(t=>t.batch==e):this._stack.length-1,o=this._stack.splice(t,1)[0],i=this.editor.model.createBatch("transparent");this.editor.model.enqueueChange(i,()=>{this._undo(o.batch,i);const e=this.editor.model.document.history.getOperations(o.batch.baseVersion);this._restoreSelection(o.selection.ranges,o.selection.isBackward,e),this.fire("revert",o.batch,i)}),this.refresh()}}class d extends n{execute(){const e=this._stack.pop(),t=this.editor.model.createBatch("transparent");this.editor.model.enqueueChange(t,()=>{const o=e.batch.operations[e.batch.operations.length-1].baseVersion+1,i=this.editor.model.document.history.getOperations(o);this._restoreSelection(e.selection.ranges,e.selection.isBackward,i),this._undo(e.batch,t)}),this.refresh()}}class u extends i.a{static get pluginName(){return"UndoEditing"}constructor(e){super(e),this._batchRegistry=new WeakSet}init(){const e=this.editor;this._undoCommand=new l(e),this._redoCommand=new d(e),e.commands.add("undo",this._undoCommand),e.commands.add("redo",this._redoCommand),this.listenTo(e.model,"applyOperation",(e,t)=>{const o=t[0];if(!o.isDocumentOperation)return;const i=o.batch,r=this._redoCommand._createdBatches.has(i),s=this._undoCommand._createdBatches.has(i);this._batchRegistry.has(i)||"transparent"==i.type&&!r&&!s||(r?this._undoCommand.addBatch(i):s||(this._undoCommand.addBatch(i),this._redoCommand.clearStack()),this._batchRegistry.add(i))},{priority:"highest"}),this.listenTo(this._undoCommand,"revert",(e,t,o)=>{this._redoCommand.addBatch(o)}),e.keystrokes.set("CTRL+Z","undo"),e.keystrokes.set("CTRL+Y","redo"),e.keystrokes.set("CTRL+SHIFT+Z","redo")}}var h=o("./packages/ckeditor5-ui/src/button/buttonview.js"),p='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m5.042 9.367 2.189 1.837a.75.75 0 0 1-.965 1.149l-3.788-3.18a.747.747 0 0 1-.21-.284.75.75 0 0 1 .17-.945L6.23 4.762a.75.75 0 1 1 .964 1.15L4.863 7.866h8.917A.75.75 0 0 1 14 7.9a4 4 0 1 1-1.477 7.718l.344-1.489a2.5 2.5 0 1 0 1.094-4.73l.008-.032H5.042z"/></svg>',g='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m14.958 9.367-2.189 1.837a.75.75 0 0 0 .965 1.149l3.788-3.18a.747.747 0 0 0 .21-.284.75.75 0 0 0-.17-.945L13.77 4.762a.75.75 0 1 0-.964 1.15l2.331 1.955H6.22A.75.75 0 0 0 6 7.9a4 4 0 1 0 1.477 7.718l-.344-1.489A2.5 2.5 0 1 1 6.039 9.4l-.008-.032h8.927z"/></svg>';class f extends i.a{static get pluginName(){return"UndoUI"}init(){const e=this.editor,t=e.locale,o=e.t,i="ltr"==t.uiLanguageDirection?p:g,r="ltr"==t.uiLanguageDirection?g:p;this._addButton("undo",o("Undo"),"CTRL+Z",i),this._addButton("redo",o("Redo"),"CTRL+Y",r)}_addButton(e,t,o,i){const r=this.editor;r.ui.componentFactory.add(e,s=>{const n=r.commands.get(e),a=new h.a(s);return a.set({label:t,icon:i,keystroke:o,tooltip:!0}),a.bind("isEnabled").to(n,"isEnabled"),this.listenTo(a,"execute",()=>{r.execute(e),r.editing.view.focus()}),a})}}class m extends i.a{static get requires(){return[u,f]}static get pluginName(){return"Undo"}}},"./src/upload.js":function(e,t,o){"use strict";o.r(t),o.d(t,"FileRepository",(function(){return u})),o.d(t,"FileDialogButtonView",(function(){return f})),o.d(t,"Base64UploadAdapter",(function(){return k})),o.d(t,"SimpleUploadAdapter",(function(){return _}));var i=o("./packages/ckeditor5-core/src/plugin.js"),r=o("./packages/ckeditor5-core/src/pendingactions.js"),s=o("./packages/ckeditor5-utils/src/ckeditorerror.js"),n=o("./packages/ckeditor5-utils/src/observablemixin.js"),a=o("./packages/ckeditor5-utils/src/collection.js"),c=o("./packages/ckeditor5-utils/src/mix.js");class l{constructor(){const e=new window.FileReader;this._reader=e,this._data=void 0,this.set("loaded",0),e.onprogress=e=>{this.loaded=e.loaded}}get error(){return this._reader.error}get data(){return this._data}read(e){const t=this._reader;return this.total=e.size,new Promise((o,i)=>{t.onload=()=>{const e=t.result;this._data=e,o(e)},t.onerror=()=>{i("error")},t.onabort=()=>{i("aborted")},this._reader.readAsDataURL(e)})}abort(){this._reader.abort()}}Object(c.a)(l,n.a);var d=o("./packages/ckeditor5-utils/src/uid.js");class u extends i.a{static get pluginName(){return"FileRepository"}static get requires(){return[r.a]}init(){this.loaders=new a.a,this.loaders.on("add",()=>this._updatePendingAction()),this.loaders.on("remove",()=>this._updatePendingAction()),this._loadersMap=new Map,this._pendingAction=null,this.set("uploaded",0),this.set("uploadTotal",null),this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",(e,t)=>t?e/t*100:0)}getLoader(e){return this._loadersMap.get(e)||null}createLoader(e){if(!this.createUploadAdapter)return Object(s.c)("filerepository-no-upload-adapter"),null;const t=new h(Promise.resolve(e),this.createUploadAdapter);return this.loaders.add(t),this._loadersMap.set(e,t),e instanceof Promise&&t.file.then(e=>{this._loadersMap.set(e,t)}).catch(()=>{}),t.on("change:uploaded",()=>{let e=0;for(const t of this.loaders)e+=t.uploaded;this.uploaded=e}),t.on("change:uploadTotal",()=>{let e=0;for(const t of this.loaders)t.uploadTotal&&(e+=t.uploadTotal);this.uploadTotal=e}),t}destroyLoader(e){const t=e instanceof h?e:this.getLoader(e);t._destroy(),this.loaders.remove(t),this._loadersMap.forEach((e,o)=>{e===t&&this._loadersMap.delete(o)})}_updatePendingAction(){const e=this.editor.plugins.get(r.a);if(this.loaders.length){if(!this._pendingAction){const t=this.editor.t,o=e=>`${t("Upload in progress")} ${parseInt(e)}%.`;this._pendingAction=e.add(o(this.uploadedPercent)),this._pendingAction.bind("message").to(this,"uploadedPercent",o)}}else e.remove(this._pendingAction),this._pendingAction=null}}Object(c.a)(u,n.a);class h{constructor(e,t){this.id=Object(d.a)(),this._filePromiseWrapper=this._createFilePromiseWrapper(e),this._adapter=t(this),this._reader=new l,this.set("status","idle"),this.set("uploaded",0),this.set("uploadTotal",null),this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",(e,t)=>t?e/t*100:0),this.set("uploadResponse",null)}get file(){return this._filePromiseWrapper?this._filePromiseWrapper.promise.then(e=>this._filePromiseWrapper?e:null):Promise.resolve(null)}get data(){return this._reader.data}read(){if("idle"!=this.status)throw new s.a("filerepository-read-wrong-status",this);return this.status="reading",this.file.then(e=>this._reader.read(e)).then(e=>{if("reading"!==this.status)throw this.status;return this.status="idle",e}).catch(e=>{if("aborted"===e)throw this.status="aborted","aborted";throw this.status="error",this._reader.error?this._reader.error:e})}upload(){if("idle"!=this.status)throw new s.a("filerepository-upload-wrong-status",this);return this.status="uploading",this.file.then(()=>this._adapter.upload()).then(e=>(this.uploadResponse=e,this.status="idle",e)).catch(e=>{if("aborted"===this.status)throw"aborted";throw this.status="error",e})}abort(){const e=this.status;this.status="aborted",this._filePromiseWrapper.isFulfilled?"reading"==e?this._reader.abort():"uploading"==e&&this._adapter.abort&&this._adapter.abort():(this._filePromiseWrapper.promise.catch(()=>{}),this._filePromiseWrapper.rejecter("aborted")),this._destroy()}_destroy(){this._filePromiseWrapper=void 0,this._reader=void 0,this._adapter=void 0,this.uploadResponse=void 0}_createFilePromiseWrapper(e){const t={};return t.promise=new Promise((o,i)=>{t.rejecter=i,t.isFulfilled=!1,e.then(e=>{t.isFulfilled=!0,o(e)}).catch(e=>{t.isFulfilled=!0,i(e)})}),t}}Object(c.a)(h,n.a);var p=o("./packages/ckeditor5-ui/src/button/buttonview.js"),g=o("./packages/ckeditor5-ui/src/view.js");class f extends g.a{constructor(e){super(e),this.buttonView=new p.a(e),this._fileInputView=new m(e),this._fileInputView.bind("acceptedType").to(this),this._fileInputView.bind("allowMultipleFiles").to(this),this._fileInputView.delegate("done").to(this),this.setTemplate({tag:"span",attributes:{class:"ck-file-dialog-button"},children:[this.buttonView,this._fileInputView]}),this.buttonView.on("execute",()=>{this._fileInputView.open()})}focus(){this.buttonView.focus()}}class m extends g.a{constructor(e){super(e),this.set("acceptedType"),this.set("allowMultipleFiles",!1);const t=this.bindTemplate;this.setTemplate({tag:"input",attributes:{class:["ck-hidden"],type:"file",tabindex:"-1",accept:t.to("acceptedType"),multiple:t.to("allowMultipleFiles")},on:{change:t.to(()=>{this.element&&this.element.files&&this.element.files.length&&this.fire("done",this.element.files),this.element.value=""})}})}open(){this.element.click()}}class k extends i.a{static get requires(){return[u]}static get pluginName(){return"Base64UploadAdapter"}init(){this.editor.plugins.get(u).createUploadAdapter=e=>new b(e)}}class b{constructor(e){this.loader=e}upload(){return new Promise((e,t)=>{const o=this.reader=new window.FileReader;o.addEventListener("load",()=>{e({default:o.result})}),o.addEventListener("error",e=>{t(e)}),o.addEventListener("abort",()=>{t()}),this.loader.file.then(e=>{o.readAsDataURL(e)})})}abort(){this.reader.abort()}}class _ extends i.a{static get requires(){return[u]}static get pluginName(){return"SimpleUploadAdapter"}init(){const e=this.editor.config.get("simpleUpload");e&&(e.uploadUrl?this.editor.plugins.get(u).createUploadAdapter=t=>new w(t,e):Object(s.c)("simple-upload-adapter-missing-uploadurl"))}}class w{constructor(e,t){this.loader=e,this.options=t}upload(){return this.loader.file.then(e=>new Promise((t,o)=>{this._initRequest(),this._initListeners(t,o,e),this._sendRequest(e)}))}abort(){this.xhr&&this.xhr.abort()}_initRequest(){const e=this.xhr=new XMLHttpRequest;e.open("POST",this.options.uploadUrl,!0),e.responseType="json"}_initListeners(e,t,o){const i=this.xhr,r=this.loader,s=`Couldn't upload file: ${o.name}.`;i.addEventListener("error",()=>t(s)),i.addEventListener("abort",()=>t()),i.addEventListener("load",()=>{const o=i.response;if(!o||o.error)return t(o&&o.error&&o.error.message?o.error.message:s);const r=o.url?{default:o.url}:o.urls;e({...o,urls:r})}),i.upload&&i.upload.addEventListener("progress",e=>{e.lengthComputable&&(r.uploadTotal=e.total,r.uploaded=e.loaded)})}_sendRequest(e){const t=this.options.headers||{},o=this.options.withCredentials||!1;for(const e of Object.keys(t))this.xhr.setRequestHeader(e,t[e]);this.xhr.withCredentials=o;const i=new FormData;i.append("upload",e),this.xhr.send(i)}}},"./src/utils.js":function(e,t,o){"use strict";o.r(t);var i=o("./packages/ckeditor5-utils/src/index.js");o.d(t,"env",(function(){return i.n})),o.d(t,"diff",(function(){return i.m})),o.d(t,"mix",(function(){return i.A})),o.d(t,"EmitterMixin",(function(){return i.e})),o.d(t,"ObservableMixin",(function(){return i.i})),o.d(t,"CKEditorError",(function(){return i.a})),o.d(t,"logError",(function(){return i.y})),o.d(t,"logWarning",(function(){return i.z})),o.d(t,"ElementReplacer",(function(){return i.d})),o.d(t,"createElement",(function(){return i.l})),o.d(t,"DomEmitterMixin",(function(){return i.c})),o.d(t,"global",(function(){return i.u})),o.d(t,"getDataFromElement",(function(){return i.q})),o.d(t,"Rect",(function(){return i.j})),o.d(t,"ResizeObserver",(function(){return i.k})),o.d(t,"setDataInElement",(function(){return i.D})),o.d(t,"toUnit",(function(){return i.G})),o.d(t,"keyCodes",(function(){return i.x})),o.d(t,"getCode",(function(){return i.p})),o.d(t,"parseKeystroke",(function(){return i.B})),o.d(t,"getEnvKeystrokeText",(function(){return i.r})),o.d(t,"isArrowKeyCode",(function(){return i.v})),o.d(t,"getLocalizedArrowKeyCodeDirection",(function(){return i.t})),o.d(t,"isForwardArrowKeyCode",(function(){return i.w})),o.d(t,"getLanguageDirection",(function(){return i.s})),o.d(t,"Locale",(function(){return i.h})),o.d(t,"Collection",(function(){return i.b})),o.d(t,"first",(function(){return i.o})),o.d(t,"FocusTracker",(function(){return i.f})),o.d(t,"KeystrokeHandler",(function(){return i.g})),o.d(t,"toArray",(function(){return i.E})),o.d(t,"toMap",(function(){return i.F})),o.d(t,"priorities",(function(){return i.C})),o.d(t,"uid",(function(){return i.H})),o.d(t,"version",(function(){return i.I}))},"./src/widget.js":function(e,t,o){"use strict";o.r(t),o.d(t,"Widget",(function(){return i.a})),o.d(t,"WidgetToolbarRepository",(function(){return d})),o.d(t,"WidgetResize",(function(){return O})),o.d(t,"WidgetTypeAround",(function(){return A.a})),o.d(t,"WIDGET_CLASS_NAME",(function(){return c.a})),o.d(t,"WIDGET_SELECTED_CLASS_NAME",(function(){return c.b})),o.d(t,"isWidget",(function(){return c.f})),o.d(t,"toWidget",(function(){return c.i})),o.d(t,"setHighlightHandling",(function(){return c.g})),o.d(t,"setLabel",(function(){return c.h})),o.d(t,"getLabel",(function(){return c.e})),o.d(t,"toWidgetEditable",(function(){return c.j})),o.d(t,"findOptimalInsertionRange",(function(){return c.d})),o.d(t,"viewToModelPositionOutsideModelElement",(function(){return c.k})),o.d(t,"centeredBalloonPositionForLongWidgets",(function(){return c.c}));var i=o("./packages/ckeditor5-widget/src/widget.js"),r=o("./packages/ckeditor5-core/src/plugin.js"),s=o("./packages/ckeditor5-ui/src/panel/balloon/contextualballoon.js"),n=o("./packages/ckeditor5-ui/src/toolbar/toolbarview.js"),a=o("./packages/ckeditor5-ui/src/panel/balloon/balloonpanelview.js"),c=o("./packages/ckeditor5-widget/src/utils.js"),l=o("./packages/ckeditor5-utils/src/ckeditorerror.js");class d extends r.a{static get requires(){return[s.a]}static get pluginName(){return"WidgetToolbarRepository"}init(){const e=this.editor;if(e.plugins.has("BalloonToolbar")){const t=e.plugins.get("BalloonToolbar");this.listenTo(t,"show",t=>{(function(e){const t=e.getSelectedElement();return!(!t||!Object(c.f)(t))})(e.editing.view.document.selection)&&t.stop()},{priority:"high"})}this._toolbarDefinitions=new Map,this._balloon=this.editor.plugins.get("ContextualBalloon"),this.on("change:isEnabled",()=>{this._updateToolbarsVisibility()}),this.listenTo(e.ui,"update",()=>{this._updateToolbarsVisibility()}),this.listenTo(e.ui.focusTracker,"change:isFocused",()=>{this._updateToolbarsVisibility()},{priority:"low"})}destroy(){super.destroy();for(const e of this._toolbarDefinitions.values())e.view.destroy()}register(e,{ariaLabel:t,items:o,getRelatedElement:i,balloonClassName:r="ck-toolbar-container"}){if(!o.length)return void Object(l.c)("widget-toolbar-no-items",{toolbarId:e});const s=this.editor,a=s.t,c=new n.a(s.locale);if(c.ariaLabel=t||a("Widget toolbar"),this._toolbarDefinitions.has(e))throw new l.a("widget-toolbar-duplicated",this,{toolbarId:e});c.fillFromConfig(o,s.ui.componentFactory),this._toolbarDefinitions.set(e,{view:c,getRelatedElement:i,balloonClassName:r})}_updateToolbarsVisibility(){let e=0,t=null,o=null;for(const i of this._toolbarDefinitions.values()){const r=i.getRelatedElement(this.editor.editing.view.document.selection);if(this.isEnabled&&r)if(this.editor.ui.focusTracker.isFocused){const s=r.getAncestors().length;s>e&&(e=s,t=r,o=i)}else this._isToolbarVisible(i)&&this._hideToolbar(i);else this._isToolbarInBalloon(i)&&this._hideToolbar(i)}o&&this._showToolbar(o,t)}_hideToolbar(e){this._balloon.remove(e.view),this.stopListening(this._balloon,"change:visibleView")}_showToolbar(e,t){this._isToolbarVisible(e)?u(this.editor,t):this._isToolbarInBalloon(e)||(this._balloon.add({view:e.view,position:h(this.editor,t),balloonClassName:e.balloonClassName}),this.listenTo(this._balloon,"change:visibleView",()=>{for(const e of this._toolbarDefinitions.values())if(this._isToolbarVisible(e)){const t=e.getRelatedElement(this.editor.editing.view.document.selection);u(this.editor,t)}}))}_isToolbarVisible(e){return this._balloon.visibleView===e.view}_isToolbarInBalloon(e){return this._balloon.hasView(e.view)}}function u(e,t){const o=e.plugins.get("ContextualBalloon"),i=h(e,t);o.updatePosition(i)}function h(e,t){const o=e.editing.view,i=a.a.defaultPositions;return{target:o.domConverter.mapViewToDom(t),positions:[i.northArrowSouth,i.northArrowSouthWest,i.northArrowSouthEast,i.southArrowNorth,i.southArrowNorthWest,i.southArrowNorthEast,c.c]}}var p=o("./packages/ckeditor5-ui/src/template.js"),g=o("./packages/ckeditor5-utils/src/dom/rect.js"),f=o("./packages/ckeditor5-utils/src/comparearrays.js"),m=o("./packages/ckeditor5-utils/src/observablemixin.js"),k=o("./packages/ckeditor5-utils/src/mix.js");class b{constructor(e){this.set("activeHandlePosition",null),this.set("proposedWidthPercents",null),this.set("proposedWidth",null),this.set("proposedHeight",null),this.set("proposedHandleHostWidth",null),this.set("proposedHandleHostHeight",null),this._options=e,this._referenceCoordinates=null}begin(e,t,o){const i=new g.a(t);this.activeHandlePosition=function(e){const t=["top-left","top-right","bottom-right","bottom-left"];for(const o of t)if(e.classList.contains("ck-widget__resizer__handle-"+o))return o}(e),this._referenceCoordinates=function(e,t){const o=new g.a(e),i=t.split("-"),r={x:"right"==i[1]?o.right:o.left,y:"bottom"==i[0]?o.bottom:o.top};return r.x+=e.ownerDocument.defaultView.scrollX,r.y+=e.ownerDocument.defaultView.scrollY,r}(t,function(e){const t=e.split("-"),o={top:"bottom",bottom:"top",left:"right",right:"left"};return`${o[t[0]]}-${o[t[1]]}`}(this.activeHandlePosition)),this.originalWidth=i.width,this.originalHeight=i.height,this.aspectRatio=i.width/i.height;const r=o.style.width;r&&r.match(/^\d+(\.\d*)?%$/)?this.originalWidthPercents=parseFloat(r):this.originalWidthPercents=function(e,t){const o=e.parentElement,i=parseFloat(o.ownerDocument.defaultView.getComputedStyle(o).width);return t.width/i*100}(o,i)}update(e){this.proposedWidth=e.width,this.proposedHeight=e.height,this.proposedWidthPercents=e.widthPercents,this.proposedHandleHostWidth=e.handleHostWidth,this.proposedHandleHostHeight=e.handleHostHeight}}Object(k.a)(b,m.a);var _=o("./packages/ckeditor5-ui/src/view.js");class w extends _.a{constructor(){super();const e=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-size-view",e.to("_viewPosition",e=>e?"ck-orientation-"+e:"")],style:{display:e.if("_isVisible","none",e=>!e)}},children:[{text:e.to("_label")}]})}_bindToState(e,t){this.bind("_isVisible").to(t,"proposedWidth",t,"proposedHeight",(e,t)=>null!==e&&null!==t),this.bind("_label").to(t,"proposedHandleHostWidth",t,"proposedHandleHostHeight",t,"proposedWidthPercents",(t,o,i)=>"px"===e.unit?`${t}×${o}`:i+"%"),this.bind("_viewPosition").to(t,"activeHandlePosition",t,"proposedHandleHostWidth",t,"proposedHandleHostHeight",(e,t,o)=>t<50||o<50?"above-center":e)}_dismiss(){this.unbind(),this._isVisible=!1}}class v{constructor(e){this._options=e,this._viewResizerWrapper=null,this.set("isEnabled",!0),this.decorate("begin"),this.decorate("cancel"),this.decorate("commit"),this.decorate("updateSize"),this.on("commit",e=>{this.state.proposedWidth||this.state.proposedWidthPercents||(this._cleanup(),e.stop())},{priority:"high"}),this.on("change:isEnabled",()=>{this.isEnabled&&this.redraw()})}attach(){const e=this,t=this._options.viewElement;this._options.editor.editing.view.change(o=>{const i=o.createUIElement("div",{class:"ck ck-reset_all ck-widget__resizer"},(function(t){const o=this.toDomElement(t);return e._appendHandles(o),e._appendSizeUI(o),e.on("change:isEnabled",(e,t,i)=>{o.style.display=i?"":"none"}),o.style.display=e.isEnabled?"":"none",o}));o.insert(o.createPositionAt(t,"end"),i),o.addClass("ck-widget_with-resizer",t),this._viewResizerWrapper=i})}begin(e){this.state=new b(this._options),this._sizeView._bindToState(this._options,this.state),this._initialViewWidth=this._options.viewElement.getStyle("width"),this.state.begin(e,this._getHandleHost(),this._getResizeHost())}updateSize(e){const t=this._proposeNewSize(e);this._options.editor.editing.view.change(e=>{const o=this._options.unit||"%",i=("%"===o?t.widthPercents:t.width)+o;e.setStyle("width",i,this._options.viewElement)});const o=this._getHandleHost(),i=new g.a(o);t.handleHostWidth=Math.round(i.width),t.handleHostHeight=Math.round(i.height);const r=new g.a(o);t.width=Math.round(r.width),t.height=Math.round(r.height),this.redraw(i),this.state.update(t)}commit(){const e=this._options.unit||"%",t=("%"===e?this.state.proposedWidthPercents:this.state.proposedWidth)+e;this._options.editor.editing.view.change(()=>{this._cleanup(),this._options.onCommit(t)})}cancel(){this._cleanup()}destroy(){this.cancel()}redraw(e){const t=this._domResizerWrapper;if(!((o=t)&&o.ownerDocument&&o.ownerDocument.contains(o)))return;var o;const i=t.parentElement,r=this._getHandleHost(),s=this._viewResizerWrapper,n=[s.getStyle("width"),s.getStyle("height"),s.getStyle("left"),s.getStyle("top")];let a;if(i.isSameNode(r)){const t=e||new g.a(r);a=[t.width+"px",t.height+"px",void 0,void 0]}else a=[r.offsetWidth+"px",r.offsetHeight+"px",r.offsetLeft+"px",r.offsetTop+"px"];"same"!==Object(f.a)(n,a)&&this._options.editor.editing.view.change(e=>{e.setStyle({width:a[0],height:a[1],left:a[2],top:a[3]},s)})}containsHandle(e){return this._domResizerWrapper.contains(e)}static isResizeHandle(e){return e.classList.contains("ck-widget__resizer__handle")}_cleanup(){this._sizeView._dismiss();this._options.editor.editing.view.change(e=>{e.setStyle("width",this._initialViewWidth,this._options.viewElement)})}_proposeNewSize(e){const t=this.state,o={x:(i=e).pageX,y:i.pageY};var i;const r=!this._options.isCentered||this._options.isCentered(this),s={x:t._referenceCoordinates.x-(o.x+t.originalWidth),y:o.y-t.originalHeight-t._referenceCoordinates.y};r&&t.activeHandlePosition.endsWith("-right")&&(s.x=o.x-(t._referenceCoordinates.x+t.originalWidth)),r&&(s.x*=2);const n={width:Math.abs(t.originalWidth+s.x),height:Math.abs(t.originalHeight+s.y)};n.dominant=n.width/t.aspectRatio>n.height?"width":"height",n.max=n[n.dominant];const a={width:n.width,height:n.height};return"width"==n.dominant?a.height=a.width/t.aspectRatio:a.width=a.height*t.aspectRatio,{width:Math.round(a.width),height:Math.round(a.height),widthPercents:Math.min(Math.round(t.originalWidthPercents/t.originalWidth*a.width*100)/100,100)}}_getResizeHost(){const e=this._domResizerWrapper.parentElement;return this._options.getResizeHost(e)}_getHandleHost(){const e=this._domResizerWrapper.parentElement;return this._options.getHandleHost(e)}get _domResizerWrapper(){return this._options.editor.editing.view.domConverter.mapViewToDom(this._viewResizerWrapper)}_appendHandles(e){const t=["top-left","top-right","bottom-right","bottom-left"];for(const i of t)e.appendChild(new p.a({tag:"div",attributes:{class:"ck-widget__resizer__handle "+(o=i,"ck-widget__resizer__handle-"+o)}}).render());var o}_appendSizeUI(e){this._sizeView=new w,this._sizeView.render(),e.appendChild(this._sizeView.element)}}Object(k.a)(v,m.a);var y=o("./packages/ckeditor5-utils/src/dom/emittermixin.js"),j=o("./packages/ckeditor5-utils/src/dom/global.js"),x=o("./packages/ckeditor5-engine/src/view/observer/mouseobserver.js"),P=o("./node_modules/lodash-es/throttle.js");o("./packages/ckeditor5-widget/theme/widgetresize.css");class O extends r.a{static get pluginName(){return"WidgetResize"}init(){const e=this.editor.editing,t=j.a.window.document;this.set("visibleResizer",null),this.set("_activeResizer",null),this._resizers=new Map,e.view.addObserver(x.a),this._observer=Object.create(y.a),this.listenTo(e.view.document,"mousedown",this._mouseDownListener.bind(this),{priority:"high"}),this._observer.listenTo(t,"mousemove",this._mouseMoveListener.bind(this)),this._observer.listenTo(t,"mouseup",this._mouseUpListener.bind(this));const o=()=>{this.visibleResizer&&this.visibleResizer.redraw()};this._redrawFocusedResizerThrottled=Object(P.a)(o,200),this.on("change:visibleResizer",o),this.editor.ui.on("update",this._redrawFocusedResizerThrottled),this.editor.model.document.on("change",()=>{for(const[e,t]of this._resizers)e.isAttached()||(this._resizers.delete(e),t.destroy())},{priority:"lowest"}),this._observer.listenTo(j.a.window,"resize",this._redrawFocusedResizerThrottled);const i=this.editor.editing.view.document.selection;i.on("change",()=>{const e=i.getSelectedElement();this.visibleResizer=this.getResizerByViewElement(e)||null})}destroy(){this._observer.stopListening();for(const e of this._resizers.values())e.destroy();this._redrawFocusedResizerThrottled.cancel()}attachTo(e){const t=new v(e),o=this.editor.plugins;if(t.attach(),o.has("WidgetToolbarRepository")){const e=o.get("WidgetToolbarRepository");t.on("begin",()=>{e.forceDisabled("resize")},{priority:"lowest"}),t.on("cancel",()=>{e.clearForceDisabled("resize")},{priority:"highest"}),t.on("commit",()=>{e.clearForceDisabled("resize")},{priority:"highest"})}this._resizers.set(e.viewElement,t);const i=this.editor.editing.view.document.selection.getSelectedElement();return this.getResizerByViewElement(i)==t&&(this.visibleResizer=t),t}getResizerByViewElement(e){return this._resizers.get(e)}_getResizerByHandle(e){for(const t of this._resizers.values())if(t.containsHandle(e))return t}_mouseDownListener(e,t){const o=t.domTarget;v.isResizeHandle(o)&&(this._activeResizer=this._getResizerByHandle(o),this._activeResizer&&(this._activeResizer.begin(o),e.stop(),t.preventDefault()))}_mouseMoveListener(e,t){this._activeResizer&&this._activeResizer.updateSize(t)}_mouseUpListener(){this._activeResizer&&(this._activeResizer.commit(),this._activeResizer=null)}}Object(k.a)(O,m.a);var A=o("./packages/ckeditor5-widget/src/widgettypearound/widgettypearound.js")},0:function(e,t,o){e.exports=o}}),function(e){e.CKEditor5=e.CKEditor5||{};const t=["utils","core","engine","ui","clipboard","enter","paragraph","select-all","typing","undo","upload","widget"];for(const o of t){const t=o.replace(/-([a-z])/g,(e,t)=>t.toUpperCase());e.CKEditor5[t]=e.CKEditor5.dll(`./src/${o}.js`)}}(window);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/drupal/drupalEmphasis.js b/core/assets/vendor/ckeditor5/build/drupal/drupalEmphasis.js
new file mode 100644
index 0000000000..0ee238a1f6
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/drupal/drupalEmphasis.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.drupalEmphasis=t())}(self,(function(){return(()=>{var e={"ckeditor5/src/core.js":(e,t,r)=>{e.exports=r("dll-reference CKEditor5.dll")("./src/core.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function r(o){var i=t[o];if(void 0!==i)return i.exports;var s=t[o]={exports:{}};return e[o](s,s.exports,r),s.exports}r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var o={};return(()=>{"use strict";r.d(o,{default:()=>n});var e=r("ckeditor5/src/core.js");class t extends e.Plugin{static get pluginName(){return"DrupalEmphasisEditing"}init(){this.editor.conversion.for("downcast").attributeToElement({model:"italic",view:"em",converterPriority:"high"})}}const i=t;class s extends e.Plugin{static get requires(){return[i]}static get pluginName(){return"DrupalEmphasis"}}const n={DrupalEmphasis:s}})(),o=o.default})()}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/drupal/drupalImage.js b/core/assets/vendor/ckeditor5/build/drupal/drupalImage.js
new file mode 100644
index 0000000000..cebf40652f
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/drupal/drupalImage.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CKEditor5=e():(t.CKEditor5=t.CKEditor5||{},t.CKEditor5.drupalImage=e())}(self,(function(){return(()=>{var t={"ckeditor5/src/core.js":(t,e,i)=>{t.exports=i("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/upload.js":(t,e,i)=>{t.exports=i("dll-reference CKEditor5.dll")("./src/upload.js")},"ckeditor5/src/utils.js":(t,e,i)=>{t.exports=i("dll-reference CKEditor5.dll")("./src/utils.js")},"dll-reference CKEditor5.dll":t=>{"use strict";t.exports=CKEditor5.dll}},e={};function i(r){var n=e[r];if(void 0!==n)return n.exports;var a=e[r]={exports:{}};return t[r](a,a.exports,i),a.exports}i.d=(t,e)=>{for(var r in e)i.o(e,r)&&!i.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var r={};return(()=>{"use strict";i.d(r,{default:()=>p});var t=i("ckeditor5/src/core.js");function e(t){return t.createEmptyElement("img")}class n extends t.Plugin{static get pluginName(){return"DrupalImageEditing"}init(){const t=this.editor,i=t.conversion,{schema:r}=t.model;r.isRegistered("imageInline")&&r.extend("imageInline",{allowAttributes:["dataEntityUuid","dataEntityType","width","height"]}),r.isRegistered("imageBlock")&&r.extend("imageBlock",{allowAttributes:["dataEntityUuid","dataEntityType","width","height"]}),i.for("upcast").add(function(t){function e(e,i,r){const{viewItem:n}=i,{writer:a,consumable:o,safeInsert:s,updateConversionResult:l,schema:u}=r,d=[];let c;if(o.test(n,{name:!0,attributes:"src"})){if(c=u.checkChild(i.modelCursor,"imageInline")?a.createElement("imageInline",{src:n.getAttribute("src")}):a.createElement("imageBlock",{src:n.getAttribute("src")}),t.plugins.has("ImageStyleEditing")&&o.test(n,{name:!0,attributes:"data-align"})){const t={left:"alignBlockLeft",center:"alignCenter",right:"alignBlockRight"},e={left:"alignLeft",right:"alignRight"},i=n.getAttribute("data-align"),r=c.is("element","imageBlock")?t[i]:e[i];a.setAttribute("imageStyle",r,c),d.push("data-align")}if(c.is("element","imageBlock")&&o.test(n,{name:!0,attributes:"data-caption"})){const t=a.createElement("caption");a.insertText(n.getAttribute("data-caption"),t),a.append(t,c),d.push("data-caption")}o.test(n,{name:!0,attributes:"data-entity-uuid"})&&(a.setAttribute("dataEntityUuid",n.getAttribute("data-entity-uuid"),c),d.push("data-entity-uuid")),o.test(n,{name:!0,attributes:"data-entity-type"})&&(a.setAttribute("dataEntityType",n.getAttribute("data-entity-type"),c),d.push("data-entity-type")),s(c,i.modelCursor)&&(o.consume(n,{name:!0,attributes:d}),l(c,i))}}return t=>{t.on("element:img",e,{priority:"high"})}}(t)).attributeToAttribute({view:{name:"img",key:"width"},model:{key:"width",value:t=>`${t.getAttribute("width")}px`}}).attributeToAttribute({view:{name:"img",key:"height"},model:{key:"height",value:t=>`${t.getAttribute("height")}px`}}),i.for("downcast").add(function(){function t(t,e,i){const{item:r}=e,{consumable:n,writer:a}=i;if(!n.consume(r,t.name))return;const o=i.mapper.toViewElement(r),s=Array.from(o.getChildren()).find((t=>"img"===t.name));a.setAttribute("data-entity-uuid",e.attributeNewValue,s||o)}return e=>{e.on("attribute:dataEntityUuid",t)}}()).add(function(){function t(t,e,i){const{item:r}=e,{consumable:n,writer:a}=i;if(!n.consume(r,t.name))return;const o=i.mapper.toViewElement(r),s=Array.from(o.getChildren()).find((t=>"img"===t.name));a.setAttribute("data-entity-type",e.attributeNewValue,s||o)}return e=>{e.on("attribute:dataEntityType",t)}}()),i.for("dataDowncast").add((e=>{e.on("insert:caption",((e,i,r)=>{if(!r.consumable.consume(i.item,"insert"))return;let n="";if(Array.from(t.model.createRangeIn(i.item)).forEach((({item:t})=>{r.consumable.consume(t,"insert")&&t.is("$textProxy")&&(n+=t.data)})),n){const t=r.mapper.toViewElement(i.item.parent);r.writer.setAttribute("data-caption",n,t)}}),{priority:"high"})})).add((t=>{t.on("insert:$text",((t,e)=>{const{parent:i}=e.item;i.is("element","caption")&&i.parent.is("element","imageBlock")&&t.stop()}),{priority:"highest"})})).elementToElement({model:"imageBlock",view:(t,{writer:i})=>e(i),converterPriority:"high"}).elementToElement({model:"imageInline",view:(t,{writer:i})=>e(i),converterPriority:"high"}).add(function(){function t(t,e,i){const{item:r}=e,{consumable:n,writer:a}=i,o={alignLeft:"left",alignRight:"right",alignCenter:"center",alignBlockRight:"right",alignBlockLeft:"left"};if(!o[e.attributeNewValue]||!n.consume(r,t.name))return;const s=i.mapper.toViewElement(r),l=Array.from(s.getChildren()).find((t=>"img"===t.name));a.setAttribute("data-align",o[e.attributeNewValue],l||s)}return e=>{e.on("attribute:imageStyle",t,{priority:"high"})}}()).add(function(){function t(t,e,i){const{item:r}=e,{consumable:n,writer:a}=i;if(!n.consume(r,t.name))return;const o=i.mapper.toViewElement(r),s=Array.from(o.getChildren()).find((t=>"img"===t.name));a.setAttribute("width",e.attributeNewValue.replace("px",""),s||o)}return e=>{e.on("attribute:width:imageInline",t,{priority:"high"}),e.on("attribute:width:imageBlock",t,{priority:"high"})}}()).add(function(){function t(t,e,i){const{item:r}=e,{consumable:n,writer:a}=i;if(!n.consume(r,t.name))return;const o=i.mapper.toViewElement(r),s=Array.from(o.getChildren()).find((t=>"img"===t.name));a.setAttribute("height",e.attributeNewValue.replace("px",""),s||o)}return e=>{e.on("attribute:height:imageInline",t,{priority:"high"}),e.on("attribute:height:imageBlock",t,{priority:"high"})}}())}}class a extends t.Plugin{static get requires(){return[n]}static get pluginName(){return"DrupalImage"}}const o=a;class s extends t.Plugin{init(){const{editor:t}=this;t.plugins.get("ImageUploadEditing").on("uploadComplete",((e,{data:i,imageElement:r})=>{t.model.change((t=>{t.setAttribute("dataEntityUuid",i.dataEntityUuid,r),t.setAttribute("dataEntityType",i.dataEntityType,r)}))}))}static get pluginName(){return"DrupalImageUploadEditing"}}var l=i("ckeditor5/src/upload.js"),u=i("ckeditor5/src/utils.js");class d{constructor(t,e){this.loader=t,this.options=e}upload(){return this.loader.file.then((t=>new Promise(((e,i)=>{this._initRequest(),this._initListeners(e,i,t),this._sendRequest(t)}))))}abort(){this.xhr&&this.xhr.abort()}_initRequest(){this.xhr=new XMLHttpRequest,this.xhr.open("POST",this.options.uploadUrl,!0),this.xhr.responseType="json"}_initListeners(t,e,i){const r=this.xhr,n=this.loader,a=`Couldn't upload file: ${i.name}.`;r.addEventListener("error",(()=>e(a))),r.addEventListener("abort",(()=>e())),r.addEventListener("load",(()=>{const i=r.response;if(!i||i.error)return e(i&&i.error&&i.error.message?i.error.message:a);t({urls:{default:i.url},dataEntityUuid:i.uuid?i.uuid:"",dataEntityType:i.entity_type?i.entity_type:""})})),r.upload&&r.upload.addEventListener("progress",(t=>{t.lengthComputable&&(n.uploadTotal=t.total,n.uploaded=t.loaded)}))}_sendRequest(t){const e=this.options.headers||{},i=this.options.withCredentials||!1;Object.keys(e).forEach((t=>{this.xhr.setRequestHeader(t,e[t])})),this.xhr.withCredentials=i;const r=new FormData;r.append("upload",t),this.xhr.send(r)}}class c extends t.Plugin{static get requires(){return[l.FileRepository]}static get pluginName(){return"DrupalFileRepository"}init(){const t=this.editor.config.get("drupalImageUpload");t&&(t.uploadUrl?this.editor.plugins.get(l.FileRepository).createUploadAdapter=e=>new d(e,t):(0,u.logWarning)("simple-upload-adapter-missing-uploadurl"))}}class m extends t.Plugin{static get requires(){return[c,s]}static get pluginName(){return"DrupalImageUpload"}}const p={DrupalImage:o,DrupalImageUpload:m}})(),r=r.default})()}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/drupal/drupalMedia.js b/core/assets/vendor/ckeditor5/build/drupal/drupalMedia.js
new file mode 100644
index 0000000000..b96a914478
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/drupal/drupalMedia.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.drupalMedia=t())}(self,(function(){return(()=>{var e={"ckeditor5/src/core.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/utils.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/utils.js")},"ckeditor5/src/widget.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function i(r){var s=t[r];if(void 0!==s)return s.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,i),o.exports}i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var r={};return(()=>{"use strict";i.d(r,{default:()=>_});var e=i("ckeditor5/src/core.js"),t=i("ckeditor5/src/widget.js");class s extends e.Command{execute(e){this.editor.model.change((t=>{this.editor.model.insertContent(function(e,t){return e.createElement("drupalMedia",t)}(t,e))}))}refresh(){const e=this.editor.model,t=e.document.selection,i=e.schema.findAllowedParent(t.getFirstPosition(),"drupalMedia");this.isEnabled=null!==i}}const o=e=>{const t=e.getAttributes();let i="<drupal-media";return t.forEach((e=>{"data-caption"!==e[0]&&(i+=` ${e[0]}="${e[1]}"`)})),i+="></drupal-media>",i};class a extends e.Plugin{static get requires(){return[t.Widget]}init(){this.attrs=["alt","data-align","data-caption","data-entity-type","data-entity-uuid","data-view-mode"];const e=this.editor.config.get("drupalMedia");if(!e)return;const{previewURL:t,themeError:i}=e;this.previewURL=t,this.themeError=i||`\n      <p>${this.editor.t("An error occurred while trying to preview the media. Please save your work and reload this page.")}<p>\n    `,this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertDrupalMedia",new s(this.editor))}async _fetchPreview(e,t){const i=await fetch(`${e}?${new URLSearchParams(t)}`);if(i.ok){return{label:i.headers.get("drupal-media-label"),preview:await i.text()}}return this.themeError}_defineSchema(){this.editor.model.schema.register("drupalMedia",{allowWhere:"$block",isObject:!0,isContent:!0,allowAttributes:this.attrs})}_defineConverters(){const e=this.editor.conversion;e.for("upcast").elementToElement({view:{name:"drupal-media"},model:"drupalMedia"}),e.for("dataDowncast").elementToElement({model:"drupalMedia",view:{name:"drupal-media"}}),e.for("editingDowncast").elementToElement({model:"drupalMedia",view:(e,{writer:i})=>{const r=i.createContainerElement("div",{class:"drupal-media"}),s=i.createRawElement("div",{},(t=>{this.previewURL?this._fetchPreview(this.previewURL,{text:o(e),uuid:e.getAttribute("data-entity-uuid")}).then((({label:e,preview:i})=>{t.innerHTML=i,t.setAttribute("aria-label",e)})):(t.innerHTML=this.themeError,t.setAttribute("aria-label","drupal-media"))}));return i.insert(i.createPositionAt(r,0),s),i.setCustomProperty("drupalMedia",!0,r),(0,t.toWidget)(r,i,{label:"media widget"})}}),this.attrs.forEach((t=>{e.attributeToAttribute({model:t,view:t})}))}}var n=i("ckeditor5/src/ui.js");class l extends e.Plugin{init(){const e=this.editor,t=this.editor.config.get("drupalMedia");if(!t)return;const{libraryURL:i,openDialog:r,dialogSettings:s={}}=t;i&&"function"==typeof r&&e.ui.componentFactory.add("drupalMedia",(t=>{const o=e.commands.get("insertDrupalMedia"),a=new n.ButtonView(t);return a.set({label:e.t("Insert Drupal Media"),icon:'<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M19.1873 4.86414L10.2509 6.86414V7.02335H10.2499V15.5091C9.70972 15.1961 9.01793 15.1048 8.34069 15.3136C7.12086 15.6896 6.41013 16.8967 6.75322 18.0096C7.09631 19.1226 8.3633 19.72 9.58313 19.344C10.6666 19.01 11.3484 18.0203 11.2469 17.0234H11.2499V9.80173L18.1803 8.25067V14.3868C17.6401 14.0739 16.9483 13.9825 16.2711 14.1913C15.0513 14.5674 14.3406 15.7744 14.6836 16.8875C15.0267 18.0004 16.2937 18.5978 17.5136 18.2218C18.597 17.8877 19.2788 16.8982 19.1773 15.9011H19.1803V8.02687L19.1873 8.0253V4.86414Z" fill="black"/><path fill-rule="evenodd" clip-rule="evenodd" d="M13.5039 0.743652H0.386932V12.1603H13.5039V0.743652ZM12.3379 1.75842H1.55289V11.1454H1.65715L4.00622 8.86353L6.06254 10.861L9.24985 5.91309L11.3812 9.22179L11.7761 8.6676L12.3379 9.45621V1.75842ZM6.22048 4.50869C6.22048 5.58193 5.35045 6.45196 4.27722 6.45196C3.20398 6.45196 2.33395 5.58193 2.33395 4.50869C2.33395 3.43546 3.20398 2.56543 4.27722 2.56543C5.35045 2.56543 6.22048 3.43546 6.22048 4.50869Z" fill="black"/></svg>\n',tooltip:!0}),a.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(a,"execute",(()=>{r(i,(({attributes:t})=>{e.execute("insertDrupalMedia",t)}),s)})),a}))}}function d(e){return!!e&&e.is("element","drupalMedia")}function c(e){const i=e.getSelectedElement();return i&&function(e){return(0,t.isWidget)(e)&&!!e.getCustomProperty("drupalMedia")}(i)?i:null}class u extends e.Plugin{static get requires(){return[t.WidgetToolbarRepository]}static get pluginName(){return"DrupalMediaToolbar"}afterInit(){const e=this.editor,{t:i}=e;e.plugins.get(t.WidgetToolbarRepository).register("drupalMedia",{ariaLabel:i("Drupal Media toolbar"),items:e.config.get("drupalMedia.toolbar")||[],getRelatedElement:e=>c(e)})}}class h extends e.Command{refresh(){const e=this.editor.model.document.selection.getSelectedElement();this.isEnabled=!1,d(e)&&this._isMediaImage(e).then((e=>{this.isEnabled=e})),d(e)&&e.hasAttribute("alt")?this.value=e.getAttribute("alt"):this.value=!1}execute(e){const t=this.editor.model,i=t.document.selection.getSelectedElement();t.change((t=>{t.setAttribute("alt",e.newValue,i)}))}async _isMediaImage(e){const t=this.editor.config.get("drupalMedia");if(!t)return null;const{isMediaUrl:i}=t,r=new URLSearchParams({uuid:e.getAttribute("data-entity-uuid")}),s=await fetch(`${i}?${r}`);return s.ok?JSON.parse(await s.text()):null}}class m extends e.Plugin{static get pluginName(){return"MediaImageTextAlternativeEditing"}init(){this.editor.commands.add("mediaImageTextAlternative",new h(this.editor))}}function p(e){const t=e.editing.view,i=n.BalloonPanelView.defaultPositions;return{target:t.domConverter.viewToDom(t.document.selection.getSelectedElement()),positions:[i.northArrowSouth,i.northArrowSouthWest,i.northArrowSouthEast,i.southArrowNorth,i.southArrowNorthWest,i.southArrowNorthEast]}}var f=i("ckeditor5/src/utils.js");class g extends n.View{constructor(t){super(t);const i=this.locale.t;this.focusTracker=new f.FocusTracker,this.keystrokes=new f.KeystrokeHandler,this.labeledInput=this._createLabeledInputView(),this.saveButtonView=this._createButton(i("Save"),e.icons.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(i("Cancel"),e.icons.cancel,"ck-button-cancel","cancel"),this._focusables=new n.ViewCollection,this._focusCycler=new n.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"form",attributes:{class:["ck","ck-text-alternative-form","ck-responsive-form"],tabindex:"-1"},children:[this.labeledInput,this.saveButtonView,this.cancelButtonView]}),(0,n.injectCssTransitionDisabler)(this)}render(){super.render(),this.keystrokes.listenTo(this.element),(0,n.submitHandler)({view:this}),[this.labeledInput,this.saveButtonView,this.cancelButtonView].forEach((e=>{this._focusables.add(e),this.focusTracker.add(e.element)}))}_createButton(e,t,i,r){const s=new n.ButtonView(this.locale);return s.set({label:e,icon:t,tooltip:!0}),s.extendTemplate({attributes:{class:i}}),r&&s.delegate("execute").to(this,r),s}_createLabeledInputView(){const e=this.locale.t,t=new n.LabeledFieldView(this.locale,n.createLabeledInputText);return t.label=e("Override text alternative"),t}}class w extends e.Plugin{static get requires(){return[n.ContextualBalloon]}static get pluginName(){return"MediaImageTextAlternativeUi"}init(){this._createButton(),this._createForm()}destroy(){super.destroy(),this._form.destroy()}_createButton(){const t=this.editor,i=t.t;t.ui.componentFactory.add("mediaImageTextAlternative",(r=>{const s=t.commands.get("mediaImageTextAlternative"),o=new n.ButtonView(r);return o.set({label:i("Override media image text alternative"),icon:e.icons.lowVision,tooltip:!0}),o.bind("isVisible").to(s,"isEnabled"),this.listenTo(o,"execute",(()=>{this._showForm()})),o}))}_createForm(){const e=this.editor,t=e.editing.view.document;this._balloon=this.editor.plugins.get("ContextualBalloon"),this._form=new g(e.locale),this._form.render(),this.listenTo(this._form,"submit",(()=>{e.execute("mediaImageTextAlternative",{newValue:this._form.labeledInput.fieldView.element.value}),this._hideForm(!0)})),this.listenTo(this._form,"cancel",(()=>{this._hideForm(!0)})),this._form.keystrokes.set("Esc",((e,t)=>{this._hideForm(!0),t()})),this.listenTo(e.ui,"update",(()=>{c(t.selection)?this._isVisible&&function(e){const t=e.plugins.get("ContextualBalloon");if(c(e.editing.view.document.selection)){const i=p(e);t.updatePosition(i)}}(e):this._hideForm(!0)})),(0,n.clickOutsideHandler)({emitter:this._form,activator:()=>this._isVisible,contextElements:[this._balloon.view.element],callback:()=>this._hideForm()})}_showForm(){if(this._isVisible)return;const e=this.editor,t=e.commands.get("mediaImageTextAlternative"),i=this._form.labeledInput;this._form.disableCssTransitions(),this._isInBalloon||this._balloon.add({view:this._form,position:p(e)}),i.fieldView.element.value=t.value||"",i.fieldView.value=i.fieldView.element.value,this._form.labeledInput.fieldView.select(),this._form.enableCssTransitions()}_hideForm(e){this._isInBalloon&&(this._form.focusTracker.isFocused&&this._form.saveButtonView.focus(),this._balloon.remove(this._form),e&&this.editor.editing.view.focus())}get _isVisible(){return this._balloon.visibleView===this._form}get _isInBalloon(){return this._balloon.hasView(this._form)}}class b extends e.Plugin{static get requires(){return[m,w]}static get pluginName(){return"MediaImageTextAlternative"}}class v extends e.Plugin{static get requires(){return[a,l,u,b]}}const _={DrupalMedia:v,MediaImageTextAlternative:b,MediaImageTextAlternativeEditing:m,MediaImageTextAlternativeUi:w}})(),r=r.default})()}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/editor-classic.js b/core/assets/vendor/ckeditor5/build/editor-classic.js
new file mode 100644
index 0000000000..3ad3669cc8
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/editor-classic.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+window.CKEditor5=window.CKEditor5||{},window.CKEditor5.editorClassic=function(e){var t={};function r(o){if(t[o])return t[o].exports;var n=t[o]={i:o,l:!1,exports:{}};return e[o].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=e,r.c=t,r.d=function(e,t,o){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(r.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(o,n,function(t){return e[t]}.bind(null,n));return o},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=10)}([function(e,t,r){e.exports=r(3)("./src/ui.js")},function(e,t,r){e.exports=r(3)("./src/core.js")},function(e,t,r){e.exports=r(3)("./src/utils.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,r){e.exports=r(3)("./src/engine.js")},function(e,t,r){"use strict";(function(e){var r="object"==typeof e&&e&&e.Object===Object&&e;t.a=r}).call(this,r(9))},function(e,t,r){var o=r(7),n=r(8);"string"==typeof(n=n.__esModule?n.default:n)&&(n=[[e.i,n,""]]);var i={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};o(n,i);e.exports=n.locals||{}},function(e,t,r){"use strict";var o,n=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},i=function(){var e={};return function(t){if(void 0===e[t]){var r=document.querySelector(t);if(window.HTMLIFrameElement&&r instanceof window.HTMLIFrameElement)try{r=r.contentDocument.head}catch(e){r=null}e[t]=r}return e[t]}}(),c=[];function a(e){for(var t=-1,r=0;r<c.length;r++)if(c[r].identifier===e){t=r;break}return t}function s(e,t){for(var r={},o=[],n=0;n<e.length;n++){var i=e[n],s=t.base?i[0]+t.base:i[0],l=r[s]||0,d="".concat(s," ").concat(l);r[s]=l+1;var u=a(d),f={css:i[1],media:i[2],sourceMap:i[3]};-1!==u?(c[u].references++,c[u].updater(f)):c.push({identifier:d,updater:k(f,t),references:1}),o.push(d)}return o}function l(e){var t=document.createElement("style"),o=e.attributes||{};if(void 0===o.nonce){var n=r.nc;n&&(o.nonce=n)}if(Object.keys(o).forEach((function(e){t.setAttribute(e,o[e])})),"function"==typeof e.insert)e.insert(t);else{var c=i(e.insert||"head");if(!c)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");c.appendChild(t)}return t}var d,u=(d=[],function(e,t){return d[e]=t,d.filter(Boolean).join("\n")});function f(e,t,r,o){var n=r?"":o.media?"@media ".concat(o.media," {").concat(o.css,"}"):o.css;if(e.styleSheet)e.styleSheet.cssText=u(t,n);else{var i=document.createTextNode(n),c=e.childNodes;c[t]&&e.removeChild(c[t]),c.length?e.insertBefore(i,c[t]):e.appendChild(i)}}function b(e,t,r){var o=r.css,n=r.media,i=r.sourceMap;if(n?e.setAttribute("media",n):e.removeAttribute("media"),i&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleSheet)e.styleSheet.cssText=o;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(o))}}var p=null,h=0;function k(e,t){var r,o,n;if(t.singleton){var i=h++;r=p||(p=l(t)),o=f.bind(null,r,i,!1),n=f.bind(null,r,i,!0)}else r=l(t),o=b.bind(null,r,t),n=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(r)};return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else n()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=n());var r=s(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var o=0;o<r.length;o++){var n=a(r[o]);c[n].references--}for(var i=s(e,t),l=0;l<r.length;l++){var d=a(r[l]);0===c[d].references&&(c[d].updater(),c.splice(d,1))}r=i}}}},function(e,t){e.exports=".ck.ck-editor{position:relative}.ck.ck-editor .ck-editor__top .ck-sticky-panel .ck-toolbar{z-index:var(--ck-z-modal)}.ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-radius:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar,.ck.ck-editor__top .ck-sticky-panel .ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius);border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-bottom-width:0}.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar{border-bottom-width:1px;border-radius:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar,.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius);border-radius:0}.ck.ck-editor__main>.ck-editor__editable{background:var(--ck-color-base-background);border-radius:0}.ck-rounded-corners .ck.ck-editor__main>.ck-editor__editable,.ck.ck-editor__main>.ck-editor__editable.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck.ck-editor__main>.ck-editor__editable:not(.ck-focused){border-color:var(--ck-color-base-border)}"},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";r.r(t),r.d(t,"ClassicEditor",(function(){return P}));var o=r(1),n=r(2);var i=function(e){return null!=e&&"object"==typeof e},c=r(5),a="object"==typeof self&&self&&self.Object===Object&&self,s=(c.a||a||Function("return this")()).Symbol,l=Object.prototype,d=l.hasOwnProperty,u=l.toString,f=s?s.toStringTag:void 0;var b=function(e){var t=d.call(e,f),r=e[f];try{e[f]=void 0;var o=!0}catch(e){}var n=u.call(e);return o&&(t?e[f]=r:delete e[f]),n},p=Object.prototype.toString;var h=function(e){return p.call(e)},k=s?s.toStringTag:void 0;var m=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":k&&k in Object(e)?b(e):h(e)};var v=function(e,t){return function(r){return e(t(r))}}(Object.getPrototypeOf,Object),y=Function.prototype,g=Object.prototype,_=y.toString,w=g.hasOwnProperty,j=_.call(Object);var O=function(e){if(!i(e)||"[object Object]"!=m(e))return!1;var t=v(e);if(null===t)return!0;var r=w.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&_.call(r)==j};var x=function(e){return i(e)&&1===e.nodeType&&!O(e)},T=r(0),E=r(4);class C extends o.EditorUI{constructor(e,t){super(e),this.view=t,this._toolbarConfig=Object(T.normalizeToolbarConfig)(e.config.get("toolbar")),this._elementReplacer=new n.ElementReplacer}get element(){return this.view.element}init(e){const t=this.editor,r=this.view,o=t.editing.view,n=r.editable,i=o.document.getRoot();n.name=i.rootName,r.render();const c=n.element;this.setEditableElement(n.name,c),this.focusTracker.add(c),r.editable.bind("isFocused").to(this.focusTracker),o.attachDomRoot(c),e&&this._elementReplacer.replace(e,this.element),this._initPlaceholder(),this._initToolbar(),this.fire("ready")}destroy(){const e=this.view,t=this.editor.editing.view;this._elementReplacer.restore(),t.detachDomRoot(e.editable.name),e.destroy(),super.destroy()}_initToolbar(){const e=this.editor,t=this.view,r=e.editing.view;t.stickyPanel.bind("isActive").to(this.focusTracker,"isFocused"),t.stickyPanel.limiterElement=t.element,this._toolbarConfig.viewportTopOffset&&(t.stickyPanel.viewportTopOffset=this._toolbarConfig.viewportTopOffset),t.toolbar.fillFromConfig(this._toolbarConfig,this.componentFactory),Object(T.enableToolbarKeyboardFocus)({origin:r,originFocusTracker:this.focusTracker,originKeystrokeHandler:e.keystrokes,toolbar:t.toolbar})}_initPlaceholder(){const e=this.editor,t=e.editing.view,r=t.document.getRoot(),o=e.sourceElement,n=e.config.get("placeholder")||o&&"textarea"===o.tagName.toLowerCase()&&o.getAttribute("placeholder");n&&Object(E.enablePlaceholder)({view:t,element:r,text:n,isDirectHost:!1,keepOnFocus:!0})}}r(6);class S extends T.BoxedEditorUIView{constructor(e,t,r={}){super(e),this.stickyPanel=new T.StickyPanelView(e),this.toolbar=new T.ToolbarView(e,{shouldGroupWhenFull:r.shouldToolbarGroupWhenFull}),this.editable=new T.InlineEditableUIView(e,t)}render(){super.render(),this.stickyPanel.content.add(this.toolbar),this.top.add(this.stickyPanel),this.main.add(this.editable)}}class P extends o.Editor{constructor(e,t){super(t),x(e)&&(this.sourceElement=e),this.model.document.createRoot();const r=!this.config.get("toolbar.shouldNotGroupWhenFull"),n=new S(this.locale,this.editing.view,{shouldToolbarGroupWhenFull:r});this.ui=new C(this,n),Object(o.attachToForm)(this)}destroy(){return this.sourceElement&&this.updateSourceElement(),this.ui.destroy(),super.destroy()}static create(e,t={}){return new Promise(r=>{const o=new this(e,t);r(o.initPlugins().then(()=>o.ui.init(x(e)?e:null)).then(()=>{if(!x(e)&&t.initialData)throw new n.CKEditorError("editor-create-initial-data",null);const r=void 0!==t.initialData?t.initialData:function(e){return x(e)?Object(n.getDataFromElement)(e):e}(e);return o.data.init(r)}).then(()=>o.fire("ready")).then(()=>o))})}}Object(n.mix)(P,o.DataApiMixin),Object(n.mix)(P,o.ElementApiMixin)}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/editor-decoupled.js b/core/assets/vendor/ckeditor5/build/editor-decoupled.js
new file mode 100644
index 0000000000..702a29d569
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/editor-decoupled.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+window.CKEditor5=window.CKEditor5||{},window.CKEditor5.editorDecoupled=function(t){var e={};function o(r){if(e[r])return e[r].exports;var n=e[r]={i:r,l:!1,exports:{}};return t[r].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=t,o.c=e,o.d=function(t,e,r){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=7)}([function(t,e,o){t.exports=o(3)("./src/core.js")},function(t,e,o){t.exports=o(3)("./src/ui.js")},function(t,e,o){t.exports=o(3)("./src/utils.js")},function(t,e){t.exports=CKEditor5.dll},function(t,e,o){t.exports=o(3)("./src/engine.js")},function(t,e,o){"use strict";(function(t){var o="object"==typeof t&&t&&t.Object===Object&&t;e.a=o}).call(this,o(6))},function(t,e){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(t){"object"==typeof window&&(o=window)}t.exports=o},function(t,e,o){"use strict";o.r(e),o.d(e,"DecoupledEditor",(function(){return _}));var r=o(0),n=o(2);var i=function(t){return null!=t&&"object"==typeof t},c=o(5),s="object"==typeof self&&self&&self.Object===Object&&self,l=(c.a||s||Function("return this")()).Symbol,a=Object.prototype,u=a.hasOwnProperty,d=a.toString,f=l?l.toStringTag:void 0;var b=function(t){var e=u.call(t,f),o=t[f];try{t[f]=void 0;var r=!0}catch(t){}var n=d.call(t);return r&&(e?t[f]=o:delete t[f]),n},h=Object.prototype.toString;var p=function(t){return h.call(t)},g=l?l.toStringTag:void 0;var y=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":g&&g in Object(t)?b(t):p(t)};var m=function(t,e){return function(o){return t(e(o))}}(Object.getPrototypeOf,Object),w=Function.prototype,v=Object.prototype,j=w.toString,O=v.hasOwnProperty,E=j.call(Object);var x=function(t){if(!i(t)||"[object Object]"!=y(t))return!1;var e=m(t);if(null===e)return!0;var o=O.call(e,"constructor")&&e.constructor;return"function"==typeof o&&o instanceof o&&j.call(o)==E};var T=function(t){return i(t)&&1===t.nodeType&&!x(t)},F=o(1),D=o(4);class P extends r.EditorUI{constructor(t,e){super(t),this.view=e}init(){const t=this.editor,e=this.view,o=t.editing.view,r=e.editable,n=o.document.getRoot();e.editable.name=n.rootName,e.render();const i=r.element;this.setEditableElement(r.name,i),this.focusTracker.add(i),e.editable.bind("isFocused").to(this.focusTracker),o.attachDomRoot(i),this._initPlaceholder(),this._initToolbar(),this.fire("ready")}destroy(){const t=this.view;this.editor.editing.view.detachDomRoot(t.editable.name),t.destroy(),super.destroy()}_initToolbar(){const t=this.editor,e=this.view.toolbar;e.fillFromConfig(t.config.get("toolbar"),this.componentFactory),Object(F.enableToolbarKeyboardFocus)({origin:t.editing.view,originFocusTracker:this.focusTracker,originKeystrokeHandler:t.keystrokes,toolbar:e})}_initPlaceholder(){const t=this.editor,e=t.editing.view,o=e.document.getRoot(),r=t.sourceElement,n=t.config.get("placeholder")||r&&"textarea"===r.tagName.toLowerCase()&&r.getAttribute("placeholder");n&&Object(D.enablePlaceholder)({view:e,element:o,text:n,isDirectHost:!1,keepOnFocus:!0})}}class S extends F.EditorUIView{constructor(t,e,o={}){super(t),this.toolbar=new F.ToolbarView(t,{shouldGroupWhenFull:o.shouldToolbarGroupWhenFull}),this.editable=new F.InlineEditableUIView(t,e,o.editableElement),this.toolbar.extendTemplate({attributes:{class:["ck-reset_all","ck-rounded-corners"],dir:t.uiLanguageDirection}})}render(){super.render(),this.registerChild([this.toolbar,this.editable])}}class _ extends r.Editor{constructor(t,e){super(e),T(t)&&(this.sourceElement=t,Object(r.secureSourceElement)(this)),this.model.document.createRoot();const o=!this.config.get("toolbar.shouldNotGroupWhenFull"),n=new S(this.locale,this.editing.view,{editableElement:this.sourceElement,shouldToolbarGroupWhenFull:o});this.ui=new P(this,n)}destroy(){const t=this.getData();return this.ui.destroy(),super.destroy().then(()=>{this.sourceElement&&Object(n.setDataInElement)(this.sourceElement,t)})}static create(t,e={}){return new Promise(o=>{const r=T(t);if(r&&"TEXTAREA"===t.tagName)throw new n.CKEditorError("editor-wrong-element",null);const i=new this(t,e);o(i.initPlugins().then(()=>{i.ui.init()}).then(()=>{if(!r&&e.initialData)throw new n.CKEditorError("editor-create-initial-data",null);const o=void 0!==e.initialData?e.initialData:function(t){return T(t)?Object(n.getDataFromElement)(t):t}(t);return i.data.init(o)}).then(()=>i.fire("ready")).then(()=>i))})}}Object(n.mix)(_,r.DataApiMixin)}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/essentials.js b/core/assets/vendor/ckeditor5/build/essentials.js
new file mode 100644
index 0000000000..b20455a363
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/essentials.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+window.CKEditor5=window.CKEditor5||{},window.CKEditor5.essentials=function(t){var e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)r.d(n,o,function(e){return t[e]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=7)}([function(t,e){t.exports=CKEditor5.dll},function(t,e,r){t.exports=r(0)("./src/enter.js")},function(t,e,r){t.exports=r(0)("./src/core.js")},function(t,e,r){t.exports=r(0)("./src/clipboard.js")},function(t,e,r){t.exports=r(0)("./src/select-all.js")},function(t,e,r){t.exports=r(0)("./src/typing.js")},function(t,e,r){t.exports=r(0)("./src/undo.js")},function(t,e,r){"use strict";r.r(e),r.d(e,"Essentials",(function(){return l}));var n=r(2),o=r(3),i=r(1),u=r(4),s=r(5),c=r(6);class l extends n.Plugin{static get requires(){return[o.Clipboard,i.Enter,u.SelectAll,i.ShiftEnter,s.Typing,c.Undo]}static get pluginName(){return"Essentials"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/heading.js b/core/assets/vendor/ckeditor5/build/heading.js
new file mode 100644
index 0000000000..573d17a15a
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/heading.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Choose heading":"Choose heading",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6",Paragraph:"Paragraph","Type or paste your content here.":"Type or paste your content here.","Type your title":"Type your title"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.heading=function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=9)}([function(e,t,n){e.exports=n(4)("./src/core.js")},function(e,t,n){e.exports=n(4)("./src/utils.js")},function(e,t,n){e.exports=n(4)("./src/engine.js")},function(e,t,n){e.exports=n(4)("./src/ui.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,n){var i=n(7),o=n(8);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};i(o,a);e.exports=o.locals||{}},function(e,t,n){e.exports=n(4)("./src/paragraph.js")},function(e,t,n){"use strict";var i,o=function(){return void 0===i&&(i=Boolean(window&&document&&document.all&&!window.atob)),i},a=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),r=[];function s(e){for(var t=-1,n=0;n<r.length;n++)if(r[n].identifier===e){t=n;break}return t}function c(e,t){for(var n={},i=[],o=0;o<e.length;o++){var a=e[o],c=t.base?a[0]+t.base:a[0],d=n[c]||0,l="".concat(c," ").concat(d);n[c]=d+1;var h=s(l),u={css:a[1],media:a[2],sourceMap:a[3]};-1!==h?(r[h].references++,r[h].updater(u)):r.push({identifier:l,updater:f(u,t),references:1}),i.push(l)}return i}function d(e){var t=document.createElement("style"),i=e.attributes||{};if(void 0===i.nonce){var o=n.nc;o&&(i.nonce=o)}if(Object.keys(i).forEach((function(e){t.setAttribute(e,i[e])})),"function"==typeof e.insert)e.insert(t);else{var r=a(e.insert||"head");if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(t)}return t}var l,h=(l=[],function(e,t){return l[e]=t,l.filter(Boolean).join("\n")});function u(e,t,n,i){var o=n?"":i.media?"@media ".concat(i.media," {").concat(i.css,"}"):i.css;if(e.styleSheet)e.styleSheet.cssText=h(t,o);else{var a=document.createTextNode(o),r=e.childNodes;r[t]&&e.removeChild(r[t]),r.length?e.insertBefore(a,r[t]):e.appendChild(a)}}function g(e,t,n){var i=n.css,o=n.media,a=n.sourceMap;if(o?e.setAttribute("media",o):e.removeAttribute("media"),a&&"undefined"!=typeof btoa&&(i+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),e.styleSheet)e.styleSheet.cssText=i;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(i))}}var m=null,p=0;function f(e,t){var n,i,o;if(t.singleton){var a=p++;n=m||(m=d(t)),i=u.bind(null,n,a,!1),o=u.bind(null,n,a,!0)}else n=d(t),i=g.bind(null,n,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};return i(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;i(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=o());var n=c(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var i=0;i<n.length;i++){var o=s(n[i]);r[o].references--}for(var a=c(e,t),d=0;d<n.length;d++){var l=s(n[d]);0===r[l].references&&(r[l].updater(),r.splice(l,1))}n=a}}}},function(e,t){e.exports=".ck.ck-heading_heading1{font-size:20px}.ck.ck-heading_heading2{font-size:17px}.ck.ck-heading_heading3{font-size:14px}.ck[class*=ck-heading_heading]{font-weight:700}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__button .ck-button__label{width:8em}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__panel .ck-list__item{min-width:18em}"},function(e,t,n){"use strict";n.r(t),n.d(t,"Heading",(function(){return u})),n.d(t,"HeadingEditing",(function(){return c})),n.d(t,"HeadingUI",(function(){return h})),n.d(t,"HeadingButtonsUI",(function(){return m})),n.d(t,"Title",(function(){return v}));var i=n(0),o=n(6),a=n(1);class r extends i.Command{constructor(e,t){super(e),this.modelElements=t}refresh(){const e=Object(a.first)(this.editor.model.document.selection.getSelectedBlocks());this.value=!!e&&this.modelElements.includes(e.name)&&e.name,this.isEnabled=!!e&&this.modelElements.some(t=>s(e,t,this.editor.model.schema))}execute(e){const t=this.editor.model,n=t.document,i=e.value;t.change(e=>{const o=Array.from(n.selection.getSelectedBlocks()).filter(e=>s(e,i,t.schema));for(const t of o)t.is("element",i)||e.rename(t,i)})}}function s(e,t,n){return n.checkChild(e.parent,t)&&!n.isObject(e)}class c extends i.Plugin{static get pluginName(){return"HeadingEditing"}constructor(e){super(e),e.config.define("heading",{options:[{model:"paragraph",title:"Paragraph",class:"ck-heading_paragraph"},{model:"heading1",view:"h2",title:"Heading 1",class:"ck-heading_heading1"},{model:"heading2",view:"h3",title:"Heading 2",class:"ck-heading_heading2"},{model:"heading3",view:"h4",title:"Heading 3",class:"ck-heading_heading3"}]})}static get requires(){return[o.Paragraph]}init(){const e=this.editor,t=e.config.get("heading.options"),n=[];for(const i of t)"paragraph"!==i.model&&(e.model.schema.register(i.model,{inheritAllFrom:"$block"}),e.conversion.elementToElement(i),n.push(i.model));this._addDefaultH1Conversion(e),e.commands.add("heading",new r(e,n))}afterInit(){const e=this.editor,t=e.commands.get("enter"),n=e.config.get("heading.options");t&&this.listenTo(t,"afterExecute",(t,i)=>{const o=e.model.document.selection.getFirstPosition().parent;n.some(e=>o.is("element",e.model))&&!o.is("element","paragraph")&&0===o.childCount&&i.writer.rename(o,"paragraph")})}_addDefaultH1Conversion(e){e.conversion.for("upcast").elementToElement({model:"heading1",view:"h1",converterPriority:a.priorities.get("low")+1})}}var d=n(3);function l(e){const t=e.t,n={Paragraph:t("Paragraph"),"Heading 1":t("Heading 1"),"Heading 2":t("Heading 2"),"Heading 3":t("Heading 3"),"Heading 4":t("Heading 4"),"Heading 5":t("Heading 5"),"Heading 6":t("Heading 6")};return e.config.get("heading.options").map(e=>{const t=n[e.title];return t&&t!=e.title&&(e.title=t),e})}n(5);class h extends i.Plugin{static get pluginName(){return"HeadingUI"}init(){const e=this.editor,t=e.t,n=l(e),i=t("Choose heading"),o=t("Heading");e.ui.componentFactory.add("heading",t=>{const r={},s=new a.Collection,c=e.commands.get("heading"),l=e.commands.get("paragraph"),h=[c];for(const e of n){const t={type:"button",model:new d.Model({label:e.title,class:e.class,withText:!0})};"paragraph"===e.model?(t.model.bind("isOn").to(l,"value"),t.model.set("commandName","paragraph"),h.push(l)):(t.model.bind("isOn").to(c,"value",t=>t===e.model),t.model.set({commandName:"heading",commandValue:e.model})),s.add(t),r[e.model]=e.title}const u=Object(d.createDropdown)(t);return Object(d.addListToDropdown)(u,s),u.buttonView.set({isOn:!1,withText:!0,tooltip:o}),u.extendTemplate({attributes:{class:["ck-heading-dropdown"]}}),u.bind("isEnabled").toMany(h,"isEnabled",(...e)=>e.some(e=>e)),u.buttonView.bind("label").to(c,"value",l,"value",(e,t)=>{const n=e||t&&"paragraph";return r[n]?r[n]:i}),this.listenTo(u,"execute",t=>{e.execute(t.source.commandName,t.source.commandValue?{value:t.source.commandValue}:void 0),e.editing.view.focus()}),u})}}class u extends i.Plugin{static get requires(){return[c,h]}static get pluginName(){return"Heading"}}const g={heading1:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M19 9v10h-2v-8h-2V9h4zM4 8.5h5V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v11.5a1 1 0 0 1-1 1H10a1 1 0 0 1-1-1V11H4v4.5a1 1 0 0 1-1 1h-.5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v4.5z"/></svg>',heading2:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 8.5h5V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v11.5a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1V11H3v4.5a1 1 0 0 1-1 1h-.5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1H2a1 1 0 0 1 1 1v4.5zm16.076 8.343V18.5h-6.252c.067-.626.27-1.22.61-1.78.338-.561 1.006-1.305 2.005-2.232.804-.749 1.297-1.257 1.479-1.523.245-.368.368-.732.368-1.092 0-.398-.107-.703-.32-.917-.214-.214-.51-.32-.886-.32-.372 0-.669.111-.889.336-.22.224-.347.596-.38 1.117l-1.778-.178c.106-.982.438-1.686.997-2.114.558-.427 1.257-.64 2.095-.64.918 0 1.64.247 2.164.742.525.495.787 1.11.787 1.847 0 .419-.075.818-.225 1.197-.15.378-.388.775-.714 1.19-.216.275-.605.67-1.168 1.187-.563.516-.92.859-1.07 1.028a3.11 3.11 0 0 0-.365.495h3.542z"/></svg>',heading3:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 8.5h5V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v11.5a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1V11H3v4.5a1 1 0 0 1-1 1h-.5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1H2a1 1 0 0 1 1 1v4.5zm9.989 7.53 1.726-.209c.055.44.203.777.445 1.01.24.232.533.349.876.349.368 0 .678-.14.93-.42.251-.279.377-.655.377-1.13 0-.448-.12-.803-.362-1.066a1.153 1.153 0 0 0-.882-.393c-.228 0-.501.044-.819.133l.197-1.453c.482.012.85-.092 1.105-.315.253-.222.38-.517.38-.885 0-.313-.093-.563-.279-.75-.186-.185-.434-.278-.743-.278a1.07 1.07 0 0 0-.78.317c-.216.212-.347.52-.394.927l-1.644-.28c.114-.562.287-1.012.517-1.348.231-.337.553-.601.965-.794a3.24 3.24 0 0 1 1.387-.289c.876 0 1.579.28 2.108.838.436.457.653.973.653 1.549 0 .817-.446 1.468-1.339 1.955.533.114.96.37 1.28.768.319.398.478.878.478 1.441 0 .817-.298 1.513-.895 2.088-.596.576-1.339.864-2.228.864-.842 0-1.54-.243-2.094-.727-.555-.485-.876-1.118-.965-1.901z"/></svg>',heading4:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3.5 8.5h5V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v11.5a1 1 0 0 1-1 1h-.5a1 1 0 0 1-1-1V11h-5v4.5a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v4.5zm13.55 10v-1.873h-3.81v-1.561l4.037-5.91h1.498v5.904h1.156v1.567h-1.156V18.5H17.05zm0-3.44v-3.18l-2.14 3.18h2.14z"/></svg>',heading5:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3.5 8.5h5V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v11.5a1 1 0 0 1-1 1h-.5a1 1 0 0 1-1-1V11h-5v4.5a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v4.5zm9.578 7.607 1.777-.184c.05.402.201.72.45.955a1.223 1.223 0 0 0 1.81-.101c.258-.303.387-.759.387-1.368 0-.572-.128-1-.384-1.286-.256-.285-.59-.428-1-.428-.512 0-.971.226-1.377.679l-1.448-.21.915-4.843h4.716v1.67H15.56l-.28 1.58a2.697 2.697 0 0 1 1.219-.298 2.68 2.68 0 0 1 2.012.863c.55.576.825 1.323.825 2.241a3.36 3.36 0 0 1-.666 2.05c-.605.821-1.445 1.232-2.52 1.232-.86 0-1.56-.23-2.101-.692-.542-.461-.866-1.081-.971-1.86z"/></svg>',heading6:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3.5 8.5h5V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v11.5a1 1 0 0 1-1 1h-.5a1 1 0 0 1-1-1V11h-5v4.5a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v4.5zm15.595 2.973-1.726.19c-.043-.355-.153-.617-.33-.787-.178-.169-.409-.253-.692-.253-.377 0-.695.169-.956.507-.26.339-.424 1.043-.492 2.114.445-.525.997-.787 1.657-.787.745 0 1.383.284 1.914.85.531.568.797 1.3.797 2.197 0 .952-.28 1.716-.838 2.291-.559.576-1.276.864-2.152.864-.94 0-1.712-.365-2.317-1.095-.605-.73-.908-1.927-.908-3.59 0-1.705.316-2.935.946-3.688.63-.753 1.45-1.13 2.457-1.13.706 0 1.291.198 1.755.594.463.395.758.97.885 1.723zm-4.043 3.891c0 .58.133 1.028.4 1.343.266.315.57.473.914.473.33 0 .605-.13.825-.388.22-.258.33-.68.33-1.27 0-.604-.118-1.047-.355-1.329a1.115 1.115 0 0 0-.89-.422c-.342 0-.632.134-.869.403s-.355.666-.355 1.19z"/></svg>'};class m extends i.Plugin{init(){l(this.editor).filter(e=>"paragraph"!==e.model).map(e=>this._createButton(e))}_createButton(e){const t=this.editor;t.ui.componentFactory.add(e.model,n=>{const i=new d.ButtonView(n),o=t.commands.get("heading");return i.label=e.title,i.icon=e.icon||g[e.model],i.tooltip=!0,i.isToggleable=!0,i.bind("isEnabled").to(o),i.bind("isOn").to(o,"value",t=>t==e.model),i.on("execute",()=>{t.execute("heading",{value:e.model}),t.editing.view.focus()}),i})}}var p=n(2);const f=new Set(["paragraph","heading1","heading2","heading3","heading4","heading5","heading6"]);class v extends i.Plugin{static get pluginName(){return"Title"}static get requires(){return["Paragraph"]}init(){const e=this.editor,t=e.model;this._bodyPlaceholder=null,t.schema.register("title",{isBlock:!0,allowIn:"$root"}),t.schema.register("title-content",{isBlock:!0,allowIn:"title",allowAttributes:["alignment"]}),t.schema.extend("$text",{allowIn:"title-content"}),t.schema.addAttributeCheck(e=>{if(e.endsWith("title-content $text"))return!1}),e.editing.mapper.on("modelToViewPosition",b(e.editing.view)),e.data.mapper.on("modelToViewPosition",b(e.editing.view)),e.conversion.for("downcast").elementToElement({model:"title-content",view:"h1"}),e.data.upcastDispatcher.on("element:h1",w,{priority:"high"}),e.data.upcastDispatcher.on("element:h2",w,{priority:"high"}),e.data.upcastDispatcher.on("element:h3",w,{priority:"high"}),t.document.registerPostFixer(e=>this._fixTitleContent(e)),t.document.registerPostFixer(e=>this._fixTitleElement(e)),t.document.registerPostFixer(e=>this._fixBodyElement(e)),t.document.registerPostFixer(e=>this._fixExtraParagraph(e)),this._attachPlaceholders(),this._attachTabPressHandling()}getTitle(e={}){const t=this._getTitleElement().getChild(0);return this.editor.data.stringify(t,e)}getBody(e={}){const t=this.editor,n=t.data,i=t.model,o=t.model.document.getRoot(),a=t.editing.view,r=new p.DowncastWriter(a.document),s=i.createRangeIn(o),c=r.createDocumentFragment();n.downcastDispatcher.conversionApi.options=e,n.mapper.clearBindings(),n.mapper.bindElements(o,c),n.downcastDispatcher.convertInsert(s,r);const d=i.createPositionAfter(o.getChild(0)),l=i.createRange(d,i.createPositionAt(o,"end"));for(const e of i.markers){const t=l.getIntersection(e.getRange());t&&n.downcastDispatcher.convertMarkerAdd(e.name,t,r)}return delete n.downcastDispatcher.conversionApi.options,r.remove(r.createRangeOn(c.getChild(0))),t.data.processor.toData(c)}_getTitleElement(){const e=this.editor.model.document.getRoot();for(const t of e.getChildren())if(x(t))return t}_fixTitleContent(e){const t=this._getTitleElement();if(!t||1===t.maxOffset)return!1;const n=Array.from(t.getChildren());n.shift();for(const i of n)e.move(e.createRangeOn(i),t,"after"),e.rename(i,"paragraph");return!0}_fixTitleElement(e){const t=this.editor.model,n=t.document.getRoot(),i=Array.from(n.getChildren()).filter(x),o=i[0],a=n.getChild(0);if(a.is("element","title"))return y(i,e,t);if(!o&&!f.has(a.name)){const t=e.createElement("title");return e.insert(t,n),e.insertElement("title-content",t),!0}return f.has(a.name)?function(e,t,n){const i=t.createElement("title");t.insert(i,e,"before"),t.insert(e,i,0),t.rename(e,"title-content"),n.schema.removeDisallowedAttributes([e],t)}(a,e,t):e.move(e.createRangeOn(o),n,0),y(i,e,t),!0}_fixBodyElement(e){const t=this.editor.model.document.getRoot();return t.childCount<2&&(this._bodyPlaceholder=e.createElement("paragraph"),e.insert(this._bodyPlaceholder,t,1),!0)}_fixExtraParagraph(e){const t=this.editor.model.document.getRoot(),n=this._bodyPlaceholder;return!!function(e,t){if(!e||!e.is("element","paragraph")||e.childCount)return!1;if(t.childCount<=2||t.getChild(t.childCount-1)!==e)return!1;return!0}(n,t)&&(this._bodyPlaceholder=null,e.remove(n),!0)}_attachPlaceholders(){const e=this.editor,t=e.t,n=e.editing.view,i=n.document.getRoot(),o=e.sourceElement,a=e.config.get("title.placeholder")||t("Type your title"),r=e.config.get("placeholder")||o&&"textarea"===o.tagName.toLowerCase()&&o.getAttribute("placeholder")||t("Type or paste your content here.");let s;e.editing.downcastDispatcher.on("insert:title-content",(e,t,i)=>{Object(p.enablePlaceholder)({view:n,element:i.mapper.toViewElement(t.item),text:a,keepOnFocus:!0})}),n.document.registerPostFixer(e=>{const t=i.getChild(1);let n=!1;return t!==s&&(s&&(Object(p.hidePlaceholder)(e,s),e.removeAttribute("data-placeholder",s)),e.setAttribute("data-placeholder",r,t),s=t,n=!0),n=Object(p.needsPlaceholder)(t,!0)&&2===i.childCount&&"p"===t.name?!!Object(p.showPlaceholder)(e,t)||n:!!Object(p.hidePlaceholder)(e,t)||n,n})}_attachTabPressHandling(){const e=this.editor,t=e.model;e.keystrokes.set("TAB",(e,n)=>{t.change(e=>{const i=t.document.selection,o=Array.from(i.getSelectedBlocks());if(1===o.length&&o[0].is("element","title-content")){const i=t.document.getRoot().getChild(1);e.setSelection(i,0),n()}})}),e.keystrokes.set("SHIFT + TAB",(n,i)=>{t.change(n=>{const o=t.document.selection;if(!o.isCollapsed)return;const r=e.model.document.getRoot(),s=Object(a.first)(o.getSelectedBlocks()),c=o.getFirstPosition(),d=r.getChild(0);s===r.getChild(1)&&c.isAtStart&&(n.setSelection(d.getChild(0),0),i())})})}}function w(e,t,n){const i=t.modelCursor,o=t.viewItem;if(!i.isAtStart||!i.parent.is("element","$root"))return;if(!n.consumable.consume(o,{name:!0}))return;const a=n.writer,r=a.createElement("title"),s=a.createElement("title-content");a.append(s,r),a.insert(r,i),n.convertChildren(o,s),n.updateConversionResult(r,t)}function b(e){return(t,n)=>{const i=n.modelPosition.parent;if(!i.is("element","title"))return;const o=i.parent,a=n.mapper.toViewElement(o);n.viewPosition=e.createPositionAt(a,0),t.stop()}}function x(e){return e.is("element","title")}function y(e,t,n){let i=!1;for(const o of e)0!==o.index&&(H(o,t,n),i=!0);return i}function H(e,t,n){const i=e.getChild(0);i.isEmpty?t.remove(e):(t.move(t.createRangeOn(i),e,"before"),t.rename(i,"paragraph"),t.remove(e),n.schema.removeDisallowedAttributes([i],t))}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/horizontal-line.js b/core/assets/vendor/ckeditor5/build/horizontal-line.js
new file mode 100644
index 0000000000..54d6809100
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/horizontal-line.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Horizontal line":"Horizontal line"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.horizontalLine=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(e,t,n){e.exports=n(2)("./src/core.js")},function(e,t,n){e.exports=n(2)("./src/widget.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,n){e.exports=n(2)("./src/ui.js")},function(e,t,n){var r=n(5),o=n(6);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var i={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};r(o,i);e.exports=o.locals||{}},function(e,t,n){"use strict";var r,o=function(){return void 0===r&&(r=Boolean(window&&document&&document.all&&!window.atob)),r},i=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),a=[];function c(e){for(var t=-1,n=0;n<a.length;n++)if(a[n].identifier===e){t=n;break}return t}function s(e,t){for(var n={},r=[],o=0;o<e.length;o++){var i=e[o],s=t.base?i[0]+t.base:i[0],l=n[s]||0,u="".concat(s," ").concat(l);n[s]=l+1;var d=c(u),f={css:i[1],media:i[2],sourceMap:i[3]};-1!==d?(a[d].references++,a[d].updater(f)):a.push({identifier:u,updater:g(f,t),references:1}),r.push(u)}return r}function l(e){var t=document.createElement("style"),r=e.attributes||{};if(void 0===r.nonce){var o=n.nc;o&&(r.nonce=o)}if(Object.keys(r).forEach((function(e){t.setAttribute(e,r[e])})),"function"==typeof e.insert)e.insert(t);else{var a=i(e.insert||"head");if(!a)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");a.appendChild(t)}return t}var u,d=(u=[],function(e,t){return u[e]=t,u.filter(Boolean).join("\n")});function f(e,t,n,r){var o=n?"":r.media?"@media ".concat(r.media," {").concat(r.css,"}"):r.css;if(e.styleSheet)e.styleSheet.cssText=d(t,o);else{var i=document.createTextNode(o),a=e.childNodes;a[t]&&e.removeChild(a[t]),a.length?e.insertBefore(i,a[t]):e.appendChild(i)}}function p(e,t,n){var r=n.css,o=n.media,i=n.sourceMap;if(o?e.setAttribute("media",o):e.removeAttribute("media"),i&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleSheet)e.styleSheet.cssText=r;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(r))}}var h=null,m=0;function g(e,t){var n,r,o;if(t.singleton){var i=m++;n=h||(h=l(t)),r=f.bind(null,n,i,!1),o=f.bind(null,n,i,!0)}else n=l(t),r=p.bind(null,n,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=o());var n=s(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var r=0;r<n.length;r++){var o=c(n[r]);a[o].references--}for(var i=s(e,t),l=0;l<n.length;l++){var u=c(n[l]);0===a[u].references&&(a[u].updater(),a.splice(u,1))}n=i}}}},function(e,t){e.exports=".ck-editor__editable .ck-horizontal-line{display:flow-root}.ck-content hr{margin:15px 0;height:4px;background:#dedede;border:0}"},function(e,t,n){"use strict";n.r(t),n.d(t,"HorizontalLine",(function(){return l})),n.d(t,"HorizontalLineEditing",(function(){return a})),n.d(t,"HorizontalLineUI",(function(){return s}));var r=n(0),o=n(1);class i extends r.Command{refresh(){const e=this.editor.model,t=e.schema,n=e.document.selection;this.isEnabled=function(e,t,n){const r=function(e,t){const n=Object(o.findOptimalInsertionRange)(e,t).start.parent;if(n.isEmpty&&!n.is("element","$root"))return n.parent;return n}(e,n);return t.checkChild(r,"horizontalLine")}(n,t,e)}execute(){const e=this.editor.model;e.change(t=>{const n=t.createElement("horizontalLine");e.insertContent(n);let r=n.nextSibling;!(r&&e.schema.checkChild(r,"$text"))&&e.schema.checkChild(n.parent,"paragraph")&&(r=t.createElement("paragraph"),e.insertContent(r,t.createPositionAfter(n))),r&&t.setSelection(r,0)})}}n(4);class a extends r.Plugin{static get pluginName(){return"HorizontalLineEditing"}init(){const e=this.editor,t=e.model.schema,n=e.t,r=e.conversion;t.register("horizontalLine",{isObject:!0,allowWhere:"$block"}),r.for("dataDowncast").elementToElement({model:"horizontalLine",view:(e,{writer:t})=>t.createEmptyElement("hr")}),r.for("editingDowncast").elementToElement({model:"horizontalLine",view:(e,{writer:t})=>{const r=n("Horizontal line"),i=t.createContainerElement("div"),a=t.createEmptyElement("hr");return t.addClass("ck-horizontal-line",i),t.setCustomProperty("hr",!0,i),t.insert(t.createPositionAt(i,0),a),function(e,t,n){return t.setCustomProperty("horizontalLine",!0,e),Object(o.toWidget)(e,t,{label:n})}(i,t,r)}}),r.for("upcast").elementToElement({view:"hr",model:"horizontalLine"}),e.commands.add("horizontalLine",new i(e))}}var c=n(3);class s extends r.Plugin{static get pluginName(){return"HorizontalLineUI"}init(){const e=this.editor,t=e.t;e.ui.componentFactory.add("horizontalLine",n=>{const r=e.commands.get("horizontalLine"),o=new c.ButtonView(n);return o.set({label:t("Horizontal line"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 9h16v2H2z"/></svg>',tooltip:!0}),o.bind("isEnabled").to(r,"isEnabled"),this.listenTo(o,"execute",()=>{e.execute("horizontalLine"),e.editing.view.focus()}),o})}}class l extends r.Plugin{static get requires(){return[a,s,o.Widget]}static get pluginName(){return"HorizontalLine"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/html-support.js b/core/assets/vendor/ckeditor5/build/html-support.js
new file mode 100644
index 0000000000..368ee5da73
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/html-support.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"HTML object":"HTML object"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.htmlSupport=function(e){var t={};function r(o){if(t[o])return t[o].exports;var n=t[o]={i:o,l:!1,exports:{}};return e[o].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=e,r.c=t,r.d=function(e,t,o){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(r.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(o,n,function(t){return e[t]}.bind(null,n));return o},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=17)}([function(e,t,r){"use strict";var o=r(6),n="object"==typeof self&&self&&self.Object===Object&&self,i=o.a||n||Function("return this")();t.a=i},function(e,t,r){e.exports=r(4)("./src/core.js")},function(e,t,r){e.exports=r(4)("./src/utils.js")},function(e,t,r){"use strict";(function(e){var o=r(6),n="object"==typeof exports&&exports&&!exports.nodeType&&exports,i=n&&"object"==typeof e&&e&&!e.nodeType&&e,l=i&&i.exports===n&&o.a.process,a=function(){try{var e=i&&i.require&&i.require("util").types;return e||l&&l.binding&&l.binding("util")}catch(e){}}();t.a=a}).call(this,r(8)(e))},function(e,t){e.exports=CKEditor5.dll},function(e,t,r){e.exports=r(4)("./src/widget.js")},function(e,t,r){"use strict";(function(e){var r="object"==typeof e&&e&&e.Object===Object&&e;t.a=r}).call(this,r(13))},function(e,t,r){"use strict";(function(e){var o=r(0),n=r(10),i="object"==typeof exports&&exports&&!exports.nodeType&&exports,l=i&&"object"==typeof e&&e&&!e.nodeType&&e,a=l&&l.exports===i?o.a.Buffer:void 0,c=(a?a.isBuffer:void 0)||n.a;t.a=c}).call(this,r(8)(e))},function(e,t){e.exports=function(e){if(!e.webpackPolyfill){var t=Object.create(e);t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),Object.defineProperty(t,"exports",{enumerable:!0}),t.webpackPolyfill=1}return t}},function(e,t,r){e.exports=r(4)("./src/engine.js")},function(e,t,r){"use strict";t.a=function(){return!1}},function(e,t,r){"use strict";(function(e){var o=r(0),n="object"==typeof exports&&exports&&!exports.nodeType&&exports,i=n&&"object"==typeof e&&e&&!e.nodeType&&e,l=i&&i.exports===n?o.a.Buffer:void 0,a=l?l.allocUnsafe:void 0;t.a=function(e,t){if(t)return e.slice();var r=e.length,o=a?a(r):new e.constructor(r);return e.copy(o),o}}).call(this,r(8)(e))},,function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){var o=r(15),n=r(16);"string"==typeof(n=n.__esModule?n.default:n)&&(n=[[e.i,n,""]]);var i={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};o(n,i);e.exports=n.locals||{}},function(e,t,r){"use strict";var o,n=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},i=function(){var e={};return function(t){if(void 0===e[t]){var r=document.querySelector(t);if(window.HTMLIFrameElement&&r instanceof window.HTMLIFrameElement)try{r=r.contentDocument.head}catch(e){r=null}e[t]=r}return e[t]}}(),l=[];function a(e){for(var t=-1,r=0;r<l.length;r++)if(l[r].identifier===e){t=r;break}return t}function c(e,t){for(var r={},o=[],n=0;n<e.length;n++){var i=e[n],c=t.base?i[0]+t.base:i[0],s=r[c]||0,m="".concat(c," ").concat(s);r[c]=s+1;var u=a(m),d={css:i[1],media:i[2],sourceMap:i[3]};-1!==u?(l[u].references++,l[u].updater(d)):l.push({identifier:m,updater:p(d,t),references:1}),o.push(m)}return o}function s(e){var t=document.createElement("style"),o=e.attributes||{};if(void 0===o.nonce){var n=r.nc;n&&(o.nonce=n)}if(Object.keys(o).forEach((function(e){t.setAttribute(e,o[e])})),"function"==typeof e.insert)e.insert(t);else{var l=i(e.insert||"head");if(!l)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");l.appendChild(t)}return t}var m,u=(m=[],function(e,t){return m[e]=t,m.filter(Boolean).join("\n")});function d(e,t,r,o){var n=r?"":o.media?"@media ".concat(o.media," {").concat(o.css,"}"):o.css;if(e.styleSheet)e.styleSheet.cssText=u(t,n);else{var i=document.createTextNode(n),l=e.childNodes;l[t]&&e.removeChild(l[t]),l.length?e.insertBefore(i,l[t]):e.appendChild(i)}}function h(e,t,r){var o=r.css,n=r.media,i=r.sourceMap;if(n?e.setAttribute("media",n):e.removeAttribute("media"),i&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleSheet)e.styleSheet.cssText=o;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(o))}}var f=null,b=0;function p(e,t){var r,o,n;if(t.singleton){var i=b++;r=f||(f=s(t)),o=d.bind(null,r,i,!1),n=d.bind(null,r,i,!0)}else r=s(t),o=h.bind(null,r,t),n=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(r)};return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else n()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=n());var r=c(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var o=0;o<r.length;o++){var n=a(r[o]);l[n].references--}for(var i=c(e,t),s=0;s<r.length;s++){var m=a(r[s]);0===l[m].references&&(l[m].updater(),l.splice(m,1))}r=i}}}},function(e,t){e.exports=":root{--ck-html-object-embed-unfocused-outline-width:1px}.ck-widget.html-object-embed{font-size:var(--ck-font-size-base);background-color:var(--ck-color-base-foreground);padding:var(--ck-spacing-small);padding-top:calc(var(--ck-font-size-tiny) + var(--ck-spacing-large));min-width:calc(76px + var(--ck-spacing-standard))}.ck-widget.html-object-embed:not(.ck-widget_selected):not(:hover){outline:var(--ck-html-object-embed-unfocused-outline-width) dashed var(--ck-color-widget-blurred-border)}.ck-widget.html-object-embed:before{font-weight:400;font-style:normal;position:absolute;content:attr(data-html-object-embed-label);top:0;left:var(--ck-spacing-standard);background:#999;transition:background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);padding:calc(var(--ck-spacing-tiny) + var(--ck-html-object-embed-unfocused-outline-width)) var(--ck-spacing-small) var(--ck-spacing-tiny);border-radius:0 0 var(--ck-border-radius) var(--ck-border-radius);color:var(--ck-color-base-background);font-size:var(--ck-font-size-tiny);font-family:var(--ck-font-face)}.ck-widget.html-object-embed .ck-widget__type-around .ck-widget__type-around__button.ck-widget__type-around__button_before{margin-left:50px}.ck-widget.html-object-embed .html-object-embed__content{pointer-events:none}div.ck-widget.html-object-embed{margin:1em auto}span.ck-widget.html-object-embed{display:inline-block}"},function(e,t,r){"use strict";r.r(t),r.d(t,"GeneralHtmlSupport",(function(){return qr})),r.d(t,"DataFilter",(function(){return Mr})),r.d(t,"DataSchema",(function(){return a})),r.d(t,"HtmlComment",(function(){return Kr}));var o=r(1),n=r(2),i=[{model:"heading1",view:"h2"},{model:"heading2",view:"h3"},{model:"heading3",view:"h4"},{model:"codeBlock",view:"pre"},{model:"paragraph",view:"p"},{model:"blockQuote",view:"blockquote"},{model:"listItem",view:"li"},{model:"pageBreak",view:"div"},{model:"rawHtml",view:"div"},{model:"table",view:"table"},{model:"tableRow",view:"tr"},{model:"tableCell",view:"td"},{model:"tableCell",view:"th"},{model:"caption",view:"caption"},{model:"caption",view:"figcaption"},{model:"$htmlSection",modelSchema:{allowChildren:"$block",allowIn:["$root","$htmlSection"],isBlock:!0}},{model:"htmlP",view:"p",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlBlockquote",view:"blockquote",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlTable",view:"table",modelSchema:{allowIn:["$htmlSection","$root"],isBlock:!0}},{model:"htmlTbody",view:"tbody",modelSchema:{allowIn:"htmlTable",isBlock:!0}},{model:"htmlThead",view:"thead",modelSchema:{allowIn:"htmlTable",isBlock:!0}},{model:"htmlTfoot",view:"tfoot",modelSchema:{allowIn:"htmlTable",isBlock:!0}},{model:"htmlCaption",view:"caption",modelSchema:{allowIn:"htmlTable",allowChildren:"$text",isBlock:!0}},{model:"htmlTr",view:"tr",modelSchema:{allowIn:["htmlTable","htmlThead","htmlTbody"],isBlock:!0}},{model:"htmlTd",view:"td",modelSchema:{allowIn:"htmlTr",allowChildren:["$block","$htmlSection"],isBlock:!0}},{model:"htmlTh",view:"th",modelSchema:{allowIn:"htmlTr",allowChildren:["$block","$htmlSection"],isBlock:!0}},{model:"htmlFigure",view:"figure",modelSchema:{inheritAllFrom:"$htmlSection",isBlock:!0}},{model:"htmlFigcaption",view:"figcaption",modelSchema:{allowIn:"htmlFigure",allowChildren:"$text",isBlock:!0}},{model:"htmlAddress",view:"address",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlAside",view:"aside",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlMain",view:"main",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlDetails",view:"details",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlSumary",view:"summary",modelSchema:{allowChildren:"$text",allowIn:"htmlDetails",isBlock:!0}},{model:"htmlDiv",view:"div",paragraphLikeModel:"htmlDivParagraph",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlFieldset",view:"fieldset",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlLegend",view:"legend",modelSchema:{allowIn:"htmlFieldset",allowChildren:"$text"}},{model:"htmlHeader",view:"header",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlFooter",view:"footer",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlForm",view:"form",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlHgroup",view:"hgroup",modelSchema:{allowChildren:["htmlHeading1","htmlHeading2","htmlHeading3","htmlHeading4","htmlHeading5","htmlHeading6","heading1","heading2","heading3"],isBlock:!0}},{model:"htmlH1",view:"h1",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH2",view:"h2",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH3",view:"h3",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH4",view:"h4",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH5",view:"h5",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH6",view:"h6",modelSchema:{inheritAllFrom:"$block"}},{model:"$htmlList",modelSchema:{allowWhere:"$htmlSection",allowChildren:["$htmlList","htmlLi"],isBlock:!0}},{model:"htmlDir",view:"dir",modelSchema:{inheritAllFrom:"$htmlList"}},{model:"htmlMenu",view:"menu",modelSchema:{inheritAllFrom:"$htmlList"}},{model:"htmlUl",view:"ul",modelSchema:{inheritAllFrom:"$htmlList"}},{model:"htmlOl",view:"ol",modelSchema:{inheritAllFrom:"$htmlList"}},{model:"htmlLi",view:"li",modelSchema:{allowIn:"$htmlList",allowChildren:"$text",isBlock:!0}},{model:"htmlPre",view:"pre",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlArticle",view:"article",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlSection",view:"section",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlNav",view:"nav",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"htmlDl",view:"dl",modelSchema:{allowIn:["$htmlSection","$root"],allowChildren:["htmlDt","htmlDd"],isBlock:!0}},{model:"htmlDt",view:"dt",modelSchema:{allowChildren:"$block",isBlock:!0}},{model:"htmlDd",view:"dd",modelSchema:{allowChildren:"$block",isBlock:!0}},{model:"htmlCenter",view:"center",modelSchema:{inheritAllFrom:"$htmlSection"}},{model:"$htmlObjectBlock",isObject:!0,modelSchema:{isObject:!0,isBlock:!0,allowWhere:"$block"}}],l=[{model:"htmlAcronym",view:"acronym",attributeProperties:{copyOnEnter:!0}},{model:"htmlTt",view:"tt",attributeProperties:{copyOnEnter:!0}},{model:"htmlFont",view:"font",attributeProperties:{copyOnEnter:!0}},{model:"htmlTime",view:"time",attributeProperties:{copyOnEnter:!0}},{model:"htmlVar",view:"var",attributeProperties:{copyOnEnter:!0}},{model:"htmlBig",view:"big",attributeProperties:{copyOnEnter:!0}},{model:"htmlSmall",view:"small",attributeProperties:{copyOnEnter:!0}},{model:"htmlSamp",view:"samp",attributeProperties:{copyOnEnter:!0}},{model:"htmlQ",view:"q",attributeProperties:{copyOnEnter:!0}},{model:"htmlOutput",view:"output",attributeProperties:{copyOnEnter:!0}},{model:"htmlKbd",view:"kbd",attributeProperties:{copyOnEnter:!0}},{model:"htmlBdi",view:"bdi",attributeProperties:{copyOnEnter:!0}},{model:"htmlBdo",view:"bdo",attributeProperties:{copyOnEnter:!0}},{model:"htmlAbbr",view:"abbr",attributeProperties:{copyOnEnter:!0}},{model:"htmlA",view:"a",priority:5,attributeProperties:{copyOnEnter:!0}},{model:"htmlStrong",view:"strong",attributeProperties:{copyOnEnter:!0}},{model:"htmlB",view:"b",attributeProperties:{copyOnEnter:!0}},{model:"htmlI",view:"i",attributeProperties:{copyOnEnter:!0}},{model:"htmlEm",view:"em",attributeProperties:{copyOnEnter:!0}},{model:"htmlS",view:"s",attributeProperties:{copyOnEnter:!0}},{model:"htmlDel",view:"del",attributeProperties:{copyOnEnter:!0}},{model:"htmlIns",view:"ins",attributeProperties:{copyOnEnter:!0}},{model:"htmlU",view:"u",attributeProperties:{copyOnEnter:!0}},{model:"htmlSub",view:"sub",attributeProperties:{copyOnEnter:!0}},{model:"htmlSup",view:"sup",attributeProperties:{copyOnEnter:!0}},{model:"htmlCode",view:"code",attributeProperties:{copyOnEnter:!0}},{model:"htmlMark",view:"mark",attributeProperties:{copyOnEnter:!0}},{model:"htmlSpan",view:"span",attributeProperties:{copyOnEnter:!0}},{model:"htmlCite",view:"cite",attributeProperties:{copyOnEnter:!0}},{model:"htmlLabel",view:"label",attributeProperties:{copyOnEnter:!0}},{model:"htmlDfn",view:"dfn",attributeProperties:{copyOnEnter:!0}},{model:"$htmlObjectInline",isObject:!0,modelSchema:{isObject:!0,isInline:!0,allowWhere:"$text",allowAttributesOf:"$text"}},{model:"htmlObject",view:"object",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlIframe",view:"iframe",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlInput",view:"input",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlButton",view:"button",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlTextarea",view:"textarea",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlSelect",view:"select",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlVideo",view:"video",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlEmbed",view:"embed",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlOembed",view:"oembed",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlAudio",view:"audio",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlImg",view:"img",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlCanvas",view:"canvas",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlMeter",view:"meter",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}},{model:"htmlProgress",view:"progress",isObject:!0,modelSchema:{inheritAllFrom:"$htmlObjectInline"}}];class a extends o.Plugin{constructor(e){super(e),this._definitions=new Map}static get pluginName(){return"DataSchema"}init(){for(const e of i)this.registerBlockElement(e);for(const e of l)this.registerInlineElement(e)}registerBlockElement(e){this._definitions.set(e.model,{...e,isBlock:!0})}registerInlineElement(e){this._definitions.set(e.model,{...e,isInline:!0})}getDefinitionsForView(e,t){const r=new Set;for(const o of this._getMatchingViewDefinitions(e)){if(t)for(const e of this._getReferences(o.model))r.add(e);r.add(o)}return r}_getMatchingViewDefinitions(e){return Array.from(this._definitions.values()).filter(t=>t.view&&function(e,t){if("string"==typeof e)return e===t;if(e instanceof RegExp)return e.test(t);return!1}(e,t.view))}*_getReferences(e){const{modelSchema:t}=this._definitions.get(e);if(!t)return;const r=["inheritAllFrom","inheritTypesFrom","allowWhere","allowContentOf","allowAttributesOf"];for(const o of r)for(const r of Object(n.toArray)(t[o]||[])){const t=this._definitions.get(r);r!==e&&t&&(yield*this._getReferences(t.model),yield t)}}}var c=r(9),s=r(5);var m=function(){this.__data__=[],this.size=0};var u=function(e,t){return e===t||e!=e&&t!=t};var d=function(e,t){for(var r=e.length;r--;)if(u(e[r][0],t))return r;return-1},h=Array.prototype.splice;var f=function(e){var t=this.__data__,r=d(t,e);return!(r<0)&&(r==t.length-1?t.pop():h.call(t,r,1),--this.size,!0)};var b=function(e){var t=this.__data__,r=d(t,e);return r<0?void 0:t[r][1]};var p=function(e){return d(this.__data__,e)>-1};var v=function(e,t){var r=this.__data__,o=d(r,e);return o<0?(++this.size,r.push([e,t])):r[o][1]=t,this};function w(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var o=e[t];this.set(o[0],o[1])}}w.prototype.clear=m,w.prototype.delete=f,w.prototype.get=b,w.prototype.has=p,w.prototype.set=v;var g=w;var y=function(){this.__data__=new g,this.size=0};var j=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r};var A=function(e){return this.__data__.get(e)};var _=function(e){return this.__data__.has(e)},O=r(0),S=O.a.Symbol,k=Object.prototype,E=k.hasOwnProperty,$=k.toString,C=S?S.toStringTag:void 0;var I=function(e){var t=E.call(e,C),r=e[C];try{e[C]=void 0;var o=!0}catch(e){}var n=$.call(e);return o&&(t?e[C]=r:delete e[C]),n},P=Object.prototype.toString;var F=function(e){return P.call(e)},x=S?S.toStringTag:void 0;var T=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":x&&x in Object(e)?I(e):F(e)};var B=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)};var M,R=function(e){if(!B(e))return!1;var t=T(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t},D=O.a["__core-js_shared__"],H=(M=/[^.]+$/.exec(D&&D.keys&&D.keys.IE_PROTO||""))?"Symbol(src)_1."+M:"";var z=function(e){return!!H&&H in e},L=Function.prototype.toString;var N=function(e){if(null!=e){try{return L.call(e)}catch(e){}try{return e+""}catch(e){}}return""},V=/^\[object .+?Constructor\]$/,U=Function.prototype,W=Object.prototype,q=U.toString,K=W.hasOwnProperty,G=RegExp("^"+q.call(K).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");var Q=function(e){return!(!B(e)||z(e))&&(R(e)?G:V).test(N(e))};var J=function(e,t){return null==e?void 0:e[t]};var X=function(e,t){var r=J(e,t);return Q(r)?r:void 0},Y=X(O.a,"Map"),Z=X(Object,"create");var ee=function(){this.__data__=Z?Z(null):{},this.size=0};var te=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},re=Object.prototype.hasOwnProperty;var oe=function(e){var t=this.__data__;if(Z){var r=t[e];return"__lodash_hash_undefined__"===r?void 0:r}return re.call(t,e)?t[e]:void 0},ne=Object.prototype.hasOwnProperty;var ie=function(e){var t=this.__data__;return Z?void 0!==t[e]:ne.call(t,e)};var le=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=Z&&void 0===t?"__lodash_hash_undefined__":t,this};function ae(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var o=e[t];this.set(o[0],o[1])}}ae.prototype.clear=ee,ae.prototype.delete=te,ae.prototype.get=oe,ae.prototype.has=ie,ae.prototype.set=le;var ce=ae;var se=function(){this.size=0,this.__data__={hash:new ce,map:new(Y||g),string:new ce}};var me=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e};var ue=function(e,t){var r=e.__data__;return me(t)?r["string"==typeof t?"string":"hash"]:r.map};var de=function(e){var t=ue(this,e).delete(e);return this.size-=t?1:0,t};var he=function(e){return ue(this,e).get(e)};var fe=function(e){return ue(this,e).has(e)};var be=function(e,t){var r=ue(this,e),o=r.size;return r.set(e,t),this.size+=r.size==o?0:1,this};function pe(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var o=e[t];this.set(o[0],o[1])}}pe.prototype.clear=se,pe.prototype.delete=de,pe.prototype.get=he,pe.prototype.has=fe,pe.prototype.set=be;var ve=pe;var we=function(e,t){var r=this.__data__;if(r instanceof g){var o=r.__data__;if(!Y||o.length<199)return o.push([e,t]),this.size=++r.size,this;r=this.__data__=new ve(o)}return r.set(e,t),this.size=r.size,this};function ge(e){var t=this.__data__=new g(e);this.size=t.size}ge.prototype.clear=y,ge.prototype.delete=j,ge.prototype.get=A,ge.prototype.has=_,ge.prototype.set=we;var ye=ge;var je=function(e,t){for(var r=-1,o=null==e?0:e.length;++r<o&&!1!==t(e[r],r,e););return e},Ae=function(){try{var e=X(Object,"defineProperty");return e({},"",{}),e}catch(e){}}();var _e=function(e,t,r){"__proto__"==t&&Ae?Ae(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r},Oe=Object.prototype.hasOwnProperty;var Se=function(e,t,r){var o=e[t];Oe.call(e,t)&&u(o,r)&&(void 0!==r||t in e)||_e(e,t,r)};var ke=function(e,t,r,o){var n=!r;r||(r={});for(var i=-1,l=t.length;++i<l;){var a=t[i],c=o?o(r[a],e[a],a,r,e):void 0;void 0===c&&(c=e[a]),n?_e(r,a,c):Se(r,a,c)}return r};var Ee=function(e,t){for(var r=-1,o=Array(e);++r<e;)o[r]=t(r);return o};var $e=function(e){return null!=e&&"object"==typeof e};var Ce=function(e){return $e(e)&&"[object Arguments]"==T(e)},Ie=Object.prototype,Pe=Ie.hasOwnProperty,Fe=Ie.propertyIsEnumerable,xe=Ce(function(){return arguments}())?Ce:function(e){return $e(e)&&Pe.call(e,"callee")&&!Fe.call(e,"callee")},Te=Array.isArray,Be=r(7),Me=/^(?:0|[1-9]\d*)$/;var Re=function(e,t){var r=typeof e;return!!(t=null==t?9007199254740991:t)&&("number"==r||"symbol"!=r&&Me.test(e))&&e>-1&&e%1==0&&e<t};var De=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991},He={};He["[object Float32Array]"]=He["[object Float64Array]"]=He["[object Int8Array]"]=He["[object Int16Array]"]=He["[object Int32Array]"]=He["[object Uint8Array]"]=He["[object Uint8ClampedArray]"]=He["[object Uint16Array]"]=He["[object Uint32Array]"]=!0,He["[object Arguments]"]=He["[object Array]"]=He["[object ArrayBuffer]"]=He["[object Boolean]"]=He["[object DataView]"]=He["[object Date]"]=He["[object Error]"]=He["[object Function]"]=He["[object Map]"]=He["[object Number]"]=He["[object Object]"]=He["[object RegExp]"]=He["[object Set]"]=He["[object String]"]=He["[object WeakMap]"]=!1;var ze=function(e){return $e(e)&&De(e.length)&&!!He[T(e)]};var Le=function(e){return function(t){return e(t)}},Ne=r(3),Ve=Ne.a&&Ne.a.isTypedArray,Ue=Ve?Le(Ve):ze,We=Object.prototype.hasOwnProperty;var qe=function(e,t){var r=Te(e),o=!r&&xe(e),n=!r&&!o&&Object(Be.a)(e),i=!r&&!o&&!n&&Ue(e),l=r||o||n||i,a=l?Ee(e.length,String):[],c=a.length;for(var s in e)!t&&!We.call(e,s)||l&&("length"==s||n&&("offset"==s||"parent"==s)||i&&("buffer"==s||"byteLength"==s||"byteOffset"==s)||Re(s,c))||a.push(s);return a},Ke=Object.prototype;var Ge=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||Ke)};var Qe=function(e,t){return function(r){return e(t(r))}},Je=Qe(Object.keys,Object),Xe=Object.prototype.hasOwnProperty;var Ye=function(e){if(!Ge(e))return Je(e);var t=[];for(var r in Object(e))Xe.call(e,r)&&"constructor"!=r&&t.push(r);return t};var Ze=function(e){return null!=e&&De(e.length)&&!R(e)};var et=function(e){return Ze(e)?qe(e):Ye(e)};var tt=function(e,t){return e&&ke(t,et(t),e)};var rt=function(e){var t=[];if(null!=e)for(var r in Object(e))t.push(r);return t},ot=Object.prototype.hasOwnProperty;var nt=function(e){if(!B(e))return rt(e);var t=Ge(e),r=[];for(var o in e)("constructor"!=o||!t&&ot.call(e,o))&&r.push(o);return r};var it=function(e){return Ze(e)?qe(e,!0):nt(e)};var lt=function(e,t){return e&&ke(t,it(t),e)},at=r(11);var ct=function(e,t){var r=-1,o=e.length;for(t||(t=Array(o));++r<o;)t[r]=e[r];return t};var st=function(e,t){for(var r=-1,o=null==e?0:e.length,n=0,i=[];++r<o;){var l=e[r];t(l,r,e)&&(i[n++]=l)}return i};var mt=function(){return[]},ut=Object.prototype.propertyIsEnumerable,dt=Object.getOwnPropertySymbols,ht=dt?function(e){return null==e?[]:(e=Object(e),st(dt(e),(function(t){return ut.call(e,t)})))}:mt;var ft=function(e,t){return ke(e,ht(e),t)};var bt=function(e,t){for(var r=-1,o=t.length,n=e.length;++r<o;)e[n+r]=t[r];return e},pt=Qe(Object.getPrototypeOf,Object),vt=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)bt(t,ht(e)),e=pt(e);return t}:mt;var wt=function(e,t){return ke(e,vt(e),t)};var gt=function(e,t,r){var o=t(e);return Te(e)?o:bt(o,r(e))};var yt=function(e){return gt(e,et,ht)};var jt=function(e){return gt(e,it,vt)},At=X(O.a,"DataView"),_t=X(O.a,"Promise"),Ot=X(O.a,"Set"),St=X(O.a,"WeakMap"),kt=N(At),Et=N(Y),$t=N(_t),Ct=N(Ot),It=N(St),Pt=T;(At&&"[object DataView]"!=Pt(new At(new ArrayBuffer(1)))||Y&&"[object Map]"!=Pt(new Y)||_t&&"[object Promise]"!=Pt(_t.resolve())||Ot&&"[object Set]"!=Pt(new Ot)||St&&"[object WeakMap]"!=Pt(new St))&&(Pt=function(e){var t=T(e),r="[object Object]"==t?e.constructor:void 0,o=r?N(r):"";if(o)switch(o){case kt:return"[object DataView]";case Et:return"[object Map]";case $t:return"[object Promise]";case Ct:return"[object Set]";case It:return"[object WeakMap]"}return t});var Ft=Pt,xt=Object.prototype.hasOwnProperty;var Tt=function(e){var t=e.length,r=new e.constructor(t);return t&&"string"==typeof e[0]&&xt.call(e,"index")&&(r.index=e.index,r.input=e.input),r},Bt=O.a.Uint8Array;var Mt=function(e){var t=new e.constructor(e.byteLength);return new Bt(t).set(new Bt(e)),t};var Rt=function(e,t){var r=t?Mt(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.byteLength)},Dt=/\w*$/;var Ht=function(e){var t=new e.constructor(e.source,Dt.exec(e));return t.lastIndex=e.lastIndex,t},zt=S?S.prototype:void 0,Lt=zt?zt.valueOf:void 0;var Nt=function(e){return Lt?Object(Lt.call(e)):{}};var Vt=function(e,t){var r=t?Mt(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.length)};var Ut=function(e,t,r){var o=e.constructor;switch(t){case"[object ArrayBuffer]":return Mt(e);case"[object Boolean]":case"[object Date]":return new o(+e);case"[object DataView]":return Rt(e,r);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return Vt(e,r);case"[object Map]":return new o;case"[object Number]":case"[object String]":return new o(e);case"[object RegExp]":return Ht(e);case"[object Set]":return new o;case"[object Symbol]":return Nt(e)}},Wt=Object.create,qt=function(){function e(){}return function(t){if(!B(t))return{};if(Wt)return Wt(t);e.prototype=t;var r=new e;return e.prototype=void 0,r}}();var Kt=function(e){return"function"!=typeof e.constructor||Ge(e)?{}:qt(pt(e))};var Gt=function(e){return $e(e)&&"[object Map]"==Ft(e)},Qt=Ne.a&&Ne.a.isMap,Jt=Qt?Le(Qt):Gt;var Xt=function(e){return $e(e)&&"[object Set]"==Ft(e)},Yt=Ne.a&&Ne.a.isSet,Zt=Yt?Le(Yt):Xt,er={};er["[object Arguments]"]=er["[object Array]"]=er["[object ArrayBuffer]"]=er["[object DataView]"]=er["[object Boolean]"]=er["[object Date]"]=er["[object Float32Array]"]=er["[object Float64Array]"]=er["[object Int8Array]"]=er["[object Int16Array]"]=er["[object Int32Array]"]=er["[object Map]"]=er["[object Number]"]=er["[object Object]"]=er["[object RegExp]"]=er["[object Set]"]=er["[object String]"]=er["[object Symbol]"]=er["[object Uint8Array]"]=er["[object Uint8ClampedArray]"]=er["[object Uint16Array]"]=er["[object Uint32Array]"]=!0,er["[object Error]"]=er["[object Function]"]=er["[object WeakMap]"]=!1;var tr=function e(t,r,o,n,i,l){var a,c=1&r,s=2&r,m=4&r;if(o&&(a=i?o(t,n,i,l):o(t)),void 0!==a)return a;if(!B(t))return t;var u=Te(t);if(u){if(a=Tt(t),!c)return ct(t,a)}else{var d=Ft(t),h="[object Function]"==d||"[object GeneratorFunction]"==d;if(Object(Be.a)(t))return Object(at.a)(t,c);if("[object Object]"==d||"[object Arguments]"==d||h&&!i){if(a=s||h?{}:Kt(t),!c)return s?wt(t,lt(a,t)):ft(t,tt(a,t))}else{if(!er[d])return i?t:{};a=Ut(t,d,c)}}l||(l=new ye);var f=l.get(t);if(f)return f;l.set(t,a),Zt(t)?t.forEach((function(n){a.add(e(n,r,o,n,t,l))})):Jt(t)&&t.forEach((function(n,i){a.set(i,e(n,r,o,i,t,l))}));var b=u?void 0:(m?s?jt:yt:s?it:et)(t);return je(b||t,(function(n,i){b&&(n=t[i=n]),Se(a,i,e(n,r,o,i,t,l))})),a};var rr=function(e){return tr(e,5)};function or(e,t,r){if(t.attributes)for(const[o,n]of Object.entries(t.attributes))e.setAttribute(o,n,r);t.styles&&e.setStyle(t.styles,r),t.classes&&e.addClass(t.classes,r)}function nr(e,t){const r=rr(e);for(const o in t)Array.isArray(t[o])?r[o]=Array.from(new Set([...e[o],...t[o]])):r[o]={...e[o],...t[o]};return r}function ir({view:e},t){return r=>{r.on("element:"+e,(e,r,o)=>{t._consumeDisallowedAttributes(r.viewItem,o)},{priority:"high"})}}function lr({model:e}){return(t,r)=>r.writer.createElement(e,{htmlContent:t.getCustomProperty("$rawContent")})}function ar(e,{view:t,isInline:r}){const o=e.t;return(e,{writer:n,consumable:i})=>{const l=o("HTML object"),a=n.createContainerElement(r?"span":"div",{class:"html-object-embed","data-html-object-embed-label":l},{isAllowedInsideAttributeElement:r}),c=cr(t,e,n);n.addClass("html-object-embed__content",c);const m=e.getAttribute("htmlAttributes");return m&&i.consume(e,"attribute:htmlAttributes:"+e.name)&&or(n,m,c),n.insert(n.createPositionAt(a,0),c),Object(s.toWidget)(a,n,{widgetLabel:l})}}function cr(e,t,r){return r.createRawElement(e,null,(function(e){e.innerHTML=t.getAttribute("htmlContent")}))}function sr({priority:e,view:t}){return(r,o)=>{if(!r)return;const{writer:n}=o,i=n.createAttributeElement(t,null,{priority:e});return or(n,r,i),i}}function mr({view:e},t){return r=>{r.on("element:"+e,(e,r,o)=>{if(!r.modelRange)return;const n=t._consumeAllowedAttributes(r.viewItem,o);n&&o.writer.setAttribute("htmlAttributes",n,r.modelRange)},{priority:"low"})}}function ur({model:e}){return t=>{t.on("attribute:htmlAttributes:"+e,(e,t,r)=>{const o=t.attributeNewValue;if(!r.consumable.consume(t.item,e.name))return;or(r.writer,o,r.mapper.toViewElement(t.item))})}}var dr=function(e){return e};var hr=function(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)},fr=Math.max;var br=function(e,t,r){return t=fr(void 0===t?e.length-1:t,0),function(){for(var o=arguments,n=-1,i=fr(o.length-t,0),l=Array(i);++n<i;)l[n]=o[t+n];n=-1;for(var a=Array(t+1);++n<t;)a[n]=o[n];return a[t]=r(l),hr(e,this,a)}};var pr=function(e){return function(){return e}},vr=Ae?function(e,t){return Ae(e,"toString",{configurable:!0,enumerable:!1,value:pr(t),writable:!0})}:dr,wr=Date.now;var gr=function(e){var t=0,r=0;return function(){var o=wr(),n=16-(o-r);if(r=o,n>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(vr);var yr=function(e,t){return gr(br(e,t,dr),e+"")};var jr=function(e,t){for(var r=-1,o=null==e?0:e.length,n=Array(o);++r<o;)n[r]=t(e[r],r,e);return n};var Ar=function(e,t,r,o){for(var n=e.length,i=r+(o?1:-1);o?i--:++i<n;)if(t(e[i],i,e))return i;return-1};var _r=function(e){return e!=e};var Or=function(e,t,r){for(var o=r-1,n=e.length;++o<n;)if(e[o]===t)return o;return-1};var Sr=function(e,t,r){return t==t?Or(e,t,r):Ar(e,_r,r)};var kr=function(e,t,r,o){for(var n=r-1,i=e.length;++n<i;)if(o(e[n],t))return n;return-1},Er=Array.prototype.splice;var $r=function(e,t,r,o){var n=o?kr:Sr,i=-1,l=t.length,a=e;for(e===t&&(t=ct(t)),r&&(a=jr(e,Le(r)));++i<l;)for(var c=0,s=t[i],m=r?r(s):s;(c=n(a,m,c,o))>-1;)a!==e&&Er.call(a,c,1),Er.call(e,c,1);return e};var Cr=yr((function(e,t){return e&&e.length&&t&&t.length?$r(e,t):e})),Ir=Function.prototype,Pr=Object.prototype,Fr=Ir.toString,xr=Pr.hasOwnProperty,Tr=Fr.call(Object);var Br=function(e){if(!$e(e)||"[object Object]"!=T(e))return!1;var t=pt(e);if(null===t)return!0;var r=xr.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&Fr.call(r)==Tr};r(14);class Mr extends o.Plugin{constructor(e){super(e),this._dataSchema=e.plugins.get("DataSchema"),this._allowedAttributes=new c.Matcher,this._disallowedAttributes=new c.Matcher,this._allowedElements=new Set,this._dataInitialized=!1,this._registerElementsAfterInit(),this._registerElementHandlers()}static get pluginName(){return"DataFilter"}static get requires(){return[a,s.Widget]}loadAllowedConfig(e){this._loadConfig(e,e=>this.allowAttributes(e))}loadDisallowedConfig(e){this._loadConfig(e,e=>this.disallowAttributes(e))}allowElement(e){for(const t of this._dataSchema.getDefinitionsForView(e,!0))this._allowedElements.has(t)||(this._allowedElements.add(t),this._dataInitialized&&this._fireRegisterEvent(t))}allowAttributes(e){this._allowedAttributes.add(e)}disallowAttributes(e){this._disallowedAttributes.add(e)}_loadConfig(e,t){for(const r of e){const e=r.name||/[\s\S]+/;this.allowElement(e),Lr(r).forEach(t)}}_consumeAllowedAttributes(e,t){return Rr(e,t,this._allowedAttributes)}_consumeDisallowedAttributes(e,t){return Rr(e,t,this._disallowedAttributes)}_registerElementsAfterInit(){this.editor.data.on("init",()=>{this._dataInitialized=!0;for(const e of this._allowedElements)this._fireRegisterEvent(e)},{priority:n.priorities.get("high")+1})}_registerElementHandlers(){this.on("register",(e,t)=>{const r=this.editor.model.schema;if(t.isObject&&!r.isRegistered(t.model))this._registerObjectElement(t);else if(t.isBlock)this._registerBlockElement(t);else{if(!t.isInline)throw new n.CKEditorError("data-filter-invalid-definition",null,t);this._registerInlineElement(t)}e.stop()},{priority:"lowest"})}_fireRegisterEvent(e){this.fire(e.view?"register:"+e.view:"register",e)}_registerObjectElement(e){const t=this.editor,r=t.model.schema,o=t.conversion,{view:i,model:l}=e;r.register(l,e.modelSchema),i&&(r.extend(e.model,{allowAttributes:["htmlAttributes","htmlContent"]}),t.data.registerRawContentMatcher({name:i}),o.for("upcast").add(ir(e,this)),o.for("upcast").elementToElement({view:i,model:lr(e),converterPriority:n.priorities.get("low")+1}),o.for("upcast").add(mr(e,this)),o.for("editingDowncast").elementToElement({model:l,view:ar(t,e)}),o.for("dataDowncast").elementToElement({model:l,view:(e,{writer:t})=>cr(i,e,t)}),o.for("dataDowncast").add(ur(e)))}_registerBlockElement(e){const t=this.editor,r=t.model.schema,o=t.conversion,{view:i,model:l}=e;if(!r.isRegistered(e.model)){if(r.register(e.model,e.modelSchema),!i)return;o.for("upcast").elementToElement({model:l,view:i,converterPriority:n.priorities.get("low")+1}),o.for("downcast").elementToElement({model:l,view:i})}i&&(r.extend(e.model,{allowAttributes:"htmlAttributes"}),o.for("upcast").add(ir(e,this)),o.for("upcast").add(mr(e,this)),o.for("downcast").add(ur(e)))}_registerInlineElement(e){const t=this.editor,r=t.model.schema,o=t.conversion,n=e.model;r.extend("$text",{allowAttributes:n}),e.attributeProperties&&r.setAttributeProperties(n,e.attributeProperties),o.for("upcast").add(ir(e,this)),o.for("upcast").add(function({view:e,model:t},r){return o=>{o.on("element:"+e,(e,o,n)=>{const i=r._consumeAllowedAttributes(o.viewItem,n);o.modelRange||(o=Object.assign(o,n.convertChildren(o.viewItem,o.modelCursor)));for(const e of o.modelRange.getItems())if(n.schema.checkAttribute(e,t)){const r=nr(i||{},e.getAttribute(t)||{});n.writer.setAttribute(t,r,e)}},{priority:"low"})}}(e,this)),o.for("downcast").attributeToElement({model:n,view:sr(e)})}}function Rr(e,t,r){const o=function(e,{consumable:t},r){const o=r.matchAll(e)||[],n=[];for(const r of o)Dr(t,e,r),delete r.match.name,t.consume(e,r.match)&&n.push(r);return n}(e,t,r),{attributes:n,styles:i,classes:l}=function(e){const t={attributes:new Set,classes:new Set,styles:new Set};for(const r of e)for(const e in t){(r.match[e]||[]).forEach(r=>t[e].add(r))}return t}(o),a={};return n.size&&(a.attributes=Hr(n,t=>e.getAttribute(t))),i.size&&(a.styles=Hr(i,t=>e.getStyle(t))),l.size&&(a.classes=Array.from(l)),Object.keys(a).length?a:null}function Dr(e,t,r){for(const o of["attributes","classes","styles"]){const n=r.match[o];if(n)for(const r of n)e.test(t,{[o]:[r]})||Cr(n,r)}}function Hr(e,t){const r={};for(const o of e){void 0!==t(o)&&(r[o]=t(o))}return r}function zr(e,t){const{name:r}=e;return Br(e[t])?Object.entries(e[t]).map(([e,o])=>({name:r,[t]:{[e]:o}})):Array.isArray(e[t])?e[t].map(e=>({name:r,[t]:[e]})):[e]}function Lr(e){const{name:t,attributes:r,classes:o,styles:n}=e,i=[];return r&&i.push(...zr({name:t,attributes:r},"attributes")),o&&i.push(...zr({name:t,classes:o},"classes")),n&&i.push(...zr({name:t,styles:n},"styles")),i}class Nr extends o.Plugin{static get requires(){return[Mr]}init(){const e=this.editor;if(!e.plugins.has("MediaEmbed")||e.config.get("mediaEmbed.previewsInData"))return;const t=e.model.schema,r=e.conversion,o=this.editor.plugins.get(Mr),n=this.editor.plugins.get(a),i=e.config.get("mediaEmbed.elementName");n.registerBlockElement({model:"media",view:i}),o.on("register:"+i,(e,n)=>{"media"===n.model&&(t.extend("media",{allowAttributes:["htmlAttributes","htmlFigureAttributes"]}),r.for("upcast").add(ir(n,o)),r.for("upcast").add(function(e,t){return e=>{e.on("element:figure",r,{priority:"high"}),e.on("element:"+t,o)};function r(r,o,n){const i=o.viewItem;if(!n.consumable.test(i,{name:!0,classes:"media"}))return;const l=Array.from(i.getChildren()).find(e=>e.is("element",t));function a(t,r){const i=e._consumeAllowedAttributes(t,n);i&&n.writer.setAttribute(r,i,o.modelRange)}l&&(Object.assign(o,n.convertItem(l,o.modelCursor)),a(l,"htmlAttributes"),a(i,"htmlFigureAttributes"),n.consumable.consume(i,{name:!0}))}function o(t,r,o){const n=r.viewItem,i=e._consumeAllowedAttributes(n,o);i&&o.writer.setAttribute("htmlAttributes",i,r.modelRange)}}(o,i)),r.for("dataDowncast").add(function(e){return t=>{function r(e,r){t.on(`attribute:${r}:media`,(t,r,o)=>{if(!o.consumable.consume(r.item,t.name))return;const n=o.mapper.toViewElement(r.item),i=function(e,t,r){const o=e.writer.createRangeOn(t);for(const{item:e}of o.getWalker())if(e.is("element",r))return e}(o,n,e);or(o.writer,r.attributeNewValue,i)})}r(e,"htmlAttributes"),r("figure","htmlFigureAttributes")}}(i)),e.stop())})}}class Vr extends o.Plugin{static get requires(){return[Mr]}init(){const e=this.editor;if(!e.plugins.has("TableEditing"))return;const t=e.model.schema,r=e.conversion,o=e.plugins.get(Mr);o.on("register:table",(e,n)=>{"table"===n.model&&(t.extend("table",{allowAttributes:["htmlAttributes","htmlFigureAttributes","htmlTheadAttributes","htmlTbodyAttributes"]}),r.for("upcast").add(ir(n,o)),r.for("upcast").add(function(e){return t=>{t.on("element:table",(t,r,o)=>{const n=r.viewItem;l(n,"htmlAttributes");const i=n.parent;i.is("element","figure")&&l(i,"htmlFigureAttributes");for(const e of n.getChildren())e.is("element","thead")&&l(e,"htmlTheadAttributes"),e.is("element","tbody")&&l(e,"htmlTbodyAttributes");function l(t,n){const i=e._consumeAllowedAttributes(t,o);i&&o.writer.setAttribute(n,i,r.modelRange)}},{priority:"low"})}}(o)),r.for("downcast").add(e=>{function t(t,r){e.on(`attribute:${r}:table`,(e,r,o)=>{if(!o.consumable.consume(r.item,e.name))return;const n=o.mapper.toViewElement(r.item),i=function(e,t,r){const o=e.writer.createRangeOn(t);for(const{item:e}of o.getWalker())if(e.is("element",r))return e}(o,n,t);or(o.writer,r.attributeNewValue,i)})}t("table","htmlAttributes"),t("figure","htmlFigureAttributes"),t("thead","htmlTheadAttributes"),t("tbody","htmlTbodyAttributes")}),e.stop())}),o.on("register:figure",()=>{r.for("upcast").add(e=>{e.on("element:figure",(e,t,r)=>{for(const e of t.viewItem.getChildren())if(e.is("element","table"))return void r.consumable.consume(t.viewItem,{name:!0})})})})}}class Ur extends o.Plugin{static get requires(){return[Mr]}init(){if(!this.editor.plugins.has("CodeBlockEditing"))return;const e=this.editor.plugins.get(Mr);e.on("register:pre",(t,r)=>{if("codeBlock"!==r.model)return;const o=this.editor,n=o.model.schema,i=o.conversion;n.extend("codeBlock",{allowAttributes:["htmlAttributes","htmlContentAttributes"]}),i.for("upcast").add(ir(r,e)),i.for("upcast").add(function(e){return t=>{t.on("element:code",(t,r,o)=>{const n=r.viewItem,i=n.parent;function l(t,n){const i=e._consumeAllowedAttributes(t,o);i&&o.writer.setAttribute(n,i,r.modelRange)}i&&i.is("element","pre")&&(l(i,"htmlAttributes"),l(n,"htmlContentAttributes"))},{priority:"low"})}}(e)),i.for("downcast").add(e=>{e.on("attribute:htmlAttributes:codeBlock",(e,t,r)=>{if(!r.consumable.consume(t.item,e.name))return;const o=r.mapper.toViewElement(t.item).parent;or(r.writer,t.attributeNewValue,o)}),e.on("attribute:htmlContentAttributes:codeBlock",(e,t,r)=>{if(!r.consumable.consume(t.item,e.name))return;const o=r.mapper.toViewElement(t.item);or(r.writer,t.attributeNewValue,o)})}),t.stop()})}}class Wr extends o.Plugin{static get requires(){return[Mr]}init(){this.editor.plugins.get(Mr).on("register",(e,t)=>{const r=this.editor,o=r.model.schema,i=r.conversion;if(!t.paragraphLikeModel)return;if(o.isRegistered(t.model)||o.isRegistered(t.paragraphLikeModel))return;const l={model:t.paragraphLikeModel,view:t.view};o.register(t.model,t.modelSchema),o.register(l.model,{inheritAllFrom:"$block"}),i.for("upcast").elementToElement({view:t.view,model:(e,{writer:r})=>this._hasBlockContent(e)?r.createElement(t.model):r.createElement(l.model),converterPriority:n.priorities.get("low")+1}),i.for("downcast").elementToElement({view:t.view,model:t.model}),this._addAttributeConversion(t),i.for("downcast").elementToElement({view:l.view,model:l.model}),this._addAttributeConversion(l),e.stop()})}_hasBlockContent(e){const t=this.editor.editing.view.domConverter.blockElements;return Array.from(e.getChildren()).some(e=>t.includes(e.name))}_addAttributeConversion(e){const t=this.editor,r=t.conversion,o=t.plugins.get(Mr);t.model.schema.extend(e.model,{allowAttributes:"htmlAttributes"}),r.for("upcast").add(ir(e,o)),r.for("upcast").add(mr(e,o)),r.for("downcast").add(ur(e))}}class qr extends o.Plugin{static get pluginName(){return"GeneralHtmlSupport"}static get requires(){return[Mr,Vr,Ur,Wr,Nr]}init(){const e=this.editor,t=e.plugins.get(Mr);t.loadAllowedConfig(e.config.get("htmlSupport.allow")||[]),t.loadDisallowedConfig(e.config.get("htmlSupport.disallow")||[])}}class Kr extends o.Plugin{static get pluginName(){return"HtmlComment"}init(){const e=this.editor;e.model.schema.addAttributeCheck((e,t)=>{if(e.endsWith("$root")&&t.startsWith("$comment"))return!0}),e.conversion.for("upcast").elementToMarker({view:"$comment",model:(e,{writer:t})=>{const r=this.editor.model.document.getRoot(),o=e.getCustomProperty("$rawContent"),i="$comment:"+Object(n.uid)();return t.setAttribute(i,o,r),i}}),e.conversion.for("dataDowncast").markerToElement({model:"$comment",view:(e,{writer:t})=>{const r=this.editor.model.document.getRoot(),o=e.markerName,n=r.getAttribute(o),i=t.createUIElement("$comment");return t.setCustomProperty("$rawContent",n,i),i}}),e.model.document.registerPostFixer(t=>{const r=e.model.document.getRoot(),o=e.model.document.differ.getChangedMarkers().filter(e=>e.name.startsWith("$comment")).filter(e=>{const t=e.data.newRange;return t&&"$graveyard"===t.root.rootName});if(0===o.length)return!1;for(const e of o)t.removeMarker(e.name),t.removeAttribute(e.name,r);return!0}),e.data.on("set",()=>{for(const t of e.model.markers.getMarkersGroup("$comment"))this.removeHtmlComment(t.name)},{priority:"high"}),e.model.on("deleteContent",(t,[r])=>{for(const t of r.getRanges()){const r=e.model.schema.getLimitElement(t),o=e.model.createPositionAt(r,0),n=e.model.createPositionAt(r,"end");let i;i=o.isTouching(t.start)&&n.isTouching(t.end)?this.getHtmlCommentsInRange(e.model.createRange(o,n)):this.getHtmlCommentsInRange(t,{skipBoundaries:!0});for(const e of i)this.removeHtmlComment(e)}},{priority:"high"})}createHtmlComment(e,t){const r=Object(n.uid)(),o=this.editor.model,i=o.document.getRoot(),l="$comment:"+r;return o.change(r=>{const o=r.createRange(e);return r.addMarker(l,{usingOperation:!0,affectsData:!0,range:o}),r.setAttribute(l,t,i),l})}removeHtmlComment(e){const t=this.editor,r=t.model.document.getRoot(),o=t.model.markers.get(e);return!!o&&(t.model.change(t=>{t.removeMarker(o),t.removeAttribute(e,r)}),!0)}getHtmlCommentData(e){const t=this.editor,r=t.model.markers.get(e),o=t.model.document.getRoot();return r?{content:o.getAttribute(e),position:r.getStart()}:null}getHtmlCommentsInRange(e,{skipBoundaries:t=!1}={}){const r=!t;return Array.from(this.editor.model.markers.getMarkersGroup("$comment")).filter(t=>function(e,t){const o=e.getRange().start;return(o.isAfter(t.start)||r&&o.isEqual(t.start))&&(o.isBefore(t.end)||r&&o.isEqual(t.end))}(t,e)).map(e=>e.name)}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/image.js b/core/assets/vendor/ckeditor5/build/image.js
new file mode 100644
index 0000000000..57c76dd0d7
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/image.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Break text":"Break text","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Enter image caption":"Enter image caption","Full size image":"Full size image","Image resize list":"Image resize list","Image toolbar":"Image toolbar","image widget":"image widget","In line":"In line",Insert:"Insert","Insert image":"Insert image","Insert image via URL":"Insert image via URL","Left aligned image":"Left aligned image",Original:"Original","Resize image":"Resize image","Resize image to %0":"Resize image to %0","Resize image to the original size":"Resize image to the original size","Right aligned image":"Right aligned image","Side image":"Side image","Text alternative":"Text alternative",Update:"Update","Update image URL":"Update image URL","Upload failed":"Upload failed","Wrap text":"Wrap text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.image=function(e){var t={};function i(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(n,o,function(t){return e[t]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=33)}([function(e,t,i){e.exports=i(7)("./src/core.js")},function(e,t,i){e.exports=i(7)("./src/ui.js")},function(e,t,i){e.exports=i(7)("./src/utils.js")},function(e,t,i){e.exports=i(7)("./src/widget.js")},function(e,t,i){e.exports=i(7)("./src/engine.js")},function(e,t,i){"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},a=function(){var e={};return function(t){if(void 0===e[t]){var i=document.querySelector(t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}e[t]=i}return e[t]}}(),s=[];function r(e){for(var t=-1,i=0;i<s.length;i++)if(s[i].identifier===e){t=i;break}return t}function l(e,t){for(var i={},n=[],o=0;o<e.length;o++){var a=e[o],l=t.base?a[0]+t.base:a[0],c=i[l]||0,g="".concat(l," ").concat(c);i[l]=c+1;var d=r(g),m={css:a[1],media:a[2],sourceMap:a[3]};-1!==d?(s[d].references++,s[d].updater(m)):s.push({identifier:g,updater:f(m,t),references:1}),n.push(g)}return n}function c(e){var t=document.createElement("style"),n=e.attributes||{};if(void 0===n.nonce){var o=i.nc;o&&(n.nonce=o)}if(Object.keys(n).forEach((function(e){t.setAttribute(e,n[e])})),"function"==typeof e.insert)e.insert(t);else{var s=a(e.insert||"head");if(!s)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");s.appendChild(t)}return t}var g,d=(g=[],function(e,t){return g[e]=t,g.filter(Boolean).join("\n")});function m(e,t,i,n){var o=i?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(e.styleSheet)e.styleSheet.cssText=d(t,o);else{var a=document.createTextNode(o),s=e.childNodes;s[t]&&e.removeChild(s[t]),s.length?e.insertBefore(a,s[t]):e.appendChild(a)}}function u(e,t,i){var n=i.css,o=i.media,a=i.sourceMap;if(o?e.setAttribute("media",o):e.removeAttribute("media"),a&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}var p=null,h=0;function f(e,t){var i,n,o;if(t.singleton){var a=h++;i=p||(p=c(t)),n=m.bind(null,i,a,!1),o=m.bind(null,i,a,!0)}else i=c(t),n=u.bind(null,i,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(i)};return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=o());var i=l(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var n=0;n<i.length;n++){var o=r(i[n]);s[o].references--}for(var a=l(e,t),c=0;c<i.length;c++){var g=r(i[c]);0===s[g].references&&(s[g].updater(),s.splice(g,1))}i=a}}}},function(e,t,i){e.exports=i(7)("./src/upload.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,i){e.exports=i(7)("./src/clipboard.js")},function(e,t,i){var n=i(5),o=i(16);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t,i){e.exports=i(7)("./src/undo.js")},,function(e,t,i){var n=i(5),o=i(13);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-text-alternative-form{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-text-alternative-form .ck-labeled-field-view{display:inline-block}.ck.ck-text-alternative-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-text-alternative-form{flex-wrap:wrap}.ck.ck-text-alternative-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-text-alternative-form .ck-button{flex-basis:50%}}"},function(e,t,i){var n=i(5),o=i(15);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports='.ck-vertical-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}}.ck-vertical-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form{padding:var(--ck-spacing-large)}.ck.ck-responsive-form:focus{outline:none}[dir=ltr] .ck.ck-responsive-form>:not(:first-child),[dir=rtl] .ck.ck-responsive-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-responsive-form{padding:0;width:calc(var(--ck-input-text-width)*0.8)}.ck.ck-responsive-form .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) 0}.ck.ck-responsive-form .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-responsive-form .ck-labeled-field-view .ck-labeled-field-view__error{white-space:normal}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){padding:var(--ck-spacing-standard);margin-top:var(--ck-spacing-large);border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-responsive-form>.ck-button:last-child,[dir=ltr] .ck.ck-responsive-form>.ck-button:nth-last-child(2),[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2){margin-left:0}.ck.ck-responsive-form>.ck-button:nth-last-child(2):after,[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child:last-of-type,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2):last-of-type{border-right:1px solid var(--ck-color-base-border)}}'},function(e,t){e.exports=".ck-content .image{display:table;clear:both;text-align:center;margin:.9em auto;min-width:50px}.ck-content .image img{display:block;margin:0 auto;max-width:100%;min-width:100%}.ck-content .image-inline{display:inline-flex;max-width:100%;align-items:flex-start}.ck-content .image-inline picture{display:flex}.ck-content .image-inline img,.ck-content .image-inline picture{flex-grow:1;flex-shrink:1;max-width:100%}.ck.ck-editor__editable .image>figcaption.ck-placeholder:before{padding-left:inherit;padding-right:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ck.ck-editor__editable .image-inline.ck-widget_selected,.ck.ck-editor__editable .image.ck-widget_selected{z-index:1}.ck.ck-editor__editable .image-inline.ck-widget_selected ::selection{display:none}.ck.ck-editor__editable td .image-inline img,.ck.ck-editor__editable th .image-inline img{max-width:none}"},function(e,t,i){var n=i(5),o=i(18);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=":root{--ck-color-image-caption-background:#f7f7f7;--ck-color-image-caption-text:#333;--ck-color-image-caption-highligted-background:#fd0}.ck-content .image>figcaption{display:table-caption;caption-side:bottom;word-break:break-word;color:var(--ck-color-image-caption-text);background-color:var(--ck-color-image-caption-background);padding:.6em;font-size:.75em;outline-offset:-1px}.ck.ck-editor__editable .image>figcaption.image__caption_highlighted{animation:ck-image-caption-highlight .6s ease-out}@keyframes ck-image-caption-highlight{0%{background-color:var(--ck-color-image-caption-highligted-background)}to{background-color:var(--ck-color-image-caption-background)}}"},function(e,t,i){var n=i(5),o=i(20);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-editor__editable .image,.ck.ck-editor__editable .image-inline{position:relative}.ck.ck-editor__editable .image-inline .ck-progress-bar,.ck.ck-editor__editable .image .ck-progress-bar{position:absolute;top:0;left:0}.ck.ck-editor__editable .image-inline.ck-appear,.ck.ck-editor__editable .image.ck-appear{animation:fadeIn .7s}.ck.ck-editor__editable .image-inline .ck-progress-bar,.ck.ck-editor__editable .image .ck-progress-bar{height:2px;width:0;background:var(--ck-color-upload-bar-background);transition:width .1s}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}"},function(e,t,i){var n=i(5),o=i(22);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports='.ck-image-upload-complete-icon{display:block;position:absolute;top:min(var(--ck-spacing-medium),6%);right:min(var(--ck-spacing-medium),6%);border-radius:50%;z-index:1}.ck-image-upload-complete-icon:after{content:"";position:absolute}:root{--ck-color-image-upload-icon:#fff;--ck-color-image-upload-icon-background:#008a00;--ck-image-upload-icon-size:20;--ck-image-upload-icon-width:2px;--ck-image-upload-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck-image-upload-complete-icon{opacity:0;background:var(--ck-color-image-upload-icon-background);animation-name:ck-upload-complete-icon-show,ck-upload-complete-icon-hide;animation-fill-mode:forwards,forwards;animation-duration:.5s,.5s;font-size:calc(1px*var(--ck-image-upload-icon-size));animation-delay:0ms,3s;overflow:hidden;width:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size));height:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size))}.ck-image-upload-complete-icon:after{left:25%;top:50%;opacity:0;height:0;width:0;transform:scaleX(-1) rotate(135deg);transform-origin:left top;border-top:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);border-right:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);animation-name:ck-upload-complete-icon-check;animation-duration:.5s;animation-delay:.5s;animation-fill-mode:forwards;box-sizing:border-box}@keyframes ck-upload-complete-icon-show{0%{opacity:0}to{opacity:1}}@keyframes ck-upload-complete-icon-hide{0%{opacity:1}to{opacity:0}}@keyframes ck-upload-complete-icon-check{0%{opacity:1;width:0;height:0}33%{width:.3em;height:0}to{opacity:1;width:.3em;height:.45em}}'},function(e,t,i){var n=i(5),o=i(24);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports='.ck .ck-upload-placeholder-loader{position:absolute;display:flex;align-items:center;justify-content:center;top:0;left:0}.ck .ck-upload-placeholder-loader:before{content:"";position:relative}:root{--ck-color-upload-placeholder-loader:#b3b3b3;--ck-upload-placeholder-loader-size:32px}.ck .ck-image-upload-placeholder{width:100%;margin:0}.ck .ck-upload-placeholder-loader{width:100%;height:100%}.ck .ck-upload-placeholder-loader:before{width:var(--ck-upload-placeholder-loader-size);height:var(--ck-upload-placeholder-loader-size);border-radius:50%;border-top:3px solid var(--ck-color-upload-placeholder-loader);border-right:2px solid transparent;animation:ck-upload-placeholder-loader 1s linear infinite}@keyframes ck-upload-placeholder-loader{to{transform:rotate(1turn)}}'},function(e,t,i){var n=i(5),o=i(26);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-image-insert-form:focus{outline:none}.ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-image-insert-form__action-row{margin-top:var(--ck-spacing-standard)}.ck.ck-form__row.ck-image-insert-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-image-insert-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row.ck-image-insert-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}"},function(e,t,i){var n=i(5),o=i(28);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-image-insert__panel{padding:var(--ck-spacing-large)}.ck.ck-image-insert__ck-finder-button{display:block;width:100%;margin:var(--ck-spacing-standard) auto;border:1px solid #ccc;border-radius:var(--ck-border-radius)}.ck.ck-splitbutton>.ck-file-dialog-button.ck-button{padding:0;margin:0;border:none}"},function(e,t,i){var n=i(5),o=i(30);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck-content .image.image_resized{max-width:100%;display:block;box-sizing:border-box}.ck-content .image.image_resized img{width:100%}.ck-content .image.image_resized>figcaption{display:block}.ck.ck-editor__editable td .image-inline.image_resized img,.ck.ck-editor__editable th .image-inline.image_resized img{max-width:100%}[dir=ltr] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-left:var(--ck-spacing-standard)}.ck.ck-dropdown .ck-button.ck-resize-image-button .ck-button__label{width:4em}"},function(e,t,i){var n=i(5),o=i(32);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=":root{--ck-image-style-spacing:1.5em;--ck-inline-image-style-spacing:calc(var(--ck-image-style-spacing)/2)}.ck-content .image-style-block-align-left,.ck-content .image-style-block-align-right{max-width:calc(100% - var(--ck-image-style-spacing))}.ck-content .image-style-align-left,.ck-content .image-style-align-right{clear:none}.ck-content .image-style-side{float:right;margin-left:var(--ck-image-style-spacing);max-width:50%}.ck-content .image-style-align-left{float:left;margin-right:var(--ck-image-style-spacing)}.ck-content .image-style-align-center{margin-left:auto;margin-right:auto}.ck-content .image-style-align-right{float:right;margin-left:var(--ck-image-style-spacing)}.ck-content .image-style-block-align-right{margin-right:0;margin-left:auto}.ck-content .image-style-block-align-left{margin-left:0;margin-right:auto}.ck-content p+.image-style-align-left,.ck-content p+.image-style-align-right,.ck-content p+.image-style-side{margin-top:0}.ck-content .image-inline.image-style-align-left,.ck-content .image-inline.image-style-align-right{margin-top:var(--ck-inline-image-style-spacing);margin-bottom:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-left{margin-right:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-right{margin-left:var(--ck-inline-image-style-spacing)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-background)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after{display:none}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-hover-background)}"},function(e,t,i){"use strict";i.r(t),i.d(t,"AutoImage",(function(){return h})),i.d(t,"Image",(function(){return R})),i.d(t,"ImageEditing",(function(){return T})),i.d(t,"ImageCaption",(function(){return F})),i.d(t,"ImageCaptionEditing",(function(){return j})),i.d(t,"ImageInsert",(function(){return se})),i.d(t,"ImageInsertUI",(function(){return ae})),i.d(t,"ImageResize",(function(){return pe})),i.d(t,"ImageResizeButtons",(function(){return ge})),i.d(t,"ImageResizeEditing",(function(){return le})),i.d(t,"ImageResizeHandles",(function(){return ue})),i.d(t,"ImageStyle",(function(){return Pe})),i.d(t,"ImageStyleEditing",(function(){return Be})),i.d(t,"ImageStyleUI",(function(){return ze})),i.d(t,"ImageTextAlternative",(function(){return _})),i.d(t,"ImageTextAlternativeEditing",(function(){return b})),i.d(t,"ImageTextAlternativeUI",(function(){return v})),i.d(t,"ImageToolbar",(function(){return je})),i.d(t,"ImageUpload",(function(){return te})),i.d(t,"ImageUploadEditing",(function(){return Z})),i.d(t,"ImageUploadProgress",(function(){return H})),i.d(t,"ImageUploadUI",(function(){return $}));var n=i(0),o=i(8),a=i(4),s=i(10),r=i(2),l=i(3);function c(e,t){const i=e.createEmptyElement("img"),n="imageBlock"===t?e.createContainerElement("figure",{class:"image"}):e.createContainerElement("span",{class:"image-inline"},{isAllowedInsideAttributeElement:!0});return e.insert(e.createPositionAt(n,0),i),n}function g(e,t){if(e.plugins.has("ImageInlineEditing")!==e.plugins.has("ImageBlockEditing"))return{name:"img",attributes:{src:!0}};const i=e.plugins.get("ImageUtils");return e=>{if(!i.isInlineImageView(e)||!e.hasAttribute("src"))return null;return(e.findAncestor(i.isBlockImageView)?"imageBlock":"imageInline")!==t?null:{name:!0,attributes:["src"]}}}function d(e,t){const i=Object(r.first)(t.getSelectedBlocks());return!i||e.isObject(i)||i.isEmpty&&"listItem"!=i.name?"imageBlock":"imageInline"}class m extends n.Plugin{static get pluginName(){return"ImageUtils"}isImage(e){return this.isInlineImage(e)||this.isBlockImage(e)}isInlineImageView(e){return!!e&&e.is("element","img")}isBlockImageView(e){return!!e&&e.is("element","figure")&&e.hasClass("image")}insertImage(e={},t=null,i=null){const n=this.editor,o=n.model,a=o.document.selection;i=u(n,t||a,i),e={...Object.fromEntries(a.getAttributes()),...e};for(const t in e)o.schema.checkAttribute(i,t)||delete e[t];return o.change(n=>{const s=n.createElement(i,e);return t||"imageInline"==i||(t=Object(l.findOptimalInsertionRange)(a,o)),o.insertContent(s,t),s.parent?(n.setSelection(s,"on"),s):null})}getClosestSelectedImageWidget(e){const t=e.getSelectedElement();if(t&&this.isImageWidget(t))return t;let i=e.getFirstPosition().parent;for(;i;){if(i.is("element")&&this.isImageWidget(i))return i;i=i.parent}return null}getClosestSelectedImageElement(e){const t=e.getSelectedElement();return this.isImage(t)?t:e.getFirstPosition().findAncestor("imageBlock")}isImageAllowed(){const e=this.editor.model.document.selection;return function(e,t){if("imageBlock"==u(e,t)){const i=function(e,t){const i=Object(l.findOptimalInsertionRange)(e,t).start.parent;if(i.isEmpty&&!i.is("element","$root"))return i.parent;return i}(t,e.model);if(e.model.schema.checkChild(i,"imageBlock"))return!0}else if(e.model.schema.checkChild(t.focus,"imageInline"))return!0;return!1}(this.editor,e)&&function(e){return[...e.focus.getAncestors()].every(e=>!e.is("element","imageBlock"))}(e)}toImageWidget(e,t,i){t.setCustomProperty("image",!0,e);return Object(l.toWidget)(e,t,{label:()=>{const t=this.findViewImgElement(e).getAttribute("alt");return t?`${t} ${i}`:i}})}isImageWidget(e){return!!e.getCustomProperty("image")&&Object(l.isWidget)(e)}isBlockImage(e){return!!e&&e.is("element","imageBlock")}isInlineImage(e){return!!e&&e.is("element","imageInline")}findViewImgElement(e){if(this.isInlineImageView(e))return e;const t=this.editor.editing.view;for(const{item:i}of t.createRangeIn(e))if(this.isInlineImageView(i))return i}}function u(e,t,i){const n=e.model.schema,o=e.config.get("image.insert.type");return e.plugins.has("ImageBlockEditing")?e.plugins.has("ImageInlineEditing")?i||("inline"===o?"imageInline":"block"===o?"imageBlock":t.is("selection")?d(n,t):n.checkChild(t,"imageInline")?"imageInline":"imageBlock"):"imageBlock":"imageInline"}const p=new RegExp(String(/^(http(s)?:\/\/)?[\w-]+\.[\w.~:/[\]@!$&'()*+,;=%-]+/.source+/\.(jpg|jpeg|png|gif|ico|webp|JPG|JPEG|PNG|GIF|ICO|WEBP)/.source+/(\?[\w.~:/[\]@!$&'()*+,;=%-]*)?/.source+/(#[\w.~:/[\]@!$&'()*+,;=%-]*)?$/.source));class h extends n.Plugin{static get requires(){return[o.Clipboard,m,s.Undo]}static get pluginName(){return"AutoImage"}constructor(e){super(e),this._timeoutId=null,this._positionToInsert=null}init(){const e=this.editor,t=e.model.document;this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",()=>{const e=t.selection.getFirstRange(),i=a.LivePosition.fromPosition(e.start);i.stickiness="toPrevious";const n=a.LivePosition.fromPosition(e.end);n.stickiness="toNext",t.once("change:data",()=>{this._embedImageBetweenPositions(i,n),i.detach(),n.detach()},{priority:"high"})}),e.commands.get("undo").on("execute",()=>{this._timeoutId&&(r.global.window.clearTimeout(this._timeoutId),this._positionToInsert.detach(),this._timeoutId=null,this._positionToInsert=null)},{priority:"high"})}_embedImageBetweenPositions(e,t){const i=this.editor,n=new a.LiveRange(e,t),o=n.getWalker({ignoreElementEnd:!0}),s=Object.fromEntries(i.model.document.selection.getAttributes()),l=this.editor.plugins.get("ImageUtils");let c="";for(const e of o)e.item.is("$textProxy")&&(c+=e.item.data);c=c.trim(),c.match(p)?(this._positionToInsert=a.LivePosition.fromPosition(e),this._timeoutId=r.global.window.setTimeout(()=>{i.commands.get("insertImage").isEnabled?i.model.change(e=>{let t;this._timeoutId=null,e.remove(n),n.detach(),"$graveyard"!==this._positionToInsert.root.rootName&&(t=this._positionToInsert.toPosition()),l.insertImage({...s,src:c},t),this._positionToInsert.detach(),this._positionToInsert=null}):n.detach()},100)):n.detach()}}class f extends n.Command{refresh(){const e=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!e,this.isEnabled&&e.hasAttribute("alt")?this.value=e.getAttribute("alt"):this.value=!1}execute(e){const t=this.editor,i=t.plugins.get("ImageUtils"),n=t.model,o=i.getClosestSelectedImageElement(n.document.selection);n.change(t=>{t.setAttribute("alt",e.newValue,o)})}}class b extends n.Plugin{static get requires(){return[m]}static get pluginName(){return"ImageTextAlternativeEditing"}init(){this.editor.commands.add("imageTextAlternative",new f(this.editor))}}var k=i(1);i(12),i(14);class w extends k.View{constructor(e){super(e);const t=this.locale.t;this.focusTracker=new r.FocusTracker,this.keystrokes=new r.KeystrokeHandler,this.labeledInput=this._createLabeledInputView(),this.saveButtonView=this._createButton(t("Save"),n.icons.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(t("Cancel"),n.icons.cancel,"ck-button-cancel","cancel"),this._focusables=new k.ViewCollection,this._focusCycler=new k.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"form",attributes:{class:["ck","ck-text-alternative-form","ck-responsive-form"],tabindex:"-1"},children:[this.labeledInput,this.saveButtonView,this.cancelButtonView]}),Object(k.injectCssTransitionDisabler)(this)}render(){super.render(),this.keystrokes.listenTo(this.element),Object(k.submitHandler)({view:this}),[this.labeledInput,this.saveButtonView,this.cancelButtonView].forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)})}_createButton(e,t,i,n){const o=new k.ButtonView(this.locale);return o.set({label:e,icon:t,tooltip:!0}),o.extendTemplate({attributes:{class:i}}),n&&o.delegate("execute").to(this,n),o}_createLabeledInputView(){const e=this.locale.t,t=new k.LabeledFieldView(this.locale,k.createLabeledInputText);return t.label=e("Text alternative"),t}}function I(e){const t=e.editing.view,i=k.BalloonPanelView.defaultPositions,n=e.plugins.get("ImageUtils");return{target:t.domConverter.viewToDom(n.getClosestSelectedImageWidget(t.document.selection)),positions:[i.northArrowSouth,i.northArrowSouthWest,i.northArrowSouthEast,i.southArrowNorth,i.southArrowNorthWest,i.southArrowNorthEast]}}class v extends n.Plugin{static get requires(){return[k.ContextualBalloon]}static get pluginName(){return"ImageTextAlternativeUI"}init(){this._createButton(),this._createForm()}destroy(){super.destroy(),this._form.destroy()}_createButton(){const e=this.editor,t=e.t;e.ui.componentFactory.add("imageTextAlternative",i=>{const o=e.commands.get("imageTextAlternative"),a=new k.ButtonView(i);return a.set({label:t("Change image text alternative"),icon:n.icons.lowVision,tooltip:!0}),a.bind("isEnabled").to(o,"isEnabled"),this.listenTo(a,"execute",()=>{this._showForm()}),a})}_createForm(){const e=this.editor,t=e.editing.view.document,i=e.plugins.get("ImageUtils");this._balloon=this.editor.plugins.get("ContextualBalloon"),this._form=new w(e.locale),this._form.render(),this.listenTo(this._form,"submit",()=>{e.execute("imageTextAlternative",{newValue:this._form.labeledInput.fieldView.element.value}),this._hideForm(!0)}),this.listenTo(this._form,"cancel",()=>{this._hideForm(!0)}),this._form.keystrokes.set("Esc",(e,t)=>{this._hideForm(!0),t()}),this.listenTo(e.ui,"update",()=>{i.getClosestSelectedImageWidget(t.selection)?this._isVisible&&function(e){const t=e.plugins.get("ContextualBalloon");if(e.plugins.get("ImageUtils").getClosestSelectedImageWidget(e.editing.view.document.selection)){const i=I(e);t.updatePosition(i)}}(e):this._hideForm(!0)}),Object(k.clickOutsideHandler)({emitter:this._form,activator:()=>this._isVisible,contextElements:[this._balloon.view.element],callback:()=>this._hideForm()})}_showForm(){if(this._isVisible)return;const e=this.editor,t=e.commands.get("imageTextAlternative"),i=this._form.labeledInput;this._form.disableCssTransitions(),this._isInBalloon||this._balloon.add({view:this._form,position:I(e)}),i.fieldView.value=i.fieldView.element.value=t.value||"",this._form.labeledInput.fieldView.select(),this._form.enableCssTransitions()}_hideForm(e){this._isInBalloon&&(this._form.focusTracker.isFocused&&this._form.saveButtonView.focus(),this._balloon.remove(this._form),e&&this.editor.editing.view.focus())}get _isVisible(){return this._balloon.visibleView===this._form}get _isInBalloon(){return this._balloon.hasView(this._form)}}class _ extends n.Plugin{static get requires(){return[b,v]}static get pluginName(){return"ImageTextAlternative"}}function y(e,t){return e=>{e.on("attribute:srcset:"+t,i)};function i(t,i,n){if(!n.consumable.consume(i.item,t.name))return;const o=n.writer,a=n.mapper.toViewElement(i.item),s=e.findViewImgElement(a);if(null===i.attributeNewValue){const e=i.attributeOldValue;e.data&&(o.removeAttribute("srcset",s),o.removeAttribute("sizes",s),e.width&&o.removeAttribute("width",s))}else{const e=i.attributeNewValue;e.data&&(o.setAttribute("srcset",e.data,s),o.setAttribute("sizes","100vw",s),e.width&&o.setAttribute("width",e.width,s))}}}function x(e,t,i){return e=>{e.on(`attribute:${i}:${t}`,n)};function n(t,i,n){if(!n.consumable.consume(i.item,t.name))return;const o=n.writer,a=n.mapper.toViewElement(i.item),s=e.findViewImgElement(a);o.setAttribute(i.attributeKey,i.attributeNewValue||"",s)}}class E extends a.Observer{observe(e){this.listenTo(e,"load",(e,t)=>{const i=t.target;this.checkShouldIgnoreEventFromTarget(i)||"IMG"==i.tagName&&this._fireEvents(t)},{useCapture:!0})}_fireEvents(e){this.isEnabled&&(this.document.fire("layoutChanged"),this.document.fire("imageLoaded",e))}}class C extends n.Command{constructor(e){super(e);const t=e.config.get("image.insert.type");e.plugins.has("ImageBlockEditing")||"block"===t&&Object(r.logWarning)("image-block-plugin-required"),e.plugins.has("ImageInlineEditing")||"inline"===t&&Object(r.logWarning)("image-inline-plugin-required")}refresh(){this.isEnabled=this.editor.plugins.get("ImageUtils").isImageAllowed()}execute(e){const t=Object(r.toArray)(e.source),i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageUtils"),o=Object.fromEntries(i.getAttributes());t.forEach((e,t)=>{const a=i.getSelectedElement();if("string"==typeof e&&(e={src:e}),t&&a&&n.isImage(a)){const t=this.editor.model.createPositionAfter(a);n.insertImage({...e,...o},t)}else n.insertImage({...e,...o})})}}class T extends n.Plugin{static get requires(){return[m]}static get pluginName(){return"ImageEditing"}init(){const e=this.editor,t=e.conversion;e.editing.view.addObserver(E),t.for("upcast").attributeToAttribute({view:{name:"img",key:"alt"},model:"alt"}).attributeToAttribute({view:{name:"img",key:"srcset"},model:{key:"srcset",value:e=>{const t={data:e.getAttribute("srcset")};return e.hasAttribute("width")&&(t.width=e.getAttribute("width")),t}}});const i=new C(e);e.commands.add("insertImage",i),e.commands.add("imageInsert",i)}}class S extends n.Command{constructor(e,t){super(e),this._modelElementName=t}refresh(){const e=this.editor.plugins.get("ImageUtils"),t=e.getClosestSelectedImageElement(this.editor.model.document.selection);"imageBlock"===this._modelElementName?this.isEnabled=e.isInlineImage(t):this.isEnabled=e.isBlockImage(t)}execute(){const e=this.editor,t=this.editor.model,i=e.plugins.get("ImageUtils"),n=i.getClosestSelectedImageElement(t.document.selection),o=Object.fromEntries(n.getAttributes());return o.src||o.uploadId?t.change(e=>{const a=Array.from(t.markers).filter(e=>e.getRange().containsItem(n)),s=i.insertImage(o,t.createSelection(n,"on"),this._modelElementName);if(!s)return null;const r=e.createRangeOn(s);for(const t of a){const i=t.getRange(),n="$graveyard"!=i.root.rootName?i.getJoined(r,!0):r;e.updateMarker(t,{range:n})}return{oldElement:n,newElement:s}}):null}}class B extends n.Plugin{static get requires(){return[T,m,o.ClipboardPipeline]}static get pluginName(){return"ImageBlockEditing"}init(){const e=this.editor;e.model.schema.register("imageBlock",{isObject:!0,isBlock:!0,allowWhere:"$block",allowAttributes:["alt","src","srcset"]}),this._setupConversion(),e.plugins.has("ImageInlineEditing")&&(e.commands.add("imageTypeBlock",new S(this.editor,"imageBlock")),this._setupClipboardIntegration())}_setupConversion(){const e=this.editor,t=e.t,i=e.conversion,n=e.plugins.get("ImageUtils");i.for("dataDowncast").elementToElement({model:"imageBlock",view:(e,{writer:t})=>c(t,"imageBlock")}),i.for("editingDowncast").elementToElement({model:"imageBlock",view:(e,{writer:i})=>n.toImageWidget(c(i,"imageBlock"),i,t("image widget"))}),i.for("downcast").add(x(n,"imageBlock","src")).add(x(n,"imageBlock","alt")).add(y(n,"imageBlock")),i.for("upcast").elementToElement({view:g(e,"imageBlock"),model:(e,{writer:t})=>t.createElement("imageBlock",{src:e.getAttribute("src")})}).add(function(e){return e=>{e.on("element:figure",t)};function t(t,i,n){if(!n.consumable.test(i.viewItem,{name:!0,classes:"image"}))return;const o=e.findViewImgElement(i.viewItem);if(!o||!o.hasAttribute("src")||!n.consumable.test(o,{name:!0}))return;const a=n.convertItem(o,i.modelCursor),s=Object(r.first)(a.modelRange.getItems());s&&(n.convertChildren(i.viewItem,s),n.updateConversionResult(s,i))}}(n))}_setupClipboardIntegration(){const e=this.editor,t=e.model,i=e.editing.view,n=e.plugins.get("ImageUtils");this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",(o,s)=>{const r=Array.from(s.content.getChildren());let l;if(!r.every(n.isInlineImageView))return;l=s.targetRanges?e.editing.mapper.toModelRange(s.targetRanges[0]):t.document.selection.getFirstRange();const c=t.createSelection(l);if("imageBlock"===d(t.schema,c)){const e=new a.UpcastWriter(i.document),t=r.map(t=>e.createElement("figure",{class:"image"},t));s.content=e.createDocumentFragment(t)}})}}i(9);class A extends n.Plugin{static get requires(){return[B,l.Widget,_]}static get pluginName(){return"ImageBlock"}}class V extends n.Plugin{static get requires(){return[T,m,o.ClipboardPipeline]}static get pluginName(){return"ImageInlineEditing"}init(){const e=this.editor,t=e.model.schema;t.register("imageInline",{isObject:!0,isInline:!0,allowWhere:"$text",allowAttributes:["alt","src","srcset"]}),t.addChildCheck((e,t)=>{if(e.endsWith("caption")&&"imageInline"===t.name)return!1}),this._setupConversion(),e.plugins.has("ImageBlockEditing")&&(e.commands.add("imageTypeInline",new S(this.editor,"imageInline")),this._setupClipboardIntegration())}_setupConversion(){const e=this.editor,t=e.t,i=e.conversion,n=e.plugins.get("ImageUtils");i.for("dataDowncast").elementToElement({model:"imageInline",view:(e,{writer:t})=>t.createEmptyElement("img")}),i.for("editingDowncast").elementToElement({model:"imageInline",view:(e,{writer:i})=>n.toImageWidget(c(i,"imageInline"),i,t("image widget"))}),i.for("downcast").add(x(n,"imageInline","src")).add(x(n,"imageInline","alt")).add(y(n,"imageInline")),i.for("upcast").elementToElement({view:g(e,"imageInline"),model:(e,{writer:t})=>t.createElement("imageInline",{src:e.getAttribute("src")})})}_setupClipboardIntegration(){const e=this.editor,t=e.model,i=e.editing.view,n=e.plugins.get("ImageUtils");this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",(o,s)=>{const r=Array.from(s.content.getChildren());let l;if(!r.every(n.isBlockImageView))return;l=s.targetRanges?e.editing.mapper.toModelRange(s.targetRanges[0]):t.document.selection.getFirstRange();const c=t.createSelection(l);if("imageInline"===d(t.schema,c)){const e=new a.UpcastWriter(i.document),t=r.map(t=>1===t.childCount?(Array.from(t.getAttributes()).forEach(i=>e.setAttribute(...i,n.findViewImgElement(t))),t.getChild(0)):t);s.content=e.createDocumentFragment(t)}})}}class z extends n.Plugin{static get requires(){return[V,l.Widget,_]}static get pluginName(){return"ImageInline"}}class R extends n.Plugin{static get requires(){return[A,z]}static get pluginName(){return"Image"}}function U(e){for(const t of e.getChildren())if(t&&t.is("element","caption"))return t;return null}function O(e,t){const i=t.getFirstPosition().findAncestor("caption");return i&&e.isBlockImage(i.parent)?i:null}class P extends n.Command{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils");if(!e.plugins.has(B))return this.isEnabled=!1,void(this.value=!1);const i=e.model.document.selection,n=i.getSelectedElement();if(!n){const e=O(t,i);return this.isEnabled=!!e,void(this.value=!!e)}this.isEnabled=this.editor.plugins.get("ImageUtils").isImage(n),this.isEnabled?this.value=!!U(n):this.value=!1}execute(e={}){const{focusCaptionOnShow:t}=e;this.editor.model.change(e=>{this.value?this._hideImageCaption(e):this._showImageCaption(e,t)})}_showImageCaption(e,t){const i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageCaptionEditing");let o=i.getSelectedElement();const a=n._getSavedCaption(o);this.editor.plugins.get("ImageUtils").isInlineImage(o)&&(this.editor.execute("imageTypeBlock"),o=i.getSelectedElement());const s=a||e.createElement("caption");e.append(s,o),t&&e.setSelection(s,"in")}_hideImageCaption(e){const t=this.editor,i=t.model.document.selection,n=t.plugins.get("ImageCaptionEditing"),o=t.plugins.get("ImageUtils");let a,s=i.getSelectedElement();s?a=U(s):(a=O(o,i),s=a.parent),n._saveCaption(s,a),e.setSelection(s,"on"),e.remove(a)}}class j extends n.Plugin{static get requires(){return[m]}static get pluginName(){return"ImageCaptionEditing"}constructor(e){super(e),this._savedCaptionsMap=new WeakMap}init(){const e=this.editor,t=e.model.schema;t.isRegistered("caption")?t.extend("caption",{allowIn:"imageBlock"}):t.register("caption",{allowIn:"imageBlock",allowContentOf:"$block",isLimit:!0}),e.commands.add("toggleImageCaption",new P(this.editor)),this._setupConversion(),this._setupImageTypeCommandsIntegration()}_setupConversion(){const e=this.editor,t=e.editing.view,i=e.plugins.get("ImageUtils"),n=e.t;e.conversion.for("upcast").elementToElement({view:e=>function(e,t){return"figcaption"==t.name&&e.isBlockImageView(t.parent)?{name:!0}:null}(i,e),model:"caption"}),e.conversion.for("dataDowncast").elementToElement({model:"caption",view:(e,{writer:t})=>i.isBlockImage(e.parent)?t.createContainerElement("figcaption"):null}),e.conversion.for("editingDowncast").elementToElement({model:"caption",view:(e,{writer:o})=>{if(!i.isBlockImage(e.parent))return null;const s=o.createEditableElement("figcaption");o.setCustomProperty("imageCaption",!0,s),Object(a.enablePlaceholder)({view:t,element:s,text:n("Enter image caption"),keepOnFocus:!0});const c=Object(l.toWidgetEditable)(s,o);return Object(l.setHighlightHandling)(c,o,(e,t,i)=>i.addClass(Object(r.toArray)(t.classes),e),(e,t,i)=>i.removeClass(Object(r.toArray)(t.classes),e)),c}}),e.editing.mapper.on("modelToViewPosition",N(t)),e.data.mapper.on("modelToViewPosition",N(t))}_setupImageTypeCommandsIntegration(){const e=this.editor,t=e.plugins.get("ImageUtils"),i=e.commands.get("imageTypeInline"),n=e.commands.get("imageTypeBlock"),o=e=>{if(!e.return)return;const{oldElement:i,newElement:n}=e.return;if(!i)return;if(t.isBlockImage(i)){const e=U(i);if(e)return void this._saveCaption(n,e)}const o=this._getSavedCaption(i);o&&this._saveCaption(n,o)};i&&this.listenTo(i,"execute",o,{priority:"low"}),n&&this.listenTo(n,"execute",o,{priority:"low"})}_getSavedCaption(e){const t=this._savedCaptionsMap.get(e);return t?a.Element.fromJSON(t):null}_saveCaption(e,t){this._savedCaptionsMap.set(e,t.toJSON())}}function N(e){return(t,i)=>{const n=i.modelPosition,o=n.parent;if(!o.is("element","imageBlock"))return;const a=i.mapper.toViewElement(o);i.viewPosition=e.createPositionAt(a,n.offset+1)}}class L extends n.Plugin{static get requires(){return[m]}static get pluginName(){return"ImageCaptionUI"}init(){const e=this.editor,t=e.editing.view,i=e.plugins.get("ImageUtils"),o=e.t;e.ui.componentFactory.add("toggleImageCaption",a=>{const s=e.commands.get("toggleImageCaption"),r=new k.ButtonView(a);return r.set({icon:n.icons.caption,tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(s,"value","isEnabled"),r.bind("label").to(s,"value",e=>o(e?"Toggle caption off":"Toggle caption on")),this.listenTo(r,"execute",()=>{e.execute("toggleImageCaption",{focusCaptionOnShow:!0});const n=O(i,e.model.document.selection);if(n){const i=e.editing.mapper.toViewElement(n);t.scrollToTheSelection(),t.change(e=>{e.addClass("image__caption_highlighted",i)})}}),r})}}i(17);class F extends n.Plugin{static get requires(){return[j,L]}static get pluginName(){return"ImageCaption"}}var D=i(6);function M(e){const t=e.map(e=>e.replace("+","\\+"));return new RegExp(`^image\\/(${t.join("|")})$`)}function W(e){return new Promise((t,i)=>{const n=e.getAttribute("src");fetch(n).then(e=>e.blob()).then(e=>{const i=q(e,n),o=i.replace("image/",""),a=new File([e],"image."+o,{type:i});t(a)}).catch(e=>e&&"TypeError"===e.name?function(e){return function(e){return new Promise((t,i)=>{const n=r.global.document.createElement("img");n.addEventListener("load",()=>{const e=r.global.document.createElement("canvas");e.width=n.width,e.height=n.height;e.getContext("2d").drawImage(n,0,0),e.toBlob(e=>e?t(e):i())}),n.addEventListener("error",()=>i()),n.src=e})}(e).then(t=>{const i=q(t,e),n=i.replace("image/","");return new File([t],"image."+n,{type:i})})}(n).then(t).catch(i):i(e))})}function q(e,t){return e.type?e.type:t.match(/data:(image\/\w+);base64/)?t.match(/data:(image\/\w+);base64/)[1].toLowerCase():"image/jpeg"}class $ extends n.Plugin{static get pluginName(){return"ImageUploadUI"}init(){const e=this.editor,t=e.t,i=i=>{const o=new D.FileDialogButtonView(i),a=e.commands.get("uploadImage"),s=e.config.get("image.upload.types"),r=M(s);return o.set({acceptedType:s.map(e=>"image/"+e).join(","),allowMultipleFiles:!0}),o.buttonView.set({label:t("Insert image"),icon:n.icons.image,tooltip:!0}),o.buttonView.bind("isEnabled").to(a),o.on("done",(t,i)=>{const n=Array.from(i).filter(e=>r.test(e.type));n.length&&e.execute("uploadImage",{file:n})}),o};e.ui.componentFactory.add("uploadImage",i),e.ui.componentFactory.add("imageUpload",i)}}i(19),i(21),i(23);class H extends n.Plugin{static get pluginName(){return"ImageUploadProgress"}constructor(e){super(e),this.placeholder="data:image/svg+xml;utf8,"+encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 250"><rect rx="4"/></svg>')}init(){const e=this.editor;e.plugins.has("ImageBlockEditing")&&e.editing.downcastDispatcher.on("attribute:uploadStatus:imageBlock",(...e)=>this.uploadStatusChange(...e)),e.plugins.has("ImageInlineEditing")&&e.editing.downcastDispatcher.on("attribute:uploadStatus:imageInline",(...e)=>this.uploadStatusChange(...e))}uploadStatusChange(e,t,i){const n=this.editor,o=t.item,a=o.getAttribute("uploadId");if(!i.consumable.consume(t.item,e.name))return;const s=n.plugins.get("ImageUtils"),r=n.plugins.get(D.FileRepository),l=a?t.attributeNewValue:null,c=this.placeholder,g=n.editing.mapper.toViewElement(o),d=i.writer;if("reading"==l)return K(g,d),void G(s,c,g,d);if("uploading"==l){const e=r.loaders.get(a);return K(g,d),void(e?(J(g,d),function(e,t,i,n){const o=function(e){const t=e.createUIElement("div",{class:"ck-progress-bar"});return e.setCustomProperty("progressBar",!0,t),t}(t);t.insert(t.createPositionAt(e,"end"),o),i.on("change:uploadedPercent",(e,t,i)=>{n.change(e=>{e.setStyle("width",i+"%",o)})})}(g,d,e,n.editing.view),function(e,t,i,n){if(n.data){const o=e.findViewImgElement(t);i.setAttribute("src",n.data,o)}}(s,g,d,e)):G(s,c,g,d))}"complete"==l&&r.loaders.get(a)&&function(e,t,i){const n=t.createUIElement("div",{class:"ck-image-upload-complete-icon"});t.insert(t.createPositionAt(e,"end"),n),setTimeout(()=>{i.change(e=>e.remove(e.createRangeOn(n)))},3e3)}(g,d,n.editing.view),function(e,t){Q(e,t,"progressBar")}(g,d),J(g,d),function(e,t){t.removeClass("ck-appear",e)}(g,d)}}function K(e,t){e.hasClass("ck-appear")||t.addClass("ck-appear",e)}function G(e,t,i,n){i.hasClass("ck-image-upload-placeholder")||n.addClass("ck-image-upload-placeholder",i);const o=e.findViewImgElement(i);o.getAttribute("src")!==t&&n.setAttribute("src",t,o),X(i,"placeholder")||n.insert(n.createPositionAfter(o),function(e){const t=e.createUIElement("div",{class:"ck-upload-placeholder-loader"});return e.setCustomProperty("placeholder",!0,t),t}(n))}function J(e,t){e.hasClass("ck-image-upload-placeholder")&&t.removeClass("ck-image-upload-placeholder",e),Q(e,t,"placeholder")}function X(e,t){for(const i of e.getChildren())if(i.getCustomProperty(t))return i}function Q(e,t,i){const n=X(e,i);n&&t.remove(t.createRangeOn(n))}class Y extends n.Command{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils"),i=e.model.document.selection.getSelectedElement();this.isEnabled=t.isImageAllowed()||t.isImage(i)}execute(e){const t=Object(r.toArray)(e.file),i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageUtils"),o=Object.fromEntries(i.getAttributes());t.forEach((e,t)=>{const a=i.getSelectedElement();if(t&&a&&n.isImage(a)){const t=this.editor.model.createPositionAfter(a);this._uploadImage(e,o,t)}else this._uploadImage(e,o)})}_uploadImage(e,t,i){const n=this.editor,o=n.plugins.get(D.FileRepository).createLoader(e),a=n.plugins.get("ImageUtils");o&&a.insertImage({...t,uploadId:o.id},i)}}class Z extends n.Plugin{static get requires(){return[D.FileRepository,k.Notification,o.ClipboardPipeline,m]}static get pluginName(){return"ImageUploadEditing"}constructor(e){super(e),e.config.define("image",{upload:{types:["jpeg","png","gif","bmp","webp","tiff"]}}),this._uploadImageElements=new Map}init(){const e=this.editor,t=e.model.document,i=e.conversion,n=e.plugins.get(D.FileRepository),o=e.plugins.get("ImageUtils"),s=M(e.config.get("image.upload.types")),r=new Y(e);e.commands.add("uploadImage",r),e.commands.add("imageUpload",r),i.for("upcast").attributeToAttribute({view:{name:"img",key:"uploadId"},model:"uploadId"}),this.listenTo(e.editing.view.document,"clipboardInput",(t,i)=>{if(n=i.dataTransfer,Array.from(n.types).includes("text/html")&&""!==n.getData("text/html"))return;var n;const o=Array.from(i.dataTransfer.files).filter(e=>!!e&&s.test(e.type));o.length&&(t.stop(),e.model.change(t=>{i.targetRanges&&t.setSelection(i.targetRanges.map(t=>e.editing.mapper.toModelRange(t))),e.model.enqueueChange("default",()=>{e.execute("uploadImage",{file:o})})}))}),this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",(t,i)=>{const s=Array.from(e.editing.view.createRangeIn(i.content)).filter(e=>function(e,t){return!(!e.isInlineImageView(t)||!t.getAttribute("src"))&&(t.getAttribute("src").match(/^data:image\/\w+;base64,/g)||t.getAttribute("src").match(/^blob:/g))}(o,e.item)&&!e.item.getAttribute("uploadProcessed")).map(e=>({promise:W(e.item),imageElement:e.item}));if(!s.length)return;const r=new a.UpcastWriter(e.editing.view.document);for(const e of s){r.setAttribute("uploadProcessed",!0,e.imageElement);const t=n.createLoader(e.promise);t&&(r.setAttribute("src","",e.imageElement),r.setAttribute("uploadId",t.id,e.imageElement))}}),e.editing.view.document.on("dragover",(e,t)=>{t.preventDefault()}),t.on("change",()=>{const i=t.differ.getChanges({includeChangesInGraveyard:!0}).reverse(),o=new Set;for(const t of i)if("insert"==t.type&&"$text"!=t.name){const i=t.position.nodeAfter,a="$graveyard"==t.position.root.rootName;for(const t of ee(e,i)){const e=t.getAttribute("uploadId");if(!e)continue;const i=n.loaders.get(e);i&&(a?o.has(e)||i.abort():(o.add(e),this._uploadImageElements.set(e,t),"idle"==i.status&&this._readAndUpload(i)))}}}),this.on("uploadComplete",(e,{imageElement:t,data:i})=>{const n=i.urls?i.urls:i;this.editor.model.change(e=>{e.setAttribute("src",n.default,t),this._parseAndSetSrcsetAttributeOnImage(n,t,e)})},{priority:"low"})}afterInit(){const e=this.editor.model.schema;this.editor.plugins.has("ImageBlockEditing")&&e.extend("imageBlock",{allowAttributes:["uploadId","uploadStatus"]}),this.editor.plugins.has("ImageInlineEditing")&&e.extend("imageInline",{allowAttributes:["uploadId","uploadStatus"]})}_readAndUpload(e){const t=this.editor,i=t.model,n=t.locale.t,o=t.plugins.get(D.FileRepository),a=t.plugins.get(k.Notification),s=t.plugins.get("ImageUtils"),l=this._uploadImageElements;return i.enqueueChange("transparent",t=>{t.setAttribute("uploadStatus","reading",l.get(e.id))}),e.read().then(()=>{const n=e.upload(),o=l.get(e.id);if(r.env.isSafari){const e=t.editing.mapper.toViewElement(o),i=s.findViewImgElement(e);t.editing.view.once("render",()=>{if(!i.parent)return;const e=t.editing.view.domConverter.mapViewToDom(i.parent);if(!e)return;const n=e.style.display;e.style.display="none",e._ckHack=e.offsetHeight,e.style.display=n})}return i.enqueueChange("transparent",e=>{e.setAttribute("uploadStatus","uploading",o)}),n}).then(t=>{i.enqueueChange("transparent",i=>{const n=l.get(e.id);i.setAttribute("uploadStatus","complete",n),this.fire("uploadComplete",{data:t,imageElement:n})}),c()}).catch(t=>{if("error"!==e.status&&"aborted"!==e.status)throw t;"error"==e.status&&t&&a.showWarning(t,{title:n("Upload failed"),namespace:"upload"}),i.enqueueChange("transparent",t=>{t.remove(l.get(e.id))}),c()});function c(){i.enqueueChange("transparent",t=>{const i=l.get(e.id);t.removeAttribute("uploadId",i),t.removeAttribute("uploadStatus",i),l.delete(e.id)}),o.destroyLoader(e)}}_parseAndSetSrcsetAttributeOnImage(e,t,i){let n=0;const o=Object.keys(e).filter(e=>{const t=parseInt(e,10);if(!isNaN(t))return n=Math.max(n,t),!0}).map(t=>`${e[t]} ${t}w`).join(", ");""!=o&&i.setAttribute("srcset",{data:o,width:n},t)}}function ee(e,t){const i=e.plugins.get("ImageUtils");return Array.from(e.model.createRangeOn(t)).filter(e=>i.isImage(e.item)).map(e=>e.item)}class te extends n.Plugin{static get pluginName(){return"ImageUpload"}static get requires(){return[Z,$,H]}}i(25);class ie extends k.View{constructor(e,t={}){super(e);const i=this.bindTemplate;this.set("class",t.class||null),this.children=this.createCollection(),t.children&&t.children.forEach(e=>this.children.add(e)),this.set("_role",null),this.set("_ariaLabelledBy",null),t.labelView&&this.set({_role:"group",_ariaLabelledBy:t.labelView.id}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__row",i.to("class")],role:i.to("_role"),"aria-labelledby":i.to("_ariaLabelledBy")},children:this.children})}}i(27);class ne extends k.View{constructor(e,t){super(e);const{insertButtonView:i,cancelButtonView:n}=this._createActionButtons(e);if(this.insertButtonView=i,this.cancelButtonView=n,this.dropdownView=this._createDropdownView(e),this.set("imageURLInputValue",""),this.focusTracker=new r.FocusTracker,this.keystrokes=new r.KeystrokeHandler,this._focusables=new k.ViewCollection,this._focusCycler=new k.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.set("_integrations",new r.Collection),t)for(const[e,i]of Object.entries(t))"insertImageViaUrl"===e&&(i.fieldView.bind("value").to(this,"imageURLInputValue",e=>e||""),i.fieldView.on("input",()=>{this.imageURLInputValue=i.fieldView.element.value.trim()})),i.name=e,this._integrations.add(i);this.setTemplate({tag:"form",attributes:{class:["ck","ck-image-insert-form"],tabindex:"-1"},children:[...this._integrations,new ie(e,{children:[this.insertButtonView,this.cancelButtonView],class:"ck-image-insert-form__action-row"})]})}render(){super.render(),Object(k.submitHandler)({view:this});const e=[...this._integrations,this.insertButtonView,this.cancelButtonView];e.forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)}),this.keystrokes.listenTo(this.element);const t=e=>e.stopPropagation();this.keystrokes.set("arrowright",t),this.keystrokes.set("arrowleft",t),this.keystrokes.set("arrowup",t),this.keystrokes.set("arrowdown",t),this.listenTo(e[0].element,"selectstart",(e,t)=>{t.stopPropagation()},{priority:"high"})}getIntegration(e){return this._integrations.find(t=>t.name===e)}_createDropdownView(e){const t=e.t,i=Object(k.createDropdown)(e,k.SplitButtonView),o=i.buttonView,a=i.panelView;return o.set({label:t("Insert image"),icon:n.icons.image,tooltip:!0}),a.extendTemplate({attributes:{class:"ck-image-insert__panel"}}),i}_createActionButtons(e){const t=e.t,i=new k.ButtonView(e),o=new k.ButtonView(e);return i.set({label:t("Insert"),icon:n.icons.check,class:"ck-button-save",type:"submit",withText:!0,isEnabled:this.imageURLInputValue}),o.set({label:t("Cancel"),icon:n.icons.cancel,class:"ck-button-cancel",withText:!0}),i.bind("isEnabled").to(this,"imageURLInputValue",e=>!!e),i.delegate("execute").to(this,"submit"),o.delegate("execute").to(this,"cancel"),{insertButtonView:i,cancelButtonView:o}}focus(){this._focusCycler.focusFirst()}}function oe(e){const t=e.t,i=new k.LabeledFieldView(e,k.createLabeledInputText);return i.set({label:t("Insert image via URL")}),i.fieldView.placeholder="https://example.com/image.png",i}class ae extends n.Plugin{static get pluginName(){return"ImageInsertUI"}init(){const e=this.editor,t=e=>this._createDropdownView(e);e.ui.componentFactory.add("insertImage",t),e.ui.componentFactory.add("imageInsert",t)}_createDropdownView(e){const t=this.editor,i=new ne(e,function(e){const t=e.config.get("image.insert.integrations"),i=e.plugins.get("ImageInsertUI"),n={insertImageViaUrl:oe(e.locale)};if(!t)return n;if(t.find(e=>"openCKFinder"===e)&&e.ui.componentFactory.has("ckfinder")){const t=e.ui.componentFactory.create("ckfinder");t.set({withText:!0,class:"ck-image-insert__ck-finder-button"}),t.delegate("execute").to(i,"cancel"),n.openCKFinder=t}return t.reduce((t,i)=>(n[i]?t[i]=n[i]:e.ui.componentFactory.has(i)&&(t[i]=e.ui.componentFactory.create(i)),t),{})}(t)),n=t.commands.get("uploadImage"),o=i.dropdownView,a=o.buttonView;return a.actionView=t.ui.componentFactory.create("uploadImage"),a.actionView.extendTemplate({attributes:{class:"ck ck-button ck-splitbutton__action"}}),this._setUpDropdown(o,i,n)}_setUpDropdown(e,t,i){const n=this.editor,o=n.t,a=t.insertButtonView,s=t.getIntegration("insertImageViaUrl"),r=e.panelView,l=this.editor.plugins.get("ImageUtils");function c(){n.editing.view.focus(),e.isOpen=!1}return e.bind("isEnabled").to(i),e.buttonView.once("open",()=>{r.children.add(t)}),e.on("change:isOpen",()=>{const i=n.model.document.selection.getSelectedElement();e.isOpen&&(t.focus(),l.isImage(i)?(t.imageURLInputValue=i.getAttribute("src"),a.label=o("Update"),s.label=o("Update image URL")):(t.imageURLInputValue="",a.label=o("Insert"),s.label=o("Insert image via URL")))},{priority:"low"}),t.delegate("submit","cancel").to(e),this.delegate("cancel").to(e),e.on("submit",()=>{c(),function(){const e=n.model.document.selection.getSelectedElement();l.isImage(e)?n.model.change(i=>{i.setAttribute("src",t.imageURLInputValue,e),i.removeAttribute("srcset",e),i.removeAttribute("sizes",e)}):n.execute("insertImage",{source:t.imageURLInputValue})}()}),e.on("cancel",()=>{c()}),e}}class se extends n.Plugin{static get pluginName(){return"ImageInsert"}static get requires(){return[te,ae]}}class re extends n.Command{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils").getClosestSelectedImageElement(e.model.document.selection);this.isEnabled=!!t,t&&t.hasAttribute("width")?this.value={width:t.getAttribute("width"),height:null}:this.value=null}execute(e){const t=this.editor,i=t.model,n=t.plugins.get("ImageUtils").getClosestSelectedImageElement(i.document.selection);this.value={width:e.width,height:null},n&&i.change(t=>{t.setAttribute("width",e.width,n)})}}class le extends n.Plugin{static get requires(){return[m]}static get pluginName(){return"ImageResizeEditing"}constructor(e){super(e),e.config.define("image",{resizeUnit:"%",resizeOptions:[{name:"resizeImage:original",value:null,icon:"original"},{name:"resizeImage:25",value:"25",icon:"small"},{name:"resizeImage:50",value:"50",icon:"medium"},{name:"resizeImage:75",value:"75",icon:"large"}]})}init(){const e=this.editor,t=new re(e);this._registerSchema(),this._registerConverters("imageBlock"),this._registerConverters("imageInline"),e.commands.add("resizeImage",t),e.commands.add("imageResize",t)}_registerSchema(){this.editor.plugins.has("ImageBlockEditing")&&this.editor.model.schema.extend("imageBlock",{allowAttributes:"width"}),this.editor.plugins.has("ImageInlineEditing")&&this.editor.model.schema.extend("imageInline",{allowAttributes:"width"})}_registerConverters(e){const t=this.editor;t.conversion.for("downcast").add(t=>t.on("attribute:width:"+e,(e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const n=i.writer,o=i.mapper.toViewElement(t.item);null!==t.attributeNewValue?(n.setStyle("width",t.attributeNewValue,o),n.addClass("image_resized",o)):(n.removeStyle("width",o),n.removeClass("image_resized",o))})),t.conversion.for("upcast").attributeToAttribute({view:{name:"imageBlock"===e?"figure":"img",styles:{width:/.+/}},model:{key:"width",value:e=>e.getStyle("width")}})}}const ce={small:n.icons.objectSizeSmall,medium:n.icons.objectSizeMedium,large:n.icons.objectSizeLarge,original:n.icons.objectSizeFull};class ge extends n.Plugin{static get requires(){return[le]}static get pluginName(){return"ImageResizeButtons"}constructor(e){super(e),this._resizeUnit=e.config.get("image.resizeUnit")}init(){const e=this.editor,t=e.config.get("image.resizeOptions"),i=e.commands.get("resizeImage");this.bind("isEnabled").to(i);for(const e of t)this._registerImageResizeButton(e);this._registerImageResizeDropdown(t)}_registerImageResizeButton(e){const t=this.editor,{name:i,value:n,icon:o}=e,a=n?n+this._resizeUnit:null;t.ui.componentFactory.add(i,i=>{const n=new k.ButtonView(i),s=t.commands.get("resizeImage"),l=this._getOptionLabelValue(e,!0);if(!ce[o])throw new r.CKEditorError("imageresizebuttons-missing-icon",t,e);return n.set({label:l,icon:ce[o],tooltip:l,isToggleable:!0}),n.bind("isEnabled").to(this),n.bind("isOn").to(s,"value",de(a)),this.listenTo(n,"execute",()=>{t.execute("resizeImage",{width:a})}),n})}_registerImageResizeDropdown(e){const t=this.editor,i=t.t,n=e.find(e=>!e.value),o=o=>{const a=t.commands.get("resizeImage"),s=Object(k.createDropdown)(o,k.DropdownButtonView),r=s.buttonView;return r.set({tooltip:i("Resize image"),commandValue:n.value,icon:ce.medium,isToggleable:!0,label:this._getOptionLabelValue(n),withText:!0,class:"ck-resize-image-button"}),r.bind("label").to(a,"value",e=>e&&e.width?e.width:this._getOptionLabelValue(n)),s.bind("isOn").to(a),s.bind("isEnabled").to(this),Object(k.addListToDropdown)(s,this._getResizeDropdownListItemDefinitions(e,a)),s.listView.ariaLabel=i("Image resize list"),this.listenTo(s,"execute",e=>{t.execute(e.source.commandName,{width:e.source.commandValue}),t.editing.view.focus()}),s};t.ui.componentFactory.add("resizeImage",o),t.ui.componentFactory.add("imageResize",o)}_getOptionLabelValue(e,t){const i=this.editor.t;return e.label?e.label:t?e.value?i("Resize image to %0",e.value+this._resizeUnit):i("Resize image to the original size"):e.value?e.value+this._resizeUnit:i("Original")}_getResizeDropdownListItemDefinitions(e,t){const i=new r.Collection;return e.map(e=>{const n=e.value?e.value+this._resizeUnit:null,o={type:"button",model:new k.Model({commandName:"resizeImage",commandValue:n,label:this._getOptionLabelValue(e),withText:!0,icon:null})};o.model.bind("isOn").to(t,"value",de(n)),i.add(o)}),i}}function de(e){return t=>null===e&&t===e||t&&t.width===e}const me=/(image|image-inline)/;class ue extends n.Plugin{static get requires(){return[l.WidgetResize]}static get pluginName(){return"ImageResizeHandles"}init(){const e=this.editor.commands.get("resizeImage");this.bind("isEnabled").to(e),this._setupResizerCreator()}_setupResizerCreator(){const e=this.editor,t=e.editing.view;t.addObserver(E),this.listenTo(t.document,"imageLoaded",(i,n)=>{if(!n.target.matches("figure.image.ck-widget > img,figure.image.ck-widget > picture > img,figure.image.ck-widget > a > img,figure.image.ck-widget > a > picture > img,span.image-inline.ck-widget > img,span.image-inline.ck-widget > picture > img"))return;const o=e.editing.view.domConverter,a=o.domToView(n.target).findAncestor({classes:me});let s=this.editor.plugins.get(l.WidgetResize).getResizerByViewElement(a);if(s)return void s.redraw();const r=e.editing.mapper,c=r.toModelElement(a);s=e.plugins.get(l.WidgetResize).attachTo({unit:e.config.get("image.resizeUnit"),modelElement:c,viewElement:a,editor:e,getHandleHost:e=>e.querySelector("img"),getResizeHost:()=>o.viewToDom(r.toViewElement(c.parent)),isCentered(){const e=c.getAttribute("imageStyle");return!e||"block"==e||"alignCenter"==e},onCommit(i){t.change(e=>{e.removeClass("image_resized",a)}),e.execute("resizeImage",{width:i})}}),s.on("updateSize",()=>{a.hasClass("image_resized")||t.change(e=>{e.addClass("image_resized",a)})}),s.bind("isEnabled").to(this)})}}i(29);class pe extends n.Plugin{static get requires(){return[le,ue,ge]}static get pluginName(){return"ImageResize"}}class he extends n.Command{constructor(e,t){super(e),this._defaultStyles={imageBlock:!1,imageInline:!1},this._styles=new Map(t.map(e=>{if(e.isDefault)for(const t of e.modelElements)this._defaultStyles[t]=e.name;return[e.name,e]}))}refresh(){const e=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!e,this.isEnabled?e.hasAttribute("imageStyle")?this.value=e.getAttribute("imageStyle"):this.value=this._defaultStyles[e.name]:this.value=!1}execute(e={}){const t=this.editor,i=t.model,n=t.plugins.get("ImageUtils");i.change(t=>{const o=e.value;let a=n.getClosestSelectedImageElement(i.document.selection);o&&this.shouldConvertImageType(o,a)&&(this.editor.execute(n.isBlockImage(a)?"imageTypeInline":"imageTypeBlock"),a=n.getClosestSelectedImageElement(i.document.selection)),!o||this._styles.get(o).isDefault?t.removeAttribute("imageStyle",a):t.setAttribute("imageStyle",o,a)})}shouldConvertImageType(e,t){return!this._styles.get(e).modelElements.includes(t.name)}}const{objectFullWidth:fe,objectInline:be,objectLeft:ke,objectRight:we,objectCenter:Ie,objectBlockLeft:ve,objectBlockRight:_e}=n.icons,ye={inline:{name:"inline",title:"In line",icon:be,modelElements:["imageInline"],isDefault:!0},alignLeft:{name:"alignLeft",title:"Left aligned image",icon:ke,modelElements:["imageBlock","imageInline"],className:"image-style-align-left"},alignBlockLeft:{name:"alignBlockLeft",title:"Left aligned image",icon:ve,modelElements:["imageBlock"],className:"image-style-block-align-left"},alignCenter:{name:"alignCenter",title:"Centered image",icon:Ie,modelElements:["imageBlock"],className:"image-style-align-center"},alignRight:{name:"alignRight",title:"Right aligned image",icon:we,modelElements:["imageBlock","imageInline"],className:"image-style-align-right"},alignBlockRight:{name:"alignBlockRight",title:"Right aligned image",icon:_e,modelElements:["imageBlock"],className:"image-style-block-align-right"},block:{name:"block",title:"Centered image",icon:Ie,modelElements:["imageBlock"],isDefault:!0},side:{name:"side",title:"Side image",icon:we,modelElements:["imageBlock"],className:"image-style-side"}},xe={full:fe,left:ve,right:_e,center:Ie,inlineLeft:ke,inlineRight:we,inline:be},Ee=[{name:"imageStyle:wrapText",title:"Wrap text",defaultItem:"imageStyle:alignLeft",items:["imageStyle:alignLeft","imageStyle:alignRight"]},{name:"imageStyle:breakText",title:"Break text",defaultItem:"imageStyle:block",items:["imageStyle:alignBlockLeft","imageStyle:block","imageStyle:alignBlockRight"]}];function Ce(e){Object(r.logWarning)("image-style-configuration-definition-invalid",e)}var Te={normalizeStyles:function(e){return(e.configuredStyles.options||[]).map(e=>function(e){e="string"==typeof e?ye[e]?{...ye[e]}:{name:e}:function(e,t){const i={...t};for(const n in e)Object.prototype.hasOwnProperty.call(t,n)||(i[n]=e[n]);return i}(ye[e.name],e);"string"==typeof e.icon&&(e.icon=xe[e.icon]||e.icon);return e}(e)).filter(t=>function(e,{isBlockPluginLoaded:t,isInlinePluginLoaded:i}){const{modelElements:n,name:o}=e;if(!(n&&n.length&&o))return Ce({style:e}),!1;{const o=[t?"imageBlock":null,i?"imageInline":null];if(!n.some(e=>o.includes(e)))return Object(r.logWarning)("image-style-missing-dependency",{style:e,missingPlugins:n.map(e=>"imageBlock"===e?"ImageBlockEditing":"ImageInlineEditing")}),!1}return!0}(t,e))},getDefaultStylesConfiguration:function(e,t){return e&&t?{options:["inline","alignLeft","alignRight","alignCenter","alignBlockLeft","alignBlockRight","block","side"]}:e?{options:["block","side"]}:t?{options:["inline","alignLeft","alignRight"]}:{}},getDefaultDropdownDefinitions:function(e){return e.has("ImageBlockEditing")&&e.has("ImageInlineEditing")?[...Ee]:[]},warnInvalidStyle:Ce,DEFAULT_OPTIONS:ye,DEFAULT_ICONS:xe,DEFAULT_DROPDOWN_DEFINITIONS:Ee};function Se(e,t){for(const i of t)if(i.name===e)return i}class Be extends n.Plugin{static get pluginName(){return"ImageStyleEditing"}static get requires(){return[m]}init(){const{normalizeStyles:e,getDefaultStylesConfiguration:t}=Te,i=this.editor,n=i.plugins.has("ImageBlockEditing"),o=i.plugins.has("ImageInlineEditing");i.config.define("image.styles",t(n,o)),this.normalizedStyles=e({configuredStyles:i.config.get("image.styles"),isBlockPluginLoaded:n,isInlinePluginLoaded:o}),this._setupConversion(n,o),this._setupPostFixer(),i.commands.add("imageStyle",new he(i,this.normalizedStyles))}_setupConversion(e,t){const i=this.editor,n=i.model.schema,o=(a=this.normalizedStyles,(e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const n=Se(t.attributeNewValue,a),o=Se(t.attributeOldValue,a),s=i.mapper.toViewElement(t.item),r=i.writer;o&&r.removeClass(o.className,s),n&&r.addClass(n.className,s)});var a;const s=function(e){const t={imageInline:e.filter(e=>!e.isDefault&&e.modelElements.includes("imageInline")),imageBlock:e.filter(e=>!e.isDefault&&e.modelElements.includes("imageBlock"))};return(e,i,n)=>{if(!i.modelRange)return;const o=i.viewItem,a=Object(r.first)(i.modelRange.getItems());if(a&&n.schema.checkAttribute(a,"imageStyle"))for(const e of t[a.name])n.consumable.consume(o,{classes:e.className})&&n.writer.setAttribute("imageStyle",e.name,a)}}(this.normalizedStyles);i.editing.downcastDispatcher.on("attribute:imageStyle",o),i.data.downcastDispatcher.on("attribute:imageStyle",o),e&&(n.extend("imageBlock",{allowAttributes:"imageStyle"}),i.data.upcastDispatcher.on("element:figure",s,{priority:"low"})),t&&(n.extend("imageInline",{allowAttributes:"imageStyle"}),i.data.upcastDispatcher.on("element:img",s,{priority:"low"}))}_setupPostFixer(){const e=this.editor,t=e.model.document,i=e.plugins.get(m),n=new Map(this.normalizedStyles.map(e=>[e.name,e]));t.registerPostFixer(e=>{let o=!1;for(const a of t.differ.getChanges())if("insert"==a.type||"attribute"==a.type&&"imageStyle"==a.attributeKey){let t="insert"==a.type?a.position.nodeAfter:a.range.start.nodeAfter;if(t&&t.is("element","paragraph")&&t.childCount>0&&(t=t.getChild(0)),!i.isImage(t))continue;const s=t.getAttribute("imageStyle");if(!s)continue;const r=n.get(s);r&&r.modelElements.includes(t.name)||(e.removeAttribute("imageStyle",t),o=!0)}return o})}}var Ae=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)};var Ve=function(e){return e};i(31);class ze extends n.Plugin{static get requires(){return[Be]}static get pluginName(){return"ImageStyleUI"}get localizedDefaultStylesTitles(){const e=this.editor.t;return{"Wrap text":e("Wrap text"),"Break text":e("Break text"),"In line":e("In line"),"Full size image":e("Full size image"),"Side image":e("Side image"),"Left aligned image":e("Left aligned image"),"Centered image":e("Centered image"),"Right aligned image":e("Right aligned image")}}init(){const e=this.editor.plugins,t=this.editor.config.get("image.toolbar")||[],i=Re(e.get("ImageStyleEditing").normalizedStyles,this.localizedDefaultStylesTitles);for(const e of i)this._createButton(e);const n=Re([...t.filter(Ae),...Te.getDefaultDropdownDefinitions(e)],this.localizedDefaultStylesTitles);for(const e of n)this._createDropdown(e,i)}_createDropdown(e,t){const i=this.editor.ui.componentFactory;i.add(e.name,n=>{let o;const{defaultItem:a,items:s,title:r}=e,l=s.filter(e=>t.find(({name:t})=>Ue(t)===e)).map(e=>{const t=i.create(e);return e===a&&(o=t),t});s.length!==l.length&&Te.warnInvalidStyle({dropdown:e});const c=Object(k.createDropdown)(n,k.SplitButtonView),g=c.buttonView;return Object(k.addToolbarToDropdown)(c,l),g.set({label:Oe(r,o.label),class:null,tooltip:!0}),g.bind("icon").toMany(l,"isOn",(...e)=>{const t=e.findIndex(Ve);return t<0?o.icon:l[t].icon}),g.bind("label").toMany(l,"isOn",(...e)=>{const t=e.findIndex(Ve);return Oe(r,t<0?o.label:l[t].label)}),g.bind("isOn").toMany(l,"isOn",(...e)=>e.some(Ve)),g.bind("class").toMany(l,"isOn",(...e)=>e.some(Ve)?"ck-splitbutton_flatten":null),g.on("execute",()=>{l.some(({isOn:e})=>e)?c.isOpen=!c.isOpen:o.fire("execute")}),c.bind("isEnabled").toMany(l,"isEnabled",(...e)=>e.some(Ve)),c})}_createButton(e){const t=e.name;this.editor.ui.componentFactory.add(Ue(t),i=>{const n=this.editor.commands.get("imageStyle"),o=new k.ButtonView(i);return o.set({label:e.title,icon:e.icon,tooltip:!0,isToggleable:!0}),o.bind("isEnabled").to(n,"isEnabled"),o.bind("isOn").to(n,"value",e=>e===t),o.on("execute",this._executeCommand.bind(this,t)),o})}_executeCommand(e){this.editor.execute("imageStyle",{value:e}),this.editor.editing.view.focus()}}function Re(e,t){for(const i of e)t[i.title]&&(i.title=t[i.title]);return e}function Ue(e){return"imageStyle:"+e}function Oe(e,t){return(e?e+": ":"")+t}class Pe extends n.Plugin{static get requires(){return[Be,ze]}static get pluginName(){return"ImageStyle"}}class je extends n.Plugin{static get requires(){return[l.WidgetToolbarRepository,m]}static get pluginName(){return"ImageToolbar"}afterInit(){const e=this.editor,t=e.t,i=e.plugins.get(l.WidgetToolbarRepository),n=e.plugins.get("ImageUtils");var o;i.register("image",{ariaLabel:t("Image toolbar"),items:(o=e.config.get("image.toolbar")||[],o.map(e=>Ae(e)?e.name:e)),getRelatedElement:e=>n.getClosestSelectedImageWidget(e)})}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/indent.js b/core/assets/vendor/ckeditor5/build/indent.js
new file mode 100644
index 0000000000..959ab76707
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/indent.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Decrease indent","Increase indent":"Increase indent"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.indent=function(t){var e={};function n(i){if(e[i])return e[i].exports;var s=e[i]={i:i,l:!1,exports:{}};return t[i].call(s.exports,s,s.exports,n),s.l=!0,s.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)n.d(i,s,function(e){return t[e]}.bind(null,s));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=5)}([function(t,e,n){t.exports=n(1)("./src/core.js")},function(t,e){t.exports=CKEditor5.dll},function(t,e,n){t.exports=n(1)("./src/ui.js")},function(t,e,n){t.exports=n(1)("./src/engine.js")},function(t,e,n){t.exports=n(1)("./src/utils.js")},function(t,e,n){"use strict";n.r(e),n.d(e,"Indent",(function(){return a})),n.d(e,"IndentEditing",(function(){return s})),n.d(e,"IndentUI",(function(){return c})),n.d(e,"IndentBlock",(function(){return b}));var i=n(0);class s extends i.Plugin{static get pluginName(){return"IndentEditing"}init(){const t=this.editor;t.commands.add("indent",new i.MultiCommand(t)),t.commands.add("outdent",new i.MultiCommand(t))}}var o=n(2),r='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm5 6c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM2.75 16.5h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 1 0 0 1.5zM1.632 6.95 5.02 9.358a.4.4 0 0 1-.013.661l-3.39 2.207A.4.4 0 0 1 1 11.892V7.275a.4.4 0 0 1 .632-.326z"/></svg>',d='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm5 6c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM2.75 16.5h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 1 0 0 1.5zm1.618-9.55L.98 9.358a.4.4 0 0 0 .013.661l3.39 2.207A.4.4 0 0 0 5 11.892V7.275a.4.4 0 0 0-.632-.326z"/></svg>';class c extends i.Plugin{static get pluginName(){return"IndentUI"}init(){const t=this.editor,e=t.locale,n=t.t,i="ltr"==e.uiLanguageDirection?r:d,s="ltr"==e.uiLanguageDirection?d:r;this._defineButton("indent",n("Increase indent"),i),this._defineButton("outdent",n("Decrease indent"),s)}_defineButton(t,e,n){const i=this.editor;i.ui.componentFactory.add(t,s=>{const r=i.commands.get(t),d=new o.ButtonView(s);return d.set({label:e,icon:n,tooltip:!0}),d.bind("isOn","isEnabled").to(r,"value","isEnabled"),this.listenTo(d,"execute",()=>{i.execute(t),i.editing.view.focus()}),d})}}class a extends i.Plugin{static get pluginName(){return"Indent"}static get requires(){return[s,c]}}var u=n(3),l=n(4);class h extends i.Command{constructor(t,e){super(t),this._indentBehavior=e}refresh(){const t=this.editor.model,e=Object(l.first)(t.document.selection.getSelectedBlocks());e&&t.schema.checkAttribute(e,"blockIndent")?this.isEnabled=this._indentBehavior.checkEnabled(e.getAttribute("blockIndent")):this.isEnabled=!1}execute(){const t=this.editor.model,e=function(t){const e=t.document.selection,n=t.schema;return Array.from(e.getSelectedBlocks()).filter(t=>n.checkAttribute(t,"blockIndent"))}(t);t.change(t=>{for(const n of e){const e=n.getAttribute("blockIndent"),i=this._indentBehavior.getNextIndent(e);i?t.setAttribute("blockIndent",i,n):t.removeAttribute("blockIndent",n)}})}}class g{constructor(t){this.isForward="forward"===t.direction,this.offset=t.offset,this.unit=t.unit}checkEnabled(t){const e=parseFloat(t||0);return this.isForward||e>0}getNextIndent(t){const e=parseFloat(t||0);if(!(!t||t.endsWith(this.unit)))return this.isForward?this.offset+this.unit:void 0;const n=e+(this.isForward?this.offset:-this.offset);return n>0?n+this.unit:void 0}}class f{constructor(t){this.isForward="forward"===t.direction,this.classes=t.classes}checkEnabled(t){const e=this.classes.indexOf(t);return this.isForward?e<this.classes.length-1:e>=0}getNextIndent(t){const e=this.classes.indexOf(t),n=this.isForward?1:-1;return this.classes[e+n]}}const m=["paragraph","heading1","heading2","heading3","heading4","heading5","heading6"];class b extends i.Plugin{constructor(t){super(t),t.config.define("indentBlock",{offset:40,unit:"px"})}static get pluginName(){return"IndentBlock"}init(){const t=this.editor,e=t.config.get("indentBlock"),n=!e.classes||!e.classes.length,i=Object.assign({direction:"forward"},e),s=Object.assign({direction:"backward"},e);n?(t.data.addStyleProcessorRules(u.addMarginRules),this._setupConversionUsingOffset(t.conversion),t.commands.add("indentBlock",new h(t,new g(i))),t.commands.add("outdentBlock",new h(t,new g(s)))):(this._setupConversionUsingClasses(e.classes),t.commands.add("indentBlock",new h(t,new f(i))),t.commands.add("outdentBlock",new h(t,new f(s))))}afterInit(){const t=this.editor,e=t.model.schema,n=t.commands.get("indent"),i=t.commands.get("outdent"),s=t.config.get("heading.options");(s&&s.map(t=>t.model)||m).forEach(t=>{e.isRegistered(t)&&e.extend(t,{allowAttributes:"blockIndent"})}),e.setAttributeProperties("blockIndent",{isFormatting:!0}),n.registerChildCommand(t.commands.get("indentBlock")),i.registerChildCommand(t.commands.get("outdentBlock"))}_setupConversionUsingOffset(){const t=this.editor.conversion,e="rtl"===this.editor.locale.contentLanguageDirection?"margin-right":"margin-left";t.for("upcast").attributeToAttribute({view:{styles:{[e]:/[\s\S]+/}},model:{key:"blockIndent",value:t=>t.getStyle(e)}}),t.for("downcast").attributeToAttribute({model:"blockIndent",view:t=>({key:"style",value:{[e]:t}})})}_setupConversionUsingClasses(t){const e={model:{key:"blockIndent",values:[]},view:{}};for(const n of t)e.model.values.push(n),e.view[n]={key:"class",value:[n]};this.editor.conversion.attributeToAttribute(e)}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/language.js b/core/assets/vendor/ckeditor5/build/language.js
new file mode 100644
index 0000000000..760ab9835a
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/language.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Choose language":"Choose language",Language:"Language","Remove language":"Remove language"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.language=function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(e,t,n){e.exports=n(3)("./src/core.js")},function(e,t,n){e.exports=n(3)("./src/ui.js")},function(e,t,n){e.exports=n(3)("./src/utils.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,n){var o=n(5),r=n(6);"string"==typeof(r=r.__esModule?r.default:r)&&(r=[[e.i,r,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};o(r,a);e.exports=r.locals||{}},function(e,t,n){"use strict";var o,r=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},a=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),i=[];function u(e){for(var t=-1,n=0;n<i.length;n++)if(i[n].identifier===e){t=n;break}return t}function s(e,t){for(var n={},o=[],r=0;r<e.length;r++){var a=e[r],s=t.base?a[0]+t.base:a[0],l=n[s]||0,c="".concat(s," ").concat(l);n[s]=l+1;var d=u(c),g={css:a[1],media:a[2],sourceMap:a[3]};-1!==d?(i[d].references++,i[d].updater(g)):i.push({identifier:c,updater:b(g,t),references:1}),o.push(c)}return o}function l(e){var t=document.createElement("style"),o=e.attributes||{};if(void 0===o.nonce){var r=n.nc;r&&(o.nonce=r)}if(Object.keys(o).forEach((function(e){t.setAttribute(e,o[e])})),"function"==typeof e.insert)e.insert(t);else{var i=a(e.insert||"head");if(!i)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");i.appendChild(t)}return t}var c,d=(c=[],function(e,t){return c[e]=t,c.filter(Boolean).join("\n")});function g(e,t,n,o){var r=n?"":o.media?"@media ".concat(o.media," {").concat(o.css,"}"):o.css;if(e.styleSheet)e.styleSheet.cssText=d(t,r);else{var a=document.createTextNode(r),i=e.childNodes;i[t]&&e.removeChild(i[t]),i.length?e.insertBefore(a,i[t]):e.appendChild(a)}}function f(e,t,n){var o=n.css,r=n.media,a=n.sourceMap;if(r?e.setAttribute("media",r):e.removeAttribute("media"),a&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),e.styleSheet)e.styleSheet.cssText=o;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(o))}}var p=null,m=0;function b(e,t){var n,o,r;if(t.singleton){var a=m++;n=p||(p=l(t)),o=g.bind(null,n,a,!1),r=g.bind(null,n,a,!0)}else n=l(t),o=f.bind(null,n,t),r=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else r()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=r());var n=s(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var o=0;o<n.length;o++){var r=u(n[o]);i[r].references--}for(var a=s(e,t),l=0;l<n.length;l++){var c=u(n[l]);0===i[c].references&&(i[c].updater(),i.splice(c,1))}n=a}}}},function(e,t){e.exports=".ck-content span[lang]{font-style:italic}"},function(e,t,n){"use strict";n.r(t),n.d(t,"TextPartLanguage",(function(){return c})),n.d(t,"TextPartLanguageEditing",(function(){return u})),n.d(t,"TextPartLanguageUI",(function(){return l}));var o=n(0),r=n(2);function a(e,t){return`${e}:${t=t||Object(r.getLanguageDirection)(e)}`}class i extends o.Command{refresh(){const e=this.editor.model,t=e.document;this.value=this._getValueFromFirstAllowedNode(),this.isEnabled=e.schema.checkAttributeInSelection(t.selection,"language")}execute({languageCode:e,textDirection:t}={}){const n=this.editor.model,o=n.document.selection,r=!!e&&a(e,t);n.change(e=>{if(o.isCollapsed)r?e.setSelectionAttribute("language",r):e.removeSelectionAttribute("language");else{const t=n.schema.getValidRanges(o.getRanges(),"language");for(const n of t)r?e.setAttribute("language",r,n):e.removeAttribute("language",n)}})}_getValueFromFirstAllowedNode(){const e=this.editor.model,t=e.schema,n=e.document.selection;if(n.isCollapsed)return n.getAttribute("language")||!1;for(const e of n.getRanges())for(const n of e.getItems())if(t.checkAttribute(n,"language"))return n.getAttribute("language")||!1;return!1}}class u extends o.Plugin{static get pluginName(){return"TextPartLanguageEditing"}constructor(e){super(e),e.config.define("language",{textPartLanguage:[{title:"Arabic",languageCode:"ar"},{title:"French",languageCode:"fr"},{title:"Spanish",languageCode:"es"}]})}init(){const e=this.editor;e.model.schema.extend("$text",{allowAttributes:"language"}),e.model.schema.setAttributeProperties("language",{copyOnEnter:!0}),this._defineConverters(),e.commands.add("textPartLanguage",new i(e))}_defineConverters(){const e=this.editor.conversion;e.for("upcast").elementToAttribute({model:{key:"language",value:e=>a(e.getAttribute("lang"),e.getAttribute("dir"))},view:{name:"span",attributes:{lang:/[\s\S]+/}}}),e.for("downcast").attributeToElement({model:"language",view:(e,{writer:t})=>{if(!e)return;const{languageCode:n,textDirection:o}=function(e){const[t,n]=e.split(":");return{languageCode:t,textDirection:n}}(e);return t.createAttributeElement("span",{lang:n,dir:o})}})}}var s=n(1);n(4);class l extends o.Plugin{static get pluginName(){return"TextPartLanguageUI"}init(){const e=this.editor,t=e.t,n=e.config.get("language.textPartLanguage"),o=t("Choose language"),i=t("Remove language"),u=t("Language");e.ui.componentFactory.add("textPartLanguage",t=>{const l=new r.Collection,c={},d=e.commands.get("textPartLanguage");l.add({type:"button",model:new s.Model({label:i,languageCode:!1,withText:!0})}),l.add({type:"separator"});for(const e of n){const t={type:"button",model:new s.Model({label:e.title,languageCode:e.languageCode,textDirection:e.textDirection,withText:!0})},n=a(e.languageCode,e.textDirection);t.model.bind("isOn").to(d,"value",e=>e===n),l.add(t),c[n]=e.title}const g=Object(s.createDropdown)(t);return Object(s.addListToDropdown)(g,l),g.buttonView.set({isOn:!1,withText:!0,tooltip:u}),g.extendTemplate({attributes:{class:["ck-text-fragment-language-dropdown"]}}),g.bind("isEnabled").to(d,"isEnabled"),g.buttonView.bind("label").to(d,"value",e=>c[e]||o),this.listenTo(g,"execute",t=>{d.execute({languageCode:t.source.languageCode,textDirection:t.source.textDirection}),e.editing.view.focus()}),g})}}class c extends o.Plugin{static get requires(){return[u,l]}static get pluginName(){return"TextPartLanguage"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/link.js b/core/assets/vendor/ckeditor5/build/link.js
new file mode 100644
index 0000000000..36ec5af948
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/link.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{Downloadable:"Downloadable","Edit link":"Edit link",Link:"Link","Link image":"Link image","Link URL":"Link URL","Open in a new tab":"Open in a new tab","Open link in new tab":"Open link in new tab","This link has no URL":"This link has no URL",Unlink:"Unlink"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.link=function(e){var t={};function i(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(n,o,function(t){return e[t]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=21)}([function(e,t,i){e.exports=i(4)("./src/ui.js")},function(e,t,i){e.exports=i(4)("./src/core.js")},function(e,t,i){e.exports=i(4)("./src/utils.js")},function(e,t,i){e.exports=i(4)("./src/typing.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,i){e.exports=i(4)("./src/engine.js")},function(e,t,i){"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},r=function(){var e={};return function(t){if(void 0===e[t]){var i=document.querySelector(t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}e[t]=i}return e[t]}}(),s=[];function a(e){for(var t=-1,i=0;i<s.length;i++)if(s[i].identifier===e){t=i;break}return t}function c(e,t){for(var i={},n=[],o=0;o<e.length;o++){var r=e[o],c=t.base?r[0]+t.base:r[0],l=i[c]||0,u="".concat(c," ").concat(l);i[c]=l+1;var d=a(u),k={css:r[1],media:r[2],sourceMap:r[3]};-1!==d?(s[d].references++,s[d].updater(k)):s.push({identifier:u,updater:g(k,t),references:1}),n.push(u)}return n}function l(e){var t=document.createElement("style"),n=e.attributes||{};if(void 0===n.nonce){var o=i.nc;o&&(n.nonce=o)}if(Object.keys(n).forEach((function(e){t.setAttribute(e,n[e])})),"function"==typeof e.insert)e.insert(t);else{var s=r(e.insert||"head");if(!s)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");s.appendChild(t)}return t}var u,d=(u=[],function(e,t){return u[e]=t,u.filter(Boolean).join("\n")});function k(e,t,i,n){var o=i?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(e.styleSheet)e.styleSheet.cssText=d(t,o);else{var r=document.createTextNode(o),s=e.childNodes;s[t]&&e.removeChild(s[t]),s.length?e.insertBefore(r,s[t]):e.appendChild(r)}}function f(e,t,i){var n=i.css,o=i.media,r=i.sourceMap;if(o?e.setAttribute("media",o):e.removeAttribute("media"),r&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}var h=null,m=0;function g(e,t){var i,n,o;if(t.singleton){var r=m++;i=h||(h=l(t)),n=k.bind(null,i,r,!1),o=k.bind(null,i,r,!0)}else i=l(t),n=f.bind(null,i,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(i)};return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=o());var i=c(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var n=0;n<i.length;n++){var o=a(i[n]);s[o].references--}for(var r=c(e,t),l=0;l<i.length;l++){var u=a(i[l]);0===s[u].references&&(s[u].updater(),s.splice(u,1))}i=r}}}},function(e,t,i){var n=i(6),o=i(14);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,r);e.exports=o.locals||{}},function(e,t,i){e.exports=i(4)("./src/clipboard.js")},function(e,t,i){"use strict";(function(e){var i="object"==typeof e&&e&&e.Object===Object&&e;t.a=i}).call(this,i(11))},function(e,t,i){e.exports=i(4)("./src/widget.js")},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i},function(e,t,i){var n=i(6),o=i(13);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,r);e.exports=o.locals||{}},function(e,t){e.exports=".ck .ck-link_selected{background:var(--ck-color-link-selected-background)}.ck .ck-link_selected span.image-inline{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-link-selected-background)}.ck .ck-fake-link-selection{background:var(--ck-color-link-fake-selection)}.ck .ck-fake-link-selection_collapsed{height:100%;border-right:1px solid var(--ck-color-base-text);margin-right:-1px;outline:1px solid hsla(0,0%,100%,.5)}"},function(e,t){e.exports='.ck-vertical-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}}.ck-vertical-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form{padding:var(--ck-spacing-large)}.ck.ck-responsive-form:focus{outline:none}[dir=ltr] .ck.ck-responsive-form>:not(:first-child),[dir=rtl] .ck.ck-responsive-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-responsive-form{padding:0;width:calc(var(--ck-input-text-width)*0.8)}.ck.ck-responsive-form .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) 0}.ck.ck-responsive-form .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-responsive-form .ck-labeled-field-view .ck-labeled-field-view__error{white-space:normal}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){padding:var(--ck-spacing-standard);margin-top:var(--ck-spacing-large);border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-responsive-form>.ck-button:last-child,[dir=ltr] .ck.ck-responsive-form>.ck-button:nth-last-child(2),[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2){margin-left:0}.ck.ck-responsive-form>.ck-button:nth-last-child(2):after,[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child:last-of-type,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2):last-of-type{border-right:1px solid var(--ck-color-base-border)}}'},function(e,t,i){var n=i(6),o=i(16);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,r);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-link-form{display:flex}.ck.ck-link-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-link-form{flex-wrap:wrap}.ck.ck-link-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-link-form .ck-button{flex-basis:50%}}.ck.ck-link-form_layout-vertical{display:block}.ck.ck-link-form_layout-vertical .ck-button.ck-button-cancel,.ck.ck-link-form_layout-vertical .ck-button.ck-button-save{margin-top:var(--ck-spacing-medium)}.ck.ck-link-form_layout-vertical{padding:0;min-width:var(--ck-input-text-width)}.ck.ck-link-form_layout-vertical .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small)}.ck.ck-link-form_layout-vertical .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-link-form_layout-vertical .ck-button{padding:var(--ck-spacing-standard);margin:0;border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border);width:50%}[dir=ltr] .ck.ck-link-form_layout-vertical .ck-button,[dir=rtl] .ck.ck-link-form_layout-vertical .ck-button{margin-left:0}[dir=rtl] .ck.ck-link-form_layout-vertical .ck-button:last-of-type{border-right:1px solid var(--ck-color-base-border)}.ck.ck-link-form_layout-vertical .ck.ck-list{margin:var(--ck-spacing-standard) var(--ck-spacing-large)}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton{border:0;padding:0;width:100%}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton:hover{background:none}"},function(e,t,i){var n=i(6),o=i(18);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,r);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-link-actions{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-link-actions .ck-link-actions__preview{display:inline-block}.ck.ck-link-actions .ck-link-actions__preview .ck-button__label{overflow:hidden}@media screen and (max-width:600px){.ck.ck-link-actions{flex-wrap:wrap}.ck.ck-link-actions .ck-link-actions__preview{flex-basis:100%}.ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){flex-basis:50%}}.ck.ck-link-actions .ck-button.ck-link-actions__preview{padding-left:0;padding-right:0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{padding:0 var(--ck-spacing-medium);color:var(--ck-color-link-default);text-overflow:ellipsis;cursor:pointer;max-width:var(--ck-input-text-width);min-width:3em;text-align:center}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label:hover{text-decoration:underline}.ck.ck-link-actions .ck-button.ck-link-actions__preview,.ck.ck-link-actions .ck-button.ck-link-actions__preview:active,.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus,.ck.ck-link-actions .ck-button.ck-link-actions__preview:hover{background:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:active{box-shadow:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus .ck-button__label{text-decoration:underline}[dir=ltr] .ck.ck-link-actions .ck-button:not(:first-child),[dir=rtl] .ck.ck-link-actions .ck-button:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-link-actions .ck-button.ck-link-actions__preview{margin:var(--ck-spacing-standard) var(--ck-spacing-standard) 0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{min-width:0;max-width:100%}[dir=ltr] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview),[dir=rtl] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){margin-left:0}}"},function(e,t,i){var n=i(6),o=i(20);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,r);e.exports=o.locals||{}},function(e,t){e.exports='.ck.ck-editor__editable a span.image-inline:after,.ck.ck-editor__editable figure.image>a:after{display:block;position:absolute}:root{--ck-link-image-indicator-icon-size:20;--ck-link-image-indicator-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck.ck-editor__editable a span.image-inline:after,.ck.ck-editor__editable figure.image>a:after{content:"";top:min(var(--ck-spacing-medium),6%);right:min(var(--ck-spacing-medium),6%);background-color:rgba(0,0,0,.4);background-image:url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExLjA3NyAxNWwuOTkxLTEuNDE2YS43NS43NSAwIDExMS4yMjkuODZsLTEuMTQ4IDEuNjRhLjc0OC43NDggMCAwMS0uMjE3LjIwNiA1LjI1MSA1LjI1MSAwIDAxLTguNTAzLTUuOTU1Ljc0MS43NDEgMCAwMS4xMi0uMjc0bDEuMTQ3LTEuNjM5YS43NS43NSAwIDExMS4yMjguODZMNC45MzMgMTAuN2wuMDA2LjAwM2EzLjc1IDMuNzUgMCAwMDYuMTMyIDQuMjk0bC4wMDYuMDA0em01LjQ5NC01LjMzNWEuNzQ4Ljc0OCAwIDAxLS4xMi4yNzRsLTEuMTQ3IDEuNjM5YS43NS43NSAwIDExLTEuMjI4LS44NmwuODYtMS4yM2EzLjc1IDMuNzUgMCAwMC02LjE0NC00LjMwMWwtLjg2IDEuMjI5YS43NS43NSAwIDAxLTEuMjI5LS44NmwxLjE0OC0xLjY0YS43NDguNzQ4IDAgMDEuMjE3LS4yMDYgNS4yNTEgNS4yNTEgMCAwMTguNTAzIDUuOTU1em0tNC41NjMtMi41MzJhLjc1Ljc1IDAgMDEuMTg0IDEuMDQ1bC0zLjE1NSA0LjUwNWEuNzUuNzUgMCAxMS0xLjIyOS0uODZsMy4xNTUtNC41MDZhLjc1Ljc1IDAgMDExLjA0NS0uMTg0eiIvPjwvc3ZnPg==");background-size:14px;background-repeat:no-repeat;background-position:50%;border-radius:100%;overflow:hidden;width:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size));height:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size))}'},function(e,t,i){"use strict";i.r(t),i.d(t,"Link",(function(){return we})),i.d(t,"LinkEditing",(function(){return re})),i.d(t,"LinkUI",(function(){return he})),i.d(t,"LinkImage",(function(){return xe})),i.d(t,"LinkImageEditing",(function(){return ve})),i.d(t,"LinkImageUI",(function(){return Ae})),i.d(t,"AutoLink",(function(){return be}));var n=i(1),o=i(5),r=i(3),s=i(8),a=i(2);class c{constructor(){this._definitions=new Set}get length(){return this._definitions.size}add(e){Array.isArray(e)?e.forEach(e=>this._definitions.add(e)):this._definitions.add(e)}getDispatcher(){return e=>{e.on("attribute:linkHref",(e,t,i)=>{if(!i.consumable.test(t.item,"attribute:linkHref"))return;const n=i.writer,o=n.document.selection;for(const e of this._definitions){const r=n.createAttributeElement("a",e.attributes,{priority:5});e.classes&&n.addClass(e.classes,r);for(const t in e.styles)n.setStyle(t,e.styles[t],r);n.setCustomProperty("link",!0,r),e.callback(t.attributeNewValue)?t.item.is("selection")?n.wrap(o.getFirstRange(),r):n.wrap(i.mapper.toViewRange(t.range),r):n.unwrap(i.mapper.toViewRange(t.range),r)}},{priority:"high"})}}getDispatcherForLinkedImage(){return e=>{e.on("attribute:linkHref:imageBlock",(e,t,{writer:i,mapper:n})=>{const o=n.toViewElement(t.item),r=Array.from(o.getChildren()).find(e=>"a"===e.name);for(const e of this._definitions){const n=Object(a.toMap)(e.attributes);if(e.callback(t.attributeNewValue)){for(const[e,t]of n)"class"===e?i.addClass(t,r):i.setAttribute(e,t,r);e.classes&&i.addClass(e.classes,r);for(const t in e.styles)i.setStyle(t,e.styles[t],r)}else{for(const[e,t]of n)"class"===e?i.removeClass(t,r):i.removeAttribute(e,r);e.classes&&i.removeClass(e.classes,r);for(const t in e.styles)i.removeStyle(t,r)}}})}}}var l=function(e,t,i){var n=-1,o=e.length;t<0&&(t=-t>o?0:o+t),(i=i>o?o:i)<0&&(i+=o),o=t>i?0:i-t>>>0,t>>>=0;for(var r=Array(o);++n<o;)r[n]=e[n+t];return r};var u=function(e,t,i){var n=e.length;return i=void 0===i?n:i,!t&&i>=n?e:l(e,t,i)},d=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");var k=function(e){return d.test(e)};var f=function(e){return e.split("")},h="[\\ud800-\\udfff]",m="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",g="\\ud83c[\\udffb-\\udfff]",b="[^\\ud800-\\udfff]",p="(?:\\ud83c[\\udde6-\\uddff]){2}",w="[\\ud800-\\udbff][\\udc00-\\udfff]",v="(?:"+m+"|"+g+")"+"?",_="[\\ufe0e\\ufe0f]?"+v+("(?:\\u200d(?:"+[b,p,w].join("|")+")[\\ufe0e\\ufe0f]?"+v+")*"),y="(?:"+[b+m+"?",m,p,w,h].join("|")+")",A=RegExp(g+"(?="+g+")|"+y+_,"g");var x=function(e){return e.match(A)||[]};var I=function(e){return k(e)?x(e):f(e)},T=i(9),S="object"==typeof self&&self&&self.Object===Object&&self,E=(T.a||S||Function("return this")()).Symbol;var V=function(e,t){for(var i=-1,n=null==e?0:e.length,o=Array(n);++i<n;)o[i]=t(e[i],i,e);return o},L=Array.isArray,C=Object.prototype,M=C.hasOwnProperty,j=C.toString,D=E?E.toStringTag:void 0;var O=function(e){var t=M.call(e,D),i=e[D];try{e[D]=void 0;var n=!0}catch(e){}var o=j.call(e);return n&&(t?e[D]=i:delete e[D]),o},B=Object.prototype.toString;var N=function(e){return B.call(e)},H=E?E.toStringTag:void 0;var P=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":H&&H in Object(e)?O(e):N(e)};var U=function(e){return null!=e&&"object"==typeof e};var F=function(e){return"symbol"==typeof e||U(e)&&"[object Symbol]"==P(e)},R=E?E.prototype:void 0,z=R?R.toString:void 0;var K=function e(t){if("string"==typeof t)return t;if(L(t))return V(t,e)+"";if(F(t))return z?z.call(t):"";var i=t+"";return"0"==i&&1/t==-1/0?"-0":i};var Z=function(e){return null==e?"":K(e)};var q=function(e){return function(t){t=Z(t);var i=k(t)?I(t):void 0,n=i?i[0]:t.charAt(0),o=i?u(i,1).join(""):t.slice(1);return n[e]()+o}}("toUpperCase");const Y=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g,Q=/^(?:(?:https?|ftps?|mailto):|[^a-z]|[a-z+.-]+(?:[^a-z+.:-]|$))/i,W=/^[\S]+@((?![-_])(?:[-\w\u00a1-\uffff]{0,63}[^-_]\.))+(?:[a-z\u00a1-\uffff]{2,})$/i,$=/^((\w+:(\/{2,})?)|(\W))/i;function J(e,{writer:t}){const i=t.createAttributeElement("a",{href:e},{priority:5});return t.setCustomProperty("link",!0,i),i}function G(e){return function(e){return e.replace(Y,"").match(Q)}(e=String(e))?e:"#"}function X(e,t){return!!e&&t.checkAttribute(e.name,"linkHref")}function ee(e,t){const i=(n=e,W.test(n)?"mailto:":t);var n;const o=!!i&&!$.test(e);return e&&o?i+e:e}class te extends n.Command{constructor(e){super(e),this.manualDecorators=new a.Collection,this.automaticDecorators=new c}restoreManualDecoratorStates(){for(const e of this.manualDecorators)e.value=this._getDecoratorStateFromModel(e.id)}refresh(){const e=this.editor.model,t=e.document.selection,i=t.getSelectedElement()||Object(a.first)(t.getSelectedBlocks());X(i,e.schema)?(this.value=i.getAttribute("linkHref"),this.isEnabled=e.schema.checkAttribute(i,"linkHref")):(this.value=t.getAttribute("linkHref"),this.isEnabled=e.schema.checkAttributeInSelection(t,"linkHref"));for(const e of this.manualDecorators)e.value=this._getDecoratorStateFromModel(e.id)}execute(e,t={}){const i=this.editor.model,n=i.document.selection,o=[],s=[];for(const e in t)t[e]?o.push(e):s.push(e);i.change(t=>{if(n.isCollapsed){const c=n.getFirstPosition();if(n.hasAttribute("linkHref")){const a=Object(r.findAttributeRange)(c,"linkHref",n.getAttribute("linkHref"),i);t.setAttribute("linkHref",e,a),o.forEach(e=>{t.setAttribute(e,!0,a)}),s.forEach(e=>{t.removeAttribute(e,a)}),t.setSelection(t.createPositionAfter(a.end.nodeBefore))}else if(""!==e){const r=Object(a.toMap)(n.getAttributes());r.set("linkHref",e),o.forEach(e=>{r.set(e,!0)});const{end:s}=i.insertContent(t.createText(e,r),c);t.setSelection(s)}["linkHref",...o,...s].forEach(e=>{t.removeSelectionAttribute(e)})}else{const r=i.schema.getValidRanges(n.getRanges(),"linkHref"),a=[];for(const e of n.getSelectedBlocks())i.schema.checkAttribute(e,"linkHref")&&a.push(t.createRangeOn(e));const c=a.slice();for(const e of r)this._isRangeToUpdate(e,a)&&c.push(e);for(const i of c)t.setAttribute("linkHref",e,i),o.forEach(e=>{t.setAttribute(e,!0,i)}),s.forEach(e=>{t.removeAttribute(e,i)})}})}_getDecoratorStateFromModel(e){const t=this.editor.model,i=t.document.selection,n=i.getSelectedElement();return X(n,t.schema)?n.getAttribute(e):i.getAttribute(e)}_isRangeToUpdate(e,t){for(const i of t)if(i.containsRange(e))return!1;return!0}}class ie extends n.Command{refresh(){const e=this.editor.model,t=e.document.selection,i=t.getSelectedElement();X(i,e.schema)?this.isEnabled=e.schema.checkAttribute(i,"linkHref"):this.isEnabled=e.schema.checkAttributeInSelection(t,"linkHref")}execute(){const e=this.editor,t=this.editor.model,i=t.document.selection,n=e.commands.get("link");t.change(e=>{const o=i.isCollapsed?[Object(r.findAttributeRange)(i.getFirstPosition(),"linkHref",i.getAttribute("linkHref"),t)]:t.schema.getValidRanges(i.getRanges(),"linkHref");for(const t of o)if(e.removeAttribute("linkHref",t),n)for(const i of n.manualDecorators)e.removeAttribute(i.id,t)})}}class ne{constructor({id:e,label:t,attributes:i,classes:n,styles:o,defaultValue:r}){this.id=e,this.set("value"),this.defaultValue=r,this.label=t,this.attributes=i,this.classes=n,this.styles=o}_createPattern(){return{attributes:this.attributes,classes:this.classes,styles:this.styles}}}Object(a.mix)(ne,a.ObservableMixin);i(12);const oe=/^(https?:)?\/\//;class re extends n.Plugin{static get pluginName(){return"LinkEditing"}static get requires(){return[r.TwoStepCaretMovement,r.Input,s.ClipboardPipeline]}constructor(e){super(e),e.config.define("link",{addTargetToExternalLinks:!1})}init(){const e=this.editor;e.model.schema.extend("$text",{allowAttributes:"linkHref"}),e.conversion.for("dataDowncast").attributeToElement({model:"linkHref",view:J}),e.conversion.for("editingDowncast").attributeToElement({model:"linkHref",view:(e,t)=>J(G(e),t)}),e.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:{href:!0}},model:{key:"linkHref",value:e=>e.getAttribute("href")}}),e.commands.add("link",new te(e)),e.commands.add("unlink",new ie(e));const t=function(e,t){const i={"Open in a new tab":e("Open in a new tab"),Downloadable:e("Downloadable")};return t.forEach(e=>(e.label&&i[e.label]&&(e.label=i[e.label]),e)),t}(e.t,function(e){const t=[];if(e)for(const[i,n]of Object.entries(e)){const e=Object.assign({},n,{id:"link"+q(i)});t.push(e)}return t}(e.config.get("link.decorators")));this._enableAutomaticDecorators(t.filter(e=>"automatic"===e.mode)),this._enableManualDecorators(t.filter(e=>"manual"===e.mode));e.plugins.get(r.TwoStepCaretMovement).registerAttribute("linkHref"),Object(r.inlineHighlight)(e,"linkHref","a","ck-link_selected"),this._enableInsertContentSelectionAttributesFixer(),this._enableClickingAfterLink(),this._enableTypingOverLink(),this._handleDeleteContentAfterLink()}_enableAutomaticDecorators(e){const t=this.editor,i=t.commands.get("link").automaticDecorators;t.config.get("link.addTargetToExternalLinks")&&i.add({id:"linkIsExternal",mode:"automatic",callback:e=>oe.test(e),attributes:{target:"_blank",rel:"noopener noreferrer"}}),i.add(e),i.length&&t.conversion.for("downcast").add(i.getDispatcher())}_enableManualDecorators(e){if(!e.length)return;const t=this.editor,i=t.commands.get("link").manualDecorators;e.forEach(e=>{t.model.schema.extend("$text",{allowAttributes:e.id}),e=new ne(e),i.add(e),t.conversion.for("downcast").attributeToElement({model:e.id,view:(t,{writer:i})=>{if(t){const t=i.createAttributeElement("a",e.attributes,{priority:5});e.classes&&i.addClass(e.classes,t);for(const n in e.styles)i.setStyle(n,e.styles[n],t);return i.setCustomProperty("link",!0,t),t}}}),t.conversion.for("upcast").elementToAttribute({view:{name:"a",...e._createPattern()},model:{key:e.id}})})}_enableInsertContentSelectionAttributesFixer(){const e=this.editor.model,t=e.document.selection;this.listenTo(e,"insertContent",()=>{const i=t.anchor.nodeBefore,n=t.anchor.nodeAfter;t.hasAttribute("linkHref")&&i&&i.hasAttribute("linkHref")&&(n&&n.hasAttribute("linkHref")||e.change(t=>{se(t,ce(e.schema))}))},{priority:"low"})}_enableClickingAfterLink(){const e=this.editor,t=e.model;e.editing.view.addObserver(o.MouseObserver);let i=!1;this.listenTo(e.editing.view.document,"mousedown",()=>{i=!0}),this.listenTo(e.editing.view.document,"selectionChange",()=>{if(!i)return;i=!1;const e=t.document.selection;if(!e.isCollapsed)return;if(!e.hasAttribute("linkHref"))return;const n=e.getFirstPosition(),o=Object(r.findAttributeRange)(n,"linkHref",e.getAttribute("linkHref"),t);(n.isTouching(o.start)||n.isTouching(o.end))&&t.change(e=>{se(e,ce(t.schema))})})}_enableTypingOverLink(){const e=this.editor,t=e.editing.view;let i,n;this.listenTo(t.document,"delete",()=>{n=!0},{priority:"high"}),this.listenTo(e.model,"deleteContent",()=>{const t=e.model.document.selection;t.isCollapsed||(n?n=!1:ae(e)&&function(e){const t=e.document.selection,i=t.getFirstPosition(),n=t.getLastPosition(),o=i.nodeAfter;if(!o)return!1;if(!o.is("$text"))return!1;if(!o.hasAttribute("linkHref"))return!1;const s=n.textNode||n.nodeBefore;if(o===s)return!0;return Object(r.findAttributeRange)(i,"linkHref",o.getAttribute("linkHref"),e).containsRange(e.createRange(i,n),!0)}(e.model)&&(i=t.getAttributes()))},{priority:"high"}),this.listenTo(e.model,"insertContent",(t,[o])=>{n=!1,ae(e)&&i&&(e.model.change(e=>{for(const[t,n]of i)e.setAttribute(t,n,o)}),i=null)},{priority:"high"})}_handleDeleteContentAfterLink(){const e=this.editor,t=e.model,i=t.document.selection,n=e.editing.view;let o=!1,s=!1;this.listenTo(n.document,"delete",(e,t)=>{s=t.domEvent.keyCode===a.keyCodes.backspace},{priority:"high"}),this.listenTo(t,"deleteContent",()=>{o=!1;const e=i.getFirstPosition(),n=i.getAttribute("linkHref");if(!n)return;const s=Object(r.findAttributeRange)(e,"linkHref",n,t);o=s.containsPosition(e)||s.end.isEqual(e)},{priority:"high"}),this.listenTo(t,"deleteContent",()=>{s&&(s=!1,o||e.model.enqueueChange(e=>{se(e,ce(t.schema))}))},{priority:"low"})}}function se(e,t){e.removeSelectionAttribute("linkHref");for(const i of t)e.removeSelectionAttribute(i)}function ae(e){return e.plugins.get("Input").isInput(e.model.change(e=>e.batch))}function ce(e){return e.getDefinition("$text").allowAttributes.filter(e=>e.startsWith("link"))}var le=i(0),ue=i(10);i(7),i(15);class de extends le.View{constructor(e,t){super(e);const i=e.t;this.focusTracker=new a.FocusTracker,this.keystrokes=new a.KeystrokeHandler,this.urlInputView=this._createUrlInput(),this.saveButtonView=this._createButton(i("Save"),n.icons.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(i("Cancel"),n.icons.cancel,"ck-button-cancel","cancel"),this._manualDecoratorSwitches=this._createManualDecoratorSwitches(t),this.children=this._createFormChildren(t.manualDecorators),this._focusables=new le.ViewCollection,this._focusCycler=new le.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});const o=["ck","ck-link-form","ck-responsive-form"];t.manualDecorators.length&&o.push("ck-link-form_layout-vertical","ck-vertical-form"),this.setTemplate({tag:"form",attributes:{class:o,tabindex:"-1"},children:this.children}),Object(le.injectCssTransitionDisabler)(this)}getDecoratorSwitchesState(){return Array.from(this._manualDecoratorSwitches).reduce((e,t)=>(e[t.name]=t.isOn,e),{})}render(){super.render(),Object(le.submitHandler)({view:this});[this.urlInputView,...this._manualDecoratorSwitches,this.saveButtonView,this.cancelButtonView].forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)}),this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createUrlInput(){const e=this.locale.t,t=new le.LabeledFieldView(this.locale,le.createLabeledInputText);return t.label=e("Link URL"),t}_createButton(e,t,i,n){const o=new le.ButtonView(this.locale);return o.set({label:e,icon:t,tooltip:!0}),o.extendTemplate({attributes:{class:i}}),n&&o.delegate("execute").to(this,n),o}_createManualDecoratorSwitches(e){const t=this.createCollection();for(const i of e.manualDecorators){const n=new le.SwitchButtonView(this.locale);n.set({name:i.id,label:i.label,withText:!0}),n.bind("isOn").toMany([i,e],"value",(e,t)=>void 0===t&&void 0===e?i.defaultValue:e),n.on("execute",()=>{i.set("value",!n.isOn)}),t.add(n)}return t}_createFormChildren(e){const t=this.createCollection();if(t.add(this.urlInputView),e.length){const e=new le.View;e.setTemplate({tag:"ul",children:this._manualDecoratorSwitches.map(e=>({tag:"li",children:[e],attributes:{class:["ck","ck-list__item"]}})),attributes:{class:["ck","ck-reset","ck-list"]}}),t.add(e)}return t.add(this.saveButtonView),t.add(this.cancelButtonView),t}}i(17);class ke extends le.View{constructor(e){super(e);const t=e.t;this.focusTracker=new a.FocusTracker,this.keystrokes=new a.KeystrokeHandler,this.previewButtonView=this._createPreviewButton(),this.unlinkButtonView=this._createButton(t("Unlink"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.077 15 .991-1.416a.75.75 0 1 1 1.229.86l-1.148 1.64a.748.748 0 0 1-.217.206 5.251 5.251 0 0 1-8.503-5.955.741.741 0 0 1 .12-.274l1.147-1.639a.75.75 0 1 1 1.228.86L4.933 10.7l.006.003a3.75 3.75 0 0 0 6.132 4.294l.006.004zm5.494-5.335a.748.748 0 0 1-.12.274l-1.147 1.639a.75.75 0 1 1-1.228-.86l.86-1.23a3.75 3.75 0 0 0-6.144-4.301l-.86 1.229a.75.75 0 0 1-1.229-.86l1.148-1.64a.748.748 0 0 1 .217-.206 5.251 5.251 0 0 1 8.503 5.955zm-4.563-2.532a.75.75 0 0 1 .184 1.045l-3.155 4.505a.75.75 0 1 1-1.229-.86l3.155-4.506a.75.75 0 0 1 1.045-.184zm4.919 10.562-1.414 1.414a.75.75 0 1 1-1.06-1.06l1.414-1.415-1.415-1.414a.75.75 0 0 1 1.061-1.06l1.414 1.414 1.414-1.415a.75.75 0 0 1 1.061 1.061l-1.414 1.414 1.414 1.415a.75.75 0 0 1-1.06 1.06l-1.415-1.414z"/></svg>',"unlink"),this.editButtonView=this._createButton(t("Edit link"),n.icons.pencil,"edit"),this.set("href"),this._focusables=new le.ViewCollection,this._focusCycler=new le.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-link-actions","ck-responsive-form"],tabindex:"-1"},children:[this.previewButtonView,this.editButtonView,this.unlinkButtonView]})}render(){super.render();[this.previewButtonView,this.editButtonView,this.unlinkButtonView].forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)}),this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createButton(e,t,i){const n=new le.ButtonView(this.locale);return n.set({label:e,icon:t,tooltip:!0}),n.delegate("execute").to(this,i),n}_createPreviewButton(){const e=new le.ButtonView(this.locale),t=this.bindTemplate,i=this.t;return e.set({withText:!0,tooltip:i("Open link in new tab")}),e.extendTemplate({attributes:{class:["ck","ck-link-actions__preview"],href:t.to("href",e=>e&&G(e)),target:"_blank",rel:"noopener noreferrer"}}),e.bind("label").to(this,"href",e=>e||i("This link has no URL")),e.bind("isEnabled").to(this,"href",e=>!!e),e.template.tag="a",e.template.eventListeners={},e}}var fe='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.077 15 .991-1.416a.75.75 0 1 1 1.229.86l-1.148 1.64a.748.748 0 0 1-.217.206 5.251 5.251 0 0 1-8.503-5.955.741.741 0 0 1 .12-.274l1.147-1.639a.75.75 0 1 1 1.228.86L4.933 10.7l.006.003a3.75 3.75 0 0 0 6.132 4.294l.006.004zm5.494-5.335a.748.748 0 0 1-.12.274l-1.147 1.639a.75.75 0 1 1-1.228-.86l.86-1.23a3.75 3.75 0 0 0-6.144-4.301l-.86 1.229a.75.75 0 0 1-1.229-.86l1.148-1.64a.748.748 0 0 1 .217-.206 5.251 5.251 0 0 1 8.503 5.955zm-4.563-2.532a.75.75 0 0 1 .184 1.045l-3.155 4.505a.75.75 0 1 1-1.229-.86l3.155-4.506a.75.75 0 0 1 1.045-.184z"/></svg>';class he extends n.Plugin{static get requires(){return[le.ContextualBalloon]}static get pluginName(){return"LinkUI"}init(){const e=this.editor;e.editing.view.addObserver(o.ClickObserver),this.actionsView=this._createActionsView(),this.formView=this._createFormView(),this._balloon=e.plugins.get(le.ContextualBalloon),this._createToolbarLinkButton(),this._enableUserBalloonInteractions(),e.conversion.for("editingDowncast").markerToHighlight({model:"link-ui",view:{classes:["ck-fake-link-selection"]}}),e.conversion.for("editingDowncast").markerToElement({model:"link-ui",view:{name:"span",classes:["ck-fake-link-selection","ck-fake-link-selection_collapsed"]}})}destroy(){super.destroy(),this.formView.destroy()}_createActionsView(){const e=this.editor,t=new ke(e.locale),i=e.commands.get("link"),n=e.commands.get("unlink");return t.bind("href").to(i,"value"),t.editButtonView.bind("isEnabled").to(i),t.unlinkButtonView.bind("isEnabled").to(n),this.listenTo(t,"edit",()=>{this._addFormView()}),this.listenTo(t,"unlink",()=>{e.execute("unlink"),this._hideUI()}),t.keystrokes.set("Esc",(e,t)=>{this._hideUI(),t()}),t.keystrokes.set("Ctrl+K",(e,t)=>{this._addFormView(),t()}),t}_createFormView(){const e=this.editor,t=e.commands.get("link"),i=e.config.get("link.defaultProtocol"),n=new de(e.locale,t);return n.urlInputView.fieldView.bind("value").to(t,"value"),n.urlInputView.bind("isReadOnly").to(t,"isEnabled",e=>!e),n.saveButtonView.bind("isEnabled").to(t),this.listenTo(n,"submit",()=>{const{value:t}=n.urlInputView.fieldView.element,o=ee(t,i);e.execute("link",o,n.getDecoratorSwitchesState()),this._closeFormView()}),this.listenTo(n,"cancel",()=>{this._closeFormView()}),n.keystrokes.set("Esc",(e,t)=>{this._closeFormView(),t()}),n}_createToolbarLinkButton(){const e=this.editor,t=e.commands.get("link"),i=e.t;e.keystrokes.set("Ctrl+K",(e,i)=>{i(),t.isEnabled&&this._showUI(!0)}),e.ui.componentFactory.add("link",e=>{const n=new le.ButtonView(e);return n.isEnabled=!0,n.label=i("Link"),n.icon=fe,n.keystroke="Ctrl+K",n.tooltip=!0,n.isToggleable=!0,n.bind("isEnabled").to(t,"isEnabled"),n.bind("isOn").to(t,"value",e=>!!e),this.listenTo(n,"execute",()=>this._showUI(!0)),n})}_enableUserBalloonInteractions(){const e=this.editor.editing.view.document;this.listenTo(e,"click",()=>{this._getSelectedLinkElement()&&this._showUI()}),this.editor.keystrokes.set("Tab",(e,t)=>{this._areActionsVisible&&!this.actionsView.focusTracker.isFocused&&(this.actionsView.focus(),t())},{priority:"high"}),this.editor.keystrokes.set("Esc",(e,t)=>{this._isUIVisible&&(this._hideUI(),t())}),Object(le.clickOutsideHandler)({emitter:this.formView,activator:()=>this._isUIInPanel,contextElements:[this._balloon.view.element],callback:()=>this._hideUI()})}_addActionsView(){this._areActionsInPanel||this._balloon.add({view:this.actionsView,position:this._getBalloonPositionData()})}_addFormView(){if(this._isFormInPanel)return;const e=this.editor.commands.get("link");this.formView.disableCssTransitions(),this._balloon.add({view:this.formView,position:this._getBalloonPositionData()}),this._balloon.visibleView===this.formView&&this.formView.urlInputView.fieldView.select(),this.formView.enableCssTransitions(),this.formView.urlInputView.fieldView.element.value=e.value||""}_closeFormView(){const e=this.editor.commands.get("link");e.restoreManualDecoratorStates(),void 0!==e.value?this._removeFormView():this._hideUI()}_removeFormView(){this._isFormInPanel&&(this.formView.saveButtonView.focus(),this._balloon.remove(this.formView),this.editor.editing.view.focus(),this._hideFakeVisualSelection())}_showUI(e=!1){this._getSelectedLinkElement()?(this._areActionsVisible?this._addFormView():this._addActionsView(),e&&this._balloon.showStack("main")):(this._showFakeVisualSelection(),this._addActionsView(),e&&this._balloon.showStack("main"),this._addFormView()),this._startUpdatingUI()}_hideUI(){if(!this._isUIInPanel)return;const e=this.editor;this.stopListening(e.ui,"update"),this.stopListening(this._balloon,"change:visibleView"),e.editing.view.focus(),this._removeFormView(),this._balloon.remove(this.actionsView),this._hideFakeVisualSelection()}_startUpdatingUI(){const e=this.editor,t=e.editing.view.document;let i=this._getSelectedLinkElement(),n=r();const o=()=>{const e=this._getSelectedLinkElement(),t=r();i&&!e||!i&&t!==n?this._hideUI():this._isUIVisible&&this._balloon.updatePosition(this._getBalloonPositionData()),i=e,n=t};function r(){return t.selection.focus.getAncestors().reverse().find(e=>e.is("element"))}this.listenTo(e.ui,"update",o),this.listenTo(this._balloon,"change:visibleView",o)}get _isFormInPanel(){return this._balloon.hasView(this.formView)}get _areActionsInPanel(){return this._balloon.hasView(this.actionsView)}get _areActionsVisible(){return this._balloon.visibleView===this.actionsView}get _isUIInPanel(){return this._isFormInPanel||this._areActionsInPanel}get _isUIVisible(){return this._balloon.visibleView==this.formView||this._areActionsVisible}_getBalloonPositionData(){const e=this.editor.editing.view,t=this.editor.model,i=e.document;let n=null;if(t.markers.has("link-ui")){const t=Array.from(this.editor.editing.mapper.markerNameToElements("link-ui")),i=e.createRange(e.createPositionBefore(t[0]),e.createPositionAfter(t[t.length-1]));n=e.domConverter.viewRangeToDom(i)}else n=()=>{const t=this._getSelectedLinkElement();return t?e.domConverter.mapViewToDom(t):e.domConverter.viewRangeToDom(i.selection.getFirstRange())};return{target:n}}_getSelectedLinkElement(){const e=this.editor.editing.view,t=e.document.selection,i=t.getSelectedElement();if(t.isCollapsed||i&&Object(ue.isWidget)(i))return me(t.getFirstPosition());{const i=t.getFirstRange().getTrimmed(),n=me(i.start),o=me(i.end);return n&&n==o&&e.createRangeIn(n).getTrimmed().isEqual(i)?n:null}}_showFakeVisualSelection(){const e=this.editor.model;e.change(t=>{const i=e.document.selection.getFirstRange();if(e.markers.has("link-ui"))t.updateMarker("link-ui",{range:i});else if(i.start.isAtEnd){const n=i.start.getLastMatchingPosition(({item:t})=>!e.schema.isContent(t),{boundaries:i});t.addMarker("link-ui",{usingOperation:!1,affectsData:!1,range:t.createRange(n,i.end)})}else t.addMarker("link-ui",{usingOperation:!1,affectsData:!1,range:i})})}_hideFakeVisualSelection(){const e=this.editor.model;e.markers.has("link-ui")&&e.change(e=>{e.removeMarker("link-ui")})}}function me(e){return e.getAncestors().find(e=>{return(t=e).is("attributeElement")&&!!t.getCustomProperty("link");var t})}const ge=new RegExp("(^|\\s)(((?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(((?!www\\.)|(www\\.))(?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.)+(?:[a-z\\u00a1-\\uffff]{2,63})))(?::\\d{2,5})?(?:[/?#]\\S*)?)|((www.|(\\S+@))((?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.))+(?:[a-z\\u00a1-\\uffff]{2,63})))$","i");class be extends n.Plugin{static get pluginName(){return"AutoLink"}init(){const e=this.editor.model.document.selection;e.on("change:range",()=>{this.isEnabled=!e.anchor.parent.is("element","codeBlock")}),this._enableTypingHandling()}afterInit(){this._enableEnterHandling(),this._enableShiftEnterHandling()}_enableTypingHandling(){const e=this.editor,t=new r.TextWatcher(e.model,e=>{if(!function(e){return e.length>4&&" "===e[e.length-1]&&" "!==e[e.length-2]}(e))return;const t=pe(e.substr(0,e.length-1));return t?{url:t}:void 0}),i=e.plugins.get("Input");t.on("matched:data",(t,n)=>{const{batch:o,range:r,url:s}=n;if(!i.isInput(o))return;const a=r.end.getShiftedBy(-1),c=a.getShiftedBy(-s.length),l=e.model.createRange(c,a);this._applyAutoLink(s,l)}),t.bind("isEnabled").to(this)}_enableEnterHandling(){const e=this.editor,t=e.model,i=e.commands.get("enter");i&&i.on("execute",()=>{const e=t.document.selection.getFirstPosition();if(!e.parent.previousSibling)return;const i=t.createRangeIn(e.parent.previousSibling);this._checkAndApplyAutoLinkOnRange(i)})}_enableShiftEnterHandling(){const e=this.editor,t=e.model,i=e.commands.get("shiftEnter");i&&i.on("execute",()=>{const e=t.document.selection.getFirstPosition(),i=t.createRange(t.createPositionAt(e.parent,0),e.getShiftedBy(-1));this._checkAndApplyAutoLinkOnRange(i)})}_checkAndApplyAutoLinkOnRange(e){const t=this.editor.model,{text:i,range:n}=Object(r.getLastTextLine)(e,t),o=pe(i);if(o){const e=t.createRange(n.end.getShiftedBy(-o.length),n.end);this._applyAutoLink(o,e)}}_applyAutoLink(e,t){const i=this.editor.model;this.isEnabled&&function(e,t){return t.schema.checkAttributeInSelection(t.createSelection(e),"linkHref")}(t,i)&&i.enqueueChange(i=>{const n=this.editor.config.get("link.defaultProtocol"),o=ee(e,n);i.setAttribute("linkHref",o,t)})}}function pe(e){const t=ge.exec(e);return t?t[2]:null}class we extends n.Plugin{static get requires(){return[re,he,be]}static get pluginName(){return"Link"}}class ve extends n.Plugin{static get requires(){return["ImageEditing","ImageUtils",re]}static get pluginName(){return"LinkImageEditing"}init(){const e=this.editor,t=e.model.schema;e.plugins.has("ImageBlockEditing")&&t.extend("imageBlock",{allowAttributes:["linkHref"]}),e.plugins.has("ImageInlineEditing")&&t.extend("imageInline",{allowAttributes:["linkHref"]}),e.conversion.for("upcast").add(function(e){const t=e.plugins.has("ImageInlineEditing"),i=e.plugins.get("ImageUtils");return e=>{e.on("element:a",(e,n,o)=>{const r=n.viewItem,s=i.findViewImgElement(r);if(!s)return;const a=s.findAncestor(e=>i.isBlockImageView(e));if(t&&!a)return;if(!o.consumable.consume(r,{attributes:["href"]}))return;const c=r.getAttribute("href");if(!c)return;let l=n.modelCursor.parent;if(!l.is("element","imageBlock")){const e=o.convertItem(s,n.modelCursor);n.modelRange=e.modelRange,n.modelCursor=e.modelCursor,l=n.modelCursor.nodeBefore}l&&l.is("element","imageBlock")&&o.writer.setAttribute("linkHref",c,l)},{priority:"high"})}}(e)),e.conversion.for("downcast").add(function(e){const t=e.plugins.get("ImageUtils");return e=>{e.on("attribute:linkHref:imageBlock",(e,i,n)=>{if(!n.consumable.consume(i.item,e.name))return;const o=n.mapper.toViewElement(i.item),r=n.writer,s=Array.from(o.getChildren()).find(e=>"a"===e.name),a=t.findViewImgElement(o),c=a.parent.is("element","picture")?a.parent:a;if(s)i.attributeNewValue?r.setAttribute("href",i.attributeNewValue,s):(r.move(r.createRangeOn(c),r.createPositionAt(o,0)),r.remove(s));else{const e=r.createContainerElement("a",{href:i.attributeNewValue});r.insert(r.createPositionAt(o,0),e),r.move(r.createRangeOn(c),r.createPositionAt(e,0))}},{priority:"high"})}}(e)),this._enableAutomaticDecorators(),this._enableManualDecorators()}_enableAutomaticDecorators(){const e=this.editor,t=e.commands.get("link").automaticDecorators;t.length&&e.conversion.for("downcast").add(t.getDispatcherForLinkedImage())}_enableManualDecorators(){const e=this.editor,t=e.commands.get("link");for(const i of t.manualDecorators)e.plugins.has("ImageBlockEditing")&&e.model.schema.extend("imageBlock",{allowAttributes:i.id}),e.plugins.has("ImageInlineEditing")&&e.model.schema.extend("imageInline",{allowAttributes:i.id}),e.conversion.for("downcast").add(_e(i)),e.conversion.for("upcast").add(ye(e,i))}}function _e(e){return t=>{t.on(`attribute:${e.id}:imageBlock`,(t,i,n)=>{const o=n.mapper.toViewElement(i.item),r=Array.from(o.getChildren()).find(e=>"a"===e.name);if(r){for(const[t,i]of Object(a.toMap)(e.attributes))n.writer.setAttribute(t,i,r);e.classes&&n.writer.addClass(e.classes,r);for(const t in e.styles)n.writer.setStyle(t,e.styles[t],r)}})}}function ye(e,t){const i=e.plugins.get("ImageUtils");return e=>{e.on("element:a",(e,n,r)=>{const s=n.viewItem;if(!i.findViewImgElement(s))return;const a=new o.Matcher(t._createPattern()).match(s);if(!a)return;if(!r.consumable.consume(s,a.match))return;const c=n.modelCursor.nodeBefore||n.modelCursor.parent;r.writer.setAttribute(t.id,!0,c)},{priority:"high"})}}class Ae extends n.Plugin{static get requires(){return[re,he,"ImageBlockEditing"]}static get pluginName(){return"LinkImageUI"}init(){const e=this.editor,t=e.editing.view.document;this.listenTo(t,"click",(t,i)=>{this._isSelectedLinkedImage(e.model.document.selection)&&(i.preventDefault(),t.stop())},{priority:"high"}),this._createToolbarLinkImageButton()}_createToolbarLinkImageButton(){const e=this.editor,t=e.t;e.ui.componentFactory.add("linkImage",i=>{const n=new le.ButtonView(i),o=e.plugins.get("LinkUI"),r=e.commands.get("link");return n.set({isEnabled:!0,label:t("Link image"),icon:fe,keystroke:"Ctrl+K",tooltip:!0,isToggleable:!0}),n.bind("isEnabled").to(r,"isEnabled"),n.bind("isOn").to(r,"value",e=>!!e),this.listenTo(n,"execute",()=>{this._isSelectedLinkedImage(e.model.document.selection)?o._addActionsView():o._showUI(!0)}),n})}_isSelectedLinkedImage(e){const t=e.getSelectedElement();return this.editor.plugins.get("ImageUtils").isImage(t)&&t.hasAttribute("linkHref")}}i(19);class xe extends n.Plugin{static get requires(){return[ve,Ae]}static get pluginName(){return"LinkImage"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/list.js b/core/assets/vendor/ckeditor5/build/list.js
new file mode 100644
index 0000000000..9768e0944b
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/list.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Circle:"Circle",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero",Disc:"Disc","Lower-latin":"Lower-latin","Lower–roman":"Lower–roman","Numbered List":"Numbered List","Numbered list styles toolbar":"Numbered list styles toolbar",Square:"Square","To-do List":"To-do List","Toggle the circle list style":"Toggle the circle list style","Toggle the decimal list style":"Toggle the decimal list style","Toggle the decimal with leading zero list style":"Toggle the decimal with leading zero list style","Toggle the disc list style":"Toggle the disc list style","Toggle the lower–latin list style":"Toggle the lower–latin list style","Toggle the lower–roman list style":"Toggle the lower–roman list style","Toggle the square list style":"Toggle the square list style","Toggle the upper–latin list style":"Toggle the upper–latin list style","Toggle the upper–roman list style":"Toggle the upper–roman list style","Upper-latin":"Upper-latin","Upper-roman":"Upper-roman"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.list=function(t){var e={};function i(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}return i.m=t,i.c=e,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)i.d(n,o,function(e){return t[e]}.bind(null,o));return n},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=12)}([function(t,e,i){t.exports=i(3)("./src/core.js")},function(t,e,i){t.exports=i(3)("./src/utils.js")},function(t,e,i){t.exports=i(3)("./src/ui.js")},function(t,e){t.exports=CKEditor5.dll},function(t,e,i){t.exports=i(3)("./src/engine.js")},function(t,e,i){"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},s=function(){var t={};return function(e){if(void 0===t[e]){var i=document.querySelector(e);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(t){i=null}t[e]=i}return t[e]}}(),r=[];function l(t){for(var e=-1,i=0;i<r.length;i++)if(r[i].identifier===t){e=i;break}return e}function a(t,e){for(var i={},n=[],o=0;o<t.length;o++){var s=t[o],a=e.base?s[0]+e.base:s[0],c=i[a]||0,d="".concat(a," ").concat(c);i[a]=c+1;var u=l(d),m={css:s[1],media:s[2],sourceMap:s[3]};-1!==u?(r[u].references++,r[u].updater(m)):r.push({identifier:d,updater:f(m,e),references:1}),n.push(d)}return n}function c(t){var e=document.createElement("style"),n=t.attributes||{};if(void 0===n.nonce){var o=i.nc;o&&(n.nonce=o)}if(Object.keys(n).forEach((function(t){e.setAttribute(t,n[t])})),"function"==typeof t.insert)t.insert(e);else{var r=s(t.insert||"head");if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(e)}return e}var d,u=(d=[],function(t,e){return d[t]=e,d.filter(Boolean).join("\n")});function m(t,e,i,n){var o=i?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(t.styleSheet)t.styleSheet.cssText=u(e,o);else{var s=document.createTextNode(o),r=t.childNodes;r[e]&&t.removeChild(r[e]),r.length?t.insertBefore(s,r[e]):t.appendChild(s)}}function g(t,e,i){var n=i.css,o=i.media,s=i.sourceMap;if(o?t.setAttribute("media",o):t.removeAttribute("media"),s&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(s))))," */")),t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}var p=null,h=0;function f(t,e){var i,n,o;if(e.singleton){var s=h++;i=p||(p=c(e)),n=m.bind(null,i,s,!1),o=m.bind(null,i,s,!0)}else i=c(e),n=g.bind(null,i,e),o=function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(i)};return n(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;n(t=e)}else o()}}t.exports=function(t,e){(e=e||{}).singleton||"boolean"==typeof e.singleton||(e.singleton=o());var i=a(t=t||[],e);return function(t){if(t=t||[],"[object Array]"===Object.prototype.toString.call(t)){for(var n=0;n<i.length;n++){var o=l(i[n]);r[o].references--}for(var s=a(t,e),c=0;c<i.length;c++){var d=l(i[c]);0===r[d].references&&(r[d].updater(),r.splice(d,1))}i=s}}}},function(t,e,i){t.exports=i(3)("./src/enter.js")},function(t,e,i){t.exports=i(3)("./src/typing.js")},function(t,e,i){var n=i(5),o=i(9);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,s);t.exports=o.locals||{}},function(t,e){t.exports=".ck.ck-list-styles-dropdown>.ck-dropdown__panel>.ck-toolbar>.ck-toolbar__items{display:grid}:root{--ck-list-style-button-size:44px}.ck.ck-list-styles-dropdown>.ck-dropdown__panel>.ck-toolbar{background:none;padding:0}.ck.ck-list-styles-dropdown>.ck-dropdown__panel>.ck-toolbar>.ck-toolbar__items{grid-template-columns:repeat(3,auto);row-gap:var(--ck-spacing-medium);column-gap:var(--ck-spacing-medium);padding:var(--ck-spacing-medium)}.ck.ck-list-styles-dropdown>.ck-dropdown__panel>.ck-toolbar>.ck-toolbar__items .ck-button{width:var(--ck-list-style-button-size);height:var(--ck-list-style-button-size);padding:0;margin:0;box-sizing:content-box}.ck.ck-list-styles-dropdown>.ck-dropdown__panel>.ck-toolbar>.ck-toolbar__items .ck-button .ck-icon{width:var(--ck-list-style-button-size);height:var(--ck-list-style-button-size)}"},function(t,e,i){var n=i(5),o=i(11);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,s);t.exports=o.locals||{}},function(t,e){t.exports=':root{--ck-todo-list-checkmark-size:16px}.ck-content .todo-list{list-style:none}.ck-content .todo-list li{margin-bottom:5px}.ck-content .todo-list li .todo-list{margin-top:5px}.ck-content .todo-list .todo-list__label>input{-webkit-appearance:none;display:inline-block;position:relative;width:var(--ck-todo-list-checkmark-size);height:var(--ck-todo-list-checkmark-size);vertical-align:middle;border:0;left:-25px;margin-right:-15px;right:0;margin-left:0}.ck-content .todo-list .todo-list__label>input:before{display:block;position:absolute;box-sizing:border-box;content:"";width:100%;height:100%;border:1px solid #333;border-radius:2px;transition:box-shadow .25s ease-in-out,background .25s ease-in-out,border .25s ease-in-out}.ck-content .todo-list .todo-list__label>input:after{display:block;position:absolute;box-sizing:content-box;pointer-events:none;content:"";left:calc(var(--ck-todo-list-checkmark-size)/3);top:calc(var(--ck-todo-list-checkmark-size)/5.3);width:calc(var(--ck-todo-list-checkmark-size)/5.3);height:calc(var(--ck-todo-list-checkmark-size)/2.6);border-left:0 solid transparent;border-bottom:calc(var(--ck-todo-list-checkmark-size)/8) solid transparent;border-right:calc(var(--ck-todo-list-checkmark-size)/8) solid transparent;border-top:0 solid transparent;transform:rotate(45deg)}.ck-content .todo-list .todo-list__label>input[checked]:before{background:#26ab33;border-color:#26ab33}.ck-content .todo-list .todo-list__label>input[checked]:after{border-color:#fff}.ck-content .todo-list .todo-list__label .todo-list__label__description{vertical-align:middle}[dir=rtl] .todo-list .todo-list__label>input{left:0;margin-right:0;right:-25px;margin-left:-15px}.ck-editor__editable .todo-list .todo-list__label>input{cursor:pointer}.ck-editor__editable .todo-list .todo-list__label>input:hover:before{box-shadow:0 0 0 5px rgba(0,0,0,.1)}'},function(t,e,i){"use strict";i.r(e),i.d(e,"List",(function(){return D})),i.d(e,"ListEditing",(function(){return M})),i.d(e,"ListUI",(function(){return j})),i.d(e,"ListStyle",(function(){return G})),i.d(e,"ListStyleEditing",(function(){return F})),i.d(e,"ListStyleUI",(function(){return Y})),i.d(e,"TodoList",(function(){return st})),i.d(e,"TodoListEditing",(function(){return nt})),i.d(e,"TodoListUI",(function(){return ot}));var n=i(0),o=i(1);class s extends n.Command{constructor(t,e){super(t),this.type=e}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model,i=e.document,n=Array.from(i.selection.getSelectedBlocks()).filter(t=>l(t,e.schema)),o=void 0!==t.forceValue?!t.forceValue:this.value;e.change(t=>{if(o){let e=n[n.length-1].nextSibling,i=Number.POSITIVE_INFINITY,o=[];for(;e&&"listItem"==e.name&&0!==e.getAttribute("listIndent");){const t=e.getAttribute("listIndent");t<i&&(i=t);const n=t-i;o.push({element:e,listIndent:n}),e=e.nextSibling}o=o.reverse();for(const e of o)t.setAttribute("listIndent",e.listIndent,e.element)}if(!o){let t=Number.POSITIVE_INFINITY;for(const e of n)e.is("element","listItem")&&e.getAttribute("listIndent")<t&&(t=e.getAttribute("listIndent"));t=0===t?1:t,r(n,!0,t),r(n,!1,t)}for(const e of n.reverse())o&&"listItem"==e.name?t.rename(e,"paragraph"):o||"listItem"==e.name?o||"listItem"!=e.name||e.getAttribute("listType")==this.type||t.setAttribute("listType",this.type,e):(t.setAttributes({listType:this.type,listIndent:0},e),t.rename(e,"listItem"));this.fire("_executeCleanup",n)})}_getValue(){const t=Object(o.first)(this.editor.model.document.selection.getSelectedBlocks());return!!t&&t.is("element","listItem")&&t.getAttribute("listType")==this.type}_checkEnabled(){if(this.value)return!0;const t=this.editor.model.document.selection,e=this.editor.model.schema,i=Object(o.first)(t.getSelectedBlocks());return!!i&&l(i,e)}}function r(t,e,i){const n=e?t[0]:t[t.length-1];if(n.is("element","listItem")){let o=n[e?"previousSibling":"nextSibling"],s=n.getAttribute("listIndent");for(;o&&o.is("element","listItem")&&o.getAttribute("listIndent")>=i;)s>o.getAttribute("listIndent")&&(s=o.getAttribute("listIndent")),o.getAttribute("listIndent")==s&&t[e?"unshift":"push"](o),o=o[e?"previousSibling":"nextSibling"]}}function l(t,e){return e.checkChild(t.parent,"listItem")&&!e.isObject(t)}class a extends n.Command{constructor(t,e){super(t),this._indentBy="forward"==e?1:-1}refresh(){this.isEnabled=this._checkEnabled()}execute(){const t=this.editor.model,e=t.document;let i=Array.from(e.selection.getSelectedBlocks());t.change(t=>{const e=i[i.length-1];let n=e.nextSibling;for(;n&&"listItem"==n.name&&n.getAttribute("listIndent")>e.getAttribute("listIndent");)i.push(n),n=n.nextSibling;this._indentBy<0&&(i=i.reverse());for(const e of i){const i=e.getAttribute("listIndent")+this._indentBy;i<0?t.rename(e,"paragraph"):t.setAttribute("listIndent",i,e)}this.fire("_executeCleanup",i)})}_checkEnabled(){const t=Object(o.first)(this.editor.model.document.selection.getSelectedBlocks());if(!t||!t.is("element","listItem"))return!1;if(this._indentBy>0){const e=t.getAttribute("listIndent"),i=t.getAttribute("listType");let n=t.previousSibling;for(;n&&n.is("element","listItem")&&n.getAttribute("listIndent")>=e;){if(n.getAttribute("listIndent")==e)return n.getAttribute("listType")==i;n=n.previousSibling}return!1}return!0}}var c=i(6),d=i(7),u=i(4),m=i(2);function g(t,e){const i=e.mapper,n=e.writer,o="numbered"==t.getAttribute("listType")?"ol":"ul",s=function(t){const e=t.createContainerElement("li");return e.getFillerOffset=A,e}(n),r=n.createContainerElement(o,null);return n.insert(n.createPositionAt(r,0),s),i.bindElements(t,s),s}function p(t,e,i,n){const o=e.parent,s=i.mapper,r=i.writer;let l=s.toViewPosition(n.createPositionBefore(t));const a=b(t.previousSibling,{sameIndent:!0,smallerIndent:!0,listIndent:t.getAttribute("listIndent")}),c=t.previousSibling;if(a&&a.getAttribute("listIndent")==t.getAttribute("listIndent")){const t=s.toViewElement(a);l=r.breakContainer(r.createPositionAfter(t))}else if(c&&"listItem"==c.name){l=s.toViewPosition(n.createPositionAt(c,"end"));const t=s.findMappedViewAncestor(l),e=y(t);l=e?r.createPositionBefore(e):r.createPositionAt(t,"end")}else l=s.toViewPosition(n.createPositionBefore(t));if(l=f(l),r.insert(l,o),c&&"listItem"==c.name){const t=s.toViewElement(c),i=r.createRange(r.createPositionAt(t,0),l).getWalker({ignoreElementEnd:!0});for(const t of i)if(t.item.is("element","li")){const n=r.breakContainer(r.createPositionBefore(t.item)),o=t.item.parent,s=r.createPositionAt(e,"end");h(r,s.nodeBefore,s.nodeAfter),r.move(r.createRangeOn(o),s),i.position=n}}else{const i=o.nextSibling;if(i&&(i.is("element","ul")||i.is("element","ol"))){let n=null;for(const e of i.getChildren()){const i=s.toModelElement(e);if(!(i&&i.getAttribute("listIndent")>t.getAttribute("listIndent")))break;n=e}n&&(r.breakContainer(r.createPositionAfter(n)),r.move(r.createRangeOn(n.parent),r.createPositionAt(e,"end")))}}h(r,o,o.nextSibling),h(r,o.previousSibling,o)}function h(t,e,i){return!e||!i||"ul"!=e.name&&"ol"!=e.name||e.name!=i.name||e.getAttribute("class")!==i.getAttribute("class")?null:t.mergeContainers(t.createPositionAfter(e))}function f(t){return t.getLastMatchingPosition(t=>t.item.is("uiElement"))}function b(t,e){const i=!!e.sameIndent,n=!!e.smallerIndent,o=e.listIndent;let s=t;for(;s&&"listItem"==s.name;){const t=s.getAttribute("listIndent");if(i&&o==t||n&&o>t)return s;s="forward"===e.direction?s.nextSibling:s.previousSibling}return null}function v(t,e,i,n){t.ui.componentFactory.add(e,o=>{const s=t.commands.get(e),r=new m.ButtonView(o);return r.set({label:i,icon:n,tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(s,"value","isEnabled"),r.on("execute",()=>{t.execute(e),t.editing.view.focus()}),r})}function y(t){for(const e of t.getChildren())if("ul"==e.name||"ol"==e.name)return e;return null}function w(t,e){const i=[],n=t.parent,o={ignoreElementEnd:!0,startPosition:t,shallow:!0,direction:e},s=n.getAttribute("listIndent"),r=[...new u.TreeWalker(o)].filter(t=>t.item.is("element")).map(t=>t.item);for(const t of r){if(!t.is("element","listItem"))break;if(t.getAttribute("listIndent")<s)break;if(!(t.getAttribute("listIndent")>s)){if(t.getAttribute("listType")!==n.getAttribute("listType"))break;if(t.getAttribute("listStyle")!==n.getAttribute("listStyle"))break;"backward"===e?i.unshift(t):i.push(t)}}return i}function A(){const t=!this.isEmpty&&("ul"==this.getChild(0).name||"ol"==this.getChild(0).name);return this.isEmpty||t?0:u.getFillerOffset.call(this)}function I(t){return(e,i,n)=>{const o=n.consumable;if(!o.test(i.item,"insert")||!o.test(i.item,"attribute:listType")||!o.test(i.item,"attribute:listIndent"))return;o.consume(i.item,"insert"),o.consume(i.item,"attribute:listType"),o.consume(i.item,"attribute:listIndent");const s=i.item;p(s,g(s,n),n,t)}}function k(t,e,i){if(!i.consumable.consume(e.item,"attribute:listType"))return;const n=i.mapper.toViewElement(e.item),o=i.writer;o.breakContainer(o.createPositionBefore(n)),o.breakContainer(o.createPositionAfter(n));const s=n.parent,r="numbered"==e.attributeNewValue?"ol":"ul";o.rename(r,s)}function S(t,e,i){const n=i.mapper.toViewElement(e.item).parent,o=i.writer;h(o,n,n.nextSibling),h(o,n.previousSibling,n);for(const t of e.item.getChildren())i.consumable.consume(t,"insert")}function x(t,e,i){if("listItem"!=e.item.name){let t=i.mapper.toViewPosition(e.range.start);const n=i.writer,o=[];for(;("ul"==t.parent.name||"ol"==t.parent.name)&&(t=n.breakContainer(t),"li"==t.parent.name);){const e=t,i=n.createPositionAt(t.parent,"end");if(!e.isEqual(i)){const t=n.remove(n.createRange(e,i));o.push(t)}t=n.createPositionAfter(t.parent)}if(o.length>0){for(let e=0;e<o.length;e++){const i=t.nodeBefore;if(t=n.insert(t,o[e]).end,e>0){const e=h(n,i,i.nextSibling);e&&e.parent==i&&t.offset--}}h(n,t.nodeBefore,t.nodeAfter)}}}function T(t,e,i){const n=i.mapper.toViewPosition(e.position),o=n.nodeBefore,s=n.nodeAfter;h(i.writer,o,s)}function z(t,e,i){if(i.consumable.consume(e.viewItem,{name:!0})){const t=i.writer,n=t.createElement("listItem"),o=function(t){let e=0,i=t.parent;for(;i;){if(i.is("element","li"))e++;else{const t=i.previousSibling;t&&t.is("element","li")&&e++}i=i.parent}return e}(e.viewItem);t.setAttribute("listIndent",o,n);const s=e.viewItem.parent&&"ol"==e.viewItem.parent.name?"numbered":"bulleted";if(t.setAttribute("listType",s,n),!i.safeInsert(n,e.modelCursor))return;const r=function(t,e,i){const{writer:n,schema:o}=i;let s=n.createPositionAfter(t);for(const r of e)if("ul"==r.name||"ol"==r.name)s=i.convertItem(r,s).modelCursor;else{const e=i.convertItem(r,n.createPositionAt(t,"end")),l=e.modelRange.start.nodeAfter;l&&l.is("element")&&!o.checkChild(t,l.name)&&(t=e.modelCursor.parent.is("element","listItem")?e.modelCursor.parent:V(e.modelCursor),s=n.createPositionAfter(t))}return s}(n,e.viewItem.getChildren(),i);e.modelRange=t.createRange(e.modelCursor,r),i.updateConversionResult(n,e)}}function C(t,e,i){if(i.consumable.test(e.viewItem,{name:!0})){const t=Array.from(e.viewItem.getChildren());for(const e of t){!(e.is("element","li")||B(e))&&e._remove()}}}function _(t,e,i){if(i.consumable.test(e.viewItem,{name:!0})){if(0===e.viewItem.childCount)return;const t=[...e.viewItem.getChildren()];let i=!1,n=!0;for(const e of t)i&&!B(e)&&e._remove(),e.is("$text")?(n&&(e._data=e.data.trimStart()),e.nextSibling&&!B(e.nextSibling)||(e._data=e.data.trimEnd())):B(e)&&(i=!0),n=!1}}function L(t){return(e,i)=>{if(i.isPhantom)return;const n=i.modelPosition.nodeBefore;if(n&&n.is("element","listItem")){const e=i.mapper.toViewElement(n),o=e.getAncestors().find(B),s=t.createPositionAt(e,0).getWalker();for(const t of s){if("elementStart"==t.type&&t.item.is("element","li")){i.viewPosition=t.previousPosition;break}if("elementEnd"==t.type&&t.item==o){i.viewPosition=t.nextPosition;break}}}}}function P(t,[e,i]){let n,o=e.is("documentFragment")?e.getChild(0):e;if(n=i?this.createSelection(i):this.document.selection,o&&o.is("element","listItem")){const t=n.getFirstPosition();let e=null;if(t.parent.is("element","listItem")?e=t.parent:t.nodeBefore&&t.nodeBefore.is("element","listItem")&&(e=t.nodeBefore),e){const t=e.getAttribute("listIndent");if(t>0)for(;o&&o.is("element","listItem");)o._setAttribute("listIndent",o.getAttribute("listIndent")+t),o=o.nextSibling}}}function V(t){const e=new u.TreeWalker({startPosition:t});let i;do{i=e.next()}while(!i.value.item.is("element","listItem"));return i.value.item}function E(t,e,i,n,o,s){const r=b(e.nodeBefore,{sameIndent:!0,smallerIndent:!0,listIndent:t,foo:"b"}),l=o.mapper,a=o.writer,c=r?r.getAttribute("listIndent"):null;let d;if(r)if(c==t){const t=l.toViewElement(r).parent;d=a.createPositionAfter(t)}else{const t=s.createPositionAt(r,"end");d=l.toViewPosition(t)}else d=i;d=f(d);for(const t of[...n.getChildren()])B(t)&&(d=a.move(a.createRangeOn(t),d).end,h(a,t,t.nextSibling),h(a,t.previousSibling,t))}function B(t){return t.is("element","ol")||t.is("element","ul")}class M extends n.Plugin{static get pluginName(){return"ListEditing"}static get requires(){return[c.Enter,d.Delete]}init(){const t=this.editor;t.model.schema.register("listItem",{inheritAllFrom:"$block",allowAttributes:["listType","listIndent"]});const e=t.data,i=t.editing;var n;t.model.document.registerPostFixer(e=>function(t,e){const i=t.document.differ.getChanges(),n=new Map;let o=!1;for(const n of i)if("insert"==n.type&&"listItem"==n.name)s(n.position);else if("insert"==n.type&&"listItem"!=n.name){if("$text"!=n.name){const i=n.position.nodeAfter;i.hasAttribute("listIndent")&&(e.removeAttribute("listIndent",i),o=!0),i.hasAttribute("listType")&&(e.removeAttribute("listType",i),o=!0),i.hasAttribute("listStyle")&&(e.removeAttribute("listStyle",i),o=!0);for(const e of Array.from(t.createRangeIn(i)).filter(t=>t.item.is("element","listItem")))s(e.previousPosition)}s(n.position.getShiftedBy(n.length))}else"remove"==n.type&&"listItem"==n.name?s(n.position):("attribute"==n.type&&"listIndent"==n.attributeKey||"attribute"==n.type&&"listType"==n.attributeKey)&&s(n.range.start);for(const t of n.values())r(t),l(t);return o;function s(t){const e=t.nodeBefore;if(e&&e.is("element","listItem")){let t=e;if(n.has(t))return;for(let e=t.previousSibling;e&&e.is("element","listItem");e=t.previousSibling)if(t=e,n.has(t))return;n.set(e,t)}else{const e=t.nodeAfter;e&&e.is("element","listItem")&&n.set(e,e)}}function r(t){let i=0,n=null;for(;t&&t.is("element","listItem");){const s=t.getAttribute("listIndent");if(s>i){let r;null===n?(n=s-i,r=i):(n>s&&(n=s),r=s-n),e.setAttribute("listIndent",r,t),o=!0}else n=null,i=t.getAttribute("listIndent")+1;t=t.nextSibling}}function l(t){let i=[],n=null;for(;t&&t.is("element","listItem");){const s=t.getAttribute("listIndent");if(n&&n.getAttribute("listIndent")>s&&(i=i.slice(0,s+1)),0!=s)if(i[s]){const n=i[s];t.getAttribute("listType")!=n&&(e.setAttribute("listType",n,t),o=!0)}else i[s]=t.getAttribute("listType");n=t,t=t.nextSibling}}}(t.model,e)),i.mapper.registerViewToModelLength("li",H),e.mapper.registerViewToModelLength("li",H),i.mapper.on("modelToViewPosition",L(i.view)),i.mapper.on("viewToModelPosition",(n=t.model,(t,e)=>{const i=e.viewPosition,o=i.parent,s=e.mapper;if("ul"==o.name||"ol"==o.name){if(i.isAtEnd){const t=s.toModelElement(i.nodeBefore),o=s.getModelLength(i.nodeBefore);e.modelPosition=n.createPositionBefore(t).getShiftedBy(o)}else{const t=s.toModelElement(i.nodeAfter);e.modelPosition=n.createPositionBefore(t)}t.stop()}else if("li"==o.name&&i.nodeBefore&&("ul"==i.nodeBefore.name||"ol"==i.nodeBefore.name)){const r=s.toModelElement(o);let l=1,a=i.nodeBefore;for(;a&&B(a);)l+=s.getModelLength(a),a=a.previousSibling;e.modelPosition=n.createPositionBefore(r).getShiftedBy(l),t.stop()}})),e.mapper.on("modelToViewPosition",L(i.view)),t.conversion.for("editingDowncast").add(e=>{e.on("insert",x,{priority:"high"}),e.on("insert:listItem",I(t.model)),e.on("attribute:listType:listItem",k,{priority:"high"}),e.on("attribute:listType:listItem",S,{priority:"low"}),e.on("attribute:listIndent:listItem",function(t){return(e,i,n)=>{if(!n.consumable.consume(i.item,"attribute:listIndent"))return;const o=n.mapper.toViewElement(i.item),s=n.writer;s.breakContainer(s.createPositionBefore(o)),s.breakContainer(s.createPositionAfter(o));const r=o.parent,l=r.previousSibling,a=s.createRangeOn(r);s.remove(a),l&&l.nextSibling&&h(s,l,l.nextSibling),E(i.attributeOldValue+1,i.range.start,a.start,o,n,t),p(i.item,o,n,t);for(const t of i.item.getChildren())n.consumable.consume(t,"insert")}}(t.model)),e.on("remove:listItem",function(t){return(e,i,n)=>{const o=n.mapper.toViewPosition(i.position).getLastMatchingPosition(t=>!t.item.is("element","li")).nodeAfter,s=n.writer;s.breakContainer(s.createPositionBefore(o)),s.breakContainer(s.createPositionAfter(o));const r=o.parent,l=r.previousSibling,a=s.createRangeOn(r),c=s.remove(a);l&&l.nextSibling&&h(s,l,l.nextSibling);E(n.mapper.toModelElement(o).getAttribute("listIndent")+1,i.position,a.start,o,n,t);for(const t of s.createRangeIn(c).getItems())n.mapper.unbindViewElement(t);e.stop()}}(t.model)),e.on("remove",T,{priority:"low"})}),t.conversion.for("dataDowncast").add(e=>{e.on("insert",x,{priority:"high"}),e.on("insert:listItem",I(t.model))}),t.conversion.for("upcast").add(t=>{t.on("element:ul",C,{priority:"high"}),t.on("element:ol",C,{priority:"high"}),t.on("element:li",_,{priority:"high"}),t.on("element:li",z)}),t.model.on("insertContent",P,{priority:"high"}),t.commands.add("numberedList",new s(t,"numbered")),t.commands.add("bulletedList",new s(t,"bulleted")),t.commands.add("indentList",new a(t,"forward")),t.commands.add("outdentList",new a(t,"backward"));const o=i.view.document;this.listenTo(o,"enter",(t,e)=>{const i=this.editor.model.document,n=i.selection.getLastPosition().parent;i.selection.isCollapsed&&"listItem"==n.name&&n.isEmpty&&(this.editor.execute("outdentList"),e.preventDefault(),t.stop())},{context:"li"}),this.listenTo(o,"delete",(t,e)=>{if("backward"!==e.direction)return;const i=this.editor.model.document.selection;if(!i.isCollapsed)return;const n=i.getFirstPosition();if(!n.isAtStart)return;const o=n.parent;if("listItem"!==o.name)return;o.previousSibling&&"listItem"===o.previousSibling.name||(this.editor.execute("outdentList"),e.preventDefault(),t.stop())},{context:"li"});const r=t=>(e,i)=>{this.editor.commands.get(t).isEnabled&&(this.editor.execute(t),i())};t.keystrokes.set("Tab",r("indentList")),t.keystrokes.set("Shift+Tab",r("outdentList"))}afterInit(){const t=this.editor.commands,e=t.get("indent"),i=t.get("outdent");e&&e.registerChildCommand(t.get("indentList")),i&&i.registerChildCommand(t.get("outdentList"))}}function H(t){let e=1;for(const i of t.getChildren())if("ul"==i.name||"ol"==i.name)for(const t of i.getChildren())e+=H(t);return e}var N='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5.75c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM3.5 3v5H2V3.7H1v-1h2.5V3zM.343 17.857l2.59-3.257H2.92a.6.6 0 1 0-1.04 0H.302a2 2 0 1 1 3.995 0h-.001c-.048.405-.16.734-.333.988-.175.254-.59.692-1.244 1.312H4.3v1h-4l.043-.043zM7 14.75a.75.75 0 0 1 .75-.75h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75z"/></svg>',O='<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5.75c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zm-6 0C1 4.784 1.777 4 2.75 4c.966 0 1.75.777 1.75 1.75 0 .966-.777 1.75-1.75 1.75C1.784 7.5 1 6.723 1 5.75zm6 9c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zm-6 0c0-.966.777-1.75 1.75-1.75.966 0 1.75.777 1.75 1.75 0 .966-.777 1.75-1.75 1.75-.966 0-1.75-.777-1.75-1.75z"/></svg>';class j extends n.Plugin{static get pluginName(){return"ListUI"}init(){const t=this.editor.t;v(this.editor,"numberedList",t("Numbered List"),N),v(this.editor,"bulletedList",t("Bulleted List"),O)}}class D extends n.Plugin{static get requires(){return[M,j]}static get pluginName(){return"List"}}class R extends n.Command{constructor(t,e){super(t),this._defaultType=e}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model;let i=[...e.document.selection.getSelectedBlocks()].filter(t=>t.is("element","listItem")).map(t=>{const i=e.change(e=>e.createPositionAt(t,0));return[...w(i,"backward"),...w(i,"forward")]}).flat();i=[...new Set(i)],i.length&&e.change(e=>{for(const n of i)e.setAttribute("listStyle",t.type||this._defaultType,n)})}_getValue(){const t=this.editor.model.document.selection.getFirstPosition().parent;return t&&t.is("element","listItem")?t.getAttribute("listStyle"):null}_checkEnabled(){const t=this.editor,e=t.commands.get("numberedList"),i=t.commands.get("bulletedList");return e.isEnabled||i.isEnabled}}class F extends n.Plugin{static get requires(){return[M]}static get pluginName(){return"ListStyleEditing"}init(){const t=this.editor,e=t.model;e.schema.extend("listItem",{allowAttributes:["listStyle"]}),t.commands.add("listStyle",new R(t,"default")),this.listenTo(t.commands.get("indentList"),"_executeCleanup",function(t){return(e,i)=>{let n;const o=i[0],s=o.getAttribute("listIndent"),r=i.filter(t=>t.getAttribute("listIndent")===s);if(o.previousSibling.getAttribute("listIndent")+1===s)n="default";else{const t=b(o.previousSibling,{sameIndent:!0,direction:"backward",listIndent:s});n=t.getAttribute("listStyle")}t.model.change(t=>{for(const e of r)t.setAttribute("listStyle",n,e)})}}(t)),this.listenTo(t.commands.get("outdentList"),"_executeCleanup",function(t){return(e,i)=>{if(!(i=i.reverse().filter(t=>t.is("element","listItem"))).length)return;const n=i[0].getAttribute("listIndent"),o=i[0].getAttribute("listType");let s=i[0].previousSibling;if(s.is("element","listItem"))for(;s.getAttribute("listIndent")!==n;)s=s.previousSibling;else s=null;s||(s=i[i.length-1].nextSibling),s&&s.is("element","listItem")&&s.getAttribute("listType")===o&&t.model.change(t=>{const e=i.filter(t=>t.getAttribute("listIndent")===n);for(const i of e)t.setAttribute("listStyle",s.getAttribute("listStyle"),i)})}}(t)),this.listenTo(t.commands.get("bulletedList"),"_executeCleanup",K(t)),this.listenTo(t.commands.get("numberedList"),"_executeCleanup",K(t)),e.document.registerPostFixer(function(t){return e=>{let i=!1;const n=W(t.model.document.differ.getChanges()).filter(t=>"todo"!==t.getAttribute("listType"));if(!n.length)return i;let o=n[n.length-1].nextSibling;if((!o||!o.is("element","listItem"))&&(o=n[n.length-1].previousSibling,o)){const t=n[0].getAttribute("listIndent");for(;o.is("element","listItem")&&o.getAttribute("listIndent")!==t&&(o=o.previousSibling,o););}for(const t of n)if(t.hasAttribute("listStyle")){const n=t.previousSibling;U(n,t)&&(e.setAttribute("listStyle",n.getAttribute("listStyle"),t),i=!0)}else q(o,t)?e.setAttribute("listStyle",o.getAttribute("listStyle"),t):e.setAttribute("listStyle","default",t),i=!0;return i}}(t)),t.conversion.for("upcast").add(t=>{t.on("element:li",(t,e,i)=>{const n=e.viewItem.parent;if(!n)return;const o=n.getStyle("list-style-type")||"default",s=e.modelRange.start.nodeAfter||e.modelRange.end.nodeBefore;i.writer.setAttribute("listStyle",o,s)},{priority:"low"})}),t.conversion.for("downcast").add(t=>{t.on("attribute:listStyle:listItem",(t,e,i)=>{const n=i.writer,o=e.item,s=b(o.previousSibling,{sameIndent:!0,listIndent:o.getAttribute("listIndent"),direction:"backward"}),r=i.mapper.toViewElement(o);var l,a,c,d,u;l=o,(a=s)&&l.getAttribute("listType")===a.getAttribute("listType")&&l.getAttribute("listIndent")===a.getAttribute("listIndent")&&l.getAttribute("listStyle")===a.getAttribute("listStyle")||n.breakContainer(n.createPositionBefore(r)),c=n,d=e.attributeNewValue,u=r.parent,d&&"default"!==d?c.setStyle("list-style-type",d,u):c.removeStyle("list-style-type",u)},{priority:"low"})}),this._mergeListStyleAttributeWhileMergingLists()}afterInit(){const t=this.editor;t.commands.get("todoList")&&t.model.document.registerPostFixer(function(t){return e=>{const i=W(t.model.document.differ.getChanges()).filter(t=>"todo"===t.getAttribute("listType")&&t.hasAttribute("listStyle"));if(!i.length)return!1;for(const t of i)e.removeAttribute("listStyle",t);return!0}}(t))}_mergeListStyleAttributeWhileMergingLists(){const t=this.editor.model;let e;this.listenTo(t,"deleteContent",(t,[i])=>{const n=i.getFirstPosition(),o=i.getLastPosition();if(n.parent===o.parent)return;if(!n.parent.is("element","listItem"))return;const s=o.parent.nextSibling;if(!s||!s.is("element","listItem"))return;const r=b(n.parent,{sameIndent:!0,listIndent:s.getAttribute("listIndent")});r&&r.getAttribute("listType")===s.getAttribute("listType")&&(e=r)},{priority:"high"}),this.listenTo(t,"deleteContent",()=>{e&&(t.change(t=>{const i=b(e.nextSibling,{sameIndent:!0,listIndent:e.getAttribute("listIndent"),direction:"forward"}),n=[i,...w(t.createPositionAt(i,0),"forward")];for(const i of n)t.setAttribute("listStyle",e.getAttribute("listStyle"),i)}),e=null)},{priority:"low"})}}function q(t,e){if(!t)return!1;const i=t.getAttribute("listStyle");return!!i&&("default"!==i&&t.getAttribute("listType")===e.getAttribute("listType"))}function U(t,e){if(!t||!t.is("element","listItem"))return!1;if(e.getAttribute("listType")!==t.getAttribute("listType"))return!1;const i=t.getAttribute("listIndent");if(i<1||i!==e.getAttribute("listIndent"))return!1;const n=t.getAttribute("listStyle");return!(!n||n===e.getAttribute("listStyle"))}function K(t){return(e,i)=>{i=i.filter(t=>t.is("element","listItem")),t.model.change(t=>{for(const e of i)t.removeAttribute("listStyle",e)})}}function W(t){const e=[];for(const i of t){const t=$(i);t&&t.is("element","listItem")&&e.push(t)}return e}function $(t){return"attribute"===t.type?t.range.start.nodeAfter:"insert"===t.type?t.position.nodeAfter:null}i(8);class Y extends n.Plugin{static get pluginName(){return"ListStyleUI"}init(){const t=this.editor,e=t.locale.t;t.ui.componentFactory.add("bulletedList",J({editor:t,parentCommandName:"bulletedList",buttonLabel:e("Bulleted List"),buttonIcon:O,toolbarAriaLabel:e("Bulleted list styles toolbar"),styleDefinitions:[{label:e("Toggle the disc list style"),tooltip:e("Disc"),type:"disc",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M11 27a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm0-9a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm0-9a3 3 0 1 1 0 6 3 3 0 0 1 0-6z"/></svg>'},{label:e("Toggle the circle list style"),tooltip:e("Circle"),type:"circle",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M11 27a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm0 1a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm0-10a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm0 1a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm0-10a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm0 1a2 2 0 1 0 0 4 2 2 0 0 0 0-4z"/></svg>'},{label:e("Toggle the square list style"),tooltip:e("Square"),type:"square",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M14 27v6H8v-6h6zm0-9v6H8v-6h6zm0-9v6H8V9h6z"/></svg>'}]})),t.ui.componentFactory.add("numberedList",J({editor:t,parentCommandName:"numberedList",buttonLabel:e("Numbered List"),buttonIcon:N,toolbarAriaLabel:e("Numbered list styles toolbar"),styleDefinitions:[{label:e("Toggle the decimal list style"),tooltip:e("Decimal"),type:"decimal",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M10.29 15V8.531H9.286c-.14.393-.4.736-.778 1.03-.378.295-.728.495-1.05.6v1.121a4.257 4.257 0 0 0 1.595-.936V15h1.235zm3.343 0v-1.235h-1.235V15h1.235zM11.3 24v-1.147H8.848c.064-.111.148-.226.252-.343.104-.117.351-.354.74-.712.39-.357.66-.631.81-.821.225-.288.39-.562.494-.824.104-.263.156-.539.156-.829 0-.51-.182-.936-.545-1.279-.363-.342-.863-.514-1.499-.514-.58 0-1.063.148-1.45.444-.387.296-.617.784-.69 1.463l1.23.124c.024-.36.112-.619.264-.774.153-.155.358-.233.616-.233.26 0 .465.074.613.222.148.148.222.36.222.635 0 .25-.085.501-.255.756-.126.185-.468.536-1.024 1.055-.692.641-1.155 1.156-1.389 1.544-.234.389-.375.8-.422 1.233H11.3zm2.333 0v-1.235h-1.235V24h1.235zM9.204 34.11c.615 0 1.129-.2 1.542-.598.413-.398.62-.88.62-1.446 0-.39-.11-.722-.332-.997a1.5 1.5 0 0 0-.886-.532c.619-.337.928-.788.928-1.353 0-.399-.151-.756-.453-1.073-.366-.386-.852-.58-1.459-.58a2.25 2.25 0 0 0-.96.2 1.617 1.617 0 0 0-.668.55c-.16.232-.28.544-.358.933l1.138.194c.032-.282.123-.495.272-.642.15-.146.33-.22.54-.22.215 0 .386.065.515.194s.193.302.193.518c0 .255-.087.46-.263.613-.176.154-.43.227-.765.218l-.136 1.006c.22-.061.409-.092.567-.092.24 0 .444.09.61.272.168.182.251.428.251.739 0 .328-.087.589-.261.782a.833.833 0 0 1-.644.29.841.841 0 0 1-.607-.242c-.167-.16-.27-.394-.307-.698l-1.196.145c.062.542.285.98.668 1.316.384.335.868.503 1.45.503zm4.43-.11v-1.235h-1.236V34h1.235z"/></svg>'},{label:e("Toggle the decimal with leading zero list style"),tooltip:e("Decimal with leading zero"),type:"decimal-leading-zero",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M5.714 15.11c.624 0 1.11-.22 1.46-.66.421-.533.632-1.408.632-2.627 0-1.222-.21-2.096-.629-2.624-.351-.445-.839-.668-1.463-.668-.624 0-1.11.22-1.459.66-.422.533-.633 1.406-.633 2.619 0 1.236.192 2.095.576 2.577.384.482.89.723 1.516.723zm0-1.024a.614.614 0 0 1-.398-.14c-.115-.094-.211-.283-.287-.565-.077-.283-.115-.802-.115-1.558s.043-1.294.128-1.613c.064-.246.155-.417.272-.512a.617.617 0 0 1 .4-.143.61.61 0 0 1 .398.143c.116.095.211.284.288.567.076.283.114.802.114 1.558s-.043 1.292-.128 1.608c-.064.246-.155.417-.272.512a.617.617 0 0 1-.4.143zm6.078.914V8.531H10.79c-.14.393-.4.736-.778 1.03-.378.295-.728.495-1.05.6v1.121a4.257 4.257 0 0 0 1.595-.936V15h1.235zm3.344 0v-1.235h-1.235V15h1.235zm-9.422 9.11c.624 0 1.11-.22 1.46-.66.421-.533.632-1.408.632-2.627 0-1.222-.21-2.096-.629-2.624-.351-.445-.839-.668-1.463-.668-.624 0-1.11.22-1.459.66-.422.533-.633 1.406-.633 2.619 0 1.236.192 2.095.576 2.577.384.482.89.723 1.516.723zm0-1.024a.614.614 0 0 1-.398-.14c-.115-.094-.211-.283-.287-.565-.077-.283-.115-.802-.115-1.558s.043-1.294.128-1.613c.064-.246.155-.417.272-.512a.617.617 0 0 1 .4-.143.61.61 0 0 1 .398.143c.116.095.211.284.288.567.076.283.114.802.114 1.558s-.043 1.292-.128 1.608c-.064.246-.155.417-.272.512a.617.617 0 0 1-.4.143zm7.088.914v-1.147H10.35c.065-.111.149-.226.253-.343.104-.117.35-.354.74-.712.39-.357.66-.631.81-.821.225-.288.39-.562.493-.824.104-.263.156-.539.156-.829 0-.51-.181-.936-.544-1.279-.364-.342-.863-.514-1.499-.514-.58 0-1.063.148-1.45.444-.387.296-.617.784-.69 1.463l1.23.124c.024-.36.112-.619.264-.774.152-.155.357-.233.615-.233.261 0 .465.074.613.222.148.148.222.36.222.635 0 .25-.085.501-.255.756-.126.185-.467.536-1.024 1.055-.691.641-1.154 1.156-1.388 1.544-.235.389-.375.8-.422 1.233h4.328zm2.334 0v-1.235h-1.235V24h1.235zM5.714 34.11c.624 0 1.11-.22 1.46-.66.421-.533.632-1.408.632-2.627 0-1.222-.21-2.096-.629-2.624-.351-.445-.839-.668-1.463-.668-.624 0-1.11.22-1.459.66-.422.533-.633 1.406-.633 2.619 0 1.236.192 2.095.576 2.577.384.482.89.723 1.516.723zm0-1.024a.614.614 0 0 1-.398-.14c-.115-.094-.211-.283-.287-.565-.077-.283-.115-.802-.115-1.558s.043-1.294.128-1.613c.064-.246.155-.417.272-.512a.617.617 0 0 1 .4-.143.61.61 0 0 1 .398.143c.116.095.211.284.288.567.076.283.114.802.114 1.558s-.043 1.292-.128 1.608c-.064.246-.155.417-.272.512a.617.617 0 0 1-.4.143zm4.992 1.024c.616 0 1.13-.2 1.543-.598.413-.398.62-.88.62-1.446 0-.39-.111-.722-.332-.997a1.5 1.5 0 0 0-.886-.532c.618-.337.927-.788.927-1.353 0-.399-.15-.756-.452-1.073-.366-.386-.853-.58-1.46-.58a2.25 2.25 0 0 0-.96.2 1.617 1.617 0 0 0-.667.55c-.16.232-.28.544-.359.933l1.139.194c.032-.282.123-.495.272-.642.15-.146.33-.22.54-.22.214 0 .386.065.515.194s.193.302.193.518c0 .255-.088.46-.264.613-.175.154-.43.227-.764.218l-.136 1.006c.22-.061.408-.092.566-.092.24 0 .444.09.611.272.167.182.25.428.25.739 0 .328-.086.589-.26.782a.833.833 0 0 1-.644.29.841.841 0 0 1-.607-.242c-.167-.16-.27-.394-.308-.698l-1.195.145c.062.542.284.98.668 1.316.384.335.867.503 1.45.503zm4.43-.11v-1.235h-1.235V34h1.235z"/></svg>'},{label:e("Toggle the lower–roman list style"),tooltip:e("Lower–roman"),type:"lower-roman",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M11.88 8.7V7.558h-1.234V8.7h1.234zm0 5.3V9.333h-1.234V14h1.234zm2.5 0v-1.235h-1.234V14h1.235zm-4.75 4.7v-1.142H8.395V18.7H9.63zm0 5.3v-4.667H8.395V24H9.63zm2.5-5.3v-1.142h-1.234V18.7h1.235zm0 5.3v-4.667h-1.234V24h1.235zm2.501 0v-1.235h-1.235V24h1.235zM7.38 28.7v-1.142H6.145V28.7H7.38zm0 5.3v-4.667H6.145V34H7.38zm2.5-5.3v-1.142H8.646V28.7H9.88zm0 5.3v-4.667H8.646V34H9.88zm2.5-5.3v-1.142h-1.234V28.7h1.235zm0 5.3v-4.667h-1.234V34h1.235zm2.501 0v-1.235h-1.235V34h1.235z"/></svg>'},{label:e("Toggle the upper–roman list style"),tooltip:e("Upper-roman"),type:"upper-roman",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M11.916 15V8.558h-1.301V15h1.3zm2.465 0v-1.235h-1.235V15h1.235zM9.665 25v-6.442h-1.3V25h1.3zm2.5 0v-6.442h-1.3V25h1.3zm2.466 0v-1.235h-1.235V25h1.235zm-7.216 9v-6.442h-1.3V34h1.3zm2.5 0v-6.442h-1.3V34h1.3zm2.501 0v-6.442h-1.3V34h1.3zm2.465 0v-1.235h-1.235V34h1.235z"/></svg>'},{label:e("Toggle the lower–latin list style"),tooltip:e("Lower-latin"),type:"lower-latin",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="M9.62 14.105c.272 0 .528-.05.768-.153s.466-.257.677-.462c.009.024.023.072.044.145.047.161.086.283.119.365h1.221a2.649 2.649 0 0 1-.222-.626c-.04-.195-.059-.498-.059-.908l.013-1.441c0-.536-.055-.905-.165-1.105-.11-.201-.3-.367-.569-.497-.27-.13-.68-.195-1.23-.195-.607 0-1.064.108-1.371.325-.308.217-.525.55-.65 1.002l1.12.202c.076-.217.176-.369.299-.455.123-.086.294-.13.514-.13.325 0 .546.05.663.152.118.101.176.27.176.508v.123c-.222.093-.622.194-1.2.303-.427.082-.755.178-.982.288-.227.11-.403.268-.53.474a1.327 1.327 0 0 0-.188.706c0 .398.138.728.415.988.277.261.656.391 1.136.391zm.368-.87a.675.675 0 0 1-.492-.189.606.606 0 0 1-.193-.448c0-.176.08-.32.241-.435.106-.07.33-.142.673-.215a7.19 7.19 0 0 0 .751-.19v.247c0 .296-.016.496-.048.602a.773.773 0 0 1-.295.409 1.07 1.07 0 0 1-.637.22zm4.645.765v-1.235h-1.235V14h1.235zM10.2 25.105c.542 0 1.003-.215 1.382-.646.38-.43.57-1.044.57-1.84 0-.771-.187-1.362-.559-1.774a1.82 1.82 0 0 0-1.41-.617c-.522 0-.973.216-1.354.65v-2.32H7.594V25h1.147v-.686a1.9 1.9 0 0 0 .67.592c.26.133.523.2.79.2zm-.299-.975c-.354 0-.638-.164-.852-.492-.153-.232-.229-.59-.229-1.073 0-.468.098-.818.295-1.048a.93.93 0 0 1 .738-.345c.302 0 .55.118.743.354.193.236.29.62.29 1.154 0 .5-.096.868-.288 1.1-.192.233-.424.35-.697.35zm4.478.87v-1.235h-1.234V25h1.234zm-4.017 9.105c.6 0 1.08-.142 1.437-.426.357-.284.599-.704.725-1.261l-1.213-.207c-.061.326-.167.555-.316.688a.832.832 0 0 1-.576.2.916.916 0 0 1-.75-.343c-.185-.228-.278-.62-.278-1.173 0-.498.091-.853.274-1.066.183-.212.429-.318.736-.318.232 0 .42.061.565.184.145.123.238.306.28.55l1.216-.22c-.146-.501-.387-.874-.722-1.119-.336-.244-.788-.366-1.356-.366-.695 0-1.245.214-1.653.643-.407.43-.61 1.03-.61 1.8 0 .762.202 1.358.608 1.788.406.431.95.646 1.633.646zM14.633 34v-1.235h-1.235V34h1.235z"/></svg>'},{label:e("Toggle the upper–latin list style"),tooltip:e("Upper-latin"),type:"upper-latin",icon:'<svg viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg"><path d="M35 29a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17zm0-9a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H18a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h17z" fill-opacity=".163"/><path d="m7.88 15 .532-1.463h2.575L11.549 15h1.415l-2.58-6.442H9.01L6.5 15h1.38zm2.69-2.549H8.811l.87-2.39.887 2.39zM14.88 15v-1.235h-1.234V15h1.234zM9.352 25c.83-.006 1.352-.02 1.569-.044.346-.038.636-.14.872-.305.236-.166.422-.387.558-.664.137-.277.205-.562.205-.855 0-.372-.106-.695-.317-.97-.21-.276-.512-.471-.905-.585a1.51 1.51 0 0 0 .661-.567 1.5 1.5 0 0 0 .244-.83c0-.28-.066-.53-.197-.754a1.654 1.654 0 0 0-.495-.539 1.676 1.676 0 0 0-.672-.266c-.25-.042-.63-.063-1.14-.063H7.158V25h2.193zm.142-3.88H8.46v-1.49h.747c.612 0 .983.007 1.112.022.217.026.38.102.49.226.11.125.165.287.165.486a.68.68 0 0 1-.192.503.86.86 0 0 1-.525.23 11.47 11.47 0 0 1-.944.023h.18zm.17 2.795H8.46v-1.723h1.05c.592 0 .977.03 1.154.092.177.062.313.16.406.295a.84.84 0 0 1 .14.492c0 .228-.06.41-.181.547a.806.806 0 0 1-.473.257c-.126.026-.423.04-.892.04zM14.88 25v-1.235h-1.234V25h1.234zm-5.018 9.11c.691 0 1.262-.17 1.711-.512.45-.341.772-.864.965-1.567l-1.261-.4c-.109.472-.287.818-.536 1.037-.25.22-.547.33-.892.33-.47 0-.85-.173-1.143-.519-.293-.345-.44-.925-.44-1.74 0-.767.15-1.322.447-1.665.297-.343.684-.514 1.162-.514.346 0 .64.096.881.29.242.193.4.457.477.79l1.288-.307c-.147-.516-.367-.911-.66-1.187-.492-.465-1.132-.698-1.92-.698-.902 0-1.63.296-2.184.89-.554.593-.83 1.426-.83 2.498 0 1.014.275 1.813.825 2.397.551.585 1.254.877 2.11.877zM14.88 34v-1.235h-1.234V34h1.234z"/></svg>'}]}))}}function J({editor:t,parentCommandName:e,buttonLabel:i,buttonIcon:n,toolbarAriaLabel:o,styleDefinitions:s}){const r=t.commands.get(e),l=t.commands.get("listStyle");return a=>{const c=Object(m.createDropdown)(a,m.SplitButtonView),d=c.buttonView,u=function({editor:t,listStyleCommand:e,parentCommandName:i}){const n=t.locale,o=t.commands.get(i);return({label:s,type:r,icon:l,tooltip:a})=>{const c=new m.ButtonView(n);return c.set({label:s,icon:l,tooltip:a}),e.on("change:value",()=>{c.isOn=e.value===r}),c.on("execute",()=>{o.value?e.value!==r?t.execute("listStyle",{type:r}):t.execute("listStyle",{type:e._defaultType}):t.model.change(()=>{t.execute(i),t.execute("listStyle",{type:r})}),t.editing.view.focus()}),c}}({editor:t,parentCommandName:e,listStyleCommand:l});return Object(m.addToolbarToDropdown)(c,s.map(u)),c.bind("isEnabled").to(r),c.toolbarView.ariaLabel=o,c.class="ck-list-styles-dropdown",d.on("execute",()=>{t.execute(e),t.editing.view.focus()}),d.set({label:i,icon:n,tooltip:!0,isToggleable:!0}),d.bind("isOn").to(r,"value",t=>!!t),c}}class G extends n.Plugin{static get requires(){return[F,Y]}static get pluginName(){return"ListStyle"}}class Q extends n.Command{constructor(t){super(t),this._selectedElements=[],this.on("execute",()=>{this.refresh()},{priority:"highest"})}refresh(){this._selectedElements=this._getSelectedItems(),this.value=this._selectedElements.every(t=>!!t.getAttribute("todoListChecked")),this.isEnabled=!!this._selectedElements.length}_getSelectedItems(){const t=this.editor.model,e=t.schema,i=t.document.selection.getFirstRange(),n=i.start.parent,o=[];e.checkAttribute(n,"todoListChecked")&&o.push(n);for(const t of i.getItems())e.checkAttribute(t,"todoListChecked")&&!o.includes(t)&&o.push(t);return o}execute(t={}){this.editor.model.change(e=>{for(const i of this._selectedElements){(void 0===t.forceValue?!this.value:t.forceValue)?e.setAttribute("todoListChecked",!0,i):e.removeAttribute("todoListChecked",i)}})}}function X(t,e,i){const n=e.modelCursor,o=n.parent,s=e.viewItem;if("checkbox"!=s.getAttribute("type")||"listItem"!=o.name||!n.isAtStart)return;if(!i.consumable.consume(s,{name:!0}))return;const r=i.writer;r.setAttribute("listType","todo",o),e.viewItem.hasAttribute("checked")&&r.setAttribute("todoListChecked",!0,o),e.modelRange=r.createRange(n)}function Z(t){return(e,i)=>{const n=i.modelPosition,o=n.parent;if(!o.is("element","listItem")||"todo"!=o.getAttribute("listType"))return;const s=et(i.mapper.toViewElement(o),t);s&&(i.viewPosition=i.mapper.findPositionIn(s,n.offset))}}function tt(t,e,i,n){return e.createUIElement("label",{class:"todo-list__label",contenteditable:!1},(function(e){const s=Object(o.createElement)(document,"input",{type:"checkbox"});i&&s.setAttribute("checked","checked"),s.addEventListener("change",()=>n(t));const r=this.toDomElement(e);return r.appendChild(s),r}))}function et(t,e){const i=e.createRangeIn(t);for(const t of i)if(t.item.is("containerElement","span")&&t.item.hasClass("todo-list__label__description"))return t.item}const it=Object(o.parseKeystroke)("Ctrl+Enter");class nt extends n.Plugin{static get pluginName(){return"TodoListEditing"}static get requires(){return[M]}init(){const t=this.editor,{editing:e,data:i,model:n}=t;n.schema.extend("listItem",{allowAttributes:["todoListChecked"]}),n.schema.addAttributeCheck((t,e)=>{const i=t.last;if("todoListChecked"==e&&"listItem"==i.name&&"todo"!=i.getAttribute("listType"))return!1}),t.commands.add("todoList",new s(t,"todo"));const r=new Q(t);var l,a;t.commands.add("checkTodoList",r),t.commands.add("todoListCheck",r),i.downcastDispatcher.on("insert:listItem",function(t){return(e,i,n)=>{const o=n.consumable;if(!o.test(i.item,"insert")||!o.test(i.item,"attribute:listType")||!o.test(i.item,"attribute:listIndent"))return;if("todo"!=i.item.getAttribute("listType"))return;const s=i.item;o.consume(s,"insert"),o.consume(s,"attribute:listType"),o.consume(s,"attribute:listIndent"),o.consume(s,"attribute:todoListChecked");const r=n.writer,l=g(s,n);r.addClass("todo-list",l.parent);const a=r.createContainerElement("label",{class:"todo-list__label"}),c=r.createEmptyElement("input",{type:"checkbox",disabled:"disabled"}),d=r.createContainerElement("span",{class:"todo-list__label__description"});s.getAttribute("todoListChecked")&&r.setAttribute("checked","checked",c),r.insert(r.createPositionAt(l,0),a),r.insert(r.createPositionAt(a,0),c),r.insert(r.createPositionAfter(c),d),p(s,l,n,t)}}(n),{priority:"high"}),i.upcastDispatcher.on("element:input",X,{priority:"high"}),e.downcastDispatcher.on("insert:listItem",function(t,e){return(i,n,o)=>{const s=o.consumable;if(!s.test(n.item,"insert")||!s.test(n.item,"attribute:listType")||!s.test(n.item,"attribute:listIndent"))return;if("todo"!=n.item.getAttribute("listType"))return;const r=n.item;s.consume(r,"insert"),s.consume(r,"attribute:listType"),s.consume(r,"attribute:listIndent"),s.consume(r,"attribute:todoListChecked");const l=o.writer,a=g(r,o),c=!!r.getAttribute("todoListChecked"),d=tt(r,l,c,e),u=l.createContainerElement("span",{class:"todo-list__label__description"});l.addClass("todo-list",a.parent),l.insert(l.createPositionAt(a,0),d),l.insert(l.createPositionAfter(d),u),p(r,a,o,t)}}(n,t=>this._handleCheckmarkChange(t)),{priority:"high"}),e.downcastDispatcher.on("attribute:listType:listItem",(l=t=>this._handleCheckmarkChange(t),a=e.view,(t,e,i)=>{const n=i.mapper.toViewElement(e.item),o=i.writer,s=function(t,e){const i=e.createRangeIn(t);for(const t of i)if(t.item.is("uiElement","label"))return t.item}(n,a);if("todo"==e.attributeNewValue){const t=!!e.item.getAttribute("todoListChecked"),i=tt(e.item,o,t,l),s=o.createContainerElement("span",{class:"todo-list__label__description"}),r=o.createRangeIn(n),a=y(n),c=f(r.start),d=a?o.createPositionBefore(a):r.end,u=o.createRange(c,d);o.addClass("todo-list",n.parent),o.move(u,o.createPositionAt(s,0)),o.insert(o.createPositionAt(n,0),i),o.insert(o.createPositionAfter(i),s)}else if("todo"==e.attributeOldValue){const t=et(n,a);o.removeClass("todo-list",n.parent),o.remove(s),o.move(o.createRangeIn(t),o.createPositionBefore(t)),o.remove(t)}})),e.downcastDispatcher.on("attribute:todoListChecked:listItem",function(t){return(e,i,n)=>{if("todo"!=i.item.getAttribute("listType"))return;if(!n.consumable.consume(i.item,"attribute:todoListChecked"))return;const{mapper:o,writer:s}=n,r=!!i.item.getAttribute("todoListChecked"),l=o.toViewElement(i.item).getChild(0),a=tt(i.item,s,r,t);s.insert(s.createPositionAfter(l),a),s.remove(l)}}(t=>this._handleCheckmarkChange(t))),e.mapper.on("modelToViewPosition",Z(e.view)),i.mapper.on("modelToViewPosition",Z(e.view)),this.listenTo(e.view.document,"arrowKey",function(t,e){return(i,n)=>{if("left"!=Object(o.getLocalizedArrowKeyCodeDirection)(n.keyCode,e.contentLanguageDirection))return;const s=t.schema,r=t.document.selection;if(!r.isCollapsed)return;const l=r.getFirstPosition(),a=l.parent;if("listItem"===a.name&&"todo"==a.getAttribute("listType")&&l.isAtStart){const e=s.getNearestSelectionRange(t.createPositionBefore(a),"backward");e&&t.change(t=>t.setSelection(e)),n.preventDefault(),n.stopPropagation(),i.stop()}}}(n,t.locale),{context:"li"}),this.listenTo(e.view.document,"keydown",(e,i)=>{Object(o.getCode)(i)===it&&(t.execute("checkTodoList"),e.stop())},{priority:"high"});const c=new Set;this.listenTo(n,"applyOperation",(t,e)=>{const i=e[0];if("rename"==i.type&&"listItem"==i.oldName){const t=i.position.nodeAfter;t.hasAttribute("todoListChecked")&&c.add(t)}else if("changeAttribute"==i.type&&"listType"==i.key&&"todo"===i.oldValue)for(const t of i.range.getItems())t.hasAttribute("todoListChecked")&&"todo"!==t.getAttribute("listType")&&c.add(t)}),n.document.registerPostFixer(t=>{let e=!1;for(const i of c)t.removeAttribute("todoListChecked",i),e=!0;return c.clear(),e})}_handleCheckmarkChange(t){const e=this.editor,i=e.model,n=Array.from(i.document.selection.getRanges());i.change(i=>{i.setSelection(t,"end"),e.execute("checkTodoList"),i.setSelection(n)})}}class ot extends n.Plugin{static get pluginName(){return"TodoListUI"}init(){const t=this.editor.t;v(this.editor,"todoList",t("To-do List"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m2.315 14.705 2.224-2.24a.689.689 0 0 1 .963 0 .664.664 0 0 1 0 .949L2.865 16.07a.682.682 0 0 1-.112.089.647.647 0 0 1-.852-.051L.688 14.886a.635.635 0 0 1 0-.903.647.647 0 0 1 .91 0l.717.722zm5.185.045a.75.75 0 0 1 .75-.75h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75zM2.329 5.745l2.21-2.226a.689.689 0 0 1 .963 0 .664.664 0 0 1 0 .95L2.865 7.125a.685.685 0 0 1-.496.196.644.644 0 0 1-.468-.187L.688 5.912a.635.635 0 0 1 0-.903.647.647 0 0 1 .91 0l.73.736zM7.5 5.75A.75.75 0 0 1 8.25 5h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75z"/></svg>')}}i(10);class st extends n.Plugin{static get requires(){return[nt,ot]}static get pluginName(){return"TodoList"}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/source-editing.js b/core/assets/vendor/ckeditor5/build/source-editing.js
new file mode 100644
index 0000000000..cfeb761050
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/source-editing.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{Source:"Source"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.sourceEditing=function(e){var t={};function i(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(n,o,function(t){return e[t]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=7)}([function(e,t,i){e.exports=i(2)("./src/core.js")},function(e,t,i){e.exports=i(2)("./src/utils.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,i){e.exports=i(2)("./src/ui.js")},function(e,t,i){var n=i(5),o=i(6);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,r);e.exports=o.locals||{}},function(e,t,i){"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},r=function(){var e={};return function(t){if(void 0===e[t]){var i=document.querySelector(t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}e[t]=i}return e[t]}}(),a=[];function s(e){for(var t=-1,i=0;i<a.length;i++)if(a[i].identifier===e){t=i;break}return t}function d(e,t){for(var i={},n=[],o=0;o<e.length;o++){var r=e[o],d=t.base?r[0]+t.base:r[0],c=i[d]||0,l="".concat(d," ").concat(c);i[d]=c+1;var u=s(l),f={css:r[1],media:r[2],sourceMap:r[3]};-1!==u?(a[u].references++,a[u].updater(f)):a.push({identifier:l,updater:p(f,t),references:1}),n.push(l)}return n}function c(e){var t=document.createElement("style"),n=e.attributes||{};if(void 0===n.nonce){var o=i.nc;o&&(n.nonce=o)}if(Object.keys(n).forEach((function(e){t.setAttribute(e,n[e])})),"function"==typeof e.insert)e.insert(t);else{var a=r(e.insert||"head");if(!a)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");a.appendChild(t)}return t}var l,u=(l=[],function(e,t){return l[e]=t,l.filter(Boolean).join("\n")});function f(e,t,i,n){var o=i?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(e.styleSheet)e.styleSheet.cssText=u(t,o);else{var r=document.createTextNode(o),a=e.childNodes;a[t]&&e.removeChild(a[t]),a.length?e.insertBefore(r,a[t]):e.appendChild(r)}}function m(e,t,i){var n=i.css,o=i.media,r=i.sourceMap;if(o?e.setAttribute("media",o):e.removeAttribute("media"),r&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}var h=null,g=0;function p(e,t){var i,n,o;if(t.singleton){var r=g++;i=h||(h=c(t)),n=f.bind(null,i,r,!1),o=f.bind(null,i,r,!0)}else i=c(t),n=m.bind(null,i,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(i)};return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=o());var i=d(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var n=0;n<i.length;n++){var o=s(i[n]);a[o].references--}for(var r=d(e,t),c=0;c<i.length;c++){var l=s(i[c]);0===a[l].references&&(a[l].updater(),a.splice(l,1))}i=r}}}},function(e,t){e.exports='.ck-source-editing-area{display:inline-grid;width:100%;font-family:monospace}.ck-source-editing-area:after,.ck-source-editing-area textarea{grid-area:1/1;padding:var(--ck-spacing-large);margin:0;border:1px solid transparent;line-height:var(--ck-line-height-base);font-size:var(--ck-font-size-normal);white-space:pre-wrap}.ck-source-editing-area:after{content:attr(data-value) " ";visibility:hidden}.ck-source-editing-area textarea{resize:none;outline:none;overflow:hidden;border-color:var(--ck-color-base-border);border-radius:0}.ck-rounded-corners .ck-source-editing-area textarea,.ck-source-editing-area textarea.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck-source-editing-area textarea:not([readonly]):focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0}'},function(e,t,i){"use strict";i.r(t),i.d(t,"SourceEditing",(function(){return d}));var n=i(0),o=i(3),r=i(1);function a(e){const t=[{name:"address",isVoid:!1},{name:"article",isVoid:!1},{name:"aside",isVoid:!1},{name:"blockquote",isVoid:!1},{name:"br",isVoid:!0},{name:"details",isVoid:!1},{name:"dialog",isVoid:!1},{name:"dd",isVoid:!1},{name:"div",isVoid:!1},{name:"dl",isVoid:!1},{name:"dt",isVoid:!1},{name:"fieldset",isVoid:!1},{name:"figcaption",isVoid:!1},{name:"figure",isVoid:!1},{name:"footer",isVoid:!1},{name:"form",isVoid:!1},{name:"h1",isVoid:!1},{name:"h2",isVoid:!1},{name:"h3",isVoid:!1},{name:"h4",isVoid:!1},{name:"h5",isVoid:!1},{name:"h6",isVoid:!1},{name:"header",isVoid:!1},{name:"hgroup",isVoid:!1},{name:"hr",isVoid:!0},{name:"input",isVoid:!0},{name:"li",isVoid:!1},{name:"main",isVoid:!1},{name:"nav",isVoid:!1},{name:"ol",isVoid:!1},{name:"p",isVoid:!1},{name:"pre",isVoid:!1},{name:"section",isVoid:!1},{name:"table",isVoid:!1},{name:"tbody",isVoid:!1},{name:"td",isVoid:!1},{name:"textarea",isVoid:!1},{name:"th",isVoid:!1},{name:"thead",isVoid:!1},{name:"tr",isVoid:!1},{name:"ul",isVoid:!1}],i=t.map(e=>e.name).join("|"),n=e.replace(new RegExp(`</?(${i})( .*?)?>`,"g"),"\n$&\n").split("\n");let o=0;return n.filter(e=>e.length).map(e=>function(e,t){return t.some(t=>!t.isVoid&&!!new RegExp(`<${t.name}( .*?)?>`).test(e))}(e,t)?s(e,o++):function(e,t){return t.some(t=>new RegExp(`</${t.name}>`).test(e))}(e,t)?s(e,--o):s(e,o)).join("\n")}function s(e,t,i="    "){return`${i.repeat(t)}${e}`}i(4);class d extends n.Plugin{static get pluginName(){return"SourceEditing"}static get requires(){return[n.PendingActions]}constructor(e){super(e),this.set("isSourceEditingMode",!1),this._elementReplacer=new r.ElementReplacer,this._replacedRoots=new Map,this._dataFromRoots=new Map}init(){const e=this.editor,t=e.t;e.ui.componentFactory.add("sourceEditing",i=>{const r=new o.ButtonView(i);return r.set({label:t("Source"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m12.5 0 5 4.5v15.003h-16V0h11zM3 1.5v3.25l-1.497 1-.003 8 1.5 1v3.254L7.685 18l-.001 1.504H17.5V8.002L16 9.428l-.004-4.22-4.222-3.692L3 1.5z"/><path d="M4.06 6.64a.75.75 0 0 1 .958 1.15l-.085.07L2.29 9.75l2.646 1.89c.302.216.4.62.232.951l-.058.095a.75.75 0 0 1-.951.232l-.095-.058-3.5-2.5V9.14l3.496-2.5zm4.194 6.22a.75.75 0 0 1-.958-1.149l.085-.07 2.643-1.89-2.646-1.89a.75.75 0 0 1-.232-.952l.058-.095a.75.75 0 0 1 .95-.232l.096.058 3.5 2.5v1.22l-3.496 2.5zm7.644-.836 2.122 2.122-5.825 5.809-2.125-.005.003-2.116zm2.539-1.847 1.414 1.414a.5.5 0 0 1 0 .707l-1.06 1.06-2.122-2.12 1.061-1.061a.5.5 0 0 1 .707 0z"/></svg>',tooltip:!0,withText:!0,class:"ck-source-editing-button"}),r.bind("isOn").to(this,"isSourceEditingMode"),r.bind("isEnabled").to(this,"isEnabled",e,"isReadOnly",e.plugins.get(n.PendingActions),"hasAny",(e,t,i)=>!!e&&(!t&&!i)),this.listenTo(r,"execute",()=>{this.isSourceEditingMode=!this.isSourceEditingMode}),r}),this._isAllowedToHandleSourceEditingMode()&&(this.on("change:isSourceEditingMode",(e,t,i)=>{i?(this._showSourceEditing(),this._disableCommands()):(this._hideSourceEditing(),this._enableCommands())}),this.on("change:isEnabled",(e,t,i)=>this._handleReadOnlyMode(!i)),this.listenTo(e,"change:isReadOnly",(e,t,i)=>this._handleReadOnlyMode(i)))}afterInit(){const e=this.editor;["RealTimeCollaborativeEditing","CommentsEditing","TrackChangesEditing","RevisionHistory"].some(t=>e.plugins.has(t))&&console.warn("You initialized the editor with the source editing feature and at least one of the collaboration features. Please be advised that the source editing feature may not work, and be careful when editing document source that contains markers created by the collaboration features."),e.plugins.has("RestrictedEditingModeEditing")&&console.warn("You initialized the editor with the source editing feature and restricted editing feature. Please be advised that the source editing feature may not work, and be careful when editing document source that contains markers created by the restricted editing feature.")}_showSourceEditing(){const e=this.editor,t=e.editing.view,i=e.model;i.change(e=>{e.setSelection(null),e.removeSelectionAttribute(i.document.selection.getAttributeKeys())});for(const[i,n]of t.domRoots){const o=c(e.data.get({rootName:i})),a=Object(r.createElement)(n.ownerDocument,"textarea",{rows:"1"}),s=Object(r.createElement)(n.ownerDocument,"div",{class:"ck-source-editing-area","data-value":o},[a]);a.value=o,a.setSelectionRange(0,0),a.addEventListener("input",()=>{s.dataset.value=a.value}),t.change(e=>{const n=t.document.getRoot(i);e.addClass("ck-hidden",n)}),this._replacedRoots.set(i,s),this._elementReplacer.replace(n,s),this._dataFromRoots.set(i,o)}this._focusSourceEditing()}_hideSourceEditing(){const e=this.editor,t=e.editing.view,i={};for(const[e,n]of this._replacedRoots){const o=this._dataFromRoots.get(e),r=n.dataset.value;o!==r&&(i[e]=r),t.change(i=>{const n=t.document.getRoot(e);i.removeClass("ck-hidden",n)})}this._elementReplacer.restore(),this._replacedRoots.clear(),this._dataFromRoots.clear(),Object.keys(i).length&&e.data.set(i,{batchType:"default"}),e.editing.view.focus()}_focusSourceEditing(){const[e]=this._replacedRoots.values();e.querySelector("textarea").focus()}_disableCommands(){const e=this.editor;for(const t of e.commands.commands())t.forceDisabled("SourceEditingMode")}_enableCommands(){const e=this.editor;for(const t of e.commands.commands())t.clearForceDisabled("SourceEditingMode")}_handleReadOnlyMode(e){if(this.isSourceEditingMode)for(const[,t]of this._replacedRoots)t.querySelector("textarea").readOnly=e}_isAllowedToHandleSourceEditingMode(){const e=this.editor.ui.view.editable;return e&&!e._hasExternalElement}}function c(e){return function(e){return e.startsWith("<")}(e)?a(e):e}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/table.js b/core/assets/vendor/ckeditor5/build/table.js
new file mode 100644
index 0000000000..04e581482f
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/table.js
@@ -0,0 +1,5 @@
+/*!
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",Background:"Background",Border:"Border","Cell properties":"Cell properties","Center table":"Center table",Color:"Color","Color picker":"Color picker",Column:"Column",Dashed:"Dashed","Delete column":"Delete column","Delete row":"Delete row",Dimensions:"Dimensions",Dotted:"Dotted",Double:"Double","Enter table caption":"Enter table caption",Groove:"Groove","Header column":"Header column","Header row":"Header row",Height:"Height","Horizontal text alignment toolbar":"Horizontal text alignment toolbar","Insert column left":"Insert column left","Insert column right":"Insert column right","Insert row above":"Insert row above","Insert row below":"Insert row below","Insert table":"Insert table",Inset:"Inset","Justify cell text":"Justify cell text","Merge cell down":"Merge cell down","Merge cell left":"Merge cell left","Merge cell right":"Merge cell right","Merge cell up":"Merge cell up","Merge cells":"Merge cells",None:"None",Outset:"Outset",Padding:"Padding",Ridge:"Ridge",Row:"Row","Select column":"Select column","Select row":"Select row",Solid:"Solid","Split cell horizontally":"Split cell horizontally","Split cell vertically":"Split cell vertically",Style:"Style","Table alignment toolbar":"Table alignment toolbar","Table cell text alignment":"Table cell text alignment","Table properties":"Table properties","Table toolbar":"Table toolbar",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'The value is invalid. Try "10px" or "2em" or simply "2".',"Toggle caption off":"Toggle caption off","Toggle caption on":"Toggle caption on","Vertical text alignment toolbar":"Vertical text alignment toolbar",Width:"Width"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.table=function(e){var t={};function o(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,o),i.l=!0,i.exports}return o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)o.d(n,i,function(t){return e[t]}.bind(null,i));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=32)}([function(e,t,o){e.exports=o(6)("./src/ui.js")},function(e,t,o){e.exports=o(6)("./src/core.js")},function(e,t,o){e.exports=o(6)("./src/utils.js")},function(e,t,o){e.exports=o(6)("./src/widget.js")},function(e,t,o){e.exports=o(6)("./src/engine.js")},function(e,t,o){"use strict";var n,i=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},r=function(){var e={};return function(t){if(void 0===e[t]){var o=document.querySelector(t);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement)try{o=o.contentDocument.head}catch(e){o=null}e[t]=o}return e[t]}}(),l=[];function s(e){for(var t=-1,o=0;o<l.length;o++)if(l[o].identifier===e){t=o;break}return t}function a(e,t){for(var o={},n=[],i=0;i<e.length;i++){var r=e[i],a=t.base?r[0]+t.base:r[0],c=o[a]||0,d="".concat(a," ").concat(c);o[a]=c+1;var u=s(d),h={css:r[1],media:r[2],sourceMap:r[3]};-1!==u?(l[u].references++,l[u].updater(h)):l.push({identifier:d,updater:p(h,t),references:1}),n.push(d)}return n}function c(e){var t=document.createElement("style"),n=e.attributes||{};if(void 0===n.nonce){var i=o.nc;i&&(n.nonce=i)}if(Object.keys(n).forEach((function(e){t.setAttribute(e,n[e])})),"function"==typeof e.insert)e.insert(t);else{var l=r(e.insert||"head");if(!l)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");l.appendChild(t)}return t}var d,u=(d=[],function(e,t){return d[e]=t,d.filter(Boolean).join("\n")});function h(e,t,o,n){var i=o?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(e.styleSheet)e.styleSheet.cssText=u(t,i);else{var r=document.createTextNode(i),l=e.childNodes;l[t]&&e.removeChild(l[t]),l.length?e.insertBefore(r,l[t]):e.appendChild(r)}}function b(e,t,o){var n=o.css,i=o.media,r=o.sourceMap;if(i?e.setAttribute("media",i):e.removeAttribute("media"),r&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}var m=null,g=0;function p(e,t){var o,n,i;if(t.singleton){var r=g++;o=m||(m=c(t)),n=h.bind(null,o,r,!1),i=h.bind(null,o,r,!0)}else o=c(t),n=b.bind(null,o,t),i=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(o)};return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else i()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=i());var o=a(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var n=0;n<o.length;n++){var i=s(o[n]);l[i].references--}for(var r=a(e,t),c=0;c<o.length;c++){var d=s(o[c]);0===l[d].references&&(l[d].updater(),l.splice(d,1))}o=r}}}},function(e,t){e.exports=CKEditor5.dll},,function(e,t,o){var n=o(5),i=o(23);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t,o){var n=o(5),i=o(24);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t,o){"use strict";(function(e){var o="object"==typeof e&&e&&e.Object===Object&&e;t.a=o}).call(this,o(27))},function(e,t,o){var n=o(5),i=o(12);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=":root{--ck-color-table-focused-cell-background:rgba(158,207,250,0.3)}.ck-widget.table td.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table td.ck-editor__nested-editable:focus,.ck-widget.table th.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table th.ck-editor__nested-editable:focus{background:var(--ck-color-table-focused-cell-background);border-style:none;outline:1px solid var(--ck-color-focus-border);outline-offset:-1px}"},function(e,t,o){var n=o(5),i=o(14);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=".ck .ck-insert-table-dropdown__grid{display:flex;flex-direction:row;flex-wrap:wrap}:root{--ck-insert-table-dropdown-padding:10px;--ck-insert-table-dropdown-box-height:11px;--ck-insert-table-dropdown-box-width:12px;--ck-insert-table-dropdown-box-margin:1px}.ck .ck-insert-table-dropdown__grid{width:calc(var(--ck-insert-table-dropdown-box-width)*10 + var(--ck-insert-table-dropdown-box-margin)*20 + var(--ck-insert-table-dropdown-padding)*2);padding:var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0}.ck .ck-insert-table-dropdown__label{text-align:center}.ck .ck-insert-table-dropdown-grid-box{width:var(--ck-insert-table-dropdown-box-width);height:var(--ck-insert-table-dropdown-box-height);margin:var(--ck-insert-table-dropdown-box-margin);border:1px solid var(--ck-color-base-border);border-radius:1px}.ck .ck-insert-table-dropdown-grid-box.ck-on{border-color:var(--ck-color-focus-border);background:var(--ck-color-focus-outer-shadow)}"},function(e,t,o){var n=o(5),i=o(16);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=':root{--ck-table-selected-cell-background:rgba(158,207,250,0.3)}.ck.ck-editor__editable .table table td.ck-editor__editable_selected,.ck.ck-editor__editable .table table th.ck-editor__editable_selected{position:relative;caret-color:transparent;outline:unset;box-shadow:unset}.ck.ck-editor__editable .table table td.ck-editor__editable_selected:after,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:after{content:"";pointer-events:none;background-color:var(--ck-table-selected-cell-background);position:absolute;top:0;left:0;right:0;bottom:0}.ck.ck-editor__editable .table table td.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table td.ck-editor__editable_selected:focus,.ck.ck-editor__editable .table table th.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:focus{background-color:transparent}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget_selected,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget_selected{outline:unset}'},function(e,t,o){var n=o(5),i=o(18);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=".ck-content .table{margin:.9em auto;display:table}.ck-content .table table{border-collapse:collapse;border-spacing:0;width:100%;height:100%;border:1px double #b3b3b3}.ck-content .table table td,.ck-content .table table th{min-width:2em;padding:.4em;border:1px solid #bfbfbf}.ck-content .table table th{font-weight:700;background:hsla(0,0%,0%,5%)}.ck-content[dir=rtl] .table th{text-align:right}.ck-content[dir=ltr] .table th{text-align:left}.ck-editor__editable .ck-table-bogus-paragraph{display:inline-block;width:100%}"},function(e,t,o){var n=o(5),i=o(20);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=".ck.ck-input-color{width:100%;display:flex;flex-direction:row-reverse}.ck.ck-input-color>input.ck.ck-input-text{min-width:auto;flex-grow:1}.ck.ck-input-color>div.ck.ck-dropdown{min-width:auto}.ck.ck-input-color>div.ck.ck-dropdown>.ck-input-color__button .ck-dropdown__arrow{display:none}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview{position:relative;overflow:hidden}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{position:absolute;display:block}[dir=ltr] .ck.ck-input-color>.ck.ck-input-text{border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-input-text{border-top-left-radius:0;border-bottom-left-radius:0}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{padding:0}[dir=ltr] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-left-width:0;border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-right-width:0;border-top-right-radius:0;border-bottom-right-radius:0}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button.ck-disabled{background:var(--ck-color-input-disabled-background)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{border-radius:0}.ck-rounded-corners .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview,.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{width:20px;height:20px;border:1px solid var(--ck-color-input-border)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{top:-30%;left:50%;height:150%;width:8%;background:red;border-radius:2px;transform:rotate(45deg);transform-origin:50%}.ck.ck-input-color .ck.ck-input-color__remove-color{width:100%;border-bottom:1px solid var(--ck-color-input-border);padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard);border-bottom-left-radius:0;border-bottom-right-radius:0}[dir=ltr] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-right-radius:0}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-left-radius:0}.ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-right:0;margin-left:var(--ck-spacing-standard)}"},function(e,t,o){var n=o(5),i=o(22);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=".ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-table-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-table-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row{padding:var(--ck-spacing-standard) var(--ck-spacing-large) 0}[dir=ltr] .ck.ck-form__row>:not(.ck-label)+*{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-form__row>:not(.ck-label)+*{margin-right:var(--ck-spacing-large)}.ck.ck-form__row>.ck-label{width:100%;min-width:100%}.ck.ck-form__row.ck-table-form__action-row{margin-top:var(--ck-spacing-large)}.ck.ck-form__row.ck-table-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}"},function(e,t){e.exports=".ck.ck-form{padding:0 0 var(--ck-spacing-large)}.ck.ck-form:focus{outline:none}.ck.ck-form .ck.ck-input-text{min-width:100%;width:0}.ck.ck-form .ck.ck-dropdown{min-width:100%}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button:not(:focus){border:1px solid var(--ck-color-base-border)}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button .ck-button__label{width:100%}"},function(e,t){e.exports='.ck.ck-table-form .ck-form__row.ck-table-form__background-row,.ck.ck-table-form .ck-form__row.ck-table-form__border-row{flex-wrap:wrap}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{flex-wrap:wrap;align-items:center}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view{display:flex;flex-direction:column-reverse;align-items:center}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view .ck.ck-dropdown,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{flex-grow:0}.ck.ck-table-form .ck.ck-labeled-field-view{position:relative}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{position:absolute;left:50%;bottom:calc(var(--ck-table-properties-error-arrow-size)*-1);transform:translate(-50%,100%);z-index:1}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{content:"";position:absolute;top:calc(var(--ck-table-properties-error-arrow-size)*-1);left:50%;transform:translateX(-50%)}:root{--ck-table-properties-error-arrow-size:6px;--ck-table-properties-min-error-width:150px}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-labeled-field-view>.ck-label{font-size:var(--ck-font-size-tiny);text-align:center}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-style,.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-width{width:80px;min-width:80px;max-width:80px}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{padding:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__height,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__width{margin:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{align-self:flex-end;display:inline-block;height:var(--ck-ui-component-min-height);line-height:var(--ck-ui-component-min-height);margin:0 var(--ck-spacing-small)}.ck.ck-table-form .ck.ck-labeled-field-view{padding-top:var(--ck-spacing-standard)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{border-radius:0}.ck-rounded-corners .ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status,.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{background:var(--ck-color-base-error);color:var(--ck-color-base-background);padding:var(--ck-spacing-small) var(--ck-spacing-medium);min-width:var(--ck-table-properties-min-error-width);text-align:center}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{border-left:var(--ck-table-properties-error-arrow-size) solid transparent;border-bottom:var(--ck-table-properties-error-arrow-size) solid var(--ck-color-base-error);border-right:var(--ck-table-properties-error-arrow-size) solid transparent;border-top:0 solid transparent}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{animation:ck-table-form-labeled-view-status-appear .15s ease both}.ck.ck-table-form .ck.ck-labeled-field-view .ck-input.ck-error:not(:focus)+.ck.ck-labeled-field-view__status{display:none}@keyframes ck-table-form-labeled-view-status-appear{0%{opacity:0}to{opacity:1}}'},function(e,t,o){var n=o(5),i=o(26);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=".ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row{flex-wrap:wrap}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar:first-of-type{flex-grow:0.57}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar:last-of-type{flex-grow:0.43}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar .ck-button{flex-grow:1}.ck.ck-table-cell-properties-form{width:320px}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__padding-row{align-self:flex-end;padding:0;width:25%}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}"},function(e,t){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(e){"object"==typeof window&&(o=window)}e.exports=o},function(e,t,o){var n=o(5),i=o(29);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=".ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{flex-wrap:wrap;flex-basis:0;align-content:baseline}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items{flex-wrap:nowrap}.ck.ck-table-properties-form{width:320px}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{align-self:flex-end;padding:0}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items>*{width:40px}"},function(e,t,o){var n=o(5),i=o(31);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var r={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(i,r);e.exports=i.locals||{}},function(e,t){e.exports=":root{--ck-color-table-caption-background:#f7f7f7;--ck-color-table-caption-text:#333;--ck-color-table-caption-highlighted-background:#fd0}.ck-content .table>figcaption{display:table-caption;caption-side:top;word-break:break-word;text-align:center;color:var(--ck-color-table-caption-text);background-color:var(--ck-color-table-caption-background);padding:.6em;font-size:.75em;outline-offset:-1px}.ck.ck-editor__editable .table>figcaption.table__caption_highlighted{animation:ck-table-caption-highlight .6s ease-out}.ck.ck-editor__editable .table>figcaption.ck-placeholder:before{padding-left:inherit;padding-right:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@keyframes ck-table-caption-highlight{0%{background-color:var(--ck-color-table-caption-highlighted-background)}to{background-color:var(--ck-color-table-caption-background)}}"},function(e,t,o){"use strict";o.r(t),o.d(t,"Table",(function(){return Fe})),o.d(t,"TableEditing",(function(){return ye})),o.d(t,"TableUI",(function(){return Se})),o.d(t,"TableToolbar",(function(){return Ue})),o.d(t,"TableCellProperties",(function(){return po})),o.d(t,"TableCellPropertiesEditing",(function(){return mo})),o.d(t,"TableCellPropertiesUI",(function(){return Jt})),o.d(t,"TableProperties",(function(){return Oo})),o.d(t,"TablePropertiesEditing",(function(){return Vo})),o.d(t,"TablePropertiesUI",(function(){return Bo})),o.d(t,"TableCaption",(function(){return jo})),o.d(t,"TableCaptionEditing",(function(){return Do})),o.d(t,"TableCaptionUI",(function(){return Wo})),o.d(t,"TableClipboard",(function(){return Pe})),o.d(t,"TableMouse",(function(){return Me})),o.d(t,"TableKeyboard",(function(){return Le})),o.d(t,"TableSelection",(function(){return Ie})),o.d(t,"TableUtils",(function(){return te}));var n=o(1),i=o(3);function r(e,t,o,n,i=1){t>i?n.setAttribute(e,t,o):n.removeAttribute(e,o)}function l(e,t,o={}){const n=e.createElement("tableCell",o);return e.insertElement("paragraph",n),e.insert(n,t),n}function s(e,t){const o=t.parent.parent,n=parseInt(o.getAttribute("headingColumns")||0),{column:i}=e.getCellLocation(t);return!!n&&i<n}var a=o(2);function c(){return e=>{e.on("element:table",(e,t,o)=>{const n=t.viewItem;if(!o.consumable.test(n,{name:!0}))return;const{rows:i,headingRows:r,headingColumns:s}=function(e){const t={headingRows:0,headingColumns:0},o=[],n=[];let i;for(const r of Array.from(e.getChildren()))if("tbody"===r.name||"thead"===r.name||"tfoot"===r.name){"thead"!==r.name||i||(i=r);const e=Array.from(r.getChildren()).filter(e=>e.is("element","tr"));for(const r of e)if("thead"===r.parent.name&&r.parent===i)t.headingRows++,o.push(r);else{n.push(r);const e=u(r);e>t.headingColumns&&(t.headingColumns=e)}}return t.rows=[...o,...n],t}(n),a={};s&&(a.headingColumns=s),r&&(a.headingRows=r);const c=o.writer.createElement("table",a);if(o.safeInsert(c,t.modelCursor)){if(o.consumable.consume(n,{name:!0}),i.forEach(e=>o.convertItem(e,o.writer.createPositionAt(c,"end"))),o.convertChildren(n,o.writer.createPositionAt(c,"end")),c.isEmpty){const e=o.writer.createElement("tableRow");o.writer.insert(e,o.writer.createPositionAt(c,"end")),l(o.writer,o.writer.createPositionAt(e,"end"))}o.updateConversionResult(c,t)}})}}function d(e){return t=>{t.on("element:"+e,(e,t,o)=>{if(t.modelRange&&t.viewItem.isEmpty){const e=t.modelRange.start.nodeAfter,n=o.writer.createPositionAt(e,0);o.writer.insertElement("paragraph",n)}},{priority:"low"})}}function u(e){let t=0,o=0;const n=Array.from(e.getChildren()).filter(e=>"th"===e.name||"td"===e.name);for(;o<n.length&&"th"===n[o].name;){const e=n[o];t+=parseInt(e.getAttribute("colspan")||1),o++}return t}class h{constructor(e,t={}){this._table=e,this._startRow=void 0!==t.row?t.row:t.startRow||0,this._endRow=void 0!==t.row?t.row:t.endRow,this._startColumn=void 0!==t.column?t.column:t.startColumn||0,this._endColumn=void 0!==t.column?t.column:t.endColumn,this._includeAllSlots=!!t.includeAllSlots,this._skipRows=new Set,this._row=0,this._rowIndex=0,this._column=0,this._cellIndex=0,this._spannedCells=new Map,this._nextCellAtColumn=-1}[Symbol.iterator](){return this}next(){const e=this._table.getChild(this._rowIndex);if(!e||this._isOverEndRow())return{done:!0};if(!e.is("element","tableRow"))return this._rowIndex++,this.next();if(this._isOverEndColumn())return this._advanceToNextRow();let t=null;const o=this._getSpanned();if(o)this._includeAllSlots&&!this._shouldSkipSlot()&&(t=this._formatOutValue(o.cell,o.row,o.column));else{const o=e.getChild(this._cellIndex);if(!o)return this._advanceToNextRow();const n=parseInt(o.getAttribute("colspan")||1),i=parseInt(o.getAttribute("rowspan")||1);(n>1||i>1)&&this._recordSpans(o,i,n),this._shouldSkipSlot()||(t=this._formatOutValue(o)),this._nextCellAtColumn=this._column+n}return this._column++,this._column==this._nextCellAtColumn&&this._cellIndex++,t||this.next()}skipRow(e){this._skipRows.add(e)}_advanceToNextRow(){return this._row++,this._rowIndex++,this._column=0,this._cellIndex=0,this._nextCellAtColumn=-1,this.next()}_isOverEndRow(){return void 0!==this._endRow&&this._row>this._endRow}_isOverEndColumn(){return void 0!==this._endColumn&&this._column>this._endColumn}_formatOutValue(e,t=this._row,o=this._column){return{done:!1,value:new b(this,e,t,o)}}_shouldSkipSlot(){const e=this._skipRows.has(this._row),t=this._row<this._startRow,o=this._column<this._startColumn,n=void 0!==this._endColumn&&this._column>this._endColumn;return e||t||o||n}_getSpanned(){const e=this._spannedCells.get(this._row);return e&&e.get(this._column)||null}_recordSpans(e,t,o){const n={cell:e,row:this._row,column:this._column};for(let e=this._row;e<this._row+t;e++)for(let t=this._column;t<this._column+o;t++)e==this._row&&t==this._column||this._markSpannedCell(e,t,n)}_markSpannedCell(e,t,o){this._spannedCells.has(e)||this._spannedCells.set(e,new Map);this._spannedCells.get(e).set(t,o)}}class b{constructor(e,t,o,n){this.cell=t,this.row=e._row,this.column=e._column,this.cellAnchorRow=o,this.cellAnchorColumn=n,this._cellIndex=e._cellIndex,this._rowIndex=e._rowIndex,this._table=e._table}get isAnchor(){return this.row===this.cellAnchorRow&&this.column===this.cellAnchorColumn}get cellWidth(){return parseInt(this.cell.getAttribute("colspan")||1)}get cellHeight(){return parseInt(this.cell.getAttribute("rowspan")||1)}get rowIndex(){return this._rowIndex}getPositionBefore(){return this._table.root.document.model.createPositionAt(this._table.getChild(this.row),this._cellIndex)}}function m(e={}){return t=>t.on("insert:table",(t,o,n)=>{const r=o.item;if(!n.consumable.consume(r,"insert"))return;n.consumable.consume(r,"attribute:headingRows:table"),n.consumable.consume(r,"attribute:headingColumns:table");const l=e&&e.asWidget,s=n.writer.createContainerElement("figure",{class:"table"}),a=n.writer.createContainerElement("table");let c;var d,u;n.writer.insert(n.writer.createPositionAt(s,0),a),l&&(d=s,(u=n.writer).setCustomProperty("table",!0,d),c=Object(i.toWidget)(d,u,{hasSelectionHandle:!0}));const b=new h(r),m={headingRows:r.getAttribute("headingRows")||0,headingColumns:r.getAttribute("headingColumns")||0},g=new Map;for(const t of b){const{row:o,cell:i}=t,l=r.getChild(o),s=g.get(o)||_(a,l,o,m,n);g.set(o,s),n.consumable.consume(i,"insert");w(t,m,n.writer.createPositionAt(s,"end"),n,e)}for(const e of r.getChildren()){const t=e.index;e.is("element","tableRow")&&!g.has(t)&&g.set(t,_(a,e,t,m,n))}const p=n.mapper.toViewPosition(o.range.start);n.mapper.bindElements(r,l?c:s),n.writer.insert(p,l?c:s)})}function g(e,t){const{writer:o}=t;if(e.parent.is("element","tableCell"))return p(e)?o.createContainerElement("span",{class:"ck-table-bogus-paragraph"}):o.createContainerElement("p")}function p(e){return 1===e.parent.childCount&&!y(e)}function f(e,t,o){const{cell:n}=e,r=k(e,t),l=o.mapper.toViewElement(n);l&&l.name!==r&&function(e,t,o){const n=o.writer,r=o.mapper.toViewElement(e),l=n.createEditableElement(t,r.getAttributes()),s=Object(i.toWidgetEditable)(l,n);Object(i.setHighlightHandling)(s,n,(e,t,o)=>o.addClass(Object(a.toArray)(t.classes),e),(e,t,o)=>o.removeClass(Object(a.toArray)(t.classes),e)),n.insert(n.createPositionAfter(r),s),n.move(n.createRangeIn(r),n.createPositionAt(s,0)),n.remove(n.createRangeOn(r)),o.mapper.unbindViewElement(r),o.mapper.bindElements(e,s)}(n,r,o)}function w(e,t,o,n,r){const l=r&&r.asWidget,s=k(e,t),c=l?Object(i.toWidgetEditable)(n.writer.createEditableElement(s),n.writer):n.writer.createContainerElement(s);l&&Object(i.setHighlightHandling)(c,n.writer,(e,t,o)=>o.addClass(Object(a.toArray)(t.classes),e),(e,t,o)=>o.removeClass(Object(a.toArray)(t.classes),e));const d=e.cell,u=d.getChild(0),h=1===d.childCount&&"paragraph"===u.name;if(n.writer.insert(o,c),n.mapper.bindElements(d,c),!l&&h&&!y(u)){const e=d.getChild(0);n.consumable.consume(e,"insert"),n.mapper.bindElements(e,c)}}function _(e,t,o,n,i){i.consumable.consume(t,"insert");const r=t.isEmpty?i.writer.createEmptyElement("tr"):i.writer.createContainerElement("tr");i.mapper.bindElements(t,r);const l=n.headingRows,s=function(e,t,o){const n=v(e,t);return n||function(e,t,o){const n=o.writer.createContainerElement(e),i=o.writer.createPositionAt(t,"tbody"==e?"end":0);return o.writer.insert(i,n),n}(e,t,o)}(function(e,t){return e<t.headingRows?"thead":"tbody"}(o,n),e,i),a=l>0&&o>=l?o-l:o,c=i.writer.createPositionAt(s,a);return i.writer.insert(c,r),r}function k(e,t){const{row:o,column:n}=e,{headingColumns:i,headingRows:r}=t;if(r&&r>o)return"th";return i&&i>n?"th":"td"}function v(e,t){for(const o of t.getChildren())if(o.name==e)return o}function C(e,t,o){const n=v(e,t);n&&0===n.childCount&&o.writer.remove(o.writer.createRangeOn(n))}function y(e){return!![...e.getAttributeKeys()].length}class T extends n.Command{refresh(){const e=this.editor.model,t=e.document.selection,o=e.schema;this.isEnabled=function(e,t){const o=e.getFirstPosition().parent,n=o===o.root?o:o.parent;return t.checkChild(n,"table")}(t,o)}execute(e={}){const t=this.editor.model,o=t.document.selection,n=this.editor.plugins.get("TableUtils"),r=this.editor.config.get("table"),l=Object(i.findOptimalInsertionRange)(o,t),s=r.defaultHeadings.rows,a=r.defaultHeadings.columns;void 0===e.headingRows&&s&&(e.headingRows=s),void 0===e.headingColumns&&a&&(e.headingColumns=a),t.change(o=>{const i=n.createTable(o,e);t.insertContent(i,l),o.setSelection(o.createPositionAt(i.getNodeByPath([0,0,0]),0))})}}function x(e){const t=[];for(const o of P(e.getRanges())){const e=o.getContainedElement();e&&e.is("element","tableCell")&&t.push(e)}return t}function A(e){const t=[];for(const o of e.getRanges()){const e=o.start.findAncestor("tableCell");e&&t.push(e)}return t}function V(e){const t=x(e);return t.length?t:A(e)}function S(e){return E(e.map(e=>e.parent.index))}function R(e){const t=e[0].findAncestor("table");return E([...new h(t)].filter(t=>e.includes(t.cell)).map(e=>e.column))}function I(e,t){if(e.length<2||!function(e){const t=e[0].findAncestor("table"),o=S(e),n=parseInt(t.getAttribute("headingRows")||0);if(!O(o,n))return!1;const i=parseInt(t.getAttribute("headingColumns")||0);return O(R(e),i)}(e))return!1;const o=new Set,n=new Set;let i=0;for(const r of e){const{row:e,column:l}=t.getCellLocation(r),s=parseInt(r.getAttribute("rowspan")||1),a=parseInt(r.getAttribute("colspan")||1);o.add(e),n.add(l),s>1&&o.add(e+s-1),a>1&&n.add(l+a-1),i+=s*a}return function(e,t){const o=Array.from(e.values()),n=Array.from(t.values()),i=Math.max(...o),r=Math.min(...o),l=Math.max(...n),s=Math.min(...n);return(i-r+1)*(l-s+1)}(o,n)==i}function P(e){return Array.from(e).sort(B)}function E(e){const t=e.sort((e,t)=>e-t);return{first:t[0],last:t[t.length-1]}}function B(e,t){const o=e.start,n=t.start;return o.isBefore(n)?-1:1}function O({first:e,last:t},o){return e<o===t<o}class L extends n.Command{constructor(e,t={}){super(e),this.order=t.order||"below"}refresh(){const e=!!V(this.editor.model.document.selection).length;this.isEnabled=e}execute(){const e=this.editor,t=e.model.document.selection,o=e.plugins.get("TableUtils"),n="above"===this.order,i=V(t),r=S(i),l=n?r.first:r.last,s=i[0].findAncestor("table");o.insertRows(s,{at:n?l:l+1,copyStructureFromAbove:!n})}}class N extends n.Command{constructor(e,t={}){super(e),this.order=t.order||"right"}refresh(){const e=!!V(this.editor.model.document.selection).length;this.isEnabled=e}execute(){const e=this.editor,t=e.model.document.selection,o=e.plugins.get("TableUtils"),n="left"===this.order,i=V(t),r=R(i),l=n?r.first:r.last,s=i[0].findAncestor("table");o.insertColumns(s,{columns:1,at:n?l:l+1})}}class z extends n.Command{constructor(e,t={}){super(e),this.direction=t.direction||"horizontally"}refresh(){const e=V(this.editor.model.document.selection);this.isEnabled=1===e.length}execute(){const e=V(this.editor.model.document.selection)[0],t="horizontally"===this.direction,o=this.editor.plugins.get("TableUtils");t?o.splitCellHorizontally(e,2):o.splitCellVertically(e,2)}}function M(e,t,o){const{startRow:n,startColumn:i,endRow:s,endColumn:a}=t,c=o.createElement("table"),d=s-n+1;for(let e=0;e<d;e++)o.insertElement("tableRow",c,"end");const u=[...new h(e,{startRow:n,endRow:s,startColumn:i,endColumn:a,includeAllSlots:!0})];for(const{row:e,column:t,cell:r,isAnchor:d,cellAnchorRow:h,cellAnchorColumn:b}of u){const u=e-n,m=c.getChild(u);if(d){const n=o.cloneElement(r);o.append(n,m),j(n,e,t,s,a,o)}else(h<n||b<i)&&l(o,o.createPositionAt(m,"end"))}return function(e,t,o,n,i){const l=parseInt(t.getAttribute("headingRows")||0);if(l>0){r("headingRows",l-o,e,i,0)}const s=parseInt(t.getAttribute("headingColumns")||0);if(s>0){r("headingColumns",s-n,e,i,0)}}(c,e,n,i,o),c}function H(e,t,o=0){const n=[],i=new h(e,{startRow:o,endRow:t-1});for(const e of i){const{row:o,cellHeight:i}=e,r=o+i-1;o<t&&t<=r&&n.push(e)}return n}function F(e,t,o){const n=e.parent,i=n.parent,s=n.index,a=t-s,c={},d=parseInt(e.getAttribute("rowspan"))-a;d>1&&(c.rowspan=d);const u=parseInt(e.getAttribute("colspan")||1);u>1&&(c.colspan=u);const b=s+a,m=[...new h(i,{startRow:s,endRow:b,includeAllSlots:!0})];let g,p=null;for(const t of m){const{row:n,column:i,cell:r}=t;r===e&&void 0===g&&(g=i),void 0!==g&&g===i&&n===b&&(p=l(o,t.getPositionBefore(),c))}return r("rowspan",a,e,o),p}function D(e,t){const o=[],n=new h(e);for(const e of n){const{column:n,cellWidth:i}=e,r=n+i-1;n<t&&t<=r&&o.push(e)}return o}function W(e,t,o,n){const i=o-t,s={},a=parseInt(e.getAttribute("colspan"))-i;a>1&&(s.colspan=a);const c=parseInt(e.getAttribute("rowspan")||1);c>1&&(s.rowspan=c);const d=l(n,n.createPositionAfter(e),s);return r("colspan",i,e,n),d}function j(e,t,o,n,i,l){const s=parseInt(e.getAttribute("colspan")||1),a=parseInt(e.getAttribute("rowspan")||1);if(o+s-1>i){r("colspan",i-o+1,e,l,1)}if(t+a-1>n){r("rowspan",n-t+1,e,l,1)}}function U(e,t){const o=t.getColumns(e),n=new Array(o).fill(0);for(const{column:t}of new h(e))n[t]++;const i=n.reduce((e,t,o)=>t?e:[...e,o],[]);if(i.length>0){const o=i[i.length-1];return t.removeColumns(e,{at:o}),!0}return!1}function K(e,t){const o=[],n=t.getRows(e);for(let t=0;t<n;t++){e.getChild(t).isEmpty&&o.push(t)}if(o.length>0){const n=o[o.length-1];return t.removeRows(e,{at:n}),!0}return!1}function $(e,t){U(e,t)||K(e,t)}function q(e,t){const o=Array.from(new h(e,{startColumn:t.firstColumn,endColumn:t.lastColumn,row:t.lastRow}));if(o.every(({cellHeight:e})=>1===e))return t.lastRow;const n=o[0].cellHeight-1;return t.lastRow+n}function G(e,t){const o=Array.from(new h(e,{startRow:t.firstRow,endRow:t.lastRow,column:t.lastColumn}));if(o.every(({cellWidth:e})=>1===e))return t.lastColumn;const n=o[0].cellWidth-1;return t.lastColumn+n}class J extends n.Command{constructor(e,t){super(e),this.direction=t.direction,this.isHorizontal="right"==this.direction||"left"==this.direction}refresh(){const e=this._getMergeableCell();this.value=e,this.isEnabled=!!e}execute(){const e=this.editor.model,t=A(e.document.selection)[0],o=this.value,n=this.direction;e.change(e=>{const i="right"==n||"down"==n,r=i?t:o,l=i?o:t,s=l.parent;!function(e,t,o){X(e)||(X(t)&&o.remove(o.createRangeIn(t)),o.move(o.createRangeIn(e),o.createPositionAt(t,"end")));o.remove(e)}(l,r,e);const a=this.isHorizontal?"colspan":"rowspan",c=parseInt(t.getAttribute(a)||1),d=parseInt(o.getAttribute(a)||1);e.setAttribute(a,c+d,r),e.setSelection(e.createRangeIn(r));const u=this.editor.plugins.get("TableUtils");$(s.findAncestor("table"),u)})}_getMergeableCell(){const e=A(this.editor.model.document.selection)[0];if(!e)return;const t=this.editor.plugins.get("TableUtils"),o=this.isHorizontal?function(e,t,o){const n=e.parent.parent,i="right"==t?e.nextSibling:e.previousSibling,r=(n.getAttribute("headingColumns")||0)>0;if(!i)return;const l="right"==t?e:i,a="right"==t?i:e,{column:c}=o.getCellLocation(l),{column:d}=o.getCellLocation(a),u=parseInt(l.getAttribute("colspan")||1),h=s(o,l),b=s(o,a);if(r&&h!=b)return;return c+u===d?i:void 0}(e,this.direction,t):function(e,t,o){const n=e.parent,i=n.parent,r=i.getChildIndex(n);if("down"==t&&r===o.getRows(i)-1||"up"==t&&0===r)return;const l=parseInt(e.getAttribute("rowspan")||1),s=i.getAttribute("headingRows")||0,a="down"==t&&r+l===s,c="up"==t&&r===s;if(s&&(a||c))return;const d=parseInt(e.getAttribute("rowspan")||1),u="down"==t?r+d:r,b=[...new h(i,{endRow:u})],m=b.find(t=>t.cell===e).column,g=b.find(({row:e,cellHeight:o,column:n})=>n===m&&("down"==t?e===u:u===e+o));return g&&g.cell}(e,this.direction,t);if(!o)return;const n=this.isHorizontal?"rowspan":"colspan",i=parseInt(e.getAttribute(n)||1);return parseInt(o.getAttribute(n)||1)===i?o:void 0}}function X(e){return 1==e.childCount&&e.getChild(0).is("element","paragraph")&&e.getChild(0).isEmpty}class Y extends n.Command{refresh(){const e=V(this.editor.model.document.selection),t=e[0];if(t){const o=t.findAncestor("table"),n=this.editor.plugins.get("TableUtils").getRows(o)-1,i=S(e),r=0===i.first&&i.last===n;this.isEnabled=!r}else this.isEnabled=!1}execute(){const e=this.editor.model,t=this.editor.plugins.get("TableUtils"),o=V(e.document.selection),n=S(o),i=o[0],r=i.findAncestor("table"),l=t.getCellLocation(i).column;e.change(e=>{const o=n.last-n.first+1;t.removeRows(r,{at:n.first,rows:o});const i=function(e,t,o,n){const i=e.getChild(Math.min(t,n-1));let r=i.getChild(0),l=0;for(const e of i.getChildren()){if(l>o)return r;r=e,l+=parseInt(e.getAttribute("colspan")||1)}return r}(r,n.first,l,t.getRows(r));e.setSelection(e.createPositionAt(i,0))})}}class Q extends n.Command{refresh(){const e=V(this.editor.model.document.selection),t=e[0];if(t){const o=t.findAncestor("table"),n=this.editor.plugins.get("TableUtils").getColumns(o),{first:i,last:r}=R(e);this.isEnabled=r-i<n-1}else this.isEnabled=!1}execute(){const[e,t]=function(e){const t=V(e),o=t[0],n=t.pop(),i=[o,n];return o.isBefore(n)?i:i.reverse()}(this.editor.model.document.selection),o=e.parent.parent,n=[...new h(o)],i={first:n.find(t=>t.cell===e).column,last:n.find(e=>e.cell===t).column},r=function(e,t,o,n){return parseInt(o.getAttribute("colspan")||1)>1?o:t.previousSibling||o.nextSibling?o.nextSibling||t.previousSibling:n.first?e.reverse().find(({column:e})=>e<n.first).cell:e.reverse().find(({column:e})=>e>n.last).cell}(n,e,t,i);this.editor.model.change(e=>{const t=i.last-i.first+1;this.editor.plugins.get("TableUtils").removeColumns(o,{at:i.first,columns:t}),e.setSelection(e.createPositionAt(r,0))})}}class Z extends n.Command{refresh(){const e=V(this.editor.model.document.selection),t=e.length>0;this.isEnabled=t,this.value=t&&e.every(e=>this._isInHeading(e,e.parent.parent))}execute(e={}){if(e.forceValue===this.value)return;const t=this.editor.model,o=V(t.document.selection),n=o[0].findAncestor("table"),{first:i,last:l}=S(o),s=this.value?i:l+1,a=n.getAttribute("headingRows")||0;t.change(e=>{if(s){const t=H(n,s,s>a?a:0);for(const{cell:o}of t)F(o,s,e)}r("headingRows",s,n,e,0)})}_isInHeading(e,t){const o=parseInt(t.getAttribute("headingRows")||0);return!!o&&e.parent.index<o}}class ee extends n.Command{refresh(){const e=V(this.editor.model.document.selection),t=this.editor.plugins.get("TableUtils"),o=e.length>0;this.isEnabled=o,this.value=o&&e.every(e=>s(t,e))}execute(e={}){if(e.forceValue===this.value)return;const t=this.editor.model,o=V(t.document.selection),n=o[0].findAncestor("table"),{first:i,last:l}=R(o),s=this.value?i:l+1;t.change(e=>{if(s){const t=D(n,s);for(const{cell:o,column:n}of t)W(o,n,s,e)}r("headingColumns",s,n,e,0)})}}class te extends n.Plugin{static get pluginName(){return"TableUtils"}init(){this.decorate("insertColumns"),this.decorate("insertRows")}getCellLocation(e){const t=e.parent,o=t.parent,n=o.getChildIndex(t),i=new h(o,{row:n});for(const{cell:t,row:o,column:n}of i)if(t===e)return{row:o,column:n}}createTable(e,t){const o=e.createElement("table"),n=parseInt(t.rows)||2,i=parseInt(t.columns)||2;return oe(e,o,0,n,i),t.headingRows&&r("headingRows",Math.min(t.headingRows,n),o,e,0),t.headingColumns&&r("headingColumns",Math.min(t.headingColumns,i),o,e,0),o}insertRows(e,t={}){const o=this.editor.model,n=t.at||0,i=t.rows||1,s=void 0!==t.copyStructureFromAbove,c=t.copyStructureFromAbove?n-1:n,d=this.getRows(e),u=this.getColumns(e);if(n>d)throw new a.CKEditorError("tableutils-insertrows-insert-out-of-range",this,{options:t});o.change(t=>{const o=e.getAttribute("headingRows")||0;if(o>n&&r("headingRows",o+i,e,t,0),!s&&(0===n||n===d))return void oe(t,e,n,i,u);const a=s?Math.max(n,c):n,b=new h(e,{endRow:a}),m=new Array(u).fill(1);for(const{row:e,column:o,cellHeight:r,cellWidth:l,cell:a}of b){const d=e+r-1,u=e<=c&&c<=d;e<n&&n<=d?(t.setAttribute("rowspan",r+i,a),m[o]=-l):s&&u&&(m[o]=l)}for(let o=0;o<i;o++){const o=t.createElement("tableRow");t.insert(o,e,n);for(let e=0;e<m.length;e++){const n=m[e],i=t.createPositionAt(o,"end");n>0&&l(t,i,n>1?{colspan:n}:null),e+=Math.abs(n)-1}}})}insertColumns(e,t={}){const o=this.editor.model,n=t.at||0,i=t.columns||1;o.change(t=>{const o=e.getAttribute("headingColumns");n<o&&t.setAttribute("headingColumns",o+i,e);const r=this.getColumns(e);if(0===n||r===n){for(const o of e.getChildren())o.is("element","tableRow")&&ne(i,t,t.createPositionAt(o,n?"end":0));return}const l=new h(e,{column:n,includeAllSlots:!0});for(const e of l){const{row:o,cell:r,cellAnchorColumn:s,cellAnchorRow:a,cellWidth:c,cellHeight:d}=e;if(s<n){t.setAttribute("colspan",c+i,r);const e=a+d-1;for(let t=o;t<=e;t++)l.skipRow(t)}else ne(i,t,e.getPositionBefore())}})}removeRows(e,t){const o=this.editor.model,n=t.rows||1,i=this.getRows(e),l=t.at,s=l+n-1;if(s>i-1)throw new a.CKEditorError("tableutils-removerows-row-index-out-of-range",this,{table:e,options:t});o.change(t=>{const{cellsToMove:o,cellsToTrim:n}=function(e,t,o){const n=new Map,i=[];for(const{row:r,column:l,cellHeight:s,cell:a}of new h(e,{endRow:o})){const e=r+s-1;if(r>=t&&r<=o&&e>o){const e=s-(o-r+1);n.set(l,{cell:a,rowspan:e})}if(r<t&&e>=t){let n;n=e>=o?o-t+1:e-t+1,i.push({cell:a,rowspan:s-n})}}return{cellsToMove:n,cellsToTrim:i}}(e,l,s);if(o.size){!function(e,t,o,n){const i=[...new h(e,{includeAllSlots:!0,row:t})],l=e.getChild(t);let s;for(const{column:e,cell:t,isAnchor:a}of i)if(o.has(e)){const{cell:t,rowspan:i}=o.get(e),a=s?n.createPositionAfter(s):n.createPositionAt(l,0);n.move(n.createRangeOn(t),a),r("rowspan",i,t,n),s=t}else a&&(s=t)}(e,s+1,o,t)}for(let o=s;o>=l;o--)t.remove(e.getChild(o));for(const{rowspan:e,cell:o}of n)r("rowspan",e,o,t);!function(e,t,o,n){const i=e.getAttribute("headingRows")||0;if(t<i){r("headingRows",o<i?i-(o-t+1):t,e,n,0)}}(e,l,s,t),U(e,this)||K(e,this)})}removeColumns(e,t){const o=this.editor.model,n=t.at,i=t.columns||1,l=t.at+i-1;o.change(t=>{!function(e,t,o){const n=e.getAttribute("headingColumns")||0;if(n&&t.first<n){const i=Math.min(n-1,t.last)-t.first+1;o.setAttribute("headingColumns",n-i,e)}}(e,{first:n,last:l},t);for(let o=l;o>=n;o--)for(const{cell:n,column:i,cellWidth:l}of[...new h(e)])i<=o&&l>1&&i+l>o?r("colspan",l-1,n,t):i===o&&t.remove(n);K(e,this)||U(e,this)})}splitCellVertically(e,t=2){const o=this.editor.model,n=e.parent.parent,i=parseInt(e.getAttribute("rowspan")||1),l=parseInt(e.getAttribute("colspan")||1);o.change(o=>{if(l>1){const{newCellsSpan:n,updatedSpan:s}=ie(l,t);r("colspan",s,e,o);const a={};n>1&&(a.colspan=n),i>1&&(a.rowspan=i);ne(l>t?t-1:l-1,o,o.createPositionAfter(e),a)}if(l<t){const s=t-l,a=[...new h(n)],{column:c}=a.find(({cell:t})=>t===e),d=a.filter(({cell:t,cellWidth:o,column:n})=>t!==e&&n===c||n<c&&n+o>c);for(const{cell:e,cellWidth:t}of d)o.setAttribute("colspan",t+s,e);const u={};i>1&&(u.rowspan=i),ne(s,o,o.createPositionAfter(e),u);const b=n.getAttribute("headingColumns")||0;b>c&&r("headingColumns",b+s,n,o)}})}splitCellHorizontally(e,t=2){const o=this.editor.model,n=e.parent,i=n.parent,l=i.getChildIndex(n),s=parseInt(e.getAttribute("rowspan")||1),a=parseInt(e.getAttribute("colspan")||1);o.change(o=>{if(s>1){const n=[...new h(i,{startRow:l,endRow:l+s-1,includeAllSlots:!0})],{newCellsSpan:c,updatedSpan:d}=ie(s,t);r("rowspan",d,e,o);const{column:u}=n.find(({cell:t})=>t===e),b={};c>1&&(b.rowspan=c),a>1&&(b.colspan=a);for(const e of n){const{column:t,row:n}=e,i=t===u,r=(n+l+d)%c==0;n>=l+d&&i&&r&&ne(1,o,e.getPositionBefore(),b)}}if(s<t){const n=t-s,c=[...new h(i,{startRow:0,endRow:l})];for(const{cell:t,cellHeight:i,row:r}of c)if(t!==e&&r+i>l){const e=i+n;o.setAttribute("rowspan",e,t)}const d={};a>1&&(d.colspan=a),oe(o,i,l+1,n,1,d);const u=i.getAttribute("headingRows")||0;u>l&&r("headingRows",u+n,i,o)}})}getColumns(e){return[...e.getChild(0).getChildren()].reduce((e,t)=>e+parseInt(t.getAttribute("colspan")||1),0)}getRows(e){return Array.from(e.getChildren()).reduce((e,t)=>t.is("element","tableRow")?e+1:e,0)}}function oe(e,t,o,n,i,r={}){for(let l=0;l<n;l++){const n=e.createElement("tableRow");e.insert(n,t,o),ne(i,e,e.createPositionAt(n,"end"),r)}}function ne(e,t,o,n={}){for(let i=0;i<e;i++)l(t,o,n)}function ie(e,t){if(e<t)return{newCellsSpan:1,updatedSpan:1};const o=Math.floor(e/t);return{newCellsSpan:o,updatedSpan:e-o*t+o}}class re extends n.Command{refresh(){const e=x(this.editor.model.document.selection);this.isEnabled=I(e,this.editor.plugins.get(te))}execute(){const e=this.editor.model,t=this.editor.plugins.get(te);e.change(o=>{const n=x(e.document.selection),i=n.shift(),{mergeWidth:l,mergeHeight:s}=function(e,t,o){let n=0,i=0;for(const e of t){const{row:t,column:r}=o.getCellLocation(e);n=ae(e,r,n,"colspan"),i=ae(e,t,i,"rowspan")}const{row:r,column:l}=o.getCellLocation(e);return{mergeWidth:n-l,mergeHeight:i-r}}(i,n,t);r("colspan",l,i,o),r("rowspan",s,i,o);for(const e of n)le(e,i,o);$(i.findAncestor("table"),t),o.setSelection(i,"in")})}}function le(e,t,o){se(e)||(se(t)&&o.remove(o.createRangeIn(t)),o.move(o.createRangeIn(e),o.createPositionAt(t,"end"))),o.remove(e)}function se(e){return 1==e.childCount&&e.getChild(0).is("element","paragraph")&&e.getChild(0).isEmpty}function ae(e,t,o,n){const i=parseInt(e.getAttribute(n)||1);return Math.max(o,t+i)}class ce extends n.Command{refresh(){const e=V(this.editor.model.document.selection);this.isEnabled=e.length>0}execute(){const e=this.editor.model,t=V(e.document.selection),o=S(t),n=t[0].findAncestor("table"),i=[];for(let t=o.first;t<=o.last;t++)for(const o of n.getChild(t).getChildren())i.push(e.createRangeOn(o));e.change(e=>{e.setSelection(i)})}}class de extends n.Command{refresh(){const e=V(this.editor.model.document.selection);this.isEnabled=e.length>0}execute(){const e=this.editor.model,t=V(e.document.selection),o=t[0],n=t.pop(),i=o.findAncestor("table"),r=this.editor.plugins.get("TableUtils"),l=r.getCellLocation(o),s=r.getCellLocation(n),a=Math.min(l.column,s.column),c=Math.max(l.column,s.column),d=[];for(const t of new h(i,{startColumn:a,endColumn:c}))d.push(e.createRangeOn(t.cell));e.change(e=>{e.setSelection(d)})}}function ue(e){e.document.registerPostFixer(t=>function(e,t){const o=t.document.differ.getChanges();let n=!1;const i=new Set;for(const t of o){let o;"table"==t.name&&"insert"==t.type&&(o=t.position.nodeAfter),"tableRow"!=t.name&&"tableCell"!=t.name||(o=t.position.findAncestor("table")),me(t)&&(o=t.range.start.findAncestor("table")),o&&!i.has(o)&&(n=he(o,e)||n,n=be(o,e)||n,i.add(o))}return n}(t,e))}function he(e,t){let o=!1;const n=function(e){const t=parseInt(e.getAttribute("headingRows")||0),o=Array.from(e.getChildren()).reduce((e,t)=>t.is("element","tableRow")?e+1:e,0),n=[];for(const{row:i,cell:r,cellHeight:l}of new h(e)){if(l<2)continue;const e=i<t?t:o;if(i+l>e){const t=e-i;n.push({cell:r,rowspan:t})}}return n}(e);if(n.length){o=!0;for(const e of n)r("rowspan",e.rowspan,e.cell,t,1)}return o}function be(e,t){let o=!1;const n=function(e){const t=new Array(e.childCount).fill(0);for(const{rowIndex:o}of new h(e,{includeAllSlots:!0}))t[o]++;return t}(e),i=[];for(const[t,o]of n.entries())!o&&e.getChild(t).is("element","tableRow")&&i.push(t);if(i.length){o=!0;for(const o of i.reverse())t.remove(e.getChild(o)),n.splice(o,1)}const r=n.filter((t,o)=>e.getChild(o).is("element","tableRow")),s=r[0];if(!r.every(e=>e===s)){const n=r.reduce((e,t)=>t>e?t:e,0);for(const[i,s]of r.entries()){const r=n-s;if(r){for(let o=0;o<r;o++)l(t,t.createPositionAt(e.getChild(i),"end"));o=!0}}}return o}function me(e){const t="attribute"===e.type,o=e.attributeKey;return t&&("headingRows"===o||"colspan"===o||"rowspan"===o)}function ge(e){e.document.registerPostFixer(t=>function(e,t){const o=t.document.differ.getChanges();let n=!1;for(const t of o)"insert"==t.type&&"table"==t.name&&(n=pe(t.position.nodeAfter,e)||n),"insert"==t.type&&"tableRow"==t.name&&(n=fe(t.position.nodeAfter,e)||n),"insert"==t.type&&"tableCell"==t.name&&(n=we(t.position.nodeAfter,e)||n),_e(t)&&(n=we(t.position.parent,e)||n);return n}(t,e))}function pe(e,t){let o=!1;for(const n of e.getChildren())n.is("element","tableRow")&&(o=fe(n,t)||o);return o}function fe(e,t){let o=!1;for(const n of e.getChildren())o=we(n,t)||o;return o}function we(e,t){if(0==e.childCount)return t.insertElement("paragraph",e),!0;const o=Array.from(e.getChildren()).filter(e=>e.is("$text"));for(const e of o)t.wrap(t.createRangeOn(e),"paragraph");return!!o.length}function _e(e){return!(!e.position||!e.position.parent.is("element","tableCell"))&&("insert"==e.type&&"$text"==e.name||"remove"==e.type)}function ke(e,t){e.document.registerPostFixer(()=>function(e,t){const o=new Set;for(const t of e.getChanges()){const e="attribute"==t.type?t.range.start.parent:t.position.parent;e.is("element","tableCell")&&o.add(e)}for(const n of o.values())for(const o of[...n.getChildren()].filter(e=>ve(e,t)))e.refreshItem(o);return!1}(e.document.differ,t))}function ve(e,t){if(!e.is("element","paragraph"))return!1;const o=t.toViewElement(e);return!!o&&p(e)!==o.is("element","span")}function Ce(e){e.document.registerPostFixer(()=>function(e){const t=e.document.differ,o=new Set;for(const e of t.getChanges()){if("attribute"!=e.type)continue;const t=e.range.start.nodeAfter;t&&t.is("element","table")&&"headingRows"==e.attributeKey&&o.add(t)}if(o.size){for(const e of o.values())t.refreshItem(e);return!0}return!1}(e))}o(11);class ye extends n.Plugin{static get pluginName(){return"TableEditing"}init(){const e=this.editor,t=e.model,o=t.schema,n=e.conversion;o.register("table",{allowWhere:"$block",allowAttributes:["headingRows","headingColumns"],isObject:!0,isBlock:!0}),o.register("tableRow",{allowIn:"table",isLimit:!0}),o.register("tableCell",{allowIn:"tableRow",allowChildren:"$block",allowAttributes:["colspan","rowspan"],isLimit:!0,isSelectable:!0}),n.for("upcast").add(e=>{e.on("element:figure",(e,t,o)=>{if(!o.consumable.test(t.viewItem,{name:!0,classes:"table"}))return;const n=function(e){for(const t of e.getChildren())if(t.is("element","table"))return t}(t.viewItem);if(!n||!o.consumable.test(n,{name:!0}))return;const i=o.convertItem(n,t.modelCursor),r=Object(a.first)(i.modelRange.getItems());r&&(o.convertChildren(t.viewItem,o.writer.createPositionAt(r,"end")),o.updateConversionResult(r,t))})}),n.for("upcast").add(c()),n.for("editingDowncast").add(m({asWidget:!0})),n.for("dataDowncast").add(m()),n.for("upcast").elementToElement({model:"tableRow",view:"tr"}),n.for("upcast").add(e=>{e.on("element:tr",(e,t)=>{t.viewItem.isEmpty&&0==t.modelCursor.index&&e.stop()},{priority:"high"})}),n.for("editingDowncast").add(e=>e.on("insert:tableRow",(e,t,o)=>{const n=t.item;if(!o.consumable.consume(n,"insert"))return;const i=n.parent,r=function(e){for(const t of e.getChildren())if("table"===t.name)return t}(o.mapper.toViewElement(i)),l=i.getChildIndex(n),s=new h(i,{row:l}),a={headingRows:i.getAttribute("headingRows")||0,headingColumns:i.getAttribute("headingColumns")||0},c=new Map;for(const e of s){const t=c.get(l)||_(r,n,l,a,o);c.set(l,t),o.consumable.consume(e.cell,"insert"),w(e,a,o.writer.createPositionAt(t,"end"),o,{asWidget:!0})}})),n.for("editingDowncast").add(e=>e.on("remove:tableRow",(e,t,o)=>{e.stop();const n=o.writer,i=o.mapper,r=i.toViewPosition(t.position).getLastMatchingPosition(e=>!e.item.is("element","tr")).nodeAfter,l=r.parent.parent,s=n.createRangeOn(r),a=n.remove(s);for(const e of n.createRangeIn(a).getItems())i.unbindViewElement(e);C("thead",l,o),C("tbody",l,o)},{priority:"higher"})),n.for("upcast").elementToElement({model:"tableCell",view:"td"}),n.for("upcast").elementToElement({model:"tableCell",view:"th"}),n.for("upcast").add(d("td")),n.for("upcast").add(d("th")),n.for("editingDowncast").add(e=>e.on("insert:tableCell",(e,t,o)=>{const n=t.item;if(!o.consumable.consume(n,"insert"))return;const i=n.parent,r=i.parent,l=r.getChildIndex(i),s=new h(r,{row:l}),a={headingRows:r.getAttribute("headingRows")||0,headingColumns:r.getAttribute("headingColumns")||0};for(const e of s)if(e.cell===n){const t=o.mapper.toViewElement(i);return void w(e,a,o.writer.createPositionAt(t,i.getChildIndex(n)),o,{asWidget:!0})}})),n.for("editingDowncast").elementToElement({model:"paragraph",view:g,converterPriority:"high"}),n.for("downcast").attributeToAttribute({model:"colspan",view:"colspan"}),n.for("upcast").attributeToAttribute({model:{key:"colspan",value:Te("colspan")},view:"colspan"}),n.for("downcast").attributeToAttribute({model:"rowspan",view:"rowspan"}),n.for("upcast").attributeToAttribute({model:{key:"rowspan",value:Te("rowspan")},view:"rowspan"}),n.for("editingDowncast").add(e=>e.on("attribute:headingColumns:table",(e,t,o)=>{const n=t.item;if(!o.consumable.consume(t.item,e.name))return;const i={headingRows:n.getAttribute("headingRows")||0,headingColumns:n.getAttribute("headingColumns")||0},r=t.attributeOldValue,l=t.attributeNewValue,s=(r>l?r:l)-1;for(const e of new h(n,{endColumn:s}))f(e,i,o)})),e.data.mapper.on("modelToViewPosition",(e,t)=>{const o=t.modelPosition.parent,n=t.modelPosition.nodeBefore;if(!o.is("element","tableCell"))return;if(!n||!n.is("element","paragraph"))return;const i=t.mapper.toViewElement(n),r=t.mapper.toViewElement(o);i===r&&(t.viewPosition=t.mapper.findPositionIn(r,n.maxOffset))}),e.config.define("table.defaultHeadings.rows",0),e.config.define("table.defaultHeadings.columns",0),e.commands.add("insertTable",new T(e)),e.commands.add("insertTableRowAbove",new L(e,{order:"above"})),e.commands.add("insertTableRowBelow",new L(e,{order:"below"})),e.commands.add("insertTableColumnLeft",new N(e,{order:"left"})),e.commands.add("insertTableColumnRight",new N(e,{order:"right"})),e.commands.add("removeTableRow",new Y(e)),e.commands.add("removeTableColumn",new Q(e)),e.commands.add("splitTableCellVertically",new z(e,{direction:"vertically"})),e.commands.add("splitTableCellHorizontally",new z(e,{direction:"horizontally"})),e.commands.add("mergeTableCells",new re(e)),e.commands.add("mergeTableCellRight",new J(e,{direction:"right"})),e.commands.add("mergeTableCellLeft",new J(e,{direction:"left"})),e.commands.add("mergeTableCellDown",new J(e,{direction:"down"})),e.commands.add("mergeTableCellUp",new J(e,{direction:"up"})),e.commands.add("setTableColumnHeader",new ee(e)),e.commands.add("setTableRowHeader",new Z(e)),e.commands.add("selectTableRow",new ce(e)),e.commands.add("selectTableColumn",new de(e)),Ce(t),ue(t),ke(t,e.editing.mapper),ge(t)}static get requires(){return[te]}}function Te(e){return t=>{const o=parseInt(t.getAttribute(e));return Number.isNaN(o)||o<=0?null:o}}var xe=o(0);o(13);class Ae extends xe.View{constructor(e){super(e);const t=this.bindTemplate;this.items=this._createGridCollection(),this.set("rows",0),this.set("columns",0),this.bind("label").to(this,"columns",this,"rows",(e,t)=>`${t} × ${e}`),this.setTemplate({tag:"div",attributes:{class:["ck"]},children:[{tag:"div",attributes:{class:["ck-insert-table-dropdown__grid"]},on:{"mouseover@.ck-insert-table-dropdown-grid-box":t.to("boxover")},children:this.items},{tag:"div",attributes:{class:["ck-insert-table-dropdown__label"]},children:[{text:t.to("label")}]}],on:{mousedown:t.to(e=>{e.preventDefault()}),click:t.to(()=>{this.fire("execute")})}}),this.on("boxover",(e,t)=>{const{row:o,column:n}=t.target.dataset;this.set({rows:parseInt(o),columns:parseInt(n)})}),this.on("change:columns",()=>{this._highlightGridBoxes()}),this.on("change:rows",()=>{this._highlightGridBoxes()})}focus(){}focusLast(){}_highlightGridBoxes(){const e=this.rows,t=this.columns;this.items.map((o,n)=>{const i=Math.floor(n/10)<e&&n%10<t;o.set("isOn",i)})}_createGridCollection(){const e=[];for(let t=0;t<100;t++){const o=Math.floor(t/10),n=t%10;e.push(new Ve(this.locale,o+1,n+1))}return this.createCollection(e)}}class Ve extends xe.View{constructor(e,t,o){super(e);const n=this.bindTemplate;this.set("isOn",!1),this.setTemplate({tag:"div",attributes:{class:["ck-insert-table-dropdown-grid-box",n.if("isOn","ck-on")],"data-row":t,"data-column":o}})}}class Se extends n.Plugin{static get pluginName(){return"TableUI"}init(){const e=this.editor,t=this.editor.t,o="ltr"===e.locale.contentLanguageDirection;e.ui.componentFactory.add("insertTable",o=>{const n=e.commands.get("insertTable"),i=Object(xe.createDropdown)(o);let r;return i.bind("isEnabled").to(n),i.buttonView.set({icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 6v3h4V6H3zm0 4v3h4v-3H3zm0 4v3h4v-3H3zm5 3h4v-3H8v3zm5 0h4v-3h-4v3zm4-4v-3h-4v3h4zm0-4V6h-4v3h4zm1.5 8a1.5 1.5 0 0 1-1.5 1.5H3A1.5 1.5 0 0 1 1.5 17V4c.222-.863 1.068-1.5 2-1.5h13c.932 0 1.778.637 2 1.5v13zM12 13v-3H8v3h4zm0-4V6H8v3h4z"/></svg>',label:t("Insert table"),tooltip:!0}),i.on("change:isOpen",()=>{r||(r=new Ae(o),i.panelView.children.add(r),r.delegate("execute").to(i),i.buttonView.on("open",()=>{r.rows=0,r.columns=0}),i.on("execute",()=>{e.execute("insertTable",{rows:r.rows,columns:r.columns}),e.editing.view.focus()}))}),i}),e.ui.componentFactory.add("tableColumn",e=>{const n=[{type:"switchbutton",model:{commandName:"setTableColumnHeader",label:t("Header column"),bindIsOn:!0}},{type:"separator"},{type:"button",model:{commandName:o?"insertTableColumnLeft":"insertTableColumnRight",label:t("Insert column left")}},{type:"button",model:{commandName:o?"insertTableColumnRight":"insertTableColumnLeft",label:t("Insert column right")}},{type:"button",model:{commandName:"removeTableColumn",label:t("Delete column")}},{type:"button",model:{commandName:"selectTableColumn",label:t("Select column")}}];return this._prepareDropdown(t("Column"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M18 7v1H2V7h16zm0 5v1H2v-1h16z" opacity=".6"/><path d="M14 1v18a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1zm-2 1H8v4h4V2zm0 6H8v4h4V8zm0 6H8v4h4v-4z"/></svg>',n,e)}),e.ui.componentFactory.add("tableRow",e=>{const o=[{type:"switchbutton",model:{commandName:"setTableRowHeader",label:t("Header row"),bindIsOn:!0}},{type:"separator"},{type:"button",model:{commandName:"insertTableRowAbove",label:t("Insert row above")}},{type:"button",model:{commandName:"insertTableRowBelow",label:t("Insert row below")}},{type:"button",model:{commandName:"removeTableRow",label:t("Delete row")}},{type:"button",model:{commandName:"selectTableRow",label:t("Select row")}}];return this._prepareDropdown(t("Row"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M7 2h1v16H7V2zm5 0h1v16h-1V2z" opacity=".6"/><path d="M1 6h18a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm1 2v4h4V8H2zm6 0v4h4V8H8zm6 0v4h4V8h-4z"/></svg>',o,e)}),e.ui.componentFactory.add("mergeTableCells",e=>{const n=[{type:"button",model:{commandName:"mergeTableCellUp",label:t("Merge cell up")}},{type:"button",model:{commandName:o?"mergeTableCellRight":"mergeTableCellLeft",label:t("Merge cell right")}},{type:"button",model:{commandName:"mergeTableCellDown",label:t("Merge cell down")}},{type:"button",model:{commandName:o?"mergeTableCellLeft":"mergeTableCellRight",label:t("Merge cell left")}},{type:"separator"},{type:"button",model:{commandName:"splitTableCellVertically",label:t("Split cell vertically")}},{type:"button",model:{commandName:"splitTableCellHorizontally",label:t("Split cell horizontally")}}];return this._prepareMergeSplitButtonDropdown(t("Merge cells"),'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M7 2h1v16H7V2zm5 0h1v7h-1V2zm6 5v1H2V7h16zM8 12v1H2v-1h6z" opacity=".6"/><path d="M7 7h12a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1zm1 2v9h10V9H8z"/></svg>',n,e)})}_prepareDropdown(e,t,o,n){const i=this.editor,r=Object(xe.createDropdown)(n),l=this._fillDropdownWithListOptions(r,o);return r.buttonView.set({label:e,icon:t,tooltip:!0}),r.bind("isEnabled").toMany(l,"isEnabled",(...e)=>e.some(e=>e)),this.listenTo(r,"execute",e=>{i.execute(e.source.commandName),i.editing.view.focus()}),r}_prepareMergeSplitButtonDropdown(e,t,o,n){const i=this.editor,r=Object(xe.createDropdown)(n,xe.SplitButtonView),l=i.commands.get("mergeTableCells"),s=this._fillDropdownWithListOptions(r,o);return r.buttonView.set({label:e,icon:t,tooltip:!0,isEnabled:!0}),r.bind("isEnabled").toMany([l,...s],"isEnabled",(...e)=>e.some(e=>e)),this.listenTo(r.buttonView,"execute",()=>{i.execute("mergeTableCells"),i.editing.view.focus()}),this.listenTo(r,"execute",e=>{i.execute(e.source.commandName),i.editing.view.focus()}),r}_fillDropdownWithListOptions(e,t){const o=this.editor,n=[],i=new a.Collection;for(const e of t)Re(e,o,n,i);return Object(xe.addListToDropdown)(e,i,o.ui.componentFactory),n}}function Re(e,t,o,n){const i=e.model=new xe.Model(e.model),{commandName:r,bindIsOn:l}=e.model;if("button"===e.type||"switchbutton"===e.type){const e=t.commands.get(r);o.push(e),i.set({commandName:r}),i.bind("isEnabled").to(e),l&&i.bind("isOn").to(e,"value")}i.set({withText:!0}),n.add(e)}o(15);class Ie extends n.Plugin{static get pluginName(){return"TableSelection"}static get requires(){return[te]}init(){const e=this.editor.model;this.listenTo(e,"deleteContent",(e,t)=>this._handleDeleteContent(e,t),{priority:"high"}),this._defineSelectionConverter(),this._enablePluginDisabling()}getSelectedTableCells(){const e=x(this.editor.model.document.selection);return 0==e.length?null:e}getSelectionAsFragment(){const e=this.getSelectedTableCells();return e?this.editor.model.change(t=>{const o=t.createDocumentFragment(),n=this.editor.plugins.get("TableUtils"),{first:i,last:r}=R(e),{first:l,last:s}=S(e),a=e[0].findAncestor("table");let c=s,d=r;if(I(e,n)){const e={firstColumn:i,lastColumn:r,firstRow:l,lastRow:s};c=q(a,e),d=G(a,e)}const u=M(a,{startRow:l,startColumn:i,endRow:c,endColumn:d},t);return t.insert(u,o,0),o}):null}setCellSelection(e,t){const o=this._getCellsToSelect(e,t);this.editor.model.change(e=>{e.setSelection(o.cells.map(t=>e.createRangeOn(t)),{backward:o.backward})})}getFocusCell(){const e=[...this.editor.model.document.selection.getRanges()].pop().getContainedElement();return e&&e.is("element","tableCell")?e:null}getAnchorCell(){const e=this.editor.model.document.selection,t=Object(a.first)(e.getRanges()).getContainedElement();return t&&t.is("element","tableCell")?t:null}_defineSelectionConverter(){const e=this.editor,t=new Set;e.conversion.for("editingDowncast").add(e=>e.on("selection",(e,o,n)=>{const i=n.writer;!function(e){for(const o of t)e.removeClass("ck-editor__editable_selected",o);t.clear()}(i);const r=this.getSelectedTableCells();if(!r)return;for(const e of r){const o=n.mapper.toViewElement(e);i.addClass("ck-editor__editable_selected",o),t.add(o)}const l=n.mapper.toViewElement(r[r.length-1]);i.setSelection(l,0)},{priority:"lowest"}))}_enablePluginDisabling(){const e=this.editor;this.on("change:isEnabled",()=>{if(!this.isEnabled){const t=this.getSelectedTableCells();if(!t)return;e.model.change(o=>{const n=o.createPositionAt(t[0],0),i=e.model.schema.getNearestSelectionRange(n);o.setSelection(i)})}})}_handleDeleteContent(e,t){const[o,n]=t,i=this.editor.model,r=!n||"backward"==n.direction,l=x(o);l.length&&(e.stop(),i.change(e=>{const t=l[r?l.length-1:0];i.change(e=>{for(const t of l)i.deleteContent(e.createSelection(t,"in"))});const n=i.schema.getNearestSelectionRange(e.createPositionAt(t,0));o.is("documentSelection")?e.setSelection(n):o.setTo(n)}))}_getCellsToSelect(e,t){const o=this.editor.plugins.get("TableUtils"),n=o.getCellLocation(e),i=o.getCellLocation(t),r=Math.min(n.row,i.row),l=Math.max(n.row,i.row),s=Math.min(n.column,i.column),a=Math.max(n.column,i.column),c=new Array(l-r+1).fill(null).map(()=>[]),d={startRow:r,endRow:l,startColumn:s,endColumn:a};for(const{row:t,cell:o}of new h(e.findAncestor("table"),d))c[t-r].push(o);const u=i.row<n.row,b=i.column<n.column;return u&&c.reverse(),b&&c.forEach(e=>e.reverse()),{cells:c.flat(),backward:u||b}}}class Pe extends n.Plugin{static get pluginName(){return"TableClipboard"}static get requires(){return[Ie,te]}init(){const e=this.editor,t=e.editing.view.document;this.listenTo(t,"copy",(e,t)=>this._onCopyCut(e,t)),this.listenTo(t,"cut",(e,t)=>this._onCopyCut(e,t)),this.listenTo(e.model,"insertContent",(e,t)=>this._onInsertContent(e,...t),{priority:"high"}),this.decorate("_replaceTableSlotCell")}_onCopyCut(e,t){const o=this.editor.plugins.get(Ie);if(!o.getSelectedTableCells())return;if("cut"==e.name&&this.editor.isReadOnly)return;t.preventDefault(),e.stop();const n=this.editor.data,i=this.editor.editing.view.document,r=n.toView(o.getSelectionAsFragment());i.fire("clipboardOutput",{dataTransfer:t.dataTransfer,content:r,method:e.name})}_onInsertContent(e,t,o){if(o&&!o.is("documentSelection"))return;const n=this.editor.model,i=this.editor.plugins.get(te);let r=function(e,t){if(!e.is("documentFragment")&&!e.is("element"))return null;if(e.is("element","table"))return e;if(1==e.childCount&&e.getChild(0).is("element","table"))return e.getChild(0);const o=t.createRangeIn(e);for(const e of o.getItems())if(e.is("element","table")){const n=t.createRange(o.start,t.createPositionBefore(e));if(t.hasContent(n,{ignoreWhitespaces:!0}))return null;const i=t.createRange(t.createPositionAfter(e),o.end);return t.hasContent(i,{ignoreWhitespaces:!0})?null:e}return null}(t,n);if(!r)return;const l=V(n.document.selection);l.length?(e.stop(),n.change(e=>{const t={width:i.getColumns(r),height:i.getRows(r)},o=function(e,t,o,n){const i=e[0].findAncestor("table"),r=R(e),l=S(e),s={firstColumn:r.first,lastColumn:r.last,firstRow:l.first,lastRow:l.last},a=1===e.length;a&&(s.lastRow+=t.height-1,s.lastColumn+=t.width-1,function(e,t,o,n){const i=n.getColumns(e),r=n.getRows(e);o>i&&n.insertColumns(e,{at:i,columns:o-i});t>r&&n.insertRows(e,{at:r,rows:t-r})}(i,s.lastRow+1,s.lastColumn+1,n));a||!I(e,n)?function(e,t,o){const{firstRow:n,lastRow:i,firstColumn:r,lastColumn:l}=t,s={first:n,last:i},a={first:r,last:l};Be(e,r,s,o),Be(e,l+1,s,o),Ee(e,n,a,o),Ee(e,i+1,a,o,n)}(i,s,o):(s.lastRow=q(i,s),s.lastColumn=G(i,s));return s}(l,t,e,i),n=o.lastRow-o.firstRow+1,s=o.lastColumn-o.firstColumn+1,a={startRow:0,startColumn:0,endRow:Math.min(n,t.height)-1,endColumn:Math.min(s,t.width)-1};r=M(r,a,e);const c=l[0].findAncestor("table"),d=this._replaceSelectedCellsWithPasted(r,t,c,o,e);if(this.editor.plugins.get("TableSelection").isEnabled){const t=P(d.map(t=>e.createRangeOn(t)));e.setSelection(t)}else e.setSelection(d[0],0)})):$(r,i)}_replaceSelectedCellsWithPasted(e,t,o,n,i){const{width:r,height:l}=t,s=function(e,t,o){const n=new Array(o).fill(null).map(()=>new Array(t).fill(null));for(const{column:t,row:o,cell:i}of new h(e))n[o][t]=i;return n}(e,r,l),a=[...new h(o,{startRow:n.firstRow,endRow:n.lastRow,startColumn:n.firstColumn,endColumn:n.lastColumn,includeAllSlots:!0})],c=[];let d;for(const e of a){const{row:t,column:o}=e;o===n.firstColumn&&(d=e.getPositionBefore());const a=t-n.firstRow,u=o-n.firstColumn,h=s[a%l][u%r],b=h?i.cloneElement(h):null,m=this._replaceTableSlotCell(e,b,d,i);m&&(j(m,t,o,n.lastRow,n.lastColumn,i),c.push(m),d=i.createPositionAfter(m))}const u=parseInt(o.getAttribute("headingRows")||0),b=parseInt(o.getAttribute("headingColumns")||0),m=n.firstRow<u&&u<=n.lastRow,g=n.firstColumn<b&&b<=n.lastColumn;if(m){const e=Ee(o,u,{first:n.firstColumn,last:n.lastColumn},i,n.firstRow);c.push(...e)}if(g){const e=Be(o,b,{first:n.firstRow,last:n.lastRow},i);c.push(...e)}return c}_replaceTableSlotCell(e,t,o,n){const{cell:i,isAnchor:r}=e;return r&&n.remove(i),t?(n.insert(t,o),t):null}}function Ee(e,t,o,n,i=0){if(t<1)return;return H(e,t,i).filter(({column:e,cellWidth:t})=>Oe(e,t,o)).map(({cell:e})=>F(e,t,n))}function Be(e,t,o,n){if(t<1)return;return D(e,t).filter(({row:e,cellHeight:t})=>Oe(e,t,o)).map(({cell:e,column:o})=>W(e,o,t,n))}function Oe(e,t,o){const n=e+t-1,{first:i,last:r}=o;return e>=i&&e<=r||e<i&&n>=i}class Le extends n.Plugin{static get pluginName(){return"TableKeyboard"}static get requires(){return[Ie]}init(){const e=this.editor.editing.view.document;this.editor.keystrokes.set("Tab",(...e)=>this._handleTabOnSelectedTable(...e),{priority:"low"}),this.editor.keystrokes.set("Tab",this._getTabHandler(!0),{priority:"low"}),this.editor.keystrokes.set("Shift+Tab",this._getTabHandler(!1),{priority:"low"}),this.listenTo(e,"arrowKey",(...e)=>this._onArrowKey(...e),{context:"table"})}_handleTabOnSelectedTable(e,t){const o=this.editor,n=o.model.document.selection.getSelectedElement();n&&n.is("element","table")&&(t(),o.model.change(e=>{e.setSelection(e.createRangeIn(n.getChild(0).getChild(0)))}))}_getTabHandler(e){const t=this.editor;return(o,n)=>{let i=A(t.model.document.selection)[0];if(i||(i=this.editor.plugins.get("TableSelection").getFocusCell()),!i)return;n();const r=i.parent,l=r.parent,s=l.getChildIndex(r),a=r.getChildIndex(i),c=0===a;if(!e&&c&&0===s)return void t.model.change(e=>{e.setSelection(e.createRangeOn(l))});const d=this.editor.plugins.get("TableUtils"),u=a===r.childCount-1,h=s===d.getRows(l)-1;if(e&&h&&u&&(t.execute("insertTableRowBelow"),s===d.getRows(l)-1))return void t.model.change(e=>{e.setSelection(e.createRangeOn(l))});let b;if(e&&u){const e=l.getChild(s+1);b=e.getChild(0)}else if(!e&&c){const e=l.getChild(s-1);b=e.getChild(e.childCount-1)}else b=r.getChild(a+(e?1:-1));t.model.change(e=>{e.setSelection(e.createRangeIn(b))})}}_onArrowKey(e,t){const o=this.editor,n=t.keyCode,i=Object(a.getLocalizedArrowKeyCodeDirection)(n,o.locale.contentLanguageDirection);this._handleArrowKeys(i,t.shiftKey)&&(t.preventDefault(),t.stopPropagation(),e.stop())}_handleArrowKeys(e,t){const o=this.editor.model.document.selection,n=["right","down"].includes(e),i=x(o);if(i.length){let o;return o=t?this.editor.plugins.get("TableSelection").getFocusCell():n?i[i.length-1]:i[0],this._navigateFromCellInDirection(o,e,t),!0}const r=o.focus.findAncestor("tableCell");return!!r&&(!(t&&!o.isCollapsed&&o.isBackward==n)&&(!!this._isSelectionAtCellEdge(o,r,n)&&(this._navigateFromCellInDirection(r,e,t),!0)))}_isSelectionAtCellEdge(e,t,o){const n=this.editor.model,i=this.editor.model.schema,r=o?e.getLastPosition():e.getFirstPosition();if(!i.getLimitElement(r).is("element","tableCell")){return n.createPositionAt(t,o?"end":0).isTouching(r)}const l=n.createSelection(r);return n.modifySelection(l,{direction:o?"forward":"backward"}),r.isEqual(l.focus)}_navigateFromCellInDirection(e,t,o=!1){const n=this.editor.model,i=e.findAncestor("table"),r=[...new h(i,{includeAllSlots:!0})],{row:l,column:s}=r[r.length-1],a=r.find(({cell:t})=>t==e);let{row:c,column:d}=a;switch(t){case"left":d--;break;case"up":c--;break;case"right":d+=a.cellWidth;break;case"down":c+=a.cellHeight}if(c<0||c>l||d<0&&c<=0||d>s&&c>=l)return void n.change(e=>{e.setSelection(e.createRangeOn(i))});d<0?(d=o?0:s,c--):d>s&&(d=o?s:0,c++);const u=r.find(e=>e.row==c&&e.column==d).cell,b=["right","down"].includes(t),m=this.editor.plugins.get("TableSelection");if(o&&m.isEnabled){const t=m.getAnchorCell()||e;m.setCellSelection(t,u)}else{const e=n.createPositionAt(u,b?0:"end");n.change(t=>{t.setSelection(e)})}}}var Ne=o(4);class ze extends Ne.DomEventObserver{constructor(e){super(e),this.domEventType=["mousemove","mouseleave"]}onDomEvent(e){this.fire(e.type,e)}}class Me extends n.Plugin{static get pluginName(){return"TableMouse"}static get requires(){return[Ie]}init(){this.editor.editing.view.addObserver(ze),this._enableShiftClickSelection(),this._enableMouseDragSelection()}_enableShiftClickSelection(){const e=this.editor;let t=!1;const o=e.plugins.get(Ie);this.listenTo(e.editing.view.document,"mousedown",(n,i)=>{if(!this.isEnabled||!o.isEnabled)return;if(!i.domEvent.shiftKey)return;const r=o.getAnchorCell()||A(e.model.document.selection)[0];if(!r)return;const l=this._getModelTableCellFromDomEvent(i);l&&He(r,l)&&(t=!0,o.setCellSelection(r,l),i.preventDefault())}),this.listenTo(e.editing.view.document,"mouseup",()=>{t=!1}),this.listenTo(e.editing.view.document,"selectionChange",e=>{t&&e.stop()},{priority:"highest"})}_enableMouseDragSelection(){const e=this.editor;let t,o,n=!1,i=!1;const r=e.plugins.get(Ie);this.listenTo(e.editing.view.document,"mousedown",(e,o)=>{this.isEnabled&&r.isEnabled&&(o.domEvent.shiftKey||o.domEvent.ctrlKey||o.domEvent.altKey||(t=this._getModelTableCellFromDomEvent(o)))}),this.listenTo(e.editing.view.document,"mousemove",(e,l)=>{if(!l.domEvent.buttons)return;if(!t)return;const s=this._getModelTableCellFromDomEvent(l);s&&He(t,s)&&(o=s,n||o==t||(n=!0)),n&&(i=!0,r.setCellSelection(t,o),l.preventDefault())}),this.listenTo(e.editing.view.document,"mouseup",()=>{n=!1,i=!1,t=null,o=null}),this.listenTo(e.editing.view.document,"selectionChange",e=>{i&&e.stop()},{priority:"highest"})}_getModelTableCellFromDomEvent(e){const t=e.target,o=this.editor.editing.view.createPositionAt(t,0);return this.editor.editing.mapper.toModelPosition(o).parent.findAncestor("tableCell",{includeSelf:!0})}}function He(e,t){return e.parent.parent==t.parent.parent}o(17);class Fe extends n.Plugin{static get requires(){return[ye,Se,Ie,Me,Le,Pe,i.Widget]}static get pluginName(){return"Table"}}function De(e){const t=e.getSelectedElement();return t&&je(t)?t:null}function We(e){let t=e.getFirstPosition().parent;for(;t;){if(t.is("element")&&je(t))return t;t=t.parent}return null}function je(e){return!!e.getCustomProperty("table")&&Object(i.isWidget)(e)}class Ue extends n.Plugin{static get requires(){return[i.WidgetToolbarRepository]}static get pluginName(){return"TableToolbar"}afterInit(){const e=this.editor,t=e.t,o=e.plugins.get(i.WidgetToolbarRepository),n=e.config.get("table.contentToolbar"),r=e.config.get("table.tableToolbar");n&&o.register("tableContent",{ariaLabel:t("Table toolbar"),items:n,getRelatedElement:We}),r&&o.register("table",{ariaLabel:t("Table toolbar"),items:r,getRelatedElement:De})}}o(19);class Ke extends xe.View{constructor(e,t){super(e);const o=this.bindTemplate;this.set("value",""),this.set("id"),this.set("isReadOnly",!1),this.set("hasError",!1),this.set("isFocused",!1),this.set("isEmpty",!0),this.set("ariaDescribedById"),this.options=t,this._dropdownView=this._createDropdownView(),this._inputView=this._createInputTextView(),this._stillTyping=!1,this.setTemplate({tag:"div",attributes:{class:["ck","ck-input-color",o.if("hasError","ck-error")],id:o.to("id"),"aria-invalid":o.if("hasError",!0),"aria-describedby":o.to("ariaDescribedById")},children:[this._dropdownView,this._inputView]}),this.on("change:value",(e,t,o)=>this._setInputValue(o))}focus(){this._inputView.focus()}_createDropdownView(){const e=this.locale,t=e.t,o=this.bindTemplate,n=this._createColorGrid(e),i=Object(xe.createDropdown)(e),r=new xe.View,l=this._createRemoveColorButton();return r.setTemplate({tag:"span",attributes:{class:["ck","ck-input-color__button__preview"],style:{backgroundColor:o.to("value")}},children:[{tag:"span",attributes:{class:["ck","ck-input-color__button__preview__no-color-indicator",o.if("value","ck-hidden",e=>""!=e)]}}]}),i.buttonView.extendTemplate({attributes:{class:"ck-input-color__button"}}),i.buttonView.children.add(r),i.buttonView.tooltip=t("Color picker"),i.panelPosition="rtl"===e.uiLanguageDirection?"se":"sw",i.panelView.children.add(l),i.panelView.children.add(n),i.bind("isEnabled").to(this,"isReadOnly",e=>!e),i}_createInputTextView(){const e=this.locale,t=new xe.InputTextView(e);return t.extendTemplate({on:{blur:t.bindTemplate.to("blur")}}),t.value=this.value,t.bind("isReadOnly","hasError").to(this),this.bind("isFocused","isEmpty").to(t),t.on("input",()=>{const e=t.element.value,o=this.options.colorDefinitions.find(t=>e===t.label);this._stillTyping=!0,this.value=o&&o.color||e}),t.on("blur",()=>{this._stillTyping=!1,this._setInputValue(t.element.value)}),t.delegate("input").to(this),t}_createRemoveColorButton(){const e=this.locale,t=e.t,o=new xe.ButtonView(e),i=this.options.defaultColorValue||"",r=t(i?"Restore default":"Remove color");return o.class="ck-input-color__remove-color",o.withText=!0,o.icon=n.icons.eraser,o.label=r,o.on("execute",()=>{this.value=i,this._dropdownView.isOpen=!1,this.fire("input")}),o}_createColorGrid(e){const t=new xe.ColorGridView(e,{colorDefinitions:this.options.colorDefinitions,columns:this.options.columns});return t.on("execute",(e,t)=>{this.value=t.value,this._dropdownView.isOpen=!1,this.fire("input")}),t.bind("selectedColor").to(this,"value"),t}_setInputValue(e){if(!this._stillTyping){const t=$e(e),o=this.options.colorDefinitions.find(e=>t===$e(e.color));this._inputView.value=o?o.label:e||""}}}function $e(e){return e.replace(/([(,])\s+/g,"$1").replace(/^\s+|\s+(?=[),\s]|$)/g,"").replace(/,|\s/g," ")}const qe=e=>""===e;function Ge(e){return{none:e("None"),solid:e("Solid"),dotted:e("Dotted"),dashed:e("Dashed"),double:e("Double"),groove:e("Groove"),ridge:e("Ridge"),inset:e("Inset"),outset:e("Outset")}}function Je(e){return e('The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".')}function Xe(e){return e('The value is invalid. Try "10px" or "2em" or simply "2".')}function Ye(e){return e=e.trim(),qe(e)||Object(Ne.isColor)(e)}function Qe(e){return e=e.trim(),qe(e)||it(e)||Object(Ne.isLength)(e)||Object(Ne.isPercentage)(e)}function Ze(e){return e=e.trim(),qe(e)||it(e)||Object(Ne.isLength)(e)}function et(e,t){const o=new a.Collection,n=Ge(e.t);for(const i in n){const r={type:"button",model:new xe.Model({_borderStyleValue:i,label:n[i],withText:!0})};"none"===i?r.model.bind("isOn").to(e,"borderStyle",e=>"none"===t?!e:e===i):r.model.bind("isOn").to(e,"borderStyle",e=>e===i),o.add(r)}return o}function tt(e){const{view:t,icons:o,toolbar:n,labels:i,propertyName:r,nameToValue:l,defaultValue:s}=e;for(const e in i){const a=new xe.ButtonView(t.locale);a.set({label:i[e],icon:o[e],tooltip:i[e]});const c=l?l(e):e;a.bind("isOn").to(t,r,e=>{let t=e;return""===e&&s&&(t=s),c===t}),a.on("execute",()=>{t[r]=c}),n.items.add(a)}}const ot=[{color:"hsl(0, 0%, 0%)",label:"Black"},{color:"hsl(0, 0%, 30%)",label:"Dim grey"},{color:"hsl(0, 0%, 60%)",label:"Grey"},{color:"hsl(0, 0%, 90%)",label:"Light grey"},{color:"hsl(0, 0%, 100%)",label:"White",hasBorder:!0},{color:"hsl(0, 75%, 60%)",label:"Red"},{color:"hsl(30, 75%, 60%)",label:"Orange"},{color:"hsl(60, 75%, 60%)",label:"Yellow"},{color:"hsl(90, 75%, 60%)",label:"Light green"},{color:"hsl(120, 75%, 60%)",label:"Green"},{color:"hsl(150, 75%, 60%)",label:"Aquamarine"},{color:"hsl(180, 75%, 60%)",label:"Turquoise"},{color:"hsl(210, 75%, 60%)",label:"Light blue"},{color:"hsl(240, 75%, 60%)",label:"Blue"},{color:"hsl(270, 75%, 60%)",label:"Purple"}];function nt(e){return(t,o,n)=>{const i=new Ke(t.locale,{colorDefinitions:(r=e.colorConfig,r.map(e=>({color:e.model,label:e.label,options:{hasBorder:e.hasBorder}}))),columns:e.columns,defaultColorValue:e.defaultColorValue});var r;return i.set({id:o,ariaDescribedById:n}),i.bind("isReadOnly").to(t,"isEnabled",e=>!e),i.bind("hasError").to(t,"errorText",e=>!!e),i.on("input",()=>{t.errorText=null}),t.bind("isEmpty","isFocused").to(i),i}}function it(e){const t=parseFloat(e);return!Number.isNaN(t)&&e===String(t)}o(21);class rt extends xe.View{constructor(e,t={}){super(e);const o=this.bindTemplate;this.set("class",t.class||null),this.children=this.createCollection(),t.children&&t.children.forEach(e=>this.children.add(e)),this.set("_role",null),this.set("_ariaLabelledBy",null),t.labelView&&this.set({_role:"group",_ariaLabelledBy:t.labelView.id}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__row",o.to("class")],role:o.to("_role"),"aria-labelledby":o.to("_ariaLabelledBy")},children:this.children})}}o(8),o(9),o(25);const lt={left:n.icons.alignLeft,center:n.icons.alignCenter,right:n.icons.alignRight,justify:n.icons.alignJustify,top:n.icons.alignTop,middle:n.icons.alignMiddle,bottom:n.icons.alignBottom};class st extends xe.View{constructor(e,t){super(e),this.set({borderStyle:"",borderWidth:"",borderColor:"",padding:"",backgroundColor:"",width:"",height:"",horizontalAlignment:"",verticalAlignment:""}),this.options=t;const{borderStyleDropdown:o,borderWidthInput:n,borderColorInput:i,borderRowLabel:r}=this._createBorderFields(),{backgroundRowLabel:l,backgroundInput:s}=this._createBackgroundFields(),{widthInput:c,operatorLabel:d,heightInput:u,dimensionsLabel:h}=this._createDimensionFields(),{horizontalAlignmentToolbar:b,verticalAlignmentToolbar:m,alignmentLabel:g}=this._createAlignmentFields();this.focusTracker=new a.FocusTracker,this.keystrokes=new a.KeystrokeHandler,this.children=this.createCollection(),this.borderStyleDropdown=o,this.borderWidthInput=n,this.borderColorInput=i,this.backgroundInput=s,this.paddingInput=this._createPaddingField(),this.widthInput=c,this.heightInput=u,this.horizontalAlignmentToolbar=b,this.verticalAlignmentToolbar=m;const{saveButtonView:p,cancelButtonView:f}=this._createActionButtons();this.saveButtonView=p,this.cancelButtonView=f,this._focusables=new xe.ViewCollection,this._focusCycler=new xe.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.children.add(new xe.FormHeaderView(e,{label:this.t("Cell properties")})),this.children.add(new rt(e,{labelView:r,children:[r,o,i,n],class:"ck-table-form__border-row"})),this.children.add(new rt(e,{labelView:l,children:[l,s],class:"ck-table-form__background-row"})),this.children.add(new rt(e,{children:[new rt(e,{labelView:h,children:[h,c,d,u],class:"ck-table-form__dimensions-row"}),new rt(e,{children:[this.paddingInput],class:"ck-table-cell-properties-form__padding-row"})]})),this.children.add(new rt(e,{labelView:g,children:[g,b,m],class:"ck-table-cell-properties-form__alignment-row"})),this.children.add(new rt(e,{children:[this.saveButtonView,this.cancelButtonView],class:"ck-table-form__action-row"})),this.setTemplate({tag:"form",attributes:{class:["ck","ck-form","ck-table-form","ck-table-cell-properties-form"],tabindex:"-1"},children:this.children})}render(){super.render(),Object(xe.submitHandler)({view:this}),[this.borderStyleDropdown,this.borderColorInput,this.borderWidthInput,this.backgroundInput,this.widthInput,this.heightInput,this.paddingInput,this.horizontalAlignmentToolbar,this.verticalAlignmentToolbar,this.saveButtonView,this.cancelButtonView].forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)}),this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createBorderFields(){const e=this.options.defaultTableCellProperties,t={style:e.borderStyle,width:e.borderWidth,color:e.borderColor},o=nt({colorConfig:this.options.borderColors,columns:5,defaultColorValue:t.color}),n=this.locale,i=this.t,r=new xe.LabelView(n);r.text=i("Border");const l=Ge(i),s=new xe.LabeledFieldView(n,xe.createLabeledDropdown);s.set({label:i("Style"),class:"ck-table-form__border-style"}),s.fieldView.buttonView.set({isOn:!1,withText:!0,tooltip:i("Style")}),s.fieldView.buttonView.bind("label").to(this,"borderStyle",e=>l[e||"none"]),s.fieldView.on("execute",e=>{this.borderStyle=e.source._borderStyleValue}),s.bind("isEmpty").to(this,"borderStyle",e=>!e),Object(xe.addListToDropdown)(s.fieldView,et(this,t.style));const a=new xe.LabeledFieldView(n,xe.createLabeledInputText);a.set({label:i("Width"),class:"ck-table-form__border-width"}),a.fieldView.bind("value").to(this,"borderWidth"),a.bind("isEnabled").to(this,"borderStyle",at),a.fieldView.on("input",()=>{this.borderWidth=a.fieldView.element.value});const c=new xe.LabeledFieldView(n,o);return c.set({label:i("Color"),class:"ck-table-form__border-color"}),c.fieldView.bind("value").to(this,"borderColor"),c.bind("isEnabled").to(this,"borderStyle",at),c.fieldView.on("input",()=>{this.borderColor=c.fieldView.value}),this.on("change:borderStyle",(e,o,n,i)=>{at(n)||(this.borderColor="",this.borderWidth=""),at(i)||(this.borderColor=t.color,this.borderWidth=t.width)}),{borderRowLabel:r,borderStyleDropdown:s,borderColorInput:c,borderWidthInput:a}}_createBackgroundFields(){const e=this.locale,t=this.t,o=new xe.LabelView(e);o.text=t("Background");const n=nt({colorConfig:this.options.backgroundColors,columns:5,defaultColorValue:this.options.defaultTableCellProperties.backgroundColor}),i=new xe.LabeledFieldView(e,n);return i.set({label:t("Color"),class:"ck-table-cell-properties-form__background"}),i.fieldView.bind("value").to(this,"backgroundColor"),i.fieldView.on("input",()=>{this.backgroundColor=i.fieldView.value}),{backgroundRowLabel:o,backgroundInput:i}}_createDimensionFields(){const e=this.locale,t=this.t,o=new xe.LabelView(e);o.text=t("Dimensions");const n=new xe.LabeledFieldView(e,xe.createLabeledInputText);n.set({label:t("Width"),class:"ck-table-form__dimensions-row__width"}),n.fieldView.bind("value").to(this,"width"),n.fieldView.on("input",()=>{this.width=n.fieldView.element.value});const i=new xe.View(e);i.setTemplate({tag:"span",attributes:{class:["ck-table-form__dimension-operator"]},children:[{text:"×"}]});const r=new xe.LabeledFieldView(e,xe.createLabeledInputText);return r.set({label:t("Height"),class:"ck-table-form__dimensions-row__height"}),r.fieldView.bind("value").to(this,"height"),r.fieldView.on("input",()=>{this.height=r.fieldView.element.value}),{dimensionsLabel:o,widthInput:n,operatorLabel:i,heightInput:r}}_createPaddingField(){const e=this.locale,t=this.t,o=new xe.LabeledFieldView(e,xe.createLabeledInputText);return o.set({label:t("Padding"),class:"ck-table-cell-properties-form__padding"}),o.fieldView.bind("value").to(this,"padding"),o.fieldView.on("input",()=>{this.padding=o.fieldView.element.value}),o}_createAlignmentFields(){const e=this.locale,t=this.t,o=new xe.LabelView(e);o.text=t("Table cell text alignment");const n=new xe.ToolbarView(e),i="rtl"===this.locale.contentLanguageDirection;n.set({isCompact:!0,ariaLabel:t("Horizontal text alignment toolbar")}),tt({view:this,icons:lt,toolbar:n,labels:this._horizontalAlignmentLabels,propertyName:"horizontalAlignment",nameToValue:e=>{if(i){if("left"===e)return"right";if("right"===e)return"left"}return e},defaultValue:this.options.defaultTableCellProperties.horizontalAlignment});const r=new xe.ToolbarView(e);return r.set({isCompact:!0,ariaLabel:t("Vertical text alignment toolbar")}),tt({view:this,icons:lt,toolbar:r,labels:this._verticalAlignmentLabels,propertyName:"verticalAlignment",defaultValue:this.options.defaultTableCellProperties.verticalAlignment}),{horizontalAlignmentToolbar:n,verticalAlignmentToolbar:r,alignmentLabel:o}}_createActionButtons(){const e=this.locale,t=this.t,o=new xe.ButtonView(e),i=new xe.ButtonView(e),r=[this.borderWidthInput,this.borderColorInput,this.backgroundInput,this.paddingInput];return o.set({label:t("Save"),icon:n.icons.check,class:"ck-button-save",type:"submit",withText:!0}),o.bind("isEnabled").toMany(r,"errorText",(...e)=>e.every(e=>!e)),i.set({label:t("Cancel"),icon:n.icons.cancel,class:"ck-button-cancel",type:"cancel",withText:!0}),i.delegate("execute").to(this,"cancel"),{saveButtonView:o,cancelButtonView:i}}get _horizontalAlignmentLabels(){const e=this.locale,t=this.t,o=t("Align cell text to the left"),n=t("Align cell text to the center"),i=t("Align cell text to the right"),r=t("Justify cell text");return"rtl"===e.uiLanguageDirection?{right:i,center:n,left:o,justify:r}:{left:o,center:n,right:i,justify:r}}get _verticalAlignmentLabels(){const e=this.t;return{top:e("Align cell text to the top"),middle:e("Align cell text to the middle"),bottom:e("Align cell text to the bottom")}}}function at(e){return"none"!==e}var ct=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)},dt=o(10),ut="object"==typeof self&&self&&self.Object===Object&&self,ht=dt.a||ut||Function("return this")(),bt=function(){return ht.Date.now()},mt=/\s/;var gt=function(e){for(var t=e.length;t--&&mt.test(e.charAt(t)););return t},pt=/^\s+/;var ft=function(e){return e?e.slice(0,gt(e)+1).replace(pt,""):e},wt=ht.Symbol,_t=Object.prototype,kt=_t.hasOwnProperty,vt=_t.toString,Ct=wt?wt.toStringTag:void 0;var yt=function(e){var t=kt.call(e,Ct),o=e[Ct];try{e[Ct]=void 0;var n=!0}catch(e){}var i=vt.call(e);return n&&(t?e[Ct]=o:delete e[Ct]),i},Tt=Object.prototype.toString;var xt=function(e){return Tt.call(e)},At=wt?wt.toStringTag:void 0;var Vt=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":At&&At in Object(e)?yt(e):xt(e)};var St=function(e){return null!=e&&"object"==typeof e};var Rt=function(e){return"symbol"==typeof e||St(e)&&"[object Symbol]"==Vt(e)},It=/^[-+]0x[0-9a-f]+$/i,Pt=/^0b[01]+$/i,Et=/^0o[0-7]+$/i,Bt=parseInt;var Ot=function(e){if("number"==typeof e)return e;if(Rt(e))return NaN;if(ct(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=ct(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=ft(e);var o=Pt.test(e);return o||Et.test(e)?Bt(e.slice(2),o?2:8):It.test(e)?NaN:+e},Lt=Math.max,Nt=Math.min;var zt=function(e,t,o){var n,i,r,l,s,a,c=0,d=!1,u=!1,h=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function b(t){var o=n,r=i;return n=i=void 0,c=t,l=e.apply(r,o)}function m(e){return c=e,s=setTimeout(p,t),d?b(e):l}function g(e){var o=e-a;return void 0===a||o>=t||o<0||u&&e-c>=r}function p(){var e=bt();if(g(e))return f(e);s=setTimeout(p,function(e){var o=t-(e-a);return u?Nt(o,r-(e-c)):o}(e))}function f(e){return s=void 0,h&&n?b(e):(n=i=void 0,l)}function w(){var e=bt(),o=g(e);if(n=arguments,i=this,a=e,o){if(void 0===s)return m(a);if(u)return clearTimeout(s),s=setTimeout(p,t),b(a)}return void 0===s&&(s=setTimeout(p,t)),l}return t=Ot(t)||0,ct(o)&&(d=!!o.leading,r=(u="maxWait"in o)?Lt(Ot(o.maxWait)||0,t):r,h="trailing"in o?!!o.trailing:h),w.cancel=function(){void 0!==s&&clearTimeout(s),c=0,n=a=i=s=void 0},w.flush=function(){return void 0===s?l:f(bt())},w};const Mt=xe.BalloonPanelView.defaultPositions,Ht=[Mt.northArrowSouth,Mt.northArrowSouthWest,Mt.northArrowSouthEast,Mt.southArrowNorth,Mt.southArrowNorthWest,Mt.southArrowNorthEast],Ft=[...Ht,i.centeredBalloonPositionForLongWidgets];function Dt(e,t){const o=e.plugins.get("ContextualBalloon");if(We(e.editing.view.document.selection)){let n;n="cell"===t?jt(e):Wt(e),o.updatePosition(n)}}function Wt(e){const t=e.model.document.selection.getFirstPosition().findAncestor("table"),o=e.editing.mapper.toViewElement(t);return{target:e.editing.view.domConverter.viewToDom(o),positions:Ft}}function jt(e){const t=e.editing.mapper,o=e.editing.view.domConverter,n=e.model.document.selection;if(n.rangeCount>1)return{target:()=>function(e,t){const o=t.editing.mapper,n=t.editing.view.domConverter,i=Array.from(e).map(e=>{const t=Ut(e.start),i=o.toViewElement(t);return new a.Rect(n.viewToDom(i))});return a.Rect.getBoundingRect(i)}(n.getRanges(),e),positions:Ht};const i=Ut(n.getFirstPosition()),r=t.toViewElement(i);return{target:o.viewToDom(r),positions:Ht}}function Ut(e){return e.nodeAfter&&e.nodeAfter.is("element","tableCell")?e.nodeAfter:e.findAncestor("tableCell")}function Kt(e){if(!e||!ct(e))return e;const{top:t,right:o,bottom:n,left:i}=e;return t==o&&o==n&&n==i?t:void 0}function $t(e,t){const o=parseFloat(e);return Number.isNaN(o)||String(o)!==String(e)?e:`${o}${t}`}function qt(e,t={}){const o=Object.assign({borderStyle:"none",borderWidth:"",borderColor:"",backgroundColor:"",width:"",height:""},e);return t.includeAlignmentProperty&&!o.alignment&&(o.alignment="center"),t.includePaddingProperty&&!o.padding&&(o.padding=""),t.includeVerticalAlignmentProperty&&!o.verticalAlignment&&(o.verticalAlignment="middle"),t.includeHorizontalAlignmentProperty&&!o.horizontalAlignment&&(o.horizontalAlignment=t.isRightToLeftContent?"right":"left"),o}const Gt={borderStyle:"tableCellBorderStyle",borderColor:"tableCellBorderColor",borderWidth:"tableCellBorderWidth",width:"tableCellWidth",height:"tableCellHeight",padding:"tableCellPadding",backgroundColor:"tableCellBackgroundColor",horizontalAlignment:"tableCellHorizontalAlignment",verticalAlignment:"tableCellVerticalAlignment"};class Jt extends n.Plugin{static get requires(){return[xe.ContextualBalloon]}static get pluginName(){return"TableCellPropertiesUI"}constructor(e){super(e),e.config.define("table.tableCellProperties",{borderColors:ot,backgroundColors:ot})}init(){const e=this.editor,t=e.t;this._defaultTableCellProperties=qt(e.config.get("table.tableCellProperties.defaultProperties"),{includeVerticalAlignmentProperty:!0,includeHorizontalAlignmentProperty:!0,includePaddingProperty:!0,isRightToLeftContent:"rtl"===e.locale.contentLanguageDirection}),this._balloon=e.plugins.get(xe.ContextualBalloon),this.view=this._createPropertiesView(),this._undoStepBatch=null,e.ui.componentFactory.add("tableCellProperties",o=>{const n=new xe.ButtonView(o);n.set({label:t("Cell properties"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.105 18-.17 1H2.5A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1h15A1.5 1.5 0 0 1 19 2.5v9.975l-.85-.124-.15-.302V8h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5h3.105zM2 12h5V8H2v4zm10-4H8v4h4V8zM2 2v5h5V2H2zm0 16h5v-5H2v5zM13 7h5V2h-5v5zM8 2v5h4V2H8z" opacity=".6"/><path d="m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43L15.5 11.5zM13 6a1 1 0 0 1 1 1v3.172a2.047 2.047 0 0 0-.293.443l-.858 1.736-1.916.28-.151.027A1.976 1.976 0 0 0 9.315 14H7a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h6zm-1 2H8v4h4V8z"/></svg>',tooltip:!0}),this.listenTo(n,"execute",()=>this._showView());const i=Object.values(Gt).map(t=>e.commands.get(t));return n.bind("isEnabled").toMany(i,"isEnabled",(...e)=>e.some(e=>e)),n})}destroy(){super.destroy(),this.view.destroy()}_createPropertiesView(){const e=this.editor,t=e.editing.view.document,o=e.config.get("table.tableCellProperties"),n=Object(xe.normalizeColorOptions)(o.borderColors),i=Object(xe.getLocalizedColorOptions)(e.locale,n),r=Object(xe.normalizeColorOptions)(o.backgroundColors),l=Object(xe.getLocalizedColorOptions)(e.locale,r),s=new st(e.locale,{borderColors:i,backgroundColors:l,defaultTableCellProperties:this._defaultTableCellProperties}),a=e.t;s.render(),this.listenTo(s,"submit",()=>{this._hideView()}),this.listenTo(s,"cancel",()=>{this._undoStepBatch.operations.length&&e.execute("undo",this._undoStepBatch),this._hideView()}),s.keystrokes.set("Esc",(e,t)=>{this._hideView(),t()}),this.listenTo(e.ui,"update",()=>{We(t.selection)?this._isViewVisible&&Dt(e,"cell"):this._hideView()}),Object(xe.clickOutsideHandler)({emitter:s,activator:()=>this._isViewInBalloon,contextElements:[this._balloon.view.element],callback:()=>this._hideView()});const c=Je(a),d=Xe(a);return s.on("change:borderStyle",this._getPropertyChangeCallback("tableCellBorderStyle",this._defaultTableCellProperties.borderStyle)),s.on("change:borderColor",this._getValidatedPropertyChangeCallback({viewField:s.borderColorInput,commandName:"tableCellBorderColor",errorText:c,validator:Ye,defaultValue:this._defaultTableCellProperties.borderColor})),s.on("change:borderWidth",this._getValidatedPropertyChangeCallback({viewField:s.borderWidthInput,commandName:"tableCellBorderWidth",errorText:d,validator:Ze,defaultValue:this._defaultTableCellProperties.borderWidth})),s.on("change:padding",this._getValidatedPropertyChangeCallback({viewField:s.paddingInput,commandName:"tableCellPadding",errorText:d,validator:Qe,defaultValue:this._defaultTableCellProperties.padding})),s.on("change:width",this._getValidatedPropertyChangeCallback({viewField:s.widthInput,commandName:"tableCellWidth",errorText:d,validator:Qe,defaultValue:this._defaultTableCellProperties.width})),s.on("change:height",this._getValidatedPropertyChangeCallback({viewField:s.heightInput,commandName:"tableCellHeight",errorText:d,validator:Qe,defaultValue:this._defaultTableCellProperties.height})),s.on("change:backgroundColor",this._getValidatedPropertyChangeCallback({viewField:s.backgroundInput,commandName:"tableCellBackgroundColor",errorText:c,validator:Ye,defaultValue:this._defaultTableCellProperties.backgroundColor})),s.on("change:horizontalAlignment",this._getPropertyChangeCallback("tableCellHorizontalAlignment",this._defaultTableCellProperties.horizontalAlignment)),s.on("change:verticalAlignment",this._getPropertyChangeCallback("tableCellVerticalAlignment",this._defaultTableCellProperties.verticalAlignment)),s}_fillViewFormFromCommandValues(){const e=this.editor.commands,t=e.get("tableCellBorderStyle");Object.entries(Gt).map(([t,o])=>{const n=this._defaultTableCellProperties[t]||"";return[t,e.get(o).value||n]}).forEach(([e,o])=>{("borderColor"!==e&&"borderWidth"!==e||"none"!==t.value)&&this.view.set(e,o)})}_showView(){const e=this.editor;this._fillViewFormFromCommandValues(),this._balloon.add({view:this.view,position:jt(e)}),this._undoStepBatch=e.model.createBatch(),this.view.focus()}_hideView(){if(!this._isViewInBalloon)return;const e=this.editor;this.stopListening(e.ui,"update"),this.view.saveButtonView.focus(),this._balloon.remove(this.view),this.editor.editing.view.focus()}get _isViewVisible(){return this._balloon.visibleView===this.view}get _isViewInBalloon(){return this._balloon.hasView(this.view)}_getPropertyChangeCallback(e,t){return(o,n,i,r)=>{(r||t!==i)&&this.editor.execute(e,{value:i,batch:this._undoStepBatch})}}_getValidatedPropertyChangeCallback(e){const{commandName:t,viewField:o,validator:n,errorText:i,defaultValue:r}=e,l=zt(()=>{o.errorText=i},500);return(e,i,s,a)=>{l.cancel(),(a||r!==s)&&(n(s)?(this.editor.execute(t,{value:s,batch:this._undoStepBatch}),o.errorText=null):l())}}}function Xt(e,t){const{viewElement:o,defaultValue:n,modelAttribute:i,styleName:r,reduceBoxSides:l=!1}=t;e.for("upcast").attributeToAttribute({view:{name:o,styles:{[r]:/[\s\S]+/}},model:{key:i,value:e=>{const t=e.getNormalizedStyle(r),o=l?eo(t):t;if(n!==o)return o}}})}function Yt(e,t,o){e.for("upcast").add(e=>e.on("element:"+t,(e,t,n)=>{if(!t.modelRange)return;const i=["border-top-width","border-top-color","border-top-style","border-bottom-width","border-bottom-color","border-bottom-style","border-right-width","border-right-color","border-right-style","border-left-width","border-left-color","border-left-style"].filter(e=>t.viewItem.hasStyle(e));if(!i.length)return;const r={styles:i};if(!n.consumable.test(t.viewItem,r))return;const l=[...t.modelRange.getItems({shallow:!0})].pop();n.consumable.consume(t.viewItem,r);const s={style:t.viewItem.getNormalizedStyle("border-style"),color:t.viewItem.getNormalizedStyle("border-color"),width:t.viewItem.getNormalizedStyle("border-width")},a={style:eo(s.style),color:eo(s.color),width:eo(s.width)};a.style!==o.style&&n.writer.setAttribute("borderStyle",a.style,l),a.color!==o.color&&n.writer.setAttribute("borderColor",a.color,l),a.width!==o.width&&n.writer.setAttribute("borderWidth",a.width,l)}))}function Qt(e,{modelElement:t,modelAttribute:o,styleName:n}){e.for("downcast").attributeToAttribute({model:{name:t,key:o},view:e=>({key:"style",value:{[n]:e}})})}function Zt(e,{modelAttribute:t,styleName:o}){e.for("downcast").add(e=>e.on(`attribute:${t}:table`,(e,t,n)=>{const{item:i,attributeNewValue:r}=t,{mapper:l,writer:s}=n;if(!n.consumable.consume(t.item,e.name))return;const a=[...l.toViewElement(i).getChildren()].find(e=>e.is("element","table"));r?s.setStyle(o,r,a):s.removeStyle(o,a)}))}function eo(e){if(!e)return;return["top","right","bottom","left"].map(t=>e[t]).reduce((e,t)=>e==t?e:null)||e}class to extends n.Command{constructor(e,t,o){super(e),this.attributeName=t,this._defaultValue=o}refresh(){const e=V(this.editor.model.document.selection);this.isEnabled=!!e.length,this.value=this._getSingleValue(e)}execute(e={}){const{value:t,batch:o}=e,n=this.editor.model,i=V(n.document.selection),r=this._getValueToSet(t);n.enqueueChange(o||"default",e=>{r?i.forEach(t=>e.setAttribute(this.attributeName,r,t)):i.forEach(t=>e.removeAttribute(this.attributeName,t))})}_getAttribute(e){if(!e)return;const t=e.getAttribute(this.attributeName);return t!==this._defaultValue?t:void 0}_getValueToSet(e){if(e!==this._defaultValue)return e}_getSingleValue(e){const t=this._getAttribute(e[0]);return e.every(e=>this._getAttribute(e)===t)?t:void 0}}class oo extends to{constructor(e,t){super(e,"padding",t)}_getAttribute(e){if(!e)return;const t=Kt(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}_getValueToSet(e){if((e=$t(e,"px"))!==this._defaultValue)return e}}class no extends to{constructor(e,t){super(e,"width",t)}_getValueToSet(e){if((e=$t(e,"px"))!==this._defaultValue)return e}}class io extends to{constructor(e,t){super(e,"height",t)}_getValueToSet(e){return(e=$t(e,"px"))===this._defaultValue?null:e}}class ro extends to{constructor(e,t){super(e,"backgroundColor",t)}}class lo extends to{constructor(e,t){super(e,"verticalAlignment",t)}}class so extends to{constructor(e,t){super(e,"horizontalAlignment",t)}}class ao extends to{constructor(e,t){super(e,"borderStyle",t)}_getAttribute(e){if(!e)return;const t=Kt(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}}class co extends to{constructor(e,t){super(e,"borderColor",t)}_getAttribute(e){if(!e)return;const t=Kt(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}}class uo extends to{constructor(e,t){super(e,"borderWidth",t)}_getAttribute(e){if(!e)return;const t=Kt(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}_getValueToSet(e){if((e=$t(e,"px"))!==this._defaultValue)return e}}const ho=/^(top|middle|bottom)$/,bo=/^(left|center|right|justify)$/;class mo extends n.Plugin{static get pluginName(){return"TableCellPropertiesEditing"}static get requires(){return[ye]}init(){const e=this.editor,t=e.model.schema,o=e.conversion;e.config.define("table.tableCellProperties.defaultProperties",{});const n=qt(e.config.get("table.tableCellProperties.defaultProperties"),{includeVerticalAlignmentProperty:!0,includeHorizontalAlignmentProperty:!0,includePaddingProperty:!0,isRightToLeftContent:"rtl"===e.locale.contentLanguageDirection});e.data.addStyleProcessorRules(Ne.addBorderRules),function(e,t,o){e.extend("tableCell",{allowAttributes:["borderWidth","borderColor","borderStyle"]}),Yt(t,"td",o),Yt(t,"th",o),Qt(t,{modelElement:"tableCell",modelAttribute:"borderStyle",styleName:"border-style"}),Qt(t,{modelElement:"tableCell",modelAttribute:"borderColor",styleName:"border-color"}),Qt(t,{modelElement:"tableCell",modelAttribute:"borderWidth",styleName:"border-width"})}(t,o,{color:n.borderColor,style:n.borderStyle,width:n.borderWidth}),e.commands.add("tableCellBorderStyle",new ao(e,n.borderStyle)),e.commands.add("tableCellBorderColor",new co(e,n.borderColor)),e.commands.add("tableCellBorderWidth",new uo(e,n.borderWidth)),function(e,t,o){e.extend("tableCell",{allowAttributes:["horizontalAlignment"]}),t.for("downcast").attributeToAttribute({model:{name:"tableCell",key:"horizontalAlignment"},view:e=>({key:"style",value:{"text-align":e}})}),t.for("upcast").attributeToAttribute({view:{name:/^(td|th)$/,styles:{"text-align":bo}},model:{key:"horizontalAlignment",value:e=>{const t=e.getStyle("text-align");return t===o?null:t}}}).attributeToAttribute({view:{name:/^(td|th)$/,attributes:{align:bo}},model:{key:"horizontalAlignment",value:e=>{const t=e.getAttribute("align");return t===o?null:t}}})}(t,o,n.horizontalAlignment),e.commands.add("tableCellHorizontalAlignment",new so(e,n.horizontalAlignment)),go(t,o,{modelAttribute:"width",styleName:"width",defaultValue:n.width}),e.commands.add("tableCellWidth",new no(e,n.width)),go(t,o,{modelAttribute:"height",styleName:"height",defaultValue:n.height}),e.commands.add("tableCellHeight",new io(e,n.height)),e.data.addStyleProcessorRules(Ne.addPaddingRules),go(t,o,{modelAttribute:"padding",styleName:"padding",reduceBoxSides:!0,defaultValue:n.padding}),e.commands.add("tableCellPadding",new oo(e,n.padding)),e.data.addStyleProcessorRules(Ne.addBackgroundRules),go(t,o,{modelAttribute:"backgroundColor",styleName:"background-color",defaultValue:n.backgroundColor}),e.commands.add("tableCellBackgroundColor",new ro(e,n.backgroundColor)),function(e,t,o){e.extend("tableCell",{allowAttributes:["verticalAlignment"]}),t.for("downcast").attributeToAttribute({model:{name:"tableCell",key:"verticalAlignment"},view:e=>({key:"style",value:{"vertical-align":e}})}),t.for("upcast").attributeToAttribute({view:{name:/^(td|th)$/,styles:{"vertical-align":ho}},model:{key:"verticalAlignment",value:e=>{const t=e.getStyle("vertical-align");return t===o?null:t}}}).attributeToAttribute({view:{name:/^(td|th)$/,attributes:{valign:ho}},model:{key:"verticalAlignment",value:e=>{const t=e.getAttribute("valign");return t===o?null:t}}})}(t,o,n.verticalAlignment),e.commands.add("tableCellVerticalAlignment",new lo(e,n.verticalAlignment))}}function go(e,t,o){const{modelAttribute:n}=o;e.extend("tableCell",{allowAttributes:[n]}),Xt(t,{viewElement:/^(td|th)$/,...o}),Qt(t,{modelElement:"tableCell",...o})}class po extends n.Plugin{static get pluginName(){return"TableCellProperties"}static get requires(){return[mo,Jt]}}class fo extends n.Command{constructor(e,t,o){super(e),this.attributeName=t,this._defaultValue=o}refresh(){const e=this.editor.model.document.selection.getFirstPosition().findAncestor("table");this.isEnabled=!!e,this.value=this._getValue(e)}execute(e={}){const t=this.editor.model,o=t.document.selection,{value:n,batch:i}=e,r=o.getFirstPosition().findAncestor("table"),l=this._getValueToSet(n);t.enqueueChange(i||"default",e=>{l?e.setAttribute(this.attributeName,l,r):e.removeAttribute(this.attributeName,r)})}_getValue(e){if(!e)return;const t=e.getAttribute(this.attributeName);return t!==this._defaultValue?t:void 0}_getValueToSet(e){if(e!==this._defaultValue)return e}}class wo extends fo{constructor(e,t){super(e,"backgroundColor",t)}}class _o extends fo{constructor(e,t){super(e,"borderColor",t)}_getValue(e){if(!e)return;const t=Kt(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}}class ko extends fo{constructor(e,t){super(e,"borderStyle",t)}_getValue(e){if(!e)return;const t=Kt(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}}class vo extends fo{constructor(e,t){super(e,"borderWidth",t)}_getValue(e){if(!e)return;const t=Kt(e.getAttribute(this.attributeName));return t!==this._defaultValue?t:void 0}_getValueToSet(e){if((e=$t(e,"px"))!==this._defaultValue)return e}}class Co extends fo{constructor(e,t){super(e,"width",t)}_getValueToSet(e){if((e=$t(e,"px"))!==this._defaultValue)return e}}class yo extends fo{constructor(e,t){super(e,"height",t)}_getValueToSet(e){return(e=$t(e,"px"))===this._defaultValue?null:e}}class To extends fo{constructor(e,t){super(e,"alignment",t)}}const xo=/^(left|center|right)$/,Ao=/^(left|none|right)$/;class Vo extends n.Plugin{static get pluginName(){return"TablePropertiesEditing"}static get requires(){return[ye]}init(){const e=this.editor,t=e.model.schema,o=e.conversion;e.config.define("table.tableProperties.defaultProperties",{});const n=qt(e.config.get("table.tableProperties.defaultProperties"),{includeAlignmentProperty:!0});e.data.addStyleProcessorRules(Ne.addBorderRules),function(e,t,o){e.extend("table",{allowAttributes:["borderWidth","borderColor","borderStyle"]}),Yt(t,"table",o),Zt(t,{modelAttribute:"borderColor",styleName:"border-color"}),Zt(t,{modelAttribute:"borderStyle",styleName:"border-style"}),Zt(t,{modelAttribute:"borderWidth",styleName:"border-width"})}(t,o,{color:n.borderColor,style:n.borderStyle,width:n.borderWidth}),e.commands.add("tableBorderColor",new _o(e,n.borderColor)),e.commands.add("tableBorderStyle",new ko(e,n.borderStyle)),e.commands.add("tableBorderWidth",new vo(e,n.borderWidth)),function(e,t,o){e.extend("table",{allowAttributes:["alignment"]}),t.for("downcast").attributeToAttribute({model:{name:"table",key:"alignment"},view:e=>({key:"style",value:{float:"center"===e?"none":e}}),converterPriority:"high"}),t.for("upcast").attributeToAttribute({view:{name:/^(table|figure)$/,styles:{float:Ao}},model:{key:"alignment",value:e=>{let t=e.getStyle("float");return"none"===t&&(t="center"),t===o?null:t}}}).attributeToAttribute({view:{attributes:{align:xo}},model:{name:"table",key:"alignment",value:e=>{const t=e.getAttribute("align");return t===o?null:t}}})}(t,o,n.alignment),e.commands.add("tableAlignment",new To(e,n.alignment)),So(t,o,{modelAttribute:"width",styleName:"width",defaultValue:n.width}),e.commands.add("tableWidth",new Co(e,n.width)),So(t,o,{modelAttribute:"height",styleName:"height",defaultValue:n.height}),e.commands.add("tableHeight",new yo(e,n.height)),e.data.addStyleProcessorRules(Ne.addBackgroundRules),function(e,t,o){const{modelAttribute:n}=o;e.extend("table",{allowAttributes:[n]}),Xt(t,{viewElement:"table",...o}),Zt(t,o)}(t,o,{modelAttribute:"backgroundColor",styleName:"background-color",defaultValue:n.backgroundColor}),e.commands.add("tableBackgroundColor",new wo(e,n.backgroundColor))}}function So(e,t,o){const{modelAttribute:n}=o;e.extend("table",{allowAttributes:[n]}),Xt(t,{viewElement:/^(table|figure)$/,...o}),Qt(t,{modelElement:"table",...o})}o(28);const Ro={left:n.icons.objectLeft,center:n.icons.objectCenter,right:n.icons.objectRight};class Io extends xe.View{constructor(e,t){super(e),this.set({borderStyle:"",borderWidth:"",borderColor:"",backgroundColor:"",width:"",height:"",alignment:""}),this.options=t;const{borderStyleDropdown:o,borderWidthInput:n,borderColorInput:i,borderRowLabel:r}=this._createBorderFields(),{backgroundRowLabel:l,backgroundInput:s}=this._createBackgroundFields(),{widthInput:c,operatorLabel:d,heightInput:u,dimensionsLabel:h}=this._createDimensionFields(),{alignmentToolbar:b,alignmentLabel:m}=this._createAlignmentFields();this.focusTracker=new a.FocusTracker,this.keystrokes=new a.KeystrokeHandler,this.children=this.createCollection(),this.borderStyleDropdown=o,this.borderWidthInput=n,this.borderColorInput=i,this.backgroundInput=s,this.widthInput=c,this.heightInput=u,this.alignmentToolbar=b;const{saveButtonView:g,cancelButtonView:p}=this._createActionButtons();this.saveButtonView=g,this.cancelButtonView=p,this._focusables=new xe.ViewCollection,this._focusCycler=new xe.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.children.add(new xe.FormHeaderView(e,{label:this.t("Table properties")})),this.children.add(new rt(e,{labelView:r,children:[r,o,i,n],class:"ck-table-form__border-row"})),this.children.add(new rt(e,{labelView:l,children:[l,s],class:"ck-table-form__background-row"})),this.children.add(new rt(e,{children:[new rt(e,{labelView:h,children:[h,c,d,u],class:"ck-table-form__dimensions-row"}),new rt(e,{labelView:m,children:[m,b],class:"ck-table-properties-form__alignment-row"})]})),this.children.add(new rt(e,{children:[this.saveButtonView,this.cancelButtonView],class:"ck-table-form__action-row"})),this.setTemplate({tag:"form",attributes:{class:["ck","ck-form","ck-table-form","ck-table-properties-form"],tabindex:"-1"},children:this.children})}render(){super.render(),Object(xe.submitHandler)({view:this}),[this.borderStyleDropdown,this.borderColorInput,this.borderWidthInput,this.backgroundInput,this.widthInput,this.heightInput,this.alignmentToolbar,this.saveButtonView,this.cancelButtonView].forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)}),this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createBorderFields(){const e=this.options.defaultTableProperties,t={style:e.borderStyle,width:e.borderWidth,color:e.borderColor},o=nt({colorConfig:this.options.borderColors,columns:5,defaultColorValue:t.color}),n=this.locale,i=this.t,r=new xe.LabelView(n);r.text=i("Border");const l=Ge(this.t),s=new xe.LabeledFieldView(n,xe.createLabeledDropdown);s.set({label:i("Style"),class:"ck-table-form__border-style"}),s.fieldView.buttonView.set({isOn:!1,withText:!0,tooltip:i("Style")}),s.fieldView.buttonView.bind("label").to(this,"borderStyle",e=>l[e||"none"]),s.fieldView.on("execute",e=>{this.borderStyle=e.source._borderStyleValue}),s.bind("isEmpty").to(this,"borderStyle",e=>!e),Object(xe.addListToDropdown)(s.fieldView,et(this,t.style));const a=new xe.LabeledFieldView(n,xe.createLabeledInputText);a.set({label:i("Width"),class:"ck-table-form__border-width"}),a.fieldView.bind("value").to(this,"borderWidth"),a.bind("isEnabled").to(this,"borderStyle",Po),a.fieldView.on("input",()=>{this.borderWidth=a.fieldView.element.value});const c=new xe.LabeledFieldView(n,o);return c.set({label:i("Color"),class:"ck-table-form__border-color"}),c.fieldView.bind("value").to(this,"borderColor"),c.bind("isEnabled").to(this,"borderStyle",Po),c.fieldView.on("input",()=>{this.borderColor=c.fieldView.value}),this.on("change:borderStyle",(e,o,n,i)=>{Po(n)||(this.borderColor="",this.borderWidth=""),Po(i)||(this.borderColor=t.color,this.borderWidth=t.width)}),{borderRowLabel:r,borderStyleDropdown:s,borderColorInput:c,borderWidthInput:a}}_createBackgroundFields(){const e=this.locale,t=this.t,o=new xe.LabelView(e);o.text=t("Background");const n=nt({colorConfig:this.options.backgroundColors,columns:5,defaultColorValue:this.options.defaultTableProperties.backgroundColor}),i=new xe.LabeledFieldView(e,n);return i.set({label:t("Color"),class:"ck-table-properties-form__background"}),i.fieldView.bind("value").to(this,"backgroundColor"),i.fieldView.on("input",()=>{this.backgroundColor=i.fieldView.value}),{backgroundRowLabel:o,backgroundInput:i}}_createDimensionFields(){const e=this.locale,t=this.t,o=new xe.LabelView(e);o.text=t("Dimensions");const n=new xe.LabeledFieldView(e,xe.createLabeledInputText);n.set({label:t("Width"),class:"ck-table-form__dimensions-row__width"}),n.fieldView.bind("value").to(this,"width"),n.fieldView.on("input",()=>{this.width=n.fieldView.element.value});const i=new xe.View(e);i.setTemplate({tag:"span",attributes:{class:["ck-table-form__dimension-operator"]},children:[{text:"×"}]});const r=new xe.LabeledFieldView(e,xe.createLabeledInputText);return r.set({label:t("Height"),class:"ck-table-form__dimensions-row__height"}),r.fieldView.bind("value").to(this,"height"),r.fieldView.on("input",()=>{this.height=r.fieldView.element.value}),{dimensionsLabel:o,widthInput:n,operatorLabel:i,heightInput:r}}_createAlignmentFields(){const e=this.locale,t=this.t,o=new xe.LabelView(e);o.text=t("Alignment");const n=new xe.ToolbarView(e);return n.set({isCompact:!0,ariaLabel:t("Table alignment toolbar")}),tt({view:this,icons:Ro,toolbar:n,labels:this._alignmentLabels,propertyName:"alignment",defaultValue:this.options.defaultTableProperties.alignment}),{alignmentLabel:o,alignmentToolbar:n}}_createActionButtons(){const e=this.locale,t=this.t,o=new xe.ButtonView(e),i=new xe.ButtonView(e),r=[this.borderWidthInput,this.borderColorInput,this.backgroundInput,this.widthInput,this.heightInput];return o.set({label:t("Save"),icon:n.icons.check,class:"ck-button-save",type:"submit",withText:!0}),o.bind("isEnabled").toMany(r,"errorText",(...e)=>e.every(e=>!e)),i.set({label:t("Cancel"),icon:n.icons.cancel,class:"ck-button-cancel",type:"cancel",withText:!0}),i.delegate("execute").to(this,"cancel"),{saveButtonView:o,cancelButtonView:i}}get _alignmentLabels(){const e=this.locale,t=this.t,o=t("Align table to the left"),n=t("Center table"),i=t("Align table to the right");return"rtl"===e.uiLanguageDirection?{right:i,center:n,left:o}:{left:o,center:n,right:i}}}function Po(e){return"none"!==e}const Eo={borderStyle:"tableBorderStyle",borderColor:"tableBorderColor",borderWidth:"tableBorderWidth",backgroundColor:"tableBackgroundColor",width:"tableWidth",height:"tableHeight",alignment:"tableAlignment"};class Bo extends n.Plugin{static get requires(){return[xe.ContextualBalloon]}static get pluginName(){return"TablePropertiesUI"}constructor(e){super(e),e.config.define("table.tableProperties",{borderColors:ot,backgroundColors:ot})}init(){const e=this.editor,t=e.t;this._defaultTableProperties=qt(e.config.get("table.tableProperties.defaultProperties"),{includeAlignmentProperty:!0}),this._balloon=e.plugins.get(xe.ContextualBalloon),this.view=this._createPropertiesView(),this._undoStepBatch=null,e.ui.componentFactory.add("tableProperties",o=>{const n=new xe.ButtonView(o);n.set({label:t("Table properties"),icon:'<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M8 2v5h4V2h1v5h5v1h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5H7v-5H2v-1h5V8H2V7h5V2h1zm4 6H8v4h4V8z" opacity=".6"/><path d="m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43L15.5 11.5zM17 1a2 2 0 0 1 2 2v9.475l-.85-.124-.857-1.736a2.048 2.048 0 0 0-.292-.44L17 3H3v14h7.808l.402.392L10.935 19H3a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h14z"/></svg>',tooltip:!0}),this.listenTo(n,"execute",()=>this._showView());const i=Object.values(Eo).map(t=>e.commands.get(t));return n.bind("isEnabled").toMany(i,"isEnabled",(...e)=>e.some(e=>e)),n})}destroy(){super.destroy(),this.view.destroy()}_createPropertiesView(){const e=this.editor,t=e.config.get("table.tableProperties"),o=Object(xe.normalizeColorOptions)(t.borderColors),n=Object(xe.getLocalizedColorOptions)(e.locale,o),i=Object(xe.normalizeColorOptions)(t.backgroundColors),r=Object(xe.getLocalizedColorOptions)(e.locale,i),l=new Io(e.locale,{borderColors:n,backgroundColors:r,defaultTableProperties:this._defaultTableProperties}),s=e.t;l.render(),this.listenTo(l,"submit",()=>{this._hideView()}),this.listenTo(l,"cancel",()=>{this._undoStepBatch.operations.length&&e.execute("undo",this._undoStepBatch),this._hideView()}),l.keystrokes.set("Esc",(e,t)=>{this._hideView(),t()}),Object(xe.clickOutsideHandler)({emitter:l,activator:()=>this._isViewInBalloon,contextElements:[this._balloon.view.element],callback:()=>this._hideView()});const a=Je(s),c=Xe(s);return l.on("change:borderStyle",this._getPropertyChangeCallback("tableBorderStyle",this._defaultTableProperties.borderStyle)),l.on("change:borderColor",this._getValidatedPropertyChangeCallback({viewField:l.borderColorInput,commandName:"tableBorderColor",errorText:a,validator:Ye,defaultValue:this._defaultTableProperties.borderColor})),l.on("change:borderWidth",this._getValidatedPropertyChangeCallback({viewField:l.borderWidthInput,commandName:"tableBorderWidth",errorText:c,validator:Ze,defaultValue:this._defaultTableProperties.borderWidth})),l.on("change:backgroundColor",this._getValidatedPropertyChangeCallback({viewField:l.backgroundInput,commandName:"tableBackgroundColor",errorText:a,validator:Ye,defaultValue:this._defaultTableProperties.backgroundColor})),l.on("change:width",this._getValidatedPropertyChangeCallback({viewField:l.widthInput,commandName:"tableWidth",errorText:c,validator:Qe,defaultValue:this._defaultTableProperties.width})),l.on("change:height",this._getValidatedPropertyChangeCallback({viewField:l.heightInput,commandName:"tableHeight",errorText:c,validator:Qe,defaultValue:this._defaultTableProperties.height})),l.on("change:alignment",this._getPropertyChangeCallback("tableAlignment",this._defaultTableProperties.alignment)),l}_fillViewFormFromCommandValues(){const e=this.editor.commands,t=e.get("tableBorderStyle");Object.entries(Eo).map(([t,o])=>{const n=this._defaultTableProperties[t]||"";return[t,e.get(o).value||n]}).forEach(([e,o])=>{("borderColor"!==e&&"borderWidth"!==e||"none"!==t.value)&&this.view.set(e,o)})}_showView(){const e=this.editor;this.listenTo(e.ui,"update",()=>{this._updateView()}),this._fillViewFormFromCommandValues(),this._balloon.add({view:this.view,position:Wt(e)}),this._undoStepBatch=e.model.createBatch(),this.view.focus()}_hideView(){const e=this.editor;this.stopListening(e.ui,"update"),this.view.saveButtonView.focus(),this._balloon.remove(this.view),this.editor.editing.view.focus()}_updateView(){const e=this.editor;We(e.editing.view.document.selection)?this._isViewVisible&&Dt(e,"table"):this._hideView()}get _isViewVisible(){return this._balloon.visibleView===this.view}get _isViewInBalloon(){return this._balloon.hasView(this.view)}_getPropertyChangeCallback(e,t){return(o,n,i,r)=>{(r||t!==i)&&this.editor.execute(e,{value:i,batch:this._undoStepBatch})}}_getValidatedPropertyChangeCallback(e){const{commandName:t,viewField:o,validator:n,errorText:i,defaultValue:r}=e,l=zt(()=>{o.errorText=i},500);return(e,i,s,a)=>{l.cancel(),(a||r!==s)&&(n(s)?(this.editor.execute(t,{value:s,batch:this._undoStepBatch}),o.errorText=null):l())}}}class Oo extends n.Plugin{static get pluginName(){return"TableProperties"}static get requires(){return[Vo,Bo]}}function Lo(e){e.document.registerPostFixer(t=>function(e,t){const o=t.document.differ.getChanges();let n=!1;for(const t of o){if("insert"!=t.type)continue;if(t.position.parent.is("element","table")||"table"==t.name){const o="table"==t.name?t.position.nodeAfter:t.position.parent,i=Array.from(o.getChildren()).filter(e=>e.is("element","caption")),r=i.shift();if(!r)continue;for(const t of i)e.move(e.createRangeIn(t),r,"end"),e.remove(t);r.nextSibling&&(e.move(e.createRangeOn(r),o,"end"),n=!0),n=!!i.length||n}}return n}(t,e))}function No(e){return!!e&&e.is("element","table")}function zo(e){for(const t of e.getChildren())if(t.is("element","caption"))return t;return null}function Mo(e){const t=e.parent;return"figcaption"==e.name&&t&&"figure"==t.name&&t.hasClass("table")||"caption"==e.name&&t&&"table"==t.name?{name:!0}:null}function Ho(e){const t=e.getSelectedElement();return t&&t.is("element","table")?t:e.getFirstPosition().findAncestor("table")}class Fo extends n.Command{refresh(){const e=Ho(this.editor.model.document.selection);this.isEnabled=!!e,this.isEnabled?this.value=!!zo(e):this.value=!1}execute(e={}){const{focusCaptionOnShow:t}=e;this.editor.model.change(e=>{this.value?this._hideTableCaption(e):this._showTableCaption(e,t)})}_showTableCaption(e,t){const o=Ho(this.editor.model.document.selection),n=this.editor.plugins.get("TableCaptionEditing")._getSavedCaption(o)||e.createElement("caption");e.append(n,o),t&&e.setSelection(n,"in")}_hideTableCaption(e){const t=Ho(this.editor.model.document.selection),o=this.editor.plugins.get("TableCaptionEditing"),n=zo(t);o._saveCaption(t,n),e.setSelection(e.createRangeIn(t.getChild(0).getChild(0))),e.remove(n)}}class Do extends n.Plugin{static get pluginName(){return"TableCaptionEditing"}constructor(e){super(e),this._savedCaptionsMap=new WeakMap}init(){const e=this.editor,t=e.model.schema,o=e.editing.view,n=e.t;t.isRegistered("caption")?t.extend("caption",{allowIn:"table"}):t.register("caption",{allowIn:"table",allowContentOf:"$block",isLimit:!0}),e.commands.add("toggleTableCaption",new Fo(this.editor)),e.conversion.for("upcast").elementToElement({view:Mo,model:"caption"}),e.conversion.for("dataDowncast").elementToElement({model:"caption",view:(e,{writer:t})=>No(e.parent)?t.createContainerElement("figcaption"):null}),e.conversion.for("editingDowncast").elementToElement({model:"caption",view:(e,{writer:t})=>{if(!No(e.parent))return null;const r=t.createEditableElement("figcaption");return t.setCustomProperty("tableCaption",!0,r),Object(Ne.enablePlaceholder)({view:o,element:r,text:n("Enter table caption"),keepOnFocus:!0}),Object(i.toWidgetEditable)(r,t)}}),Lo(e.model)}_getSavedCaption(e){const t=this._savedCaptionsMap.get(e);return t?Ne.Element.fromJSON(t):null}_saveCaption(e,t){this._savedCaptionsMap.set(e,t.toJSON())}}class Wo extends n.Plugin{static get pluginName(){return"TableCaptionUI"}init(){const e=this.editor,t=e.editing.view,o=e.t;e.ui.componentFactory.add("toggleTableCaption",i=>{const r=e.commands.get("toggleTableCaption"),l=new xe.ButtonView(i);return l.set({icon:n.icons.caption,tooltip:!0,isToggleable:!0}),l.bind("isOn","isEnabled").to(r,"value","isEnabled"),l.bind("label").to(r,"value",e=>o(e?"Toggle caption off":"Toggle caption on")),this.listenTo(l,"execute",()=>{if(e.execute("toggleTableCaption",{focusCaptionOnShow:!0}),r.value){const o=function(e){const t=Ho(e);return t?zo(t):null}(e.model.document.selection),n=e.editing.mapper.toViewElement(o);if(!n)return;t.scrollToTheSelection(),t.change(e=>{e.addClass("table__caption_highlighted",n)})}}),l})}}o(30);class jo extends n.Plugin{static get pluginName(){return"TableCaption"}static get requires(){return[Do,Wo]}}}]);
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/af.js b/core/assets/vendor/ckeditor5/build/translations/af.js
new file mode 100644
index 0000000000..edc374a3c4
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/af.js
@@ -0,0 +1 @@
+!function(n){const i=n.af=n.af||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Belyn in die middel","Align left":"Belyn links","Align right":"Belyn regs",Justify:"Belyn beide kante","Text alignment":"Teksbelyning","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.af=e.af||{};r.dictionary=Object.assign(r.dictionary||{},{Bold:"Vetgedruk",Code:"Kode",Italic:"Skuinsgedruk",Strikethrough:"Deurgetrek",Subscript:"Onderskrif",Superscript:"Boskrif",Underline:"Onderstreep"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.af=n.af||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blok-aanhaling"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.af=e.af||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Cancel:"Kanselleer","Remove color":"","Restore default":"",Save:"Berg","Show more items":""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/ar.js b/core/assets/vendor/ckeditor5/build/translations/ar.js
new file mode 100644
index 0000000000..300806d6a9
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/ar.js
@@ -0,0 +1 @@
+!function(n){const i=n.ar=n.ar||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"محاذاة في المنتصف","Align left":"محاذاة لليسار","Align right":"محاذاة لليمين",Justify:"ضبط","Text alignment":"محاذاة النص","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ar=i.ar||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"عريض",Code:"شفرة برمجية",Italic:"مائل",Strikethrough:"يتوسطه خط",Subscript:"",Superscript:"",Underline:"تحته خط"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ar=i.ar||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"اقتباس"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.ar=n.ar||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"اختر عنوان",Heading:"عنوان","Heading 1":"عنوان 1","Heading 2":"عنوان 2","Heading 3":"عنوان 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"فقرة","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ar=e.ar||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"صورة بالوسط","Change image text alternative":"غير النص البديل للصورة","Enter image caption":"ادخل عنوان الصورة","Full size image":"صورة بحجم كامل","Image resize list":"","Image toolbar":"","image widget":"عنصر الصورة","In line":"",Insert:"","Insert image":"ادراج صورة","Insert image via URL":"","Left aligned image":"صورة بمحاذاة لليسار",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"صورة بمحاذاة لليمين","Side image":"صورة جانبية","Text alternative":"النص البديل",Update:"","Update image URL":"","Upload failed":"فشل الرفع","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ar=n.ar||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"تحرير الرابط",Link:"رابط","Link image":"","Link URL":"رابط عنوان","Open in a new tab":"","Open link in new tab":"فتح الرابط في تبويب جديد","This link has no URL":"لا يحتوي هذا الرابط على عنوان",Unlink:"إلغاء الرابط"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ar=e.ar||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"قائمة نقطية","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"قائمة رقمية","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ar=e.ar||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"قم بمحاذاة نص الخلية للاسفل","Align cell text to the center":"قم بمحاذاة نص الخلية إلى المركز","Align cell text to the left":"قم بمحاذاة نص الخلية إلى اليسار","Align cell text to the middle":"قم بمحاذاة نص الخلية إلى المنتصف","Align cell text to the right":"قم بمحاذاة نص الخلية إلى اليمين","Align cell text to the top":"قم بمحاذاة نص الخلية إلى الأعلى","Align table to the left":"قم بمحاذاة الجدول إلى اليسار","Align table to the right":"قم بمحاذاة الجدول إلى اليمين",Alignment:"المحاذاة",Background:"الخلفية",Border:"الحدود","Cell properties":"خصائص الخلية","Center table":"قم بمحاذاة الجدول إلى المنتصف",Color:"اللون","Color picker":"",Column:"عمود",Dashed:"متقطع","Delete column":"حذف العمود","Delete row":"حذف الصف",Dimensions:"الابعاد",Dotted:"منقط",Double:"","Enter table caption":"",Groove:"","Header column":"عمود عنوان","Header row":"صف عنوان",Height:"الارتفاع","Horizontal text alignment toolbar":"شريط أدوات محاذاة النص الأفقي","Insert column left":"أدخل العمود إلى اليسار","Insert column right":"أدخل العمود إلى اليمين","Insert row above":"ادراج صف قبل","Insert row below":"ادراج صف بعد","Insert table":"إدراج جدول",Inset:"","Justify cell text":"ضبط نص الخلية","Merge cell down":"دمج الخلايا للأسفل","Merge cell left":"دمج الخلايا لليسار","Merge cell right":"دمج الخلايا لليمين","Merge cell up":"دمج الخلايا للأعلى","Merge cells":"دمج الخلايا",None:"لا شيء",Outset:"",Padding:"الحاشية",Ridge:"",Row:"صف","Select column":"حدد العمود","Select row":"حدد صفًا",Solid:"صلب","Split cell horizontally":"فصل الخلايا بشكل افقي","Split cell vertically":"فصل الخلايا بشكل عمودي",Style:"أسلوب","Table alignment toolbar":"شريط أدوات محاذاة الجدول","Table cell text alignment":"محاذاة نص خلية الجدول","Table properties":"خصائص الجدول","Table toolbar":"شريط أدوات الجدول",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"شريط أدوات محاذاة النص العمودي",Width:"العرض"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.ar=e.ar||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"إلغاء","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"إعادة","Remove color":"","Restore default":"","Rich Text Editor":"معالج نصوص","Rich Text Editor, %0":"معالج نصوص، 0%",Save:"حفظ","Show more items":"",Turquoise:"",Undo:"تراجع","Upload in progress":"جاري الرفع",White:"",Yellow:""}),o.getPluralForm=function(e){return 0==e?0:1==e?1:2==e?2:e%100>=3&&e%100<=10?3:e%100>=11&&e%100<=99?4:5}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/ast.js b/core/assets/vendor/ckeditor5/build/translations/ast.js
new file mode 100644
index 0000000000..0fb11d5d74
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/ast.js
@@ -0,0 +1 @@
+!function(i){const t=i.ast=i.ast||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Negrina",Code:"",Italic:"Cursiva",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.ast=e.ast||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"","Enter image caption":"","Full size image":"Imaxen a tamañu completu","Image resize list":"","Image toolbar":"","image widget":"complementu d'imaxen","In line":"",Insert:"","Insert image":"","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"Imaxen llateral","Text alternative":"",Update:"","Update image URL":"","Upload failed":"","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ast=n.ast||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"",Link:"Enllazar","Link image":"","Link URL":"URL del enllaz","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"Desenllazar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ast=e.ast||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Llista con viñetes","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Llista numberada","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.ast=e.ast||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Encaboxar","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Refacer","Remove color":"","Restore default":"","Rich Text Editor":"Editor de testu arriquecíu","Rich Text Editor, %0":"Editor de testu arriquecíu, %0",Save:"Guardar","Show more items":"",Turquoise:"",Undo:"Desfacer",White:"",Yellow:""}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/az.js b/core/assets/vendor/ckeditor5/build/translations/az.js
new file mode 100644
index 0000000000..846f24c8f5
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/az.js
@@ -0,0 +1 @@
+!function(n){const i=n.az=n.az||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Mərkəzə düzləndir","Align left":"Soldan düzləndir","Align right":"Sağdan düzləndir",Justify:"Eninə görə","Text alignment":"Mətn düzləndirməsi","Text alignment toolbar":"Mətnin düzləndirmə paneli"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const i=a.az=a.az||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Yarıqalın",Code:"Kod",Italic:"Maili",Strikethrough:"Qaralanmış",Subscript:"Alt yazı",Superscript:"Üst yazı",Underline:"Altdan xətt"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.az=i.az||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Sitat bloku"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const n=a.az=a.az||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Başlıqı seç",Heading:"Başlıq","Heading 1":"Başlıq 1","Heading 2":"Başlıq 2","Heading 3":"Başlıq 3","Heading 4":"Başlıq 4","Heading 5":"Başlıq 5","Heading 6":"Başlıq 6",Paragraph:"Abzas","Type or paste your content here.":"","Type your title":"Başlığınızı yazın"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.az=i.az||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Üfüqi xətt"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.az=e.az||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Mərkəzə düzləndir","Change image text alternative":"Alternativ mətni redaktə et","Enter image caption":"Şəkil başlığı daxil edin","Full size image":"Tam ölçülü şəkili","Image resize list":"","Image toolbar":"Şəkil paneli","image widget":"Şəkil vidgetı","In line":"",Insert:"","Insert image":"Şəkili əlavə et","Insert image via URL":"","Left aligned image":"Soldan düzləndir",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Sağdan düzləndir","Side image":"Yan şəkil","Text alternative":"Alternativ mətn",Update:"","Update image URL":"","Upload failed":"Şəkili serverə yüklə","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.az=i.az||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Boş yeri kiçilt","Increase indent":"Boş yeri böyüt"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.az=n.az||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Yüklənə bilər","Edit link":"Linki redaktə et",Link:"Əlaqələndir","Link image":"","Link URL":"Linkin URL","Open in a new tab":"Yeni pəncərədə aç","Open link in new tab":"Linki yeni pəncərədə aç","This link has no URL":"Bu linkdə URL yoxdur",Unlink:"Linki sil"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.az=e.az||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Markerlənmiş siyahı","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Nömrələnmiş siyahı","Numbered list styles toolbar":"",Square:"","To-do List":"To-do siyahı","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(l){const e=l.az=l.az||{};e.dictionary=Object.assign(e.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"Fon",Border:"Sərhəd","Cell properties":"","Center table":"",Color:"Rəng","Color picker":"",Column:"Sütun",Dashed:"","Delete column":"Sütunları sil","Delete row":"Sətirləri sil",Dimensions:"Ölçülər",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Başlıqlı sütun","Header row":"Başlıqlı sətir",Height:"Hündürlük","Horizontal text alignment toolbar":"","Insert column left":"Sola sütun əlavə et","Insert column right":"Sağa sütun əlavə et","Insert row above":"Aşağıya sətir əlavə et","Insert row below":"Yuxarıya sətir əlavə et","Insert table":"Cədvəli əlavə et",Inset:"","Justify cell text":"","Merge cell down":"Xanaları aşağı birləşdir","Merge cell left":"Xanaları sola birləşdir","Merge cell right":"Xanaları sağa birləşdir","Merge cell up":"Xanaları yuxarı birləşdir","Merge cells":"Xanaları birləşdir",None:"",Outset:"",Padding:"",Ridge:"",Row:"Sətir","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Xanaları üfüqi böl","Split cell vertically":"Xanaları şaquli böl",Style:"","Table alignment toolbar":"","Table cell text alignment":"Cədvəl hüceyrəsi mətninin uyğunlaşdırılması","Table properties":"Cədvəl xüsusiyyətləri","Table toolbar":"Cədvəl paneli",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:"Eni"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.az=e.az||{};a.dictionary=Object.assign(a.dictionary||{},{"%0 of %1":"%1-dən %0",Aquamarine:"Akvamarin",Black:"Qara",Blue:"Mavi",Cancel:"İmtina et","Dim grey":"Tünd boz","Dropdown toolbar":"Açılan paneli","Edit block":"Redaktə etmək bloku","Editor toolbar":"Redaktorun paneli",Green:"Yaşıl",Grey:"Boz","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Açıq mavi","Light green":"Açıq yaşıl","Light grey":"Açıq boz",Next:"Növbəti",Orange:"Narıncı",Previous:"Əvvəlki",Purple:"Bənövşəyi",Red:"Qırmızı",Redo:"Təkrar et","Remove color":"Rəngi ləğv et","Restore default":"","Rich Text Editor":"Rich Text Redaktoru","Rich Text Editor, %0":"Rich Text Redaktoru, %0",Save:"Yadda saxla","Show more items":"Daha çox əşyanı göstərin",Turquoise:"Firuzəyi",Undo:"İmtina et","Upload in progress":"Yüklənir",White:"Ağ","Widget toolbar":"Vidgetin paneli",Yellow:"Sarı"}),a.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/bg.js b/core/assets/vendor/ckeditor5/build/translations/bg.js
new file mode 100644
index 0000000000..097c0f4f97
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/bg.js
@@ -0,0 +1 @@
+!function(i){const n=i.bg=i.bg||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Удебелен",Code:"",Italic:"Курсив",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.bg=i.bg||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитат"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.bg=n.bg||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Избери заглавие",Heading:"Заглавие","Heading 1":"Заглавие 1","Heading 2":"Заглавие 2","Heading 3":"Заглавие 3","Heading 4":"Заглавие 4","Heading 5":"Заглавие 5","Heading 6":"Заглавие 6",Paragraph:"Параграф","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.bg=e.bg||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"","Enter image caption":"","Full size image":"","Image resize list":"","Image toolbar":"","image widget":"Компонент за изображение","In line":"",Insert:"","Insert image":"Вмъкни изображение","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"","Text alternative":"",Update:"","Update image URL":"","Upload failed":"","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.bg=n.bg||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Намали отстъпа","Increase indent":"Увеличи отстъпа"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.bg=n.bg||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Изтегляне","Edit link":"Редакция на линк",Link:"Линк","Link image":"","Link URL":"Уеб адрес на линка","Open in a new tab":"Отваряне в нов раздел","Open link in new tab":"Отваряне на линк в нов раздел","This link has no URL":"Този линк няма уеб адрес",Unlink:"Премахване на линка"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.bg=e.bg||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Водещи символи","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Номериране","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.bg=e.bg||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Колона",Dashed:"","Delete column":"Изтриване на колона","Delete row":"Изтриване на ред",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Заглавна колона","Header row":"Заглавен ред",Height:"","Horizontal text alignment toolbar":"","Insert column left":"Вмъкни колона отляво","Insert column right":"Вмъкни колона отдясно","Insert row above":"Вмъкни ред отгоре","Insert row below":"Вмъкни ред отдолу","Insert table":"Вмъкни таблица",Inset:"","Justify cell text":"","Merge cell down":"Обединяване на клетка надолу","Merge cell left":"Обединяване на клетка отляво","Merge cell right":"Обединяване на клетка отдясно","Merge cell up":"Обединяване на клетка отгоре","Merge cells":"Обединяване на клетки",None:"",Outset:"",Padding:"",Ridge:"",Row:"Ред","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Разделяне на клетки хоризонтално","Split cell vertically":"Разделяне на клетки вертикално",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const e=o.bg=o.bg||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"",Cancel:"Отказ",Redo:"Повтори","Remove color":"","Restore default":"",Save:"Запазване","Show more items":"",Undo:"Отмени","Upload in progress":"Качването е в процес"}),e.getPluralForm=function(o){return 1!=o}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/ca.js b/core/assets/vendor/ckeditor5/build/translations/ca.js
new file mode 100644
index 0000000000..7f89e8f547
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/ca.js
@@ -0,0 +1 @@
+!function(i){const n=i.ca=i.ca||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Alineació centre","Align left":"Alineació esquerra","Align right":"Alineació dreta",Justify:"Justificar","Text alignment":"Alineació text","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.ca=i.ca||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Negreta",Code:"Codi",Italic:"Cursiva",Strikethrough:"Marcat",Subscript:"",Superscript:"",Underline:"Subrallat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(c){const i=c.ca=c.ca||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Cita de bloc"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.ca=a.ca||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Escull capçalera",Heading:"Capçalera","Heading 1":"Capçalera 1","Heading 2":"Capçalera 2","Heading 3":"Capçalera 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Pàrraf","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const e=o.ca=o.ca||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"",Cancel:"Cancel·lar","Remove color":"","Restore default":"",Save:"Desar","Show more items":""}),e.getPluralForm=function(o){return 1!=o}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/cs.js b/core/assets/vendor/ckeditor5/build/translations/cs.js
new file mode 100644
index 0000000000..7008a397e2
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/cs.js
@@ -0,0 +1 @@
+!function(n){const t=n.cs=n.cs||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Zarovnat na střed","Align left":"Zarovnat vlevo","Align right":"Zarovnat vpravo",Justify:"Zarovnat do bloku","Text alignment":"Zarovnání textu","Text alignment toolbar":"Panel nástrojů zarovnání textu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.cs=n.cs||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Tučné",Code:"Kódový blok",Italic:"Kurzíva",Strikethrough:"Přeškrtnuté",Subscript:"Dolní index",Superscript:"Horní index",Underline:"Podtržené"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(c){const i=c.cs=c.cs||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Citace"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.cs=e.cs||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"Zvolte nadpis",Heading:"Nadpis","Heading 1":"Nadpis 1","Heading 2":"Nadpis 2","Heading 3":"Nadpis 3","Heading 4":"Nadpis 4","Heading 5":"Nadpis 5","Heading 6":"Nadpis 6",Paragraph:"Odstavec","Type or paste your content here.":"Zde zadejte nebo vložte obsah.","Type your title":"Sem zadejte název"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.cs=n.cs||{};o.dictionary=Object.assign(o.dictionary||{},{"Horizontal line":"Vodorovná čára"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.cs=e.cs||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Obrázek zarovnaný na střed","Change image text alternative":"Změnit alternativní text obrázku","Enter image caption":"Zadejte popis obrázku","Full size image":"Obrázek v plné velikosti","Image resize list":"Seznam možností změny velikosti","Image toolbar":"Panel nástrojů obrázku","image widget":"ovládací prvek obrázku","In line":"",Insert:"Vložit","Insert image":"Vložit obrázek","Insert image via URL":"Vložit obrázek pomocí URL","Left aligned image":"Obrázek zarovnaný vlevo",Original:"Originální","Resize image":"Změnit velikost","Resize image to %0":"Změnit velikost na %0","Resize image to the original size":"Změnit velikost na původní velikost","Right aligned image":"Obrázek zarovnaný vpravo","Side image":"Postranní obrázek","Text alternative":"Alternativní text",Update:"Aktualizovat","Update image URL":"Aktualizovat URL obrázku","Upload failed":"Nahrání selhalo","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.cs=n.cs||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Zmenšit odsazení","Increase indent":"Zvětšit odsazení"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const n=a.cs=a.cs||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Vybrat jazyk",Language:"Jazyk","Remove language":"Odstranit jazyk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.cs=n.cs||{};a.dictionary=Object.assign(a.dictionary||{},{Downloadable:"Ke stažení","Edit link":"Upravit odkaz",Link:"Odkaz","Link image":"Adresa obrázku","Link URL":"URL odkazu","Open in a new tab":"Otevřít v nové kartě","Open link in new tab":"Otevřít odkaz v nové kartě","This link has no URL":"Tento odkaz nemá žádnou URL",Unlink:"Odstranit odkaz"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.cs=e.cs||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Odrážky","Bulleted list styles toolbar":"Panel seznamu s odrážkami",Circle:"Kruh",Decimal:"Čísla","Decimal with leading zero":"Čísla s nulou na začátku",Disc:"Plný kruh","Lower-latin":"Malá písmena","Lower–roman":"Malé římské čísla","Numbered List":"Číslování","Numbered list styles toolbar":"Panel se styly číslovaného seznamu",Square:"Čtverec","To-do List":"Seznam úkolů","Toggle the circle list style":"Přepnout na seznam s kruhovým označením","Toggle the decimal list style":"Přepnout na číselný seznam","Toggle the decimal with leading zero list style":"Přepnout na číselný seznam s nulou na začátku","Toggle the disc list style":"Přepnout na seznam s označením plného kruhu","Toggle the lower–latin list style":"Přepnout na seznam s malými písmeny","Toggle the lower–roman list style":"Přepnout na seznam s malými římskými čísly","Toggle the square list style":"Přepnout na seznam se čtvercovým označením","Toggle the upper–latin list style":"Přepnout na seznam s velkými písmeny","Toggle the upper–roman list style":"Přepnout na seznam s velkými římskými čísly","Upper-latin":"Velká písmena","Upper-roman":"Velké římské čísla"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const e=t.cs=t.cs||{};e.dictionary=Object.assign(e.dictionary||{},{"Align cell text to the bottom":"Zarovnat text buňky dolů","Align cell text to the center":"Zarovnat text buňky na střed","Align cell text to the left":"Zarovnat text buňky doleva","Align cell text to the middle":"Zarovnat text buňky na střed","Align cell text to the right":"Zarovnat text buňky doprava","Align cell text to the top":"Zarovnat text buňky nahoru","Align table to the left":"Zarovnat tabulku doleva","Align table to the right":"Zarovnat tabulku doprava",Alignment:"Zarovnání",Background:"Pozadí",Border:"Okraj","Cell properties":"Vlastnosti buňky","Center table":"Centrovat tabulku",Color:"Barva","Color picker":"Vybrat barvu",Column:"Sloupec",Dashed:"Čárkovaná","Delete column":"Smazat sloupec","Delete row":"Smazat řádek",Dimensions:"Rozměry",Dotted:"Tečkovaná",Double:"Dvojitá","Enter table caption":"",Groove:"Drážkovaná","Header column":"Sloupec záhlaví","Header row":"Řádek záhlaví",Height:"Výška","Horizontal text alignment toolbar":"Horizontální zarovnání textu v panelu","Insert column left":"Vložit sloupec vlevo","Insert column right":"Vložit sloupec vpravo","Insert row above":"Vložit řádek před","Insert row below":"Vložit řádek pod","Insert table":"Vložit tabulku",Inset:"Vložená zevnitř","Justify cell text":"Zarovnat text buňky z obou stran","Merge cell down":"Sloučit s buňkou pod","Merge cell left":"Sloučit s buňkou vlevo","Merge cell right":"Sloučit s buňkou vpravo","Merge cell up":"Sloučit s buňkou nad","Merge cells":"Sloučit buňky",None:"Žádná",Outset:"Vložená zvenku",Padding:"Vnitřní okraj",Ridge:"Rámovaná",Row:"Řádek","Select column":"Vybrat sloupec","Select row":"Vybrat řádek",Solid:"Plná","Split cell horizontally":"Rozdělit buňky horizontálně","Split cell vertically":"Rozdělit buňky vertikálně",Style:"Styl","Table alignment toolbar":"Panel zarovnání tabulky","Table cell text alignment":"Zarovnání textu buňky tabulky","Table properties":"Vlastnosti tabulky","Table toolbar":"Panel nástrojů tabulky",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Barva má nesprávný formát. Zkuste "#FF0000", "rgb(255,0,0)" nebo "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Hodnota je nesprávná. Zkuste "10px", "2em" nebo jednoduše "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Vertikální zarovnání textu v panelu",Width:"Šířka"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.cs=e.cs||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 z %1",Aquamarine:"Akvamarínová",Black:"Černá",Blue:"Modrá",Cancel:"Zrušit","Dim grey":"Tmavě šedá","Dropdown toolbar":"Rozbalovací panel nástrojů","Edit block":"Upravit blok","Editor toolbar":"Panel nástrojů editoru",Green:"Zelená",Grey:"Šedá","Insert paragraph after block":"Vložte odstavec za blok","Insert paragraph before block":"Vložte odstavec před blok","Light blue":"Světle modrá","Light green":"Světle zelená","Light grey":"Světle šedá",Next:"Další",Orange:"Oranžová",Previous:"Předchozí",Purple:"Fialová",Red:"Červená",Redo:"Znovu","Remove color":"Odstranit barvu","Restore default":"","Rich Text Editor":"Textový editor","Rich Text Editor, %0":"Textový editor, %0",Save:"Uložit","Select all":"Vybrat vše","Show more items":"Zobrazit další položky",Turquoise:"Tyrkysová",Undo:"Zpět","Upload in progress":"Probíhá nahrávání",White:"Bílá","Widget toolbar":"Panel nástrojů ovládacího prvku",Yellow:"Žlutá"}),o.getPluralForm=function(e){return 1==e&&e%1==0?0:e>=2&&e<=4&&e%1==0?1:e%1!=0?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/da.js b/core/assets/vendor/ckeditor5/build/translations/da.js
new file mode 100644
index 0000000000..e4cc5f0f54
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/da.js
@@ -0,0 +1 @@
+!function(t){const n=t.da=t.da||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Justér center","Align left":"Justér venstre","Align right":"Justér højre",Justify:"Justér","Text alignment":"Tekstjustering","Text alignment toolbar":"Tekstjustering værktøjslinje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const e=t.da=t.da||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Fed",Code:"Kode",Italic:"Kursiv",Strikethrough:"Gennemstreg",Subscript:"Sænket skrift",Superscript:"Hævet skrift",Underline:"Understreget"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.da=i.da||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blot citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const e=i.da=i.da||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Vælg overskrift",Heading:"Overskrift","Heading 1":"Overskrift 1","Heading 2":"Overskrift 2","Heading 3":"Overskrift 3","Heading 4":"Overskrift 4","Heading 5":"Overskrift 5","Heading 6":"Overskrift 6",Paragraph:"Afsnit","Type or paste your content here.":"Skriv eller indsæt dit indhold her.","Type your title":"Skriv din titel"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.da=i.da||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Horisontal linje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.da=e.da||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Centreret billede","Change image text alternative":"Skift alternativ billedtekst","Enter image caption":"Indtast billedoverskrift","Full size image":"Fuld billedstørrelse","Image resize list":"","Image toolbar":"Billedværktøjslinje","image widget":"billed widget","In line":"",Insert:"","Insert image":"Indsæt billede","Insert image via URL":"","Left aligned image":"Venstrestillet billede",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Højrestillet billede","Side image":"Sidebillede","Text alternative":"Alternativ tekst",Update:"","Update image URL":"","Upload failed":"Upload fejlede","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.da=n.da||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Formindsk indrykning","Increase indent":"Forøg indrykning"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.da=n.da||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Kan downloades","Edit link":"Redigér link",Link:"Link","Link image":"","Link URL":"Link URL","Open in a new tab":"Åben i ny fane","Open link in new tab":"Åben link i ny fane","This link has no URL":"Dette link har ingen URL",Unlink:"Fjern link"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.da=e.da||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Punktopstilling","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Opstilling med tal","Numbered list styles toolbar":"",Square:"","To-do List":"To-do liste","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.da=e.da||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Justér tekstcelle til bunden","Align cell text to the center":"Justér tekstcelle centreret","Align cell text to the left":"Justér tekstcelle til venstre","Align cell text to the middle":"Justér tekstcelle til midten","Align cell text to the right":"Justér tekstcelle til højre","Align cell text to the top":"Justér tekstcelle til top","Align table to the left":"Justér tabel til venstre","Align table to the right":"Justér tabel til højre",Alignment:"Justering",Background:"Baggrund",Border:"Ramme","Cell properties":"Celleegenskaber","Center table":"Centrér tabel",Color:"Farve","Color picker":"",Column:"Kolonne",Dashed:"Stiplet (streg)","Delete column":"Slet kolonne","Delete row":"Slet række",Dimensions:"Dimensioner",Dotted:"Stiplet (prik)",Double:"Dobbel","Enter table caption":"",Groove:"Not","Header column":"Headerkolonne","Header row":"Headerrække",Height:"Højde","Horizontal text alignment toolbar":"Horisontal tekstjustering værktøjslinje","Insert column left":"Indsæt kolonne venstre","Insert column right":"Indsæt kolonne højre","Insert row above":"Indsæt header over","Insert row below":"Indsæt header under","Insert table":"Indsæt tabel",Inset:"Forsænket","Justify cell text":"Justér tekstcelle","Merge cell down":"Flet celler ned","Merge cell left":"Flet celler venstre","Merge cell right":"Flet celler højre","Merge cell up":"Flet celler op","Merge cells":"Flet celler",None:"Ingen",Outset:"Fra starten",Padding:"Fyld",Ridge:"Kam",Row:"Række","Select column":"","Select row":"",Solid:"Massiv","Split cell horizontally":"Del celle horisontalt","Split cell vertically":"Del celle vertikalt",Style:"Stil","Table alignment toolbar":"Tabeljustering værktøjslinje","Table cell text alignment":"Tabelcelle tekstjustering","Table properties":"Tabelegenskaber","Table toolbar":"Tabel værktøjslinje",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Farven er ugyldig. Prøv "#FF0000" eller "rgb(255,0,0)" eller "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Værdien er ugyldig. Prøv "10px" eller "2em" eller ganske enkelt "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Vertikal tekstjustering værktøjslinje",Width:"Bredde"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(r){const e=r.da=r.da||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 af %1",Aquamarine:"Marineblå",Black:"Sort",Blue:"Blå",Cancel:"Annullér","Dim grey":"Dunkel grå","Dropdown toolbar":"Dropdown værktøjslinje","Edit block":"Redigér blok","Editor toolbar":"Editor værktøjslinje",Green:"Grøn",Grey:"Grå","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Lys blå","Light green":"Lys grøn","Light grey":"Lys grå",Next:"Næste",Orange:"Orange",Previous:"Forrige",Purple:"Lilla",Red:"Rød",Redo:"Gentag","Remove color":"Fjern farve","Restore default":"","Rich Text Editor":"Wysiwyg editor","Rich Text Editor, %0":"Wysiwyg editor, %0",Save:"Gem","Show more items":"Vis flere emner",Turquoise:"Turkis",Undo:"Fortryd","Upload in progress":"Upload i gang",White:"Hvid","Widget toolbar":"Widget værktøjslinje",Yellow:"Gyl"}),e.getPluralForm=function(r){return 1!=r}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/de-ch.js b/core/assets/vendor/ckeditor5/build/translations/de-ch.js
new file mode 100644
index 0000000000..9cbfa77c01
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/de-ch.js
@@ -0,0 +1 @@
+!function(t){const i=t["de-ch"]=t["de-ch"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig",Justify:"Blocksatz","Text alignment":"Textausrichtung","Text alignment toolbar":"Textausrichtung Werkzeugleiste"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e["de-ch"]=e["de-ch"]||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Fett",Code:"Code",Italic:"Kursiv",Strikethrough:"Durchgestrichen",Subscript:"Tiefgestellt",Superscript:"Hochgestellt",Underline:"Unterstrichen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(c){const i=c["de-ch"]=c["de-ch"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blockzitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e["de-ch"]=e["de-ch"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Überschrift auswählen",Heading:"Überschrift","Heading 1":"Überschrift 1","Heading 2":"Überschrift 2","Heading 3":"Überschrift 3","Heading 4":"Überschrift 4","Heading 5":"Überschrift 5","Heading 6":"Überschrift 6",Paragraph:"Absatz","Type or paste your content here.":"Hier Inhalt einfügen.","Type your title":"Titel eingeben"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i["de-ch"]=i["de-ch"]||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Horizontale Linie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e["de-ch"]=e["de-ch"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"zentriertes Bild","Change image text alternative":"Alternativtext ändern","Enter image caption":"Bildunterschrift eingeben","Full size image":"Bild in voller Grösse","Image resize list":"Bildgrössen-Liste","Image toolbar":"Bild Werkzeugleiste","image widget":"Bild-Steuerelement","In line":"",Insert:"Einfügen","Insert image":"Bild einfügen","Insert image via URL":"Bild von URL einfügen","Left aligned image":"linksbündiges Bild",Original:"Original","Resize image":"Bildgrösse ändern","Resize image to %0":"Bildgrösse ändern in %0","Resize image to the original size":"Originalgrösse wiederherstellen","Right aligned image":"rechtsbündiges Bild","Side image":"Ausgerichtetes Bild","Text alternative":"Alternativtext",Update:"Aktualisieren","Update image URL":"Bild-URL aktualisieren","Upload failed":"Hochladen fehlgeschlagen","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n["de-ch"]=n["de-ch"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Einzug verkleinern","Increase indent":"Einzug vergrössern"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e["de-ch"]=e["de-ch"]||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Sprache auswählen",Language:"Sprache","Remove language":"Sprache entfernen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n["de-ch"]=n["de-ch"]||{};e.dictionary=Object.assign(e.dictionary||{},{Downloadable:"Herunterladbar","Edit link":"Link bearbeiten",Link:"Link","Link image":"Bild verlinken","Link URL":"Link Adresse","Open in a new tab":"In neuem Tab öffnen","Open link in new tab":"Link in neuem Tab öffnen","This link has no URL":"Dieser Link hat keine Adresse",Unlink:"Link entfernen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e["de-ch"]=e["de-ch"]||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Aufzählungsliste","Bulleted list styles toolbar":"Darstellung der ungeordneten Liste",Circle:"Leerer Kreis",Decimal:"Dezimalzahlen","Decimal with leading zero":"Dezimalzahlen mit vorangestellten Nullen",Disc:"Gefüllter Kreis","Lower-latin":"Kleingeschriebene lateinische Buchstaben","Lower–roman":"Kleingeschriebene römische Zahlen","Numbered List":"Nummerierte Liste","Numbered list styles toolbar":"Darstellung der nummerierten Liste",Square:"Quadrat","To-do List":"Aufgabenliste","Toggle the circle list style":"Leeren Kreis einstellen","Toggle the decimal list style":"Dezimalzahlen einstellen","Toggle the decimal with leading zero list style":"Dezimalzahlen mit vorangestellten Nullen einstellen","Toggle the disc list style":"Gefüllten Kreis einstellen","Toggle the lower–latin list style":"Kleingeschriebene lateinische Buchstaben einstellen","Toggle the lower–roman list style":"Kleingeschriebene römische Zahlen einstellen","Toggle the square list style":"Quadrat einstellen","Toggle the upper–latin list style":"Grossgeschriebene lateinische Buchstaben einstellen","Toggle the upper–roman list style":"Grossgeschriebene römische Zahlen einstellen","Upper-latin":"Grossgeschriebene lateinische Buchstaben","Upper-roman":"Grossgeschriebene römische Zahlen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e["de-ch"]=e["de-ch"]||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Spalte",Dashed:"","Delete column":"Spalte löschen","Delete row":"Zeile löschen",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Kopfspalte","Header row":"Kopfspalte",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"Zeile oben einfügen","Insert row below":"Zeile unten einfügen","Insert table":"Tabelle einfügen",Inset:"","Justify cell text":"","Merge cell down":"Zelle unten verbinden","Merge cell left":"Zelle links verbinden","Merge cell right":"Zele rechts verbinden","Merge cell up":"Zelle oben verbinden","Merge cells":"Zellen verbinden",None:"",Outset:"",Padding:"",Ridge:"",Row:"Zeile","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Zelle horizontal teilen","Split cell vertically":"Zelle vertikal teilen",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e["de-ch"]=e["de-ch"]||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Abbrechen","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Insert paragraph after block":"Absatz nach Block einfügen","Insert paragraph before block":"Absatz vor Block einfügen","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Wiederherstellen","Remove color":"Farbe entfernen","Restore default":"","Rich Text Editor":"Rich-Text-Edito","Rich Text Editor, %0":"Rich-Text-Editor, %0",Save:"Speichern","Select all":"Alles auswählen","Show more items":"",Turquoise:"",Undo:"Rückgängig","Upload in progress":"Upload läuft",White:"","Widget toolbar":"Widget Werkzeugleiste",Yellow:""}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/de.js b/core/assets/vendor/ckeditor5/build/translations/de.js
new file mode 100644
index 0000000000..0856476a75
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/de.js
@@ -0,0 +1 @@
+!function(n){const t=n.de=n.de||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig",Justify:"Blocksatz","Text alignment":"Textausrichtung","Text alignment toolbar":"Text-Ausrichtung Toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.de=e.de||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Fett",Code:"Code",Italic:"Kursiv",Strikethrough:"Durchgestrichen",Subscript:"Tiefgestellt",Superscript:"Hochgestellt",Underline:"Unterstrichen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.de=i.de||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blockzitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.de=e.de||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Überschrift auswählen",Heading:"Überschrift","Heading 1":"Überschrift 1","Heading 2":"Überschrift 2","Heading 3":"Überschrift 3","Heading 4":"Überschrift 4","Heading 5":"Überschrift 5","Heading 6":"Überschrift 6",Paragraph:"Absatz","Type or paste your content here.":"Hier Inhalt einfügen.","Type your title":"Titel eingeben"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.de=i.de||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Horizontale Linie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.de=e.de||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"Bild teilt Text","Centered image":"Zentriertes Bild","Change image text alternative":"Alternativtext ändern","Enter image caption":"Bildunterschrift eingeben","Full size image":"Bild in voller Größe","Image resize list":"Bildgrößen-Liste","Image toolbar":"Bild Werkzeugleiste","image widget":"Bild-Steuerelement","In line":"Text in Zeile",Insert:"Einfügen","Insert image":"Bild einfügen","Insert image via URL":"Bild von URL einfügen","Left aligned image":"Linksbündiges Bild",Original:"Original","Resize image":"Bildgröße ändern","Resize image to %0":"Bildgröße ändern in %0","Resize image to the original size":"Bild in Originalgröße ändern","Right aligned image":"Rechtsbündiges Bild","Side image":"Seitenbild","Text alternative":"Alternativtext",Update:"Aktualisieren","Update image URL":"Bild-URL aktualisieren","Upload failed":"Hochladen fehlgeschlagen","Wrap text":"Text umfließt Bild"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.de=n.de||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Einzug verkleinern","Increase indent":"Einzug vergrößern"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e.de=e.de||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Sprache auswählen",Language:"Sprache","Remove language":"Sprache entfernen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.de=n.de||{};e.dictionary=Object.assign(e.dictionary||{},{Downloadable:"Herunterladbar","Edit link":"Link bearbeiten",Link:"Link","Link image":"Bild verlinken","Link URL":"Link Adresse","Open in a new tab":"In neuem Tab öffnen","Open link in new tab":"Link im neuen Tab öffnen","This link has no URL":"Dieser Link hat keine Adresse",Unlink:"Link entfernen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.de=e.de||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Aufzählungsliste","Bulleted list styles toolbar":"Darstellung der ungeordneten Liste",Circle:"Leerer Kreis",Decimal:"Dezimalzahlen","Decimal with leading zero":"Dezimalzahlen mit vorangestellten Nullen",Disc:"Gefüllter Kreis","Lower-latin":"Kleingeschriebene lateinische Buchstaben","Lower–roman":"Kleingeschriebene römische Zahlen","Numbered List":"Nummerierte Liste","Numbered list styles toolbar":"Darstellung der geordneten Liste",Square:"Quadrat","To-do List":"Aufgabenliste","Toggle the circle list style":"Leeren Kreis einstellen","Toggle the decimal list style":"Dezimalzahlen einstellen","Toggle the decimal with leading zero list style":"Dezimalzahlen mit vorangestellten Nullen einstellen","Toggle the disc list style":"Gefüllten Kreis einstellen","Toggle the lower–latin list style":"Kleingeschriebene lateinische Buchstaben einstellen","Toggle the lower–roman list style":"Kleingeschriebene römische Zahlen einstellen","Toggle the square list style":"Quadrat einstellen","Toggle the upper–latin list style":"Großgeschriebene lateinische Buchstaben einstellen","Toggle the upper–roman list style":"Großgeschriebene römische Zahlen einstellen","Upper-latin":"Großgeschriebene lateinische Buchstaben","Upper-roman":"Großgeschriebene römische Zahlen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.de=i.de||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"Quellcode"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.de=e.de||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Zellentext unten ausrichten","Align cell text to the center":"Zellentext zentriert ausrichten","Align cell text to the left":"Zellentext linksbündig ausrichten","Align cell text to the middle":"Zellentext mittig ausrichten","Align cell text to the right":"Zellentext rechtsbündig ausrichten","Align cell text to the top":"Zellentext oben ausrichten","Align table to the left":"Tabelle links ausrichten","Align table to the right":"Tabelle rechts ausrichten",Alignment:"Ausrichtung",Background:"Hintergrund",Border:"Rahmen","Cell properties":"Zelleneigenschaften","Center table":"Tabelle zentrieren",Color:"Farbe","Color picker":"Farbwähler",Column:"Spalte",Dashed:"Gestrichelt","Delete column":"Spalte löschen","Delete row":"Zeile löschen",Dimensions:"Größe",Dotted:"Gepunktet",Double:"Doppelt","Enter table caption":"Tabellenüberschrift eingeben",Groove:"Eingeritzt","Header column":"Kopfspalte","Header row":"Kopfzeile",Height:"Höhe","Horizontal text alignment toolbar":"Werkzeugleiste für die horizontale Zellentext-Ausrichtung","Insert column left":"Spalte links einfügen","Insert column right":"Spalte rechts einfügen","Insert row above":"Zeile oben einfügen","Insert row below":"Zeile unten einfügen","Insert table":"Tabelle einfügen",Inset:"Eingelassen","Justify cell text":"Zellentext als Blocksatz ausrichten","Merge cell down":"Zelle unten verbinden","Merge cell left":"Zelle links verbinden","Merge cell right":"Zelle rechts verbinden","Merge cell up":"Zelle verbinden","Merge cells":"Zellen verbinden",None:"Kein Rahmen",Outset:"Geprägt",Padding:"Innenabstand",Ridge:"Hervorgehoben",Row:"Zeile","Select column":"Spalte auswählen","Select row":"Zeile auswählen",Solid:"Durchgezogen","Split cell horizontally":"Zelle horizontal teilen","Split cell vertically":"Zelle vertikal teilen",Style:"Rahmenart","Table alignment toolbar":"Werkzeugleiste für die Tabellen-Ausrichtung","Table cell text alignment":"Ausrichtung des Zellentextes","Table properties":"Tabelleneigenschaften","Table toolbar":"Tabelle Werkzeugleiste",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"Die Farbe ist ungültig. Probieren Sie „#FF0000“ oder „rgb(255,0,0)“ oder „red“.",'The value is invalid. Try "10px" or "2em" or simply "2".':"Der Wert ist ungültig. Probieren Sie „10px“ oder „2em“ oder „2“.","Toggle caption off":"Tabellenüberschrift deaktivieren","Toggle caption on":"Tabellenüberschrift aktivieren","Vertical text alignment toolbar":"Werkzeugleiste für die vertikale Zellentext-Ausrichtung",Width:"Breite"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.de=i.de||{};n.dictionary=Object.assign(n.dictionary||{},{"HTML object":"HTML-Objekt"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.de=e.de||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 von %1",Aquamarine:"Aquamarinblau",Black:"Schwarz",Blue:"Blau",Cancel:"Abbrechen","Dim grey":"Dunkelgrau","Dropdown toolbar":"Dropdown-Liste Werkzeugleiste","Edit block":"Absatz bearbeiten","Editor toolbar":"Editor Werkzeugleiste",Green:"Grün",Grey:"Grau","Insert paragraph after block":"Absatz nach Block einfügen","Insert paragraph before block":"Absatz vor Block einfügen","Light blue":"Hellblau","Light green":"Hellgrün","Light grey":"Hellgrau",Next:"Nächste",Orange:"Orange",Previous:"vorherige",Purple:"Violett",Red:"Rot",Redo:"Wiederherstellen","Remove color":"Farbe entfernen","Restore default":"Standard wiederherstellen","Rich Text Editor":"Rich Text Editor","Rich Text Editor, %0":"Rich-Text-Editor, %0",Save:"Speichern","Select all":"Alles auswählen","Show more items":"Mehr anzeigen",Turquoise:"Türkis",Undo:"Rückgängig","Upload in progress":"Upload läuft",White:"Weiß","Widget toolbar":"Widget Werkzeugleiste",Yellow:"Gelb"}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/el.js b/core/assets/vendor/ckeditor5/build/translations/el.js
new file mode 100644
index 0000000000..29897c0706
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/el.js
@@ -0,0 +1 @@
+!function(i){const n=i.el=i.el||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Έντονη",Code:"",Italic:"Πλάγια",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.el=i.el||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Περιοχή παράθεσης"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e.el=e.el||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Επιλέξτε κεφαλίδα",Heading:"Κεφαλίδα","Heading 1":"Κεφαλίδα 1","Heading 2":"Κεφαλίδα 2","Heading 3":"Κεφαλίδα 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Παράγραφος","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.el=e.el||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"Αλλαγή εναλλακτικού κείμενου","Enter image caption":"Λεζάντα","Full size image":"Εικόνα πλήρης μεγέθους","Image resize list":"","Image toolbar":"","image widget":"","In line":"",Insert:"","Insert image":"Εισαγωγή εικόνας","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"","Text alternative":"Εναλλακτικό κείμενο",Update:"","Update image URL":"","Upload failed":"","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.el=n.el||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"",Link:"Σύνδεσμος","Link image":"","Link URL":"Διεύθυνση συνδέσμου","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"Αφαίρεση συνδέσμου"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.el=e.el||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Λίστα κουκκίδων","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Αριθμημένη λίστα","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.el=e.el||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Ακύρωση","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Επανάληψη","Remove color":"","Restore default":"","Rich Text Editor":"Επεξεργαστής Πλούσιου Κειμένου","Rich Text Editor, %0":"Επεξεργαστής Πλούσιου Κειμένου, 0%",Save:"Αποθήκευση","Show more items":"",Turquoise:"",Undo:"Αναίρεση",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/en-au.js b/core/assets/vendor/ckeditor5/build/translations/en-au.js
new file mode 100644
index 0000000000..17819fa684
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/en-au.js
@@ -0,0 +1 @@
+!function(n){const t=n["en-au"]=n["en-au"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Align centre","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":"Text alignment toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i["en-au"]=i["en-au"]||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Bold",Code:"Code",Italic:"Italic",Strikethrough:"Strikethrough",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n["en-au"]=n["en-au"]||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e["en-au"]=e["en-au"]||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Choose heading",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6",Paragraph:"Paragraph","Type or paste your content here.":"Type or paste your content here.","Type your title":"Type your title"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["en-au"]=n["en-au"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Horizontal line"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e["en-au"]=e["en-au"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Centred image","Change image text alternative":"Change image text alternative","Enter image caption":"Enter image caption","Full size image":"Full size image","Image resize list":"Image resize list","Image toolbar":"Image toolbar","image widget":"image widget","In line":"",Insert:"Insert","Insert image":"Insert image","Insert image via URL":"Insert image via URL","Left aligned image":"Left aligned image",Original:"Original","Resize image":"Resize image","Resize image to %0":"Resize image to %0","Resize image to the original size":"Resize image to the original size","Right aligned image":"Right aligned image","Side image":"Side image","Text alternative":"Text alternative",Update:"Update","Update image URL":"Update image URL","Upload failed":"Upload failed","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n["en-au"]=n["en-au"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Decrease indent","Increase indent":"Increase indent"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["en-au"]=n["en-au"]||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Downloadable","Edit link":"Edit link",Link:"Link","Link image":"Link image","Link URL":"Link URL","Open in a new tab":"Open in a new tab","Open link in new tab":"Open link in new tab","This link has no URL":"This link has no URL",Unlink:"Unlink"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e["en-au"]=e["en-au"]||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Circle:"Circle",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero",Disc:"Disc","Lower-latin":"Lower-latin","Lower–roman":"Lower–roman","Numbered List":"Numbered List","Numbered list styles toolbar":"Numbered list styles toolbar",Square:"Square","To-do List":"To-do List","Toggle the circle list style":"Toggle the circle list style","Toggle the decimal list style":"Toggle the decimal list style","Toggle the decimal with leading zero list style":"Toggle the decimal with leading zero list style","Toggle the disc list style":"Toggle the disc list style","Toggle the lower–latin list style":"Toggle the lower–latin list style","Toggle the lower–roman list style":"Toggle the lower–roman list style","Toggle the square list style":"Toggle the square list style","Toggle the upper–latin list style":"Toggle the upper–latin list style","Toggle the upper–roman list style":"Toggle the upper–roman list style","Upper-latin":"Upper-latin","Upper-roman":"Upper-roman"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e["en-au"]=e["en-au"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",Background:"Background",Border:"Border","Cell properties":"Cell properties","Center table":"Centre table",Color:"Colour","Color picker":"Colour picker",Column:"Column",Dashed:"Dashed","Delete column":"Delete column","Delete row":"Delete row",Dimensions:"Dimensions",Dotted:"Dotted",Double:"Double","Enter table caption":"",Groove:"Groove","Header column":"Header column","Header row":"Header row",Height:"Height","Horizontal text alignment toolbar":"Horizontal text alignment toolbar","Insert column left":"Insert column left","Insert column right":"Insert column right","Insert row above":"Insert row above","Insert row below":"Insert row below","Insert table":"Insert table",Inset:"Inset","Justify cell text":"Justify cell text","Merge cell down":"Merge cell down","Merge cell left":"Merge cell left","Merge cell right":"Merge cell right","Merge cell up":"Merge cell up","Merge cells":"Merge cells",None:"None",Outset:"Outset",Padding:"Padding",Ridge:"Ridge",Row:"Row","Select column":"Select column","Select row":"Select row",Solid:"Solid","Split cell horizontally":"Split cell horizontally","Split cell vertically":"Split cell vertically",Style:"Style","Table alignment toolbar":"Table alignment toolbar","Table cell text alignment":"Table cell text alignment","Table properties":"Table properties","Table toolbar":"Table toolbar",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'The colour is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'The value is invalid. Try "10px" or "2em" or simply "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Vertical text alignment toolbar",Width:"Width"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e["en-au"]=e["en-au"]||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 of %1",Aquamarine:"Aquamarine",Black:"Black",Blue:"Blue",Cancel:"Cancel","Dim grey":"Dim grey","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Editor toolbar":"Editor toolbar",Green:"Green",Grey:"Grey","Insert paragraph after block":"Insert paragraph after block","Insert paragraph before block":"Insert paragraph before block","Light blue":"Light blue","Light green":"Light green","Light grey":"Light grey",Next:"Next",Orange:"Orange",Previous:"Previous",Purple:"Purple",Red:"Red",Redo:"Redo","Remove color":"Remove colour","Restore default":"","Rich Text Editor":"Rich Text Editor","Rich Text Editor, %0":"Rich Text Editor, %0",Save:"Save","Select all":"Select all","Show more items":"Show more items",Turquoise:"Turquoise",Undo:"Undo","Upload in progress":"Upload in progress",White:"White","Widget toolbar":"Widget toolbar",Yellow:"Yellow"}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/en-gb.js b/core/assets/vendor/ckeditor5/build/translations/en-gb.js
new file mode 100644
index 0000000000..e221e13b98
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/en-gb.js
@@ -0,0 +1 @@
+!function(n){const i=n["en-gb"]=n["en-gb"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Align center","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i["en-gb"]=i["en-gb"]||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Bold",Code:"Code",Italic:"Italic",Strikethrough:"Strikethrough",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n["en-gb"]=n["en-gb"]||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e["en-gb"]=e["en-gb"]||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Choose heading",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6",Paragraph:"Paragraph","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e["en-gb"]=e["en-gb"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Centred image","Change image text alternative":"Change image text alternative","Enter image caption":"Enter image caption","Full size image":"Full size image","Image resize list":"","Image toolbar":"","image widget":"Image widget","In line":"",Insert:"","Insert image":"Insert image","Insert image via URL":"","Left aligned image":"Left aligned image",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Right aligned image","Side image":"Side image","Text alternative":"Text alternative",Update:"","Update image URL":"","Upload failed":"Upload failed","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n["en-gb"]=n["en-gb"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Decrease indent","Increase indent":"Increase indent"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["en-gb"]=n["en-gb"]||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Downloadable","Edit link":"Edit link",Link:"Link","Link image":"","Link URL":"Link URL","Open in a new tab":"Open in a new tab","Open link in new tab":"Open link in new tab","This link has no URL":"This link has no URL",Unlink:"Unlink"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e["en-gb"]=e["en-gb"]||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Bulleted List","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numbered List","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e["en-gb"]=e["en-gb"]||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Column",Dashed:"","Delete column":"Delete column","Delete row":"Delete row",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Header column","Header row":"Header row",Height:"","Horizontal text alignment toolbar":"","Insert column left":"Insert column left","Insert column right":"Insert column right","Insert row above":"Insert row above","Insert row below":"Insert row below","Insert table":"Insert table",Inset:"","Justify cell text":"","Merge cell down":"Merge cell down","Merge cell left":"Merge cell left","Merge cell right":"Merge cell right","Merge cell up":"Merge cell up","Merge cells":"Merge cells",None:"",Outset:"",Padding:"",Ridge:"",Row:"Row","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Split cell horizontally","Split cell vertically":"Split cell vertically",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e["en-gb"]=e["en-gb"]||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 of %1",Aquamarine:"Aquamarine",Black:"Black",Blue:"Blue",Cancel:"Cancel","Dim grey":"Dim grey","Dropdown toolbar":"","Edit block":"Edit block","Editor toolbar":"",Green:"Green",Grey:"Grey","Light blue":"Light blue","Light green":"Light green","Light grey":"Light grey",Next:"Next",Orange:"Orange",Previous:"Previous",Purple:"Purple",Red:"Red",Redo:"Redo","Remove color":"Remove colour","Restore default":"","Rich Text Editor":"Rich Text Editor","Rich Text Editor, %0":"Rich Text Editor, %0",Save:"Save","Show more items":"",Turquoise:"Turquoise",Undo:"Undo","Upload in progress":"Upload in progress",White:"White",Yellow:"Yellow"}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/eo.js b/core/assets/vendor/ckeditor5/build/translations/eo.js
new file mode 100644
index 0000000000..5270850a0a
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/eo.js
@@ -0,0 +1 @@
+!function(i){const o=i.eo=i.eo||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"grasa",Code:"",Italic:"kursiva",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.eo=a.eo||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Elektu ĉapon",Heading:"Ĉapo","Heading 1":"Ĉapo 1","Heading 2":"Ĉapo 2","Heading 3":"Ĉapo 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Paragrafo","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.eo=e.eo||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"Ŝanĝu la alternativan tekston de la bildo","Enter image caption":"Skribu klarigon pri la bildo","Full size image":"Bildo kun reala dimensio","Image resize list":"","Image toolbar":"","image widget":"bilda fenestraĵo","In line":"",Insert:"","Insert image":"Enmetu bildon","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"Flanka biildo","Text alternative":"Alternativa teksto",Update:"","Update image URL":"","Upload failed":"","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.eo=i.eo||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"","Edit link":"",Link:"Ligilo","Link image":"","Link URL":"URL de la ligilo","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"Malligi"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.eo=e.eo||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Bula Listo","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numerita Listo","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.eo=e.eo||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Nuligi","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Refari","Remove color":"","Restore default":"","Rich Text Editor":"Redaktilo de Riĉa Teksto","Rich Text Editor, %0":"Redaktilo de Riĉa Teksto, %0",Save:"Konservi","Show more items":"",Turquoise:"",Undo:"Malfari",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/es.js b/core/assets/vendor/ckeditor5/build/translations/es.js
new file mode 100644
index 0000000000..f89ee55f70
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/es.js
@@ -0,0 +1 @@
+!function(e){const i=e.es=e.es||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Centrar","Align left":"Alinear a la izquierda","Align right":"Alinear a la derecha",Justify:"Justificar","Text alignment":"Alineación del texto","Text alignment toolbar":"Barra de herramientas de alineación del texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const d=i.es=i.es||{};d.dictionary=Object.assign(d.dictionary||{},{Bold:"Negrita",Code:"Código",Italic:"Cursiva",Strikethrough:"Tachado",Subscript:"Subíndice",Superscript:"Superíndice",Underline:"Subrayado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.es=i.es||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Cita de bloque"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.es=a.es||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Elegir Encabezado",Heading:"Encabezado","Heading 1":"Encabezado 1","Heading 2":"Encabezado 2","Heading 3":"Encabezado 3","Heading 4":"Encabezado 4","Heading 5":"Encabezado 5","Heading 6":"Encabezado 6",Paragraph:"Párrafo","Type or paste your content here.":"Introduce o pega tu contenido aquí","Type your title":"Introduce tu título"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.es=n.es||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Línea horizontal"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.es=e.es||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Imagen centrada","Change image text alternative":"Cambiar el texto alternativo de la imagen","Enter image caption":"Introducir título de la imagen","Full size image":"Imagen a tamaño completo","Image resize list":"","Image toolbar":"Barra de herramientas de imagen","image widget":"Widget de imagen","In line":"",Insert:"","Insert image":"Insertar imagen","Insert image via URL":"","Left aligned image":"Imagen alineada a la izquierda",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Imagen alineada a la derecha","Side image":"Imagen lateral","Text alternative":"Texto alternativo",Update:"","Update image URL":"","Upload failed":"Fallo en la subida","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.es=n.es||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Disminuir sangría","Increase indent":"Aumentar sangría"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const a=i.es=i.es||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Elija el idioma",Language:"Idioma","Remove language":"Quitar idioma"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.es=n.es||{};e.dictionary=Object.assign(e.dictionary||{},{Downloadable:"Descargable","Edit link":"Editar enlace",Link:"Enlace","Link image":"","Link URL":"URL del enlace","Open in a new tab":"Abrir en una pestaña nueva ","Open link in new tab":"Abrir enlace en una pestaña nueva","This link has no URL":"Este enlace no tiene URL",Unlink:"Quitar enlace"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.es=e.es||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Lista de puntos","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Lista numerada","Numbered list styles toolbar":"",Square:"","To-do List":"Lista de tareas","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.es=e.es||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Columna",Dashed:"","Delete column":"Eliminar columna","Delete row":"Eliminar fila",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Columna de encabezado","Header row":"Fila de encabezado",Height:"","Horizontal text alignment toolbar":"","Insert column left":"Insertar columna izquierda","Insert column right":"Insertar columna derecha","Insert row above":"Insertar fila encima","Insert row below":"Insertar fila debajo","Insert table":"Insertar tabla",Inset:"","Justify cell text":"","Merge cell down":"Combinar celda inferior","Merge cell left":"Combinar celda izquierda","Merge cell right":"Combinar celda derecha","Merge cell up":"Combinar celda superior","Merge cells":"Combinar celdas",None:"",Outset:"",Padding:"",Ridge:"",Row:"Fila","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Dividir celdas horizontalmente","Split cell vertically":"Dividir celdas verticalmente",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"Barra de herramientas de tabla",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.es=e.es||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 de %1",Aquamarine:"Aguamarina",Black:"Negro",Blue:"Azul",Cancel:"Cancelar","Dim grey":"Gris Oscuro","Dropdown toolbar":"Barra de herramientas desplegable","Edit block":"Cuadro de edición","Editor toolbar":"Barra de herramientas de edición",Green:"Verde",Grey:"Gris","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Azul Claro","Light green":"Verde Claro","Light grey":"Gris Claro",Next:"Siguiente",Orange:"Anaranjado",Previous:"Anterior",Purple:"Morado",Red:"Rojo",Redo:"Rehacer","Remove color":"Quitar color","Restore default":"Restaurar valores predeterminados","Rich Text Editor":"Editor de Texto Enriquecido","Rich Text Editor, %0":"Editor de Texto Enriquecido, %0",Save:"Guardar","Select all":"Seleccionar todo","Show more items":"Mostrar más elementos",Turquoise:"Turquesa",Undo:"Deshacer","Upload in progress":"Subida en progreso",White:"Blanco","Widget toolbar":"Barra de herramientas del widget",Yellow:"Amarillo"}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/et.js b/core/assets/vendor/ckeditor5/build/translations/et.js
new file mode 100644
index 0000000000..16f728d0e9
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/et.js
@@ -0,0 +1 @@
+!function(n){const i=n.et=n.et||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Keskjoondus","Align left":"Vasakjoondus","Align right":"Paremjoondus",Justify:"Rööpjoondus","Text alignment":"Teksti joondamine","Text alignment toolbar":"Teksti joonduse tööriistariba"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.et=i.et||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Rasvane",Code:"Kood",Italic:"Kaldkiri",Strikethrough:"Läbijoonitud",Subscript:"Alaindeks",Superscript:"Ülaindeks",Underline:"Allajoonitud"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const i=t.et=t.et||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Tsitaat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const e=i.et=i.et||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Vali pealkiri",Heading:"Pealkiri","Heading 1":"Pealkiri 1","Heading 2":"Pealkiri 2","Heading 3":"Pealkiri 3","Heading 4":"Pealkiri 4","Heading 5":"Pealkiri 5","Heading 6":"Pealkiri 6",Paragraph:"Lõik","Type or paste your content here.":"Siia tipi või kopeeri tekst.","Type your title":"Sisesta pealkiri"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.et=n.et||{};o.dictionary=Object.assign(o.dictionary||{},{"Horizontal line":"Horisontaalne joon"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.et=e.et||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Keskele joondatud pilt","Change image text alternative":"Muuda pildi asenduskirjeldust","Enter image caption":"Sisesta pildi pealkiri","Full size image":"Täissuuruses pilt","Image resize list":"","Image toolbar":"Piltide tööriistariba","image widget":"pildi vidin","In line":"",Insert:"","Insert image":"Siseta pilt","Insert image via URL":"","Left aligned image":"Vasakule joondatud pilt",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Paremale joondatud pilt","Side image":"Pilt küljel","Text alternative":"Asenduskirjeldus",Update:"","Update image URL":"","Upload failed":"Üleslaadimine ebaõnnestus","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.et=n.et||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Vähenda taanet","Increase indent":"Suurenda taanet"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.et=i.et||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"Allalaaditav","Edit link":"Muuda linki",Link:"Link","Link image":"","Link URL":"Lingi URL","Open in a new tab":"Ava uuel kaardil","Open link in new tab":"Ava link uuel vahekaardil","This link has no URL":"Sellel lingil puudub URL",Unlink:"Eemalda link"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.et=e.et||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Punktidega loetelu","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Nummerdatud loetelu","Numbered list styles toolbar":"",Square:"","To-do List":"Tööde nimekiri","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.et=e.et||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Lahtri tekst all","Align cell text to the center":"Lahtri tekst keskel","Align cell text to the left":"Lahtri tekst vasakul","Align cell text to the middle":"Lahtri tekst kõrguse järgi keskel","Align cell text to the right":"Lahtri tekst paremal","Align cell text to the top":"Lahtri tekst üleval","Align table to the left":"Tabel joondatud vasakule","Align table to the right":"Tabel joondatud paremale",Alignment:"Joondus",Background:"Taust",Border:"Ääris","Cell properties":"Lahtri omadused","Center table":"Tabel joondatud keskele",Color:"Värvus","Color picker":"Värvi valija",Column:"Veerg",Dashed:"Kriipsjoon","Delete column":"Kustuta veerg","Delete row":"Kustuta rida",Dimensions:"Mõõtmed",Dotted:"Punktiir",Double:"Topelt","Enter table caption":"",Groove:"Kraav","Header column":"Päise veerg","Header row":"Päise rida",Height:"Kõrgus","Horizontal text alignment toolbar":"Teksti rõhtpaigutuse tööriistariba","Insert column left":"Sisesta veerg vasakule","Insert column right":"Sisesta veerg paremale","Insert row above":"Sisesta rida ülespoole","Insert row below":"Sisesta rida allapoole","Insert table":"Sisesta tabel",Inset:"Süvik","Justify cell text":"Lahtri tekst rööpjoondatud","Merge cell down":"Liida alumise lahtriga","Merge cell left":"Liida vasakul oleva lahtriga","Merge cell right":"Liida paremal oleva lahtriga","Merge cell up":"Liida ülemise lahtriga","Merge cells":"Liida lahtrid",None:"Puudub",Outset:"Küngas",Padding:"Vahe sisuni",Ridge:"Vall",Row:"Rida","Select column":"Vali veerg","Select row":"Vali rida",Solid:"Pidev","Split cell horizontally":"Jaga lahter horisontaalselt","Split cell vertically":"Jaga lahter vertikaalselt",Style:"Stiil","Table alignment toolbar":"Tabeli paigutuse tööriistariba","Table cell text alignment":"Teksti paigutus lahtris","Table properties":"Tabeli omadused","Table toolbar":"Tabelite tööriistariba",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Värvus ei sobi. Proovi "#FF0000" või "rgb(255,0,0)" või "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Väärtus ei sobi. Proovi "10px", "2em" või lihtsalt "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Teksti püstpaigutuse tööriistariba",Width:"Laius"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.et=e.et||{};i.dictionary=Object.assign(i.dictionary||{},{"%0 of %1":"%0 / %1",Aquamarine:"Akvamariin",Black:"Must",Blue:"Sinine",Cancel:"Loobu","Dim grey":"Tumehall","Dropdown toolbar":"Avatav tööriistariba","Edit block":"Muuda plokki","Editor toolbar":"Redaktori tööriistariba",Green:"Roheline",Grey:"Hall","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Helesinine","Light green":"Heleroheline","Light grey":"Helehall",Next:"Järgmine",Orange:"Oranž",Previous:"Eelmine",Purple:"Lilla",Red:"Punane",Redo:"Tee uuesti","Remove color":"Eemalda värv","Restore default":"","Rich Text Editor":"Tekstiredaktor","Rich Text Editor, %0":"Tekstiredaktor, %0",Save:"Salvesta","Select all":"Vali kõik","Show more items":"Näita veel",Turquoise:"Türkiis",Undo:"Võta tagasi","Upload in progress":"Üleslaadimine pooleli",White:"Valge","Widget toolbar":"Vidinate tööriistariba",Yellow:"Kollane"}),i.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/eu.js b/core/assets/vendor/ckeditor5/build/translations/eu.js
new file mode 100644
index 0000000000..f2e07d72f5
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/eu.js
@@ -0,0 +1 @@
+!function(i){const n=i.eu=i.eu||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Lodia",Code:"Kodea",Italic:"Etzana",Strikethrough:"",Subscript:"",Superscript:"",Underline:"Azpimarra"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.eu=i.eu||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Aipua"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.eu=a.eu||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Aukeratu izenburua",Heading:"Izenburua","Heading 1":"Izenburua 1","Heading 2":"Izenburua 2","Heading 3":"Izenburua 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Paragrafoa","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.eu=e.eu||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Zentratutako irudia","Change image text alternative":"Aldatu irudiaren ordezko testua","Enter image caption":"Sartu irudiaren epigrafea","Full size image":"Tamaina osoko irudia","Image resize list":"","Image toolbar":"","image widget":"irudi widgeta","In line":"",Insert:"","Insert image":"Txertatu irudia","Insert image via URL":"","Left aligned image":"Ezkerrean lerrokatutako irudia",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Eskuinean lerrokatutako irudia","Side image":"Alboko irudia","Text alternative":"Ordezko testua",Update:"","Update image URL":"","Upload failed":"Kargatzeak huts egin du","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.eu=n.eu||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"",Link:"Esteka","Link image":"","Link URL":"Estekaren URLa","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"Desestekatu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.eu=e.eu||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Buletdun zerrenda","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Zenbakidun zerrenda","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.eu=e.eu||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Utzi","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Berregin","Remove color":"","Restore default":"","Rich Text Editor":"Testu aberastuaren editorea","Rich Text Editor, %0":"Testu aberastuaren editorea, %0",Save:"Gorde","Show more items":"",Turquoise:"",Undo:"Desegin",White:"",Yellow:""}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/fa.js b/core/assets/vendor/ckeditor5/build/translations/fa.js
new file mode 100644
index 0000000000..925f7322ef
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/fa.js
@@ -0,0 +1 @@
+!function(n){const i=n.fa=n.fa||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"تراز وسط","Align left":"تراز چپ","Align right":"تراز راست",Justify:"هم تراز کردن","Text alignment":"تراز متن","Text alignment toolbar":"نوار ابزار ترازبندی متن"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fa=i.fa||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"درشت",Code:"کد",Italic:"کج",Strikethrough:"خط خورده",Subscript:"پایین نویس",Superscript:"بالانویس",Underline:"خط زیر"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fa=i.fa||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":" بلوک نقل قول"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.fa=n.fa||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"انتخاب عنوان",Heading:"عنوان","Heading 1":"عنوان 1","Heading 2":"عنوان 2","Heading 3":"عنوان 3","Heading 4":"عنوان 4","Heading 5":"عنوان 5","Heading 6":"عنوان 6",Paragraph:"پاراگراف","Type or paste your content here.":"محتوای خود را در اینجا تایپ یا پیست کنید.","Type your title":"عنوان خود را تایپ کنید"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fa=i.fa||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"خط افقی"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.fa=e.fa||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"تصویر در وسط","Change image text alternative":"تغییر متن جایگزین تصویر","Enter image caption":"عنوان تصویر را وارد کنید","Full size image":"تصویر در اندازه کامل","Image resize list":"","Image toolbar":"نوارابزار تصویر","image widget":"ابزاره تصویر","In line":"",Insert:"","Insert image":"قرار دادن تصویر","Insert image via URL":"","Left aligned image":"تصویر تراز شده چپ",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"تصویر تراز شده راست","Side image":"تصویر جانبی","Text alternative":"متن جایگزین",Update:"","Update image URL":"","Upload failed":"آپلود ناموفق بود","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.fa=n.fa||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"کاهش تورفتگی","Increase indent":"افزایش تورفتگی"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.fa=n.fa||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"قابل بارگیری","Edit link":"ویرایش پیوند",Link:"پیوند","Link image":"اتصال پیوند به تصویر","Link URL":"نشانی اینترنتی پیوند","Open in a new tab":"بازکردن در برگه جدید","Open link in new tab":"باز کردن پیوند در برگه جدید","This link has no URL":"این پیوند نشانی اینترنتی ندارد",Unlink:"لغو پیوند"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.fa=e.fa||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"لیست نشانه‌دار","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"لیست عددی","Numbered list styles toolbar":"",Square:"","To-do List":"لیست انجام کار","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.fa=e.fa||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"متن سلول را در سمت راست تراز کنید","Align cell text to the top":"","Align table to the left":"","Align table to the right":"جدول را در سمت راست تراز کنید",Alignment:"ترازبندی",Background:"زمینه",Border:"حاشیه","Cell properties":"خصوصیات سلول","Center table":"جدول وسط",Color:"رنگ","Color picker":"",Column:"ستون",Dashed:"نقطه چین","Delete column":"حذف ستون","Delete row":"حذف سطر",Dimensions:"ابعاد",Dotted:"خط چین",Double:"دوبل","Enter table caption":"",Groove:"خط دار کردن","Header column":"ستون سربرگ","Header row":"سطر سربرگ",Height:"ارتفاع","Horizontal text alignment toolbar":"","Insert column left":"درج ستون در سمت چپ","Insert column right":"درج ستون در سمت راست","Insert row above":"درج سطر در بالا","Insert row below":"درج سطر در پایین","Insert table":"درج جدول",Inset:"","Justify cell text":"","Merge cell down":"ادغام سلول پایین","Merge cell left":"ادغام سلول چپ","Merge cell right":"ادغام سلول راست","Merge cell up":"ادغام سلول بالا","Merge cells":"ادغام سلول ها",None:"هیچ کدام",Outset:"",Padding:"حاشیه داخلی",Ridge:"",Row:"سطر","Select column":"","Select row":"",Solid:"توپر","Split cell horizontally":"تقسیم افقی سلول","Split cell vertically":"تقسیم عمودی سلول",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"خصوصیات جدول","Table toolbar":"نوارابزار جدول",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:"عرض"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.fa=e.fa||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"0% از 1%",Aquamarine:"زمرد کبود",Black:"سیاه",Blue:"آبی",Cancel:"لغو","Dim grey":"خاکستری تیره","Dropdown toolbar":"نوارابزار کشویی","Edit block":"ویرایش قطعه","Editor toolbar":"نوارابزار ویرایشگر",Green:"سبز",Grey:"خاکستری","Insert paragraph after block":"درج پاراگراف بعد از بلوک","Insert paragraph before block":"درج پاراگراف قبل از بلوک","Light blue":"آبی روشن","Light green":"سبز روشن","Light grey":"خاکستری روشن",Next:"بعدی",Orange:"نارنجی",Previous:"قبلی",Purple:"بنفش",Red:"قرمز",Redo:"باز انجام","Remove color":"حذف رنگ","Restore default":"","Rich Text Editor":"ویرایشگر متن غنی","Rich Text Editor, %0":"ویرایشگر متن غنی، %0",Save:"ذخیره","Select all":"انتخاب همه","Show more items":"نمایش گزینه‌های بیشتر",Turquoise:"فیروزه ای",Undo:"بازگردانی","Upload in progress":"آپلود در حال انجام",White:"سفید","Widget toolbar":"نوار ابزار ویجت",Yellow:"زرد"}),o.getPluralForm=function(e){return e>1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/fi.js b/core/assets/vendor/ckeditor5/build/translations/fi.js
new file mode 100644
index 0000000000..8724c661c6
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/fi.js
@@ -0,0 +1 @@
+!function(a){const i=a.fi=a.fi||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Tasaa keskelle","Align left":"Tasaa vasemmalle","Align right":"Tasaa oikealle",Justify:"Tasaa molemmat reunat","Text alignment":"Tekstin tasaus","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fi=i.fi||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Lihavointi",Code:"Koodi",Italic:"Kursivointi",Strikethrough:"Yliviivaus",Subscript:"Alaindeksi",Superscript:"Yläindeksi",Underline:"Alleviivaus"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fi=i.fi||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Lainaus"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.fi=i.fi||{};o.dictionary=Object.assign(o.dictionary||{},{"Choose heading":"Valitse otsikko",Heading:"Otsikkotyyli","Heading 1":"Otsikko 1","Heading 2":"Otsikko 2","Heading 3":"Otsikko 3","Heading 4":"Otsikko 4","Heading 5":"Otsikko 5","Heading 6":"Otsikko 6",Paragraph:"Kappale","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.fi=e.fi||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Keskitetty kuva","Change image text alternative":"Vaihda kuvan vaihtoehtoinen teksti","Enter image caption":"Syötä kuvateksti","Full size image":"Täysikokoinen kuva","Image resize list":"","Image toolbar":"","image widget":"Kuvavimpain","In line":"",Insert:"","Insert image":"Lisää kuva","Insert image via URL":"","Left aligned image":"Vasemmalle tasattu kuva",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Oikealle tasattu kuva","Side image":"Pieni kuva","Text alternative":"Vaihtoehtoinen teksti",Update:"","Update image URL":"","Upload failed":"Lataus epäonnistui","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.fi=n.fi||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Vähennä sisennystä","Increase indent":"Lisää sisennystä"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fi=i.fi||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"","Edit link":"Muokkaa linkkiä",Link:"Linkki","Link image":"","Link URL":"Linkin osoite","Open in a new tab":"","Open link in new tab":"Avaa linkki uudessa välilehdessä","This link has no URL":"Linkillä ei ole URL-osoitetta",Unlink:"Poista linkki"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.fi=e.fi||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Lista","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numeroitu lista","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.fi=e.fi||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Sarake",Dashed:"","Delete column":"Poista sarake","Delete row":"Poista rivi",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Otsikkosarake","Header row":"Otsikkorivi",Height:"","Horizontal text alignment toolbar":"","Insert column left":"Lisää sarake vasemmalle","Insert column right":"Lisää sarake oikealle","Insert row above":"Lisää rivi ylle","Insert row below":"Lisää rivi alle","Insert table":"Lisää taulukko",Inset:"","Justify cell text":"","Merge cell down":"Yhdistä solu alas","Merge cell left":"Yhdistä solu vasemmalle","Merge cell right":"Yhdistä solu oikealle","Merge cell up":"Yhdistä solu ylös","Merge cells":"Yhdistä tai jaa soluja",None:"",Outset:"",Padding:"",Ridge:"",Row:"Rivi","Select column":"Valitse sarake","Select row":"Valitse rivi",Solid:"","Split cell horizontally":"Jaa solu vaakasuunnassa","Split cell vertically":"Jaa solu pystysuunnassa",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.fi=e.fi||{};i.dictionary=Object.assign(i.dictionary||{},{"%0 of %1":"",Aquamarine:"Akvamariini",Black:"Musta",Blue:"Sininen",Cancel:"Peruuta","Dim grey":"","Dropdown toolbar":"","Edit block":"Muokkaa lohkoa","Editor toolbar":"",Green:"Vihreä",Grey:"Harmaa","Light blue":"Vaaleansininen","Light green":"Vaaleanvihreä","Light grey":"Vaaleanharmaa",Next:"",Orange:"Oranssi",Previous:"",Purple:"Purppura",Red:"Punainen",Redo:"Tee uudelleen","Remove color":"Poista väri","Restore default":"","Rich Text Editor":"Rikas tekstieditori","Rich Text Editor, %0":"Rikas tekstieditori, %0",Save:"Tallenna","Show more items":"",Turquoise:"Turkoosi",Undo:"Peru","Upload in progress":"Lähetys käynnissä",White:"Valkoinen",Yellow:"Keltainen"}),i.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/fr.js b/core/assets/vendor/ckeditor5/build/translations/fr.js
new file mode 100644
index 0000000000..a056ddb37f
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/fr.js
@@ -0,0 +1 @@
+!function(e){const t=e.fr=e.fr||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Centrer","Align left":"Aligner à gauche","Align right":"Aligner à droite",Justify:"Justifier","Text alignment":"Alignement du texte","Text alignment toolbar":"Barre d'outils d'alignement du texte"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fr=i.fr||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Gras",Code:"Code",Italic:"Italique",Strikethrough:"Barré",Subscript:"Indice",Superscript:"Exposant",Underline:"Souligné"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fr=i.fr||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citation"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.fr=e.fr||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Choisir l'en-tête",Heading:"En-tête","Heading 1":"Titre 1","Heading 2":"Titre 2","Heading 3":"Titre 3","Heading 4":"Titre 4","Heading 5":"Titre 5","Heading 6":"Titre 6",Paragraph:"Paragraphe","Type or paste your content here.":"Noter ou coller votre contenu ici","Type your title":"Rentrer votre titre"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.fr=i.fr||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Ligne horizontale"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.fr=e.fr||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Image centrée","Change image text alternative":"Changer le texte alternatif à l’image","Enter image caption":"Saisir la légende de l’image","Full size image":"Image taille réelle","Image resize list":"Liste des tailles d'images","Image toolbar":"Barre d'outils des images","image widget":"Objet image","In line":"",Insert:"Insérer","Insert image":"Insérer une image","Insert image via URL":"Insérer une image à partir d'une URL","Left aligned image":"Image alignée à gauche",Original:"Taille originale","Resize image":"Redimensionner l'image","Resize image to %0":"Redimensionner à %0","Resize image to the original size":"Appliquer les dimensions d'origine","Right aligned image":"Image alignée à droite","Side image":"Image latérale","Text alternative":"Texte alternatif",Update:"Modifier","Update image URL":"Modifier l'URL de l'image","Upload failed":"Échec de l'envoi","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e.fr=e.fr||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Diminuer le retrait","Increase indent":"Augmenter le retrait"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const n=a.fr=a.fr||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Choisir la langue",Language:"Langue","Remove language":"Supprimer la langue"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.fr=n.fr||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Fichier téléchargeable","Edit link":"Modifier le lien",Link:"Lien","Link image":"Lien d'image","Link URL":"URL du lien","Open in a new tab":"Ouvrir dans un nouvel onglet","Open link in new tab":"Ouvrir le lien dans un nouvel onglet","This link has no URL":"Ce lien n'a pas d'URL",Unlink:"Supprimer le lien"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const s=e.fr=e.fr||{};s.dictionary=Object.assign(s.dictionary||{},{"Bulleted List":"Liste à puces","Bulleted list styles toolbar":"Barre d'outils des styles de liste à puce",Circle:"Cercle",Decimal:"Chiffres","Decimal with leading zero":"Chiffres avec des zéros supplémentaire",Disc:"Disque","Lower-latin":"Lettres minuscules","Lower–roman":"Chiffres romains en minuscules","Numbered List":"Liste numérotée","Numbered list styles toolbar":"Barre d'outils des styles de liste numérotée",Square:"Carré","To-do List":"Liste de tâches","Toggle the circle list style":'Activer / désactiver le style de liste "cercle"',"Toggle the decimal list style":'Activer / désactiver le style de liste "chiffres"',"Toggle the decimal with leading zero list style":'Activer / désactiver le style de liste "chiffres de mêmes longueurs"',"Toggle the disc list style":'Activer / désactiver le style de liste "disque"',"Toggle the lower–latin list style":'Activer / désactiver le style de liste "lettres minuscules"',"Toggle the lower–roman list style":'Activer / désactiver le style de liste "chiffres romains en minuscules"',"Toggle the square list style":'Activer / désactiver le style de liste "carré"',"Toggle the upper–latin list style":'Activer / désactiver le style de liste "lettres majuscules"',"Toggle the upper–roman list style":'Activer / désactiver le style de liste "chiffres romains en majuscules"',"Upper-latin":"Lettres majuscules","Upper-roman":"Chiffres romains en majuscules"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.fr=e.fr||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Aligner le texte en bas","Align cell text to the center":"Aligner la cellule au centre","Align cell text to the left":"Aligner la cellule à gauche","Align cell text to the middle":"Aligner le texte au milieu","Align cell text to the right":"Aligner la cellule à droite","Align cell text to the top":"Aligner le texte en haut","Align table to the left":"Aligner le tableau à gauche","Align table to the right":"Aligner le tableau à droite",Alignment:"Alignement",Background:"Fond",Border:"Bordure","Cell properties":"Propriétés de la cellule","Center table":"Centrer le tableau ",Color:"Couleur","Color picker":"Pipette à couleurs",Column:"Colonne",Dashed:"Tirets","Delete column":"Supprimer la colonne","Delete row":"Supprimer la ligne",Dimensions:"Dimensions",Dotted:"Pointillés",Double:"Double","Enter table caption":"",Groove:"Rainuré","Header column":"Colonne d'entête","Header row":"Ligne d'entête",Height:"Hauteur","Horizontal text alignment toolbar":"Barre d'outils pour modifier l'alignement horizontal du texte","Insert column left":"Insérer une colonne à gauche","Insert column right":"Insérer une colonne à droite","Insert row above":"Insérer une ligne au-dessus","Insert row below":"Insérer une ligne en-dessous","Insert table":"Insérer un tableau",Inset:"Relief intérieur","Justify cell text":"Justifier le contenu de la cellule","Merge cell down":"Fusionner la cellule en-dessous","Merge cell left":"Fusionner la cellule à gauche","Merge cell right":"Fusionner la cellule à droite","Merge cell up":"Fusionner la cellule au-dessus","Merge cells":"Fusionner les cellules",None:"Aucun",Outset:"Relief extérieur",Padding:"Remplissage pour aérer le texte",Ridge:"Relief",Row:"Ligne","Select column":"Sélectionner la colonne","Select row":"Sélectionner la ligne",Solid:"Continu","Split cell horizontally":"Scinder la cellule horizontalement","Split cell vertically":"Scinder la cellule verticalement",Style:"Style","Table alignment toolbar":"Barre d'outils pour modifier l'alignement du tableau","Table cell text alignment":"Alignement du texte de la cellule","Table properties":"Propriétés du tableau","Table toolbar":"Barre d'outils des tableaux",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'La couleur est invalide. Essayez "#FF0000" ou "rgb(255,0,0)" ou "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'La valeur est invalide. Essayez "10px" ou "2em" ou simplement "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Barre d'outils pour modifier l'alignement vertical du texte",Width:"Largeur"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.fr=e.fr||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 sur %1",Aquamarine:"Bleu vert",Black:"Noir",Blue:"Bleu",Cancel:"Annuler","Dim grey":"Gris pâle","Dropdown toolbar":"Barre d'outils dans un menu déroulant","Edit block":"Modifier le bloc","Editor toolbar":"Barre d'outils de l'éditeur",Green:"Vert",Grey:"Gris","Insert paragraph after block":"Insérer du texte après ce bloc","Insert paragraph before block":"Insérer du texte avant ce bloc","Light blue":"Bleu clair","Light green":"Vert clair","Light grey":"Gris clair",Next:"Suivant",Orange:"Orange",Previous:"Précedent",Purple:"Violet",Red:"Rouge",Redo:"Restaurer","Remove color":"Enlever la couleur","Restore default":"","Rich Text Editor":"Éditeur de texte enrichi","Rich Text Editor, %0":"Éditeur de texte enrichi, %0",Save:"Enregistrer","Select all":"Sélectionner tout","Show more items":"Montrer plus d'éléments",Turquoise:"Turquoise",Undo:"Annuler","Upload in progress":"Téléchargement en cours",White:"Blanc","Widget toolbar":"Barre d'outils du widget",Yellow:"Jaune"}),r.getPluralForm=function(e){return e>1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/gl.js b/core/assets/vendor/ckeditor5/build/translations/gl.js
new file mode 100644
index 0000000000..d2f1367ab7
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/gl.js
@@ -0,0 +1 @@
+!function(t){const e=t.gl=t.gl||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Centrar horizontalmente","Align left":"Aliñar á esquerda","Align right":"Aliñar á dereita",Justify:"Xustificado","Text alignment":"Aliñamento do texto","Text alignment toolbar":"Barra de ferramentas de aliñamento de textos"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const c=i.gl=i.gl||{};c.dictionary=Object.assign(c.dictionary||{},{Bold:"Negra",Code:"Código",Italic:"Itálica",Strikethrough:"Riscado",Subscript:"Subíndice",Superscript:"Superíndice",Underline:"Subliñado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.gl=i.gl||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Cita de bloque"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const t=o.gl=o.gl||{};t.dictionary=Object.assign(t.dictionary||{},{"Choose heading":"Escolla o título",Heading:"Título","Heading 1":"Título 1","Heading 2":"Título 2","Heading 3":"Título 3","Heading 4":"Título 4","Heading 5":"Título 5","Heading 6":"Título 6",Paragraph:"Parágrafo","Type or paste your content here.":"Escriba ou pegue o seu contido aquí.","Type your title":"Escriba o seu título"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.gl=i.gl||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Liña horizontal"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.gl=a.gl||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"Romper o texto","Centered image":"Imaxe centrada horizontalmente","Change image text alternative":"Cambiar o texto alternativo da imaxe","Enter image caption":"Introduza o título da imaxe","Full size image":"Imaxe a tamaño completo","Image resize list":"Lista de tamaños de imaxe","Image toolbar":"Barra de ferramentas de imaxe","image widget":"Trebello de imaxe","In line":"En liña",Insert:"Inserir","Insert image":"Inserir imaxe","Insert image via URL":"Inserir imaxe a través de URL","Left aligned image":"Imaxe aliñada á esquerda",Original:"Orixinal","Resize image":"Redimensionar a imaxe","Resize image to %0":"Redimensionar a imaxe ao %0","Resize image to the original size":"Aplicar o tamaño orixinal da imaxe","Right aligned image":"Imaxe aliñada á dereita","Side image":"Lado da imaxe","Text alternative":"Texto alternativo",Update:"Actualizar","Update image URL":"Actualizar o URL da imaxe","Upload failed":"Fallou o envío","Wrap text":"Envolver o texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.gl=n.gl||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Reducir sangrado","Increase indent":"Aumentar sangrado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const a=o.gl=o.gl||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Escolla o idioma",Language:"Idioma","Remove language":"Retirar o idioma"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.gl=n.gl||{};a.dictionary=Object.assign(a.dictionary||{},{Downloadable:"Descargábel","Edit link":"Editar a ligazón",Link:"Ligar","Link image":"Ligazón da imaxe","Link URL":"URL de ligazón","Open in a new tab":"Abrir nunha nova lapela","Open link in new tab":"Abrir a ligazón nunha nova lapela","This link has no URL":"Esta ligazón non ten URL",Unlink:"Desligar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.gl=e.gl||{};a.dictionary=Object.assign(a.dictionary||{},{"Bulleted List":"Lista con viñetas","Bulleted list styles toolbar":"Barra de ferramentas de estilos de lista con viñetas",Circle:"Círculos",Decimal:"Decimais","Decimal with leading zero":"Decimais con cero á esquerda",Disc:"Discos","Lower-latin":"Letras minúsculas","Lower–roman":"Núm, romanos en minúscula","Numbered List":"Lista numerada","Numbered list styles toolbar":"Barra de ferramentas de estilos de lista numerada",Square:"Cadrados","To-do List":"Lista de cousas por facer","Toggle the circle list style":"Alternar o estilo da lista «círculos»","Toggle the decimal list style":"Alternar o estilo da lista «decimais»","Toggle the decimal with leading zero list style":"Activar/desactivar o estilo «decimais con cero á esquerda»","Toggle the disc list style":"Alternar o estilo da lista «discos»","Toggle the lower–latin list style":"Activar/desactivar o estilo da lista «letras minúsculas»","Toggle the lower–roman list style":"Activar/desactivar o estilo da lista «núm. romanos en minúscula»","Toggle the square list style":"Alternar o estilo da lista «cadrados»","Toggle the upper–latin list style":"Activar/desactivar o estilo da lista «letras maiúsculas»","Toggle the upper–roman list style":"Activar/desactivar o estilo da lista «núm. romanos en maiúscula»","Upper-latin":"Letras maiúsculas","Upper-roman":"Núm, romanos en maiúscula"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.gl=i.gl||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"Orixe"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.gl=e.gl||{};a.dictionary=Object.assign(a.dictionary||{},{"Align cell text to the bottom":"Aliñar o texto da cela á base","Align cell text to the center":"Aliñar o texto da cela ao centro","Align cell text to the left":"Aliñar o texto da cela á esquerda","Align cell text to the middle":"Aliñar o texto da cela ao medio","Align cell text to the right":"Aliña o texto da cela á dereita","Align cell text to the top":"Aliñar o texto da cela á parte superior","Align table to the left":"Aliñar a táboa á esquerda","Align table to the right":"Aliñar a táboa á dereita",Alignment:"Aliñamento",Background:"Fondo",Border:"Bordo","Cell properties":"Propiedades da cela","Center table":"Centrar a táboa",Color:"Cor","Color picker":"Selector de cores",Column:"Columna",Dashed:"Raiado","Delete column":"Eliminar columna","Delete row":"Eliminar fila",Dimensions:"Dimensións",Dotted:"Punteado",Double:"Dobre","Enter table caption":"Introduza o título da táboa",Groove:"Rañura","Header column":"Cabeceira de columna","Header row":"Cabeceira de fila",Height:"Alto","Horizontal text alignment toolbar":"Barra de ferramentas de aliñamento de texto horizontal","Insert column left":"Inserir columna á esquerda","Insert column right":"Inserir columna á dereita","Insert row above":"Inserir fila enriba","Insert row below":"Inserir fila embaixo","Insert table":"Inserir táboa",Inset:"Inserción","Justify cell text":"Xustificar o texto da cela","Merge cell down":"Combinar cela cara  abaixo","Merge cell left":"Combinar cela cara a esquerda","Merge cell right":"Combinar cela cara a dereita","Merge cell up":"Combinar cela cara arriba","Merge cells":"Combinar celas",None:"Ningún",Outset:"Inicio",Padding:"Recheo",Ridge:"Crista",Row:"Fila","Select column":"Seleccionar columna","Select row":"Seleccionar fila",Solid:"Sólido","Split cell horizontally":"Dividir cela en horizontal","Split cell vertically":"Dividir cela en vertical",Style:"Estilo","Table alignment toolbar":"Barra de ferramentas de aliñamento da táboa","Table cell text alignment":"Aliñamento do texto das celas da táboa","Table properties":"Propiedades da táboa","Table toolbar":"Barra de ferramentas de táboas",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"A cor non é válida. Probe «#FF0000» ou «rgb(255,0,0)» ou «vermello».",'The value is invalid. Try "10px" or "2em" or simply "2".':"O valor non é válido. Probe «10px» ou «2em» ou simplemente «2».","Toggle caption off":"Desactivar os subtítulos","Toggle caption on":"Activar os subtítulos","Vertical text alignment toolbar":"Barra de ferramentas de aliñamento de texto vertical",Width:"Largo"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.gl=i.gl||{};n.dictionary=Object.assign(n.dictionary||{},{"HTML object":"Obxecto HTML"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.gl=e.gl||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 de %1",Aquamarine:"Augamariña",Black:"Negro",Blue:"Azul",Cancel:"Cancelar","Dim grey":"Gris fume","Dropdown toolbar":"Barra de ferramentas despregábel","Edit block":"Editar bloque","Editor toolbar":"Barra de ferramentas do editor",Green:"Verde",Grey:"Gris","Insert paragraph after block":"Inserir parágrafo após o bloque","Insert paragraph before block":"Inserir parágrafo antes do bloque","Light blue":"Azul claro","Light green":"Verde claro","Light grey":"Gris claro",Next:"Seguinte",Orange:"Laranxa",Previous:"Anterior",Purple:"Púrpura",Red:"Vermello",Redo:"Refacer","Remove color":"Retirar a cor","Restore default":"Restaurar valores predeterminados","Rich Text Editor":"Editor de texto mellorado","Rich Text Editor, %0":"Editor de texto mellorado, %0",Save:"Gardar","Select all":"Seleccionar todo","Show more items":"Amosar máis elementos",Turquoise:"Turquesa",Undo:"Desfacer","Upload in progress":"Envío en proceso",White:"Branco","Widget toolbar":"Barra de ferramentas de trebellos",Yellow:"Amarelo"}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/gu.js b/core/assets/vendor/ckeditor5/build/translations/gu.js
new file mode 100644
index 0000000000..2d023aa824
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/gu.js
@@ -0,0 +1 @@
+!function(i){const n=i.gu=i.gu||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"ઘાટુ - બોલ્ડ્",Code:"",Italic:"ત્રાંસુ - ઇટલિક્",Strikethrough:"",Subscript:"",Superscript:"",Underline:"નીચે લિટી - અન્ડરલાઇન્"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.gu=i.gu||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":" વિચાર ટાંકો"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/he.js b/core/assets/vendor/ckeditor5/build/translations/he.js
new file mode 100644
index 0000000000..7fc0e372e7
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/he.js
@@ -0,0 +1 @@
+!function(n){const i=n.he=n.he||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"יישור באמצע","Align left":"יישור לשמאל","Align right":"יישור לימין",Justify:"מרכוז גבולות","Text alignment":"יישור טקסט","Text alignment toolbar":"סרגל כלים יישור טקסט"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.he=i.he||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"מודגש",Code:"קוד",Italic:"נטוי",Strikethrough:"קו חוצה",Subscript:"כתב תחתי",Superscript:"כתב עילי",Underline:"קו תחתון"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.he=i.he||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"בלוק ציטוט"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e.he=e.he||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"בחר סוג כותרת",Heading:"כותרת","Heading 1":"כותרת 1","Heading 2":"כותרת 2","Heading 3":"כותרת 3","Heading 4":"כותרת 4","Heading 5":"כותרת 5","Heading 6":"כותרת 6",Paragraph:"פיסקה","Type or paste your content here.":"הזן או הדבק את התוכן כאן","Type your title":"הזן כותרת"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.he=i.he||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"קו אופקי"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.he=e.he||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"תמונה ממרוכזת","Change image text alternative":"שינוי טקסט אלטרנטיבי לתמונה","Enter image caption":"הזן כותרת תמונה","Full size image":"תמונה בפריסה מלאה","Image resize list":"","Image toolbar":"סרגל תמונה","image widget":"תמונה","In line":"",Insert:"","Insert image":"הוספת תמונה","Insert image via URL":"","Left aligned image":"תמונה מיושרת לשמאל",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"תמונה מיושרת לימין","Side image":"תמונת צד","Text alternative":"טקסט אלטרנטיבי",Update:"","Update image URL":"","Upload failed":"העלאה נכשלה","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.he=n.he||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"עריכת קישור",Link:"קישור","Link image":"","Link URL":"קישור כתובת אתר","Open in a new tab":"","Open link in new tab":"פתח קישור בכרטיסייה חדשה","This link has no URL":"לקישור זה אין כתובת אתר",Unlink:"ביטול קישור"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.he=e.he||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"רשימה מנוקדת","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"רשימה ממוספרת","Numbered list styles toolbar":"",Square:"","To-do List":"רשימת מטלות","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.he=e.he||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"0% מתוך %1",Aquamarine:"",Black:"",Blue:"",Cancel:"ביטול","Dim grey":"","Dropdown toolbar":"סרגל כלים נפתח","Edit block":"הגדרות בלוק","Editor toolbar":"סרגל הכלים",Green:"",Grey:"","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"","Light green":"","Light grey":"",Next:"הבא",Orange:"",Previous:"הקודם",Purple:"",Red:"",Redo:"ביצוע מחדש","Remove color":"","Restore default":"","Rich Text Editor":"עורך טקסט עשיר","Rich Text Editor, %0":"עורך טקסט עשיר, %0",Save:"שמירה","Show more items":"הצד פריטים נוספים",Turquoise:"",Undo:"ביטול","Upload in progress":"העלאה מתבצעת",White:"","Widget toolbar":"סרגל יישומון",Yellow:""}),o.getPluralForm=function(e){return 1==e&&e%1==0?0:2==e&&e%1==0?1:e%10==0&&e%1==0&&e>10?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/hi.js b/core/assets/vendor/ckeditor5/build/translations/hi.js
new file mode 100644
index 0000000000..14a8e1a850
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/hi.js
@@ -0,0 +1 @@
+!function(i){const n=i.hi=i.hi||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Align center","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":"Text alignment toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.hi=i.hi||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Bold",Code:"Code",Italic:"Italic",Strikethrough:"Strikethrough",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.hi=i.hi||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.hi=e.hi||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Choose heading",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6",Paragraph:"Paragraph","Type or paste your content here.":"Type or paste your content here.","Type your title":"Type your title"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.hi=i.hi||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Horizontal line"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.hi=e.hi||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Enter image caption":"Enter image caption","Full size image":"Full size image","Image resize list":"Image resize list","Image toolbar":"Image toolbar","image widget":"image widget","In line":"",Insert:"Insert","Insert image":"Insert image","Insert image via URL":"Insert image via URL","Left aligned image":"Left aligned image",Original:"Original","Resize image":"Resize image","Resize image to %0":"Resize image to %0","Resize image to the original size":"Resize image to the original size","Right aligned image":"Right aligned image","Side image":"Side image","Text alternative":"Text alternative",Update:"Update","Update image URL":"Update image URL","Upload failed":"Upload failed","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.hi=n.hi||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Decrease indent","Increase indent":"Increase indent"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.hi=n.hi||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Downloadable","Edit link":"Edit link",Link:"Link","Link image":"Link image","Link URL":"Link URL","Open in a new tab":"Open in a new tab","Open link in new tab":"Open link in new tab","This link has no URL":"This link has no URL",Unlink:"Unlink"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.hi=e.hi||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Circle:"Circle",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero",Disc:"Disc","Lower-latin":"Lower-latin","Lower–roman":"Lower–roman","Numbered List":"Numbered List","Numbered list styles toolbar":"Numbered list styles toolbar",Square:"Square","To-do List":"To-do List","Toggle the circle list style":"Toggle the circle list style","Toggle the decimal list style":"Toggle the decimal list style","Toggle the decimal with leading zero list style":"Toggle the decimal with leading zero list style","Toggle the disc list style":"Toggle the disc list style","Toggle the lower–latin list style":"Toggle the lower–latin list style","Toggle the lower–roman list style":"Toggle the lower–roman list style","Toggle the square list style":"Toggle the square list style","Toggle the upper–latin list style":"Toggle the upper–latin list style","Toggle the upper–roman list style":"Toggle the upper–roman list style","Upper-latin":"Upper-latin","Upper-roman":"Upper-roman"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.hi=e.hi||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",Background:"Background",Border:"Border","Cell properties":"Cell properties","Center table":"Center table",Color:"Color","Color picker":"Color picker",Column:"Column",Dashed:"Dashed","Delete column":"Delete column","Delete row":"Delete row",Dimensions:"Dimensions",Dotted:"Dotted",Double:"Double","Enter table caption":"",Groove:"Groove","Header column":"Header column","Header row":"Header row",Height:"Height","Horizontal text alignment toolbar":"Horizontal text alignment toolbar","Insert column left":"Insert column left","Insert column right":"Insert column right","Insert row above":"Insert row above","Insert row below":"Insert row below","Insert table":"Insert table",Inset:"Inset","Justify cell text":"Justify cell text","Merge cell down":"Merge cell down","Merge cell left":"Merge cell left","Merge cell right":"Merge cell right","Merge cell up":"Merge cell up","Merge cells":"Merge cells",None:"None",Outset:"Outset",Padding:"Padding",Ridge:"Ridge",Row:"Row","Select column":"Select column","Select row":"Select row",Solid:"Solid","Split cell horizontally":"Split cell horizontally","Split cell vertically":"Split cell vertically",Style:"Style","Table alignment toolbar":"Table alignment toolbar","Table cell text alignment":"Table cell text alignment","Table properties":"Table properties","Table toolbar":"Table toolbar",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'The value is invalid. Try "10px" or "2em" or simply "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Vertical text alignment toolbar",Width:"Width"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.hi=e.hi||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 of %1",Aquamarine:"Aquamarine",Black:"Black",Blue:"Blue",Cancel:"Cancel","Dim grey":"Dim grey","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Editor toolbar":"Editor toolbar",Green:"Green",Grey:"Grey","Insert paragraph after block":"Insert paragraph after block","Insert paragraph before block":"Insert paragraph before block","Light blue":"Light blue","Light green":"Light green","Light grey":"Light grey",Next:"Next",Orange:"Orange",Previous:"Previous",Purple:"Purple",Red:"Red",Redo:"Redo","Remove color":"Remove color","Restore default":"","Rich Text Editor":"Rich Text Editor","Rich Text Editor, %0":"Rich Text Editor, %0",Save:"Save","Select all":"Select all","Show more items":"Show more items",Turquoise:"Turquoise",Undo:"Undo","Upload in progress":"Upload in progress",White:"White","Widget toolbar":"Widget toolbar",Yellow:"Yellow"}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/hr.js b/core/assets/vendor/ckeditor5/build/translations/hr.js
new file mode 100644
index 0000000000..39edd1a5fe
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/hr.js
@@ -0,0 +1 @@
+!function(n){const a=n.hr=n.hr||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Poravnaj po sredini","Align left":"Poravnaj ulijevo","Align right":"Poravnaj udesno",Justify:"Razvuci","Text alignment":"Poravnanje teksta","Text alignment toolbar":"Traka za poravnanje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.hr=n.hr||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Podebljano",Code:"Kod",Italic:"Ukošeno",Strikethrough:"Precrtano",Subscript:"Indeks",Superscript:"Eksponent",Underline:"Podcrtavanje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.hr=i.hr||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blok citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.hr=a.hr||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Odaberite naslov",Heading:"Naslov","Heading 1":"Naslov 1","Heading 2":"Naslov 2","Heading 3":"Naslov 3","Heading 4":"Naslov 4","Heading 5":"Naslov 5","Heading 6":"Naslov 6",Paragraph:"Paragraf","Type or paste your content here.":"Utipkajte ili zalijepite Vaš sadržaj ovdje.","Type your title":"Utipkajte naslov"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.hr=i.hr||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Vodoravna linija"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.hr=e.hr||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Centrirana slika","Change image text alternative":"Promijeni alternativni tekst slike","Enter image caption":"Unesite naslov slike","Full size image":"Slika pune veličine","Image resize list":"","Image toolbar":"Traka za slike","image widget":"Slika widget","In line":"",Insert:"","Insert image":"Umetni sliku","Insert image via URL":"","Left aligned image":"Lijevo poravnata slika",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Slika poravnata desno","Side image":"Slika sa strane","Text alternative":"Alternativni tekst",Update:"","Update image URL":"","Upload failed":"Slanje nije uspjelo","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.hr=n.hr||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Umanji uvlačenje","Increase indent":"Povećaj uvlačenje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.hr=i.hr||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"Moguće preuzeti","Edit link":"Uredi vezu",Link:"Veza","Link image":"","Link URL":"URL veze","Open in a new tab":"Otvori u novoj kartici","Open link in new tab":"Otvori vezu u novoj kartici","This link has no URL":"Ova veza nema URL",Unlink:"Ukloni vezu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.hr=e.hr||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Obična lista","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Brojčana lista","Numbered list styles toolbar":"",Square:"","To-do List":"Lista zadataka za obaviti","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.hr=e.hr||{};a.dictionary=Object.assign(a.dictionary||{},{"Align cell text to the bottom":"Tekst ćelije poravnaj prema dolje","Align cell text to the center":"Tekst ćelije poravnaj u sredinu","Align cell text to the left":"Tekst ćelije poravnaj lijevo","Align cell text to the middle":"Tekst ćelije poravnaj u sredinu","Align cell text to the right":"Tekst ćelije poravnaj udesno","Align cell text to the top":"Tekst ćelije poravnaj prema gore","Align table to the left":"Poravnaj tablicu ulijevo","Align table to the right":"Poravnaj tablicu udesno",Alignment:"Poravnanje",Background:"Pozadina",Border:"Granica","Cell properties":"Svojstva ćelije","Center table":"Centriraj tablicu",Color:"Boja","Color picker":"Birač boje",Column:"Kolona",Dashed:"Crtičasta","Delete column":"Obriši kolonu","Delete row":"Obriši red",Dimensions:"Dimenzije",Dotted:"Točkasta",Double:"Dvostruka","Enter table caption":"",Groove:"","Header column":"Kolona zaglavlja","Header row":"Red zaglavlja",Height:"Visina","Horizontal text alignment toolbar":"Alatna traka za horizontalno poravnanje teksta","Insert column left":"Umetni stupac lijevo","Insert column right":"Umetni stupac desno","Insert row above":"Ubaci red iznad","Insert row below":"Ubaci red ispod","Insert table":"Ubaci tablicu",Inset:"","Justify cell text":"Razvuci tekst ćelije","Merge cell down":"Spoji ćelije prema dolje","Merge cell left":"Spoji ćelije prema lijevo","Merge cell right":"Spoji ćelije prema desno","Merge cell up":"Spoji ćelije prema gore","Merge cells":"Spoji ćelije",None:"Nikakva",Outset:"",Padding:"Podstava",Ridge:"Greben",Row:"Red","Select column":"Odaberi stupac","Select row":"Odaberi redak",Solid:"Neprekidna","Split cell horizontally":"Razdvoji ćeliju vodoravno","Split cell vertically":"Razdvoji ćeliju okomito",Style:"Stil","Table alignment toolbar":"Alatna traka za poravnanje tablice","Table cell text alignment":"Poravnanje teksta ćelije tablice","Table properties":"Svojstva tablice","Table toolbar":"Traka za tablice",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Neispravna boja. Pokušajte "#FF0000" ili "rgb(255,0,0)" ili "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Neispravna vrijednost. Pokušajte "10px" ili "2em" ili jednostavno "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Alatna traka za vertikalno poravnanje teksta",Width:"Širina"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.hr=a.hr||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 od %1",Aquamarine:"Akvamarin",Black:"Crna",Blue:"Plava",Cancel:"Poništi","Dim grey":"Tamnosiva","Dropdown toolbar":"Traka padajućeg izbornika","Edit block":"Uredi blok","Editor toolbar":"Traka uređivača",Green:"Zelena",Grey:"Siva","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Svijetloplava","Light green":"Svijetlozelena","Light grey":"Svijetlosiva",Next:"Sljedeći",Orange:"Narančasta",Previous:"Prethodni",Purple:"Ljubičasta",Red:"Crvena",Redo:"Ponovi","Remove color":"Ukloni boju","Restore default":"","Rich Text Editor":"Rich Text Editor","Rich Text Editor, %0":"Rich Text Editor, %0",Save:"Snimi","Select all":"Odaberi sve","Show more items":"Prikaži više stavaka",Turquoise:"Tirkizna",Undo:"Poništi","Upload in progress":"Slanje u tijeku",White:"Bijela","Widget toolbar":"Traka sa spravicama",Yellow:"Žuta"}),e.getPluralForm=function(a){return a%10==1&&a%100!=11?0:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?1:2}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/hu.js b/core/assets/vendor/ckeditor5/build/translations/hu.js
new file mode 100644
index 0000000000..2f2900952c
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/hu.js
@@ -0,0 +1 @@
+!function(i){const t=i.hu=i.hu||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Középre igazítás","Align left":"Balra igazítás","Align right":"Jobbra igazítás",Justify:"Sorkizárt","Text alignment":"Szöveg igazítása","Text alignment toolbar":"Szöveg igazítás eszköztár"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const i=t.hu=t.hu||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Félkövér",Code:"Forráskód",Italic:"Dőlt",Strikethrough:"Áthúzott",Subscript:"Alsó index",Superscript:"Felső index",Underline:"Aláhúzott"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.hu=i.hu||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Idézet"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.hu=e.hu||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"Stílus megadása",Heading:"Stílusok","Heading 1":"Címsor 1","Heading 2":"Címsor 2","Heading 3":"Címsor 3","Heading 4":"Címsor 4","Heading 5":"Címsor 5","Heading 6":"Címsor 6",Paragraph:"Bekezdés","Type or paste your content here.":"Írja be, vagy illessze be a tartalmat.","Type your title":"Adja meg a címet"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.hu=n.hu||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Vízszintes elválasztóvonal"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.hu=e.hu||{};t.dictionary=Object.assign(t.dictionary||{},{"Break text":"Sortörés","Centered image":"Középre igazított kép","Change image text alternative":"Helyettesítő szöveg módosítása","Enter image caption":"Képaláírás megadása","Full size image":"Teljes méretű kép","Image resize list":"Kép átméretezési lista","Image toolbar":"Kép eszköztár","image widget":"képmodul","In line":"Soron belül",Insert:"Beszúrás","Insert image":"Kép beszúrása","Insert image via URL":"Kép beszúrása URL alapján","Left aligned image":"Balra igazított kép",Original:"Eredeti","Resize image":"Kép átméretezése","Resize image to %0":"Kép méretezése %0","Resize image to the original size":"Kép méretezése az eredeti méretre","Right aligned image":"Jobbra igazított kép","Side image":"Oldalsó kép","Text alternative":"Helyettesítő szöveg",Update:"Módosítás","Update image URL":"Kép URL módosítása","Upload failed":"A feltöltés nem sikerült","Wrap text":"Körbefuttatás"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.hu=n.hu||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Behúzás csökkentése","Increase indent":"Behúzás növelése"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.hu=a.hu||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose language":"Nyelv választása",Language:"Nyelv","Remove language":"Nyelv eltávolítása"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.hu=n.hu||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Letölthető","Edit link":"Link szerkesztése",Link:"Link","Link image":"Hivatkozás","Link URL":"URL link","Open in a new tab":"Megnyitás új lapon","Open link in new tab":"Link megnyitása új ablakban","This link has no URL":"A link nem tartalmaz URL-t",Unlink:"Link eltávolítása"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.hu=e.hu||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Pontozott lista","Bulleted list styles toolbar":"",Circle:"Kör",Decimal:"Szám","Decimal with leading zero":"Nullával kezdődő szám",Disc:"Korong","Lower-latin":"Kisbetűs latin szám","Lower–roman":"Kisbetűs római szám","Numbered List":"Számozott lista","Numbered list styles toolbar":"",Square:"Négyzet","To-do List":"Tennivaló lista","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"Nagybetűs latin szám","Upper-roman":"Nagybetűs római szám"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.hu=i.hu||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"Forrás"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.hu=e.hu||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Szöveg igazítása a cellában alulra","Align cell text to the center":"Szöveg igazítása a cellában középre","Align cell text to the left":"Szöveg igazítása a cellában balra","Align cell text to the middle":"Szöveg igazítása a cellában középre","Align cell text to the right":"Szöveg igazítása a cellában jobbra","Align cell text to the top":"Szöveg igazítása a cellában felülre","Align table to the left":"Tábla igazítása balra","Align table to the right":"Tábla igazítása jobbra",Alignment:"Igazítás",Background:"Háttér",Border:"Keret","Cell properties":"Cella tulajdonságok","Center table":"Tábla igazítása középre",Color:"Szín","Color picker":"Szín választása",Column:"Oszlop",Dashed:"Szaggatott","Delete column":"Oszlop törlése","Delete row":"Sor törlése",Dimensions:"Méretek",Dotted:"Pontozott",Double:"Dupla","Enter table caption":"Táblázat feliratának megadása",Groove:"Árok","Header column":"Oszlop fejléc","Header row":"Sor fejléc",Height:"Magasság","Horizontal text alignment toolbar":"Vízszintes szövegigazítási eszköztár","Insert column left":"Oszlop beszúrása balra","Insert column right":"Oszlop beszúrása jobbra","Insert row above":"Sor beszúrása fölé","Insert row below":"Sor beszúrása alá","Insert table":"Táblázat beszúrása",Inset:"Mélyített","Justify cell text":"Szöveg igazítása a cellában sorkizártra","Merge cell down":"Cellák egyesítése lefelé","Merge cell left":"Cellák egyesítése balra","Merge cell right":"Cellák egyesítése jobbra","Merge cell up":"Cellák egyesítése felfelé","Merge cells":"Cellaegyesítés",None:"Nincs",Outset:"Kiemelkedő",Padding:"Térköz",Ridge:"Gerinc",Row:"Sor","Select column":"Oszlop kijelölése","Select row":"Sor kijelölése",Solid:"Tömör","Split cell horizontally":"Cella felosztása vízszintesen","Split cell vertically":"Cella felosztása függőlegesen",Style:"Stílus","Table alignment toolbar":"Táblázatigazítási eszköztár","Table cell text alignment":"Szöveg igazítása a cellában","Table properties":"Táblázat tulajdonságai","Table toolbar":"Táblázat eszköztár",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'A szín érványtelen. Próbáld így "#FF0000" vagy "rgb(255,0,0)" vagy "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Az érték érvénytelen. Próbáld így "10px" vagy "2em" vagy csak egyszerűen "2".',"Toggle caption off":"Felirat kikapcsolása","Toggle caption on":"Felirat bekapcsolása","Vertical text alignment toolbar":"Függőleges szövegigazítási eszköztár",Width:"Szélesség"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.hu=i.hu||{};n.dictionary=Object.assign(n.dictionary||{},{"HTML object":"HTML objektum"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.hu=e.hu||{};t.dictionary=Object.assign(t.dictionary||{},{"%0 of %1":"%0 / %1",Aquamarine:"Kékeszöld",Black:"Fekete",Blue:"Kék",Cancel:"Mégsem","Dim grey":"Halvány szürke","Dropdown toolbar":"Lenyíló eszköztár","Edit block":"Blokk szerkesztése","Editor toolbar":"Szerkesztő eszköztár",Green:"Zöld",Grey:"Szürke","Insert paragraph after block":"Bekezdés beszúrása utána","Insert paragraph before block":"Bekezdés beszúrása elé","Light blue":"Világoskék","Light green":"Világoszöld","Light grey":"Világosszürke",Next:"Következő",Orange:"Narancs",Previous:"Előző",Purple:"Lila",Red:"Piros",Redo:"Újra","Remove color":"Szín eltávolítása","Restore default":"Alapértelmezés visszaállítása","Rich Text Editor":"Bővített szövegszerkesztő","Rich Text Editor, %0":"Bővített szövegszerkesztő, %0",Save:"Mentés","Select all":"Mindet kijelöl","Show more items":"További elemek",Turquoise:"Türkiz",Undo:"Visszavonás","Upload in progress":"A feltöltés folyamatban",White:"Fehér","Widget toolbar":"Widget eszköztár",Yellow:"Sárga"}),t.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/id.js b/core/assets/vendor/ckeditor5/build/translations/id.js
new file mode 100644
index 0000000000..03e06e9614
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/id.js
@@ -0,0 +1 @@
+!function(a){const t=a.id=a.id||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Rata tengah","Align left":"Rata kiri","Align right":"Rata kanan",Justify:"Rata kanan-kiri","Text alignment":"Perataan teks","Text alignment toolbar":"Alat perataan teks"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const r=i.id=i.id||{};r.dictionary=Object.assign(r.dictionary||{},{Bold:"Tebal",Code:"Kode",Italic:"Miring",Strikethrough:"Coret",Subscript:"Subskrip",Superscript:"Superskrip",Underline:"Garis bawah"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.id=i.id||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Kutipan"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const i=a.id=a.id||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Pilih tajuk",Heading:"Tajuk","Heading 1":"Tajuk 1","Heading 2":"Tajuk 2","Heading 3":"Tajuk 3","Heading 4":"Tajuk 4","Heading 5":"Tajuk 5","Heading 6":"Tajuk 6",Paragraph:"Paragraf","Type or paste your content here.":"Ketik atau tempel konten Anda di sini.","Type your title":"Ketik judul Anda"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.id=i.id||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Garis horizontal"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.id=a.id||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"","Centered image":"Gambar rata tengah","Change image text alternative":"Ganti alternatif teks gambar","Enter image caption":"Tambahkan deskripsi gambar","Full size image":"Gambar ukuran penuh","Image resize list":"Daftar ukuran gambar","Image toolbar":"Alat gambar","image widget":"widget gambar","In line":"",Insert:"Sisipkan","Insert image":"Sisipkan gambar","Insert image via URL":"Sisipkan gambar melalui URL","Left aligned image":"Gambar rata kiri",Original:"Asli","Resize image":"Ubah ukuran gambar","Resize image to %0":"Ubah ukuran gambar ke %0","Resize image to the original size":"Ubah ukuran gambar ke ukuran asli","Right aligned image":"Gambar rata kanan","Side image":"Gambar sisi","Text alternative":"Alternatif teks",Update:"Perbarui","Update image URL":"Perbarui URL gambar","Upload failed":"Gagal mengunggah","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.id=n.id||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Kurangi indentasi","Increase indent":"Tambah indentasi"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const i=a.id=a.id||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose language":"Pilih bahasa",Language:"Bahasa","Remove language":"Singkirkan bahasa"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.id=n.id||{};a.dictionary=Object.assign(a.dictionary||{},{Downloadable:"Dapat diunduh","Edit link":"Sunting tautan",Link:"Tautan","Link image":"","Link URL":"URL tautan","Open in a new tab":"Buka di tab baru","Open link in new tab":"Buka tautan di tab baru","This link has no URL":"Tautan ini tidak memiliki URL",Unlink:"Hapus tautan"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.id=e.id||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Daftar Tak Berangka","Bulleted list styles toolbar":"Bilah alat gaya daftar bullet",Circle:"Lingkaran",Decimal:"Desimal","Decimal with leading zero":"Desimal dengan awalan nol",Disc:"Disk","Lower-latin":"","Lower–roman":"","Numbered List":"Daftar Berangka","Numbered list styles toolbar":"Bilah alat gaya daftar angka",Square:"Kotak","To-do List":"Daftar untuk-dikerjakan","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.id=e.id||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"Latar belakang",Border:"Garis batas","Cell properties":"Properti sel","Center table":"",Color:"Warna","Color picker":"",Column:"Kolom",Dashed:"","Delete column":"Hapus kolom","Delete row":"Hapus baris",Dimensions:"Dimensi",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Kolom tajuk","Header row":"Baris tajuk",Height:"Tinggi","Horizontal text alignment toolbar":"","Insert column left":"Sisipkan kolom ke kiri","Insert column right":"Sisipkan kolom ke kanan","Insert row above":"Sisipkan baris ke atas","Insert row below":"Sisipkan baris ke bawah","Insert table":"Sisipkan tabel",Inset:"","Justify cell text":"","Merge cell down":"Gabungkan sel ke bawah","Merge cell left":"Gabungkan sel ke kiri","Merge cell right":"Gabungkan sel ke kanan","Merge cell up":"Gabungkan sel ke atas","Merge cells":"Gabungkan sel",None:"",Outset:"",Padding:"",Ridge:"",Row:"Baris","Select column":"Seleksi kolom","Select row":"Seleksi baris",Solid:"","Split cell horizontally":"Bagikan sel secara horizontal","Split cell vertically":"Bagikan sel secara vertikal",Style:"Gaya","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"Properti tabel","Table toolbar":"Alat tabel",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:"Lebar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.id=a.id||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 dari %1",Aquamarine:"Biru laut",Black:"Hitam",Blue:"Biru",Cancel:"Batal","Dim grey":"Kelabu gelap","Dropdown toolbar":"Alat dropdown","Edit block":"Sunting blok","Editor toolbar":"Alat editor",Green:"Hijau",Grey:"Kelabu","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Biru terang","Light green":"Hijau terang","Light grey":"Kelabu terang",Next:"Berikutnya",Orange:"Jingga",Previous:"Sebelumnya",Purple:"Ungu",Red:"Merah",Redo:"Lakukan lagi","Remove color":"Hapus warna","Restore default":"","Rich Text Editor":"Editor Teks Kaya","Rich Text Editor, %0":"Editor Teks Kaya, %0",Save:"Simpan","Show more items":"",Turquoise:"Turkish",Undo:"Batal","Upload in progress":"Sedang mengunggah",White:"Putih","Widget toolbar":"Alat widget",Yellow:"Kuning"}),e.getPluralForm=function(a){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/it.js b/core/assets/vendor/ckeditor5/build/translations/it.js
new file mode 100644
index 0000000000..c4f30aa0ff
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/it.js
@@ -0,0 +1 @@
+!function(i){const n=i.it=i.it||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Allinea al centro","Align left":"Allinea a sinistra","Align right":"Allinea a destra",Justify:"Giustifica","Text alignment":"Allineamento del testo","Text alignment toolbar":"Barra degli strumenti dell'allineamento"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.it=i.it||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Grassetto",Code:"Codice",Italic:"Corsivo",Strikethrough:"Barrato",Subscript:"Pedice",Superscript:"Apice",Underline:"Sottolineato"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.it=i.it||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blocco citazione"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const n=e.it=e.it||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Seleziona intestazione",Heading:"Intestazione","Heading 1":"Intestazione 1","Heading 2":"Intestazione 2","Heading 3":"Intestazione 3","Heading 4":"Intestazione 4","Heading 5":"Intestazione 5","Heading 6":"Intestazione 6",Paragraph:"Paragrafo","Type or paste your content here.":"Inserire o incollare qui il proprio contenuto.","Type your title":"Inserire il proprio titolo"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.it=i.it||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Linea orizzontale"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const e=i.it=i.it||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"Interrompi testo","Centered image":"Immagine centrata","Change image text alternative":"Cambia testo alternativo dell'immagine","Enter image caption":"inserire didascalia dell'immagine","Full size image":"Immagine a dimensione intera","Image resize list":"Elenco ridimensionamenti immagine","Image toolbar":"Barra degli strumenti dell'immagine","image widget":"Widget immagine","In line":"In linea",Insert:"Inserisci","Insert image":"Inserisci immagine","Insert image via URL":"Inserisci immagine tramite URL","Left aligned image":"Immagine allineata a sinistra",Original:"Originale","Resize image":"Ridimensiona immagine","Resize image to %0":"Ridimensiona immagine a %0","Resize image to the original size":"Ridimensiona immagine alle dimensioni originali","Right aligned image":"Immagine allineata a destra","Side image":"Immagine laterale","Text alternative":"Testo alternativo",Update:"Aggiorna","Update image URL":"Aggiorna URL immagine","Upload failed":"Caricamento fallito","Wrap text":"Testo a capo"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.it=i.it||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Riduci rientro","Increase indent":"Aumenta rientro"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.it=i.it||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Seleziona lingua",Language:"Lingua","Remove language":"Rimuovi lingua"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.it=n.it||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Scaricabile","Edit link":"Modifica collegamento",Link:"Collegamento","Link image":"Collega immagine","Link URL":"URL del collegamento","Open in a new tab":"Apri in una nuova scheda","Open link in new tab":"Apri collegamento in nuova scheda","This link has no URL":"Questo collegamento non ha un URL",Unlink:"Elimina collegamento"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.it=e.it||{};i.dictionary=Object.assign(i.dictionary||{},{"Bulleted List":"Elenco puntato","Bulleted list styles toolbar":"Barra degli strumenti con gli stili degli elenchi puntati",Circle:"Cerchio",Decimal:"Numero","Decimal with leading zero":"Numero con zero anteposto",Disc:"Disco","Lower-latin":"Lettera minuscola","Lower–roman":"Numero romano minuscolo","Numbered List":"Elenco numerato","Numbered list styles toolbar":"Barra degli strumenti con gli stili degli elenchi numerati",Square:"Quadrato","To-do List":"Elenco cose da fare","Toggle the circle list style":"Attiva/disattiva lo stile degli elenchi con cerchi","Toggle the decimal list style":"Attiva/disattiva lo stile degli elenchi con numeri","Toggle the decimal with leading zero list style":"Attiva/disattiva lo stile degli elenchi con numeri con zero anteposto","Toggle the disc list style":"Attiva/disattiva lo stile degli elenchi con dischi","Toggle the lower–latin list style":"Attiva/disattiva lo stile degli elenchi con lettere minuscole","Toggle the lower–roman list style":"Attiva/disattiva lo stile degli elenchi con numeri romani minuscoli","Toggle the square list style":"Attiva/disattiva lo stile degli elenchi con quadrati","Toggle the upper–latin list style":"Attiva/disattiva lo stile degli elenchi con lettere maiuscole","Toggle the upper–roman list style":"Attiva/disattiva lo stile degli elenchi con numeri romani maiuscoli","Upper-latin":"Lettera maiuscola","Upper-roman":"Numero romano maiuscolo"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.it=i.it||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"Sorgente"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.it=e.it||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Allinea il testo della cella in basso","Align cell text to the center":"Allinea il testo della cella al centro","Align cell text to the left":"Allinea il testo della cella a sinistra","Align cell text to the middle":"Allinea il testo della cella in mezzo","Align cell text to the right":"Allinea il testo della cella a destra","Align cell text to the top":"Allinea il testo della cella in alto","Align table to the left":"Allinea tabella a sinistra","Align table to the right":"Allinea tabella a destra",Alignment:"Allineamento",Background:"Sfondo",Border:"Bordo","Cell properties":"Proprietà cella","Center table":"Allinea tabella al centro",Color:"Colore","Color picker":"Selezione colore",Column:"Colonna",Dashed:"Tratteggiato","Delete column":"Elimina colonna","Delete row":"Elimina riga",Dimensions:"Dimensioni",Dotted:"Punteggiato",Double:"Doppio","Enter table caption":"Inserire la didascalia della tabella",Groove:"Scanalatura","Header column":"Intestazione colonna","Header row":"Riga d'intestazione",Height:"Altezza","Horizontal text alignment toolbar":"Barra degli strumenti dell'allineamento orizzontale del testo","Insert column left":"Inserisci colonna a sinistra","Insert column right":"Inserisci colonna a destra","Insert row above":"Inserisci riga sopra","Insert row below":"Inserisci riga sotto","Insert table":"Inserisci tabella",Inset:"Incassato","Justify cell text":"Testo della cella giustificato","Merge cell down":"Unisci cella sotto","Merge cell left":"Unisci cella a sinistra","Merge cell right":"Unisci cella a destra","Merge cell up":"Unisci cella sopra","Merge cells":"Unisci celle",None:"Nessuno",Outset:"Rialzato",Padding:"Spaziatura interna",Ridge:"Rilievo",Row:"Riga","Select column":"Seleziona colonna","Select row":"Seleziona riga",Solid:"Solido","Split cell horizontally":"Dividi cella orizzontalmente","Split cell vertically":"Dividi cella verticalmente",Style:"Stile","Table alignment toolbar":"Barra degli strumenti dell'allineamento della tabella","Table cell text alignment":"Allineamento del testo nella cella della tabella","Table properties":"Proprietà tabella","Table toolbar":"Barra degli strumenti della tabella",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Il colore non è valido. Provare "#FF0000" o "rgb(255,0,0)" o "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Il valore non è valido. Provare "10px" o "2em" o semplicemente "2".',"Toggle caption off":"Attiva didascalia","Toggle caption on":"Disattiva didascalia","Vertical text alignment toolbar":"Barra degli strumenti dell'allineamento verticale del testo",Width:"Larghezza"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.it=i.it||{};t.dictionary=Object.assign(t.dictionary||{},{"HTML object":"Oggetto HTML"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const r=o.it=o.it||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 di %1",Aquamarine:"Aquamarina",Black:"Nero",Blue:"Blu",Cancel:"Annulla","Dim grey":"Grigio tenue","Dropdown toolbar":"Barra degli strumenti del menu a discesa","Edit block":"Modifica blocco","Editor toolbar":"Barra degli strumenti dell'editor",Green:"Verde",Grey:"Grigio","Insert paragraph after block":"Inserisci paragrafo dopo blocco","Insert paragraph before block":"Inserisci paragrafo prima di blocco","Light blue":"Azzurro","Light green":"Verde chiaro","Light grey":"Grigio chiaro",Next:"Avanti",Orange:"Arancio",Previous:"Indietro",Purple:"Porpora",Red:"Rosso",Redo:"Ripristina","Remove color":"Rimuovi colore","Restore default":"Ripristina predefinito","Rich Text Editor":"Editor di testo formattato","Rich Text Editor, %0":"Editor di testo formattato, %0",Save:"Salva","Select all":"Seleziona tutto","Show more items":"Mostra più elementi",Turquoise:"Turchese",Undo:"Annulla","Upload in progress":"Caricamento in corso",White:"Bianco","Widget toolbar":"Barra degli strumenti del widget",Yellow:"Giallo"}),r.getPluralForm=function(o){return 1!=o}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/ja.js b/core/assets/vendor/ckeditor5/build/translations/ja.js
new file mode 100644
index 0000000000..2508ecf09d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/ja.js
@@ -0,0 +1 @@
+!function(n){const i=n.ja=n.ja||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"中央揃え","Align left":"左揃え","Align right":"右揃え",Justify:"両端揃え","Text alignment":"文字揃え","Text alignment toolbar":"テキストの整列"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ja=i.ja||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"ボールド",Code:"コード",Italic:"イタリック",Strikethrough:"取り消し線",Subscript:"下付き文字",Superscript:"上付き文字",Underline:"アンダーライン"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ja=i.ja||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"ブロッククオート(引用)"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.ja=n.ja||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"見出しを選択",Heading:"見出し","Heading 1":"見出し1","Heading 2":"見出し2","Heading 3":"見出し3 ","Heading 4":"見出し4","Heading 5":"見出し5","Heading 6":"見出し6",Paragraph:"段落","Type or paste your content here.":"コンテンツをここに入力または貼り付けしてください。","Type your title":"タイトルを入力"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ja=i.ja||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"区切り"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ja=e.ja||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"中央寄せ画像","Change image text alternative":"画像の代替テキストを変更","Enter image caption":"画像の注釈を入力","Full size image":"フルサイズ画像","Image resize list":"画像サイズリスト","Image toolbar":"画像","image widget":"画像ウィジェット","In line":"",Insert:"挿入","Insert image":"画像挿入","Insert image via URL":"画像URLを挿入","Left aligned image":"左寄せ画像",Original:"オリジナル","Resize image":"画像サイズ","Resize image to %0":"画像サイズを%0に変更","Resize image to the original size":"画像サイズを元のサイズに変更","Right aligned image":"右寄せ画像","Side image":"サイドイメージ","Text alternative":"代替テキスト",Update:"更新","Update image URL":"画像URLを更新","Upload failed":"アップロード失敗","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ja=n.ja||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"インデントの削除","Increase indent":"インデントの追加"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ja=n.ja||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"ダウンロード可能","Edit link":"リンクを編集",Link:"リンク","Link image":"リンク画像","Link URL":"リンクURL","Open in a new tab":"新しいタブで開く","Open link in new tab":"新しいタブでリンクを開く","This link has no URL":"リンクにURLが設定されていません",Unlink:"リンク解除"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ja=e.ja||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"箇条書きリスト","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"番号付きリスト","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ja=e.ja||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"列",Dashed:"","Delete column":"列を削除","Delete row":"行を削除",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"見出し列","Header row":"見出し行",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"上に行を挿入","Insert row below":"下に行を挿入","Insert table":"表の挿入",Inset:"","Justify cell text":"","Merge cell down":"下のセルと結合","Merge cell left":"左のセルと結合","Merge cell right":"右のセルと結合","Merge cell up":"上のセルと結合","Merge cells":"セルを結合",None:"",Outset:"",Padding:"",Ridge:"",Row:"行","Select column":"","Select row":"",Solid:"","Split cell horizontally":"縦にセルを分離","Split cell vertically":"横にセルを分離",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.ja=e.ja||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"薄い青緑",Black:"黒",Blue:"青",Cancel:"キャンセル","Dim grey":"暗い灰色","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"緑",Grey:"灰色","Insert paragraph after block":"ブロックの後にパラグラフを挿入","Insert paragraph before block":"ブロックの前にパラグラフを挿入","Light blue":"明るい青","Light green":"明るい緑","Light grey":"明るい灰色",Next:"",Orange:"オレンジ",Previous:"",Purple:"紫",Red:"赤",Redo:"やり直し","Remove color":"カラーを削除","Restore default":"","Rich Text Editor":"リッチテキストエディター","Rich Text Editor, %0":"リッチテキストエディター, %0",Save:"保存","Select all":"すべて選択","Show more items":"",Turquoise:"水色",Undo:"元に戻す","Upload in progress":"アップロード中",White:"白","Widget toolbar":"ウィジェットツールバー",Yellow:"黄"}),o.getPluralForm=function(e){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/kk.js b/core/assets/vendor/ckeditor5/build/translations/kk.js
new file mode 100644
index 0000000000..0bcf7db44b
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/kk.js
@@ -0,0 +1 @@
+!function(n){const i=n.kk=n.kk||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Ортадан туралау","Align left":"Солға туралау","Align right":"Оңға туралау",Justify:"","Text alignment":"Мәтінді туралау","Text alignment toolbar":"Мәтінді туралау құралдар тақтасы"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/km.js b/core/assets/vendor/ckeditor5/build/translations/km.js
new file mode 100644
index 0000000000..5ef6ffe105
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/km.js
@@ -0,0 +1 @@
+!function(n){const i=n.km=n.km||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"តម្រឹម​កណ្ដាល","Align left":"តម្រឹម​ឆ្វេង","Align right":"តម្រឹម​ស្ដាំ",Justify:"តម្រឹម​សងខាង","Text alignment":"ការ​តម្រឹម​អក្សរ","Text alignment toolbar":"របារ​ឧបករណ៍​តម្រឹម​អក្សរ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.km=i.km||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"ដិត",Code:"កូដ",Italic:"ទ្រេត",Strikethrough:"ឆូតកណ្ដាល",Subscript:"អក្សរ​តូចក្រោម",Superscript:"អក្សរ​តូចលើ",Underline:"គូស​បន្ទាត់​ក្រោម"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.km=i.km||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"ប្លុក​ពាក្យ​សម្រង់"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.km=n.km||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"ជ្រើសរើស​ក្បាលអត្ថបទ",Heading:"ក្បាលអត្ថបទ","Heading 1":"ក្បាលអត្ថបទ 1","Heading 2":"ក្បាលអត្ថបទ 2","Heading 3":"ក្បាលអត្ថបទ 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"កថាខណ្ឌ","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.km=e.km||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"","Enter image caption":"បញ្ចូល​ពាក្យ​ពណ៌នា​រូបភាព","Full size image":"រូបភាព​ពេញ​ទំហំ","Image resize list":"","Image toolbar":"","image widget":"វិដជិត​រូបភាព","In line":"",Insert:"","Insert image":"បញ្ចូល​រូបភាព","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"រូបភាព​នៅ​ខាង","Text alternative":"",Update:"","Update image URL":"","Upload failed":"អាប់ឡូត​មិនបាន","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.km=n.km||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"",Link:"តំណ","Link image":"","Link URL":"URL តំណ","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"ផ្ដាច់​តំណ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.km=e.km||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"បញ្ជី​ជា​ចំណុច","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"បញ្ជី​ជា​លេខ","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.km=e.km||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"បោះបង់","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"ធ្វើ​វិញ","Remove color":"","Restore default":"","Rich Text Editor":"កម្មវិធី​កែសម្រួល​អត្ថបទ​សម្បូរបែប","Rich Text Editor, %0":"កម្មវិធី​កែសម្រួល​អត្ថបទ​សម្បូរបែប, %0",Save:"រក្សាទុ","Show more items":"",Turquoise:"",Undo:"លែង​ធ្វើ​វិញ",White:"",Yellow:""}),o.getPluralForm=function(e){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/kn.js b/core/assets/vendor/ckeditor5/build/translations/kn.js
new file mode 100644
index 0000000000..4af863edc3
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/kn.js
@@ -0,0 +1 @@
+!function(i){const n=i.kn=i.kn||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"‍‍ದಪ್ಪ",Code:"",Italic:"‍ಇಟಾಲಿಕ್",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.kn=n.kn||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"‍‍‍‍ಗುರುತಿಸಲಾದ ‍‍ಉಲ್ಲೇಖ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.kn=n.kn||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"ಶೀರ್ಷಿಕೆ ಆಯ್ಕೆಮಾಡು",Heading:"ಶೀರ್ಷಿಕೆ","Heading 1":"ಶೀರ್ಷಿಕೆ 1","Heading 2":"ಶೀರ್ಷಿಕೆ 2","Heading 3":"ಶೀರ್ಷಿಕೆ 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"ಪ್ಯಾರಾಗ್ರಾಫ್","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.kn=e.kn||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"‍ಚಿತ್ರದ ಬದಲಿ ಪಠ್ಯ ಬದಲಾಯಿಸು","Enter image caption":"‍ಚಿತ್ರದ ಶೀರ್ಷಿಕೆ ಸೇರಿಸು","Full size image":"‍ಪೂರ್ಣ ‍‍ಅಳತೆಯ ಚಿತ್ರ","Image resize list":"","Image toolbar":"","image widget":"‍ಚಿತ್ರ ವಿಜೆಟ್","In line":"",Insert:"","Insert image":"","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"‍ಪಕ್ಕದ ಚಿತ್ರ","Text alternative":"‍ಪಠ್ಯದ ಬದಲಿ",Update:"","Update image URL":"","Upload failed":"","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.kn=n.kn||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"",Link:"‍ಕೊಂಡಿ","Link image":"","Link URL":"‍ಕೊಂಡಿ ಸಂಪರ್ಕಿಸು","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"‍ಕೊಂಡಿ ತೆಗೆ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.kn=e.kn||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"‍‍ಬುಲೆಟ್ ಪಟ್ಟಿ","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"‍ಸಂಖ್ಯೆಯ ಪಟ್ಟಿ‍","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.kn=e.kn||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"ರದ್ದುಮಾಡು","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"‍ಮತ್ತೆ ಮಾಡು","Remove color":"","Restore default":"","Rich Text Editor":"‍ಸಮೃದ್ಧ ಪಠ್ಯ ಸಂಪಾದಕ‍‍","Rich Text Editor, %0":"‍ಸಮೃದ್ಧ ಪಠ್ಯ ಸಂಪಾದಕ‍, %0",Save:"ಉಳಿಸು","Show more items":"",Turquoise:"",Undo:"‍‍ರದ್ದು",White:"",Yellow:""}),o.getPluralForm=function(e){return e>1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/ko.js b/core/assets/vendor/ckeditor5/build/translations/ko.js
new file mode 100644
index 0000000000..e3bfb07d78
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/ko.js
@@ -0,0 +1 @@
+!function(n){const i=n.ko=n.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"가운데 정렬","Align left":"왼쪽 정렬","Align right":"오른쪽 정렬",Justify:"양쪽 정렬","Text alignment":"텍스트 정렬","Text alignment toolbar":"텍스트 정렬 툴바"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.ko=i.ko||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"굵게",Code:"코드",Italic:"기울임꼴",Strikethrough:"취소선",Subscript:"아래 첨자",Superscript:"위 첨자",Underline:"밑줄"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.ko=o.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"인용 단락"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ko=n.ko||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"제목 선택",Heading:"제목","Heading 1":"제목 1","Heading 2":"제목 2","Heading 3":"제목 3","Heading 4":"제목 4","Heading 5":"제목 5","Heading 6":"제목 6",Paragraph:"문단","Type or paste your content here.":"여기에 내용을 입력하거나 붙여넣기 하세요.","Type your title":"제목을 입력해주세요"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ko=i.ko||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"수평선"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ko=e.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"가운데 정렬","Change image text alternative":"대체 문구 변경","Enter image caption":"사진 설명을 입력하세요","Full size image":"꽉 찬 크기","Image resize list":"사진 크기 목록","Image toolbar":"사진 툴바","image widget":"사진 위젯","In line":"",Insert:"","Insert image":"사진 삽입","Insert image via URL":"","Left aligned image":"왼쪽 정렬",Original:"원본","Resize image":"사진 크기 조절","Resize image to %0":"사진의 크기를 %0으로 조절","Resize image to the original size":"사진을 원래 크기로 돌려놓기","Right aligned image":"오른쪽 정렬","Side image":"본문 옆에 배치","Text alternative":"대체 문구",Update:"","Update image URL":"","Upload failed":"업로드 실패","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ko=n.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"들여쓰기 줄이기","Increase indent":"들여쓰기 늘리기"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ko=n.ko||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"다운로드 가능","Edit link":"링크 편집",Link:"링크","Link image":"사진 링크","Link URL":"링크 주소","Open in a new tab":"새 탭에서 열기","Open link in new tab":"새 탭에서 링크 열기","This link has no URL":"이 링크에는 URL이 없습니다.",Unlink:"링크 삭제"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ko=e.ko||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"불릿 목록","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"번호 목록","Numbered list styles toolbar":"",Square:"","To-do List":"확인 목록","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ko=e.ko||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"",Dashed:"","Delete column":"","Delete row":"",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"","Header row":"",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"","Insert row below":"","Insert table":"테이블 삽입",Inset:"","Justify cell text":"","Merge cell down":"","Merge cell left":"","Merge cell right":"","Merge cell up":"","Merge cells":"",None:"",Outset:"",Padding:"",Ridge:"",Row:"","Select column":"","Select row":"",Solid:"","Split cell horizontally":"","Split cell vertically":"",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.ko=e.ko||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"0% / %1",Aquamarine:"연한 청록색",Black:"검은색",Blue:"파랑색",Cancel:"취소","Dim grey":"진한 회색","Dropdown toolbar":"드롭다운 툴바","Edit block":"편집 영역","Editor toolbar":"에디터 툴바",Green:"초록색",Grey:"회색","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"연한 파랑색","Light green":"밝은 초록색","Light grey":"밝은 회색",Next:"다음",Orange:"주황색",Previous:"이전",Purple:"보라색",Red:"빨간색",Redo:"다시 실행","Remove color":"색깔 제거","Restore default":"","Rich Text Editor":"리치 텍스트 편집기","Rich Text Editor, %0":"리치 텍스트 편집기, %0",Save:"저장","Select all":"전체 선택","Show more items":"더보기",Turquoise:"청록색",Undo:"실행 취소","Upload in progress":"업로드 진행 중",White:"흰색","Widget toolbar":"위젯 툴바",Yellow:"노랑색"}),o.getPluralForm=function(e){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/ku.js b/core/assets/vendor/ckeditor5/build/translations/ku.js
new file mode 100644
index 0000000000..cef059db7f
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/ku.js
@@ -0,0 +1 @@
+!function(n){const i=n.ku=n.ku||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"بەهێڵکردنی ناورەڕاست","Align left":"بەهێڵکردنی چەپ","Align right":"بەهێڵکردنی ڕاست",Justify:"هاوستوونی","Text alignment":"ڕیززکردنی تێکست","Text alignment toolbar":"تووڵامرازی ڕیززکردنی تێکست"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ku=i.ku||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"قەڵەو",Code:"کۆد",Italic:"لار",Strikethrough:"هێڵ بەسەرداهاتوو",Subscript:"ژێرنووس",Superscript:"سەرنووس",Underline:"ژێرهێڵ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ku=i.ku||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"وتەی وەرگیراو"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ku=n.ku||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"سەرنووسە هەڵبژێرە",Heading:"سەرنووسە","Heading 1":"سەرنووسەی 1","Heading 2":"سەرنووسەی 2","Heading 3":"سەرنووسەی 3","Heading 4":"سەرنووسەی 4","Heading 5":"سەرنووسەی 5","Heading 6":"سەرنووسەی 6",Paragraph:"پەراگراف","Type or paste your content here.":"بنووسە یاخوود ناوەڕۆکی کۆپیکراو لیڕە بلکێنە","Type your title":"نوسینی ناونیشان"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ku=i.ku||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"هێڵی ئاسۆیی"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ku=e.ku||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"ناوەڕاستکراوی وێنە","Change image text alternative":"گۆڕینی جێگروەی تێکیسی وێنە","Enter image caption":"سەردێڕی وێنە دابنێ","Full size image":"پڕ بەقەبارەی وێنە","Image resize list":"","Image toolbar":"تووڵامرازی وێنە","image widget":"وێدجیتی وێنە","In line":"",Insert:"","Insert image":"وێنە دابنێ","Insert image via URL":"","Left aligned image":"ڕیزکردنی وێنە بۆ لای چەپ",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"ڕیزکردنی وێنە بۆ لای ڕاست","Side image":"لای وێنە","Text alternative":"جێگرەوەی تێکست",Update:"","Update image URL":"","Upload failed":"بارکردنەکە سەرنەکەووت","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ku=n.ku||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"کەمکردنەوەی بۆشایی","Increase indent":"زیادکردنی بۆشایی"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ku=n.ku||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Downloadable","Edit link":"دەستکاری بەستەر",Link:"بەستەر","Link image":"","Link URL":"ناونیشانی بەستەر","Open in a new tab":"کردنەوەی لە پەنجەرەیەکی نوێ","Open link in new tab":"کردنەوەی بەستەرەکە لە پەڕەیەکی نوێ","This link has no URL":"ئەم بەستەرە ناونیشانی نیە",Unlink:"لابردنی بەستەر"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ku=e.ku||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"لیستەی خاڵەیی","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"لیستەی ژمارەیی","Numbered list styles toolbar":"",Square:"","To-do List":"لیستەی کردن","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ku=e.ku||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"ستوون",Dashed:"","Delete column":"سڕینەوەی ستوون","Delete row":"سڕینەوەی ڕیز",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"ستوونی دەسپێک","Header row":"ڕیزی دەسپێک",Height:"","Horizontal text alignment toolbar":"","Insert column left":"دانانی ستوون لە چەپ","Insert column right":"دانانی ستوون لە ڕاست","Insert row above":"دانانی ڕیز لە سەرەوە","Insert row below":"دانانی ڕیز لە ژێرەوە","Insert table":"خشتە دابنێ",Inset:"","Justify cell text":"","Merge cell down":"تێکەڵکردنی خانەکان بەرەو ژێرەوە","Merge cell left":"تێکەڵکردنی خانەکان بەرەو چەپ","Merge cell right":"تێکەڵکردنی خانەکان بەرەو ڕاست","Merge cell up":"تێکەڵکردنی خانەکان بەرەو سەر","Merge cells":"تێکەڵکردنی خانەکان",None:"",Outset:"",Padding:"",Ridge:"",Row:"ڕیز","Select column":"","Select row":"",Solid:"","Split cell horizontally":"بەشکردنی خانەکان بە ئاسۆیی","Split cell vertically":"بەشکردنی خانەکان بە ئەستوونی",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"تووڵامرازی خشتە",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.ku=e.ku||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 لە %1",Aquamarine:"شینی دەریایی",Black:"ڕەش",Blue:"شین",Cancel:"هەڵوەشاندنەوە","Dim grey":"ڕەساسی تاریک","Dropdown toolbar":"تووڵامرازی لیستەیی","Edit block":"دەستکاری بلۆک","Editor toolbar":"تووڵامرازی دەسکاریکەر",Green:"سەوز",Grey:"ڕەساسی","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"شینی ڕووناک","Light green":"سەوزی ڕووناک","Light grey":"ڕەساسی ڕووناک",Next:"دواتر",Orange:"پرتەقاڵی",Previous:"پێشتر",Purple:"مۆر",Red:"سور",Redo:"هەلگەڕاندنەوە","Remove color":"لابردنی ڕەنگ","Restore default":"","Rich Text Editor":"سەرنوسەری دەقی بەپیت","Rich Text Editor, %0":"سەرنوسەری دەقی بەپیت, %0",Save:"پاشکەوتکردن","Show more items":"بڕگەی زیاتر نیشانبدە",Turquoise:"شینی ئاسمانی",Undo:"وەک خۆی لێ بکەوە","Upload in progress":"بارکردنەکە لە جێبەجێکردن دایە",White:"سپی","Widget toolbar":"تووڵامرازی ویدجێت",Yellow:"زەرد"}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/lt.js b/core/assets/vendor/ckeditor5/build/translations/lt.js
new file mode 100644
index 0000000000..5bf6c4bbd6
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/lt.js
@@ -0,0 +1 @@
+!function(i){const t=i.lt=i.lt||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Centruoti","Align left":"Lygiuoti į kairę","Align right":"Lygiuoti į dešinę",Justify:"Lygiuoti per visą plotį","Text alignment":"Teksto lygiavimas","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const a=i.lt=i.lt||{};a.dictionary=Object.assign(a.dictionary||{},{Bold:"Paryškintas",Code:"Kodas",Italic:"Kursyvas",Strikethrough:"Perbrauktas",Subscript:"Žemiau",Superscript:"Aukščiau",Underline:"Pabrauktas"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const i=t.lt=t.lt||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Citata"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const t=a.lt=a.lt||{};t.dictionary=Object.assign(t.dictionary||{},{"Choose heading":"Pasirinkite antraštę",Heading:"Antraštė","Heading 1":"Antraštė 1","Heading 2":"Antraštė 2","Heading 3":"Antraštė 3","Heading 4":"Antraštė 4","Heading 5":"Antraštė 5","Heading 6":"Antraštė 6",Paragraph:"Paragrafas","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.lt=e.lt||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Vaizdas centre","Change image text alternative":"Pakeisti vaizdo alternatyvųjį tekstą","Enter image caption":"Įveskite vaizdo antraštę","Full size image":"Pilno dydžio vaizdas","Image resize list":"","Image toolbar":"","image widget":"vaizdų valdiklis","In line":"",Insert:"","Insert image":"Įterpti vaizdą","Insert image via URL":"","Left aligned image":"Vaizdas kairėje",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Vaizdas dešinėje","Side image":"Vaizdas šone","Text alternative":"Alternatyvusis tekstas",Update:"","Update image URL":"","Upload failed":"Įkelti nepavyko","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.lt=i.lt||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Sumažinti atitraukimą","Increase indent":"Padidinti atitraukimą"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.lt=n.lt||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"Keisti nuorodą",Link:"Pridėti nuorodą","Link image":"","Link URL":"Nuorodos URL","Open in a new tab":"","Open link in new tab":"Atidaryti nuorodą naujame skirtuke","This link has no URL":"Ši nuorda neturi URL",Unlink:"Pašalinti nuorodą"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.lt=e.lt||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Sąrašas","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numeruotas rąrašas","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.lt=e.lt||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Stulpelis",Dashed:"","Delete column":"Ištrinti stulpelį","Delete row":"Ištrinti eilutę",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Antraštės stulpelis","Header row":"Antraštės eilutė",Height:"","Horizontal text alignment toolbar":"","Insert column left":"Įterpti stulpelį kairėje","Insert column right":"Įterpti stulpelį dešinėje","Insert row above":"Įterpti eilutę aukščiau","Insert row below":"Įterpti eilutę žemiau","Insert table":"Įterpti lentelę",Inset:"","Justify cell text":"","Merge cell down":"Prijungti langelį apačioje","Merge cell left":"Prijungti langelį kairėje","Merge cell right":"Prijungti langelį dešinėje","Merge cell up":"Prijungti langelį viršuje","Merge cells":"Sujungti langelius",None:"",Outset:"",Padding:"",Ridge:"",Row:"Eilutė","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Padalinti langelį horizontaliai","Split cell vertically":"Padalinti langelį vertikaliai",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.lt=i.lt||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"Aquamarine",Black:"Juoda",Blue:"Mėlyna",Cancel:"Atšaukti","Dim grey":"Pilkšva","Dropdown toolbar":"","Edit block":"Redaguoti bloką","Editor toolbar":"",Green:"Žalia",Grey:"Pilka","Light blue":"Šviesiai mėlyna","Light green":"Šviesiai žalia","Light grey":"Šviesiai pilka",Next:"",Orange:"Oranžinė",Previous:"",Purple:"Violetinė",Red:"Raudona",Redo:"Pirmyn","Remove color":"Pašalinti spalvą","Restore default":"","Rich Text Editor":"Raiškiojo teksto redaktorius","Rich Text Editor, %0":"Raiškiojo teksto redaktorius, %0",Save:"Išsaugoti","Show more items":"",Turquoise:"Turkio",Undo:"Atgal","Upload in progress":"Įkelima",White:"Balta",Yellow:"Geltona"}),o.getPluralForm=function(i){return i%10==1&&(i%100>19||i%100<11)?0:i%10>=2&&i%10<=9&&(i%100>19||i%100<11)?1:i%1!=0?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/lv.js b/core/assets/vendor/ckeditor5/build/translations/lv.js
new file mode 100644
index 0000000000..96a144fa19
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/lv.js
@@ -0,0 +1 @@
+!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Centrēt","Align left":"Pa kreisi","Align right":"Pa labi",Justify:"Izlīdzināt abas malas","Text alignment":"Teksta izlīdzināšana","Text alignment toolbar":"Teksta līdzināšanas rīkjosla"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(s){const t=s.lv=s.lv||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Trekns",Code:"Kods",Italic:"Kursīvs",Strikethrough:"Nosvītrots",Subscript:"Apakšraksts",Superscript:"Augšraksts",Underline:"Pasvītrots"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citāts"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(s){const i=s.lv=s.lv||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Izvēlēties virsrakstu",Heading:"Virsraksts","Heading 1":"Virsraksts 1","Heading 2":"Virsraksts 2","Heading 3":"Virsraksts 3","Heading 4":"Virsraksts 4","Heading 5":"Virsraksts 5","Heading 6":"Virsraksts 6",Paragraph:"Pagrāfs","Type or paste your content here.":"Rakstiet vai ielīmējiet saturu šeit.","Type your title":"Ievadiet virsrakstu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Horizontāli atdalošā līnija"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const e=t.lv=t.lv||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"","Centered image":"Centrēts attēls","Change image text alternative":"Mainīt attēla alternatīvo tekstu","Enter image caption":"Ievadiet attēla parakstu","Full size image":"Pilna izmēra attēls","Image resize list":"","Image toolbar":"Attēlu rīkjosla","image widget":"attēla sīkrīks","In line":"",Insert:"","Insert image":"Ievietot attēlu","Insert image via URL":"","Left aligned image":"Pa kreisi līdzināts attēls",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Pa labi līdzināts attēls","Side image":"Sānā novietots attēls","Text alternative":"Alternatīvais teksts",Update:"","Update image URL":"","Upload failed":"Augšupielāde neizdevusies","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Samazināt atkāpi","Increase indent":"Palielināt atkāpi"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"Lejupielādējams","Edit link":"Labot Saiti",Link:"Saite","Link image":"","Link URL":"Saites URL","Open in a new tab":"Atvērt jaunā cilnē","Open link in new tab":"Atvērt saiti jaunā cilnē","This link has no URL":"Saitei nav norādīts URL",Unlink:"Noņemt Saiti"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.lv=e.lv||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Nenumurēts Saraksts","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numurēts Saraksts","Numbered list styles toolbar":"",Square:"","To-do List":"To-do Saraksts","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.lv=e.lv||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Kolonna",Dashed:"","Delete column":"Dzēst kolonnu","Delete row":"Dzēst rindu",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Šī kolonna ir galvene","Header row":"Šī rinda ir galvene",Height:"","Horizontal text alignment toolbar":"","Insert column left":"Ievietot kolonnu pa kreisi","Insert column right":"Ievietot kolonnu pa labi","Insert row above":"Ievietot rindu virs","Insert row below":"Ievietot rindu zem","Insert table":"Ievietot tabulu",Inset:"","Justify cell text":"","Merge cell down":"Apvienot šūnas uz leju","Merge cell left":"Apvienot šūnas pa kreisi","Merge cell right":"Apvienot šūnas pa labi","Merge cell up":"Apvienot šūnas uz augšu","Merge cells":"Apvienot šūnas",None:"",Outset:"",Padding:"",Ridge:"",Row:"Rinda","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Atdalīt šūnu horizontāli","Split cell vertically":"Atdalīt šūnu vertikāli",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"Tabulas rīkjosla",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.lv=e.lv||{};a.dictionary=Object.assign(a.dictionary||{},{"%0 of %1":"%0 no %1",Aquamarine:"Akvamarīns",Black:"Melns",Blue:"Zils",Cancel:"Atcelt","Dim grey":"Blāvi pelēks","Dropdown toolbar":"Papildus izvēlnes rīkjosla","Edit block":"Labot bloku","Editor toolbar":"Redaktora rīkjosla",Green:"Zaļš",Grey:"Pelēks","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Gaiši zils","Light green":"Gaiši zaļš","Light grey":"Gaiši pelēks",Next:"Nākamā",Orange:"Oranžs",Previous:"Iepriekšējā",Purple:"Violets",Red:"Sarkans",Redo:"Uz priekšu","Remove color":"Noņemt krāsu","Restore default":"","Rich Text Editor":"Bagātinātais Teksta Redaktors","Rich Text Editor, %0":"Bagātinātais Teksta Redaktors, %0",Save:"Saglabāt","Show more items":"Parādīt vairāk vienumus",Turquoise:"Tirkīza",Undo:"Atsaukt","Upload in progress":"Notiek augšupielāde",White:"Balts","Widget toolbar":"Sīkrīku rīkjosla",Yellow:"Dzeltens"}),a.getPluralForm=function(e){return e%10==1&&e%100!=11?0:0!=e?1:2}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/nb.js b/core/assets/vendor/ckeditor5/build/translations/nb.js
new file mode 100644
index 0000000000..575e55bfd0
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/nb.js
@@ -0,0 +1 @@
+!function(t){const n=t.nb=t.nb||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Midstill","Align left":"Venstrejuster","Align right":"Høyrejuster",Justify:"Blokkjuster","Text alignment":"Tekstjustering","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nb=n.nb||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Fet",Code:"Kode",Italic:"Kursiv",Strikethrough:"Gjennomstreking",Subscript:"",Superscript:"",Underline:"Understreking"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nb=n.nb||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blokksitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.nb=e.nb||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Velg overskrift",Heading:"Overskrift","Heading 1":"Overskrift 1","Heading 2":"Overskrift 2","Heading 3":"Overskrift 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Avsnitt","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.nb=e.nb||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Midtstilt bilde","Change image text alternative":"Endre tekstalternativ for bilde","Enter image caption":"Skriv inn bildetekst","Full size image":"Bilde i full størrelse","Image resize list":"","Image toolbar":"","image widget":"Bilde-widget","In line":"",Insert:"","Insert image":"Sett inn bilde","Insert image via URL":"","Left aligned image":"Venstrejustert bilde",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Høyrejustert bilde","Side image":"Sidebilde","Text alternative":"Tekstalternativ for bilde",Update:"","Update image URL":"","Upload failed":"Opplasting feilet","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.nb=n.nb||{};e.dictionary=Object.assign(e.dictionary||{},{Downloadable:"","Edit link":"Rediger lenke",Link:"Lenke","Link image":"","Link URL":"URL for lenke","Open in a new tab":"","Open link in new tab":"Åpne lenke i ny fane","This link has no URL":"Denne lenken har ingen URL",Unlink:"Fjern lenke"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.nb=e.nb||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Punktmerket liste","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Nummerert liste","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.nb=e.nb||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Kolonne",Dashed:"","Delete column":"Slett kolonne","Delete row":"Slett rad",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Overskriftkolonne","Header row":"Overskriftrad",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"Sett inn rad over","Insert row below":"Sett inn rad under","Insert table":"Sett inn tabell",Inset:"","Justify cell text":"","Merge cell down":"Slå sammen celle ned","Merge cell left":"Slå sammen celle til venstre","Merge cell right":"Slå sammen celle til høyre","Merge cell up":"Slå sammen celle opp","Merge cells":"Slå sammen celler",None:"",Outset:"",Padding:"",Ridge:"",Row:"Rad","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Del celle horisontalt","Split cell vertically":"Del celle vertikalt",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.nb=e.nb||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Avbryt","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Gjør om","Remove color":"","Restore default":"","Rich Text Editor":"Rikteksteditor","Rich Text Editor, %0":"Rikteksteditor, %0",Save:"Lagre","Show more items":"",Turquoise:"",Undo:"Angre","Upload in progress":"Opplasting pågår",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/ne.js b/core/assets/vendor/ckeditor5/build/translations/ne.js
new file mode 100644
index 0000000000..016c870cad
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/ne.js
@@ -0,0 +1 @@
+!function(n){const i=n.ne=n.ne||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"केन्द्र पङ्क्तिबद्ध गर्नुहोस्","Align left":"बायाँ पङ्क्तिबद्ध गर्नुहोस्","Align right":"दायाँ पङ्क्तिबद्ध गर्नुहोस्",Justify:"जस्टिफाइ गर्नुहोस्","Text alignment":"पाठ संरेखण","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ne=i.ne||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"बोल्ड",Code:"कोड",Italic:"इटालिक",Strikethrough:"स्ट्राइकथ्रू",Subscript:"सबस्क्रिप्ट",Superscript:"सुपरस्क्रिप्ट",Underline:"रेखांकन"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ne=n.ne||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"ब्लक उद्धरण"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ne=n.ne||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"शीर्षक छनौट गर्नुहोस्",Heading:"शीर्षक","Heading 1":"शीर्षक-एक","Heading 2":"शीर्षक २","Heading 3":"शीर्षक ३","Heading 4":"शीर्षक ४","Heading 5":"शीर्षक ५","Heading 6":"शीर्षक ६",Paragraph:"अनुच्छेद","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ne=e.ne||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"केन्द्रित तस्वीर","Change image text alternative":"तस्वीर पाठ विकल्प परिवर्तन गर्नुहोस्","Enter image caption":"तस्वीर क्याप्शन प्रविष्ट गर्नुहोस्","Full size image":"पूर्ण आकार तस्वीर","Image resize list":"","Image toolbar":"","image widget":"तस्वीर विजेट","In line":"",Insert:"","Insert image":"तस्वीर सम्मिलित गर्नुहोस्","Insert image via URL":"","Left aligned image":"बायाँ पङ्क्ति तस्वीर",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"दायाँ पङ्क्तिबद्ध तस्वीर","Side image":"साइड तस्वीर","Text alternative":"पाठ विकल्प",Update:"","Update image URL":"","Upload failed":"अपलोड असफल भयो","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ne=n.ne||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"इन्डेन्ट घटाउन","Increase indent":"इन्डेन्ट बढाउन"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ne=n.ne||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"डाउनलोड योग्य","Edit link":"लिङ्क सम्पादन गर्नुहोस्",Link:"लिङ्क","Link image":"","Link URL":"लिङ्क यूआरएल","Open in a new tab":"नयाँ ट्याबमा खोल्न","Open link in new tab":"नयाँ ट्याबमा लिङ्क खोल्नुहोस्","This link has no URL":"यो लिङ्कसँग यूआरएल छैन",Unlink:"अनलिङ्क गर्नुहोस्"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ne=e.ne||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"गोली चिन्ह अङ्कित सूची","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"सूचीबद्ध सूची","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ne=e.ne||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"स्तम्भ",Dashed:"","Delete column":"स्तम्भ मेटाउनुहोस्","Delete row":"पङ्क्ति मेटाउनुहोस्",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"हेडर स्तम्भ","Header row":"हेडर पङ्क्ति",Height:"","Horizontal text alignment toolbar":"","Insert column left":"बायाँ स्तम्भ सम्मिलित गर्न","Insert column right":"दायाँ स्तम्भ सम्मिलित गर्न","Insert row above":"माथि पंक्ति सम्मिलित गर्नुहोस्","Insert row below":"तल पंक्ति सम्मिलित गर्नुहोस्","Insert table":"तालिका सम्मिलित गर्नुहोस्",Inset:"","Justify cell text":"","Merge cell down":"कक्ष तल मर्ज गर्नुहोस्","Merge cell left":"सेल बायाँ मर्ज गर्नुहोस्","Merge cell right":"दायाँ कक्ष मर्ज गर्नुहोस्","Merge cell up":"कक्ष माथि मर्ज गर्नुहोस्","Merge cells":"कक्ष मर्ज गर्नुहोस्",None:"",Outset:"",Padding:"",Ridge:"",Row:"पङ्क्ति","Select column":"","Select row":"",Solid:"","Split cell horizontally":"क्षैतिज कक्ष विभाजित गर्नुहोस्","Split cell vertically":"ठाडो कक्ष विभाजित गर्नुहोस्",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.ne=e.ne||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"०% मध्ये १%",Aquamarine:"अव्कवामरिन",Black:"कालो",Blue:"निलो",Cancel:"रद्द गर्नुहोस्","Dim grey":"धमिलो खैरो","Dropdown toolbar":"","Edit block":"ब्लक सम्पादन गर्न","Editor toolbar":"",Green:"हरियो",Grey:"खैरो","Light blue":"हल्का निलो","Light green":"हल्का हरियो","Light grey":"हल्का खैरो",Next:"अर्को",Orange:"सुन्तला रंग",Previous:"अघिल्लो",Purple:"बैंगनी रंग",Red:"रातो",Redo:"रिडु","Remove color":"रंग हटाउन","Restore default":"","Rich Text Editor":"धनी पाठ सम्पादक","Rich Text Editor, %0":"धनी पाठ सम्पादक, %0",Save:"सुरक्षित गर्नुहोस्","Show more items":"",Turquoise:"त्रकोइस",Undo:"पूर्ववत","Upload in progress":"अपलोड हुदैछ",White:"सेतो",Yellow:"पहेंलो"}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/nl.js b/core/assets/vendor/ckeditor5/build/translations/nl.js
new file mode 100644
index 0000000000..832ff21c4f
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/nl.js
@@ -0,0 +1 @@
+!function(i){const n=i.nl=i.nl||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Midden uitlijnen","Align left":"Links uitlijnen","Align right":"Rechts uitlijnen",Justify:"Volledig uitlijnen","Text alignment":"Tekst uitlijning","Text alignment toolbar":"Tekst uitlijning werkbalk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.nl=i.nl||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Vet",Code:"Code",Italic:"Cursief",Strikethrough:"Doorhalen",Subscript:"Subscript",Superscript:"Superscript",Underline:"Onderlijnen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nl=n.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blok citaat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const n=o.nl=o.nl||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Kies kop",Heading:"Koppen","Heading 1":"Kop 1","Heading 2":"Kop 2","Heading 3":"Kop 3","Heading 4":"Kop 4","Heading 5":"Kop 5","Heading 6":"Kop 6",Paragraph:"Paragraaf","Type or paste your content here.":"Voer of plak uw inhoud in.","Type your title":"Voor uw titel in"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nl=n.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Horizontale lijn"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.nl=e.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Gecentreerde afbeelding","Change image text alternative":"Verander alt-tekst van de afbeelding","Enter image caption":"Typ een afbeeldingsbijschrift","Full size image":"Afbeelding op volledige grootte","Image resize list":"","Image toolbar":"Afbeeldingswerkbalk","image widget":"afbeeldingswidget","In line":"",Insert:"","Insert image":"Afbeelding toevoegen","Insert image via URL":"","Left aligned image":"Links uitgelijnde afbeelding",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Rechts uitgelijnde afbeelding","Side image":"Afbeelding naast tekst","Text alternative":"Alt-tekst",Update:"","Update image URL":"","Upload failed":"Uploaden afbeelding mislukt","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nl=n.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Minder inspringen","Increase indent":"Inspringen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const n=a.nl=a.nl||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Kies taal",Language:"Taal","Remove language":"Taal verwijderen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.nl=n.nl||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Downloadbaar","Edit link":"Bewerk link",Link:"Link","Link image":"Link afbeelding","Link URL":"Link URL","Open in a new tab":"Open een nieuw tabblad","Open link in new tab":"Open link in nieuw tabblad","This link has no URL":"Deze link heeft geen URL",Unlink:"Verwijder link"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.nl=e.nl||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Ongenummerde lijst","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Genummerde lijst","Numbered list styles toolbar":"",Square:"","To-do List":"To-do lijst","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.nl=e.nl||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"Tekst in de cel centreren","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"Uitlijning",Background:"Achtergrond",Border:"Rand","Cell properties":"Celeigenschappen","Center table":"Tabel centreren",Color:"Kleur","Color picker":"",Column:"Kolom",Dashed:"","Delete column":"Verwijder kolom","Delete row":"Verwijder rij",Dimensions:"",Dotted:"Stippellijn",Double:"Dubbel","Enter table caption":"",Groove:"","Header column":"Titel kolom","Header row":"Titel rij",Height:"Hoogte","Horizontal text alignment toolbar":"","Insert column left":"Kolom links invoegen","Insert column right":"Kolom rechts invoegen","Insert row above":"Rij hierboven invoegen","Insert row below":"Rij hieronder invoegen","Insert table":"Tabel invoegen",Inset:"","Justify cell text":"","Merge cell down":"Cel hieronder samenvoegen","Merge cell left":"Cel hiervoor samenvoegen","Merge cell right":"Cel hierna samenvoegen","Merge cell up":"Cel hierboven samenvoegen","Merge cells":"Cellen samenvoegen",None:"Geen",Outset:"",Padding:"",Ridge:"",Row:"Rij","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Splits cel horizontaal","Split cell vertically":"Splits cel verticaal",Style:"Stijl","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"Tabeleigenschappen","Table toolbar":"Tabel werkbalk",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'De kleur in niet correct, probeer "#FF0000" of "rgb(255,0,0)" of "red".','The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:"Breedte"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.nl=e.nl||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"0% van 1%",Aquamarine:"Aquamarijn",Black:"Zwart",Blue:"Blauw",Cancel:"Annuleren","Dim grey":"Gedimd grijs","Dropdown toolbar":"Drop-down werkbalk","Edit block":"Blok aanpassen","Editor toolbar":"Editor welkbalk",Green:"Groen",Grey:"Grijs","Insert paragraph after block":"Voeg paragraaf toe na blok","Insert paragraph before block":"Voeg paragraaf toe voor blok","Light blue":"Lichtblauw","Light green":"Lichtgroen","Light grey":"Lichtgrijs",Next:"Volgende",Orange:"Oranje",Previous:"Vorige",Purple:"Paars",Red:"Rood",Redo:"Opnieuw","Remove color":"Verwijder kleur","Restore default":"","Rich Text Editor":"Tekstbewerker","Rich Text Editor, %0":"Tekstbewerker, 0%",Save:"Opslaan","Select all":"Selecteer alles","Show more items":"Meer items weergeven",Turquoise:"Turquoise",Undo:"Ongedaan maken","Upload in progress":"Bezig met uploaden",White:"Wit","Widget toolbar":"Widget werkbalk",Yellow:"Geel"}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/no.js b/core/assets/vendor/ckeditor5/build/translations/no.js
new file mode 100644
index 0000000000..eb7f310bd9
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/no.js
@@ -0,0 +1 @@
+!function(t){const n=t.no=t.no||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Midtstill","Align left":"Venstrejuster","Align right":"Høyrejuster",Justify:"Blokkjuster","Text alignment":"Tekstjustering","Text alignment toolbar":"Verktøylinje for tekstjustering"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const e=t.no=t.no||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Fet",Code:"Kode",Italic:"Kursiv",Strikethrough:"Gjennomstreket",Subscript:"Senket skrift",Superscript:"Hevet skrift",Underline:"Understreket"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const n=o.no=o.no||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Blokksitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const e=i.no=i.no||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Velg overskrift",Heading:"Overskrift","Heading 1":"Overskrift 1","Heading 2":"Overskrift 2","Heading 3":"Overskrift 3","Heading 4":"Overskrift 4","Heading 5":"Overskrift 5","Heading 6":"Overskrift 6",Paragraph:"Avsnitt","Type or paste your content here.":"Skriv eller lim inn ditt innhold her","Type your title":"Skriv inn tittel"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.no=n.no||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Horisontal linje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.no=e.no||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Midtstilt bilde","Change image text alternative":"Endre tekstalternativ til bildet","Enter image caption":"Skriv inn bildetekst","Full size image":"Bilde i full størrelse","Image resize list":"","Image toolbar":"Verktøylinje for bilde","image widget":"Bilde-widget","In line":"",Insert:"","Insert image":"Sett inn bilde","Insert image via URL":"","Left aligned image":"Venstrejustert bilde",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Høyrejustert bilde","Side image":"Sidestilt bilde","Text alternative":"Tekstalternativ",Update:"","Update image URL":"","Upload failed":"Kunne ikke laste opp","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.no=n.no||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Reduser innrykk","Increase indent":"Øk innrykk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.no=n.no||{};e.dictionary=Object.assign(e.dictionary||{},{Downloadable:"Nedlastbar","Edit link":"Rediger lenke",Link:"Lenke","Link image":"","Link URL":"Lenke-URL","Open in a new tab":"Åpne i ny fane","Open link in new tab":"Åpne lenke i ny fane","This link has no URL":"Denne lenken mangler en URL",Unlink:"Fjern lenke"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.no=e.no||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Punktliste","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Nummerert liste","Numbered list styles toolbar":"",Square:"","To-do List":"Oppgaveliste","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.no=e.no||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Juster celletekst til bunn ","Align cell text to the center":"Juster celletekst til midten ","Align cell text to the left":"Juster celletekst til venstre ","Align cell text to the middle":"Juster celletekst til midten","Align cell text to the right":"Juster celletekst til høyre ","Align cell text to the top":"Juster celletekst til topp","Align table to the left":"Juster tabell til venstre ","Align table to the right":"Juster tabell til høyre ",Alignment:"Justering",Background:"Bakgrunn ",Border:"Kantlinje ","Cell properties":"Celleegenskaper ","Center table":"Sentrer tabell ",Color:"Farge","Color picker":"Fargevalg ",Column:"Kolonne",Dashed:"Stiplet","Delete column":"Slett kolonne","Delete row":"Slett rad",Dimensions:"Dimensjoner",Dotted:"Stiplede",Double:"Dobbel ","Enter table caption":"",Groove:"Grov","Header column":"Overskriftkolonne","Header row":"Overskriftrad",Height:"Høyde","Horizontal text alignment toolbar":"Verktøylinje for justering av tekst horisontalt ","Insert column left":"Sett inn kolonne til venstre","Insert column right":"Sett inn kolonne til høyre","Insert row above":"Sett inn rad over","Insert row below":"Sett inn rad under","Insert table":"Sett inn tabell",Inset:"Innover","Justify cell text":"Rett celletekst ","Merge cell down":"Slå sammen celle under","Merge cell left":"Slå sammen celle til venstre","Merge cell right":"Slå sammen celle til høyre","Merge cell up":"Slå sammen celle over","Merge cells":"Slå sammen celler",None:"Ingen",Outset:"Utover",Padding:"Fylling",Ridge:"Kjede",Row:"Rad","Select column":"Velg kolonne ","Select row":"Velg rad",Solid:"Hel","Split cell horizontally":"Del opp celle horisontalt","Split cell vertically":"Del opp celle vertikalt",Style:"Stil ","Table alignment toolbar":"Verktøylinje for justering av tabell ","Table cell text alignment":"Celle tekstjustering ","Table properties":"Egenskaper for tabell","Table toolbar":"Tabell verktøylinje ",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"Ugyldig farge ",'The value is invalid. Try "10px" or "2em" or simply "2".':"Ugyldig verdi ","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Verktøylinje for justering av tekst vertikalt ",Width:"Bredde"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.no=e.no||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 av %1",Aquamarine:"Akvamarin",Black:"Svart",Blue:"Blå",Cancel:"Avbryt","Dim grey":"Svak grå","Dropdown toolbar":"Verktøylinje for nedtrekksliste","Edit block":"Rediger blokk","Editor toolbar":"Verktøylinje for redigeringsverktøy",Green:"Grønn",Grey:"Grå","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Lyseblå","Light green":"Lysegrønn","Light grey":"Lysegrå",Next:"Neste",Orange:"Oransje",Previous:"Forrige",Purple:"Lilla",Red:"Rød",Redo:"Gjør om","Remove color":"Fjern farge","Restore default":"","Rich Text Editor":"Tekstredigeringsverktøy for rik tekst","Rich Text Editor, %0":"Tekstredigeringsverktøy for rik tekst, %0",Save:"Lagre","Select all":"Velg alt ","Show more items":"Vis flere elementer",Turquoise:"Turkis",Undo:"Angre","Upload in progress":"Laster opp fil",White:"Hvit","Widget toolbar":"Widget verktøylinje ",Yellow:"Gul"}),r.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/oc.js b/core/assets/vendor/ckeditor5/build/translations/oc.js
new file mode 100644
index 0000000000..7d662342f2
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/oc.js
@@ -0,0 +1 @@
+!function(i){const c=i.oc=i.oc||{};c.dictionary=Object.assign(c.dictionary||{},{Bold:"Gras",Code:"",Italic:"Italica",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const n=o.oc=o.oc||{};n.dictionary=Object.assign(n.dictionary||{},{"%0 of %1":"",Cancel:"Anullar","Remove color":"","Restore default":"",Save:"Enregistrar","Show more items":""}),n.getPluralForm=function(o){return o>1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/pl.js b/core/assets/vendor/ckeditor5/build/translations/pl.js
new file mode 100644
index 0000000000..bd07b84c82
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/pl.js
@@ -0,0 +1 @@
+!function(n){const i=n.pl=n.pl||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Wyrównaj do środka","Align left":"Wyrównaj do lewej","Align right":"Wyrównaj do prawej",Justify:"Wyrównaj obustronnie","Text alignment":"Wyrównanie tekstu","Text alignment toolbar":"Pasek narzędzi wyrównania tekstu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.pl=e.pl||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Pogrubienie",Code:"Kod",Italic:"Kursywa",Strikethrough:"Przekreślenie",Subscript:"Indeks dolny",Superscript:"Indeks górny",Underline:"Podkreślenie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.pl=o.pl||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Cytat blokowy"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.pl=e.pl||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"Wybierz nagłówek",Heading:"Nagłówek","Heading 1":"Nagłówek 1","Heading 2":"Nagłówek 2","Heading 3":"Nagłówek 3","Heading 4":"Nagłówek 4","Heading 5":"Nagłówek 5","Heading 6":"Nagłówek 6",Paragraph:"Akapit","Type or paste your content here.":"Wpisz lub wklej tutaj treść dokumentu.","Type your title":"Podaj tytuł"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.pl=i.pl||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Linia pozioma"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.pl=a.pl||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"","Centered image":"Obraz wyrównany do środka","Change image text alternative":"Zmień tekst zastępczy obrazka","Enter image caption":"Wstaw tytuł obrazka","Full size image":"Obraz w pełnym rozmiarze","Image resize list":"","Image toolbar":"Pasek narzędzi obrazka","image widget":"Obraz","In line":"",Insert:"Wstaw","Insert image":"Wstaw obraz","Insert image via URL":"Wstaw obraz z adresu URL","Left aligned image":"Obraz wyrównany do lewej",Original:"Oryginalny","Resize image":"Zmień rozmiar obrazka","Resize image to %0":"Zmień rozmiar do %0","Resize image to the original size":"Przywróć oryginalny rozmiar obrazu","Right aligned image":"Obraz wyrównany do prawej","Side image":"Obraz dosunięty do brzegu, oblewany tekstem","Text alternative":"Tekst zastępczy obrazka",Update:"Zaktualizuj","Update image URL":"Uaktualnij obraz z adresu URL","Upload failed":"Przesyłanie obrazu nie powiodło się","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.pl=i.pl||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Zmniejsz wcięcie","Increase indent":"Zwiększ wcięcie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.pl=n.pl||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Wybierz język",Language:"Język","Remove language":"Usuń język"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.pl=n.pl||{};o.dictionary=Object.assign(o.dictionary||{},{Downloadable:"Do pobrania","Edit link":"Edytuj odnośnik",Link:"Wstaw odnośnik","Link image":"Wstaw odnośnik do obrazka","Link URL":"Adres URL","Open in a new tab":"Otwórz w nowej zakładce","Open link in new tab":"Otwórz odnośnik w nowej zakładce","This link has no URL":"Nie podano adresu URL odnośnika",Unlink:"Usuń odnośnik"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.pl=e.pl||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Lista wypunktowana","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Lista numerowana","Numbered list styles toolbar":"",Square:"","To-do List":"Lista rzeczy do zrobienia","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.pl=e.pl||{};o.dictionary=Object.assign(o.dictionary||{},{"Align cell text to the bottom":"Wyrównaj tekst w komórce do dołu","Align cell text to the center":"Wyrównaj tekst w komórce do środka","Align cell text to the left":"Wyrównaj tekst w komórce do lewej","Align cell text to the middle":"Wyrównaj tekst w komórce do środka","Align cell text to the right":"Wyrównaj tekst w komórce do prawej","Align cell text to the top":"Wyrównaj tekst w komórce do góry","Align table to the left":"Wyrównaj tabelę do lewej","Align table to the right":"Wyrównaj tabelę do prawej",Alignment:"Wyrównanie",Background:"Tło",Border:"Obramowanie","Cell properties":"Właściwości komórki","Center table":"Wyrównaj tabelę do środka",Color:"Kolor","Color picker":"Wybór koloru",Column:"Kolumna",Dashed:"Kreskowane","Delete column":"Usuń kolumnę","Delete row":"Usuń wiersz",Dimensions:"Wymiary",Dotted:"Kropkowane",Double:"Podwójne","Enter table caption":"",Groove:"Wklęsłe","Header column":"Kolumna nagłówka","Header row":"Wiersz nagłówka",Height:"Wysokość","Horizontal text alignment toolbar":"Pasek narzędzi wyrównania tekstu w poziomie","Insert column left":"Wstaw kolumnę z lewej","Insert column right":"Wstaw kolumnę z prawej","Insert row above":"Wstaw wiersz ponad","Insert row below":"Wstaw wiersz poniżej","Insert table":"Wstaw tabelę",Inset:"Zapadnięte","Justify cell text":"Wyjustuj tekst komórki","Merge cell down":"Scal komórkę w dół","Merge cell left":"Scal komórkę w lewo","Merge cell right":"Scal komórkę w prawo","Merge cell up":"Scal komórkę w górę","Merge cells":"Scal komórki",None:"Brak",Outset:"Wysunięte",Padding:"Dopełnienie",Ridge:"Wypukłe",Row:"Wiersz","Select column":"Zaznacz kolumnę","Select row":"Zaznacz wiersz",Solid:"Ciągłe","Split cell horizontally":"Podziel komórkę poziomo","Split cell vertically":"Podziel komórkę pionowo",Style:"Styl","Table alignment toolbar":"Pasek narzędzi wyrównania tabeli","Table cell text alignment":"Wyrównanie tekstu komórki tabeli","Table properties":"Właściwości tabeli","Table toolbar":"Pasek narzędzi tabel",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Kolor jest niepoprawny. Spróbuj wpisać "#FF0000", "rgb(255,0,0)" lub "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Wartość jest niepoprawna. Spróbuj  wpisać "10px", "2em" lub po prostu "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Pasek narzędzi wyrównania tekstu w pionie",Width:"Szerokość"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const e=o.pl=o.pl||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 z %1",Aquamarine:"Akwamaryna",Black:"Czarny",Blue:"Niebieski",Cancel:"Anuluj","Dim grey":"Ciemnoszary","Dropdown toolbar":"Rozwijany pasek narzędzi","Edit block":"Edytuj blok","Editor toolbar":"Pasek narzędzi edytora",Green:"Zielony",Grey:"Szary","Insert paragraph after block":"Wstaw akapit po bloku","Insert paragraph before block":"Wstaw akapit przed blokiem","Light blue":"Jasnoniebieski","Light green":"Jasnozielony","Light grey":"Jasnoszary",Next:"Następny",Orange:"Pomarańczowy",Previous:"Poprzedni",Purple:"Purpurowy",Red:"Czerwony",Redo:"Ponów","Remove color":"Usuń kolor","Restore default":"Przywróć domyślne","Rich Text Editor":"Edytor tekstu sformatowanego","Rich Text Editor, %0":"Edytor tekstu sformatowanego, %0",Save:"Zapisz","Select all":"Zaznacz wszystko","Show more items":"Pokaż więcej",Turquoise:"Turkusowy",Undo:"Cofnij","Upload in progress":"Trwa przesyłanie",White:"Biały","Widget toolbar":"Pasek widgetów",Yellow:"Żółty"}),e.getPluralForm=function(o){return 1==o?0:o%10>=2&&o%10<=4&&(o%100<12||o%100>14)?1:1!=o&&o%10>=0&&o%10<=1||o%10>=5&&o%10<=9||o%100>=12&&o%100<=14?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/pt-br.js b/core/assets/vendor/ckeditor5/build/translations/pt-br.js
new file mode 100644
index 0000000000..e073f44e72
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/pt-br.js
@@ -0,0 +1 @@
+!function(t){const i=t["pt-br"]=t["pt-br"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Centralizar","Align left":"Alinhar à esquerda","Align right":"Alinhar à direita",Justify:"Justificar","Text alignment":"Alinhamento do texto","Text alignment toolbar":"Ferramentas de alinhamento de texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i["pt-br"]=i["pt-br"]||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Negrito",Code:"Código",Italic:"Itálico",Strikethrough:"Tachado",Subscript:"Subscrito",Superscript:"Sobrescrito",Underline:"Sublinhado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o["pt-br"]=o["pt-br"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Bloco de citação"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const t=o["pt-br"]=o["pt-br"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Choose heading":"Escolha o título",Heading:"Titulo","Heading 1":"Título 1","Heading 2":"Título 2","Heading 3":"Título 3","Heading 4":"Título 4","Heading 5":"Título 5","Heading 6":"Título 6",Paragraph:"Parágrafo","Type or paste your content here.":"Digite ou cole o conteúdo aqui.","Type your title":"Digite o título"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i["pt-br"]=i["pt-br"]||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Linha horizontal"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e["pt-br"]=e["pt-br"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Imagem centralizada","Change image text alternative":"Alterar texto alternativo da imagem","Enter image caption":"Inserir legenda da imagem","Full size image":"Imagem completa","Image resize list":"Lista de redimensionamento de imagem","Image toolbar":"Ferramentas de Imagem","image widget":"Ferramenta de imagem","In line":"",Insert:"Inserir","Insert image":"Inserir imagem","Insert image via URL":"Inserir imagem via URL","Left aligned image":"Imagem alinhada à esquerda",Original:"Original","Resize image":"Redimensionar imagem","Resize image to %0":"Redimensionar a imagem para 0%","Resize image to the original size":"Redimensionar a imagem para o tamanho original","Right aligned image":"Imagem alinhada à direita","Side image":"Imagem lateral","Text alternative":"Texto alternativo",Update:"Atualizar","Update image URL":"","Upload failed":"Falha ao subir arquivo","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["pt-br"]=n["pt-br"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Diminuir indentação","Increase indent":"Aumentar indentação"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["pt-br"]=n["pt-br"]||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Pode ser baixado","Edit link":"Editar link",Link:"Link","Link image":"Link da imagem","Link URL":"URL","Open in a new tab":"Abrir em nova aba","Open link in new tab":"Abrir link em nova aba","This link has no URL":"Este link não possui uma URL",Unlink:"Remover link"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e["pt-br"]=e["pt-br"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Lista com marcadores","Bulleted list styles toolbar":"Barra de ferramentas de estilos de lista com marcador",Circle:"Círculo",Decimal:"Decimal","Decimal with leading zero":"Decimal com zero à esquerda",Disc:"Disco","Lower-latin":"Latim inferior","Lower–roman":"Romano inferior","Numbered List":"Lista numerada","Numbered list styles toolbar":"Barra de ferramentas de estilos de lista numerada",Square:"Quadrado","To-do List":"Lista de Tarefas","Toggle the circle list style":"Alternar o estilo da lista de círculo","Toggle the decimal list style":"Alternar o estilo de lista decimal","Toggle the decimal with leading zero list style":"Alternar o decimal com estilo de lista zero à esquerda","Toggle the disc list style":"Alternar o estilo da lista de disco","Toggle the lower–latin list style":"Alternar o estilo de lista latina inferior","Toggle the lower–roman list style":"Alternar o estilo de lista romana inferior","Toggle the square list style":"Alternar o estilo de lista quadrada","Toggle the upper–latin list style":"Alternar o estilo de lista latino superior","Toggle the upper–roman list style":"Alternar o estilo de lista romana superior","Upper-latin":"Latim superior","Upper-roman":"Romano superior"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e["pt-br"]=e["pt-br"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Align cell text to the bottom":"Alinhar texto da célula para baixo","Align cell text to the center":"Alinhar texto da célula centralizado","Align cell text to the left":"Alinhar texto da célula para a esquerda","Align cell text to the middle":"Alinhar texto da célula para o meio","Align cell text to the right":"Alinhar texto da célula para a direita","Align cell text to the top":"Alinhar texto da célula para o topo","Align table to the left":"Alinhar tabela para esquerda","Align table to the right":"Alinhar tabela para direita",Alignment:"Alinhamento",Background:"Cor de fundo",Border:"Borda","Cell properties":"Propriedades da célula","Center table":"Centralizar tabela",Color:"Cor","Color picker":"Seletor de cor",Column:"Coluna",Dashed:"Tracejada","Delete column":"Excluir coluna","Delete row":"Excluir linha",Dimensions:"Dimensões",Dotted:"Pontilhada",Double:"Dupla","Enter table caption":"",Groove:"Ranhura","Header column":"Coluna de cabeçalho","Header row":"Linha de cabeçalho",Height:"Altura","Horizontal text alignment toolbar":"Ferramentas de alinhamento horizontal do texto","Insert column left":"Inserir coluna à esquerda","Insert column right":"Inserir coluna à direita","Insert row above":"Inserir linha acima","Insert row below":"Inserir linha abaixo","Insert table":"Inserir tabela",Inset:"Baixo relevo","Justify cell text":"Justificar texto da célula","Merge cell down":"Mesclar abaixo","Merge cell left":"Mesclar à esquerda","Merge cell right":"Mesclar à direita","Merge cell up":"Mesclar acima","Merge cells":"Mesclar células",None:"Sem borda",Outset:"Alto relevo",Padding:"Margem interna",Ridge:"Crista",Row:"Linha","Select column":"Selecionar coluna","Select row":"Selecionar linha",Solid:"Sólida","Split cell horizontally":"Dividir horizontalmente","Split cell vertically":"Dividir verticalmente",Style:"Estilo","Table alignment toolbar":"Ferramentas de alinhamento da tabela","Table cell text alignment":"Alinhamento do texto na célula","Table properties":"Propriedades da tabela","Table toolbar":"Ferramentas de Tabela",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Cor inválida. Tente "#FF0000" ou "rgb(255,0,0)" ou "red"','The value is invalid. Try "10px" or "2em" or simply "2".':'Valor inválido. Tente "10px" ou "2em" ou apenas "2"',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Ferramentas de alinhamento vertical do texto",Width:"Largura"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(r){const e=r["pt-br"]=r["pt-br"]||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 de %1",Aquamarine:"Água-marinha",Black:"Preto",Blue:"Azul",Cancel:"Cancelar","Dim grey":"Cinza escuro","Dropdown toolbar":"Barra de Ferramentas da Lista Suspensa","Edit block":"Editor de bloco","Editor toolbar":"Ferramentas do Editor",Green:"Verde",Grey:"Cinza","Insert paragraph after block":"Inserir parágrafo após o bloco","Insert paragraph before block":"Inserir parágrafo antes do bloco","Light blue":"Azul claro","Light green":"Verde claro","Light grey":"Cinza claro",Next:"Próximo",Orange:"Laranja",Previous:"Anterior",Purple:"Púrpura",Red:"Vermelho",Redo:"Refazer","Remove color":"Remover cor","Restore default":"","Rich Text Editor":"Editor de Formatação","Rich Text Editor, %0":"Editor de Formatação, %0",Save:"Salvar","Select all":"Selecionar tudo","Show more items":"Exibir mais itens",Turquoise:"Turquesa",Undo:"Desfazer","Upload in progress":"Enviando dados",White:"Branco","Widget toolbar":"Ferramentas de Widgets",Yellow:"Amarelo"}),e.getPluralForm=function(r){return r>1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/pt.js b/core/assets/vendor/ckeditor5/build/translations/pt.js
new file mode 100644
index 0000000000..9339e80932
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/pt.js
@@ -0,0 +1 @@
+!function(t){const n=t.pt=t.pt||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Alinhar ao centro","Align left":"Alinhar à esquerda","Align right":"Alinhar à direita",Justify:"Justificar","Text alignment":"Alinhamento de texto","Text alignment toolbar":"Ferramentas de alinhamento de texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.pt=i.pt||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Negrito",Code:"Código",Italic:"Itálico",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.pt=a.pt||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"",Heading:"Cabeçalho","Heading 1":"Cabeçalho 1","Heading 2":"Cabeçalho 2","Heading 3":"Cabeçalho 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Parágrafo","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.pt=e.pt||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Imagem centrada","Change image text alternative":"","Enter image caption":"Indicar legenda da imagem","Full size image":"Imagem em tamanho completo","Image resize list":"","Image toolbar":"","image widget":"módulo de imagem","In line":"",Insert:"","Insert image":"Inserir imagem","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"Imagem lateral","Text alternative":"Texto alternativo",Update:"","Update image URL":"","Upload failed":"Falha ao carregar","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.pt=i.pt||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"","Edit link":"",Link:"Hiperligação","Link image":"","Link URL":"URL da ligação","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"Desligar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.pt=e.pt||{};t.dictionary=Object.assign(t.dictionary||{},{"Bulleted List":"Lista não ordenada","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Lista ordenada","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.pt=e.pt||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Cancelar","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Refazer","Remove color":"","Restore default":"","Rich Text Editor":"Editor de texto avançado","Rich Text Editor, %0":"Editor de texto avançado, %0",Save:"Guardar","Show more items":"",Turquoise:"",Undo:"Desfazer",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/ro.js b/core/assets/vendor/ckeditor5/build/translations/ro.js
new file mode 100644
index 0000000000..9094420c21
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/ro.js
@@ -0,0 +1 @@
+!function(i){const n=i.ro=i.ro||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Aliniază la centru","Align left":"Aliniază la stânga","Align right":"Aliniază la dreapta",Justify:"Aliniază stânga-dreapta","Text alignment":"Aliniere text","Text alignment toolbar":"Bara aliniere text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ro=i.ro||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Îngroșat",Code:"Cod",Italic:"Cursiv",Strikethrough:"Tăiere text cu o linie",Subscript:"Indice",Superscript:"Exponent",Underline:"Subliniat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.ro=o.ro||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Bloc citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.ro=i.ro||{};t.dictionary=Object.assign(t.dictionary||{},{"Choose heading":"Alege titlu",Heading:"Titlu","Heading 1":"Titlu 1","Heading 2":"Titlu 2","Heading 3":"Titlu 3","Heading 4":"Titlu 4","Heading 5":"Titlu 5","Heading 6":"Titlu 6",Paragraph:"Paragraf","Type or paste your content here.":"Scrie sau inserează aici conținutul tău","Type your title":"Scrie titlul tău"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ro=i.ro||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Linie orizontală"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const e=i.ro=i.ro||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"","Centered image":"Imagine aliniată pe centru","Change image text alternative":"Schimbă textul alternativ al imaginii","Enter image caption":"Introdu titlul descriptiv al imaginii","Full size image":"Imagine mărime completă","Image resize list":"Lista cu mărimi de redimensionare","Image toolbar":"Bară imagine","image widget":"widget imagine","In line":"",Insert:"Inserează","Insert image":"Inserează imagine","Insert image via URL":"Inserează o imagine via URL","Left aligned image":"Imagine aliniată la stânga",Original:"Original","Resize image":"Redimensionează imaginea","Resize image to %0":"Redimensionează imaginea la %0","Resize image to the original size":"Redimensionează imaginea la mărimea originală","Right aligned image":"Imagine aliniată la dreapta","Side image":"Imagine laterală","Text alternative":"Text alternativ",Update:"Actualizează","Update image URL":"Actualizează o imagine via URL","Upload failed":"Încărcare eșuată","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ro=n.ro||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Micșorează indent","Increase indent":"Mărește indent"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.ro=a.ro||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose language":"Alege limba",Language:"Limbă","Remove language":"Șterge limba"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ro=n.ro||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Descărcabil","Edit link":"Modifică link",Link:"Link","Link image":"Link imagine","Link URL":"Link URL","Open in a new tab":"Deschide în tab nou","Open link in new tab":"Deschide link în tab nou","This link has no URL":"Acest link nu are niciun URL",Unlink:"Șterge link"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const i=t.ro=t.ro||{};i.dictionary=Object.assign(i.dictionary||{},{"Bulleted List":"Listă cu puncte","Bulleted list styles toolbar":"Toolbar Listă cu puncte",Circle:"Cerc",Decimal:"Număr","Decimal with leading zero":"Număr cu zero la început ",Disc:"Disc","Lower-latin":"Litere mici latine","Lower–roman":"Litere mici romane","Numbered List":"Listă numerotată","Numbered list styles toolbar":"Toolbar Listă numerotată",Square:"Pătrat","To-do List":"Listă cu activități","Toggle the circle list style":"Comutați stilul la lista cu cercuri","Toggle the decimal list style":"Comutați stilul la lista cu numere","Toggle the decimal with leading zero list style":"Comutați stilul la lista cu numere cu zero la început","Toggle the disc list style":"Comutați stilul la lista cu discuri","Toggle the lower–latin list style":"Comutați stilul la lista cu litere mici latine","Toggle the lower–roman list style":"Comutați stilul la lista cu litere mici romane","Toggle the square list style":"Comutați stilul la lista cu pătrate","Toggle the upper–latin list style":"Comutați stilul la lista cu litere mari latine","Toggle the upper–roman list style":"Comutați stilul la lista cu litere mari romane","Upper-latin":"Litere mari latine","Upper-roman":"Litere mari romane"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ro=e.ro||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Alinează textul celulei jos","Align cell text to the center":"Alinează textul celulei la centru","Align cell text to the left":"Alinează textul celulei la stânga","Align cell text to the middle":"Alinează textul celulei la mijloc","Align cell text to the right":"Alinează textul celulei la dreapta","Align cell text to the top":"Alinează textul celulei sus","Align table to the left":"Alinează tabela la stânga","Align table to the right":"Alinează tabela la dreapta",Alignment:"Aliniere",Background:"Fundal",Border:"Bordură","Cell properties":"Proprietățile celulei","Center table":"Tabelă centrată",Color:"Culoare","Color picker":"Alegere culoare",Column:"Coloană",Dashed:"Linii întrerupte","Delete column":"Șterge coloană","Delete row":"Șterge rând",Dimensions:"Dimensiuni",Dotted:"Punctată",Double:"Dublă","Enter table caption":"Adaugă subtitlul tabelei",Groove:"Groove","Header column":"Antet coloană","Header row":"Rând antet",Height:"Înălțime","Horizontal text alignment toolbar":"Toolbar aliniere text orizontală","Insert column left":"Inserează coloană la stânga","Insert column right":"Inserează coloană la dreapta","Insert row above":"Inserează rând deasupra","Insert row below":"Inserează rând dedesubt","Insert table":"Inserează tabel",Inset:"Inserează","Justify cell text":"Textul celulei justify","Merge cell down":"Îmbină celula în jos","Merge cell left":"Îmbină celula la stânga","Merge cell right":"Îmbină celula la dreapta","Merge cell up":"Îmbină celula în sus","Merge cells":"Îmbină celulele",None:"Nimic",Outset:"Elimină",Padding:"Spațiere",Ridge:"Crestată",Row:"Rând","Select column":"Selectează coloana","Select row":"Selectează linia",Solid:"Solidă","Split cell horizontally":"Scindează celula pe orizontală","Split cell vertically":"Scindează celula pe verticală",Style:"Stil","Table alignment toolbar":"Toolbar aliniere tabelă","Table cell text alignment":"Alinierea textului celulei tabelei","Table properties":"Proprietățile tabelei","Table toolbar":"Bară tabel",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Culoarea este invalidă. Încearcă "#FF0000" sau "rgb(255,0,0)" sau "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Valoarea este invalidă. Încearcă "10px" sau "2em" sau simplu "2".',"Toggle caption off":"Dezactivați subtitlul","Toggle caption on":"Activați subtitlul","Vertical text alignment toolbar":"Toolbar aliniere text verticală",Width:"Lungime"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.ro=e.ro||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 din %1",Aquamarine:"Acvamarin",Black:"Negru",Blue:"Albastru",Cancel:"Anulare","Dim grey":"Gri slab","Dropdown toolbar":"Bară listă opțiuni","Edit block":"Editează bloc","Editor toolbar":"Bară editor",Green:"Verde",Grey:"Gri","Insert paragraph after block":"Inserează un paragraf după bloc","Insert paragraph before block":"Inserează un paragraf înaintea blocului","Light blue":"Albastru deschis","Light green":"Verde deschis","Light grey":"Gri deschis",Next:"Înainte",Orange:"Portocaliu",Previous:"Înapoi",Purple:"Violet",Red:"Roșu",Redo:"Revenire","Remove color":"Șterge culoare","Restore default":"Reface la default","Rich Text Editor":"Editor de text","Rich Text Editor, %0":"Editor de text, %0",Save:"Salvare","Select all":"Selectează-le pe toate","Show more items":"Arată mai multe elemente",Turquoise:"Turcoaz",Undo:"Anulare","Upload in progress":"Încărcare în curs",White:"Alb","Widget toolbar":"Bară widget",Yellow:"Galben"}),r.getPluralForm=function(e){return 1==e?0:e%100>19||e%100==0&&0!=e?2:1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/ru.js b/core/assets/vendor/ckeditor5/build/translations/ru.js
new file mode 100644
index 0000000000..ba1471dac9
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/ru.js
@@ -0,0 +1 @@
+!function(n){const i=n.ru=n.ru||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Выравнивание по центру","Align left":"Выравнивание по левому краю","Align right":"Выравнивание по правому краю",Justify:"Выравнивание по ширине","Text alignment":"Выравнивание текста","Text alignment toolbar":"Выравнивание"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Жирный",Code:"Исходный код",Italic:"Курсив",Strikethrough:"Зачеркнутый",Subscript:"Подстрочный",Superscript:"Надстрочный",Underline:"Подчеркнутый"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитата"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ru=n.ru||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Выбор стиля",Heading:"Стиль","Heading 1":"Заголовок 1","Heading 2":"Заголовок 2","Heading 3":"Заголовок 3","Heading 4":"Заголовок 4","Heading 5":"Заголовок 5","Heading 6":"Заголовок 6",Paragraph:"Параграф","Type or paste your content here.":"Введите или вставьте сюда ваш текст","Type your title":"Введите заголовок"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Горизонтальная линия"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ru=e.ru||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"Разрывать текст","Centered image":"Выравнивание по центру","Change image text alternative":"Редактировать альтернативный текст","Enter image caption":"Подпись к изображению","Full size image":"Оригинальный размер изображения","Image resize list":"Список размеров","Image toolbar":"Панель инструментов изображения","image widget":"Виджет изображений","In line":"В тексте",Insert:"Вставить","Insert image":"Вставить изображение","Insert image via URL":"Вставить изображение по URL","Left aligned image":"Выравнивание по левому краю",Original:"Оригинальный","Resize image":"Изменить размер изображения","Resize image to %0":"Изменить размер изображения до %0","Resize image to the original size":"Вернуть размер изображения к оригинальному","Right aligned image":"Выравнивание по правому краю","Side image":"Боковое изображение","Text alternative":"Альтернативный текст",Update:"Изменить","Update image URL":"Изменить URL изображения","Upload failed":"Загрузка не выполнена","Wrap text":"Обтекать текст"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ru=n.ru||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Уменьшить отступ","Increase indent":"Увеличить отступ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.ru=n.ru||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Выбрать язык",Language:"Язык","Remove language":"Убрать язык"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ru=n.ru||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Загружаемые","Edit link":"Редактировать ссылку",Link:"Ссылка","Link image":"Ссылка на изображение","Link URL":"Ссылка URL","Open in a new tab":"Открыть в новой вкладке","Open link in new tab":"Открыть ссылку в новой вкладке","This link has no URL":"Для этой ссылки не установлен адрес URL",Unlink:"Убрать ссылку"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ru=e.ru||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Маркированный список","Bulleted list styles toolbar":"Стили маркированного списка",Circle:"Окружность",Decimal:"Десятичный","Decimal with leading zero":"Десятичный с ведущим нулем",Disc:"Диск","Lower-latin":"Малые латинские","Lower–roman":"Малые римские","Numbered List":"Нумерованный список","Numbered list styles toolbar":"Стили нумерованного списка",Square:"Квадрат","To-do List":"Список задач","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"Большие латинские","Upper-roman":"Большие римские"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"HTML редактор"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ru=e.ru||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Выровнять текст ячейки по нижнему краю","Align cell text to the center":"Выровнять текст по центру","Align cell text to the left":"Выровнять текст по левому краю","Align cell text to the middle":"Выровнять текст ячейки по центру","Align cell text to the right":"Выровнять текст по правому краю","Align cell text to the top":"Выровнять текст ячейки по верхнему краю","Align table to the left":"Выровнять таблицу по левому краю","Align table to the right":"Выровнять таблицу по правому краю",Alignment:"Выравнивание",Background:"Фон",Border:"Граница","Cell properties":"Свойства ячейки","Center table":"Выровнять таблицу по центру",Color:"Цвет","Color picker":"Выбор цвета",Column:"Столбец",Dashed:"Пунктирная","Delete column":"Удалить столбец","Delete row":"Удалить строку",Dimensions:"Размеры",Dotted:"Точечная",Double:"Двойная","Enter table caption":"Подпись таблицы",Groove:"Желобчатая","Header column":"Столбец заголовков","Header row":"Строка заголовков",Height:"Высота","Horizontal text alignment toolbar":"Панель инструментов горизонтального выравнивания текста","Insert column left":"Вставить столбец слева","Insert column right":"Вставить столбец справа","Insert row above":"Вставить строку выше","Insert row below":"Вставить строку ниже","Insert table":"Вставить таблицу",Inset:"Вдавленная","Justify cell text":"Выровнять текст по ширине","Merge cell down":"Объединить с ячейкой снизу","Merge cell left":"Объединить с ячейкой слева","Merge cell right":"Объединить с ячейкой справа","Merge cell up":"Объединить с ячейкой сверху","Merge cells":"Объединить ячейки",None:"Нет",Outset:"Выпуклая",Padding:"Отступ",Ridge:"Ребристая",Row:"Строка","Select column":"Выбрать столбец","Select row":"Выбрать строку",Solid:"Сплошная","Split cell horizontally":"Разделить ячейку горизонтально","Split cell vertically":"Разделить ячейку вертикально",Style:"Стиль","Table alignment toolbar":"Панель инструментов выравнивания таблицы","Table cell text alignment":"Выравнивание текста в ячейке таблицы","Table properties":"Свойства таблицы","Table toolbar":"Панель инструментов таблицы",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Неверный цвет. Попробуйте "#FF0000" или "rgb(255,0,0)" или "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Неверное значение. Попробуйте "10px" или "2em" или просто "2".',"Toggle caption off":"Выключить описание","Toggle caption on":"Включить описание","Vertical text alignment toolbar":"Панель инструментов вертикального выравнивания текста",Width:"Ширина"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{"HTML object":"HTML объект"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.ru=e.ru||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0 из %1",Aquamarine:"Аквамариновый",Black:"Чёрный",Blue:"Синий",Cancel:"Отмена","Dim grey":"Тёмно-серый","Dropdown toolbar":"Выпадающая панель инструментов","Edit block":"Редактировать блок","Editor toolbar":"Панель инструментов редактора",Green:"Зелёный",Grey:"Серый","Insert paragraph after block":"Вставить параграф после блока","Insert paragraph before block":"Вставить параграф перед блоком","Light blue":"Голубой","Light green":"Салатовый","Light grey":"Светло-серый",Next:"Следующий",Orange:"Оранжевый",Previous:"Предыдущий",Purple:"Фиолетовый",Red:"Красный",Redo:"Повторить","Remove color":"Убрать цвет","Restore default":"По умолчанию","Rich Text Editor":"Редактор","Rich Text Editor, %0":"Редактор, %0",Save:"Сохранить","Select all":"Выбрать все","Show more items":"Другие инструменты",Turquoise:"Бирюзовый",Undo:"Отменить","Upload in progress":"Идёт загрузка",White:"Белый","Widget toolbar":"Панель инструментов виджета",Yellow:"Жёлтый"}),r.getPluralForm=function(e){return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?1:e%10==0||e%10>=5&&e%10<=9||e%100>=11&&e%100<=14?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/si.js b/core/assets/vendor/ckeditor5/build/translations/si.js
new file mode 100644
index 0000000000..e6af8b2a9d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/si.js
@@ -0,0 +1 @@
+!function(i){const n=i.si=i.si||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"තදකුරු",Code:"",Italic:"ඇලකුරු",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.si=e.si||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"","Change image text alternative":"","Enter image caption":"","Full size image":"","Image resize list":"","Image toolbar":"","image widget":"","In line":"",Insert:"","Insert image":"පින්තූරය ඇතුල් කරන්න","Insert image via URL":"","Left aligned image":"",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"","Side image":"","Text alternative":"",Update:"","Update image URL":"","Upload failed":"උඩුගත කිරීම අසාර්ථක විය","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.si=e.si||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"බුලටිත ලැයිස්තුව","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"අංකිත ලැයිස්තුව","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.si=n.si||{};i.dictionary=Object.assign(i.dictionary||{},{Redo:"නැවත කරන්න",Undo:"අහෝසි කරන්න"}),i.getPluralForm=function(n){return 1!=n}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/sk.js b/core/assets/vendor/ckeditor5/build/translations/sk.js
new file mode 100644
index 0000000000..4e775dca4c
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/sk.js
@@ -0,0 +1 @@
+!function(n){const a=n.sk=n.sk||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Zarovnať na stred","Align left":"Zarovnať vľavo","Align right":"Zarovnať vpravo",Justify:"Do bloku","Text alignment":"Zarovnanie textu","Text alignment toolbar":"Panel nástrojov zarovnania textu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sk=n.sk||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Tučné",Code:"Kód",Italic:"Kurzíva",Strikethrough:"Preškrtnuté",Subscript:"Dolný index",Superscript:"Horný index",Underline:"Podčiarknuté"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sk=i.sk||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citát"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const a=i.sk=i.sk||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose heading":"Vyberte nadpis",Heading:"Nadpis","Heading 1":"Nadpis 1","Heading 2":"Nadpis 2","Heading 3":"Nadpis 3","Heading 4":"Nadpis 4","Heading 5":"Nadpis 5","Heading 6":"Nadpis 6",Paragraph:"Odsek","Type or paste your content here.":"Vložte obsah","Type your title":"Vložte nadpis"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sk=i.sk||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Vodorovná čiara"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.sk=e.sk||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Zarovnať na stred","Change image text alternative":"Zmeňte alternatívny text obrázka","Enter image caption":"Vložte popis obrázka","Full size image":"Obrázok v plnej veľkosti","Image resize list":"Zoznam možností zmeny veľkosti","Image toolbar":"Panel nástrojov obrázka","image widget":"widget obrázka","In line":"",Insert:"Vložiť","Insert image":"Vložiť obrázok","Insert image via URL":"Vložiť obrázok pomocou URL","Left aligned image":"Zarovnať vľavo",Original:"Originál","Resize image":"Zmeniť veľkosť obrázka","Resize image to %0":"Zmeniť veľkosť na %0","Resize image to the original size":"Zmeniť veľkosť na pôvodnú","Right aligned image":"Zarovnať vpravo","Side image":"Bočný obrázok","Text alternative":"Alternatívny text",Update:"Aktualizovať","Update image URL":"Aktualizovať URL obrázka","Upload failed":"Nahrávanie zlyhalo","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sk=n.sk||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Zmenšiť odsadenie","Increase indent":"Zväčšiť odsadenie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const n=a.sk=a.sk||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose language":"Vybrať jazyk",Language:"Jazyk","Remove language":"Odstrániť jazyk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sk=n.sk||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Na stiahnutie","Edit link":"Upraviť odkaz",Link:"Odkaz","Link image":"Adresa obrázku","Link URL":"URL adresa","Open in a new tab":"Otvoriť v novej záložke","Open link in new tab":"Otvoriť odkaz v novom okne","This link has no URL":"Tento odkaz nemá nastavenú URL adresu",Unlink:"Zrušiť odkaz"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.sk=e.sk||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Zoznam s odrážkami","Bulleted list styles toolbar":"Panel zoznamu s odrážkami",Circle:"Kruh",Decimal:"Čísla","Decimal with leading zero":"Čísla s nulou na začiatku",Disc:"Plný kruh","Lower-latin":"Malé písmená","Lower–roman":"Malé rímske čísla","Numbered List":"Číslovaný zoznam","Numbered list styles toolbar":"Panel so štýlmi číslovaného zoznamu",Square:"Štvorec","To-do List":"To-do zoznam","Toggle the circle list style":"Prepnúť na zoznam s kruhovým označením","Toggle the decimal list style":"Prepnúť na číselný zoznam","Toggle the decimal with leading zero list style":"Prepnúť na číselný zoznam s nulou na začiatku","Toggle the disc list style":"Prepnúť na zoznam s označením plného kruhu","Toggle the lower–latin list style":"Prepnúť na zoznam s malými písmenami","Toggle the lower–roman list style":"Prepnúť na zoznam s malými rímskymi číslami","Toggle the square list style":"Prepnúť na zoznam so štvorcovým označením","Toggle the upper–latin list style":"Prepnúť na zoznam s veľkými písmenami","Toggle the upper–roman list style":"Prepnúť na zoznam s veľkými rímskymi číslami","Upper-latin":"Veľké písmená","Upper-roman":"Veľké rímske čísla"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.sk=e.sk||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Zarovnať text bunky nadol","Align cell text to the center":"Zarovnať text bunky na stred","Align cell text to the left":"Zarovnať text bunky doľava","Align cell text to the middle":"Zarovnať text bunky na stred","Align cell text to the right":"Zarovnať text bunky doprava","Align cell text to the top":"Zarovnať text bunky nahor","Align table to the left":"Zarovnať tabuľku doľava","Align table to the right":"Zarovnať tabuľku doprava",Alignment:"Zarovnanie",Background:"Pozadie",Border:"Orámovanie","Cell properties":"Vlastnosti bunky","Center table":"Centrovať tabuľku",Color:"Farba","Color picker":"Vybrať farbu",Column:"Stĺpec",Dashed:"Čiarkovaná","Delete column":"Odstrániť stĺpec","Delete row":"Odstrániť riadok",Dimensions:"Rozmery",Dotted:"Bodkovaná",Double:"Dvojitá","Enter table caption":"",Groove:"Drážkovaná","Header column":"Stĺpec hlavičky","Header row":"Riadok hlavičky",Height:"Výška","Horizontal text alignment toolbar":"Horizontálne zarovnanie textu v panely","Insert column left":"Vložiť stĺpec vľavo","Insert column right":"Vložiť stĺpec vpravo","Insert row above":"Vložiť riadok nad","Insert row below":"Vložiť riadok pod","Insert table":"Vložiť tabuľku",Inset:"Vložená z vnútra","Justify cell text":"Zarovnať text bunky z oboch strán","Merge cell down":"Zlúčiť bunku dole","Merge cell left":"Zlúčiť bunku vľavo","Merge cell right":"Zlúčiť bunku vpravo","Merge cell up":"Zlúčiť bunku hore","Merge cells":"Zlúčiť bunky",None:"Žiadna",Outset:"Vložená zvonku",Padding:"Vnútorný okraj",Ridge:"Rámovaná",Row:"Riadok","Select column":"Vybrať stĺpec","Select row":"Vybrať riadok",Solid:"Plná","Split cell horizontally":"Rozdeliť bunku vodorovne","Split cell vertically":"Rozdeliť bunku zvislo",Style:"Štýl","Table alignment toolbar":"Panel zarovnania tabuľky","Table cell text alignment":"Zarovnanie textu v bunke","Table properties":"Vlastnosti tabuľky","Table toolbar":"Panel nástrojov tabuľky",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Farba má nesprávny formát. Skúste "#FF0000", "rgb(255,0,0)" alebo "red".','The value is invalid. Try "10px" or "2em" or simply "2".':'Hodnota je nesprávna. Skúste "10px", "2em" alebo jednoducho "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Vertikálne zarovnanie textu v panely",Width:"Šírka"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const e=o.sk=o.sk||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 z %1",Aquamarine:"Akvamarínová",Black:"Čierna",Blue:"Modrá",Cancel:"Zrušiť","Dim grey":"Tmavosivá","Dropdown toolbar":"Panel nástrojov roletového menu","Edit block":"Upraviť odsek","Editor toolbar":"Panel nástrojov editora",Green:"Zelená",Grey:"Sivá","Insert paragraph after block":"Vložiť odstavec za blok","Insert paragraph before block":"Vložiť odstavec pred blok","Light blue":"Bledomodrá","Light green":"Bledozelená","Light grey":"Bledosivá",Next:"Ďalšie",Orange:"Oranžová",Previous:"Predchádzajúce",Purple:"Fialová",Red:"Červená",Redo:"Znova","Remove color":"Zrušiť farbu","Restore default":"","Rich Text Editor":"Editor s formátovaním","Rich Text Editor, %0":"Editor s formátovaním, %0",Save:"Uložiť","Select all":"Označiť všetko","Show more items":"Zobraziť viac položiek",Turquoise:"Tyrkysová",Undo:"Späť","Upload in progress":"Prebieha nahrávanie",White:"Biela","Widget toolbar":"Panel nástrojov ovládacieho prvku",Yellow:"Žltá"}),e.getPluralForm=function(o){return o%1==0&&1==o?0:o%1==0&&o>=2&&o<=4?1:o%1!=0?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/sl.js b/core/assets/vendor/ckeditor5/build/translations/sl.js
new file mode 100644
index 0000000000..60bc2569f0
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/sl.js
@@ -0,0 +1 @@
+!function(a){const n=a.sl=a.sl||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Sredinska poravnava","Align left":"Poravnava levo","Align right":"Poravnava desno",Justify:"Postavi na sredino","Text alignment":"Poravnava besedila","Text alignment toolbar":"Orodna vrstica besedila"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const i=o.sl=o.sl||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Krepko",Code:"Koda",Italic:"Poševno",Strikethrough:"Prečrtano",Subscript:"Naročnik",Superscript:"Nadpis",Underline:"Podčrtaj"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.sl=i.sl||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blokiraj citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const i=a.sl=a.sl||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Izberi naslov",Heading:"Naslov","Heading 1":"Naslov 1","Heading 2":"Naslov 2","Heading 3":"Naslov 3","Heading 4":"Naslov 4","Heading 5":"Naslov 5","Heading 6":"Naslov 6",Paragraph:"Odstavek","Type or paste your content here.":"Vnesi ali prilepi vsebino","Type your title":"Vnesi naslov"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sl=n.sl||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Vodoravna črta"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.sl=e.sl||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"Akvamarin",Black:"Črna",Blue:"Modra",Cancel:"Prekliči","Dim grey":"Temno siva","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"Zelena",Grey:"Siva","Light blue":"Svetlo modra","Light green":"Svetlo zelena","Light grey":"Svetlo siva",Next:"",Orange:"Oranžna",Previous:"",Purple:"Vijolična",Red:"Rdeča","Remove color":"Odstrani barvo","Restore default":"","Rich Text Editor":"","Rich Text Editor, %0":"",Save:"Shrani","Show more items":"",Turquoise:"Turkizna",White:"Bela",Yellow:"Rumena"}),o.getPluralForm=function(e){return e%100==1?0:e%100==2?1:e%100==3||e%100==4?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/sq.js b/core/assets/vendor/ckeditor5/build/translations/sq.js
new file mode 100644
index 0000000000..9e3a0a94ab
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/sq.js
@@ -0,0 +1 @@
+!function(t){const i=t.sq=t.sq||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Radhit në mes","Align left":"Radhit majtas","Align right":"Radhit djathtas",Justify:"Plotësim","Text alignment":"Radhitja e tekstit","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sq=i.sq||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Trash",Code:"Kod",Italic:"Pjerrtë",Strikethrough:"Vi në mes",Subscript:"",Superscript:"",Underline:"Nënvizuar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.sq=n.sq||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Thonjëzat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sq=i.sq||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Përzgjidh nëntitullin",Heading:"Nëntitulli","Heading 1":"Nëntitulli 1","Heading 2":"Nëntitulli 2","Heading 3":"Nëntitulli 3","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"Paragrafi","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.sq=e.sq||{};t.dictionary=Object.assign(t.dictionary||{},{"Break text":"","Centered image":"Foto e vendosur në mes","Change image text alternative":"Ndrysho tekstin zgjedhor të fotos","Enter image caption":"Shto përshkrimin e fotos","Full size image":"Foto me madhësi të plotë","Image resize list":"","Image toolbar":"","image widget":"Vegla e fotos","In line":"",Insert:"","Insert image":"Shto Foto","Insert image via URL":"","Left aligned image":"Foto e vendosur majtas",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Foto e vendosur djathtas","Side image":"Foto anësore","Text alternative":"Teksti zgjedhor",Update:"","Update image URL":"","Upload failed":"Ngarkimi dështoi","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sq=n.sq||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"Redakto nyjën",Link:"Shto nyjën","Link image":"","Link URL":"Nyja e URL-së","Open in a new tab":"","Open link in new tab":"Hap nyjën në faqe të re","This link has no URL":"Kjo nyje nuk ka URL",Unlink:"Largo nyjën"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.sq=e.sq||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Listë me Pika","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Listë me Numra","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const e=t.sq=t.sq||{};e.dictionary=Object.assign(e.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Kolona",Dashed:"","Delete column":"Gris kolonën","Delete row":"Grish rreshtin",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Kolona e kokës","Header row":"Rreshti i kokës",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"Shto rresht sipër","Insert row below":"Shto rresht poshtë","Insert table":"Shto tabelë",Inset:"","Justify cell text":"","Merge cell down":"Bashko kutizat poshtë","Merge cell left":"Bashko kutizat majtas","Merge cell right":"Bashko kutizat djathtas","Merge cell up":"Bashko kutizat sipër","Merge cells":"Bashko kutizat",None:"",Outset:"",Padding:"",Ridge:"",Row:"Rreshti","Select column":"","Select row":"",Solid:"","Split cell horizontally":"Ndaj kutizat horizontalisht","Split cell vertically":"Ndajë kutizat vertikalisht",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.sq=e.sq||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Anulo","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Ribëj","Remove color":"","Restore default":"","Rich Text Editor":"Redaktues i Tekstit të Pasur","Rich Text Editor, %0":"Redaktues i Tekstit të Pasur, %0",Save:"Ruaj","Show more items":"",Turquoise:"",Undo:"Rikthe","Upload in progress":"Duke ngarkuar",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/sr-latn.js b/core/assets/vendor/ckeditor5/build/translations/sr-latn.js
new file mode 100644
index 0000000000..32f95fa160
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/sr-latn.js
@@ -0,0 +1 @@
+!function(n){const a=n["sr-latn"]=n["sr-latn"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Centralno ravnanje","Align left":"Levo ravnanje","Align right":"Desno ravnanje",Justify:"Obostrano ravnanje","Text alignment":"Ravnanje teksta","Text alignment toolbar":"Alatke za ravnanje teksta"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n["sr-latn"]=n["sr-latn"]||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Podebljano",Code:"Kod",Italic:"Kurziv",Strikethrough:"Precrtan",Subscript:"Index dole",Superscript:"Index gore",Underline:"Podvučen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const t=n["sr-latn"]=n["sr-latn"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const i=a["sr-latn"]=a["sr-latn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Choose heading":"Odredi stil",Heading:"Stilovi","Heading 1":"Naslov 1","Heading 2":"Naslov 2","Heading 3":"Naslov 3","Heading 4":"Naslov 4","Heading 5":"Naslov 5","Heading 6":"Naslov 6",Paragraph:"Pasus","Type or paste your content here.":"Upišite ili nalepite naslov","Type your title":"Odredite naslov"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["sr-latn"]=n["sr-latn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Horizontalna razdelna linija"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const e=i["sr-latn"]=i["sr-latn"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"","Centered image":"Slika u sredini","Change image text alternative":"Izmena alternativnog teksta","Enter image caption":"Odredi tekst ispod slike","Full size image":"Slika u punoj veličini","Image resize list":"Lista veličine slike","Image toolbar":"Slika traka sa alatkama","image widget":"modul sa slikom","In line":"",Insert:"Ubaci","Insert image":"Dodaj sliku","Insert image via URL":"Ubaci sliku preko URL-a","Left aligned image":"Leva slika",Original:"Original","Resize image":"Promenite veličinu slike","Resize image to %0":"Promenite veličinu slike na% 0","Resize image to the original size":"Promenite veličinu slike do originalne veličine","Right aligned image":"Desna slika","Side image":"Bočna slika","Text alternative":"Alternativni tekst",Update:"Ažuriraj","Update image URL":"Ažuriraj URL slike","Upload failed":"Postavljanje neuspešno","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n["sr-latn"]=n["sr-latn"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Smanji uvlačenje","Increase indent":"Povećaj uclačenje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n["sr-latn"]=n["sr-latn"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Izaberi jezik",Language:"Jezik","Remove language":"Odstrani jezik"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["sr-latn"]=n["sr-latn"]||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Moguće preuzimanje","Edit link":"Ispravi link",Link:"Link","Link image":"Link slike","Link URL":"URL link","Open in a new tab":"Otvori u novoj kartici","Open link in new tab":"Otvori link u novom prozoru","This link has no URL":"Link ne sadrži URL",Unlink:"Оtkloni link"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const e=i["sr-latn"]=i["sr-latn"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Bulleted List":"Nabrajane liste","Bulleted list styles toolbar":"Traka sa alatkama za nabrajane liste",Circle:"Krug",Decimal:"Decimala","Decimal with leading zero":"Decimalni broj sa nulom na početku",Disc:"Disk","Lower-latin":"Donji - latinski","Lower–roman":"Donji - rimski","Numbered List":"Lista sa brojevima","Numbered list styles toolbar":"Traka sa altakama za liste sa brojevima",Square:"Kvadrat","To-do List":"Lista obaveza","Toggle the circle list style":"Uključite / isključite stil liste krugova","Toggle the decimal list style":"Uključi / isključi stil dekadne liste","Toggle the decimal with leading zero list style":"Prebaci decimalni znak sa vodećim stilom liste nula","Toggle the disc list style":"Uključite / isključite stil liste diskova","Toggle the lower–latin list style":"Uključite / isključite stil donje liste latinice","Toggle the lower–roman list style":"Uključite / isključite stil donje rimske liste","Toggle the square list style":"Uključite / isključite stil liste kvadrata","Toggle the upper–latin list style":"Uključite / isključite stil gornje liste latinice","Toggle the upper–roman list style":"Uključite / isključite stil gornje rimske liste","Upper-latin":"Gornji - latinski","Upper-roman":"Gornji - rimski"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e["sr-latn"]=e["sr-latn"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Align cell text to the bottom":"Poravnajte tekst ćelije prema dole","Align cell text to the center":"Poravnajte tekst ćelije u sredinu","Align cell text to the left":"Poravnajte tekst ćelije levo","Align cell text to the middle":"Poravnajte tekst ćelije u sredinu","Align cell text to the right":"Poravnajte tekst ćelije desno","Align cell text to the top":"Poravnajte tekst ćelije prema gore","Align table to the left":"Poravnajte tabelu na levu stranu","Align table to the right":"Poravnajte tabelu na desnu stranu",Alignment:"Poravnanje",Background:"Pozadina",Border:"Granica","Cell properties":"Svojstva ćelije","Center table":"Centar tabele",Color:"Boja","Color picker":"Birač boja",Column:"Kolona",Dashed:"Razbijeno","Delete column":"Briši kolonu","Delete row":"Briši red",Dimensions:"Dimenzija",Dotted:"Sa tačkama",Double:"Dvostruki","Enter table caption":"",Groove:"Kolosek","Header column":"Kolona za zaglavlje","Header row":"Red za zaglavlje",Height:"Visina","Horizontal text alignment toolbar":"Horizontalna traka sa alatkama za  poravnavanje teksta","Insert column left":"Dodaj kolonu levo","Insert column right":"Dodaj kolonu desno","Insert row above":"Dodaj red iznad","Insert row below":"Dodaj red ispod","Insert table":"Dodaj tabelu",Inset:"Prilog","Justify cell text":"Opravdajte tekst ćelije","Merge cell down":"Spoj ćelije na dole","Merge cell left":"Spoj ćelije na levo","Merge cell right":"Spoj ćelije na desno","Merge cell up":"Spoj ćelije na gore","Merge cells":"Spoj ćelije",None:"Nijedan",Outset:"Početak",Padding:"Postavljanje",Ridge:"Greben",Row:"Red","Select column":"Odaberi kolonu","Select row":"Odaberi red",Solid:"Čvrst","Split cell horizontally":"Deli ćelije vodoravno","Split cell vertically":"Deli ćelije uspravno",Style:"Stil","Table alignment toolbar":"Traka sa alatkama za poravnavanje tabele","Table cell text alignment":"Poravnaj tekst u tabeli","Table properties":"Svojstva tabele","Table toolbar":"Tabela traka sa alatkama",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Boja je nevažeća. Pokušajte sa "# FF0000" ili "rgb (255,0,0)" ili "crvena".','The value is invalid. Try "10px" or "2em" or simply "2".':"Vrednost je nevažeća. Pokušajte sa „10pk“ ili „2em“ ili jednostavno „2“.","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Vertikalna traka sa alatkama za poravnavanje teksta",Width:"Širina"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a["sr-latn"]=a["sr-latn"]||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 of %1",Aquamarine:"Zelenkastoplava",Black:"Crna",Blue:"Plava",Cancel:"Odustani","Dim grey":"Bledo siva","Dropdown toolbar":"Padajuća traka sa alatkama","Edit block":"Blok uređivač","Editor toolbar":"Uređivač traka sa alatkama",Green:"Zelena",Grey:"Siva","Insert paragraph after block":"Уметните одломак после блока","Insert paragraph before block":"Уметните одломак пре блока","Light blue":"Svetloplava","Light green":"Svetlo zelena","Light grey":"Svetlo siva",Next:"Sledeći",Orange:"Narandžasta",Previous:"Prethodni",Purple:"Ljubičasta",Red:"Crvena",Redo:"Ponovo","Remove color":"Otkloni boju","Restore default":"","Rich Text Editor":"Prošireni uređivač teksta","Rich Text Editor, %0":"Prošireni uređivač teksta, %0",Save:"Sačuvaj","Select all":"Označi sve","Show more items":"Prikaži još stavki",Turquoise:"Tirkizna",Undo:"Povlačenje","Upload in progress":"Postavljanje u toku",White:"Bela","Widget toolbar":"Видгет трака са алаткама",Yellow:"Žuta"}),e.getPluralForm=function(a){return a%10==1&&a%100!=11?0:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?1:2}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/sr.js b/core/assets/vendor/ckeditor5/build/translations/sr.js
new file mode 100644
index 0000000000..77ee6c918a
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/sr.js
@@ -0,0 +1 @@
+!function(n){const i=n.sr=n.sr||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Централно равнанје","Align left":"Лево равнање","Align right":"Десно равнање",Justify:"Обострано равнање","Text alignment":"Равнање текста","Text alignment toolbar":"Алатке за равнање текста"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sr=i.sr||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Подебљано",Code:"Код",Italic:"Курзив",Strikethrough:"Прецртан",Subscript:"Индекс доле",Superscript:"Индекс горе",Underline:"Подвучен"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sr=i.sr||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитат"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.sr=n.sr||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Одреди стил",Heading:"Стилови","Heading 1":"Наслов 1","Heading 2":"Наслов 2","Heading 3":"Наслов 3","Heading 4":"Наслов 4","Heading 5":"Наслов 5","Heading 6":"Наслов 6",Paragraph:"Пасус","Type or paste your content here.":"Упишите или налепите наслов","Type your title":"Одредите наслов"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.sr=i.sr||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Хоризонтална разделна линија"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.sr=e.sr||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Слика у средини","Change image text alternative":"Измена алтернативног текста","Enter image caption":"Одреди текст испод слике","Full size image":"Слика у пуној величини","Image resize list":"Листа величине слике","Image toolbar":"Слика трака са алтакама","image widget":"модул са сликом","In line":"",Insert:"Убаци","Insert image":"Додај слику","Insert image via URL":"Убаци слику преко УРЛ-а","Left aligned image":"Лева слика",Original:"Оригинал","Resize image":"Промените величину слике","Resize image to %0":"Промените величину слике на% 0","Resize image to the original size":"Промените величину слике до оригиналне величине","Right aligned image":"Десна слика","Side image":"Бочна слика","Text alternative":"Алтернативни текст",Update:"Ажурирај","Update image URL":"Ажурирај УРЛ слике","Upload failed":"Постављање неуспешно","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sr=n.sr||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Смањи увлачење","Increase indent":"Повећај увлачење"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.sr=n.sr||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Изабери језик",Language:"Језик","Remove language":"Одстрани језик"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sr=n.sr||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Могуће преузимање","Edit link":"Исправи линк",Link:"Линк","Link image":"Линк слике","Link URL":"УРЛ линк","Open in a new tab":"Отвори у новој картици","Open link in new tab":"Отвори линк у новом прозору","This link has no URL":"Линк не садржи УРЛ",Unlink:"Отклони линк"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.sr=e.sr||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Набрајане листе","Bulleted list styles toolbar":"Трака са алаткама за набрајане листе",Circle:"Круг",Decimal:"Децимала","Decimal with leading zero":"Децимала са нулом на почетку",Disc:"Диск","Lower-latin":"Доњи - латински","Lower–roman":"Доњи - римски","Numbered List":"Листа са бројевима","Numbered list styles toolbar":"Трака са алаткама за листе са бројевима",Square:"Квадрат","To-do List":"Листа обавеза","Toggle the circle list style":"Укључи / искључи стил листе кругова","Toggle the decimal list style":"Укључи / искључи стил декадне листе","Toggle the decimal with leading zero list style":"Пребаци децимални знак са водећим стилом листе нула","Toggle the disc list style":"Укључите / искључите стил листе дискова","Toggle the lower–latin list style":"Укључите / искључите стил доње листе латинице","Toggle the lower–roman list style":"Укључите/ искључите стил доње римске листе","Toggle the square list style":"Укључи / искључи стил листе квадрата","Toggle the upper–latin list style":"Укључите / искључите стил горње листе латинице","Toggle the upper–roman list style":"Укључите / искључите стил горње римске листе","Upper-latin":"Горњи - латински","Upper-roman":"Горњи - римски"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.sr=e.sr||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Поравнајте текст ћелије према доле","Align cell text to the center":"Поравнајте текст ћелије у средину","Align cell text to the left":"Поравнајте текст ћелије лево","Align cell text to the middle":"Поравнајте текст ћелије у средину","Align cell text to the right":"Поравнајте текст ћелије десно","Align cell text to the top":"Поравнајте текст ћелије према горе","Align table to the left":"Поравнајте табелу на леву страну","Align table to the right":"Поравнајте табелу на десну страну",Alignment:"Поравнање",Background:"Позадина",Border:"Граница","Cell properties":"Својства ћелије","Center table":"Центар табеле",Color:"Боја","Color picker":"Бирач боја",Column:"Колона",Dashed:"Разбијено","Delete column":"Бриши колону","Delete row":"Бриши ред",Dimensions:"Димензија",Dotted:"Са тачкама",Double:"Двоструко","Enter table caption":"",Groove:"Колосек","Header column":"Колона за заглавље","Header row":"Ред за заглавлје",Height:"Висина","Horizontal text alignment toolbar":"Хоризонтална трака са алаткама за поравнање текста","Insert column left":"Додај колону лево","Insert column right":"Додај колону десно","Insert row above":"Додај ред изнад","Insert row below":"Додај ред испод","Insert table":"Додај табелу",Inset:"Прилог","Justify cell text":"Оправдајте текст ћелије","Merge cell down":"Спој ћелије на доле","Merge cell left":"Cпој ћелије на лево","Merge cell right":"Спој ћелије на десно","Merge cell up":"Спој ћелије на горе","Merge cells":"Спој ћелије",None:"Ниједан",Outset:"Почетак",Padding:"Постављање",Ridge:"Гребен",Row:"Ред","Select column":"Изабери колону","Select row":"Изабери ред",Solid:"Чврст","Split cell horizontally":"Дели ћелије водоравно","Split cell vertically":"Дели ћелије усправно",Style:"Стил","Table alignment toolbar":"Трака са алаткама за поравнање табеле","Table cell text alignment":"Поравнај тексту табели","Table properties":"Својства табеле","Table toolbar":"Табела трака са алаткама",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Боја је неважећа. Покушајте са "#FF0000" или "rgb(255,0,0)" или "црвена".','The value is invalid. Try "10px" or "2em" or simply "2".':'Вредност је неважећа. Покушајте са "10px" или "2em" или једноставно "2".',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Вертикална трака са алаткама за поравнање текста",Width:"Ширина"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.sr=e.sr||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 of %1",Aquamarine:"Зеленкастоплава",Black:"Црна",Blue:"Плава",Cancel:"Одустани","Dim grey":"Бледо сива","Dropdown toolbar":"Падајућа трака са алаткама","Edit block":"Блок уређивач","Editor toolbar":"Уређивач трака са алаткама",Green:"Зелена",Grey:"Сива","Insert paragraph after block":"Umetnite odlomak posle bloka","Insert paragraph before block":"Umetnite odlomak pre bloka","Light blue":"Светлоплава","Light green":"Светлозелена","Light grey":"Светло сива",Next:"Следећи",Orange:"Нараџаста",Previous:"Претходни",Purple:"Љубичаста",Red:"Црвена",Redo:"Поново","Remove color":"Отклони боју","Restore default":"","Rich Text Editor":"Проширен уређивач текста","Rich Text Editor, %0":"Проширени уређивач текста, %0",Save:"Сачувај","Select all":"Означи све.","Show more items":"Прикажи још ставки",Turquoise:"Тиркизна",Undo:"Повлачење","Upload in progress":"Постављање у току",White:"Бела","Widget toolbar":"Widget traka sa alatkama",Yellow:"Жута"}),o.getPluralForm=function(e){return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/sv.js b/core/assets/vendor/ckeditor5/build/translations/sv.js
new file mode 100644
index 0000000000..6350f3dc56
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/sv.js
@@ -0,0 +1 @@
+!function(t){const n=t.sv=t.sv||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Centrera","Align left":"Vänsterjustera","Align right":"Högerjustera",Justify:"Justera till marginaler","Text alignment":"Textjustering","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const t=n.sv=n.sv||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Fet",Code:"Kod",Italic:"Kursiv",Strikethrough:"Genomstruken",Subscript:"Nedsänkta tecken",Superscript:"Upphöjda tecken",Underline:"Understrykning"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const o=i.sv=i.sv||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blockcitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const r=i.sv=i.sv||{};r.dictionary=Object.assign(r.dictionary||{},{"Choose heading":"Välj rubrik",Heading:"Rubrik","Heading 1":"Rubrik 1","Heading 2":"Rubrik 2","Heading 3":"Rubrik 3","Heading 4":"Rubrik 4","Heading 5":"Rubrik 5","Heading 6":"Rubrik 6",Paragraph:"Paragraf","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.sv=e.sv||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Centrerad bild","Change image text alternative":"Ändra bildens alternativa text","Enter image caption":"Fyll i bildtext","Full size image":"Bild i full storlek","Image resize list":"","Image toolbar":"","image widget":"image widget","In line":"",Insert:"","Insert image":"Infoga bild","Insert image via URL":"","Left aligned image":"Vänsterjusterad bild",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Högerjusterad bild","Side image":"Kantbild","Text alternative":"Alternativ text",Update:"","Update image URL":"","Upload failed":"Uppladdning misslyckades","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.sv=n.sv||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"Redigera länk",Link:"Länk","Link image":"","Link URL":"Länkens URL","Open in a new tab":"","Open link in new tab":"Öppna länk i ny flik","This link has no URL":"Denna länk saknar URL",Unlink:"Ta bort länk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.sv=e.sv||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Punktlista","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numrerad lista","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.sv=e.sv||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"Kolumn",Dashed:"","Delete column":"Ta bort kolumn","Delete row":"Ta bort rad",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"","Header row":"",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"","Insert row below":"","Insert table":"Lägg in tabell",Inset:"","Justify cell text":"","Merge cell down":"","Merge cell left":"","Merge cell right":"","Merge cell up":"","Merge cells":"",None:"",Outset:"",Padding:"",Ridge:"",Row:"Rad","Select column":"","Select row":"",Solid:"","Split cell horizontally":"","Split cell vertically":"",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.sv=e.sv||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"Avbryt","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Gör om","Remove color":"","Restore default":"","Rich Text Editor":"Rich Text-editor","Rich Text Editor, %0":"Rich Text-editor, %0",Save:"Spara","Show more items":"",Turquoise:"",Undo:"Ångra",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/th.js b/core/assets/vendor/ckeditor5/build/translations/th.js
new file mode 100644
index 0000000000..a7a252f927
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/th.js
@@ -0,0 +1 @@
+!function(i){const n=i.th=i.th||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"คำพูดบล็อก"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.th=n.th||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"เลือกขนาดหัวข้อ",Heading:"หัวข้อ","Heading 1":"หัวข้อขนาด 1","Heading 2":"","Heading 3":"","Heading 4":"","Heading 5":"","Heading 6":"",Paragraph:"ย่อหน้า","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.th=i.th||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"เส้นแนวนอน"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.th=e.th||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"จัดแนวรูปกึ่งกลาง","Change image text alternative":"เปลี่ยนข้อความเมื่อไม่พบรูป","Enter image caption":"ระบุคำอธิบายภาพ","Full size image":"รูปขนาดเต็ม","Image resize list":"","Image toolbar":"เครื่องมือรูปภาพ","image widget":"วิดเจ็ตรูปภาพ","In line":"",Insert:"","Insert image":"แทรกรูป","Insert image via URL":"","Left aligned image":"จัดแนวภาพซ้าย",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"จัดแนวภาพขวา","Side image":"รูปด้านข้าง","Text alternative":"ข้อความเมื่อไม่พบรูป",Update:"","Update image URL":"","Upload failed":"อัปโหลดไม่สำเร็จ","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.th=n.th||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"ลดการเยื้อง","Increase indent":"เพิ่มการเยื้อง"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.th=e.th||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"คอลัมน์",Dashed:"","Delete column":"ลบคอลัมน์","Delete row":"ลบแถว",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"หัวข้อคอลัมน์","Header row":"ส่วนหัวแถว",Height:"","Horizontal text alignment toolbar":"","Insert column left":"แทรกคอลัมน์ทางซ้าย","Insert column right":"แทรกคอลัมน์ทางขวา","Insert row above":"แทรกส่วนหัวด้านบน","Insert row below":"แทรกส่วนหัวด้านล่าง","Insert table":"แทรกตาราง",Inset:"","Justify cell text":"","Merge cell down":"ผสานเซลล์ด้านล่าง","Merge cell left":"ผสานเซลล์ด้านซ้าย","Merge cell right":"ผสานเซลล์ด้านขวา","Merge cell up":"ผสานเซลล์ด้านบน","Merge cells":"ผสานเซลล์",None:"",Outset:"",Padding:"",Ridge:"",Row:"แถว","Select column":"","Select row":"",Solid:"","Split cell horizontally":"แยกเซลล์แนวนอน","Split cell vertically":"แยกเซลล์แนวตั้ง",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"เครื่องมือตาราง",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.th=e.th||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"พลอยสีฟ้า",Black:"สีดำ",Blue:"สีน้ำเงิน",Cancel:"ยกเลิก","Dim grey":"สีเทาเข้ม","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"สีเขียว",Grey:"สีเทา","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"สีฟ้า","Light green":"สีเขียวอ่อน","Light grey":"สีเทาอ่อน",Next:"",Orange:"สีส้ม",Previous:"",Purple:"สีม่วง",Red:"สีแดง",Redo:"ทำซ้ำ","Remove color":"ลบสี","Restore default":"","Rich Text Editor":"","Rich Text Editor, %0":"",Save:"บันทึก","Show more items":"",Turquoise:"สีเขียวขุ่น",Undo:"ย้อนกลับ","Upload in progress":"กำลังดำเนินการอัปโหลด",White:"สีขาว","Widget toolbar":"แถมเครื่องมือวิดเจ็ต",Yellow:"สีเหลือง"}),o.getPluralForm=function(e){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/tk.js b/core/assets/vendor/ckeditor5/build/translations/tk.js
new file mode 100644
index 0000000000..247162e8ca
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/tk.js
@@ -0,0 +1 @@
+!function(e){const i=e.tk=e.tk||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Merkeze deňleşdir","Align left":"Çepe deňleşdiriň","Align right":"Saga deňleşdiriň",Justify:"Akla","Text alignment":"Tekstiň deňleşdirilmegi","Text alignment toolbar":"Teksti deňleşdirmek gurallar paneli"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.tk=i.tk||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Galyň",Code:"Kod",Italic:"Italik",Strikethrough:"Üsti çyzykly",Subscript:"Aşaky ýazgy",Superscript:"Üst ýazgy",Underline:"Aşagy çyzykly"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.tk=i.tk||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Sitata blokirläň"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const y=a.tk=a.tk||{};y.dictionary=Object.assign(y.dictionary||{},{"Choose heading":"Sözbaşy saýlaň",Heading:"Sözbaşy","Heading 1":"Sözbaşy 1","Heading 2":"Sözbaşy 2","Heading 3":"Sözbaşy 3","Heading 4":"Sözbaşy 4","Heading 5":"Sözbaşy 5","Heading 6":"Sözbaşy 6",Paragraph:"Abzas","Type or paste your content here.":"Mazmunyňyzy şu ýere ýazyň ýa-da goýuň.","Type your title":"Sözbaşyny ýazyň"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.tk=i.tk||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Gorizontal çyzyk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.tk=e.tk||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Merkezleşdirilen surat","Change image text alternative":"Surat tekstiniň alternatiwasyny üýtgediň","Enter image caption":"Surat ýazgysyny giriziň","Full size image":"Doly ululykdaky surat","Image resize list":"","Image toolbar":"Surat gurallar paneli","image widget":"surat widjeti","In line":"",Insert:"","Insert image":"Surat goýuň","Insert image via URL":"","Left aligned image":"Çep deňleşdirilen surat",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Sag deňleşdirilen surat","Side image":"Gapdal surat","Text alternative":"Tekstiň alternatiwasy",Update:"","Update image URL":"","Upload failed":"Ýükläp bolmady","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.tk=n.tk||{};e.dictionary=Object.assign(e.dictionary||{},{"Decrease indent":"Indent peseltmek","Increase indent":"Indent köpeltmek"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const a=i.tk=i.tk||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Dili saýlaň",Language:"Dil","Remove language":"Dili pozuň"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const n=a.tk=a.tk||{};n.dictionary=Object.assign(n.dictionary||{},{Downloadable:"Göçürip alyp bolýar","Edit link":"Baglanyşygy üýtget",Link:"Baglanyşyk","Link image":"Surat baglanyşygy","Link URL":"URL baglanyşygy","Open in a new tab":"Täze goýmada açyň","Open link in new tab":"Täze goýmada baglanyşyk açyň","This link has no URL":"Bu baglanyşykda URL ýok",Unlink:"Baglanyşygy aýyr"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.tk=e.tk||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Bullet sanawy","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Sanly sanaw","Numbered list styles toolbar":"",Square:"","To-do List":"Edilmeli işleriň sanawy","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.tk=e.tk||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Öýjük tekstini aşagyna deňleşdiriň","Align cell text to the center":"Öýjük tekstini merkeze deňleşdiriň","Align cell text to the left":"Öýjük tekstini çepe deňleşdiriň","Align cell text to the middle":"Öýjük tekstini ortasyna deňleşdiriň","Align cell text to the right":"Öýjük tekstini saga deňleşdiriň","Align cell text to the top":"Öýjük tekstini ýokarsyna deňleşdiriň","Align table to the left":"Tablisany çepe deňleşdiriň","Align table to the right":"Tablisany sag tarapa deňleşdiriň",Alignment:"Deňleşdirmek",Background:"Arka",Border:"Serhet","Cell properties":"Öýjük aýratynlyklary","Center table":"Tablisany merkezleşdiriň",Color:"Reňk","Color picker":"Reňk saýlaýjy",Column:"Sütün",Dashed:"Çyzykly","Delete column":"Sütüni pozuň","Delete row":"Setiri poz",Dimensions:"Ölçegleri",Dotted:"Nokatly",Double:"Goşa","Enter table caption":"",Groove:"Groove","Header column":"Sözbaşy sütüni","Header row":"Sözbaşy hatary",Height:"Boý","Horizontal text alignment toolbar":"Kese tekst tekizlemek gurallar paneli","Insert column left":"Sütüni çepe goýuň","Insert column right":"Sütüni saga goýuň","Insert row above":"Hatary ýokaryk goýuň","Insert row below":"Hatary aşak goýuň","Insert table":"Tablisa goýuň",Inset:"Inset","Justify cell text":"Öýjük tekstini esaslandyryň","Merge cell down":"Öýjügi aşak birleşdiriň","Merge cell left":"Öýjügi çepe birleşdiriň","Merge cell right":"Öýjügi saga birleşdiriň","Merge cell up":"Öýjügi ýokary birleşdiriň","Merge cells":"Öýjükleri birleşdiriň",None:"Hiç",Outset:"Outset",Padding:"Padding",Ridge:"Kertik",Row:"Setir","Select column":"Sütün saýlaň","Select row":"Setir saýlaň",Solid:"Gaty","Split cell horizontally":"Öýjügi keseligine bölüň","Split cell vertically":"Öýjügi dikligine bölüň",Style:"Stil","Table alignment toolbar":"Tablisa deňleşdirmek gurallar paneli","Table cell text alignment":"Tablisa öýjükleriniň tekstini deňleşdirmek","Table properties":"Tablisa aýratynlyklary","Table toolbar":"Tablisa gurallar paneli",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Reňki nädogry "#FF0000" ýa-da "rgb(255,0,0)" ýa-da "gyzyl" barlap görüň.','The value is invalid. Try "10px" or "2em" or simply "2".':'Baha nädogry "10px" ýa-da "2em" ýa-da diňe "2" barlap görüň.',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Dik tekst tekizlemek gurallar paneli",Width:"Ini"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.tk=a.tk||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"1%-iň 0%-i",Aquamarine:"Akuamarin",Black:"Gara",Blue:"Gök",Cancel:"Ýatyr","Dim grey":"Goýy çal","Dropdown toolbar":"Açylýan gurallar paneli","Edit block":"Bloky redaktirläň","Editor toolbar":"Redaktor gurallar paneli",Green:"Ýaşyl",Grey:"Çal","Insert paragraph after block":"Blokdan soň abzas goýuň","Insert paragraph before block":"Blokdan öň abzas goýuň","Light blue":"Açyk gök","Light green":"Açyk ýaşyl","Light grey":"Açyk çal",Next:"Indiki",Orange:"Mämişi",Previous:"Öňki",Purple:"Gyrmyzy",Red:"Gyzyl",Redo:"Öňe gaýtar","Remove color":"Reňki aýyryň","Restore default":"","Rich Text Editor":"Baý Tekst Redaktory","Rich Text Editor, %0":"Baý Tekst Redaktory, %0",Save:"Saklaň","Select all":"Ählisini saýla","Show more items":"Has köp zady görkeziň",Turquoise:"Turkuaz",Undo:"Yza gaýtar","Upload in progress":"Ýüklemek dowam edýär",White:"Ak","Widget toolbar":"Widget gurallar paneli",Yellow:"Sary"}),e.getPluralForm=function(a){return 1!=a}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/tr.js b/core/assets/vendor/ckeditor5/build/translations/tr.js
new file mode 100644
index 0000000000..e4506697fe
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/tr.js
@@ -0,0 +1 @@
+!function(a){const i=a.tr=a.tr||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Ortala","Align left":"Sola hizala","Align right":"Sağa hizala",Justify:"İki yana yasla","Text alignment":"Yazı hizalama","Text alignment toolbar":"Yazı Hizlama Araç Çubuğu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const t=i.tr=i.tr||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Kalın",Code:"Kod",Italic:"İtalik",Strikethrough:"Üstü çizili",Subscript:"Alt Simge",Superscript:"Üst Simge",Underline:"Altı Çizgili"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const t=n.tr=n.tr||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Alıntı"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(a){const e=a.tr=a.tr||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Başlık tipi seç",Heading:"Başlık","Heading 1":"1. Seviye Başlık","Heading 2":"2. Seviye Başlık","Heading 3":"3. Seviye Başlık","Heading 4":"4. Seviye Başlık","Heading 5":"5. Seviye Başlık","Heading 6":"6. Seviye Başlık",Paragraph:"Paragraf","Type or paste your content here.":"İçeriğinizi buraya yapıştırın yada yazın.","Type your title":"Başlığınızı yazınız"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.tr=i.tr||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Yatay çiizgi"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const a=e.tr=e.tr||{};a.dictionary=Object.assign(a.dictionary||{},{"Break text":"","Centered image":"Ortalanmış görsel","Change image text alternative":"Görsel alternatif yazısını değiştir","Enter image caption":"Resim açıklaması gir","Full size image":"Tam Boyut Görsel","Image resize list":"","Image toolbar":"Resim araç çubuğu","image widget":"resim aracı","In line":"",Insert:"","Insert image":"Görsel Ekle","Insert image via URL":"","Left aligned image":"Sola hizalı görsel",Original:"Orijinal","Resize image":"Resmi boyutlandır","Resize image to %0":"Resmi %0 ölçülerine boyutlandır","Resize image to the original size":"Resmi orijinal büyüklüğüne al","Right aligned image":"Sağa hizalı görsel","Side image":"Yan Görsel","Text alternative":"Yazı alternatifi",Update:"Güncelle","Update image URL":"","Upload failed":"Yükleme başarsız","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.tr=i.tr||{};n.dictionary=Object.assign(n.dictionary||{},{"Decrease indent":"Girintiyi azalt","Increase indent":"Girintiyi arttır"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.tr=n.tr||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"İndirilebilir","Edit link":"Bağlantıyı değiştir",Link:"Bağlantı","Link image":"","Link URL":"Bağlantı Adresi","Open in a new tab":"Yeni sekmede aç","Open link in new tab":"Yeni sekmede aç","This link has no URL":"Bağlantı adresi yok",Unlink:"Bağlantıyı kaldır"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.tr=e.tr||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Simgeli Liste","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Numaralı Liste","Numbered list styles toolbar":"",Square:"","To-do List":"Yapılacaklar Listesi","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.tr=e.tr||{};l.dictionary=Object.assign(l.dictionary||{},{"Align cell text to the bottom":"Hücre içindeki metni alta hizala","Align cell text to the center":"Hücre içindeki metnini ortaya hizalama","Align cell text to the left":"Hücre içindeki metnini sola hizala","Align cell text to the middle":"Hücre içindeki metni ortaya hizala","Align cell text to the right":"Hücre içindeki metnini sağa hizala","Align cell text to the top":"Hücre içindeki metni üste hizala","Align table to the left":"Tabloyu sola hizala","Align table to the right":"Tabloyu sağa hizala",Alignment:"Hizalama",Background:"Arkaplan",Border:"Kenar","Cell properties":"Hücre özellikleri","Center table":"Tabloyu ortala",Color:"Renk","Color picker":"Renk seçici",Column:"Kolon",Dashed:"Kesik çizgili","Delete column":"Kolonu sil","Delete row":"Satırı sil",Dimensions:"Ölçüler",Dotted:"Noktalı",Double:"Çift","Enter table caption":"",Groove:"Yiv","Header column":"Başlık kolonu","Header row":"Başlık satırı",Height:"Yükseklik","Horizontal text alignment toolbar":"Yatay metin hizalama araç çubuğu","Insert column left":"Sola kolon ekle","Insert column right":"Sağa kolon ekle","Insert row above":"Üste satır ekle","Insert row below":"Alta satır ekle","Insert table":"Tablo Ekle",Inset:"İçe","Justify cell text":"Hücre içindeki metini iki yana yasla","Merge cell down":"Aşağıya doğru birleştir","Merge cell left":"Sola doğru birleştir","Merge cell right":"Sağa doğru birleştir","Merge cell up":"Yukarı doğru birleştir","Merge cells":"Hücreleri birleştir",None:"Yok",Outset:"Dışarıya",Padding:"İç boşluk",Ridge:"Yükselti",Row:"Satır","Select column":"Kolon seç","Select row":"Satır seç",Solid:"Dolu","Split cell horizontally":"Hücreyi yatay böl","Split cell vertically":"Hücreyi dikey böl",Style:"Stil","Table alignment toolbar":"Tablo hizalama araç çubuğu","Table cell text alignment":"Tablo hücresi metin hizalaması","Table properties":"Tablo özellikleri","Table toolbar":"Tablo araç çubuğu",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Geçersiz renk. "#FF0000" veya "rgb(255,0,0)" veya "red" deneyin.','The value is invalid. Try "10px" or "2em" or simply "2".':'Geçersiz değer. "10px" veya "2em" veya sadece "2" deneyin.',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Dikey metin hizalama araç çubuğu",Width:"Genişlik"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const r=e.tr=e.tr||{};r.dictionary=Object.assign(r.dictionary||{},{"%0 of %1":"%0/%1",Aquamarine:"Su Yeşili",Black:"Siyah",Blue:"Mavi",Cancel:"İptal","Dim grey":"Koyu Gri","Dropdown toolbar":"Açılır araç çubuğu","Edit block":"Bloğu Düzenle","Editor toolbar":"Düzenleme araç çubuğu",Green:"Yeşil",Grey:"Gri","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Açık Mavi","Light green":"Açık Yeşil","Light grey":"Açık Gri",Next:"Sonraki",Orange:"Turuncu",Previous:"Önceki",Purple:"Mor",Red:"Kırmızı",Redo:"Tekrar yap","Remove color":"Rengi Sil","Restore default":"","Rich Text Editor":"Zengin İçerik Editörü","Rich Text Editor, %0":"Zengin İçerik Editörü, %0",Save:"Kaydet","Select all":"Hepsini seç","Show more items":"Daha fazla öğe göster",Turquoise:"Turkuaz",Undo:"Geri al","Upload in progress":"Yükleme işlemi devam ediyor",White:"Beyaz","Widget toolbar":"Bileşen araç çubuğu",Yellow:"Sarı"}),r.getPluralForm=function(e){return e>1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/tt.js b/core/assets/vendor/ckeditor5/build/translations/tt.js
new file mode 100644
index 0000000000..4b4281a5ce
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/tt.js
@@ -0,0 +1 @@
+!function(t){const i=t.tt=t.tt||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Калын",Code:"Код",Italic:"",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(o){const t=o.tt=o.tt||{};t.dictionary=Object.assign(t.dictionary||{},{"%0 of %1":"",Cancel:"",Redo:"Кабатла","Remove color":"","Restore default":"",Save:"Сакла","Show more items":"",Undo:""}),t.getPluralForm=function(o){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/ug.js b/core/assets/vendor/ckeditor5/build/translations/ug.js
new file mode 100644
index 0000000000..ae6a91a914
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/ug.js
@@ -0,0 +1 @@
+!function(n){const i=n.ug=n.ug||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"ئوتتۇرىغا توغرىلاش","Align left":"سولغا توغرىلاش","Align right":"ئوڭغا توغرىلاش",Justify:"تەكشىلەش","Text alignment":"تېكىست توغرىلاش","Text alignment toolbar":"تېكىست توغرىلاش قورالبالدىقى"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ug=i.ug||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"توم",Code:"كود",Italic:"يانتۇ",Strikethrough:"ئۆچۈرۈش سىزىقى",Subscript:"ئاستبەلگە",Superscript:"ئۈستبەلگە",Underline:"ئاستى سىزىق"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.ug=i.ug||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"نەقىل"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.ug=n.ug||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"ماۋزۇ تاللاش",Heading:"ماۋزۇ","Heading 1":"ماۋزۇ 1","Heading 2":"ماۋزۇ 2","Heading 3":"ماۋزۇ 3","Heading 4":"ماۋزۇ 4","Heading 5":"ماۋزۇ 5","Heading 6":"ماۋزۇ 6",Paragraph:"ئابزاس","Type or paste your content here.":"","Type your title":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.ug=e.ug||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"ئوتتۇردىكى رەسىم","Change image text alternative":"رەسىملىك تېكىست تاللىغۇچنى ئۆزگەرتىش","Enter image caption":"رەسىمنىڭ تېمىسىنى كىرگۈزۈڭ","Full size image":"ئەسلى چوڭلۇقتىكى رەسىم","Image resize list":"","Image toolbar":"","image widget":"رەسىمچىك","In line":"",Insert:"","Insert image":"رەسىم قىستۇرۇش","Insert image via URL":"","Left aligned image":"سولغا توغۇرلانغان رەسىم",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"ئوڭغا توغۇرلانغان رەسىم","Side image":"يان رەسىم","Text alternative":"تېكىست ئاملاشتۇرۇش",Update:"","Update image URL":"","Upload failed":"چىقىرىش مەغلۇپ بولدى","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.ug=n.ug||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"","Edit link":"",Link:"ئۇلانما","Link image":"","Link URL":"ئۇلاش ئادىرسى","Open in a new tab":"","Open link in new tab":"","This link has no URL":"",Unlink:"ئۇلانمىنى ئۈزۈش"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.ug=e.ug||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"بەلگە تىزىملىك","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"نومۇرلۇق تىزىملىك","Numbered list styles toolbar":"",Square:"","To-do List":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.ug=e.ug||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"",Background:"",Border:"","Cell properties":"","Center table":"",Color:"","Color picker":"",Column:"",Dashed:"","Delete column":"","Delete row":"",Dimensions:"",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"","Header row":"",Height:"","Horizontal text alignment toolbar":"","Insert column left":"","Insert column right":"","Insert row above":"","Insert row below":"","Insert table":"جەدۋەل قىستۇر",Inset:"","Justify cell text":"","Merge cell down":"","Merge cell left":"","Merge cell right":"","Merge cell up":"","Merge cells":"",None:"",Outset:"",Padding:"",Ridge:"",Row:"","Select column":"","Select row":"",Solid:"","Split cell horizontally":"","Split cell vertically":"",Style:"","Table alignment toolbar":"","Table cell text alignment":"","Table properties":"","Table toolbar":"",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.ug=e.ug||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Cancel:"ئىناۋەتسىز","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Light blue":"","Light green":"","Light grey":"",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"تەكرارلاش","Remove color":"رەڭنى چىقىرىۋېتىش","Restore default":"","Rich Text Editor":"تېكىست تەھرىرلىگۈچ","Rich Text Editor, %0":"تېكىست تەھرىرلىگۈچ، 0%",Save:"ساقلاش","Show more items":"",Turquoise:"",Undo:"يېنىۋېلىش",White:"",Yellow:""}),o.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/uk.js b/core/assets/vendor/ckeditor5/build/translations/uk.js
new file mode 100644
index 0000000000..3ad81d309a
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/uk.js
@@ -0,0 +1 @@
+!function(n){const i=n.uk=n.uk||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"По центру","Align left":"По лівому краю","Align right":"По правому краю",Justify:"По ширині","Text alignment":"Вирівнювання тексту","Text alignment toolbar":"Панель інструментів вирівнювання тексту"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.uk=i.uk||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Жирний",Code:"Код",Italic:"Курсив",Strikethrough:"Закреслений",Subscript:"Нижній індекс",Superscript:"Верхній індекс",Underline:"Підкреслений"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.uk=i.uk||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитата"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.uk=n.uk||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"Оберіть заголовок",Heading:"Заголовок","Heading 1":"Заголовок 1","Heading 2":"Заголовок 2","Heading 3":"Заголовок 3","Heading 4":"Заголовок 4","Heading 5":"Заголовок 5","Heading 6":"Заголовок 6",Paragraph:"Параграф","Type or paste your content here.":"Введіть або вставте свій вміст тут.","Type your title":"Введіть назву"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.uk=i.uk||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"Горизонтальна лінія"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.uk=e.uk||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Зображення по центру","Change image text alternative":"Змінити текстову альтернативу зображення","Enter image caption":"Введіть підпис зображення","Full size image":"Повний розмір зображення","Image resize list":"Перелік розмірів","Image toolbar":"Панелі інструментів зображення","image widget":"Віджет зображення","In line":"",Insert:"Вставити","Insert image":"Вставити зображення","Insert image via URL":"Вставити зображення через посилання","Left aligned image":"Зображення ліворуч",Original:"Оригінал","Resize image":"Розтягнути зображення","Resize image to %0":"Розтягнути зображення до %0","Resize image to the original size":"Розтягнути зображення до оригінального розміру","Right aligned image":"Зображення праворуч","Side image":"Бокове зображення","Text alternative":"Текстова альтернатива",Update:"Оновити","Update image URL":"Оновити посилання на зображення","Upload failed":"Завантаження не вдалось","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.uk=n.uk||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Зменшити відступ","Increase indent":"Збільшити відступ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.uk=n.uk||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"Обрати мову",Language:"Мова","Remove language":"Видалити мову"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.uk=n.uk||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Завантажувальне","Edit link":"Редагувати посилання",Link:"Посилання","Link image":"Посилання зображення","Link URL":"URL посилання","Open in a new tab":"Вікрити у новій вкладці","Open link in new tab":"Відкрити посилання у новій вкладці","This link has no URL":"Це посилання не має URL",Unlink:"Видалити посилання"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.uk=e.uk||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Маркерний список","Bulleted list styles toolbar":"Панель маркерних списків",Circle:"Коло",Decimal:"Цифри","Decimal with leading zero":"Цифри із провідним нулем",Disc:"Круг","Lower-latin":"","Lower–roman":"","Numbered List":"Нумерований список","Numbered list styles toolbar":"Панель нумерованих списків",Square:"Квадрат","To-do List":"Список справ","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.uk=e.uk||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"Вирівняти текст комірки по низу","Align cell text to the center":"Вирівняти текст по центру","Align cell text to the left":"Вирівняти текст по лівому краю","Align cell text to the middle":"Вирівняти текст комірки по середині","Align cell text to the right":"Вирівняти текст по правому краю","Align cell text to the top":"Вирівняти текст комірки по верху ","Align table to the left":"Вирівняти таблицю по лівому краю","Align table to the right":"Вирівняти таблицю по правому краю ",Alignment:"Вирівнювання",Background:"Фон",Border:"Межа","Cell properties":"Властивості комірок","Center table":"Відцентрувати таблицю",Color:"Колір","Color picker":"Вибір кольору",Column:"Стовпець",Dashed:"Пунктирна","Delete column":"Видалити стовпець","Delete row":"Видалити рядок",Dimensions:"Розміри",Dotted:"Точкова",Double:"Подвійна","Enter table caption":"",Groove:"Жолобчаста","Header column":"Заголовок стовпця","Header row":"Заголовок рядка",Height:"Висота","Horizontal text alignment toolbar":"Панель інструментів вирівнювання горизонтального тексту","Insert column left":"Вставити стовпець зліва","Insert column right":"Вставити стовпець справа","Insert row above":"Вставити рядок знизу","Insert row below":"Вставити рядок зверху","Insert table":"Вставити таблицю",Inset:"Угнута","Justify cell text":"Вирівняти текст по ширині ","Merge cell down":"Поєднати комірки внизу","Merge cell left":"Поєднати комірки ліворуч","Merge cell right":"Поєднати комірки праворуч","Merge cell up":"Поєднати комірки вгору","Merge cells":"Поєднати комірки",None:"Не вказано",Outset:"Випукла",Padding:"Заповнення",Ridge:"Ребриста",Row:"Рядок","Select column":"Виберіть стовпчик","Select row":"Виберіть рядок",Solid:"Суцільний","Split cell horizontally":"Розділити комірки горизонтально","Split cell vertically":"Розділити комірки вертикально",Style:"Стиль","Table alignment toolbar":"Панель інструментів вирівнювання таблиці","Table cell text alignment":"Вирівнювання тексту комірки","Table properties":"Властивості таблиці","Table toolbar":"Панель інструментів таблиці",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'Колір недійсний. Спробуйте "#FF0000" або "rgb(255,0,0)" або "red"','The value is invalid. Try "10px" or "2em" or simply "2".':'Значення недійсне. Спробуйте "10px" або "2em" або просто "2"',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"Панель інструментів вертикального вирівнювання тексту",Width:"Ширина"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.uk=e.uk||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 із %1",Aquamarine:"Аквамариновий",Black:"Чорний",Blue:"Синій",Cancel:"Відміна","Dim grey":"Темно-сірий","Dropdown toolbar":"Випадаюча панель інструментів","Edit block":"Редагувати блок","Editor toolbar":"Панель інструментів редактора",Green:"Зелений",Grey:"Сірий","Insert paragraph after block":"Додати абзац після блока","Insert paragraph before block":"Додати абзац перед блоком","Light blue":"Світло-синій","Light green":"Світло-зелений","Light grey":"Світло-сірий",Next:"Наступний",Orange:"Помаранчевий",Previous:"Попередній",Purple:"Фіолетовий",Red:"Червоний",Redo:"Повтор","Remove color":"Видалити колір","Restore default":"","Rich Text Editor":"Розширений текстовий редактор","Rich Text Editor, %0":"Розширений текстовий редактор, %0",Save:"Зберегти","Select all":"Вибрати все","Show more items":"Показати більше",Turquoise:"Бірюзовий",Undo:"Відміна","Upload in progress":"Виконується завантаження",White:"Білий","Widget toolbar":"Панель інструментів віджетів",Yellow:"Жовтий"}),o.getPluralForm=function(e){return e%1==0&&e%10==1&&e%100!=11?0:e%1==0&&e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?1:e%1==0&&(e%10==0||e%10>=5&&e%10<=9||e%100>=11&&e%100<=14)?2:3}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/vi.js b/core/assets/vendor/ckeditor5/build/translations/vi.js
new file mode 100644
index 0000000000..55df6cc735
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/vi.js
@@ -0,0 +1 @@
+!function(n){const i=n.vi=n.vi||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Canh giữa","Align left":"Canh trái","Align right":"Canh phải",Justify:"Canh đều","Text alignment":"Căn chỉnh văn bản","Text alignment toolbar":"Thanh công cụ canh chữ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.vi=i.vi||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Đậm",Code:"Code",Italic:"Nghiêng",Strikethrough:"Gạch ngang",Subscript:"Chữ nhỏ dưới",Superscript:"Chữ nhỏ trên",Underline:"Gạch dưới"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.vi=i.vi||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Trích dẫn"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.vi=i.vi||{};n.dictionary=Object.assign(n.dictionary||{},{"Choose heading":"Chọn tiêu đề",Heading:"Tiêu đề","Heading 1":"Tiêu đề 1","Heading 2":"Tiêu đề 2","Heading 3":"Tiêu đề 3","Heading 4":"Tiêu đề 4","Heading 5":"Tiêu đề 5","Heading 6":"Tiêu đề 6",Paragraph:"Đoạn văn","Type or paste your content here.":"Nhập hoặc dán nội dung tại đây","Type your title":"Nhập tựa đề"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.vi=n.vi||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"Đường ngang"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.vi=n.vi||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"","Centered image":"Ảnh canh giữa","Change image text alternative":"Đổi chữ alt của ảnh","Enter image caption":"Nhập mô tả ảnh","Full size image":"Ảnh đầy đủ","Image resize list":"Danh sách ảnh đã chỉnh kích thước","Image toolbar":"Thanh công cụ hình ảnh","image widget":"tiện ích ảnh","In line":"",Insert:"Chèn","Insert image":"Chèn ảnh","Insert image via URL":"Chèn ảnh từ URL","Left aligned image":"Ảnh canh trái",Original:"Nguyên bản","Resize image":"Chỉnh kích cỡ ảnh","Resize image to %0":"Chỉnh kích cỡ ảnh về %0","Resize image to the original size":"Chỉnh về ảnh kích cỡ nguyên gốc","Right aligned image":"Ảnh canh phải","Side image":"Ảnh một bên","Text alternative":"Chữ alt",Update:"Cập nhật","Update image URL":"Cập nhật ảnh từ URL","Upload failed":"Tải thất bại","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.vi=n.vi||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"Giảm lề","Increase indent":"Tăng lề"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.vi=n.vi||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"Có thể tải về","Edit link":"Sửa liên kết",Link:"Chèn liên kết","Link image":"Liên kết của ảnh","Link URL":"Đường dẫn liên kết","Open in a new tab":"Mở trên tab mới","Open link in new tab":"Mở liên kết","This link has no URL":"Liên kết không có đường dẫn",Unlink:"Bỏ liên kết"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.vi=e.vi||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"Danh sách đánh ký hiệu","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"Danh sách đánh số","Numbered list styles toolbar":"",Square:"","To-do List":"Danh sách cần làm","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(t){const e=t.vi=t.vi||{};e.dictionary=Object.assign(e.dictionary||{},{"Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align table to the left":"","Align table to the right":"",Alignment:"Căn lề",Background:"Màu nền",Border:"Viền","Cell properties":"Thuộc tính của ô","Center table":"",Color:"Màu","Color picker":"",Column:"Cột",Dashed:"","Delete column":"Xoá cột","Delete row":"Xoá hàng",Dimensions:"Kích thước",Dotted:"",Double:"","Enter table caption":"",Groove:"","Header column":"Tiêu đề cột","Header row":"Tiêu đề hàng",Height:"Cao","Horizontal text alignment toolbar":"","Insert column left":"Thêm cột vào bên trái","Insert column right":"Thêm cột vào bên phải","Insert row above":"Thêm hàng phía trên","Insert row below":"Thêm hàng ở dưới","Insert table":"Tạo bảng",Inset:"","Justify cell text":"","Merge cell down":"Sát nhập ô xuống dưới","Merge cell left":"Sát nhập ô qua trái","Merge cell right":"Sát nhập ô qua phải","Merge cell up":"Sát nhập ô lên trên","Merge cells":"Sát nhập ô",None:"",Outset:"",Padding:"Cách lề",Ridge:"",Row:"Hàng","Select column":"Chọn cột","Select row":"Chọn hàng",Solid:"","Split cell horizontally":"Tách ô theo chiều ngang","Split cell vertically":"Tách ô theo chiều dọc",Style:"Kiểu","Table alignment toolbar":"","Table cell text alignment":"Căn lề văn bản trong ô","Table properties":"Thuộc tính của bảng","Table toolbar":"Thanh công cụ bảng",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':"",'The value is invalid. Try "10px" or "2em" or simply "2".':"","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"",Width:"Rộng"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const o=n.vi=n.vi||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0 đến %1",Aquamarine:"Xanh ngọc biển",Black:"Đen",Blue:"Xanh biển",Cancel:"Hủy","Dim grey":"Xám mờ","Dropdown toolbar":"Thanh công cụ danh mục","Edit block":"Chỉnh sửa đoạn","Editor toolbar":"Thanh công cụ biên tập",Green:"Xanh lá",Grey:"Xám","Insert paragraph after block":"","Insert paragraph before block":"","Light blue":"Xanh dương","Light green":"Xanh lá nhạt","Light grey":"Xám nhạt",Next:"Tiếp theo",Orange:"Cam",Previous:"Quay lại",Purple:"Tím",Red:"Đỏ",Redo:"Tiếp tục","Remove color":"Xóa màu","Restore default":"","Rich Text Editor":"Trình soạn thảo văn bản","Rich Text Editor, %0":"Trình soạn thảo văn bản, %0",Save:"Lưu","Show more items":"Xem thêm",Turquoise:"Xanh ngọc bích",Undo:"Hoàn tác","Upload in progress":"Đang tải lên",White:"Trắng","Widget toolbar":"Thanh công cụ tiện ích",Yellow:"Vàng"}),o.getPluralForm=function(n){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/zh-cn.js b/core/assets/vendor/ckeditor5/build/translations/zh-cn.js
new file mode 100644
index 0000000000..f12fc94de1
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/zh-cn.js
@@ -0,0 +1 @@
+!function(n){const i=n["zh-cn"]=n["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"居中对齐","Align left":"左对齐","Align right":"右对齐",Justify:"两端对齐","Text alignment":"对齐","Text alignment toolbar":"对齐工具栏"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i["zh-cn"]=i["zh-cn"]||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"加粗",Code:"代码",Italic:"倾斜",Strikethrough:"删除线",Subscript:"下标",Superscript:"上标",Underline:"下划线"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const c=n["zh-cn"]=n["zh-cn"]||{};c.dictionary=Object.assign(c.dictionary||{},{"Block quote":"块引用"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n["zh-cn"]=n["zh-cn"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"标题类型",Heading:"标题","Heading 1":"标题 1","Heading 2":"标题 2","Heading 3":"标题 3","Heading 4":"标题 4","Heading 5":"标题 5","Heading 6":"标题 6",Paragraph:"段落","Type or paste your content here.":"在这里输入或粘贴内容","Type your title":"输入标题"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["zh-cn"]=n["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Horizontal line":"水平线"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e["zh-cn"]=e["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"图片居中","Change image text alternative":"更改图片替换文本","Enter image caption":"输入图片标题","Full size image":"图片通栏显示","Image resize list":"图片大小列表","Image toolbar":"图片工具栏","image widget":"图像小部件","In line":"",Insert:"插入","Insert image":"插入图像","Insert image via URL":"通过URL地址插入图片","Left aligned image":"图片左侧对齐",Original:"原始大小","Resize image":"调整图像大小","Resize image to %0":"调整图像大小为0%","Resize image to the original size":"调整图像大小为原始大小","Right aligned image":"图片右侧对齐","Side image":"图片侧边显示","Text alternative":"替换文本",Update:"更新","Update image URL":"更新图片URL地址","Upload failed":"上传失败","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["zh-cn"]=n["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"减少缩进","Increase indent":"增加缩进"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n["zh-cn"]=n["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"可下载","Edit link":"修改链接",Link:"超链接","Link image":"链接图片","Link URL":"链接网址","Open in a new tab":"在新标签页中打开","Open link in new tab":"在新标签页中打开链接","This link has no URL":"此链接没有设置网址",Unlink:"取消超链接"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e["zh-cn"]=e["zh-cn"]||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"项目符号列表","Bulleted list styles toolbar":"项目符号列表样式工具条",Circle:"空心圆点",Decimal:"阿拉伯数字","Decimal with leading zero":"前导零阿拉伯数字",Disc:"实心圆点","Lower-latin":"小写拉丁字母","Lower–roman":"小写罗马数字","Numbered List":"项目编号列表","Numbered list styles toolbar":"项目编号列表样式工具条",Square:"实心方块","To-do List":"待办列表","Toggle the circle list style":"切换空心原点列表样式","Toggle the decimal list style":"切换阿拉伯数字列表样式","Toggle the decimal with leading zero list style":"切换前导零阿拉伯数字列表样式","Toggle the disc list style":"切换实心原点列表样式","Toggle the lower–latin list style":"切换小写拉丁字母列表样式","Toggle the lower–roman list style":"切换小写罗马数字列表样式","Toggle the square list style":"切换实心方块列表样式","Toggle the upper–latin list style":"切换大写拉丁字母列表样式","Toggle the upper–roman list style":"切换大写罗马数字列表样式","Upper-latin":"大写拉丁字母","Upper-roman":"大写罗马数字"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e["zh-cn"]=e["zh-cn"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"使单元格文本对齐到底部","Align cell text to the center":"使单元格文本水平居中","Align cell text to the left":"使单元格文本左对齐","Align cell text to the middle":"使单元格文本垂直居中","Align cell text to the right":"使单元格文本右对齐","Align cell text to the top":"使单元格文本对齐到顶部","Align table to the left":"使表格左对齐","Align table to the right":"使表格右对齐",Alignment:"对齐",Background:"背景",Border:"边框","Cell properties":"单元格属性","Center table":"表格居中",Color:"颜色","Color picker":"颜色选择器",Column:"列",Dashed:"虚线","Delete column":"删除本列","Delete row":"删除本行",Dimensions:"尺寸",Dotted:"点状虚线",Double:"双线","Enter table caption":"",Groove:"凹槽边框","Header column":"标题列","Header row":"标题行",Height:"高度","Horizontal text alignment toolbar":"水平文本对齐工具栏","Insert column left":"左侧插入列","Insert column right":"右侧插入列","Insert row above":"在上面插入一行","Insert row below":"在下面插入一行","Insert table":"插入表格",Inset:"凹边框","Justify cell text":"对齐单元格文本","Merge cell down":"向下合并单元格","Merge cell left":"向左合并单元格","Merge cell right":"向右合并单元格","Merge cell up":"向上合并单元格","Merge cells":"合并单元格",None:"无",Outset:"凸边框",Padding:"内边距",Ridge:"垄状边框",Row:"行","Select column":"选择列","Select row":"选择行",Solid:"实线","Split cell horizontally":"横向拆分单元格","Split cell vertically":"纵向拆分单元格",Style:"样式","Table alignment toolbar":"表格对齐工具栏","Table cell text alignment":"表格单元格中的文本水平对齐","Table properties":"表格属性","Table toolbar":"表格工具栏",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'颜色无效。尝试使用"#FF0000"、"rgb(255,0,0)"或者"red"。','The value is invalid. Try "10px" or "2em" or simply "2".':"无效值。尝试使用“10px”、“2ex”或者只写“2”。","Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"垂直文本对齐工具栏",Width:"宽度"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e["zh-cn"]=e["zh-cn"]||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"第 %0 步，共 %1 步",Aquamarine:"海蓝色",Black:"黑色",Blue:"蓝色",Cancel:"取消","Dim grey":"暗灰色","Dropdown toolbar":"下拉工具栏","Edit block":"编辑框","Editor toolbar":"编辑器工具栏",Green:"绿色",Grey:"灰色","Insert paragraph after block":"在后面插入段落","Insert paragraph before block":"在前面插入段落","Light blue":"浅蓝色","Light green":"浅绿色","Light grey":"浅灰色",Next:"下一步",Orange:"橙色",Previous:"上一步",Purple:"紫色",Red:"红色",Redo:"重做","Remove color":"移除颜色","Restore default":"","Rich Text Editor":"富文本编辑器","Rich Text Editor, %0":"富文本编辑器， %0",Save:"保存","Select all":"全选","Show more items":"显示更多",Turquoise:"青色",Undo:"撤销","Upload in progress":"正在上传",White:"白色","Widget toolbar":"小部件工具栏",Yellow:"黄色"}),o.getPluralForm=function(e){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/build/translations/zh.js b/core/assets/vendor/ckeditor5/build/translations/zh.js
new file mode 100644
index 0000000000..2c15c89750
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/build/translations/zh.js
@@ -0,0 +1 @@
+!function(n){const i=n.zh=n.zh||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"置中對齊","Align left":"靠左對齊","Align right":"靠右對齊",Justify:"左右對齊","Text alignment":"文字對齊","Text alignment toolbar":"文字對齊"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.zh=i.zh||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"粗體",Code:"代碼",Italic:"斜體",Strikethrough:"刪除線",Subscript:"下標",Superscript:"上標",Underline:"底線"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.zh=i.zh||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"段落引用"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const e=n.zh=n.zh||{};e.dictionary=Object.assign(e.dictionary||{},{"Choose heading":"選取標題",Heading:"標題","Heading 1":"標題 1","Heading 2":"標題 2","Heading 3":"標題 3","Heading 4":"標題 4","Heading 5":"標題 5","Heading 6":"標題 6",Paragraph:"段落","Type or paste your content here.":"在此輸入或貼上你的內容。","Type your title":"輸入你的標題"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.zh=i.zh||{};n.dictionary=Object.assign(n.dictionary||{},{"Horizontal line":"水平線"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const i=e.zh=e.zh||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"置中圖片","Change image text alternative":"修改圖片的替代文字","Enter image caption":"輸入圖片說明","Full size image":"完整尺寸圖片","Image resize list":"圖片縮放清單","Image toolbar":"圖片工具","image widget":"圖片小工具","In line":"",Insert:"","Insert image":"插入圖片","Insert image via URL":"","Left aligned image":"向左對齊圖片",Original:"原始圖片","Resize image":"縮放圖片","Resize image to %0":"縮放圖片到 %0","Resize image to the original size":"縮放圖片到原始尺寸","Right aligned image":"向右對齊圖片","Side image":"側邊圖片","Text alternative":"替代文字",Update:"","Update image URL":"","Upload failed":"上傳失敗","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.zh=n.zh||{};i.dictionary=Object.assign(i.dictionary||{},{"Decrease indent":"減少縮排","Increase indent":"增加縮排"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const a=n.zh=n.zh||{};a.dictionary=Object.assign(a.dictionary||{},{"Choose language":"選擇語言",Language:"語言","Remove language":"移除語言"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(n){const i=n.zh=n.zh||{};i.dictionary=Object.assign(i.dictionary||{},{Downloadable:"可下載","Edit link":"編輯連結",Link:"連結","Link image":"圖片連結","Link URL":"連結˙ URL","Open in a new tab":"在新視窗開啟","Open link in new tab":"在新視窗開啟連結","This link has no URL":"連結沒有URL",Unlink:"移除連結"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const l=e.zh=e.zh||{};l.dictionary=Object.assign(l.dictionary||{},{"Bulleted List":"符號清單","Bulleted list styles toolbar":"",Circle:"",Decimal:"","Decimal with leading zero":"",Disc:"","Lower-latin":"","Lower–roman":"","Numbered List":"有序清單","Numbered list styles toolbar":"",Square:"","To-do List":"代辦清單","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"","Upper-latin":"","Upper-roman":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(i){const n=i.zh=i.zh||{};n.dictionary=Object.assign(n.dictionary||{},{Source:"原始碼"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const t=e.zh=e.zh||{};t.dictionary=Object.assign(t.dictionary||{},{"Align cell text to the bottom":"向下對齊","Align cell text to the center":"置中對齊","Align cell text to the left":"靠左對齊","Align cell text to the middle":"置中對齊","Align cell text to the right":"靠右對齊","Align cell text to the top":"向上對齊","Align table to the left":"靠左對齊","Align table to the right":"靠右對齊",Alignment:"對齊",Background:"背景顏色",Border:"邊框","Cell properties":"儲存格屬性","Center table":"置中對齊",Color:"文字顏色","Color picker":"顏色選擇",Column:"欄",Dashed:"虛線","Delete column":"刪除欄","Delete row":"刪除列",Dimensions:"尺寸",Dotted:"點線",Double:"雙線","Enter table caption":"",Groove:"內凹線","Header column":"標題欄","Header row":"標題列",Height:"高度","Horizontal text alignment toolbar":"水平對齊","Insert column left":"插入左方欄","Insert column right":"插入右方欄","Insert row above":"插入上方列","Insert row below":"插入下方列","Insert table":"插入表格",Inset:"內邊線","Justify cell text":"分散對齊","Merge cell down":"合併下方儲存格","Merge cell left":"合併左方儲存格","Merge cell right":"合併右方儲存格","Merge cell up":"合併上方儲存格","Merge cells":"合併儲存格",None:"無",Outset:"外框線",Padding:"儲存格留白",Ridge:"凸起線",Row:"列","Select column":"選擇欄","Select row":"選擇列",Solid:"實線","Split cell horizontally":"水平分割儲存格","Split cell vertically":"垂直分割儲存格",Style:"樣式","Table alignment toolbar":"表格對齊","Table cell text alignment":"儲存格文字對齊","Table properties":"表格屬性","Table toolbar":"表格工具",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'顏色代碼錯誤。試試看 "#FF0000" 或 "rgb(255, 0, 0)" 或 "red"。','The value is invalid. Try "10px" or "2em" or simply "2".':'尺寸代碼錯誤。試試看 "10px" 或 "2em" 或簡單寫 "2"。',"Toggle caption off":"","Toggle caption on":"","Vertical text alignment toolbar":"垂直對齊",Width:"寬度"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));!function(e){const o=e.zh=e.zh||{};o.dictionary=Object.assign(o.dictionary||{},{"%0 of %1":"%0/%1",Aquamarine:"淺綠色",Black:"黑色",Blue:"藍色",Cancel:"取消","Dim grey":"淡灰色","Dropdown toolbar":"下拉選單","Edit block":"編輯區塊","Editor toolbar":"編輯器工具",Green:"綠色",Grey:"灰色","Insert paragraph after block":"在這個區塊後面插入一個段落","Insert paragraph before block":"在這個區塊前面插入一個段落","Light blue":"亮藍色","Light green":"亮綠色","Light grey":"亮灰色",Next:"下一",Orange:"橘色",Previous:"上一",Purple:"紫色",Red:"紅色",Redo:"重做","Remove color":"移除顏色","Restore default":"","Rich Text Editor":"豐富文字編輯器","Rich Text Editor, %0":"豐富文字編輯器，%0",Save:"儲存","Select all":"選取全部","Show more items":"顯示更多",Turquoise:"藍綠色",Undo:"取消","Upload in progress":"正在上傳",White:"白色","Widget toolbar":"小工具",Yellow:"黃色"}),o.getPluralForm=function(e){return 0}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
\ No newline at end of file
diff --git a/core/assets/vendor/ckeditor5/drupal/README.md b/core/assets/vendor/ckeditor5/drupal/README.md
new file mode 100644
index 0000000000..2f42f6d7b1
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/README.md
@@ -0,0 +1,24 @@
+CKEditor 5 build tools
+----------------------
+
+This module contains .js files necessary for CKEditor 5.
+These files are all contained in js/build.
+
+The original files are created by downloading the ckeditor5 repo
+running `yarn install` and `yarn dll:build`.
+
+Inside the ckeditor5 repo, the files are in individual package folders,
+for example: `packages/ckeditor5-basic-styles/build/basic-styles.js`
+
+
+Drupal specific CKEditor 5 plugins
+----------------------------------
+
+The `yarn dll:build` command generates a json manifest.
+In the ckeditor5 repo it is in `build/ckeditor5-dll.manifest.json`
+When building a custom CKEditor 5 plugin, it must reference this file in order
+to correctly set any dependency paths.
+
+This module currently has custom plugins for images and drupal media.
+The source js is in `js/drupal/src/drupalImage` or `js/drupal/src/drupalMedia`
+The built js loaded by Drupal is in `js/build/drupal`
diff --git a/core/assets/vendor/ckeditor5/drupal/scripts/manifest.js b/core/assets/vendor/ckeditor5/drupal/scripts/manifest.js
new file mode 100644
index 0000000000..84e7cbb835
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/scripts/manifest.js
@@ -0,0 +1,46 @@
+// Generates a manifest if one is not available.
+// @todo there should be a way of enforcing version consistency between the
+//    Github CKEditor 5 used to create the manifest and the CKEditor version
+//    being used. Maybe this could happen in Drupal test coverage
+//    https://www.drupal.org/project/ckeditor5/issues/3221082.
+
+const fs = require('fs');
+const { exec } = require('child_process');
+
+const manifestPath =
+  './node_modules/dllCkeditor5/build/ckeditor5-dll.manifest.json';
+
+if (!fs.existsSync(manifestPath)) {
+  console.log(
+    'CKEditor manifest not available. Generating one now. This takes a while, but should only need to happen once.',
+  );
+  exec(
+    'yarn --cwd ./node_modules/dllCkeditor5 install',
+    (error, stdout, stderr) => {
+      if (error) {
+        console.log(`error: ${error.message}`);
+        return;
+      }
+
+      console.log(stdout);
+      exec(
+        'yarn --cwd ./node_modules/dllCkeditor5 dll:build',
+        (error, stdout, stderr) => {
+          if (error) {
+            console.log(`error: ${error.message}`);
+            return;
+          }
+
+          console.log(stdout);
+          if (fs.existsSync(manifestPath)) {
+            console.log(`Manifest created at  ${manifestPath}`);
+          } else {
+            console.log('error: Unable to create manifest.');
+          }
+        },
+      );
+    },
+  );
+} else {
+  console.log(`Manifest present at ${manifestPath}`);
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalEmphasis/src/drupalemphasis.js b/core/assets/vendor/ckeditor5/drupal/src/drupalEmphasis/src/drupalemphasis.js
new file mode 100644
index 0000000000..dcfc9c668b
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalEmphasis/src/drupalemphasis.js
@@ -0,0 +1,22 @@
+// cspell:ignore drupalemphasisediting
+
+import { Plugin } from 'ckeditor5/src/core';
+import DrupalEmphasisEditing from './drupalemphasisediting';
+
+class DrupalEmphasis extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get requires() {
+    return [DrupalEmphasisEditing];
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalEmphasis';
+  }
+}
+
+export default DrupalEmphasis;
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalEmphasis/src/drupalemphasisediting.js b/core/assets/vendor/ckeditor5/drupal/src/drupalEmphasis/src/drupalemphasisediting.js
new file mode 100644
index 0000000000..a4d8983ddb
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalEmphasis/src/drupalemphasisediting.js
@@ -0,0 +1,26 @@
+import { Plugin } from 'ckeditor5/src/core';
+
+/**
+ * Converts italic text into em.
+ */
+class DrupalEmphasisEditing extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalEmphasisEditing';
+  }
+
+  /**
+   * @inheritdoc
+   */
+  init() {
+    this.editor.conversion.for('downcast').attributeToElement({
+      model: 'italic',
+      view: 'em',
+      converterPriority: 'high',
+    });
+  }
+}
+
+export default DrupalEmphasisEditing;
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalEmphasis/src/index.js b/core/assets/vendor/ckeditor5/drupal/src/drupalEmphasis/src/index.js
new file mode 100644
index 0000000000..2f975a60fa
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalEmphasis/src/index.js
@@ -0,0 +1,7 @@
+// cspell:ignore drupalemphasis
+
+import DrupalEmphasis from './drupalemphasis';
+
+export default {
+  DrupalEmphasis,
+};
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalImage/README.md b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/README.md
new file mode 100644
index 0000000000..0ed6a476ba
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/README.md
@@ -0,0 +1,15 @@
+# ckeditor5-drupal-image
+Drupal image plugin for CKEditor5
+
+Provides required attributes `data-entity-uuid` and `data-entity-type`.
+
+## Usage
+
+This project is for creating minified js for [Drupal CKEditor5](http://drupal.org/project/ckeditor5)
+
+## Build
+
+Run `npm run build:dll` to create the minified js.
+
+Check the file path in `webpack.config.js` to ensure it points to the dll
+manifest in your copy of `ckeditor5`.
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/drupalimage.js b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/drupalimage.js
new file mode 100644
index 0000000000..a3c3014abe
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/drupalimage.js
@@ -0,0 +1,22 @@
+/* cspell:words drupalimageediting */
+
+import { Plugin } from 'ckeditor5/src/core';
+import DrupalImageEditing from './drupalimageediting';
+
+class DrupalImage extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get requires() {
+    return [DrupalImageEditing];
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalImage';
+  }
+}
+
+export default DrupalImage;
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/drupalimageediting.js b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/drupalimageediting.js
new file mode 100644
index 0000000000..287c329c5d
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/drupalimageediting.js
@@ -0,0 +1,426 @@
+import { Plugin } from 'ckeditor5/src/core';
+
+function createImageViewElement(writer) {
+  return writer.createEmptyElement('img');
+}
+
+function modelEntityUuidToDataAttribute() {
+  function converter(evt, data, conversionApi) {
+    const { item } = data;
+    const { consumable, writer } = conversionApi;
+
+    if (!consumable.consume(item, evt.name)) {
+      return;
+    }
+
+    const viewElement = conversionApi.mapper.toViewElement(item);
+    const imageInFigure = Array.from(viewElement.getChildren()).find(
+      (child) => child.name === 'img',
+    );
+
+    writer.setAttribute(
+      'data-entity-uuid',
+      data.attributeNewValue,
+      imageInFigure || viewElement,
+    );
+  }
+
+  return (dispatcher) => {
+    dispatcher.on('attribute:dataEntityUuid', converter);
+  };
+}
+
+function modelEntityTypeToDataAttribute() {
+  function converter(evt, data, conversionApi) {
+    const { item } = data;
+    const { consumable, writer } = conversionApi;
+
+    if (!consumable.consume(item, evt.name)) {
+      return;
+    }
+
+    const viewElement = conversionApi.mapper.toViewElement(item);
+    const imageInFigure = Array.from(viewElement.getChildren()).find(
+      (child) => child.name === 'img',
+    );
+
+    writer.setAttribute(
+      'data-entity-type',
+      data.attributeNewValue,
+      imageInFigure || viewElement,
+    );
+  }
+
+  return (dispatcher) => {
+    dispatcher.on('attribute:dataEntityType', converter);
+  };
+}
+
+function modelImageStyleToDataAttribute() {
+  function converter(evt, data, conversionApi) {
+    const { item } = data;
+    const { consumable, writer } = conversionApi;
+
+    const mapping = {
+      alignLeft: 'left',
+      alignRight: 'right',
+      alignCenter: 'center',
+      alignBlockRight: 'right',
+      alignBlockLeft: 'left',
+    };
+
+    // Consume only for the values that can be converted into data-align.
+    if (
+      !mapping[data.attributeNewValue] ||
+      !consumable.consume(item, evt.name)
+    ) {
+      return;
+    }
+
+    const viewElement = conversionApi.mapper.toViewElement(item);
+    const imageInFigure = Array.from(viewElement.getChildren()).find(
+      (child) => child.name === 'img',
+    );
+
+    writer.setAttribute(
+      'data-align',
+      mapping[data.attributeNewValue],
+      imageInFigure || viewElement,
+    );
+  }
+
+  return (dispatcher) => {
+    dispatcher.on('attribute:imageStyle', converter, { priority: 'high' });
+  };
+}
+
+function modelImageWidthToAttribute() {
+  function converter(evt, data, conversionApi) {
+    const { item } = data;
+    const { consumable, writer } = conversionApi;
+
+    if (!consumable.consume(item, evt.name)) {
+      return;
+    }
+
+    const viewElement = conversionApi.mapper.toViewElement(item);
+    const imageInFigure = Array.from(viewElement.getChildren()).find(
+      (child) => child.name === 'img',
+    );
+
+    writer.setAttribute(
+      'width',
+      data.attributeNewValue.replace('px', ''),
+      imageInFigure || viewElement,
+    );
+  }
+
+  return (dispatcher) => {
+    dispatcher.on('attribute:width:imageInline', converter, {
+      priority: 'high',
+    });
+    dispatcher.on('attribute:width:imageBlock', converter, {
+      priority: 'high',
+    });
+  };
+}
+
+function modelImageHeightToAttribute() {
+  function converter(evt, data, conversionApi) {
+    const { item } = data;
+    const { consumable, writer } = conversionApi;
+
+    if (!consumable.consume(item, evt.name)) {
+      return;
+    }
+
+    const viewElement = conversionApi.mapper.toViewElement(item);
+    const imageInFigure = Array.from(viewElement.getChildren()).find(
+      (child) => child.name === 'img',
+    );
+
+    writer.setAttribute(
+      'height',
+      data.attributeNewValue.replace('px', ''),
+      imageInFigure || viewElement,
+    );
+  }
+
+  return (dispatcher) => {
+    dispatcher.on('attribute:height:imageInline', converter, {
+      priority: 'high',
+    });
+    dispatcher.on('attribute:height:imageBlock', converter, {
+      priority: 'high',
+    });
+  };
+}
+
+function viewImageToModelImage(editor) {
+  function converter(evt, data, conversionApi) {
+    const { viewItem } = data;
+    const { writer, consumable, safeInsert, updateConversionResult, schema } =
+      conversionApi;
+    const attributesToConsume = [];
+
+    let image;
+
+    // Not only check if a given `img` view element has been consumed, but also
+    // verify it has `src` attribute present.
+    if (!consumable.test(viewItem, { name: true, attributes: 'src' })) {
+      return;
+    }
+
+    // Create image that's allowed in the given context.
+    if (schema.checkChild(data.modelCursor, 'imageInline')) {
+      image = writer.createElement('imageInline', {
+        src: viewItem.getAttribute('src'),
+      });
+    } else {
+      image = writer.createElement('imageBlock', {
+        src: viewItem.getAttribute('src'),
+      });
+    }
+
+    if (
+      editor.plugins.has('ImageStyleEditing') &&
+      consumable.test(viewItem, { name: true, attributes: 'data-align' })
+    ) {
+      // https://ckeditor.com/docs/ckeditor5/latest/api/module_image_imagestyle_utils.html#constant-defaultStyles
+      const dataToPresentationMapBlock = {
+        left: 'alignBlockLeft',
+        center: 'alignCenter',
+        right: 'alignBlockRight',
+      };
+      const dataToPresentationMapInline = {
+        left: 'alignLeft',
+        right: 'alignRight',
+      };
+
+      const dataAlign = viewItem.getAttribute('data-align');
+      const alignment = image.is('element', 'imageBlock')
+        ? dataToPresentationMapBlock[dataAlign]
+        : dataToPresentationMapInline[dataAlign];
+
+      writer.setAttribute('imageStyle', alignment, image);
+
+      // Make sure the attribute can be consumed after successful `safeInsert`
+      // operation.
+      attributesToConsume.push('data-align');
+    }
+
+    // Check if the view element has still unconsumed `data-caption` attribute.
+    // Also, we can add caption only to block image.
+    if (
+      image.is('element', 'imageBlock') &&
+      consumable.test(viewItem, { name: true, attributes: 'data-caption' })
+    ) {
+      // Create `caption` model element. Thanks to that element the rest of the
+      // `ckeditor5-plugin` converters can recognize this image as a block image
+      // with a caption.
+      const caption = writer.createElement('caption');
+
+      writer.insertText(viewItem.getAttribute('data-caption'), caption);
+
+      // Insert the caption element into image, as a last child.
+      writer.append(caption, image);
+
+      // Make sure the attribute can be consumed after successful `safeInsert`
+      // operation.
+      attributesToConsume.push('data-caption');
+    }
+
+    if (
+      consumable.test(viewItem, { name: true, attributes: 'data-entity-uuid' })
+    ) {
+      writer.setAttribute(
+        'dataEntityUuid',
+        viewItem.getAttribute('data-entity-uuid'),
+        image,
+      );
+      attributesToConsume.push('data-entity-uuid');
+    }
+
+    if (
+      consumable.test(viewItem, { name: true, attributes: 'data-entity-type' })
+    ) {
+      writer.setAttribute(
+        'dataEntityType',
+        viewItem.getAttribute('data-entity-type'),
+        image,
+      );
+      attributesToConsume.push('data-entity-type');
+    }
+
+    // Try to place the image in the allowed position.
+    if (!safeInsert(image, data.modelCursor)) {
+      return;
+    }
+
+    // Mark given element as consumed. Now other converters will not process it
+    // anymore.
+    consumable.consume(viewItem, {
+      name: true,
+      attributes: attributesToConsume,
+    });
+
+    // Make sure `modelRange` and `modelCursor` is up to date after inserting
+    // new nodes into the model.
+    updateConversionResult(image, data);
+  }
+
+  return (dispatcher) => {
+    dispatcher.on('element:img', converter, { priority: 'high' });
+  };
+}
+
+export default class DrupalImageEditing extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalImageEditing';
+  }
+
+  /**
+   * @inheritdoc
+   */
+  init() {
+    const editor = this.editor;
+    const conversion = editor.conversion;
+    const { schema } = editor.model;
+
+    if (schema.isRegistered('imageInline')) {
+      schema.extend('imageInline', {
+        allowAttributes: [
+          'dataEntityUuid',
+          'dataEntityType',
+          'width',
+          'height',
+        ],
+      });
+    }
+
+    if (schema.isRegistered('imageBlock')) {
+      schema.extend('imageBlock', {
+        allowAttributes: [
+          'dataEntityUuid',
+          'dataEntityType',
+          'width',
+          'height',
+        ],
+      });
+    }
+
+    // Conversion.
+    conversion
+      .for('upcast')
+      .add(viewImageToModelImage(editor))
+      .attributeToAttribute({
+        view: {
+          name: 'img',
+          key: 'width',
+        },
+        model: {
+          key: 'width',
+          value: (viewElement) => {
+            return `${viewElement.getAttribute('width')}px`;
+          },
+        },
+      })
+      .attributeToAttribute({
+        view: {
+          name: 'img',
+          key: 'height',
+        },
+        model: {
+          key: 'height',
+          value: (viewElement) => {
+            return `${viewElement.getAttribute('height')}px`;
+          },
+        },
+      });
+
+    conversion
+      .for('downcast')
+      .add(modelEntityUuidToDataAttribute())
+      .add(modelEntityTypeToDataAttribute());
+
+    conversion
+      .for('dataDowncast')
+      .add((dispatcher) => {
+        dispatcher.on(
+          'insert:caption',
+          (evt, data, conversionApi) => {
+            if (!conversionApi.consumable.consume(data.item, 'insert')) {
+              return;
+            }
+
+            let captionText = '';
+
+            Array.from(editor.model.createRangeIn(data.item)).forEach(({ item }) => {
+              if (!conversionApi.consumable.consume(item, 'insert')) {
+                return;
+              }
+
+              if (item.is('$textProxy')) {
+                captionText += item.data;
+              }
+            });
+
+            if (captionText) {
+              const imageViewElement = conversionApi.mapper.toViewElement(
+                data.item.parent,
+              );
+
+              conversionApi.writer.setAttribute(
+                'data-caption',
+                captionText,
+                imageViewElement,
+              );
+            }
+          },
+          { priority: 'high' },
+        );
+      })
+      .add((dispatcher) => {
+        dispatcher.on(
+          'insert:$text',
+          (evt, data) => {
+            const { parent } = data.item;
+            const isInImageCaption =
+              parent.is('element', 'caption') &&
+              parent.parent.is('element', 'imageBlock');
+
+            if (isInImageCaption) {
+              // Prevent `modelViewSplitOnInsert()` function inside
+              // ckeditor5-list package from interfering when downcasting a text
+              // inside caption. Normally aforementioned function tries to
+              // mitigate side effects of inserting content in the middle of the
+              // lists, but in this case we want to stop the conversion from
+              // proceeding.
+              evt.stop();
+            }
+          },
+          // Make sure we are overriding the `modelViewSplitOnInsert() converter
+          // from ckeditor5-list.
+          { priority: 'highest' },
+        );
+      })
+      .elementToElement({
+        model: 'imageBlock',
+        view: (modelElement, { writer }) =>
+          createImageViewElement(writer, 'imageBlock'),
+        converterPriority: 'high',
+      })
+      .elementToElement({
+        model: 'imageInline',
+        view: (modelElement, { writer }) =>
+          createImageViewElement(writer, 'imageInline'),
+        converterPriority: 'high',
+      })
+      .add(modelImageStyleToDataAttribute())
+      .add(modelImageWidthToAttribute())
+      .add(modelImageHeightToAttribute());
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/imageupload/drupalfilerepository.js b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/imageupload/drupalfilerepository.js
new file mode 100644
index 0000000000..737f0d82ba
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/imageupload/drupalfilerepository.js
@@ -0,0 +1,43 @@
+/* cspell:words uploadurl drupalimageuploadadapter  */
+
+import { Plugin } from 'ckeditor5/src/core';
+import { FileRepository } from 'ckeditor5/src/upload';
+import { logWarning } from 'ckeditor5/src/utils';
+import DrupalImageUploadAdapter from './drupalimageuploadadapter';
+
+export default class DrupalFileRepository extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get requires() {
+    return [FileRepository];
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalFileRepository';
+  }
+
+  /**
+   * @inheritdoc
+   */
+  init() {
+    const options = this.editor.config.get('drupalImageUpload');
+
+    if (!options) {
+      return;
+    }
+
+    if (!options.uploadUrl) {
+      logWarning('simple-upload-adapter-missing-uploadurl');
+
+      return;
+    }
+
+    this.editor.plugins.get(FileRepository).createUploadAdapter = (loader) => {
+      return new DrupalImageUploadAdapter(loader, options);
+    };
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/imageupload/drupalimageupload.js b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/imageupload/drupalimageupload.js
new file mode 100644
index 0000000000..4b4100b780
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/imageupload/drupalimageupload.js
@@ -0,0 +1,26 @@
+/* cspell:words drupalimageuploadediting drupalfilerepository */
+
+import { Plugin } from 'ckeditor5/src/core';
+import DrupalImageUploadEditing from './drupalimageuploadediting';
+import DrupalFileRepository from './drupalfilerepository';
+
+/**
+ * Integrates the CKEditor image upload with the Drupal.
+ */
+class DrupalImageUpload extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  static get requires() {
+    return [DrupalFileRepository, DrupalImageUploadEditing];
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalImageUpload';
+  }
+}
+
+export default DrupalImageUpload;
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/imageupload/drupalimageuploadadapter.js b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/imageupload/drupalimageuploadadapter.js
new file mode 100644
index 0000000000..d72465d0a6
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/imageupload/drupalimageuploadadapter.js
@@ -0,0 +1,147 @@
+/* cspell:words simpleuploadadapter filerepository */
+
+/**
+ * Upload adapter. Copied from @ckeditor5/ckeditor5-upload/src/adapters/simpleuploadadapter
+ *
+ * @private
+ * @implements module:upload/filerepository~UploadAdapter
+ */
+export default class DrupalImageUploadAdapter {
+  /**
+   * Creates a new adapter instance.
+   *
+   * @param {module:upload/filerepository~FileLoader} loader
+   * @param {module:upload/adapters/simpleuploadadapter~SimpleUploadConfig} options
+   */
+  constructor(loader, options) {
+    /**
+     * FileLoader instance to use during the upload.
+     *
+     * @member {module:upload/filerepository~FileLoader} #loader
+     */
+    this.loader = loader;
+
+    /**
+     * The configuration of the adapter.
+     *
+     * @member {module:upload/adapters/simpleuploadadapter~SimpleUploadConfig} #options
+     */
+    this.options = options;
+  }
+
+  /**
+   * Starts the upload process.
+   *
+   * @see module:upload/filerepository~UploadAdapter#upload
+   * @returns {Promise}
+   */
+  upload() {
+    return this.loader.file.then(
+      (file) =>
+        new Promise((resolve, reject) => {
+          this._initRequest();
+          this._initListeners(resolve, reject, file);
+          this._sendRequest(file);
+        }),
+    );
+  }
+
+  /**
+   * Aborts the upload process.
+   *
+   * @see module:upload/filerepository~UploadAdapter#abort
+   * @returns {Promise}
+   */
+  abort() {
+    if (this.xhr) {
+      this.xhr.abort();
+    }
+  }
+
+  /**
+   * Initializes the `XMLHttpRequest` object using the URL specified as
+   * {@link module:upload/adapters/simpleuploadadapter~SimpleUploadConfig#uploadUrl `simpleUpload.uploadUrl`} in the editor's
+   * configuration.
+   *
+   * @private
+   */
+  _initRequest() {
+    this.xhr = new XMLHttpRequest();
+
+    this.xhr.open('POST', this.options.uploadUrl, true);
+    this.xhr.responseType = 'json';
+  }
+
+  /**
+   * Initializes XMLHttpRequest listeners
+   *
+   * @private
+   * @param {Function} resolve Callback function to be called when the request is successful.
+   * @param {Function} reject Callback function to be called when the request cannot be completed.
+   * @param {File} file Native File object.
+   */
+  _initListeners(resolve, reject, file) {
+    const xhr = this.xhr;
+    const loader = this.loader;
+    const genericErrorText = `Couldn't upload file: ${file.name}.`;
+
+    xhr.addEventListener('error', () => reject(genericErrorText));
+    xhr.addEventListener('abort', () => reject());
+    xhr.addEventListener('load', () => {
+      const response = xhr.response;
+
+      if (!response || response.error) {
+        return reject(
+          response && response.error && response.error.message
+            ? response.error.message
+            : genericErrorText,
+        );
+      }
+
+      resolve({
+        urls: { default: response.url },
+        dataEntityUuid: response.uuid ? response.uuid : '',
+        dataEntityType: response.entity_type ? response.entity_type : '',
+      });
+    });
+
+    // Upload progress when it is supported.
+    /* istanbul ignore else */
+    if (xhr.upload) {
+      xhr.upload.addEventListener('progress', (evt) => {
+        if (evt.lengthComputable) {
+          loader.uploadTotal = evt.total;
+          loader.uploaded = evt.loaded;
+        }
+      });
+    }
+  }
+
+  /**
+   * Prepares the data and sends the request.
+   *
+   * @private
+   * @param {File} file File instance to be uploaded.
+   */
+  _sendRequest(file) {
+    // Set headers if specified.
+    const headers = this.options.headers || {};
+
+    // Use the withCredentials flag if specified.
+    const withCredentials = this.options.withCredentials || false;
+
+    Object.keys(headers).forEach((headerName) => {
+      this.xhr.setRequestHeader(headerName, headers[headerName]);
+    });
+
+    this.xhr.withCredentials = withCredentials;
+
+    // Prepare the form data.
+    const data = new FormData();
+
+    data.append('upload', file);
+
+    // Send the request.
+    this.xhr.send(data);
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/imageupload/drupalimageuploadediting.js b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/imageupload/drupalimageuploadediting.js
new file mode 100644
index 0000000000..4213e004ee
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/imageupload/drupalimageuploadediting.js
@@ -0,0 +1,32 @@
+import { Plugin } from 'ckeditor5/src/core';
+
+export default class DrupalImageUploadEditing extends Plugin {
+  /**
+   * @inheritdoc
+   */
+  init() {
+    const { editor } = this;
+    const imageUploadEditing = editor.plugins.get('ImageUploadEditing');
+    imageUploadEditing.on('uploadComplete', (evt, { data, imageElement }) => {
+      editor.model.change((writer) => {
+        writer.setAttribute(
+          'dataEntityUuid',
+          data.dataEntityUuid,
+          imageElement,
+        );
+        writer.setAttribute(
+          'dataEntityType',
+          data.dataEntityType,
+          imageElement,
+        );
+      });
+    });
+  }
+
+  /**
+   * @inheritdoc
+   */
+  static get pluginName() {
+    return 'DrupalImageUploadEditing';
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/index.js b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/index.js
new file mode 100644
index 0000000000..eba2630a8c
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalImage/src/index.js
@@ -0,0 +1,9 @@
+// cspell:ignore imageupload imageresize drupalimage drupalimageupload drupalimageresize
+
+import DrupalImage from './drupalimage';
+import DrupalImageUpload from './imageupload/drupalimageupload';
+
+export default {
+  DrupalImage,
+  DrupalImageUpload,
+};
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/README.md b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/README.md
new file mode 100644
index 0000000000..aeca36e7e8
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/README.md
@@ -0,0 +1,38 @@
+# ckeditor5-drupal-media
+Drupal media plugin for CKEditor5
+
+Provides required attributes `data-entity-uuid` and `data-entity-type`.
+
+## Usage
+
+This project is for creating minified js for [Drupal CKEditor5](http://drupal.org/project/ckeditor5)
+
+When using this plugin, you must provide the following config in `drupalMedia`:
+
+1. `libraryURL`: The URL at route media_library.ui to open a browse dialog
+2. `previewURL`: The URL at route media.filter.preview to render a media preview
+3. `openDialog`: The function to open a Drupal dialog
+4. `themeError`: The markup to display if the preview fails
+
+Example config:
+
+```
+ClassicEditor
+  .create(editorElement, {
+    drupalMedia: {
+      libraryURL: '/media-library?...',
+      previewURL: '/media/{filter_format}/preview',
+      openDialog: Drupal.ckeditor5.openDialog,
+      themeError: Drupal.theme('mediaEmbedPreviewError'),
+    },
+ });
+  .then( ... )
+  .catch( ... );
+```
+
+## Build
+
+Run `npm run dll:build` to create the minified js.
+
+Check the file path in `webpack.config.js` to ensure it points to the dll
+manifest in your copy of `ckeditor5`.
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/drupalmedia.js b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/drupalmedia.js
new file mode 100644
index 0000000000..8f22c1ecd4
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/drupalmedia.js
@@ -0,0 +1,19 @@
+/* cspell:words drupalmediaediting drupalmediaui drupalmediatoolbar mediaimagetextalternative */
+
+import { Plugin } from 'ckeditor5/src/core';
+import DrupalMediaEditing from './drupalmediaediting';
+import DrupalMediaUI from './drupalmediaui';
+import DrupalMediaToolbar from './drupalmediatoolbar';
+
+import MediaImageTextAlternative from './mediaimagetextalternative';
+
+export default class DrupalMedia extends Plugin {
+  static get requires() {
+    return [
+      DrupalMediaEditing,
+      DrupalMediaUI,
+      DrupalMediaToolbar,
+      MediaImageTextAlternative,
+    ];
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/drupalmediaediting.js b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/drupalmediaediting.js
new file mode 100644
index 0000000000..418d58fb74
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/drupalmediaediting.js
@@ -0,0 +1,131 @@
+/* cspell:words insertdrupalmedia */
+
+import { Plugin } from 'ckeditor5/src/core';
+import { toWidget, Widget } from 'ckeditor5/src/widget';
+
+import InsertDrupalMediaCommand from './insertdrupalmedia';
+
+/**
+ * MediaFilterController::preview requires the saved element.
+ * Not previewing data-caption since it does not get updated by new changes.
+ * @todo: is there a better way to get the rendered dataDowncast string
+ *   https://www.drupal.org/project/ckeditor5/issues/3231337?
+ */
+const renderElement = (modelElement) => {
+  const attrs = modelElement.getAttributes();
+  let element = '<drupal-media';
+  attrs.forEach((attr) => {
+    if (attr[0] !== 'data-caption') {
+      element += ` ${attr[0]}="${attr[1]}"`;
+    }
+  });
+  element += '></drupal-media>';
+
+  return element;
+};
+
+export default class DrupalMediaEditing extends Plugin {
+  static get requires() {
+    return [Widget];
+  }
+
+  init() {
+    this.attrs = [
+      'alt',
+      'data-align',
+      'data-caption',
+      'data-entity-type',
+      'data-entity-uuid',
+      'data-view-mode',
+    ];
+    const options = this.editor.config.get('drupalMedia');
+    if (!options) {
+      return;
+    }
+    const { previewURL, themeError } = options;
+    this.previewURL = previewURL;
+    this.themeError =
+      themeError ||
+      `
+      <p>${this.editor.t(
+        'An error occurred while trying to preview the media. Please save your work and reload this page.',
+      )}<p>
+    `;
+
+    this._defineSchema();
+    this._defineConverters();
+
+    this.editor.commands.add(
+      'insertDrupalMedia',
+      new InsertDrupalMediaCommand(this.editor),
+    );
+  }
+
+  async _fetchPreview(url, query) {
+    const response = await fetch(`${url}?${new URLSearchParams(query)}`);
+    if (response.ok) {
+      const label = response.headers.get('drupal-media-label');
+      const preview = await response.text();
+      return { label, preview };
+    }
+
+    return this.themeError;
+  }
+
+  _defineSchema() {
+    const schema = this.editor.model.schema;
+    schema.register('drupalMedia', {
+      allowWhere: '$block',
+      isObject: true,
+      isContent: true,
+      allowAttributes: this.attrs,
+    });
+  }
+
+  _defineConverters() {
+    const conversion = this.editor.conversion;
+    conversion.for('upcast').elementToElement({
+      view: {
+        name: 'drupal-media',
+      },
+      model: 'drupalMedia',
+    });
+
+    conversion.for('dataDowncast').elementToElement({
+      model: 'drupalMedia',
+      view: {
+        name: 'drupal-media',
+      },
+    });
+
+    conversion.for('editingDowncast').elementToElement({
+      model: 'drupalMedia',
+      view: (modelElement, { writer: viewWriter }) => {
+        const container = viewWriter.createContainerElement('div', {
+          class: 'drupal-media',
+        });
+        const media = viewWriter.createRawElement('div', {}, (domElement) => {
+          if (this.previewURL) {
+            this._fetchPreview(this.previewURL, {
+              text: renderElement(modelElement),
+              uuid: modelElement.getAttribute('data-entity-uuid'),
+            }).then(({ label, preview }) => {
+              domElement.innerHTML = preview;
+              domElement.setAttribute('aria-label', label);
+            });
+          } else {
+            domElement.innerHTML = this.themeError;
+            domElement.setAttribute('aria-label', 'drupal-media');
+          }
+        });
+        viewWriter.insert(viewWriter.createPositionAt(container, 0), media);
+        viewWriter.setCustomProperty('drupalMedia', true, container);
+        return toWidget(container, viewWriter, { label: 'media widget' });
+      },
+    });
+
+    this.attrs.forEach((attr) => {
+      conversion.attributeToAttribute({ model: attr, view: attr });
+    });
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/drupalmediatoolbar.js b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/drupalmediatoolbar.js
new file mode 100644
index 0000000000..06ca60e28f
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/drupalmediatoolbar.js
@@ -0,0 +1,27 @@
+import { Plugin } from 'ckeditor5/src/core';
+import { WidgetToolbarRepository } from 'ckeditor5/src/widget';
+
+import { getSelectedDrupalMediaWidget } from './utils';
+
+export default class DrupalMediaToolbar extends Plugin {
+  static get requires() {
+    return [WidgetToolbarRepository];
+  }
+
+  static get pluginName() {
+    return 'DrupalMediaToolbar';
+  }
+
+  afterInit() {
+    const editor = this.editor;
+    const { t } = editor;
+    const widgetToolbarRepository = editor.plugins.get(WidgetToolbarRepository);
+
+    widgetToolbarRepository.register('drupalMedia', {
+      ariaLabel: t('Drupal Media toolbar'),
+      items: editor.config.get('drupalMedia.toolbar') || [],
+      // Get the selected image or an image containing the figcaption with the selection inside.
+      getRelatedElement: (selection) => getSelectedDrupalMediaWidget(selection),
+    });
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/drupalmediaui.js b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/drupalmediaui.js
new file mode 100644
index 0000000000..75cbbd6f77
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/drupalmediaui.js
@@ -0,0 +1,43 @@
+import { Plugin } from 'ckeditor5/src/core';
+import { ButtonView } from 'ckeditor5/src/ui';
+// cspell:ignore medialibrary
+import mediaIcon from '../theme/icons/medialibrary.svg';
+
+export default class DrupalMediaUI extends Plugin {
+  init() {
+    const editor = this.editor;
+    const options = this.editor.config.get('drupalMedia');
+    if (!options) {
+      return;
+    }
+
+    const { libraryURL, openDialog, dialogSettings = {} } = options;
+    if (!libraryURL || typeof openDialog !== 'function') {
+      return;
+    }
+
+    editor.ui.componentFactory.add('drupalMedia', (locale) => {
+      const command = editor.commands.get('insertDrupalMedia');
+      const buttonView = new ButtonView(locale);
+
+      buttonView.set({
+        label: editor.t('Insert Drupal Media'),
+        icon: mediaIcon,
+        tooltip: true,
+      });
+
+      buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');
+      this.listenTo(buttonView, 'execute', () => {
+        openDialog(
+          libraryURL,
+          ({ attributes }) => {
+            editor.execute('insertDrupalMedia', attributes);
+          },
+          dialogSettings,
+        );
+      });
+
+      return buttonView;
+    });
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/index.js b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/index.js
new file mode 100644
index 0000000000..f52e6bc9ca
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/index.js
@@ -0,0 +1,12 @@
+import DrupalMedia from './drupalmedia';
+// cspell:ignore mediaimagetextalternative
+import MediaImageTextAlternative from './mediaimagetextalternative';
+import MediaImageTextAlternativeEditing from './mediaimagetextalternative/mediaimagetextalternativeediting';
+import MediaImageTextAlternativeUi from './mediaimagetextalternative/mediaimagetextalternativeui';
+
+export default {
+  DrupalMedia,
+  MediaImageTextAlternative,
+  MediaImageTextAlternativeEditing,
+  MediaImageTextAlternativeUi,
+};
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/insertdrupalmedia.js b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/insertdrupalmedia.js
new file mode 100644
index 0000000000..f9c3632612
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/insertdrupalmedia.js
@@ -0,0 +1,24 @@
+import { Command } from 'ckeditor5/src/core';
+
+function createDrupalMedia(writer, attributes) {
+  const drupalMedia = writer.createElement('drupalMedia', attributes);
+  return drupalMedia;
+}
+
+export default class InsertDrupalMediaCommand extends Command {
+  execute(attributes) {
+    this.editor.model.change((writer) => {
+      this.editor.model.insertContent(createDrupalMedia(writer, attributes));
+    });
+  }
+
+  refresh() {
+    const model = this.editor.model;
+    const selection = model.document.selection;
+    const allowedIn = model.schema.findAllowedParent(
+      selection.getFirstPosition(),
+      'drupalMedia',
+    );
+    this.isEnabled = allowedIn !== null;
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative.js b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative.js
new file mode 100644
index 0000000000..74b8f23ec4
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative.js
@@ -0,0 +1,22 @@
+import { Plugin } from 'ckeditor5/src/core';
+import MediaImageTextAlternativeEditing from './mediaimagetextalternative/mediaimagetextalternativeediting';
+import MediaImageTextAlternativeUi from './mediaimagetextalternative/mediaimagetextalternativeui';
+
+/**
+ * The media image text alternative plugin.
+ */
+export default class MediaImageTextAlternative extends Plugin {
+  /**
+   * @inheritDoc
+   */
+  static get requires() {
+    return [MediaImageTextAlternativeEditing, MediaImageTextAlternativeUi];
+  }
+
+  /**
+   * @inheritDoc
+   */
+  static get pluginName() {
+    return 'MediaImageTextAlternative';
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativecommand.js b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativecommand.js
new file mode 100644
index 0000000000..a86bddc635
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativecommand.js
@@ -0,0 +1,67 @@
+import { Command } from 'ckeditor5/src/core';
+import { isDrupalMedia } from '../utils';
+
+/**
+ * The media image text alternative command.
+ *
+ * This is used to change the `alt` attribute of `<drupalMedia>` elements.
+ *
+ * @see https://github.com/ckeditor/ckeditor5/blob/master/packages/ckeditor5-image/src/imagetextalternative/imagetextalternativecommand.js
+ */
+export default class MediaImageTextAlternativeCommand extends Command {
+  /**
+   * The command value: `false` if there is no `alt` attribute, otherwise the value of the `alt` attribute.
+
+  /**
+   * @inheritDoc
+   */
+  refresh() {
+    const element = this.editor.model.document.selection.getSelectedElement();
+
+    this.isEnabled = false;
+    if (isDrupalMedia(element)) {
+      this._isMediaImage(element).then((hasImageField) => {
+        this.isEnabled = hasImageField;
+      });
+    }
+
+    if (isDrupalMedia(element) && element.hasAttribute('alt')) {
+      this.value = element.getAttribute('alt');
+    } else {
+      this.value = false;
+    }
+  }
+
+  /**
+   * Executes the command.
+   *
+   * @param {Object} options
+   * @param {String} options.newValue The new value of the `alt` attribute to set.
+   */
+  execute(options) {
+    const model = this.editor.model;
+    const imageElement = model.document.selection.getSelectedElement();
+
+    model.change((writer) => {
+      writer.setAttribute('alt', options.newValue, imageElement);
+    });
+  }
+
+  async _isMediaImage(modelElement) {
+    const options = this.editor.config.get('drupalMedia');
+    if (!options) {
+      return null;
+    }
+
+    const { isMediaUrl } = options;
+    const query = new URLSearchParams({
+      uuid: modelElement.getAttribute('data-entity-uuid'),
+    });
+    const response = await fetch(`${isMediaUrl}?${query}`);
+    if (response.ok) {
+      return JSON.parse(await response.text());
+    }
+
+    return null;
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativeediting.js b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativeediting.js
new file mode 100644
index 0000000000..ccbca2d8d7
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativeediting.js
@@ -0,0 +1,26 @@
+/* cspell:words mediaimagetextalternativecommand textalternativeformview */
+
+import { Plugin } from 'ckeditor5/src/core';
+import MediaImageTextAlternativeCommand from './mediaimagetextalternativecommand';
+
+/**
+ * The image text alternative editing plugin.
+ */
+export default class MediaImageTextAlternativeEditing extends Plugin {
+  /**
+   * @inheritDoc
+   */
+  static get pluginName() {
+    return 'MediaImageTextAlternativeEditing';
+  }
+
+  /**
+   * @inheritDoc
+   */
+  init() {
+    this.editor.commands.add(
+      'mediaImageTextAlternative',
+      new MediaImageTextAlternativeCommand(this.editor),
+    );
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativeui.js b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativeui.js
new file mode 100644
index 0000000000..03ac6260c6
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative/mediaimagetextalternativeui.js
@@ -0,0 +1,217 @@
+/* cspell:words textalternativeformview */
+
+import { Plugin, icons } from 'ckeditor5/src/core';
+import {
+  ButtonView,
+  ContextualBalloon,
+  clickOutsideHandler,
+} from 'ckeditor5/src/ui';
+
+import { getSelectedDrupalMediaWidget } from '../utils';
+import {
+  getBalloonPositionData,
+  repositionContextualBalloon,
+} from '../ui/utils';
+
+import TextAlternativeFormView from './ui/textalternativeformview';
+
+/**
+ * The media image text alternative UI plugin.
+ *
+ * @see https://github.com/ckeditor/ckeditor5/blob/master/packages/ckeditor5-image/src/imagetextalternative/imagetextalternativeui.js
+ */
+export default class MediaImageTextAlternativeUi extends Plugin {
+  /**
+   * @inheritDoc
+   */
+  static get requires() {
+    return [ContextualBalloon];
+  }
+
+  /**
+   * @inheritDoc
+   */
+  static get pluginName() {
+    return 'MediaImageTextAlternativeUi';
+  }
+
+  /**
+   * @inheritDoc
+   */
+  init() {
+    this._createButton();
+    this._createForm();
+  }
+
+  /**
+   * @inheritDoc
+   */
+  destroy() {
+    super.destroy();
+    this._form.destroy();
+  }
+
+  /**
+   * Creates a button showing the balloon panel for changing the image text
+   * alternative and registers it in the editor ComponentFactory.
+   */
+  _createButton() {
+    const editor = this.editor;
+    const t = editor.t;
+
+    editor.ui.componentFactory.add('mediaImageTextAlternative', (locale) => {
+      const command = editor.commands.get('mediaImageTextAlternative');
+      const view = new ButtonView(locale);
+
+      view.set({
+        label: t('Override media image text alternative'),
+        icon: icons.lowVision,
+        tooltip: true,
+      });
+
+      view.bind('isVisible').to(command, 'isEnabled');
+
+      this.listenTo(view, 'execute', () => {
+        this._showForm();
+      });
+
+      return view;
+    });
+  }
+
+  /**
+   * Creates the {@link module:image/imagetextalternative/ui/textalternativeformview~TextAlternativeFormView}
+   * form.
+   *
+   * @private
+   */
+  _createForm() {
+    const editor = this.editor;
+    const view = editor.editing.view;
+    const viewDocument = view.document;
+
+    /**
+     * The contextual balloon plugin instance.
+     */
+    this._balloon = this.editor.plugins.get('ContextualBalloon');
+
+    /**
+     * A form containing a textarea and buttons, used to change the `alt` text value.
+     */
+    this._form = new TextAlternativeFormView(editor.locale);
+
+    // Render the form so its #element is available for clickOutsideHandler.
+    this._form.render();
+
+    this.listenTo(this._form, 'submit', () => {
+      editor.execute('mediaImageTextAlternative', {
+        newValue: this._form.labeledInput.fieldView.element.value,
+      });
+
+      this._hideForm(true);
+    });
+
+    this.listenTo(this._form, 'cancel', () => {
+      this._hideForm(true);
+    });
+
+    // Close the form on Esc key press.
+    this._form.keystrokes.set('Esc', (data, cancel) => {
+      this._hideForm(true);
+      cancel();
+    });
+
+    // Reposition the balloon or hide the form if an image widget is no longer selected.
+    this.listenTo(editor.ui, 'update', () => {
+      if (!getSelectedDrupalMediaWidget(viewDocument.selection)) {
+        this._hideForm(true);
+      } else if (this._isVisible) {
+        repositionContextualBalloon(editor);
+      }
+    });
+
+    // Close on click outside of balloon panel element.
+    clickOutsideHandler({
+      emitter: this._form,
+      activator: () => this._isVisible,
+      contextElements: [this._balloon.view.element],
+      callback: () => this._hideForm(),
+    });
+  }
+
+  /**
+   * Shows the form in a balloon.
+   */
+  _showForm() {
+    if (this._isVisible) {
+      return;
+    }
+
+    const editor = this.editor;
+    const command = editor.commands.get('mediaImageTextAlternative');
+    const labeledInput = this._form.labeledInput;
+
+    this._form.disableCssTransitions();
+
+    if (!this._isInBalloon) {
+      this._balloon.add({
+        view: this._form,
+        position: getBalloonPositionData(editor),
+      });
+    }
+
+    // Make sure that each time the panel shows up, the field remains in sync with the value of
+    // the command. If the user typed in the input, then canceled the balloon (`labeledInput#value`
+    // stays unaltered) and re-opened it without changing the value of the command, they would see the
+    // old value instead of the actual value of the command.
+    // https://github.com/ckeditor/ckeditor5-image/issues/114
+    labeledInput.fieldView.element.value = command.value || '';
+    labeledInput.fieldView.value = labeledInput.fieldView.element.value;
+
+    this._form.labeledInput.fieldView.select();
+
+    this._form.enableCssTransitions();
+  }
+
+  /**
+   * Removes the {@link #_form} from the {@link #_balloon}.
+   *
+   * @param {Boolean} [focusEditable=false] Controls whether the editing view is focused afterwards.
+   * @private
+   */
+  _hideForm(focusEditable) {
+    if (!this._isInBalloon) {
+      return;
+    }
+
+    // Blur the input element before removing it from DOM to prevent issues in some browsers.
+    // See https://github.com/ckeditor/ckeditor5/issues/1501.
+    if (this._form.focusTracker.isFocused) {
+      this._form.saveButtonView.focus();
+    }
+
+    this._balloon.remove(this._form);
+
+    if (focusEditable) {
+      this.editor.editing.view.focus();
+    }
+  }
+
+  /**
+   * Returns `true` when the form is the visible view in the balloon.
+   *
+   * @type {Boolean}
+   */
+  get _isVisible() {
+    return this._balloon.visibleView === this._form;
+  }
+
+  /**
+   * Returns `true` when the form is in the balloon.
+   *
+   * @type {Boolean}
+   */
+  get _isInBalloon() {
+    return this._balloon.hasView(this._form);
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative/ui/textalternativeformview.js b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative/ui/textalternativeformview.js
new file mode 100644
index 0000000000..b4062264f5
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/mediaimagetextalternative/ui/textalternativeformview.js
@@ -0,0 +1,164 @@
+import {
+  ButtonView,
+  FocusCycler,
+  LabeledFieldView,
+  View,
+  ViewCollection,
+  createLabeledInputText,
+  injectCssTransitionDisabler,
+  submitHandler,
+} from 'ckeditor5/src/ui';
+import { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';
+import { icons } from 'ckeditor5/src/core';
+
+// cspell:ignore focusables
+
+export default class TextAlternativeFormView extends View {
+  /**
+   * @inheritDoc
+   */
+  constructor(locale) {
+    super(locale);
+
+    const t = this.locale.t;
+
+    /**
+     * Tracks information about the DOM focus in the form.
+     */
+    this.focusTracker = new FocusTracker();
+
+    /**
+     * An instance of the KeystrokeHandler.
+     */
+    this.keystrokes = new KeystrokeHandler();
+
+    /**
+     * An input with a label.
+     */
+    this.labeledInput = this._createLabeledInputView();
+
+    /**
+     * A button used to submit the form.
+     */
+    this.saveButtonView = this._createButton(
+      t('Save'),
+      icons.check,
+      'ck-button-save',
+    );
+    this.saveButtonView.type = 'submit';
+
+    /**
+     * A button used to cancel the form.
+     */
+    this.cancelButtonView = this._createButton(
+      t('Cancel'),
+      icons.cancel,
+      'ck-button-cancel',
+      'cancel',
+    );
+
+    /**
+     * A collection of views which can be focused in the form.
+     */
+    this._focusables = new ViewCollection();
+
+    /**
+     * Helps cycling over focusables in the form.
+     */
+    this._focusCycler = new FocusCycler({
+      focusables: this._focusables,
+      focusTracker: this.focusTracker,
+      keystrokeHandler: this.keystrokes,
+      actions: {
+        // Navigate form fields backwards using the Shift + Tab keystroke.
+        focusPrevious: 'shift + tab',
+
+        // Navigate form fields forwards using the Tab key.
+        focusNext: 'tab',
+      },
+    });
+
+    this.setTemplate({
+      tag: 'form',
+
+      attributes: {
+        class: ['ck', 'ck-text-alternative-form', 'ck-responsive-form'],
+        tabindex: '-1',
+      },
+
+      children: [this.labeledInput, this.saveButtonView, this.cancelButtonView],
+    });
+
+    injectCssTransitionDisabler(this);
+  }
+
+  /**
+   * @inheritDoc
+   */
+  render() {
+    super.render();
+
+    this.keystrokes.listenTo(this.element);
+
+    submitHandler({ view: this });
+
+    [this.labeledInput, this.saveButtonView, this.cancelButtonView].forEach(
+      (v) => {
+        // Register the view as focusable.
+        this._focusables.add(v);
+
+        // Register the view in the focus tracker.
+        this.focusTracker.add(v.element);
+      },
+    );
+  }
+
+  /**
+   * Creates the button view.
+   *
+   * @private
+   * @param {String} label The button label
+   * @param {String} icon The button's icon.
+   * @param {String} className The additional button CSS class name.
+   * @param {String} [eventName] The event name that the ButtonView#execute event will be delegated to.
+   * @returns ButtonView The button view instance.
+   */
+  _createButton(label, icon, className, eventName) {
+    const button = new ButtonView(this.locale);
+
+    button.set({
+      label,
+      icon,
+      tooltip: true,
+    });
+
+    button.extendTemplate({
+      attributes: {
+        class: className,
+      },
+    });
+
+    if (eventName) {
+      button.delegate('execute').to(this, eventName);
+    }
+
+    return button;
+  }
+
+  /**
+   * Creates an input with a label.
+   *
+   * @returns LabeledFieldView Labeled field view instance.
+   */
+  _createLabeledInputView() {
+    const t = this.locale.t;
+    const labeledInput = new LabeledFieldView(
+      this.locale,
+      createLabeledInputText,
+    );
+
+    labeledInput.label = t('Override text alternative');
+
+    return labeledInput;
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/ui/utils.js b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/ui/utils.js
new file mode 100644
index 0000000000..8ba4a5e4bf
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/ui/utils.js
@@ -0,0 +1,44 @@
+import { BalloonPanelView } from 'ckeditor5/src/ui';
+import { getSelectedDrupalMediaWidget } from '../utils';
+
+/**
+ * Returns the positioning options that control the geometry of the contextual
+ * balloon with respect to the selected element in the editor content.
+ *
+ * @param editor {Editor} The editor instance.
+ * @returns {Options}
+ */
+export function getBalloonPositionData(editor) {
+  const editingView = editor.editing.view;
+  const defaultPositions = BalloonPanelView.defaultPositions;
+
+  return {
+    target: editingView.domConverter.viewToDom(
+      editingView.document.selection.getSelectedElement(),
+    ),
+    positions: [
+      defaultPositions.northArrowSouth,
+      defaultPositions.northArrowSouthWest,
+      defaultPositions.northArrowSouthEast,
+      defaultPositions.southArrowNorth,
+      defaultPositions.southArrowNorthWest,
+      defaultPositions.southArrowNorthEast,
+    ],
+  };
+}
+
+/**
+ * A helper utility that positions the contextual balloon instance with respect
+ * to the image in the editor content, if one is selected.
+ *
+ * @param editor {Editor} The editor instance.
+ */
+export function repositionContextualBalloon(editor) {
+  const balloon = editor.plugins.get('ContextualBalloon');
+
+  if (getSelectedDrupalMediaWidget(editor.editing.view.document.selection)) {
+    const position = getBalloonPositionData(editor);
+
+    balloon.updatePosition(position);
+  }
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/utils.js b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/utils.js
new file mode 100644
index 0000000000..4f2267b675
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/src/utils.js
@@ -0,0 +1,26 @@
+import { isWidget } from 'ckeditor5/src/widget';
+
+/**
+ * Checks if the provided model element is `drupalMedia`.
+ *
+ * @param modelElement {Element} The model element to be checked.
+ * @returns {boolean}
+ */
+export function isDrupalMedia(modelElement) {
+  return !!modelElement && modelElement.is('element', 'drupalMedia');
+}
+
+export function isDrupalMediaWidget(viewElement) {
+  return (
+    isWidget(viewElement) && !!viewElement.getCustomProperty('drupalMedia')
+  );
+}
+
+export function getSelectedDrupalMediaWidget(selection) {
+  const viewElement = selection.getSelectedElement();
+  if (viewElement && isDrupalMediaWidget(viewElement)) {
+    return viewElement;
+  }
+
+  return null;
+}
diff --git a/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/theme/icons/medialibrary.svg b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/theme/icons/medialibrary.svg
new file mode 100644
index 0000000000..f96cff494c
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/drupal/src/drupalMedia/theme/icons/medialibrary.svg
@@ -0,0 +1 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M19.1873 4.86414L10.2509 6.86414V7.02335H10.2499V15.5091C9.70972 15.1961 9.01793 15.1048 8.34069 15.3136C7.12086 15.6896 6.41013 16.8967 6.75322 18.0096C7.09631 19.1226 8.3633 19.72 9.58313 19.344C10.6666 19.01 11.3484 18.0203 11.2469 17.0234H11.2499V9.80173L18.1803 8.25067V14.3868C17.6401 14.0739 16.9483 13.9825 16.2711 14.1913C15.0513 14.5674 14.3406 15.7744 14.6836 16.8875C15.0267 18.0004 16.2937 18.5978 17.5136 18.2218C18.597 17.8877 19.2788 16.8982 19.1773 15.9011H19.1803V8.02687L19.1873 8.0253V4.86414Z" fill="black"/><path fill-rule="evenodd" clip-rule="evenodd" d="M13.5039 0.743652H0.386932V12.1603H13.5039V0.743652ZM12.3379 1.75842H1.55289V11.1454H1.65715L4.00622 8.86353L6.06254 10.861L9.24985 5.91309L11.3812 9.22179L11.7761 8.6676L12.3379 9.45621V1.75842ZM6.22048 4.50869C6.22048 5.58193 5.35045 6.45196 4.27722 6.45196C3.20398 6.45196 2.33395 5.58193 2.33395 4.50869C2.33395 3.43546 3.20398 2.56543 4.27722 2.56543C5.35045 2.56543 6.22048 3.43546 6.22048 4.50869Z" fill="black"/></svg>
diff --git a/core/assets/vendor/ckeditor5/scripts/build.js b/core/assets/vendor/ckeditor5/scripts/build.js
new file mode 100644
index 0000000000..4a09730def
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/scripts/build.js
@@ -0,0 +1,166 @@
+const path = require('path');
+const { execShellCommand } = require('./utils');
+const { copyFile, rmdir, mkdir, rename, readdir, appendFile, readFile } = require('fs').promises;
+const os = require('os');
+
+// cSpell:words subpackages
+
+/**
+ * Gets directory name for a tmp directory.
+ *
+ * @returns {string}
+ */
+const getTmpDir = () => {
+  const dateString = Date.now().toString(36);
+  const randomness = Math.random().toString(36).substr(2);
+  return os.tmpdir() + '/' + dateString + randomness;
+};
+
+(async () => {
+  const buildPath = 'modules/ckeditor5/js/build';
+
+  console.log('🗄   Creating back up of the old build files');
+  const tmpDir = getTmpDir();
+  await rename(buildPath, tmpDir);
+  await mkdir(buildPath);
+
+  const restoreOldBuild = async () => {
+    await rmdir(buildPath, { recursive: true});
+    await rename(tmpDir, buildPath);
+  }
+
+  console.log('🏗   Building Drupal plugins and CKEditor 5 from sources')
+  await execShellCommand('yarn ckeditor5:drupal:build').then(async (stdout) => {
+    console.log(stdout);
+
+    console.log('🔥  Build was successful, copying files from CKEditor 5 build')
+    const ckeditorPath = './node_modules/dllCkeditor5'
+
+
+    /**
+     * Declare an array that defines what needs to be copied over.
+     *
+     * @prop {string} pack
+     *   The name of the CKEditor package, used to determine the source
+     *   directory.
+     * @prop {Array} files
+     *   An array of files to be copied over from the package.
+     * @prop {string} [folder]
+     *   Folder that allows copying files from outside the subpackages.
+     */
+    const process = [
+      {
+        pack: 'ckeditor5-alignment',
+        files: ['build/alignment.js'],
+      },
+      {
+        pack: 'ckeditor5-basic-styles',
+        files: ['build/basic-styles.js'],
+      },
+      {
+        pack: 'ckeditor5-block-quote',
+        files: ['build/block-quote.js'],
+      },
+      {
+        pack: 'ckeditor5-editor-classic',
+        files: ['build/editor-classic.js'],
+      },
+      {
+        pack: 'ckeditor5-editor-decoupled',
+        files: ['build/editor-decoupled.js'],
+      },
+      {
+        pack: 'ckeditor5-essentials',
+        files: ['build/essentials.js'],
+      },
+      {
+        pack: 'ckeditor5-heading',
+        files: ['build/heading.js'],
+      },
+      {
+        pack: 'ckeditor5-horizontal-line',
+        files: ['build/horizontal-line.js'],
+      },
+      {
+        pack: 'ckeditor5-image',
+        files: ['build/image.js'],
+      },
+      {
+        pack: 'ckeditor5-indent',
+        files: ['build/indent.js'],
+      },
+      {
+        pack: 'ckeditor5-language',
+        files: ['build/language.js'],
+      },
+      {
+        pack: 'ckeditor5-link',
+        files: ['build/link.js'],
+      },
+      {
+        pack: 'ckeditor5-list',
+        files: ['build/list.js'],
+      },
+      {
+        pack: 'ckeditor5-source-editing',
+        files: ['build/source-editing.js'],
+      },
+      {
+        pack: 'ckeditor5-table',
+        files: ['build/table.js'],
+      },
+      {
+        pack: 'ckeditor5-html-support',
+        files: ['build/html-support.js'],
+      },
+      {
+        pack: 'ckeditor5-dll',
+        files: ['build/ckeditor5-dll.js'],
+        folder: '',
+      }
+    ];
+
+    await rmdir(`${buildPath}/translations`).catch(() => {
+      // Nothing to do if the directory doesn't exist.
+    });
+    await mkdir(`${buildPath}/translations`);
+
+    // Use Array.reduce for sequential processing to avoid corrupting the
+    // contents of the concatenated translation files.
+    await process.reduce((previous, { pack, files = [], folder = null }) => {
+      const sourceFolder = folder !== null ? `${ckeditorPath}/${folder}` : `${ckeditorPath}/packages/${pack}`;
+      const packageTranslationPath = `${sourceFolder}/build/translations`;
+
+      return previous.then(() => {
+        return Promise.all([
+          ...files.map((file) => {
+            const name = path.basename(`${sourceFolder}/${file}`);
+            return copyFile(`${sourceFolder}/${file}`, `${buildPath}/${name}`);
+          }),
+          readdir(packageTranslationPath, { withFileTypes: true }).then(async (translationFiles) => {
+            return translationFiles.map(async (translationFile) => {
+              if (!translationFile.isDirectory()) {
+                // Translation files are concatenated to a single translation
+                // file to avoid having to make multiple network requests to
+                // various translation files. As a trade off, this leads into
+                // some redundant translations depending on configuration.
+                await readFile(`${packageTranslationPath}/${translationFile.name}`).then(async (contents) => {
+                  return appendFile(`${buildPath}/translations/${translationFile.name}`, contents);
+                });
+              }
+            }, Promise.resolve());
+          }).catch(() => {
+            // Do nothing as it's expected that not all packages ship translations.
+          })
+        ]).then(() => {
+          console.log(`✅  ${pack} updated`)
+        });
+      });
+    }, Promise.resolve());
+  }).catch(async () => {
+    await restoreOldBuild();
+
+    process.exit(1)
+  });
+
+})();
diff --git a/core/assets/vendor/ckeditor5/scripts/utils.js b/core/assets/vendor/ckeditor5/scripts/utils.js
new file mode 100644
index 0000000000..163dabd871
--- /dev/null
+++ b/core/assets/vendor/ckeditor5/scripts/utils.js
@@ -0,0 +1,24 @@
+/**
+ * Executes a shell command and return it as a Promise.
+ *
+ * @param cmd {string}
+ *   Command to be executed.
+ *
+ * @return {Promise<string>}
+ */
+const execShellCommand = (cmd) => {
+  const exec = require('child_process').exec;
+  return new Promise((resolve, reject) => {
+    exec(cmd, (error, stdout, stderr) => {
+      if (error) {
+        console.warn(`🚨  ${error}`);
+        reject(error);
+      }
+      resolve(stdout? stdout : stderr);
+    });
+  });
+}
+
+module.exports = {
+  execShellCommand
+};
diff --git a/core/composer.json b/core/composer.json
index 17365aabdb..96628a2a32 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -64,6 +64,7 @@
         "drupal/book": "self.version",
         "drupal/breakpoint": "self.version",
         "drupal/ckeditor": "self.version",
+        "drupal/ckeditor5": "self.version",
         "drupal/claro": "self.version",
         "drupal/classy": "self.version",
         "drupal/color": "self.version",
diff --git a/core/core.libraries.yml b/core/core.libraries.yml
index ee69d9c619..a8e554104b 100644
--- a/core/core.libraries.yml
+++ b/core/core.libraries.yml
@@ -22,6 +22,172 @@ ckeditor:
   js:
     assets/vendor/ckeditor/ckeditor.js: { preprocess: false, minified: true }
 
+ckeditor5:
+  remote: &ckeditor5Remote https://github.com/ckeditor/ckeditor5
+  version: &ckeditor5Version "29.0.0"
+  license: &ckeditor5License
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/ckeditor/ckeditor5/blob/master/LICENSE.md
+    gpl-compatible: true
+  js:
+    assets/vendor/ckeditor5/build/ckeditor5-dll.js: { preprocess: false, minified: true }
+
+ckeditor5.editorClassic:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/editor-classic.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.editorDecoupled:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/editor-decoupled.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+    - core/ckeditor5.htmlSupport
+
+ckeditor5.internal:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/essentials.js: { preprocess: false, minified: true }
+    assets/vendor/ckeditor5/build/heading.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.basic:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/basic-styles.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.blockquote:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/block-quote.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.image:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/image.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.link:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/link.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.list:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/list.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.horizontalLine:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/horizontal-line.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.htmlSupport:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/html-support.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.alignment:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/alignment.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.indent:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/indent.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.sourceEditing:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/source-editing.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.table:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/table.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+ckeditor5.language:
+  remote: *ckeditor5Remote
+  version: *ckeditor5Version
+  license: *ckeditor5License
+  js:
+    assets/vendor/ckeditor5/build/language.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
+drupal.ckeditor5.image:
+  js:
+    assets/vendor/ckeditor5/build/drupal/drupalImage.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5.image
+
+drupal.ckeditor5.emphasis:
+  version: VERSION
+  js:
+    assets/vendor/ckeditor5/build/drupal/drupalEmphasis.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5.basic
+
+drupal.ckeditor5.media:
+  js:
+    assets/vendor/ckeditor5/build/drupal/drupalMedia.js: { preprocess: false, minified: true }
+  dependencies:
+    - core/ckeditor5
+
 css.escape:
   remote: https://github.com/mathiasbynens/CSS.escape
   version: "1.5.1"
diff --git a/core/modules/ckeditor5/ckeditor5.ckeditor5.yml b/core/modules/ckeditor5/ckeditor5.ckeditor5.yml
new file mode 100644
index 0000000000..c5a8efa1da
--- /dev/null
+++ b/core/modules/ckeditor5/ckeditor5.ckeditor5.yml
@@ -0,0 +1,439 @@
+# CKEditor 5 Drupal plugin definitions.
+# @see this module's README.md for details on defining CKEditor 5 plugins in
+# Drupal.
+
+ckeditor5_essentials:
+  ckeditor5:
+    plugins: [essentials.Essentials]
+  drupal:
+    label: Essentials
+    library: core/ckeditor5.internal
+    admin_library: ckeditor5/admin.internal
+    toolbar_items:
+      undo:
+        label: Undo
+      redo:
+        label: Redo
+    elements:
+      - <br>
+    conditions: []
+
+ckeditor5_paragraph:
+  ckeditor5:
+    plugins: [paragraph.Paragraph]
+  drupal:
+    label: Paragraph
+    library: core/ckeditor5.internal
+    admin_library: ckeditor5/admin.internal
+    elements:
+      - <p>
+
+ckeditor5_heading:
+  ckeditor5:
+    plugins: [heading.Heading]
+    config:
+      heading:
+        # These are the options passed to the CKEditor heading constructor
+        # @see https://ckeditor.com/docs/ckeditor5/latest/api/module_heading_heading-HeadingConfig.html#member-options
+        #   for details on what each of these config properties do.
+        options:
+          - { model: 'paragraph', title: 'Paragraph', class: 'ck-heading_paragraph' }
+          - { model: 'heading1', view: 'h1', title: 'Heading 1', class: 'ck-heading_heading1' }
+          - { model: 'heading2', view: 'h2', title: 'Heading 2', class: 'ck-heading_heading2' }
+          - { model: 'heading3', view: 'h3', title: 'Heading 3', class: 'ck-heading_heading3' }
+          - { model: 'heading4', view: 'h4', title: 'Heading 4', class: 'ck-heading_heading4' }
+          - { model: 'heading5', view: 'h5', title: 'Heading 5', class: 'ck-heading_heading5' }
+          - { model: 'heading6', view: 'h6', title: 'Heading 6', class: 'ck-heading_heading6' }
+  drupal:
+    label: Headings
+    library: core/ckeditor5.internal
+    admin_library: ckeditor5/admin.heading
+    class: Drupal\ckeditor5\Plugin\CKEditor5Plugin\Heading
+    toolbar_items:
+      heading:
+        label: Heading
+    elements:
+      - <h1>
+      - <h2>
+      - <h3>
+      - <h4>
+      - <h5>
+      - <h6>
+
+ckeditor5_htmlSupport:
+  ckeditor5:
+    plugins: [htmlSupport.GeneralHtmlSupport]
+    config:
+      htmlSupport:
+        allow:
+          -
+            name:
+              regexp:
+                pattern: /.*/
+            attributes: true
+            classes: true
+            styles: true
+  drupal:
+    label: Arbitrary HTML support
+    elements: false
+    library: core/ckeditor5.htmlSupport
+    # @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface::getEnabledDefinitions()
+    conditions: []
+
+ckeditor5_sourceEditing:
+  ckeditor5:
+    plugins:
+      - sourceEditing.SourceEditing
+      - htmlSupport.GeneralHtmlSupport
+  drupal:
+    label: Source editing
+    class: \Drupal\ckeditor5\Plugin\CKEditor5Plugin\SourceEditing
+    # This is the only CKEditor 5 plugin allowed to generate a superset of elements.
+    # @see \Drupal\ckeditor5\Plugin\CKEditor5Plugin\SourceEditing::getElementsSubset()
+    elements: ['<*>']
+    library: core/ckeditor5.sourceEditing
+    admin_library: ckeditor5/admin.sourceEditing
+    toolbar_items:
+      sourceEditing:
+        label: Source
+
+ckeditor5_bold:
+  ckeditor5:
+    plugins: [basicStyles.Bold]
+  drupal:
+    label: Bold
+    library: core/ckeditor5.basic
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      bold:
+        label: Bold
+    elements:
+      - <strong>
+
+ckeditor5_emphasis:
+  ckeditor5:
+    plugins:
+      - basicStyles.Italic
+      - drupalEmphasis.DrupalEmphasis
+  drupal:
+    label: Emphasis
+    library: core/drupal.ckeditor5.emphasis
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      italic:
+        label: Italic
+    elements:
+      - <em>
+
+ckeditor5_underline:
+  ckeditor5:
+    plugins: [basicStyles.Underline]
+  drupal:
+    label: Underline
+    library: core/ckeditor5.basic
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      underline:
+        label: Underline
+    elements:
+      - <u>
+
+ckeditor5_code:
+  ckeditor5:
+    plugins: [basicStyles.Code]
+  drupal:
+    label: Code
+    library: core/ckeditor5.basic
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      code:
+        label: Code
+    elements:
+      - <code>
+
+ckeditor5_strikethrough:
+  ckeditor5:
+    plugins: [basicStyles.Strikethrough]
+  drupal:
+    label: Strikethrough
+    library: core/ckeditor5.basic
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      strikethrough:
+        label: Strikethrough
+    elements:
+      - <s>
+
+ckeditor5_subscript:
+  ckeditor5:
+    plugins: [basicStyles.Subscript]
+  drupal:
+    label: Subscript
+    library: core/ckeditor5.basic
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      subscript:
+        label: Subscript
+    elements:
+      - <sub>
+
+ckeditor5_superscript:
+  ckeditor5:
+    plugins: [basicStyles.Superscript]
+  drupal:
+    label: Superscript
+    library: core/ckeditor5.basic
+    admin_library: ckeditor5/admin.basic
+    toolbar_items:
+      superscript:
+        label: Superscript
+    elements:
+      - <sup>
+
+ckeditor5_blockquote:
+  ckeditor5:
+    plugins:
+      - blockQuote.BlockQuote
+  drupal:
+    label: Block quote
+    library: core/ckeditor5.blockquote
+    admin_library: ckeditor5/admin.blockquote
+    toolbar_items:
+      blockQuote:
+        label: Block quote
+    elements:
+      - <blockquote>
+
+ckeditor5_link:
+  ckeditor5:
+    plugins:
+      - link.Link
+  drupal:
+    label: Link
+    library: core/ckeditor5.link
+    admin_library: ckeditor5/admin.link
+    toolbar_items:
+      link:
+        label: Link
+    elements:
+      - <a href>
+
+ckeditor5_list:
+  ckeditor5:
+    plugins: [list.List]
+  drupal:
+    label: List
+    library: core/ckeditor5.list
+    admin_library: ckeditor5/admin.list
+    toolbar_items:
+      bulletedList:
+        label: Bulleted list
+      numberedList:
+        label: Numbered list
+    elements:
+      - <ul>
+      - <ol>
+      - <li>
+
+ckeditor5_horizontalLine:
+  ckeditor5:
+    plugins: [horizontalLine.HorizontalLine]
+  drupal:
+    label: Horizontal line
+    library: core/ckeditor5.horizontalLine
+    admin_library: ckeditor5/admin.horizontalLine
+    toolbar_items:
+      horizontalLine:
+        label: Horizontal line
+    elements:
+      - <hr>
+
+ckeditor5_alignment:
+  ckeditor5:
+    plugins: [alignment.Alignment]
+    config:
+      # @see core/modules/system/css/components/align.module.css
+      alignment:
+        options:
+          - name: left
+            className: text-align-left
+          - name: center
+            className: text-align-center
+          - name: right
+            className: text-align-right
+          - name: justify
+            className: text-align-justify
+  drupal:
+    label: Alignment
+    library: core/ckeditor5.alignment
+    admin_library: ckeditor5/admin.alignment
+    toolbar_items:
+      alignment:
+        label: Text alignment
+      "alignment:left":
+        label: Align left
+      "alignment:center":
+        label: Align center
+      "alignment:right":
+        label: Align right
+      "alignment:justify":
+        label: justify
+    elements:
+      - <$block class="text-align-left text-align-center text-align-right text-align-justify">
+
+ckeditor5_table:
+  ckeditor5:
+    plugins:
+      - table.Table
+      - table.TableToolbar
+    config:
+      table:
+        contentToolbar: [tableColumn, tableRow, mergeTableCells]
+  drupal:
+    label: Table
+    library: core/ckeditor5.table
+    admin_library: ckeditor5/admin.table
+    toolbar_items:
+      insertTable:
+        label: table
+    elements:
+      - <table>
+      - <tr>
+      - <td>
+      - <th>
+      - <thead>
+      - <tbody>
+      - <tfoot>
+
+ckeditor5_image:
+  ckeditor5:
+    plugins:
+      - image.Image
+      - image.ImageToolbar
+      - drupalImage.DrupalImage
+    config:
+      image:
+        toolbar: [imageTextAlternative]
+  drupal:
+    label: Image
+    library: core/drupal.ckeditor5.image
+    elements:
+      - <img src alt data-entity-uuid data-entity-type height width>
+    conditions:
+      toolbarItem: uploadImage
+      imageUploadStatus: true
+
+ckeditor5_imageCaption:
+  ckeditor5:
+    plugins:
+      - image.ImageCaption
+    config:
+      image:
+        toolbar: [toggleImageCaption]
+  drupal:
+    label: Image caption
+    elements:
+      - <img data-caption>
+    conditions:
+      toolbarItem: uploadImage
+      imageUploadStatus: true
+      filter: filter_caption
+
+ckeditor5_imageAlign:
+  ckeditor5:
+    plugins:
+      - image.ImageStyle
+    config:
+      image:
+        toolbar:
+          - name: 'imageStyle:icons'
+            items:
+              - 'imageStyle:alignLeft'
+              - 'imageStyle:alignCenter'
+              - 'imageStyle:alignRight'
+            defaultItem: 'imageStyle:alignCenter'
+  drupal:
+    label: Image align
+    elements:
+      - <img data-align>
+    conditions:
+      toolbarItem: uploadImage
+      imageUploadStatus: true
+      filter: filter_align
+
+ckeditor5_indent:
+  ckeditor5:
+    plugins: [indent.Indent]
+  drupal:
+    label: Indent
+    elements: false
+    library: core/ckeditor5.indent
+    admin_library: ckeditor5/admin.indent
+    toolbar_items:
+      indent:
+        label: Indent
+      outdent:
+        label: Outdent
+
+ckeditor5_language:
+  ckeditor5:
+    plugins: [language.TextPartLanguage]
+  drupal:
+    label: Language
+    library: ckeditor5/ckeditor5.language
+    admin_library: ckeditor5/admin.language
+    class: Drupal\ckeditor5\Plugin\CKEditor5Plugin\Language
+    toolbar_items:
+      textPartLanguage:
+        label: Language
+    elements:
+      - <span lang dir>
+
+media_media:
+  provider: media
+  ckeditor5:
+    plugins:
+      - drupalMedia.DrupalMedia
+    config:
+      drupalMedia:
+        themeError:
+          func:
+            name: Drupal.theme
+            args: [mediaEmbedPreviewError]
+            invoke: true
+  drupal:
+    label: Media
+    library: ckeditor5/drupal.ckeditor5.media
+    class: Drupal\ckeditor5\Plugin\CKEditor5Plugin\Media
+    elements:
+      - <drupal-media data-entity-type data-entity-uuid alt>
+    conditions:
+      filter: media_embed
+
+media_library_mediaLibrary:
+  provider: media_library
+  ckeditor5:
+    plugins: []
+    config:
+      drupalMedia:
+        toolbar: [mediaImageTextAlternative]
+        openDialog:
+          func:
+            name: Drupal.ckeditor5.openDialog
+            invoke: false
+        dialogSettings:
+          height: 75%
+          dialogClass: media-library-widget-modal
+          title: Add or select media
+  drupal:
+    label: Media Library
+    elements: false
+    admin_library: ckeditor5/admin.drupalmedia
+    class: Drupal\ckeditor5\Plugin\CKEditor5Plugin\MediaLibrary
+    library: editor/drupal.editor.dialog
+    toolbar_items:
+        drupalMedia:
+          label: Drupal media
+    conditions:
+      filter: media_embed
+      toolbarItem: drupalMedia
diff --git a/core/modules/ckeditor5/ckeditor5.info.yml b/core/modules/ckeditor5/ckeditor5.info.yml
new file mode 100644
index 0000000000..6d93d11a3f
--- /dev/null
+++ b/core/modules/ckeditor5/ckeditor5.info.yml
@@ -0,0 +1,8 @@
+name: CKEditor 5
+type: module
+description: "WYSIWYG editing for rich text fields using CKEditor 5."
+version: VERSION
+package: Core (Experimental)
+lifecycle: experimental
+dependencies:
+  - drupal:editor
diff --git a/core/modules/ckeditor5/ckeditor5.libraries.yml b/core/modules/ckeditor5/ckeditor5.libraries.yml
new file mode 100644
index 0000000000..467a7d5435
--- /dev/null
+++ b/core/modules/ckeditor5/ckeditor5.libraries.yml
@@ -0,0 +1,155 @@
+# cspell:ignore imageupload
+
+ckeditor5.language:
+  css:
+    component:
+      css/language.css: {}
+  dependencies:
+    - core/ckeditor5.language
+
+drupal.ckeditor5:
+  js:
+    js/ckeditor5.js: {}
+  css:
+    theme:
+      css/quickedit.css: { }
+  dependencies:
+    - core/jquery
+    - core/drupal
+    - core/drupal.debounce
+    - core/ckeditor5.editorClassic
+    - core/ckeditor5.editorDecoupled
+    - core/ckeditor5
+    - editor/drupal.editor
+    - ckeditor5/drupal.ckeditor5.quickedit-temporary-work-around
+
+drupal.ckeditor5.quickedit-temporary-work-around:
+  deprecated: "Temporary work-around until https://www.drupal.org/project/drupal/issues/3196689 lands."
+  css:
+    theme:
+      css/quickedit-override.css: {}
+
+drupal.ckeditor5.media:
+  js:
+    js/media_embed_ckeditor5.theme.js: {}
+  dependencies:
+    - core/drupal
+    - core/drupal.ckeditor5.media
+
+ie11.user.warnings:
+  js:
+    js/ie11.user.warnings.js: { }
+  css:
+    theme:
+      css/ie-warnings.css: { }
+  dependencies:
+    - core/drupal
+    - core/drupal.message
+    - editor/drupal.editor
+    - core/modernizr
+
+ie11.filter.warnings:
+  js:
+    js/ie11.filter.warnings.js: {}
+  dependencies:
+    - core/drupal
+    - core/drupal.message
+    - core/once
+    - core/modernizr
+
+drupal.ckeditor5.filter.admin:
+  js:
+    js/ckeditor5.filter.admin.js: {}
+  css:
+    theme:
+      css/filter.admin.css: { }
+  dependencies:
+    - core/drupal
+    - core/drupal.message
+    - core/once
+    - core/drupal.ajax
+
+admin:
+  js:
+    js/ckeditor5.admin.js: { }
+  css:
+    theme:
+      css/toolbar.admin.css: { }
+  dependencies:
+    - core/sortable
+    - filter/drupal.filter.admin
+    - core/jquery
+    - core/jquery.once
+    - core/once
+
+admin.internal:
+  css:
+    theme:
+      css/internal.admin.css: { }
+
+admin.basic:
+  css:
+    theme:
+      css/basic.admin.css: { }
+
+admin.blockquote:
+  css:
+    theme:
+      css/blockquote.admin.css: { }
+
+admin.link:
+  css:
+    theme:
+      css/link.admin.css: { }
+
+admin.list:
+  css:
+    theme:
+      css/list.admin.css: { }
+
+admin.heading:
+  css:
+    theme:
+      css/heading.admin.css: { }
+  dependencies:
+    - core/ckeditor5.internal
+
+admin.horizontalLine:
+  css:
+    theme:
+      css/horizontal-line.admin.css: { }
+
+admin.alignment:
+  css:
+    theme:
+      css/alignment.admin.css: { }
+
+admin.imageupload:
+  css:
+    theme:
+      css/imageupload.admin.css: { }
+
+admin.indent:
+  css:
+    theme:
+      css/indent.admin.css: { }
+
+admin.language:
+  css:
+    theme:
+      css/language.admin.css: { }
+
+admin.drupalmedia:
+  css:
+    theme:
+      css/drupalmedia.admin.css: { }
+
+admin.sourceEditing:
+  css:
+    theme:
+      css/source-editing.admin.css: { }
+
+admin.table:
+  css:
+    theme:
+      css/table.admin.css: { }
diff --git a/core/modules/ckeditor5/ckeditor5.module b/core/modules/ckeditor5/ckeditor5.module
new file mode 100644
index 0000000000..0d7b8bf82f
--- /dev/null
+++ b/core/modules/ckeditor5/ckeditor5.module
@@ -0,0 +1,376 @@
+<?php
+
+/**
+ * @file
+ * Implements hooks for the CKEditor 5 module.
+ */
+
+declare(strict_types = 1);
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\Core\Ajax\AjaxResponse;
+use Drupal\Core\Ajax\InvokeCommand;
+use Drupal\Core\Ajax\PrependCommand;
+use Drupal\Core\Ajax\ReplaceCommand;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Url;
+use Symfony\Component\Validator\Constraints\Choice;
+
+/**
+ * Implements hook_help().
+ */
+function ckeditor5_help($route_name, RouteMatchInterface $route_match) {
+  switch ($route_name) {
+    case 'help.page.ckeditor5':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The CKEditor 5 module provides a highly-accessible, highly-usable visual text editor and adds a toolbar to text fields. Users can use buttons to format content and to create semantically correct and valid HTML. The CKEditor module uses the framework provided by the <a href=":text_editor">Text Editor module</a>. It requires JavaScript to be enabled in the browser. For more information, see the <a href=":doc_url">online documentation for the CKEditor 5 module</a> and the <a href=":cke5_url">CKEditor 5 website</a>.', [':doc_url' => 'https://www.drupal.org/docs/contributed-modules/ckeditor-5', ':cke5_url' => 'https://ckeditor.com/ckeditor-5/', ':text_editor' => Url::fromRoute('help.page', ['name' => 'editor'])->toString()]) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Enabling CKEditor 5 for individual text formats') . '</dt>';
+      $output .= '<dd>' . t('CKEditor 5 has to be enabled and configured separately for individual text formats from the <a href=":formats">Text formats and editors page</a> because the filter settings for each text format can be different. For more information, see the <a href=":text_editor">Text Editor help page</a> and <a href=":filter">Filter help page</a>.', [':formats' => Url::fromRoute('filter.admin_overview')->toString(), ':text_editor' => Url::fromRoute('help.page', ['name' => 'editor'])->toString(), ':filter' => Url::fromRoute('help.page', ['name' => 'filter'])->toString()]) . '</dd>';
+      $output .= '<dt>' . t('Migration for existing text formats switching to CKEditor 5') . '</dt>';
+      $output .= '<dd>' . t('Text formats switching to CKEditor 5 from CKEditor 4 (or no text editor) should be able to do so with minimal effort and zero data loss. Existing configuration will be automatically migrated to CKEditor 5 compatible configuration. In instances where functionality can not be migrated, detailed messages are provided explaining what is necessary for feature parity.') . '</dd>';
+      $output .= '<dt>' . t('Configuring the toolbar') . '</dt>';
+      $output .= '<dd>' . t('When CKEditor 5 is chosen from the <em>Text editor</em> drop-down menu, its toolbar configuration is displayed. You can add and remove buttons from the <em>Active toolbar</em> by dragging and dropping them. Separators and rows can be added to organize the buttons.') . '</dd>';
+      $output .= '<dt>' . t('Filtering HTML content') . '</dt>';
+      $output .= '<dd>' . t("Unlike other text editors, plugin configuration determines the tags and attributes allowed in text formats using CKEditor 5. If using the <em>Limit allowed HTML tags and correct faulty HTML</em> filter, this filter's values will be automatically set based on enabled plugins and toolbar items.");
+      $output .= '<dt>' . t('Toggling between formatted text and HTML source') . '</dt>';
+      $output .= '<dd>' . t('If the <em>Source</em> button is available in the toolbar, users can click this button to disable the visual editor and edit the HTML source directly. After toggling back, the visual editor uses the HTML tags allowed via plugin configuration (and not explicity disallowed by filters) to format the text. Tags not enabled via plugin configuration will be be stripped out of the HTML source when the user toggles back to the text editor.') . '</dd>';
+      $output .= '<dt>' . t('Developing CKEditor 5 plugins in Drupal') . '</dt>';
+      $output .= '<dd>' . t('See the <a href=":dev_docs_url">online documentation</a> for detailed information on developing CKEditor 5 plugins for use in Drupal.', [':dev_docs_url' => 'https://www.drupal.org/docs/contributed-modules/ckeditor-5/plugin-and-contrib-module-development']) . '</dd>';
+      $output .= '</dd>';
+      $output .= '<dt>' . t('Accessibility features') . '</dt>';
+      $output .= '<dd>' . t('The built in WYSIWYG editor (CKEditor 5) comes with a number of accessibility features. CKEditor 5 comes with built in <a href=":shortcuts">keyboard shortcuts</a>, which can be beneficial for both power users and keyboard only users.', [':shortcuts' => 'https://ckeditor.com/docs/ckeditor5/latest/features/keyboard-support.html']) . '</dd>';
+      $output .= '<dt>' . t('Generating accessible content') . '</dt>';
+      $output .= '<dd>';
+      $output .= '<ul>';
+      // @todo Uncomment this in https://www.drupal.org/project/ckeditor5/issues/3230230
+      // $output .= '<li>' . t('HTML tables can be created with table headers and caption/summary elements.') . '</li>';
+      // @todo Uncomment this in https://www.drupal.org/project/ckeditor5/issues/3222757
+      // $output .= '<li>' . t('Alt text is required by default on images added through CKEditor (note that this can be overridden).') . '</li>';
+      $output .= '<li>' . t('Semantic HTML5 figure/figcaption are available to add captions to images.') . '</li>';
+      $output .= '<li>' . t('To support multilingual page content, CKEditor 5 can be configured to include a language button in the toolbar.') . '</li>';
+      $output .= '</ul>';
+      $output .= '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function ckeditor5_theme() {
+  return [
+    'ckeditor5_settings_toolbar' => [
+      'render element' => 'form',
+    ],
+  ];
+}
+
+/**
+ * Implements hook_module_implements_alter().
+ */
+function ckeditor5_module_implements_alter(&$implementations, $hook) {
+  // This module's implementation of form_filter_format_form_alter() must happen
+  // after the editor module's implementation, as that implementation adds the
+  // active editor to $form_state. It must also happen after the media module's
+  // implementation so media_filter_format_edit_form_validate can be removed
+  // from the validation chain, as that validator is not needed with CKEditor 5
+  // and will trigger a false error.
+  if ($hook === 'form_alter' && isset($implementations['ckeditor5']) && isset($implementations['editor'])) {
+    $group = $implementations['ckeditor5'];
+    unset($implementations['ckeditor5']);
+
+    $offset = array_search('editor', array_keys($implementations)) + 1;
+    $media_offset = array_search('media', array_keys($implementations)) + 1;
+    $max = max([$offset, $media_offset]);
+    $implementations = array_slice($implementations, 0, $max, TRUE) +
+      ['ckeditor5' => $group] +
+      array_slice($implementations, $offset, NULL, TRUE);
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function ckeditor5_form_filter_format_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
+  $editor = $form_state->get('editor');
+
+  // CKEditor 5 plugin config determines the available HTML tags. If an HTML
+  // restricting filter is enabled and the editor is CKEditor 5, the 'Allowed
+  // HTML tags' field is made read only and automatically populated with the
+  // values needed by CKEditor 5 plugins.
+  // @see \Drupal\ckeditor5\Plugin\Editor\CKEditor5::buildConfigurationForm()
+  if ($editor && $editor->getEditor() === 'ckeditor5') {
+    if (isset($form['filters']['settings']['filter_html']['allowed_html'])) {
+      $filter_allowed_html = &$form['filters']['settings']['filter_html']['allowed_html'];
+
+      if (isset($form['editor']['settings']['subform']['plugins']['ckeditor5_sourceEditing']['allowed_tags'])) {
+        $source_allowed_tags = &$form['editor']['settings']['subform']['plugins']['ckeditor5_sourceEditing']['allowed_tags'];
+        // @todo if this triggers the callback via keyboard navigation such as
+        //   tab, focus should move to the next element, not to the rebuilt
+        //   "allowed tags" field
+        //   https://www.drupal.org/project/ckeditor5/issues/3231321.
+        $source_allowed_tags['#ajax'] = [
+          'callback' => '_update_ckeditor5_html_filter',
+          'trigger_as' => ['name' => 'editor_configure'],
+          'event' => 'change',
+        ];
+      }
+
+      $filter_allowed_html['#value_callback'] = [CKEditor5::class, 'getGeneratedAllowedHtmlValue'];
+      // Set readonly and add the form-disabled wrapper class as using #disabled
+      // or the disabled attribute will prevent the new values from being
+      // validated.
+      $filter_allowed_html['#attributes']['readonly'] = TRUE;
+      $filter_allowed_html['#wrapper_attributes']['class'][] = 'form-disabled';
+
+      $filter_allowed_html['#description'] = t('With CKEditor 5 this is a
+          read-only field. The allowed HTML tags and attributes are determined
+          by the CKEditor 5 configuration. Manually removing tags would break
+          enabled functionality, and any manually added tags would be removed by
+          CKEditor 5 on render.');
+
+      // The media_filter_format_edit_form_validate validator is not needed
+      // with CKEditor 5 as it exists to enforce the inclusion of specific
+      // allowed tags that are added automatically by CKEditor 5. The
+      // validator is removed so it does not conflict with the automatic
+      // addition of those allowed tags.
+      $key = array_search('media_filter_format_edit_form_validate', $form['#validate']);
+      if ($key !== FALSE) {
+        unset($form['#validate'][$key]);
+      }
+    }
+  }
+
+  // Override the AJAX callbacks for changing editors, so multiple areas of the
+  // form can be updated on change.
+  $form['editor']['editor']['#ajax'] = [
+    'callback' => '_update_ckeditor5_html_filter',
+    'trigger_as' => ['name' => 'editor_configure'],
+  ];
+  $form['editor']['configure']['#ajax'] = [
+    'callback' => '_update_ckeditor5_html_filter',
+  ];
+
+  $form['editor']['settings']['subform']['toolbar']['items']['#ajax'] = [
+    'callback' => '_update_ckeditor5_html_filter',
+    'trigger_as' => ['name' => 'editor_configure'],
+    'event' => 'change',
+    'ckeditor5_only' => 'true',
+  ];
+
+  foreach (Element::children($form['filters']['status']) as $filter_type) {
+    $form['filters']['status'][$filter_type]['#ajax'] = [
+      'callback' => '_update_ckeditor5_html_filter',
+      'trigger_as' => ['name' => 'editor_configure'],
+      'event' => 'change',
+      'ckeditor5_only' => 'true',
+    ];
+  }
+
+  if (!function_exists('_add_ajax_listeners_to_plugin_inputs')) {
+
+    /**
+     * Recursively adds AJAX listeners to plugin settings elements.
+     *
+     * These are added so allowed tags and other fields that have values
+     * dependent on plugin settings can be updated via AJAX when these settings
+     * are changed in the editor form.
+     *
+     * @param array $plugins_config_form
+     *   The plugins config subform render array.
+     */
+    function _add_ajax_listeners_to_plugin_inputs(array &$plugins_config_form) : void {
+      $field_types = [
+        'checkbox',
+        'select',
+        'radios',
+      ];
+      if (isset($plugins_config_form['#type']) && in_array($plugins_config_form['#type'], $field_types) && !isset($plugins_config_form['#ajax'])) {
+        $plugins_config_form['#ajax'] = [
+          'callback' => '_update_ckeditor5_html_filter',
+          'trigger_as' => ['name' => 'editor_configure'],
+          'event' => 'change',
+          'ckeditor5_only' => 'true',
+        ];
+      }
+
+      foreach ($plugins_config_form as $key => &$value) {
+        if (is_array($value) && strpos($key, '#') === FALSE) {
+          _add_ajax_listeners_to_plugin_inputs($value);
+        }
+      }
+    }
+
+  }
+
+  if (isset($form['editor']['settings']['subform']['plugins'])) {
+    _add_ajax_listeners_to_plugin_inputs($form['editor']['settings']['subform']['plugins']);
+  }
+
+  // Add an ID to the filter settings vertical tabs wrapper to facilitate AJAX
+  // updates.
+  // @todo consider moving this to editor.module when this module is moved to
+  //   Drupal core https://www.drupal.org/project/ckeditor5/issues/3231322.
+  $form['filter_settings']['#wrapper_attributes']['id'] = 'filter-settings-wrapper';
+
+  // Add an ID to the editor settings vertical tabs wrapper so it can be easily
+  // targeted by JavaScript.
+  // @todo consider moving this to editor.module when this module is moved to
+  //   Drupal core https://www.drupal.org/project/ckeditor5/issues/3231322.
+  $form['editor']['settings']['subform']['plugin_settings']['#wrapper_attributes']['id'] = 'plugin-settings-wrapper';
+
+  $form['#after_build'][] = [CKEditor5::class, 'assessActiveTextEditorAfterBuild'];
+  $form['#validate'][] = [CKEditor5::class, 'validateSwitchingToCKEditor5'];
+}
+
+/**
+ * AJAX callback handler for filter_format_form().
+ *
+ * Used instead of editor_form_filter_admin_form_ajax from the editor module.
+ */
+function _update_ckeditor5_html_filter(array $form, FormStateInterface $form_state) {
+  $response = new AjaxResponse();
+  $renderer = \Drupal::service('renderer');
+
+  // Replace the editor settings with the settings for the currently selected
+  // editor. This is the default behavior of editor.module. Except when using
+  // CKEditor 5: then we only want CKEditor 5's plugin settings to be updated:
+  // the client side-rendered admin UI would otherwise be dependent on network
+  // latency.
+  $renderedField = $renderer->render($form['editor']['settings']);
+  if ($form_state->get('ckeditor5_is_active') && $form_state->get('ckeditor5_is_selected')) {
+    $response->addCommand(new ReplaceCommand('#plugin-settings-wrapper', $form['editor']['settings']['subform']['plugin_settings']['#markup']));
+  }
+  else {
+    $response->addCommand(new ReplaceCommand('#editor-settings-wrapper', $renderedField));
+  }
+
+  // AJAX validation errors should appear visually close to the text editor
+  // since this is a very long form: otherwise they would not be noticed.
+  $response->addCommand(new PrependCommand('#editor-settings-wrapper', ['#type' => 'status_messages']));
+
+  // Rebuild filter settings when switching to/from CKEditor 5 or while using
+  // CKEditor 5. In other words: do not rebuild it if using a different text
+  // editor.
+  // Do not rebuild either when switching to CKEditor 5 and there's a
+  // fundamental compatibility error: addAllowedTagsUpdateButton() in the admin
+  // UI's JavaScript ensures helpful user feedback is present.
+  if ($form_state->get('ckeditor5_is_active') || ($form_state->get('ckeditor5_is_selected') && !$form_state->getError($form['editor']['editor']))) {
+    // Replace the filter settings with the settings for the currently selected
+    // editor.
+    $renderedSettings = $renderer->render($form['filter_settings']);
+    $response->addCommand(new ReplaceCommand('#filter-settings-wrapper', $renderedSettings));
+  }
+
+  // If switching to CKEditor 5 from another editor and there are errors in that
+  // switch, add an error class to the editor select, otherwise remove.
+  $response->addCommand(new InvokeCommand('[data-drupal-selector="edit-editor-editor"]', !$form_state->get('ckeditor5_is_active') && $form_state->get('ckeditor5_is_selected') && !empty($form_state->getErrors()) ? 'addClass' : 'removeClass', ['error']));
+
+  if (!function_exists('_add_attachments_to_editor_update_response')) {
+
+    /**
+     * Recursively find #attach items in the form and add as attachments to the
+     * AJAX response.
+     *
+     * @param array $form
+     *   A form array.
+     * @param \Drupal\Core\Ajax\AjaxResponse $response
+     *   The AJAX response attachments will be added to.
+     */
+    function _add_attachments_to_editor_update_response(array $form, AjaxResponse &$response) : void {
+      foreach ($form as $key => $value) {
+        if ($key === "#attached") {
+          $response->addAttachments(array_diff_key($value, ['placeholders' => '']));
+        }
+        elseif (is_array($value) && strpos((string) $key, '#') === FALSE) {
+          _add_attachments_to_editor_update_response($value, $response);
+        }
+      }
+    }
+
+  }
+
+  _add_attachments_to_editor_update_response($form, $response);
+
+  return $response;
+}
+
+/**
+ * Implements hook_library_info_alter().
+ */
+function ckeditor5_library_info_alter(&$libraries, $extension) {
+  if ($extension === 'filter') {
+    $libraries['drupal.filter.admin']['dependencies'][] = 'ckeditor5/ie11.filter.warnings';
+    $libraries['drupal.filter.admin']['dependencies'][] = 'ckeditor5/drupal.ckeditor5.filter.admin';
+  }
+
+  // If the 'ckeditor5/ie11.user.warnings' library is added as a dependency of
+  // other Ckeditor 5 libraries, it won't reliably work as the CKEditor 5 assets
+  // are loaded via AJAX, and the IE11-incompatible syntax in CKEditor 5 can
+  // prevent the AJAX call from successfully loading the functionality in
+  // 'ckeditor5/ie11.user.warnings'. Adding this as a dependency of
+  // 'system/base', as excessive as it may seem, is the most reliable way to
+  // assure it is loaded as part of the page request.
+  if ($extension === 'system') {
+    $libraries['base']['dependencies'][] = 'ckeditor5/ie11.user.warnings';
+  }
+
+  if ($extension === 'core') {
+    // Generate libraries for each of the CKEditor 5 translation files so that
+    // the correct translation file can be attached depending on the current
+    // language.
+    $files = scandir('core/assets/vendor/ckeditor5/build/translations');
+    foreach ($files as $file) {
+      if ($file[0] !== '.' && preg_match('/\.js$/', $file)) {
+        $langcode = basename($file, '.js');
+        $libraries['ckeditor5.translations.' . $langcode] = [
+          'remote' => $libraries['ckeditor5']['remote'],
+          'version' => $libraries['ckeditor5']['version'],
+          'license' => $libraries['ckeditor5']['license'],
+          'js' => [
+            'assets/vendor/ckeditor5/build/translations/' . $file => ['preprocess' => FALSE, 'minified' => TRUE],
+          ],
+        ];
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_validation_constraint_alter().
+ */
+function ckeditor5_validation_constraint_alter(array &$definitions) {
+  // Add the Symfony validation constraints that Drupal core does not add in
+  // \Drupal\Core\Validation\ConstraintManager::registerDefinitions() for
+  // unknown reasons. Do it defensively, to not break when this changes.
+  if (!isset($definitions['Choice'])) {
+    $definitions['Choice'] = [
+      'label' => 'Choice',
+      'class' => Choice::class,
+      'type' => FALSE,
+      'provider' => 'core',
+      'id' => 'Choice',
+    ];
+  }
+}
+
+/**
+ * Implements hook_config_schema_info_alter().
+ */
+function ckeditor5_config_schema_info_alter(&$definitions) {
+  // In \Drupal\Tests\config\Functional\ConfigImportAllTest, this hook may be
+  // called without ckeditor5.pair.schema.yml being active.
+  if (!isset($definitions['ckeditor5_valid_pair__format_and_editor'])) {
+    return;
+  }
+  // @see filter.format.*.filters
+  $definitions['ckeditor5_valid_pair__format_and_editor']['mapping']['filters'] = $definitions['filter.format.*']['mapping']['filters'];
+  // @see @see editor.editor.*.image_upload
+  $definitions['ckeditor5_valid_pair__format_and_editor']['mapping']['image_upload'] = $definitions['editor.editor.*']['mapping']['image_upload'];
+}
diff --git a/core/modules/ckeditor5/ckeditor5.routing.yml b/core/modules/ckeditor5/ckeditor5.routing.yml
new file mode 100644
index 0000000000..10587cb902
--- /dev/null
+++ b/core/modules/ckeditor5/ckeditor5.routing.yml
@@ -0,0 +1,25 @@
+ckeditor5.upload_image:
+  path: '/ckeditor5/upload-image/{editor}'
+  defaults:
+    _controller: '\Drupal\ckeditor5\Controller\CKEditor5ImageController::upload'
+  methods: [POST]
+  requirements:
+    _entity_access: 'editor.use'
+    _custom_access: '\Drupal\ckeditor5\Controller\CKEditor5ImageController::imageUploadEnabledAccess'
+  options:
+    parameters:
+      editor:
+        type: entity:editor
+
+ckeditor5.media_image:
+  path: '/ckeditor5/{editor}/is-media-image'
+  defaults:
+    _controller: '\Drupal\ckeditor5\Controller\CKEditor5MediaController::isMediaImage'
+  methods: [GET]
+  requirements:
+    _entity_access: 'editor.use'
+    _custom_access: '\Drupal\ckeditor5\Controller\CKEditor5MediaController::access'
+  options:
+    parameters:
+      editor:
+        type: entity:editor
diff --git a/core/modules/ckeditor5/ckeditor5.services.yml b/core/modules/ckeditor5/ckeditor5.services.yml
new file mode 100644
index 0000000000..ca4911d3aa
--- /dev/null
+++ b/core/modules/ckeditor5/ckeditor5.services.yml
@@ -0,0 +1,8 @@
+services:
+  plugin.manager.ckeditor5.plugin:
+    class: Drupal\ckeditor5\Plugin\CKEditor5PluginManager
+    parent: default_plugin_manager
+  ckeditor5.smart_default_settings:
+    class: Drupal\ckeditor5\SmartDefaultSettings
+    arguments:
+      - '@plugin.manager.ckeditor5.plugin'
diff --git a/core/modules/ckeditor5/config/schema/ckeditor5.data_types.yml b/core/modules/ckeditor5/config/schema/ckeditor5.data_types.yml
new file mode 100644
index 0000000000..9ee32d4a17
--- /dev/null
+++ b/core/modules/ckeditor5/config/schema/ckeditor5.data_types.yml
@@ -0,0 +1,12 @@
+# @see https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/toolbar.html
+ckeditor5.toolbar_item:
+  type: string
+  label: 'Toolbar item'
+  constraints:
+    CKEditor5ToolbarItem: []
+
+ckeditor5.element:
+  type: string
+  label: 'Element'
+  constraints:
+    CKEditor5Element: []
diff --git a/core/modules/ckeditor5/config/schema/ckeditor5.pair.schema.yml b/core/modules/ckeditor5/config/schema/ckeditor5.pair.schema.yml
new file mode 100644
index 0000000000..8bf146455c
--- /dev/null
+++ b/core/modules/ckeditor5/config/schema/ckeditor5.pair.schema.yml
@@ -0,0 +1,15 @@
+# @see ckeditor5_config_schema_info_alter()
+ckeditor5_valid_pair__format_and_editor:
+  type: mapping
+  label: 'Text Format plus Text Editor pair using CKEditor 5'
+  constraints:
+    CKEditor5FundamentalCompatibility: []
+  mapping:
+    settings:
+      type: editor.settings.ckeditor5
+    # @see ckeditor5_config_schema_info_alter()
+    # @see filter.format.*.filters
+    filters: {}
+    # @see ckeditor5_config_schema_info_alter()
+    # @see editor.editor.*.image_upload
+    image_upload: {}
diff --git a/core/modules/ckeditor5/config/schema/ckeditor5.schema.yml b/core/modules/ckeditor5/config/schema/ckeditor5.schema.yml
new file mode 100644
index 0000000000..29171f9e36
--- /dev/null
+++ b/core/modules/ckeditor5/config/schema/ckeditor5.schema.yml
@@ -0,0 +1,76 @@
+# Schema for the configuration files of the CKEditor5 module.
+
+editor.settings.ckeditor5:
+  type: mapping
+  label: 'CKEditor 5 settings'
+  mapping:
+    toolbar:
+      type: mapping
+      label: 'Toolbar configuration'
+      mapping:
+        items:
+          type: sequence
+          label: 'Items'
+          sequence:
+            type: ckeditor5.toolbar_item
+            label: 'Button'
+            constraints:
+              # Each active CKEditor 5 toolbar item whose plugin has conditions must have those conditions met.
+              CKEditor5ToolbarItemConditionsMet: []
+    plugins:
+      type: sequence
+      label: 'Plugins'
+      sequence:
+        type: ckeditor5.plugin.[%key]
+  constraints:
+    # Each enabled CKEditor 5 plugin that implements \Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface
+    # must exist in here.
+    CKEditor5EnabledConfigurablePlugins: []
+
+# Plugin \Drupal\ckeditor5\Plugin\CKEditor5Plugin\Language
+ckeditor5.plugin.ckeditor5_language:
+  type: mapping
+  label: 'Language'
+  mapping:
+    language_list:
+      type: string
+      label: 'Language list ID'
+      constraints:
+        # Configuring this does not make sense without the corresponding button.
+        CKEditor5ToolbarItemDependencyConstraint:
+          toolbarItem: textPartLanguage
+        # Only two possible values are accepted.
+        Choice:
+          - un
+          - all
+
+# Plugin \Drupal\ckeditor5\Plugin\CKEditor5Plugin\Heading
+ckeditor5.plugin.ckeditor5_heading:
+  type: mapping
+  label: Headings
+  mapping:
+    enabled_headings:
+      type: sequence
+      label: 'Enabled Headings'
+      constraints:
+        NotBlank:
+          message: "Enable at least one heading, otherwise disable the Heading plugin."
+      sequence:
+        type: string
+        label: 'Heading type'
+        constraints:
+          Choice:
+            callback: \Drupal\ckeditor5\Plugin\CKEditor5Plugin\Heading::validChoices
+
+ckeditor5.plugin.ckeditor5_sourceEditing:
+  type: mapping
+  label: Source Editing
+  mapping:
+    allowed_tags:
+      type: sequence
+      label: 'Allowed Tags'
+      sequence:
+        type: ckeditor5.element
+        label: 'Allowed Tag'
+        constraints:
+          SourceEditingRedundantTags: []
diff --git a/core/modules/ckeditor5/css/alignment.admin.css b/core/modules/ckeditor5/css/alignment.admin.css
new file mode 100644
index 0000000000..2830a9d556
--- /dev/null
+++ b/core/modules/ckeditor5/css/alignment.admin.css
@@ -0,0 +1,45 @@
+.ckeditor5-toolbar-button-alignment\:left {
+  background-image: url(../icons/align-left.svg);
+}
+.ckeditor5-toolbar-button-alignment\:right {
+  background-image: url(../icons/align-right.svg);
+}
+.ckeditor5-toolbar-button-alignment\:center {
+  background-image: url(../icons/align-center.svg);
+}
+.ckeditor5-toolbar-button-alignment\:justify {
+  background-image: url(../icons/align-justify.svg);
+}
+.ckeditor5-toolbar-button-alignment {
+  background-image: url(../icons/align-left.svg);
+}
+
+.ckeditor5-toolbar-button-alignment {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  padding-right: 20px;
+  background-position-x: 10px;
+}
+[dir="rtl"] .ckeditor5-toolbar-button-alignment {
+  padding-right: 0;
+  padding-left: 20px;
+  background-position-x: 30px;
+}
+.ckeditor5-toolbar-button-alignment::after {
+  position: relative;
+  right: -10px;
+  display: inline-block;
+  width: 7px;
+  height: 7px;
+  content: "";
+  transform: rotate(135deg);
+  color: #000;
+  border-width: 2px 2px 0 0;
+  border-style: solid;
+  background-position-x: -10px;
+}
+[dir="rtl"] .ckeditor5-toolbar-button-alignment::after {
+  right: 10px;
+  background-position-x: 10px;
+}
diff --git a/core/modules/ckeditor5/css/basic.admin.css b/core/modules/ckeditor5/css/basic.admin.css
new file mode 100644
index 0000000000..8db1109e32
--- /dev/null
+++ b/core/modules/ckeditor5/css/basic.admin.css
@@ -0,0 +1,27 @@
+.ckeditor5-toolbar-button-bold {
+  background-image: url(../icons/bold.svg);
+}
+
+.ckeditor5-toolbar-button-italic {
+  background-image: url(../icons/italic.svg);
+}
+
+.ckeditor5-toolbar-button-underline {
+  background-image: url(../icons/underline.svg);
+}
+
+.ckeditor5-toolbar-button-code {
+  background-image: url(../icons/code.svg);
+}
+
+.ckeditor5-toolbar-button-strikethrough {
+  background-image: url(../icons/strikethrough.svg);
+}
+
+.ckeditor5-toolbar-button-subscript {
+  background-image: url(../icons/subscript.svg);
+}
+
+.ckeditor5-toolbar-button-superscript {
+  background-image: url(../icons/superscript.svg);
+}
diff --git a/core/modules/ckeditor5/css/blockquote.admin.css b/core/modules/ckeditor5/css/blockquote.admin.css
new file mode 100644
index 0000000000..7f6ac95c77
--- /dev/null
+++ b/core/modules/ckeditor5/css/blockquote.admin.css
@@ -0,0 +1,3 @@
+.ckeditor5-toolbar-button-blockQuote {
+  background-image: url(../icons/blockquote.svg);
+}
diff --git a/core/modules/ckeditor5/css/drupalmedia.admin.css b/core/modules/ckeditor5/css/drupalmedia.admin.css
new file mode 100644
index 0000000000..7a381a053d
--- /dev/null
+++ b/core/modules/ckeditor5/css/drupalmedia.admin.css
@@ -0,0 +1,4 @@
+/* cspell:ignore medialibrary */
+.ckeditor5-toolbar-button-drupalMedia {
+  background-image: url(../icons/medialibrary.svg);
+}
diff --git a/core/modules/ckeditor5/css/filter.admin.css b/core/modules/ckeditor5/css/filter.admin.css
new file mode 100644
index 0000000000..dc9c54cbb3
--- /dev/null
+++ b/core/modules/ckeditor5/css/filter.admin.css
@@ -0,0 +1,4 @@
+.ckeditor5-filter-attention {
+  padding: 4px;
+  outline: 1px red dashed;
+}
diff --git a/core/modules/ckeditor5/css/heading.admin.css b/core/modules/ckeditor5/css/heading.admin.css
new file mode 100644
index 0000000000..d16d435a4a
--- /dev/null
+++ b/core/modules/ckeditor5/css/heading.admin.css
@@ -0,0 +1,23 @@
+/**
+ * @file
+ * Styles for header options in the admin UI.
+ *
+ * These styles are copied from CKEditor 5's editor styles, which load when an
+ * editor is present, but are not guaranteed to load in the admin UI.
+ */
+
+.ck.ck-heading_heading1 {
+  font-size: 20px;
+}
+
+.ck.ck-heading_heading2 {
+  font-size: 17px;
+}
+
+.ck.ck-heading_heading3 {
+  font-size: 14px;
+}
+
+.ck[class*="ck-heading_heading"] {
+  font-weight: bold;
+}
diff --git a/core/modules/ckeditor5/css/horizontal-line.admin.css b/core/modules/ckeditor5/css/horizontal-line.admin.css
new file mode 100644
index 0000000000..383eb2a10d
--- /dev/null
+++ b/core/modules/ckeditor5/css/horizontal-line.admin.css
@@ -0,0 +1,4 @@
+/* cspell:ignore horizontalline */
+.ckeditor5-toolbar-button-horizontalLine {
+  background-image: url(../icons/horizontalline.svg);
+}
diff --git a/core/modules/ckeditor5/css/ie-warnings.css b/core/modules/ckeditor5/css/ie-warnings.css
new file mode 100644
index 0000000000..b330d27f88
--- /dev/null
+++ b/core/modules/ckeditor5/css/ie-warnings.css
@@ -0,0 +1,22 @@
+.quickedit-field.quickedit-highlighted.ck5-ie11,
+.quickedit-form.quickedit-highlighted.ck5-ie11,
+.quickedit-field .quickedit-highlighted.ck5-ie11 {
+  cursor: default;
+  box-shadow: 0 0 0 1px #f00, 0 0 0 2px #f00;
+}
+
+.quickedit .icon.ck5-ie11 {
+  margin-left: 0.5em;
+  padding-left: 1.5em;
+}
+
+/**
+ * @todo When this is moved to core, this can be changed to use
+ *   core/misc/icons/e32700/error.svg, and the error.svg in this module can be
+ *   removed https://www.drupal.org/project/ckeditor5/issues/3231324.
+ */
+.quickedit .icon.ck5-ie11:before {
+  background-image: url(../icons/error.svg);
+  background-position: left center;
+  background-size: 1.3em;
+}
diff --git a/core/modules/ckeditor5/css/imageupload.admin.css b/core/modules/ckeditor5/css/imageupload.admin.css
new file mode 100644
index 0000000000..5d4f9549b0
--- /dev/null
+++ b/core/modules/ckeditor5/css/imageupload.admin.css
@@ -0,0 +1,4 @@
+/* cspell:ignore imageupload */
+.ckeditor5-toolbar-button-uploadImage {
+  background-image: url(../icons/imageupload.svg);
+}
diff --git a/core/modules/ckeditor5/css/indent.admin.css b/core/modules/ckeditor5/css/indent.admin.css
new file mode 100644
index 0000000000..1d6f8f0422
--- /dev/null
+++ b/core/modules/ckeditor5/css/indent.admin.css
@@ -0,0 +1,7 @@
+.ckeditor5-toolbar-button-indent {
+  background-image: url(../icons/indent.svg);
+}
+
+.ckeditor5-toolbar-button-outdent {
+  background-image: url(../icons/outdent.svg);
+}
diff --git a/core/modules/ckeditor5/css/internal.admin.css b/core/modules/ckeditor5/css/internal.admin.css
new file mode 100644
index 0000000000..62a5ac434b
--- /dev/null
+++ b/core/modules/ckeditor5/css/internal.admin.css
@@ -0,0 +1,45 @@
+.ckeditor5-toolbar-button-divider {
+  background-image: url(../icons/divider.svg);
+}
+.ckeditor5-toolbar-button-wrapping {
+  background-image: url(../icons/separator.svg);
+}
+
+.ckeditor5-toolbar-button-undo {
+  background-image: url(../icons/undo.svg);
+}
+
+.ckeditor5-toolbar-button-redo {
+  background-image: url(../icons/redo.svg);
+}
+
+.ckeditor5-toolbar-button-heading {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  width: 100px;
+  color: #000;
+}
+.ckeditor5-toolbar-button-heading::before {
+  margin-left: 10px;
+  content: "Heading";
+  font-size: 14px;
+}
+[dir="rtl"] .ckeditor5-toolbar-button-heading::before {
+  margin-right: 10px;
+  margin-left: 0;
+}
+.ckeditor5-toolbar-button-heading::after {
+  display: inline-block;
+  width: 7px;
+  height: 7px;
+  margin-right: 10px;
+  content: "";
+  transform: rotate(135deg);
+  border-width: 2px 2px 0 0;
+  border-style: solid;
+}
+[dir="rtl"] .ckeditor5-toolbar-button-heading::after {
+  margin-right: 0;
+  margin-left: 10px;
+}
diff --git a/core/modules/ckeditor5/css/language.admin.css b/core/modules/ckeditor5/css/language.admin.css
new file mode 100644
index 0000000000..42ebab47e9
--- /dev/null
+++ b/core/modules/ckeditor5/css/language.admin.css
@@ -0,0 +1,30 @@
+.ckeditor5-toolbar-button-textPartLanguage {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  width: 110px;
+  color: #000;
+}
+.ckeditor5-toolbar-button-textPartLanguage::before {
+  margin-left: 10px;
+  content: "Language";
+  font-size: 14px;
+}
+[dir="rtl"] .ckeditor5-toolbar-button-textPartLanguage::before {
+  margin-right: 10px;
+  margin-left: 0;
+}
+.ckeditor5-toolbar-button-textPartLanguage::after {
+  display: inline-block;
+  width: 7px;
+  height: 7px;
+  margin-right: 10px;
+  content: "";
+  transform: rotate(135deg);
+  border-width: 2px 2px 0 0;
+  border-style: solid;
+}
+[dir="rtl"] .ckeditor5-toolbar-button-textPartLanguage::after {
+  margin-right: 0;
+  margin-left: 10px;
+}
diff --git a/core/modules/ckeditor5/css/language.css b/core/modules/ckeditor5/css/language.css
new file mode 100644
index 0000000000..b13e52150e
--- /dev/null
+++ b/core/modules/ckeditor5/css/language.css
@@ -0,0 +1,19 @@
+/**
+ * @file
+ * Language: add styling for elements that have a language attribute.
+ */
+
+/**
+ * Show the user that a 'lang' tag has been applied by adding a thin dotted
+ * border. We also append the value of the tag between brackets, for example:
+ * '(en)'. Since the html element has a 'lang' attribute too we only target
+ * elements within the html scope.
+ */
+.ck-content [lang] {
+  outline: 1px dotted gray;
+}
+.ck-content [lang]:after {
+  content: " ("attr(lang)")";
+  color: #666;
+  font-size: 10px;
+}
diff --git a/core/modules/ckeditor5/css/link.admin.css b/core/modules/ckeditor5/css/link.admin.css
new file mode 100644
index 0000000000..e6e2ccdb11
--- /dev/null
+++ b/core/modules/ckeditor5/css/link.admin.css
@@ -0,0 +1,3 @@
+.ckeditor5-toolbar-button-link {
+  background-image: url(../icons/link.svg);
+}
diff --git a/core/modules/ckeditor5/css/list.admin.css b/core/modules/ckeditor5/css/list.admin.css
new file mode 100644
index 0000000000..7c37fa0cf0
--- /dev/null
+++ b/core/modules/ckeditor5/css/list.admin.css
@@ -0,0 +1,8 @@
+/* cspell:ignore bulletedlist numberedlist */
+.ckeditor5-toolbar-button-bulletedList {
+  background-image: url(../icons/bulletedlist.svg);
+}
+
+.ckeditor5-toolbar-button-numberedList {
+  background-image: url(../icons/numberedlist.svg);
+}
diff --git a/core/modules/ckeditor5/css/quickedit-override.css b/core/modules/ckeditor5/css/quickedit-override.css
new file mode 100644
index 0000000000..e64eb0d03c
--- /dev/null
+++ b/core/modules/ckeditor5/css/quickedit-override.css
@@ -0,0 +1,9 @@
+.quickedit-editable,
+.quickedit-editing.ck.ck-editor__editable_inline {
+  top: inherit !important;
+  left: inherit !important;
+  margin-bottom: inherit !important;
+}
+.quickedit-editing.ck.ck-editor__editable_inline > :first-child {
+  margin-top: inherit;
+}
diff --git a/core/modules/ckeditor5/css/quickedit.css b/core/modules/ckeditor5/css/quickedit.css
new file mode 100644
index 0000000000..297adfc497
--- /dev/null
+++ b/core/modules/ckeditor5/css/quickedit.css
@@ -0,0 +1,4 @@
+.quickedit-toolgroup.wysiwyg-main .ck.ck-toolbar {
+  border: none;
+  background: none;
+}
diff --git a/core/modules/ckeditor5/css/source-editing.admin.css b/core/modules/ckeditor5/css/source-editing.admin.css
new file mode 100644
index 0000000000..3f23cc3f3d
--- /dev/null
+++ b/core/modules/ckeditor5/css/source-editing.admin.css
@@ -0,0 +1,3 @@
+.ckeditor5-toolbar-button-sourceEditing {
+  background-image: url(../icons/source-editing.svg);
+}
diff --git a/core/modules/ckeditor5/css/table.admin.css b/core/modules/ckeditor5/css/table.admin.css
new file mode 100644
index 0000000000..807e961faa
--- /dev/null
+++ b/core/modules/ckeditor5/css/table.admin.css
@@ -0,0 +1,3 @@
+.ckeditor5-toolbar-button-insertTable {
+  background-image: url(../icons/table.svg);
+}
diff --git a/core/modules/ckeditor5/css/toolbar.admin.css b/core/modules/ckeditor5/css/toolbar.admin.css
new file mode 100644
index 0000000000..40b04dd951
--- /dev/null
+++ b/core/modules/ckeditor5/css/toolbar.admin.css
@@ -0,0 +1,99 @@
+.ckeditor5-toolbar-disabled {
+  display: flex;
+  justify-content: space-between;
+}
+.ckeditor5-toolbar-available {
+  flex: 1;
+}
+
+.ckeditor5-toolbar-tray {
+  display: flex;
+  flex-flow: row wrap;
+  align-items: center;
+  min-height: 40px;
+  margin: 0 0 0.5em 0;
+  padding: 0;
+  list-style: none;
+  /* Disallow any user selections in the drag-and-drop toolbar config UI. */
+  user-select: none;
+}
+
+.ckeditor5-toolbar-active__buttons {
+  margin: 5px 0;
+  padding: 0.1667em 0.1667em 0.08em;
+  border: 1px solid #c4c4c4;
+  border-radius: 2px;
+  background: #fafafa;
+}
+
+.ckeditor5-toolbar-item,
+.ckeditor5-toolbar-button {
+  display: block;
+  min-width: 36px;
+  height: 36px;
+  cursor: move;
+  border-radius: 2px;
+}
+
+.ckeditor5-toolbar-item {
+  position: relative;
+  margin: 5px 8px 5px 0;
+}
+
+.ckeditor5-toolbar-disabled .ckeditor5-toolbar-item {
+  border: 1px solid #e6e6e6;
+}
+
+.ckeditor5-toolbar-button {
+  border: none;
+  background-color: #eee;
+  background-repeat: no-repeat;
+  background-position: center;
+  background-size: 20px;
+}
+
+.ckeditor5-toolbar-button:focus,
+.ckeditor5-toolbar-button:hover {
+  color: #000;
+  background-color: #e6e6e6;
+}
+
+.ckeditor5-toolbar-button:focus,
+.ckeditor5-toolbar-button:hover,
+.ckeditor5-toolbar-button {
+  text-decoration: none;
+}
+.ckeditor5-toolbar-tooltip {
+  position: absolute;
+  z-index: 1;
+  left: 50%;
+  display: block;
+  padding: 6px 10px;
+  transform: translate(-50%, 2px);
+  text-transform: capitalize;
+  color: #fff;
+  border-radius: 3px;
+  background: #333;
+  font-size: 12px;
+  line-height: 1;
+}
+
+.ckeditor5-toolbar-tooltip::before {
+  position: absolute;
+  top: -10px;
+  left: 50%;
+  width: 0;
+  height: 5px;
+  content: "";
+  transform: translateX(-50%);
+  border-right: solid 5px transparent;
+  border-bottom: solid 5px #333;
+  border-left: solid 5px transparent;
+}
+
+.ckeditor5-toolbar-button + .ckeditor5-toolbar-tooltip {
+  visibility: hidden;
+}
+.ckeditor5-toolbar-button[data-expanded="true"] + .ckeditor5-toolbar-tooltip {
+  visibility: visible;
+}
diff --git a/core/modules/ckeditor5/icons/align-center.svg b/core/modules/ckeditor5/icons/align-center.svg
new file mode 100644
index 0000000000..4d5a61dc2f
--- /dev/null
+++ b/core/modules/ckeditor5/icons/align-center.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm2.286 4c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/align-justify.svg b/core/modules/ckeditor5/icons/align-justify.svg
new file mode 100644
index 0000000000..277c3de580
--- /dev/null
+++ b/core/modules/ckeditor5/icons/align-justify.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/align-left.svg b/core/modules/ckeditor5/icons/align-left.svg
new file mode 100644
index 0000000000..bf1a932598
--- /dev/null
+++ b/core/modules/ckeditor5/icons/align-left.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/align-right.svg b/core/modules/ckeditor5/icons/align-right.svg
new file mode 100644
index 0000000000..4d51b5bdfb
--- /dev/null
+++ b/core/modules/ckeditor5/icons/align-right.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M18 3.75a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 8a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 4a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75zm0-8a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/blockquote.svg b/core/modules/ckeditor5/icons/blockquote.svg
new file mode 100644
index 0000000000..9f67095ddc
--- /dev/null
+++ b/core/modules/ckeditor5/icons/blockquote.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 10.423a6.5 6.5 0 0 1 6.056-6.408l.038.67C6.448 5.423 5.354 7.663 5.22 10H9c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574zm8 0a6.5 6.5 0 0 1 6.056-6.408l.038.67c-2.646.739-3.74 2.979-3.873 5.315H17c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/bold.svg b/core/modules/ckeditor5/icons/bold.svg
new file mode 100644
index 0000000000..15b145fc7f
--- /dev/null
+++ b/core/modules/ckeditor5/icons/bold.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10.187 17H5.773c-.637 0-1.092-.138-1.364-.415-.273-.277-.409-.718-.409-1.323V4.738c0-.617.14-1.062.419-1.332.279-.27.73-.406 1.354-.406h4.68c.69 0 1.288.041 1.793.124.506.083.96.242 1.36.478.341.197.644.447.906.75a3.262 3.262 0 0 1 .808 2.162c0 1.401-.722 2.426-2.167 3.075C15.05 10.175 16 11.315 16 13.01a3.756 3.756 0 0 1-2.296 3.504 6.1 6.1 0 0 1-1.517.377c-.571.073-1.238.11-2 .11zm-.217-6.217H7v4.087h3.069c1.977 0 2.965-.69 2.965-2.072 0-.707-.256-1.22-.768-1.537-.512-.319-1.277-.478-2.296-.478zM7 5.13v3.619h2.606c.729 0 1.292-.067 1.69-.2a1.6 1.6 0 0 0 .91-.765c.165-.267.247-.566.247-.897 0-.707-.26-1.176-.778-1.409-.519-.232-1.31-.348-2.375-.348H7z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/bulletedlist.svg b/core/modules/ckeditor5/icons/bulletedlist.svg
new file mode 100644
index 0000000000..cad4a657f2
--- /dev/null
+++ b/core/modules/ckeditor5/icons/bulletedlist.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5.75c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zm-6 0C1 4.784 1.777 4 2.75 4c.966 0 1.75.777 1.75 1.75 0 .966-.777 1.75-1.75 1.75C1.784 7.5 1 6.723 1 5.75zm6 9c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zm-6 0c0-.966.777-1.75 1.75-1.75.966 0 1.75.777 1.75 1.75 0 .966-.777 1.75-1.75 1.75-.966 0-1.75-.777-1.75-1.75z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/code.svg b/core/modules/ckeditor5/icons/code.svg
new file mode 100644
index 0000000000..fe08f7604f
--- /dev/null
+++ b/core/modules/ckeditor5/icons/code.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m12.5 5.7 5.2 3.9v1.3l-5.6 4c-.1.2-.3.2-.5.2-.3-.1-.6-.7-.6-1l.3-.4 4.7-3.5L11.5 7l-.2-.2c-.1-.3-.1-.6 0-.8.2-.2.5-.4.8-.4a.8.8 0 0 1 .4.1zm-5.2 0L2 9.6v1.3l5.6 4c.1.2.3.2.5.2.3-.1.7-.7.6-1 0-.1 0-.3-.2-.4l-5-3.5L8.2 7l.2-.2c.1-.3.1-.6 0-.8-.2-.2-.5-.4-.8-.4a.8.8 0 0 0-.3.1z"/></svg>
diff --git a/core/modules/ckeditor5/icons/divider.svg b/core/modules/ckeditor5/icons/divider.svg
new file mode 100644
index 0000000000..7d0545391c
--- /dev/null
+++ b/core/modules/ckeditor5/icons/divider.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><rect x="9" y="2" width="2" height="16" /></svg>
diff --git a/core/misc/icons/e32700/error.svg b/core/modules/ckeditor5/icons/error.svg
similarity index 100%
copy from core/misc/icons/e32700/error.svg
copy to core/modules/ckeditor5/icons/error.svg
diff --git a/core/modules/ckeditor5/icons/horizontalline.svg b/core/modules/ckeditor5/icons/horizontalline.svg
new file mode 100644
index 0000000000..a89a548513
--- /dev/null
+++ b/core/modules/ckeditor5/icons/horizontalline.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 9h16v2H2z"/></svg>
diff --git a/core/modules/ckeditor5/icons/imageupload.svg b/core/modules/ckeditor5/icons/imageupload.svg
new file mode 100644
index 0000000000..954eebdfe5
--- /dev/null
+++ b/core/modules/ckeditor5/icons/imageupload.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.91 10.54c.26-.23.64-.21.88.03l3.36 3.14 2.23-2.06a.64.64 0 0 1 .87 0l2.52 2.97V4.5H3.2v10.12l3.71-4.08zm10.27-7.51c.6 0 1.09.47 1.09 1.05v11.84c0 .59-.49 1.06-1.09 1.06H2.79c-.6 0-1.09-.47-1.09-1.06V4.08c0-.58.49-1.05 1.1-1.05h14.38zm-5.22 5.56a1.96 1.96 0 1 1 3.4-1.96 1.96 1.96 0 0 1-3.4 1.96z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/indent.svg b/core/modules/ckeditor5/icons/indent.svg
new file mode 100644
index 0000000000..cd360e2f26
--- /dev/null
+++ b/core/modules/ckeditor5/icons/indent.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm5 6c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM2.75 16.5h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 1 0 0 1.5zM1.632 6.95 5.02 9.358a.4.4 0 0 1-.013.661l-3.39 2.207A.4.4 0 0 1 1 11.892V7.275a.4.4 0 0 1 .632-.326z"/></svg>
diff --git a/core/modules/ckeditor5/icons/italic.svg b/core/modules/ckeditor5/icons/italic.svg
new file mode 100644
index 0000000000..43ca230856
--- /dev/null
+++ b/core/modules/ckeditor5/icons/italic.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m9.586 14.633.021.004c-.036.335.095.655.393.962.082.083.173.15.274.201h1.474a.6.6 0 1 1 0 1.2H5.304a.6.6 0 0 1 0-1.2h1.15c.474-.07.809-.182 1.005-.334.157-.122.291-.32.404-.597l2.416-9.55a1.053 1.053 0 0 0-.281-.823 1.12 1.12 0 0 0-.442-.296H8.15a.6.6 0 0 1 0-1.2h6.443a.6.6 0 1 1 0 1.2h-1.195c-.376.056-.65.155-.823.296-.215.175-.423.439-.623.79l-2.366 9.347z"/></svg>
diff --git a/core/modules/ckeditor5/icons/link.svg b/core/modules/ckeditor5/icons/link.svg
new file mode 100644
index 0000000000..d88bdec3ef
--- /dev/null
+++ b/core/modules/ckeditor5/icons/link.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.077 15 .991-1.416a.75.75 0 1 1 1.229.86l-1.148 1.64a.748.748 0 0 1-.217.206 5.251 5.251 0 0 1-8.503-5.955.741.741 0 0 1 .12-.274l1.147-1.639a.75.75 0 1 1 1.228.86L4.933 10.7l.006.003a3.75 3.75 0 0 0 6.132 4.294l.006.004zm5.494-5.335a.748.748 0 0 1-.12.274l-1.147 1.639a.75.75 0 1 1-1.228-.86l.86-1.23a3.75 3.75 0 0 0-6.144-4.301l-.86 1.229a.75.75 0 0 1-1.229-.86l1.148-1.64a.748.748 0 0 1 .217-.206 5.251 5.251 0 0 1 8.503 5.955zm-4.563-2.532a.75.75 0 0 1 .184 1.045l-3.155 4.505a.75.75 0 1 1-1.229-.86l3.155-4.506a.75.75 0 0 1 1.045-.184z"/></svg>
diff --git a/core/modules/ckeditor5/icons/medialibrary.svg b/core/modules/ckeditor5/icons/medialibrary.svg
new file mode 100644
index 0000000000..e3e32bd9a2
--- /dev/null
+++ b/core/modules/ckeditor5/icons/medialibrary.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M19.1873 4.86414L10.2509 6.86414V7.02335H10.2499V15.5091C9.70972 15.1961 9.01793 15.1048 8.34069 15.3136C7.12086 15.6896 6.41013 16.8967 6.75322 18.0096C7.09631 19.1226 8.3633 19.72 9.58313 19.344C10.6666 19.01 11.3484 18.0203 11.2469 17.0234H11.2499V9.80173L18.1803 8.25067V14.3868C17.6401 14.0739 16.9483 13.9825 16.2711 14.1913C15.0513 14.5674 14.3406 15.7744 14.6836 16.8875C15.0267 18.0004 16.2937 18.5978 17.5136 18.2218C18.597 17.8877 19.2788 16.8982 19.1773 15.9011H19.1803V8.02687L19.1873 8.0253V4.86414Z" /><path fill-rule="evenodd" clip-rule="evenodd" d="M13.5039 0.743652H0.386932V12.1603H13.5039V0.743652ZM12.3379 1.75842H1.55289V11.1454H1.65715L4.00622 8.86353L6.06254 10.861L9.24985 5.91309L11.3812 9.22179L11.7761 8.6676L12.3379 9.45621V1.75842ZM6.22048 4.50869C6.22048 5.58193 5.35045 6.45196 4.27722 6.45196C3.20398 6.45196 2.33395 5.58193 2.33395 4.50869C2.33395 3.43546 3.20398 2.56543 4.27722 2.56543C5.35045 2.56543 6.22048 3.43546 6.22048 4.50869Z" /></svg>
diff --git a/core/modules/ckeditor5/icons/numberedlist.svg b/core/modules/ckeditor5/icons/numberedlist.svg
new file mode 100644
index 0000000000..7828079102
--- /dev/null
+++ b/core/modules/ckeditor5/icons/numberedlist.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5.75c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM3.5 3v5H2V3.7H1v-1h2.5V3zM.343 17.857l2.59-3.257H2.92a.6.6 0 1 0-1.04 0H.302a2 2 0 1 1 3.995 0h-.001c-.048.405-.16.734-.333.988-.175.254-.59.692-1.244 1.312H4.3v1h-4l.043-.043zM7 14.75a.75.75 0 0 1 .75-.75h9.5a.75.75 0 1 1 0 1.5h-9.5a.75.75 0 0 1-.75-.75z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/outdent.svg b/core/modules/ckeditor5/icons/outdent.svg
new file mode 100644
index 0000000000..a8ddcdae54
--- /dev/null
+++ b/core/modules/ckeditor5/icons/outdent.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm5 6c0 .414.336.75.75.75h9.5a.75.75 0 1 0 0-1.5h-9.5a.75.75 0 0 0-.75.75zM2.75 16.5h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 1 0 0 1.5zm1.618-9.55L.98 9.358a.4.4 0 0 0 .013.661l3.39 2.207A.4.4 0 0 0 5 11.892V7.275a.4.4 0 0 0-.632-.326z"/></svg>
diff --git a/core/modules/ckeditor5/icons/redo.svg b/core/modules/ckeditor5/icons/redo.svg
new file mode 100644
index 0000000000..d175568124
--- /dev/null
+++ b/core/modules/ckeditor5/icons/redo.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m14.958 9.367-2.189 1.837a.75.75 0 0 0 .965 1.149l3.788-3.18a.747.747 0 0 0 .21-.284.75.75 0 0 0-.17-.945L13.77 4.762a.75.75 0 1 0-.964 1.15l2.331 1.955H6.22A.75.75 0 0 0 6 7.9a4 4 0 1 0 1.477 7.718l-.344-1.489A2.5 2.5 0 1 1 6.039 9.4l-.008-.032h8.927z"/></svg>
diff --git a/core/modules/ckeditor5/icons/separator.svg b/core/modules/ckeditor5/icons/separator.svg
new file mode 100644
index 0000000000..f8a6653939
--- /dev/null
+++ b/core/modules/ckeditor5/icons/separator.svg
@@ -0,0 +1 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="6.65" height="6.65" rx="1" fill="black"/><rect y="13" width="6.65" height="6.65" rx="1" fill="black"/><rect x="9" width="6.65" height="6.65" rx="1" fill="black"/><path d="M7.59998 16.3134L13.5799 12.8609L13.5799 19.7659L7.59998 16.3134Z" fill="black"/><path fill-rule="evenodd" clip-rule="evenodd" d="M12.7307 16.7783H17.13C18.2346 16.7783 19.13 15.8829 19.13 14.7783V4.84961C19.13 3.74504 18.2346 2.84961 17.13 2.84961H16.9706V3.84961H17.13C17.6823 3.84961 18.13 4.29732 18.13 4.84961V14.7783C18.13 15.3306 17.6823 15.7783 17.13 15.7783H12.7307V16.7783Z" fill="black"/></svg>
diff --git a/core/modules/ckeditor5/icons/source-editing.svg b/core/modules/ckeditor5/icons/source-editing.svg
new file mode 100644
index 0000000000..0bf9e953df
--- /dev/null
+++ b/core/modules/ckeditor5/icons/source-editing.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m12.5 0 5 4.5v15.003h-16V0h11zM3 1.5v3.25l-1.497 1-.003 8 1.5 1v3.254L7.685 18l-.001 1.504H17.5V8.002L16 9.428l-.004-4.22-4.222-3.692L3 1.5z"/><path d="M4.06 6.64a.75.75 0 0 1 .958 1.15l-.085.07L2.29 9.75l2.646 1.89c.302.216.4.62.232.951l-.058.095a.75.75 0 0 1-.951.232l-.095-.058-3.5-2.5V9.14l3.496-2.5zm4.194 6.22a.75.75 0 0 1-.958-1.149l.085-.07 2.643-1.89-2.646-1.89a.75.75 0 0 1-.232-.952l.058-.095a.75.75 0 0 1 .95-.232l.096.058 3.5 2.5v1.22l-3.496 2.5zm7.644-.836 2.122 2.122-5.825 5.809-2.125-.005.003-2.116zm2.539-1.847 1.414 1.414a.5.5 0 0 1 0 .707l-1.06 1.06-2.122-2.12 1.061-1.061a.5.5 0 0 1 .707 0z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/strikethrough.svg b/core/modules/ckeditor5/icons/strikethrough.svg
new file mode 100644
index 0000000000..756a6870ea
--- /dev/null
+++ b/core/modules/ckeditor5/icons/strikethrough.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7 16.4c-.8-.4-1.5-.9-2.2-1.5a.6.6 0 0 1-.2-.5l.3-.6h1c1 1.2 2.1 1.7 3.7 1.7 1 0 1.8-.3 2.3-.6.6-.4.6-1.2.6-1.3.2-1.2-.9-2.1-.9-2.1h2.1c.3.7.4 1.2.4 1.7v.8l-.6 1.2c-.6.8-1.1 1-1.6 1.2a6 6 0 0 1-2.4.6c-1 0-1.8-.3-2.5-.6zM6.8 9 6 8.3c-.4-.5-.5-.8-.5-1.6 0-.7.1-1.3.5-1.8.4-.6 1-1 1.6-1.3a6.3 6.3 0 0 1 4.7 0 4 4 0 0 1 1.7 1l.3.7c0 .1.2.4-.2.7-.4.2-.9.1-1 0a3 3 0 0 0-1.2-1c-.4-.2-1-.3-2-.4-.7 0-1.4.2-2 .6-.8.6-1 .8-1 1.5 0 .8.5 1 1.2 1.5.6.4 1.1.7 1.9 1H6.8z"/><path d="M3 10.5V9h14v1.5z"/></svg>
diff --git a/core/modules/ckeditor5/icons/subscript.svg b/core/modules/ckeditor5/icons/subscript.svg
new file mode 100644
index 0000000000..da53b284a5
--- /dev/null
+++ b/core/modules/ckeditor5/icons/subscript.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m7.03 10.349 3.818-3.819a.8.8 0 1 1 1.132 1.132L8.16 11.48l3.819 3.818a.8.8 0 1 1-1.132 1.132L7.03 12.61l-3.818 3.82a.8.8 0 1 1-1.132-1.132L5.9 11.48 2.08 7.662A.8.8 0 1 1 3.212 6.53l3.818 3.82zm8.147 7.829h2.549c.254 0 .447.05.58.152a.49.49 0 0 1 .201.413.54.54 0 0 1-.159.393c-.105.108-.266.162-.48.162h-3.594c-.245 0-.435-.066-.572-.197a.621.621 0 0 1-.205-.463c0-.114.044-.265.132-.453a1.62 1.62 0 0 1 .288-.444c.433-.436.824-.81 1.172-1.122.348-.312.597-.517.747-.615.267-.183.49-.368.667-.553.177-.185.312-.375.405-.57.093-.194.139-.384.139-.57a1.008 1.008 0 0 0-.554-.917 1.197 1.197 0 0 0-.56-.133c-.426 0-.761.182-1.005.546a2.332 2.332 0 0 0-.164.39 1.609 1.609 0 0 1-.258.488c-.096.114-.237.17-.423.17a.558.558 0 0 1-.405-.156.568.568 0 0 1-.161-.427c0-.218.05-.446.151-.683.101-.238.252-.453.452-.646s.454-.349.762-.467a2.998 2.998 0 0 1 1.081-.178c.498 0 .923.076 1.274.228a1.916 1.916 0 0 1 1.004 1.032 1.984 1.984 0 0 1-.156 1.794c-.2.32-.405.572-.613.754-.208.182-.558.468-1.048.857-.49.39-.826.691-1.008.906a2.703 2.703 0 0 0-.24.309z"/></svg>
diff --git a/core/modules/ckeditor5/icons/superscript.svg b/core/modules/ckeditor5/icons/superscript.svg
new file mode 100644
index 0000000000..92c9be8064
--- /dev/null
+++ b/core/modules/ckeditor5/icons/superscript.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M15.677 8.678h2.549c.254 0 .447.05.58.152a.49.49 0 0 1 .201.413.54.54 0 0 1-.159.393c-.105.108-.266.162-.48.162h-3.594c-.245 0-.435-.066-.572-.197a.621.621 0 0 1-.205-.463c0-.114.044-.265.132-.453a1.62 1.62 0 0 1 .288-.444c.433-.436.824-.81 1.172-1.122.348-.312.597-.517.747-.615.267-.183.49-.368.667-.553.177-.185.312-.375.405-.57.093-.194.139-.384.139-.57a1.008 1.008 0 0 0-.554-.917 1.197 1.197 0 0 0-.56-.133c-.426 0-.761.182-1.005.546a2.332 2.332 0 0 0-.164.39 1.609 1.609 0 0 1-.258.488c-.096.114-.237.17-.423.17a.558.558 0 0 1-.405-.156.568.568 0 0 1-.161-.427c0-.218.05-.446.151-.683.101-.238.252-.453.452-.646s.454-.349.762-.467a2.998 2.998 0 0 1 1.081-.178c.498 0 .923.076 1.274.228a1.916 1.916 0 0 1 1.004 1.032 1.984 1.984 0 0 1-.156 1.794c-.2.32-.405.572-.613.754-.208.182-.558.468-1.048.857-.49.39-.826.691-1.008.906a2.703 2.703 0 0 0-.24.309zM7.03 10.349l3.818-3.819a.8.8 0 1 1 1.132 1.132L8.16 11.48l3.819 3.818a.8.8 0 1 1-1.132 1.132L7.03 12.61l-3.818 3.82a.8.8 0 1 1-1.132-1.132L5.9 11.48 2.08 7.662A.8.8 0 1 1 3.212 6.53l3.818 3.82z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/table.svg b/core/modules/ckeditor5/icons/table.svg
new file mode 100644
index 0000000000..374ef88638
--- /dev/null
+++ b/core/modules/ckeditor5/icons/table.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 6v3h4V6H3zm0 4v3h4v-3H3zm0 4v3h4v-3H3zm5 3h4v-3H8v3zm5 0h4v-3h-4v3zm4-4v-3h-4v3h4zm0-4V6h-4v3h4zm1.5 8a1.5 1.5 0 0 1-1.5 1.5H3A1.5 1.5 0 0 1 1.5 17V4c.222-.863 1.068-1.5 2-1.5h13c.932 0 1.778.637 2 1.5v13zM12 13v-3H8v3h4zm0-4V6H8v3h4z"/></svg>
\ No newline at end of file
diff --git a/core/modules/ckeditor5/icons/underline.svg b/core/modules/ckeditor5/icons/underline.svg
new file mode 100644
index 0000000000..11bab0dde0
--- /dev/null
+++ b/core/modules/ckeditor5/icons/underline.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 18v-1.5h14V18zM5.2 10V3.6c0-.4.4-.6.8-.6.3 0 .7.2.7.6v6.2c0 2 1.3 2.8 3.2 2.8 1.9 0 3.4-.9 3.4-2.9V3.6c0-.3.4-.5.8-.5.3 0 .7.2.7.5V10c0 2.7-2.2 4-4.9 4-2.6 0-4.7-1.2-4.7-4z"></path></svg>
diff --git a/core/modules/ckeditor5/icons/undo.svg b/core/modules/ckeditor5/icons/undo.svg
new file mode 100644
index 0000000000..0e01bcac28
--- /dev/null
+++ b/core/modules/ckeditor5/icons/undo.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m5.042 9.367 2.189 1.837a.75.75 0 0 1-.965 1.149l-3.788-3.18a.747.747 0 0 1-.21-.284.75.75 0 0 1 .17-.945L6.23 4.762a.75.75 0 1 1 .964 1.15L4.863 7.866h8.917A.75.75 0 0 1 14 7.9a4 4 0 1 1-1.477 7.718l.344-1.489a2.5 2.5 0 1 0 1.094-4.73l.008-.032H5.042z"/></svg>
diff --git a/core/modules/ckeditor5/js/ckeditor5.admin.es6.js b/core/modules/ckeditor5/js/ckeditor5.admin.es6.js
new file mode 100644
index 0000000000..ffa434ac77
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5.admin.es6.js
@@ -0,0 +1,992 @@
+/**
+ * @file
+ * Provides admin UI for the CKEditor 5.
+ */
+
+(function (Drupal, drupalSettings, $, JSON, once, Sortable) {
+  const toolbarHelp = [
+    {
+      message: Drupal.t(
+        "The toolbar buttons that don't fit the user's browser window width will be grouped in a dropdown. If multiple toolbar rows are preferred, those can be configured by adding an explicit wrapping breakpoint wherever you want to start a new row.",
+        null,
+        {
+          context:
+            'CKEditor 5 toolbar help text, default, no explicit wrapping breakpoint',
+        },
+      ),
+      button: 'wrapping',
+      condition: false,
+    },
+    {
+      message: Drupal.t(
+        'You have configured a multi-row toolbar by using an explicit wrapping breakpoint. This may not work well in narrow browser windows. To use automatic grouping, remove any of these divider buttons.',
+        null,
+        {
+          context:
+            'CKEditor 5 toolbar help text, with explicit wrapping breakpoint',
+        },
+      ),
+      button: 'wrapping',
+      condition: true,
+    },
+  ];
+
+  /**
+   * Gets selected buttons.
+   *
+   * @param {Array} selected
+   *   The selected buttons retrieved from state.
+   * @param dividers
+   *   The available dividers.
+   * @param available
+   *   The available buttons.
+   * @returns {Array}
+   */
+  const getSelectedButtons = (selected, dividers, available) => {
+    return selected.map((id) => ({
+      ...[...dividers, ...available].find((button) => button.id === id),
+    }));
+  };
+
+  /**
+   * Updates selected buttons to the textarea.
+   *
+   * @param {Array} selection
+   *   The current selection.
+   * @param {Element} textarea
+   *   The textarea element.
+   */
+  const updateSelectedButtons = (selection, textarea) => {
+    const newValue = JSON.stringify(selection);
+
+    const priorValue = textarea.innerHTML;
+    textarea.value = newValue;
+    textarea.innerHTML = newValue;
+
+    // The textarea is programmatically updated, so no native JavaScript
+    // event is triggered. Event listeners need to be aware of this config
+    // update, so a custom event is dispatched immediately after the
+    // config update.
+    textarea.dispatchEvent(
+      new CustomEvent('change', {
+        detail: {
+          priorValue,
+        },
+      }),
+    );
+  };
+
+  /**
+   * Function to add button to selected buttons.
+   *
+   * @param {Observable} selection
+   *   The currently selected buttons.
+   * @param {Element} element
+   *   The element which is being added.
+   * @param {function} announceChange
+   *   Function to call to announce the change.
+   */
+  const addToSelectedButtons = (selection, element, announceChange) => {
+    const list = [...selection.value];
+    list.push(element.dataset.id);
+    selection.value = list;
+
+    if (announceChange) {
+      setTimeout(() => {
+        announceChange(element.dataset.label);
+      });
+    }
+  };
+
+  /**
+   * Function to remove button from selected buttons.
+   *
+   * @param {Observable} selection
+   *   The currently selected buttons.
+   * @param {Element} element
+   *   The element which is being removed.
+   * @param {function} announceChange
+   *   Function to call to announce the change.
+   */
+  const removeFromSelectedButtons = (selection, element, announceChange) => {
+    const list = [...selection.value];
+    const index = Array.from(element.parentElement.children).findIndex(
+      (child) => {
+        return child === element;
+      },
+    );
+    list.splice(index, 1);
+    selection.value = list;
+
+    if (announceChange) {
+      setTimeout(() => {
+        announceChange(element.dataset.label);
+      });
+    }
+  };
+
+  /**
+   * Moves element within active buttons.
+   *
+   * @param {Observable} selection
+   *   The currently selected buttons.
+   * @param {Element} element
+   *   The element being moved.
+   * @param {Number} dir
+   *   The direction which the element is being moved.
+   */
+  const moveWithinSelectedButtons = (selection, element, dir) => {
+    const list = [...selection.value];
+    const index = Array.from(element.parentElement.children).findIndex(
+      (child) => {
+        return child === element;
+      },
+    );
+    // If moving up, check it is not the first, else check it is not the last.
+    const condition = dir < 0 ? index > 0 : index < list.length - 1;
+    if (condition) {
+      list.splice(index + dir, 0, list.splice(index, 1)[0]);
+      selection.value = list;
+    }
+  };
+
+  /**
+   * Copies element to active buttons.
+   *
+   * @param {Observable} selection
+   *   The currently selected buttons.
+   * @param {Element} element
+   *   The element to be copied.
+   * @param {Function} announceChange
+   *   A function to call to announce the change.
+   */
+  const copyToActiveButtons = (selection, element, announceChange) => {
+    const list = [...selection.value];
+    list.push(element.dataset.id);
+    selection.value = list;
+
+    setTimeout(() => {
+      if (announceChange) {
+        announceChange(element.dataset.label);
+      }
+    });
+  };
+
+  /**
+   * Renders the CKEditor 5 button admin UI.
+   *
+   * @param {Element} root
+   *   The element where the admin UI should be rendered.
+   * @param {Observable} selectedButtons
+   *   An Observable object containing selected buttons.
+   * @param {Array} availableButtons
+   *   An array containing available buttons.
+   * @param {Array} dividerButtons
+   *   An array containing available divider buttons.
+   */
+  const render = (root, selectedButtons, availableButtons, dividerButtons) => {
+    const toolbarHelpText = toolbarHelp
+      .filter(
+        (helpItem) =>
+          selectedButtons.value.includes(helpItem.button) ===
+          helpItem.condition,
+      )
+      .map((helpItem) => helpItem.message);
+    root.innerHTML = Drupal.theme.ckeditor5Admin({
+      availableButtons: Drupal.theme.ckeditor5AvailableButtons({
+        buttons: availableButtons.filter(
+          (button) => !selectedButtons.value.includes(button.id),
+        ),
+      }),
+      dividerButtons: Drupal.theme.ckeditor5DividerButtons({
+        buttons: dividerButtons,
+      }),
+      activeToolbar: Drupal.theme.ckeditor5SelectedButtons({
+        buttons: getSelectedButtons(
+          selectedButtons.value,
+          dividerButtons,
+          availableButtons,
+        ),
+      }),
+      helpMessage: toolbarHelpText,
+    });
+
+    // Create sortable groups for available buttons, current toolbar items,
+    // and dividers.
+    new Sortable(
+      root.querySelector(
+        '[data-button-list="ckeditor5-toolbar-active-buttons"]',
+      ),
+      {
+        group: { name: 'toolbar', put: ['divider', 'available'] },
+        sort: true,
+        store: {
+          set: (sortable) => {
+            selectedButtons.value = sortable.toArray();
+          },
+        },
+      },
+    );
+    const toolbarAvailableButtons = new Sortable(
+      root.querySelector(
+        '[data-button-list="ckeditor5-toolbar-available-buttons"]',
+      ),
+      {
+        group: { name: 'available', put: ['toolbar'] },
+        sort: false,
+        onAdd: (event) => {
+          // If the moved item is a divider, it should not be added to
+          // the available buttons list.
+          if (
+            dividerButtons.find(
+              (dividerButton) => dividerButton.id === event.item.dataset.id,
+            )
+          ) {
+            const { newIndex } = event;
+            setTimeout(() => {
+              // Remove the divider button from the available buttons
+              // list. Draggable reassesses the lists during each drag
+              // event, so the DOM removal should not be disruptive.
+              document
+                .querySelectorAll('.ckeditor5-toolbar-available__buttons li')
+                [newIndex].remove();
+            });
+          }
+        },
+      },
+    );
+    new Sortable(
+      root.querySelector(
+        '[data-button-list="ckeditor5-toolbar-divider-buttons"]',
+      ),
+      {
+        group: { name: 'divider', put: false, pull: 'clone', sort: 'false' },
+      },
+    );
+
+    root
+      .querySelectorAll('[data-drupal-selector="ckeditor5-toolbar-button"]')
+      .forEach((element) => {
+        const expandButton = (event) => {
+          event.currentTarget
+            .querySelectorAll('.ckeditor5-toolbar-button')
+            .forEach((buttonElement) => {
+              buttonElement.setAttribute('data-expanded', true);
+            });
+        };
+        const retractButton = (event) => {
+          event.currentTarget
+            .querySelectorAll('.ckeditor5-toolbar-button')
+            .forEach((buttonElement) => {
+              buttonElement.setAttribute('data-expanded', false);
+            });
+        };
+        element.addEventListener('mouseenter', expandButton);
+        element.addEventListener('focus', expandButton);
+        element.addEventListener('mouseleave', retractButton);
+        element.addEventListener('blur', retractButton);
+
+        element.addEventListener('keyup', (event) => {
+          // Keys supported by the admin UI. Depending on the element that is
+          // triggering the event, the event could trigger changes in the state.
+          // Changes to the state trigger re-rendering of the admin UI, which
+          // means that for consistent navigation, each action modifying state
+          // needs to set focus back on the button that is being moved. The state
+          // change also triggers an AJAX request which re-renders parts of the
+          // form, and moves the focus to the triggering form element, meaning
+          // that focus needs to be set back on the button again.
+          const supportedKeys = [
+            'ArrowLeft',
+            'ArrowRight',
+            'ArrowUp',
+            'ArrowDown',
+          ];
+          const dir = document.documentElement.dir;
+          if (supportedKeys.includes(event.key)) {
+            if (event.currentTarget.dataset.divider.toLowerCase() === 'true') {
+              switch (event.key) {
+                case 'ArrowDown':
+                  const announceChange = (name) => {
+                    Drupal.announce(
+                      Drupal.t(
+                        'Button @name has been copied to the active toolbar.',
+                        { '@name': name },
+                      ),
+                    );
+                  };
+                  copyToActiveButtons(
+                    selectedButtons,
+                    event.currentTarget,
+                    announceChange,
+                  );
+                  // Focus the last button since new button is always added to the
+                  // end of the list.
+                  root
+                    .querySelector(
+                      '[data-button-list="ckeditor5-toolbar-active-buttons"] li:last-child',
+                    )
+                    .focus();
+                  break;
+              }
+            } else if (
+              selectedButtons.value.includes(event.currentTarget.dataset.id)
+            ) {
+              const index = Array.from(
+                element.parentElement.children,
+              ).findIndex((child) => {
+                return child === element;
+              });
+              switch (event.key) {
+                case 'ArrowLeft':
+                  const leftOffset = dir === 'ltr' ? -1 : 1;
+                  moveWithinSelectedButtons(
+                    selectedButtons,
+                    event.currentTarget,
+                    leftOffset,
+                  );
+                  // Move focus to left or right from the current index depending
+                  // on current language direction. Use index instead of the
+                  // data-id because dividers don't have a unique ID.
+                  root
+                    .querySelectorAll(
+                      '[data-button-list="ckeditor5-toolbar-active-buttons"] li',
+                    )
+                    [index + leftOffset].focus();
+                  break;
+                case 'ArrowRight':
+                  const rightOffset = dir === 'ltr' ? 1 : -1;
+                  moveWithinSelectedButtons(
+                    selectedButtons,
+                    event.currentTarget,
+                    rightOffset,
+                  );
+                  // Move focus to right or left from the current index depending
+                  // on current language direction. Use index instead of the
+                  // data-id because dividers don't have a unique ID.
+                  root
+                    .querySelectorAll(
+                      '[data-button-list="ckeditor5-toolbar-active-buttons"] li',
+                    )
+                    [index + rightOffset].focus();
+                  break;
+                case 'ArrowUp':
+                  const announceChange = (name) => {
+                    Drupal.announce(
+                      Drupal.t(
+                        'Button @name has been removed from the active toolbar.',
+                        { '@name': name },
+                      ),
+                    );
+                  };
+                  removeFromSelectedButtons(
+                    selectedButtons,
+                    event.currentTarget,
+                    announceChange,
+                  );
+                  // Focus only if the button wasn't a divider because dividers
+                  // are simply removed from the active buttons instead of moving
+                  // to another list.
+                  if (
+                    !dividerButtons.find(
+                      (dividerButton) =>
+                        event.currentTarget.dataset.id === dividerButton.id,
+                    )
+                  ) {
+                    // Focus button based on the data-id attribute from the
+                    // available buttons list.
+                    root
+                      .querySelector(
+                        `[data-button-list="ckeditor5-toolbar-available-buttons"] [data-id="${event.currentTarget.dataset.id}"]`,
+                      )
+                      .focus();
+                  }
+                  break;
+              }
+            } else if (
+              toolbarAvailableButtons
+                .toArray()
+                .includes(event.currentTarget.dataset.id)
+            ) {
+              switch (event.key) {
+                case 'ArrowDown':
+                  const announceChange = (name) => {
+                    Drupal.announce(
+                      Drupal.t(
+                        'Button @name has been moved to the active toolbar.',
+                        { '@name': name },
+                      ),
+                    );
+                  };
+                  addToSelectedButtons(
+                    selectedButtons,
+                    event.currentTarget,
+                    announceChange,
+                  );
+                  // Focus the last button since new button is always added to the
+                  // end of the list.
+                  root
+                    .querySelector(
+                      '[data-button-list="ckeditor5-toolbar-active-buttons"] li:last-child',
+                    )
+                    .focus();
+                  break;
+              }
+            }
+          }
+        });
+      });
+  };
+
+  /**
+   * Attach CKEditor 5 admin UI.
+   *
+   * @type {Drupal~behavior}
+   *
+   * @prop {Drupal~behaviorAttach} attach
+   *   Attaches admin app to edit the CKEditor 5 toolbar.
+   * @prop {Drupal~behaviorDetach} detach
+   *   Detaches admin app from the CKEditor 5 configuration form on 'unload'.
+   */
+  Drupal.behaviors.ckeditor5Admin = {
+    attach(context) {
+      once('ckeditor5-admin-toolbar', '#ckeditor5-toolbar-app').forEach(
+        (container) => {
+          const selectedTextarea = context.querySelector(
+            '#ckeditor5-toolbar-buttons-selected',
+          );
+          const available = Object.entries(
+            JSON.parse(
+              context.querySelector('#ckeditor5-toolbar-buttons-available')
+                .innerHTML,
+            ),
+          ).map(([name, attrs]) => ({ name, id: name, ...attrs }));
+          const dividers = [
+            {
+              id: 'divider',
+              name: '|',
+              label: Drupal.t('Divider'),
+            },
+            {
+              id: 'wrapping',
+              name: '-',
+              label: Drupal.t('Wrapping'),
+            },
+          ];
+
+          // Selected is used for managing the state. Sortable is handling updates
+          // to the state when the system is operated by mouse. There are
+          // functions making direct modifications to the state when system is
+          // operated by keyboard.
+          const selected = new Observable(
+            JSON.parse(selectedTextarea.innerHTML).map((name) => {
+              return [...dividers, ...available].find((button) => {
+                return button.name === name;
+              }).id;
+            }),
+          );
+
+          // Whenever the state is changed, update the textarea with the changes.
+          // This will also trigger re-render of the admin UI to reinitialize the
+          // Sortable state.
+          selected.subscribe((selection) => {
+            updateSelectedButtons(
+              selection.map((id) => {
+                return [...dividers, ...available].find((button) => {
+                  return button.id === id;
+                }).name;
+              }),
+              selectedTextarea,
+            );
+            render(container, selected, available, dividers);
+          });
+
+          [
+            context.querySelector('#ckeditor5-toolbar-buttons-available'),
+            context.querySelector('[class*="editor-settings-toolbar-items"]'),
+          ]
+            .filter((el) => el)
+            .forEach((el) => {
+              el.classList.add('visually-hidden');
+            });
+
+          render(container, selected, available, dividers);
+        },
+      );
+      // Safari's focus outlines take into account absolute positioned elements.
+      // When a toolbar option is blurred, the portion of the focus outline
+      // surrounding the absolutely positioned tooltip does not go away. To
+      // prevent keyboard navigation users from seeing outline artifacts for
+      // every option they've tabbed through, we provide a keydown listener
+      // that can catch blur-causing events before the blur happens. If the
+      // tooltip is hidden before the blur event, the outline will disappear
+      // correctly.
+      once(
+        'safari-focus-fix',
+        document.querySelectorAll('.ckeditor5-toolbar-item'),
+      ).forEach((item) => {
+        item.addEventListener('keydown', (e) => {
+          const keyCodeDirections = {
+            9: 'tab',
+            37: 'left',
+            38: 'up',
+            39: 'right',
+            40: 'down',
+          };
+          if (
+            ['tab', 'left', 'up', 'right', 'down'].includes(
+              keyCodeDirections[e.keyCode],
+            )
+          ) {
+            let hideTip = false;
+            const isActive = e.target.closest(
+              '[data-button-list="ckeditor5-toolbar-active__buttons"]',
+            );
+            if (isActive) {
+              if (
+                ['tab', 'left', 'up', 'right'].includes(
+                  keyCodeDirections[e.keyCode],
+                )
+              ) {
+                hideTip = true;
+              }
+            } else if (['tab', 'down'].includes(keyCodeDirections[e.keyCode])) {
+              hideTip = true;
+            }
+            if (hideTip) {
+              e.target
+                .querySelector('[data-expanded]')
+                .setAttribute('data-expanded', 'false');
+            }
+          }
+        });
+      });
+
+      /**
+       * Updates the UI state info in the form's 'data-drupal-ui-state' attribute.
+       *
+       * @param {object} states
+       *   An object with one or more items with the structure { ui-property: stored-value }
+       */
+      const updateUiStateStorage = (states) => {
+        const form = document.querySelector(
+          '#filter-format-edit-form, #filter-format-add-form',
+        );
+
+        // Get the current stored UI state as an object.
+        const currentStates = form.hasAttribute('data-drupal-ui-state')
+          ? JSON.parse(form.getAttribute('data-drupal-ui-state'))
+          : {};
+
+        // Store the updated UI state object as an object literal in the parent
+        // form's 'data-drupal-ui-state' attribute.
+        form.setAttribute(
+          'data-drupal-ui-state',
+          JSON.stringify({ ...currentStates, ...states }),
+        );
+      };
+
+      /**
+       * Gets a stored UI state property.
+       *
+       * @param {string} property
+       *   The UI state property to retrieve the value of.
+       *
+       * @return {string|null}
+       *   When present, the stored value of the property.
+       */
+      const getUiStateStorage = (property) => {
+        const form = document.querySelector(
+          '#filter-format-edit-form, #filter-format-add-form',
+        );
+
+        if (form === null) {
+          return;
+        }
+
+        // Parse the object literal stored in the form's 'data-drupal-ui-state'
+        // attribute and return the value of the object property that matches
+        // the 'property' argument.
+        return form.hasAttribute('data-drupal-ui-state')
+          ? JSON.parse(form.getAttribute('data-drupal-ui-state'))[property]
+          : null;
+      };
+
+      // Add an attribute to the parent form for storing UI states, so this
+      // information can be retrieved after AJAX rebuilds.
+      once(
+        'ui-state-storage',
+        document.querySelector(
+          '#filter-format-edit-form, #filter-format-add-form',
+        ),
+      ).forEach((form) => {
+        form.setAttribute('data-drupal-ui-state', JSON.stringify({}));
+      });
+
+      /**
+       * Maintains the active vertical tab after AJAX rebuild.
+       *
+       * @param {Element} verticalTabs
+       *   The vertical tabs element.
+       */
+      const maintainActiveVerticalTab = (verticalTabs) => {
+        const id = verticalTabs.id;
+
+        // If the UI state storage has an active tab, click that tab.
+        const activeTab = getUiStateStorage(`${id}-active-tab`);
+        if (activeTab) {
+          setTimeout(() => {
+            document.querySelector(activeTab).click();
+          });
+        }
+
+        // Add click listener that adds any tab click into UI storage.
+        verticalTabs.querySelectorAll('.vertical-tabs__menu').forEach((tab) => {
+          tab.addEventListener('click', (e) => {
+            const state = {};
+            const href = e.target
+              .closest('[href]')
+              .getAttribute('href')
+              .split('--')[0];
+            state[`${id}-active-tab`] = `#${id} [href^='${href}']`;
+            updateUiStateStorage(state);
+          });
+        });
+      };
+
+      once(
+        'plugin-settings',
+        document.querySelector('#plugin-settings-wrapper'),
+      ).forEach(maintainActiveVerticalTab);
+      once(
+        'filter-settings',
+        document.querySelector('#filter-settings-wrapper'),
+      ).forEach(maintainActiveVerticalTab);
+
+      // Add listeners to maintain focus after AJAX rebuilds.
+      const selectedButtons = document.querySelector(
+        '#ckeditor5-toolbar-buttons-selected',
+      );
+
+      once('textarea-listener', selectedButtons).forEach((textarea) => {
+        textarea.addEventListener('change', (e) => {
+          const buttonName = document.activeElement.getAttribute('data-id');
+          if (!buttonName) {
+            // If there is no 'data-id' attribute, then the config
+            // is happening via mouse.
+            return;
+          }
+          let focusSelector = '';
+
+          // Divider elements are treated differently as there can be multiple
+          // elements with the same button name.
+          if (['divider', 'wrapping'].includes(buttonName)) {
+            const oldConfig = JSON.parse(e.detail.priorValue);
+            const newConfig = JSON.parse(e.target.innerHTML);
+
+            // If the divider is being removed from active buttons, it does not
+            // 'move' anywhere. Move focus to the prior active button
+            if (oldConfig.length > newConfig.length) {
+              for (let item = 0; item < newConfig.length; item++) {
+                if (newConfig[item] !== oldConfig[item]) {
+                  focusSelector = `[data-button-list="ckeditor5-toolbar-active-buttons"] li:nth-child(${Math.min(
+                    item - 1,
+                    0,
+                  )})`;
+                  break;
+                }
+              }
+            } else if (oldConfig.length < newConfig.length) {
+              // If the divider is being added, it will be the last active item.
+              focusSelector =
+                '[data-button-list="ckeditor5-toolbar-active-buttons"] li:last-child';
+            } else {
+              // When moving a dividers position within the active buttons.
+              document
+                .querySelectorAll(
+                  `[data-button-list="ckeditor5-toolbar-active-buttons"] [data-id='${buttonName}']`,
+                )
+                .forEach((divider, index) => {
+                  if (divider === document.activeElement) {
+                    focusSelector = `${buttonName}|${index}`;
+                  }
+                });
+            }
+          } else {
+            focusSelector = `[data-id='${buttonName}']`;
+          }
+
+          // Store the focus selector in an attribute on the form itself, which
+          // will not be overwritten after the AJAX rebuild. This makes it
+          // the value available to the textarea focus listener that is
+          // triggered after the AJAX rebuild.
+          updateUiStateStorage({ focusSelector });
+        });
+
+        textarea.addEventListener('focus', (e) => {
+          // The selector that should receive focus is stored in the parent
+          // form element. Move focus to that selector.
+          const focusSelector = getUiStateStorage('focusSelector');
+
+          if (focusSelector) {
+            // If focusSelector includes '|', it is a separator that is being
+            // moved within the active button list. Different logic us used to
+            // determine focus since there can be multiple separators of the
+            // same type within the active buttons list.
+            if (focusSelector.includes('|')) {
+              const [buttonName, count] = focusSelector.split('|');
+              document
+                .querySelectorAll(
+                  `[data-button-list="ckeditor5-toolbar-active-buttons"] [data-id='${buttonName}']`,
+                )
+                .forEach((item, index) => {
+                  if (index === parseInt(count, 10)) {
+                    item.focus();
+                  }
+                });
+            } else {
+              const toFocus = document.querySelector(focusSelector);
+              if (toFocus) {
+                toFocus.focus();
+              }
+            }
+          }
+        });
+      });
+    },
+  };
+
+  /**
+   * Theme function for CKEditor 5 selected buttons.
+   *
+   * @param {Object} options
+   * @param {Array} options.buttons
+   *   An array of selected buttons.
+   * @returns {string}
+   */
+  Drupal.theme.ckeditor5SelectedButtons = ({ buttons }) => {
+    return `
+      <ul class="ckeditor5-toolbar-tray ckeditor5-toolbar-active__buttons" data-button-list="ckeditor5-toolbar-active-buttons" role="listbox" aria-orientation="horizontal" aria-labelledby="ckeditor5-toolbar-active-buttons-label">
+        ${buttons
+          .map((button) =>
+            Drupal.theme.ckeditor5Button({ button, listType: 'active' }),
+          )
+          .join('')}
+      </ul>
+    `;
+  };
+
+  /**
+   * Theme function for CKEditor 5 divider buttons.
+   *
+   * @param {Object} options
+   * @param {Array} options.buttons
+   *   An array of divider buttons.
+   * @returns {string}
+   */
+  Drupal.theme.ckeditor5DividerButtons = ({ buttons }) => {
+    return `
+      <ul class="ckeditor5-toolbar-tray ckeditor5-toolbar-divider__buttons" data-button-list="ckeditor5-toolbar-divider-buttons" role="listbox" aria-orientation="horizontal" aria-labelledby="ckeditor5-toolbar-divider-buttons-label">
+        ${buttons
+          .map((button) =>
+            Drupal.theme.ckeditor5Button({ button, listType: 'divider' }),
+          )
+          .join('')}
+      </ul>
+    `;
+  };
+
+  /**
+   * Theme function for CKEditor 5 available buttons.
+   *
+   * @param {Object} options
+   * @param {Array} options.buttons
+   *   An array of available buttons.
+   * @returns {string}
+   */
+  Drupal.theme.ckeditor5AvailableButtons = ({ buttons }) => {
+    return `
+      <ul class="ckeditor5-toolbar-tray ckeditor5-toolbar-available__buttons" data-button-list="ckeditor5-toolbar-available-buttons" role="listbox" aria-orientation="horizontal" aria-labelledby="ckeditor5-toolbar-available-buttons-label">
+        ${buttons
+          .map((button) =>
+            Drupal.theme.ckeditor5Button({ button, listType: 'available' }),
+          )
+          .join('')}
+      </ul>
+    `;
+  };
+
+  /**
+   * Theme function for CKEditor 5 buttons.
+   *
+   * @param {Object} options
+   * @param {Object} options.button
+   * @param {String} options.button.label
+   *   Button label.
+   * @param {String} options.button.id
+   *   Button id.
+   * @param {String} options.listType
+   *   The type of the list.
+   * @returns {string}
+   */
+  Drupal.theme.ckeditor5Button = ({ button: { label, id }, listType }) => {
+    const visuallyHiddenLabel = Drupal.t(`@listType button @label`, {
+      '@listType': listType !== 'divider' ? listType : 'available',
+      '@label': label,
+    });
+    return `
+      <li class="ckeditor5-toolbar-item ckeditor5-toolbar-item-${id}" role="option" tabindex="0" data-drupal-selector="ckeditor5-toolbar-button" data-id="${id}" data-label="${label}" data-divider="${
+      listType === 'divider'
+    }">
+        <span class="ckeditor5-toolbar-button ckeditor5-toolbar-button-${id}">
+          <span class="visually-hidden">${visuallyHiddenLabel})}</span>
+        </span>
+        <span class="ckeditor5-toolbar-tooltip" aria-hidden="true">${label}</span>
+      </li>
+    `;
+  };
+
+  /**
+   * Theme function for CKEditor 5 admin UI.
+   *
+   * @param {Object} options
+   * @param {String} options.availableButtons
+   *   Markup for available buttons.
+   * @param {String} options.dividerButtons
+   *   Markup for divider buttons.
+   * @param {String} options.activeToolbar
+   *   Markup for active toolbar.
+   * @param {Array} options.helpMessage
+   *   An array of help messages.
+   * @returns {string}
+   */
+  Drupal.theme.ckeditor5Admin = ({
+    availableButtons,
+    dividerButtons,
+    activeToolbar,
+    helpMessage,
+  }) => {
+    return `
+    <div aria-live="polite" data-drupal-selector="ckeditor5-admin-help-message">
+      <p>${helpMessage.join('</p><p>')}</p>
+    </div>
+    <div class="ckeditor5-toolbar-disabled">
+      <div class="ckeditor5-toolbar-available">
+        <label id="ckeditor5-toolbar-available-buttons-label">${Drupal.t(
+          'Available buttons',
+        )}</label>
+        ${availableButtons}
+      </div>
+      <div class="ckeditor5-toolbar-divider">
+        <label id="ckeditor5-toolbar-divider-buttons-label">${Drupal.t(
+          'Button divider',
+        )}</label>
+        ${dividerButtons}
+      </div>
+    </div>
+    <div class="ckeditor5-toolbar-active">
+      <label id="ckeditor5-toolbar-active-buttons-label">${Drupal.t(
+        'Active toolbar',
+      )}</label>
+      ${activeToolbar}
+    </div>
+    `;
+  };
+
+  // Make a copy of the default filterStatus attach behaviors so it can be
+  // called within this module's override of it.
+  const originalFilterStatusAttach = Drupal.behaviors.filterStatus.attach;
+
+  // Overrides the default filterStatus to provided functionality needs
+  // specific to CKEditor 5.
+  Drupal.behaviors.filterStatus.attach = function (context, settings) {
+    // CKEditor 5 has uses cases that require updating the filter settings via
+    // AJAX. When this happens, the checkboxes that enable filters must be
+    // reprocessed by the filterStatus behavior. For this to occur:
+    // - The element must be unregistered with jQuery once() so the process can
+    //   run again and take into account any filter settings elements that have
+    //   been added or removed from the DOM.
+    // - Any listeners to the 'click.filterUpdate' event should be removed so
+    //   they do not conflict with event listeners that are added as part of the
+    //   AJAX refresh.
+    $(context)
+      .find('#filters-status-wrapper input.form-checkbox')
+      .removeOnce('filter-status')
+      .off('click.filterUpdate');
+
+    // Call the original
+    originalFilterStatusAttach(context, settings);
+  };
+
+  // Activates otherwise-inactive tabs that have form elements with validation
+  // errors.
+  // @todo Remove when https://www.drupal.org/project/drupal/issues/2911932 lands.
+  Drupal.behaviors.tabErrorsVisible = {
+    attach(context) {
+      context.querySelectorAll('details .form-item .error').forEach((item) => {
+        const details = item.closest('details');
+        if (details.style.display === 'none') {
+          const tabSelect = document.querySelector(`[href='#${details.id}']`);
+          if (tabSelect) {
+            tabSelect.click();
+          }
+        }
+      });
+    },
+  };
+
+  /**
+   * Allows attaching listeners to a value.
+   *
+   * @type {Observable}
+   */
+  const Observable = class {
+    /**
+     * Creates new Observable with a value.
+     *
+     * @param {*} value
+     */
+    constructor(value) {
+      this._listeners = [];
+      this._value = value;
+    }
+
+    /**
+     * Notifies subscribers about new value.
+     */
+    notify() {
+      this._listeners.forEach((listener) => listener(this._value));
+    }
+
+    /**
+     * Subscribes to be notified for changes.
+     *
+     * @param {Function} listener
+     *   The function to be called when a new value is set.
+     */
+    subscribe(listener) {
+      this._listeners.push(listener);
+    }
+
+    /**
+     * The value of the observable.
+     *
+     * @returns {*}
+     */
+    get value() {
+      return this._value;
+    }
+
+    /**
+     * Sets the value of the observable and notifies subscribers.
+     *
+     * @param {*} val
+     *   The new value of the observable.
+     */
+    set value(val) {
+      if (val !== this._value) {
+        this._value = val;
+        this.notify();
+      }
+    }
+  };
+})(Drupal, drupalSettings, jQuery, JSON, once, Sortable);
diff --git a/core/modules/ckeditor5/js/ckeditor5.admin.js b/core/modules/ckeditor5/js/ckeditor5.admin.js
new file mode 100644
index 0000000000..06dd628aba
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5.admin.js
@@ -0,0 +1,567 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
+
+function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
+
+function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+
+function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
+
+function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
+
+function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
+
+function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
+
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+(function (Drupal, drupalSettings, $, JSON, once, Sortable) {
+  var toolbarHelp = [{
+    message: Drupal.t("The toolbar buttons that don't fit the user's browser window width will be grouped in a dropdown. If multiple toolbar rows are preferred, those can be configured by adding an explicit wrapping breakpoint wherever you want to start a new row.", null, {
+      context: 'CKEditor 5 toolbar help text, default, no explicit wrapping breakpoint'
+    }),
+    button: 'wrapping',
+    condition: false
+  }, {
+    message: Drupal.t('You have configured a multi-row toolbar by using an explicit wrapping breakpoint. This may not work well in narrow browser windows. To use automatic grouping, remove any of these divider buttons.', null, {
+      context: 'CKEditor 5 toolbar help text, with explicit wrapping breakpoint'
+    }),
+    button: 'wrapping',
+    condition: true
+  }];
+
+  var getSelectedButtons = function getSelectedButtons(selected, dividers, available) {
+    return selected.map(function (id) {
+      return _objectSpread({}, [].concat(_toConsumableArray(dividers), _toConsumableArray(available)).find(function (button) {
+        return button.id === id;
+      }));
+    });
+  };
+
+  var updateSelectedButtons = function updateSelectedButtons(selection, textarea) {
+    var newValue = JSON.stringify(selection);
+    var priorValue = textarea.innerHTML;
+    textarea.value = newValue;
+    textarea.innerHTML = newValue;
+    textarea.dispatchEvent(new CustomEvent('change', {
+      detail: {
+        priorValue: priorValue
+      }
+    }));
+  };
+
+  var addToSelectedButtons = function addToSelectedButtons(selection, element, announceChange) {
+    var list = _toConsumableArray(selection.value);
+
+    list.push(element.dataset.id);
+    selection.value = list;
+
+    if (announceChange) {
+      setTimeout(function () {
+        announceChange(element.dataset.label);
+      });
+    }
+  };
+
+  var removeFromSelectedButtons = function removeFromSelectedButtons(selection, element, announceChange) {
+    var list = _toConsumableArray(selection.value);
+
+    var index = Array.from(element.parentElement.children).findIndex(function (child) {
+      return child === element;
+    });
+    list.splice(index, 1);
+    selection.value = list;
+
+    if (announceChange) {
+      setTimeout(function () {
+        announceChange(element.dataset.label);
+      });
+    }
+  };
+
+  var moveWithinSelectedButtons = function moveWithinSelectedButtons(selection, element, dir) {
+    var list = _toConsumableArray(selection.value);
+
+    var index = Array.from(element.parentElement.children).findIndex(function (child) {
+      return child === element;
+    });
+    var condition = dir < 0 ? index > 0 : index < list.length - 1;
+
+    if (condition) {
+      list.splice(index + dir, 0, list.splice(index, 1)[0]);
+      selection.value = list;
+    }
+  };
+
+  var copyToActiveButtons = function copyToActiveButtons(selection, element, announceChange) {
+    var list = _toConsumableArray(selection.value);
+
+    list.push(element.dataset.id);
+    selection.value = list;
+    setTimeout(function () {
+      if (announceChange) {
+        announceChange(element.dataset.label);
+      }
+    });
+  };
+
+  var render = function render(root, selectedButtons, availableButtons, dividerButtons) {
+    var toolbarHelpText = toolbarHelp.filter(function (helpItem) {
+      return selectedButtons.value.includes(helpItem.button) === helpItem.condition;
+    }).map(function (helpItem) {
+      return helpItem.message;
+    });
+    root.innerHTML = Drupal.theme.ckeditor5Admin({
+      availableButtons: Drupal.theme.ckeditor5AvailableButtons({
+        buttons: availableButtons.filter(function (button) {
+          return !selectedButtons.value.includes(button.id);
+        })
+      }),
+      dividerButtons: Drupal.theme.ckeditor5DividerButtons({
+        buttons: dividerButtons
+      }),
+      activeToolbar: Drupal.theme.ckeditor5SelectedButtons({
+        buttons: getSelectedButtons(selectedButtons.value, dividerButtons, availableButtons)
+      }),
+      helpMessage: toolbarHelpText
+    });
+    new Sortable(root.querySelector('[data-button-list="ckeditor5-toolbar-active-buttons"]'), {
+      group: {
+        name: 'toolbar',
+        put: ['divider', 'available']
+      },
+      sort: true,
+      store: {
+        set: function set(sortable) {
+          selectedButtons.value = sortable.toArray();
+        }
+      }
+    });
+    var toolbarAvailableButtons = new Sortable(root.querySelector('[data-button-list="ckeditor5-toolbar-available-buttons"]'), {
+      group: {
+        name: 'available',
+        put: ['toolbar']
+      },
+      sort: false,
+      onAdd: function onAdd(event) {
+        if (dividerButtons.find(function (dividerButton) {
+          return dividerButton.id === event.item.dataset.id;
+        })) {
+          var newIndex = event.newIndex;
+          setTimeout(function () {
+            document.querySelectorAll('.ckeditor5-toolbar-available__buttons li')[newIndex].remove();
+          });
+        }
+      }
+    });
+    new Sortable(root.querySelector('[data-button-list="ckeditor5-toolbar-divider-buttons"]'), {
+      group: {
+        name: 'divider',
+        put: false,
+        pull: 'clone',
+        sort: 'false'
+      }
+    });
+    root.querySelectorAll('[data-drupal-selector="ckeditor5-toolbar-button"]').forEach(function (element) {
+      var expandButton = function expandButton(event) {
+        event.currentTarget.querySelectorAll('.ckeditor5-toolbar-button').forEach(function (buttonElement) {
+          buttonElement.setAttribute('data-expanded', true);
+        });
+      };
+
+      var retractButton = function retractButton(event) {
+        event.currentTarget.querySelectorAll('.ckeditor5-toolbar-button').forEach(function (buttonElement) {
+          buttonElement.setAttribute('data-expanded', false);
+        });
+      };
+
+      element.addEventListener('mouseenter', expandButton);
+      element.addEventListener('focus', expandButton);
+      element.addEventListener('mouseleave', retractButton);
+      element.addEventListener('blur', retractButton);
+      element.addEventListener('keyup', function (event) {
+        var supportedKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'];
+        var dir = document.documentElement.dir;
+
+        if (supportedKeys.includes(event.key)) {
+          if (event.currentTarget.dataset.divider.toLowerCase() === 'true') {
+            switch (event.key) {
+              case 'ArrowDown':
+                var announceChange = function announceChange(name) {
+                  Drupal.announce(Drupal.t('Button @name has been copied to the active toolbar.', {
+                    '@name': name
+                  }));
+                };
+
+                copyToActiveButtons(selectedButtons, event.currentTarget, announceChange);
+                root.querySelector('[data-button-list="ckeditor5-toolbar-active-buttons"] li:last-child').focus();
+                break;
+            }
+          } else if (selectedButtons.value.includes(event.currentTarget.dataset.id)) {
+            var index = Array.from(element.parentElement.children).findIndex(function (child) {
+              return child === element;
+            });
+
+            switch (event.key) {
+              case 'ArrowLeft':
+                var leftOffset = dir === 'ltr' ? -1 : 1;
+                moveWithinSelectedButtons(selectedButtons, event.currentTarget, leftOffset);
+                root.querySelectorAll('[data-button-list="ckeditor5-toolbar-active-buttons"] li')[index + leftOffset].focus();
+                break;
+
+              case 'ArrowRight':
+                var rightOffset = dir === 'ltr' ? 1 : -1;
+                moveWithinSelectedButtons(selectedButtons, event.currentTarget, rightOffset);
+                root.querySelectorAll('[data-button-list="ckeditor5-toolbar-active-buttons"] li')[index + rightOffset].focus();
+                break;
+
+              case 'ArrowUp':
+                var _announceChange = function _announceChange(name) {
+                  Drupal.announce(Drupal.t('Button @name has been removed from the active toolbar.', {
+                    '@name': name
+                  }));
+                };
+
+                removeFromSelectedButtons(selectedButtons, event.currentTarget, _announceChange);
+
+                if (!dividerButtons.find(function (dividerButton) {
+                  return event.currentTarget.dataset.id === dividerButton.id;
+                })) {
+                  root.querySelector("[data-button-list=\"ckeditor5-toolbar-available-buttons\"] [data-id=\"".concat(event.currentTarget.dataset.id, "\"]")).focus();
+                }
+
+                break;
+            }
+          } else if (toolbarAvailableButtons.toArray().includes(event.currentTarget.dataset.id)) {
+            switch (event.key) {
+              case 'ArrowDown':
+                var _announceChange2 = function _announceChange2(name) {
+                  Drupal.announce(Drupal.t('Button @name has been moved to the active toolbar.', {
+                    '@name': name
+                  }));
+                };
+
+                addToSelectedButtons(selectedButtons, event.currentTarget, _announceChange2);
+                root.querySelector('[data-button-list="ckeditor5-toolbar-active-buttons"] li:last-child').focus();
+                break;
+            }
+          }
+        }
+      });
+    });
+  };
+
+  Drupal.behaviors.ckeditor5Admin = {
+    attach: function attach(context) {
+      once('ckeditor5-admin-toolbar', '#ckeditor5-toolbar-app').forEach(function (container) {
+        var selectedTextarea = context.querySelector('#ckeditor5-toolbar-buttons-selected');
+        var available = Object.entries(JSON.parse(context.querySelector('#ckeditor5-toolbar-buttons-available').innerHTML)).map(function (_ref) {
+          var _ref2 = _slicedToArray(_ref, 2),
+              name = _ref2[0],
+              attrs = _ref2[1];
+
+          return _objectSpread({
+            name: name,
+            id: name
+          }, attrs);
+        });
+        var dividers = [{
+          id: 'divider',
+          name: '|',
+          label: Drupal.t('Divider')
+        }, {
+          id: 'wrapping',
+          name: '-',
+          label: Drupal.t('Wrapping')
+        }];
+        var selected = new Observable(JSON.parse(selectedTextarea.innerHTML).map(function (name) {
+          return [].concat(dividers, _toConsumableArray(available)).find(function (button) {
+            return button.name === name;
+          }).id;
+        }));
+        selected.subscribe(function (selection) {
+          updateSelectedButtons(selection.map(function (id) {
+            return [].concat(dividers, _toConsumableArray(available)).find(function (button) {
+              return button.id === id;
+            }).name;
+          }), selectedTextarea);
+          render(container, selected, available, dividers);
+        });
+        [context.querySelector('#ckeditor5-toolbar-buttons-available'), context.querySelector('[class*="editor-settings-toolbar-items"]')].filter(function (el) {
+          return el;
+        }).forEach(function (el) {
+          el.classList.add('visually-hidden');
+        });
+        render(container, selected, available, dividers);
+      });
+      once('safari-focus-fix', document.querySelectorAll('.ckeditor5-toolbar-item')).forEach(function (item) {
+        item.addEventListener('keydown', function (e) {
+          var keyCodeDirections = {
+            9: 'tab',
+            37: 'left',
+            38: 'up',
+            39: 'right',
+            40: 'down'
+          };
+
+          if (['tab', 'left', 'up', 'right', 'down'].includes(keyCodeDirections[e.keyCode])) {
+            var hideTip = false;
+            var isActive = e.target.closest('[data-button-list="ckeditor5-toolbar-active__buttons"]');
+
+            if (isActive) {
+              if (['tab', 'left', 'up', 'right'].includes(keyCodeDirections[e.keyCode])) {
+                hideTip = true;
+              }
+            } else if (['tab', 'down'].includes(keyCodeDirections[e.keyCode])) {
+              hideTip = true;
+            }
+
+            if (hideTip) {
+              e.target.querySelector('[data-expanded]').setAttribute('data-expanded', 'false');
+            }
+          }
+        });
+      });
+
+      var updateUiStateStorage = function updateUiStateStorage(states) {
+        var form = document.querySelector('#filter-format-edit-form, #filter-format-add-form');
+        var currentStates = form.hasAttribute('data-drupal-ui-state') ? JSON.parse(form.getAttribute('data-drupal-ui-state')) : {};
+        form.setAttribute('data-drupal-ui-state', JSON.stringify(_objectSpread(_objectSpread({}, currentStates), states)));
+      };
+
+      var getUiStateStorage = function getUiStateStorage(property) {
+        var form = document.querySelector('#filter-format-edit-form, #filter-format-add-form');
+
+        if (form === null) {
+          return;
+        }
+
+        return form.hasAttribute('data-drupal-ui-state') ? JSON.parse(form.getAttribute('data-drupal-ui-state'))[property] : null;
+      };
+
+      once('ui-state-storage', document.querySelector('#filter-format-edit-form, #filter-format-add-form')).forEach(function (form) {
+        form.setAttribute('data-drupal-ui-state', JSON.stringify({}));
+      });
+
+      var maintainActiveVerticalTab = function maintainActiveVerticalTab(verticalTabs) {
+        var id = verticalTabs.id;
+        var activeTab = getUiStateStorage("".concat(id, "-active-tab"));
+
+        if (activeTab) {
+          setTimeout(function () {
+            document.querySelector(activeTab).click();
+          });
+        }
+
+        verticalTabs.querySelectorAll('.vertical-tabs__menu').forEach(function (tab) {
+          tab.addEventListener('click', function (e) {
+            var state = {};
+            var href = e.target.closest('[href]').getAttribute('href').split('--')[0];
+            state["".concat(id, "-active-tab")] = "#".concat(id, " [href^='").concat(href, "']");
+            updateUiStateStorage(state);
+          });
+        });
+      };
+
+      once('plugin-settings', document.querySelector('#plugin-settings-wrapper')).forEach(maintainActiveVerticalTab);
+      once('filter-settings', document.querySelector('#filter-settings-wrapper')).forEach(maintainActiveVerticalTab);
+      var selectedButtons = document.querySelector('#ckeditor5-toolbar-buttons-selected');
+      once('textarea-listener', selectedButtons).forEach(function (textarea) {
+        textarea.addEventListener('change', function (e) {
+          var buttonName = document.activeElement.getAttribute('data-id');
+
+          if (!buttonName) {
+            return;
+          }
+
+          var focusSelector = '';
+
+          if (['divider', 'wrapping'].includes(buttonName)) {
+            var oldConfig = JSON.parse(e.detail.priorValue);
+            var newConfig = JSON.parse(e.target.innerHTML);
+
+            if (oldConfig.length > newConfig.length) {
+              for (var item = 0; item < newConfig.length; item++) {
+                if (newConfig[item] !== oldConfig[item]) {
+                  focusSelector = "[data-button-list=\"ckeditor5-toolbar-active-buttons\"] li:nth-child(".concat(Math.min(item - 1, 0), ")");
+                  break;
+                }
+              }
+            } else if (oldConfig.length < newConfig.length) {
+              focusSelector = '[data-button-list="ckeditor5-toolbar-active-buttons"] li:last-child';
+            } else {
+              document.querySelectorAll("[data-button-list=\"ckeditor5-toolbar-active-buttons\"] [data-id='".concat(buttonName, "']")).forEach(function (divider, index) {
+                if (divider === document.activeElement) {
+                  focusSelector = "".concat(buttonName, "|").concat(index);
+                }
+              });
+            }
+          } else {
+            focusSelector = "[data-id='".concat(buttonName, "']");
+          }
+
+          updateUiStateStorage({
+            focusSelector: focusSelector
+          });
+        });
+        textarea.addEventListener('focus', function (e) {
+          var focusSelector = getUiStateStorage('focusSelector');
+
+          if (focusSelector) {
+            if (focusSelector.includes('|')) {
+              var _focusSelector$split = focusSelector.split('|'),
+                  _focusSelector$split2 = _slicedToArray(_focusSelector$split, 2),
+                  buttonName = _focusSelector$split2[0],
+                  count = _focusSelector$split2[1];
+
+              document.querySelectorAll("[data-button-list=\"ckeditor5-toolbar-active-buttons\"] [data-id='".concat(buttonName, "']")).forEach(function (item, index) {
+                if (index === parseInt(count, 10)) {
+                  item.focus();
+                }
+              });
+            } else {
+              var toFocus = document.querySelector(focusSelector);
+
+              if (toFocus) {
+                toFocus.focus();
+              }
+            }
+          }
+        });
+      });
+    }
+  };
+
+  Drupal.theme.ckeditor5SelectedButtons = function (_ref3) {
+    var buttons = _ref3.buttons;
+    return "\n      <ul class=\"ckeditor5-toolbar-tray ckeditor5-toolbar-active__buttons\" data-button-list=\"ckeditor5-toolbar-active-buttons\" role=\"listbox\" aria-orientation=\"horizontal\" aria-labelledby=\"ckeditor5-toolbar-active-buttons-label\">\n        ".concat(buttons.map(function (button) {
+      return Drupal.theme.ckeditor5Button({
+        button: button,
+        listType: 'active'
+      });
+    }).join(''), "\n      </ul>\n    ");
+  };
+
+  Drupal.theme.ckeditor5DividerButtons = function (_ref4) {
+    var buttons = _ref4.buttons;
+    return "\n      <ul class=\"ckeditor5-toolbar-tray ckeditor5-toolbar-divider__buttons\" data-button-list=\"ckeditor5-toolbar-divider-buttons\" role=\"listbox\" aria-orientation=\"horizontal\" aria-labelledby=\"ckeditor5-toolbar-divider-buttons-label\">\n        ".concat(buttons.map(function (button) {
+      return Drupal.theme.ckeditor5Button({
+        button: button,
+        listType: 'divider'
+      });
+    }).join(''), "\n      </ul>\n    ");
+  };
+
+  Drupal.theme.ckeditor5AvailableButtons = function (_ref5) {
+    var buttons = _ref5.buttons;
+    return "\n      <ul class=\"ckeditor5-toolbar-tray ckeditor5-toolbar-available__buttons\" data-button-list=\"ckeditor5-toolbar-available-buttons\" role=\"listbox\" aria-orientation=\"horizontal\" aria-labelledby=\"ckeditor5-toolbar-available-buttons-label\">\n        ".concat(buttons.map(function (button) {
+      return Drupal.theme.ckeditor5Button({
+        button: button,
+        listType: 'available'
+      });
+    }).join(''), "\n      </ul>\n    ");
+  };
+
+  Drupal.theme.ckeditor5Button = function (_ref6) {
+    var _ref6$button = _ref6.button,
+        label = _ref6$button.label,
+        id = _ref6$button.id,
+        listType = _ref6.listType;
+    var visuallyHiddenLabel = Drupal.t("@listType button @label", {
+      '@listType': listType !== 'divider' ? listType : 'available',
+      '@label': label
+    });
+    return "\n      <li class=\"ckeditor5-toolbar-item ckeditor5-toolbar-item-".concat(id, "\" role=\"option\" tabindex=\"0\" data-drupal-selector=\"ckeditor5-toolbar-button\" data-id=\"").concat(id, "\" data-label=\"").concat(label, "\" data-divider=\"").concat(listType === 'divider', "\">\n        <span class=\"ckeditor5-toolbar-button ckeditor5-toolbar-button-").concat(id, "\">\n          <span class=\"visually-hidden\">").concat(visuallyHiddenLabel, ")}</span>\n        </span>\n        <span class=\"ckeditor5-toolbar-tooltip\" aria-hidden=\"true\">").concat(label, "</span>\n      </li>\n    ");
+  };
+
+  Drupal.theme.ckeditor5Admin = function (_ref7) {
+    var availableButtons = _ref7.availableButtons,
+        dividerButtons = _ref7.dividerButtons,
+        activeToolbar = _ref7.activeToolbar,
+        helpMessage = _ref7.helpMessage;
+    return "\n    <div aria-live=\"polite\" data-drupal-selector=\"ckeditor5-admin-help-message\">\n      <p>".concat(helpMessage.join('</p><p>'), "</p>\n    </div>\n    <div class=\"ckeditor5-toolbar-disabled\">\n      <div class=\"ckeditor5-toolbar-available\">\n        <label id=\"ckeditor5-toolbar-available-buttons-label\">").concat(Drupal.t('Available buttons'), "</label>\n        ").concat(availableButtons, "\n      </div>\n      <div class=\"ckeditor5-toolbar-divider\">\n        <label id=\"ckeditor5-toolbar-divider-buttons-label\">").concat(Drupal.t('Button divider'), "</label>\n        ").concat(dividerButtons, "\n      </div>\n    </div>\n    <div class=\"ckeditor5-toolbar-active\">\n      <label id=\"ckeditor5-toolbar-active-buttons-label\">").concat(Drupal.t('Active toolbar'), "</label>\n      ").concat(activeToolbar, "\n    </div>\n    ");
+  };
+
+  var originalFilterStatusAttach = Drupal.behaviors.filterStatus.attach;
+
+  Drupal.behaviors.filterStatus.attach = function (context, settings) {
+    $(context).find('#filters-status-wrapper input.form-checkbox').removeOnce('filter-status').off('click.filterUpdate');
+    originalFilterStatusAttach(context, settings);
+  };
+
+  Drupal.behaviors.tabErrorsVisible = {
+    attach: function attach(context) {
+      context.querySelectorAll('details .form-item .error').forEach(function (item) {
+        var details = item.closest('details');
+
+        if (details.style.display === 'none') {
+          var tabSelect = document.querySelector("[href='#".concat(details.id, "']"));
+
+          if (tabSelect) {
+            tabSelect.click();
+          }
+        }
+      });
+    }
+  };
+
+  var Observable = function () {
+    function Observable(value) {
+      _classCallCheck(this, Observable);
+
+      this._listeners = [];
+      this._value = value;
+    }
+
+    _createClass(Observable, [{
+      key: "notify",
+      value: function notify() {
+        var _this = this;
+
+        this._listeners.forEach(function (listener) {
+          return listener(_this._value);
+        });
+      }
+    }, {
+      key: "subscribe",
+      value: function subscribe(listener) {
+        this._listeners.push(listener);
+      }
+    }, {
+      key: "value",
+      get: function get() {
+        return this._value;
+      },
+      set: function set(val) {
+        if (val !== this._value) {
+          this._value = val;
+          this.notify();
+        }
+      }
+    }]);
+
+    return Observable;
+  }();
+})(Drupal, drupalSettings, jQuery, JSON, once, Sortable);
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/ckeditor5.es6.js b/core/modules/ckeditor5/js/ckeditor5.es6.js
new file mode 100644
index 0000000000..16387de2f2
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5.es6.js
@@ -0,0 +1,526 @@
+/**
+ * @file
+ * CKEditor 5 implementation of {@link Drupal.editors} API.
+ */
+/* global CKEditor5 */
+(function (Drupal, debounce, CKEditor5, $) {
+  /**
+   * The CKEDITOR instances.
+   *
+   * @type {Map}
+   */
+  Drupal.CKEditor5Instances = new Map();
+
+  /**
+   * The callback functions.
+   *
+   * @type {Map}
+   */
+  const callbacks = new Map();
+
+  /**
+   * List of element ids with the required attribute.
+   *
+   * @type {Set}
+   */
+  const required = new Set();
+
+  function findFunc(scope, name) {
+    if (!scope) {
+      return null;
+    }
+    const parts = name.includes('.') ? name.split('.') : name;
+
+    if (parts.length > 1) {
+      return findFunc(scope[parts.shift()], parts);
+    }
+    return typeof scope[parts[0]] === 'function' ? scope[parts[0]] : null;
+  }
+
+  function buildFunc(config) {
+    const { func } = config;
+    // Assuming a global object.
+    const fn = findFunc(window, func.name);
+    if (typeof fn === 'function') {
+      const result = func.invoke ? fn(...func.args) : fn;
+      return result;
+    }
+    return null;
+  }
+
+  /**
+   * Converts a string representing regexp to a RegExp object.
+   *
+   * @param {Object} config
+   * @param {string} config.pattern
+   *   The regexp pattern that is used to create the RegExp object.
+   *
+   * @returns {RegExp}
+   */
+  function buildRegexp(config) {
+    const { pattern } = config.regexp;
+
+    const main = pattern.match(/\/(.+)\/.*/)[1];
+    const options = pattern.match(/\/.+\/(.*)/)[1];
+
+    return new RegExp(main, options);
+  }
+
+  function processConfig(config) {
+    /**
+     * Processes an array in config.
+     *
+     * @param {*} config
+     * @returns {*}
+     */
+    function processArray(config) {
+      return config.map((item) => {
+        if (typeof item === 'object') {
+          return processConfig(item);
+        }
+
+        return item;
+      });
+    }
+
+    return Object.entries(config).reduce((processed, [key, value]) => {
+      if (typeof value === 'object') {
+        if (value.hasOwnProperty('func')) {
+          processed[key] = buildFunc(value);
+        } else if (value.hasOwnProperty('regexp')) {
+          processed[key] = buildRegexp(value);
+        } else if (Array.isArray(value)) {
+          processed[key] = processArray(value);
+        } else {
+          processed[key] = processConfig(value);
+        }
+      } else {
+        processed[key] = value;
+      }
+
+      return processed;
+    }, {});
+  }
+
+  /**
+   * Set an id to a data-attribute for registering this element instance.
+   *
+   * @param element
+   *
+   * @return {string}
+   *   The id to use for this element.
+   */
+  const setElementId = (element) => {
+    const id = Math.random().toString().slice(2, 9);
+    element.setAttribute('data-ckeditor5-id', id);
+
+    return id;
+  };
+
+  /**
+   * Return a unique selector for the element.
+   *
+   * @param {HTMLElement} element
+   *
+   * @return {string}
+   *   The id to use for this element.
+   */
+  const getElementId = (element) => element.getAttribute('data-ckeditor5-id');
+
+  /**
+   * Select CKEditor5 plugin classes to include.
+   *
+   * Found in the CKEditor5 global js object as {package.Class}.
+   *
+   * @param {Array} plugins
+   *  List of package and Class name of plugins
+   *
+   * @return {Array}
+   *   List of JavaScript Classes to add in the extraPlugins property of config.
+   */
+  function selectPlugins(plugins) {
+    return plugins.map((pluginDefinition) => {
+      const [build, name] = pluginDefinition.split('.');
+      if (CKEditor5[build] && CKEditor5[build][name]) {
+        return CKEditor5[build][name];
+      }
+
+      console.warn(`Failed to load ${build} - ${name}`);
+      return null;
+    });
+  }
+
+  /**
+   * Adds CSS to ensure proper styling of CKEditor 5 inside off-canvas dialogs.
+   *
+   * @param {HTMLElement} element
+   *   The element the editor is attached to.
+   */
+  const offCanvasCss = (element) => {
+    element.parentNode.setAttribute('data-drupal-ck-style-fence', true);
+
+    // Only proceed if the styles haven't been added yet.
+    if (!document.querySelector('#ckeditor5-off-canvas-reset')) {
+      const prefix = `#drupal-off-canvas [data-drupal-ck-style-fence]`;
+      let existingCss = '';
+
+      // Find every existing style that doesn't come from off-canvas resets and
+      // copy them to new styles with a prefix targeting CKEditor inside an
+      // off-canvas dialog.
+      [...document.styleSheets].forEach((sheet) => {
+        if (
+          !sheet.href ||
+          (sheet.href && sheet.href.indexOf('off-canvas') === -1)
+        ) {
+          // This is wrapped in a try/catch as Chromium browsers will fail if
+          // the stylesheet was provided via a CORS request.
+          // @see https://bugs.chromium.org/p/chromium/issues/detail?id=775525
+          try {
+            const rules = sheet.cssRules;
+            [...rules].forEach((rule) => {
+              let { cssText } = rule;
+              const selector = rule.cssText.split('{')[0];
+
+              // Prefix all selectors added after a comma.
+              cssText = cssText.replace(
+                selector,
+                selector.replace(/,/g, `, ${prefix}`),
+              );
+
+              // When adding to existingCss, prefix the first selector as well.
+              existingCss += `${prefix} ${cssText}`;
+            });
+          } catch (e) {
+            console.warn(
+              `Stylesheet ${sheet.href} not included in CKEditor reset due to the browser's CORS policy.`,
+            );
+          }
+        }
+      });
+
+      // Additional styles that need to be explicity added in addition to the
+      // prefixed versions of existing css in `existingCss`.
+      const addedCss = [
+        `${prefix} .ck.ck-content {display:block;min-height:5rem;}`,
+        `${prefix} .ck.ck-content * {display:initial;background:initial;color:initial;padding:initial;}`,
+        `${prefix} .ck.ck-content li {display:list-item}`,
+        `${prefix} .ck.ck-content ol li {list-style-type: decimal}`,
+        `${prefix} .ck[contenteditable], ${prefix} .ck[contenteditable] * {-webkit-user-modify: read-write;-moz-user-modify: read-write;}`,
+      ];
+
+      // Styles to ensure block elements are displayed as such inside
+      // off-canvas dialogs. These are all element types that are styled with
+      // ` all: initial;` in the off-canvas reset that should default to being
+      // displayed as blocks within CKEditor.
+      // @see core/misc/dialog/off-canvas.reset.pcss.css
+      const blockSelectors = [
+        'h1',
+        'h2',
+        'h3',
+        'h4',
+        'h5',
+        'h6',
+        'p',
+        'ol',
+        'ul',
+        'address',
+        'article',
+        'aside',
+        'blockquote',
+        'body',
+        'dd',
+        'div',
+        'dl',
+        'dt',
+        'fieldset',
+        'figcaption',
+        'figure',
+        'footer',
+        'form',
+        'header',
+        'hgroup',
+        'hr',
+        'html',
+        'legend',
+        'main',
+        'menu',
+        'pre',
+        'section',
+        'xmp',
+      ]
+        .map((blockElement) => `${prefix} .ck.ck-content ${blockElement}`)
+        .join(', \n');
+      const blockCss = `${blockSelectors} { display: block; }`;
+
+      const prefixedCss = [...addedCss, existingCss, blockCss].join('\n');
+
+      // Create a new style tag with the prefixed styles added above.
+      const offCanvasCss = document.createElement('style');
+      offCanvasCss.innerHTML = prefixedCss;
+      offCanvasCss.setAttribute('id', 'ckeditor5-off-canvas-reset');
+      document.body.appendChild(offCanvasCss);
+    }
+  };
+
+  /**
+   * @namespace
+   */
+  Drupal.editors.ckeditor5 = {
+    /**
+     * Editor attach callback.
+     *
+     * @param {HTMLElement} element
+     *   The element to attach the editor to.
+     * @param {string} format
+     *   The text format for the editor.
+     */
+    attach(element, format) {
+      const { editorClassic } = CKEditor5;
+      const {
+        toolbar,
+        plugins,
+        config: pluginConfig,
+        language,
+      } = format.editorSettings;
+      const extraPlugins = selectPlugins(plugins);
+
+      const config = {
+        extraPlugins,
+        toolbar,
+        language,
+        ...processConfig(pluginConfig),
+      };
+      // Set the id immediately so that it is available when onChange is called.
+      const id = setElementId(element);
+      const { ClassicEditor } = editorClassic;
+
+      ClassicEditor.create(element, config)
+        .then((editor) => {
+          // Save a reference to the initialized instance.
+          Drupal.CKEditor5Instances.set(id, editor);
+
+          // CKEditor4 had a feature to remove the required attribute
+          // see: https://www.drupal.org/project/drupal/issues/1954968
+          if (element.hasAttribute('required')) {
+            required.add(id);
+            element.removeAttribute('required');
+          }
+
+          editor.model.document.on('change:data', () => {
+            const callback = callbacks.get(id);
+            if (callback) {
+              // Marks the field as changed.
+              // @see Drupal.editorAttach
+              callback();
+            }
+          });
+
+          const isOffCanvas = element.closest('#drupal-off-canvas');
+
+          if (isOffCanvas) {
+            offCanvasCss(element);
+          }
+        })
+        .catch((error) => {
+          console.error(error);
+        });
+    },
+
+    /**
+     * Editor detach callback.
+     *
+     * @param {HTMLElement} element
+     *   The element to detach the editor from.
+     * @param {string} format
+     *   The text format used for the editor.
+     * @param {string} trigger
+     *   The event trigger for the detach.
+     */
+    detach(element, format, trigger) {
+      const id = getElementId(element);
+      const editor = Drupal.CKEditor5Instances.get(id);
+      if (!editor) {
+        return;
+      }
+      if (trigger === 'serialize') {
+        editor.updateSourceElement();
+      } else {
+        element.removeAttribute('contentEditable');
+
+        // Prepare variables that will be used when discarding Quickedit changes.
+        let textElement = null;
+        let originalValue = null;
+        const usingQuickEdit = (((Drupal || {}).quickedit || {}).editors || {})
+          .editor;
+        if (usingQuickEdit) {
+          // The revert() function in QuickEdit's text editor does not work with
+          // CKEditor 5, as it is triggered before CKEditor 5 is fully
+          // destroyed. This function is overridden so the functionality it
+          // provides can happen after the CKEditor destroy() promise is
+          // fulfilled.
+          // This pulls the necessary values from the QuickEdit Backbone Model
+          // before it is destroyed, so they can be used by
+          // `editor.destroy().then()` to perform the expected revert.
+          Drupal.quickedit.editors.editor.prototype.revert = function () {
+            textElement = this.$textElement[0];
+            originalValue = this.model.get('originalValue');
+          };
+        }
+
+        editor
+          .destroy()
+          .then(() => {
+            // If textElement and originalValue are not null, a QuickEdit
+            // revert has been requested. Perform the revert here as it
+            // can't happen until the CKEditor instance is destroyed.
+            if (textElement && originalValue) {
+              textElement.innerHTML = originalValue;
+            }
+
+            // Clean up stored references.
+            Drupal.CKEditor5Instances.delete(id);
+            callbacks.delete(id);
+            if (required.has(id)) {
+              element.setAttribute('required', 'required');
+              required.delete(id);
+            }
+          })
+          .catch((error) => {
+            console.error(error);
+          });
+      }
+    },
+
+    /**
+     * Registers a callback which CKEditor5 will call on change:data event.
+     *
+     * @param {HTMLElement} element
+     *   The element where the change occurred.
+     * @param {function} callback
+     *   Callback called with the value of the editor.
+     */
+    onChange(element, callback) {
+      callbacks.set(getElementId(element), debounce(callback, 400));
+    },
+
+    /**
+     * Attaches an inline editor to a DOM element.
+     *
+     * @param {HTMLElement} element
+     *   The element to attach the editor to.
+     * @param {object} format
+     *   The text format used in the editor.
+     * @param {string} [mainToolbarId]
+     *   The id attribute for the main editor toolbar, if any.
+     * @param {string} [floatedToolbarId]
+     *   The id attribute for the floated editor toolbar, if any.
+     *
+     * @see Drupal.quickedit.editors.editor
+     */
+    attachInlineEditor(element, format, mainToolbarId, floatedToolbarId) {
+      const { editorDecoupled } = CKEditor5;
+      const {
+        toolbar,
+        plugins,
+        config: pluginConfig,
+        language,
+      } = format.editorSettings;
+      const extraPlugins = selectPlugins(plugins);
+      const config = {
+        extraPlugins,
+        toolbar,
+        language,
+        ...processConfig(pluginConfig),
+      };
+      const id = setElementId(element);
+      const { DecoupledEditor } = editorDecoupled;
+
+      DecoupledEditor.create(element, config)
+        .then((editor) => {
+          Drupal.CKEditor5Instances.set(id, editor);
+          const toolbar = document.getElementById(mainToolbarId);
+          toolbar.appendChild(editor.ui.view.toolbar.element);
+          editor.model.document.on('change:data', () => {
+            const callback = callbacks.get(id);
+            if (callback) {
+              // Quick Edit requires the current data to update EditorModel.
+              // @see Drupal.quickedit.editors.editor
+              callback(editor.getData());
+            }
+          });
+        })
+        .catch((error) => {
+          console.error(error);
+        });
+    },
+  };
+
+  Drupal.ckeditor5 = {
+    /**
+     * Variable storing the current dialog's save callback.
+     *
+     * @type {?function}
+     */
+    saveCallback: null,
+
+    openDialog(url, saveCallback, dialogSettings) {
+      // Add a consistent dialog class.
+      const classes = dialogSettings.dialogClass
+        ? dialogSettings.dialogClass.split(' ')
+        : [];
+      classes.push('ui-dialog--narrow');
+      dialogSettings.dialogClass = classes.join(' ');
+      dialogSettings.autoResize =
+        window.matchMedia('(min-width: 600px)').matches;
+      dialogSettings.width = 'auto';
+
+      const $content = $(
+        `<div class="ckeditor5-dialog-loading"><span style="top: -40px;" class="ckeditor5-dialog-loading-link">${Drupal.t(
+          'Loading...',
+        )}</span></div>`,
+      );
+      $content.appendTo($('body'));
+
+      const ckeditorAjaxDialog = Drupal.ajax({
+        dialog: dialogSettings,
+        dialogType: 'modal',
+        selector: '.ckeditor5-dialog-loading-link',
+        url,
+        progress: { type: 'throbber' },
+        submit: {
+          editor_object: {},
+        },
+      });
+      ckeditorAjaxDialog.execute();
+
+      // After a short delay, show "Loading…" message.
+      window.setTimeout(() => {
+        $content.find('span').animate({ top: '0px' });
+      }, 1000);
+
+      // Store the save callback to be executed when this dialog is closed.
+      Drupal.ckeditor5.saveCallback = saveCallback;
+    },
+  };
+
+  // Respond to new dialogs that are opened by CKEditor, closing the AJAX loader.
+  $(window).on('dialog:beforecreate', (e, dialog, $element, settings) => {
+    $('.ckeditor5-dialog-loading').animate({ top: '-40px' }, function () {
+      $(this).remove();
+    });
+  });
+
+  // Respond to dialogs that are saved, sending data back to CKEditor.
+  $(window).on('editor:dialogsave', (e, values) => {
+    if (Drupal.ckeditor5.saveCallback) {
+      Drupal.ckeditor5.saveCallback(values);
+    }
+  });
+
+  // Respond to dialogs that are closed, removing the current save handler.
+  $(window).on('dialog:afterclose', (e, dialog, $element) => {
+    if (Drupal.ckeditor5.saveCallback) {
+      Drupal.ckeditor5.saveCallback = null;
+    }
+  });
+})(Drupal, Drupal.debounce, CKEditor5, jQuery);
diff --git a/core/modules/ckeditor5/js/ckeditor5.filter.admin.es6.js b/core/modules/ckeditor5/js/ckeditor5.filter.admin.es6.js
new file mode 100644
index 0000000000..13785dc527
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5.filter.admin.es6.js
@@ -0,0 +1,154 @@
+/**
+ * @file
+ * Provides Text Editor UI improvements specific to CKEditor 5.
+ */
+
+(function (Drupal, once) {
+  Drupal.behaviors.allowedTagsListener = {
+    attach: function attach(context) {
+      once(
+        'allowed-tags-listener',
+        context.querySelector(
+          '[data-drupal-selector="edit-filters-filter-html-settings-allowed-html"]',
+        ),
+      ).forEach((textarea) => {
+        const editorSelect = document.querySelector(
+          '[data-drupal-selector="edit-editor-editor"]',
+        );
+        const filterCheckbox = document.querySelector(
+          '[data-drupal-selector="edit-filters-filter-html-status"]',
+        );
+        const formSubmit = document.querySelector(
+          '[data-drupal-selector="edit-actions-submit"]',
+        );
+        const wrapper = textarea.closest('div');
+
+        const resetChanges = () => {
+          const updateButtonContainer = document.querySelector(
+            '[data-ckeditor5-allowed-tags-info]',
+          );
+          if (updateButtonContainer) {
+            updateButtonContainer.remove();
+          }
+
+          const allowedTagsDisabledHelp = document.querySelector(
+            '[data-ckeditor5-allowed-tags-disabled-help]',
+          );
+          if (allowedTagsDisabledHelp) {
+            allowedTagsDisabledHelp.remove();
+          }
+
+          formSubmit.removeAttribute('disabled');
+          wrapper.classList.remove('ckeditor5-filter-attention');
+        };
+
+        resetChanges();
+
+        const addAllowedTagsUpdateButton = () => {
+          resetChanges();
+
+          if (
+            editorSelect.value === 'ckeditor5' &&
+            filterCheckbox &&
+            filterCheckbox.checked
+          ) {
+            if (!textarea.hasAttribute('readonly')) {
+              wrapper.classList.add('ckeditor5-filter-attention');
+
+              const container = document.createElement('div');
+              container.setAttribute('data-ckeditor5-allowed-tags-info', true);
+              const description = document.createElement('p');
+
+              description.innerText = Drupal.t(
+                'Switching to CKEditor 5 requires, at minimum, the tags "<p> <br>". After switching to CKEditor 5, this field will be read only, and will be updated based on which CKEditor 5 plugins are enabled. When switching to CKEditor 5 from an existing text format with content, we recommend documenting what tags are in use and then enabling the CKEditor 5 tags that support them.',
+              );
+
+              const updateButton = document.createElement('button');
+              updateButton.setAttribute(
+                'name',
+                'update-ckeditor5-allowed-tags',
+              );
+              updateButton.innerText = Drupal.t(
+                'Apply changes to allowed tags.',
+              );
+              updateButton.addEventListener('click', () => {
+                editorSelect.dispatchEvent(new CustomEvent('change'));
+                setTimeout(() => {
+                  resetChanges();
+                });
+              });
+
+              container.appendChild(description);
+              container.appendChild(updateButton);
+
+              wrapper.appendChild(container);
+
+              // In this very specific use case, submitting the filter form must
+              // be prevented.
+              // - CKEditor 5 is the selected editor, but it's not yet accepted
+              //   by the form because it's not passing the validation restraint
+              //   requiring CKEditor 5 compatible "Allowed Tags". This validator,
+              //   by necessity fires before CKEditor 5 is registered with the
+              //   form.
+              // - The registering of an editor with the form typically occurs
+              //   when a change
+              formSubmit.setAttribute('disabled', true);
+              const formSubmitHelp = document.createElement('p');
+              formSubmitHelp.setAttribute(
+                'data-ckeditor5-allowed-tags-disabled-help',
+                true,
+              );
+              formSubmitHelp.textContent = Drupal.t(
+                'This form is not submittable when the editor is set to CKEditor 5 unless the "Limit allowed HTML tags and correct faulty HTML" filter\'s "Allowed HTML tags" field includes the tags required by CKEDitor 5',
+              );
+              formSubmit.parentNode.append(formSubmitHelp);
+            }
+          }
+        };
+        editorSelect.addEventListener('change', addAllowedTagsUpdateButton);
+        filterCheckbox.addEventListener('change', addAllowedTagsUpdateButton);
+      });
+    },
+  };
+
+  // Copy the function that is about to be overridden so it can be invoked
+  // inside the override.
+  const originalAjaxEventResponse = Drupal.Ajax.prototype.eventResponse;
+
+  /**
+   * Overrides Ajax.eventResponse with CKEditor 5 specific customizations.
+   *
+   * This is the handler for events that will ultimately trigger an AJAX
+   * response. It is overridden here to provide additional logic to prevent
+   * specific CKEditor 5-related events from triggering that AJAX response
+   * unless certain criteria are met.
+   */
+  Drupal.Ajax.prototype.eventResponse = function (...args) {
+    // There are AJAX callbacks that should only be triggered if the editor
+    // <select> is set to 'ckeditor5'. They should be active when the text
+    // format is using CKEditor 5 and when a user is attempting to switch to
+    // CKEditor 5 but is prevented from doing so by validation. Triggering these
+    // AJAX callback when trying to switch to CKEditor 5 but blocked by
+    // validation benefits the user as they get real time feedback as they
+    // configure the text format to be CKEditor 5 compatible. This spares them
+    // from having to submit the form multiple times in order to determine if
+    // their settings are compatible.
+    // This validation stage is also why the AJAX callbacks can't be
+    // conditionally added server side, as validation errors interrupt the form
+    // rebuild before the AJAX callbacks could be added via form_alter.
+    if (this.ckeditor5_only) {
+      // The ckeditor5_only property is added to form elements that should only
+      // trigger AJAX callbacks when the editor <select> value is 'ckeditor5'.
+      // These callbacks provide real-time validation that should be present for
+      // both text formats using CKEditor 5 and text formats in the process of
+      // switching to CKEditor 5, but prevented from doing so by validation.
+      if (
+        this.$form[0].querySelector('#edit-editor-editor').value !== 'ckeditor5'
+      ) {
+        return;
+      }
+    }
+
+    originalAjaxEventResponse.apply(this, args);
+  };
+})(Drupal, once);
diff --git a/core/modules/ckeditor5/js/ckeditor5.filter.admin.js b/core/modules/ckeditor5/js/ckeditor5.filter.admin.js
new file mode 100644
index 0000000000..6e880b97f0
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5.filter.admin.js
@@ -0,0 +1,87 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function (Drupal, once) {
+  Drupal.behaviors.allowedTagsListener = {
+    attach: function attach(context) {
+      once('allowed-tags-listener', context.querySelector('[data-drupal-selector="edit-filters-filter-html-settings-allowed-html"]')).forEach(function (textarea) {
+        var editorSelect = document.querySelector('[data-drupal-selector="edit-editor-editor"]');
+        var filterCheckbox = document.querySelector('[data-drupal-selector="edit-filters-filter-html-status"]');
+        var formSubmit = document.querySelector('[data-drupal-selector="edit-actions-submit"]');
+        var wrapper = textarea.closest('div');
+
+        var resetChanges = function resetChanges() {
+          var updateButtonContainer = document.querySelector('[data-ckeditor5-allowed-tags-info]');
+
+          if (updateButtonContainer) {
+            updateButtonContainer.remove();
+          }
+
+          var allowedTagsDisabledHelp = document.querySelector('[data-ckeditor5-allowed-tags-disabled-help]');
+
+          if (allowedTagsDisabledHelp) {
+            allowedTagsDisabledHelp.remove();
+          }
+
+          formSubmit.removeAttribute('disabled');
+          wrapper.classList.remove('ckeditor5-filter-attention');
+        };
+
+        resetChanges();
+
+        var addAllowedTagsUpdateButton = function addAllowedTagsUpdateButton() {
+          resetChanges();
+
+          if (editorSelect.value === 'ckeditor5' && filterCheckbox && filterCheckbox.checked) {
+            if (!textarea.hasAttribute('readonly')) {
+              wrapper.classList.add('ckeditor5-filter-attention');
+              var container = document.createElement('div');
+              container.setAttribute('data-ckeditor5-allowed-tags-info', true);
+              var description = document.createElement('p');
+              description.innerText = Drupal.t('Switching to CKEditor 5 requires, at minimum, the tags "<p> <br>". After switching to CKEditor 5, this field will be read only, and will be updated based on which CKEditor 5 plugins are enabled. When switching to CKEditor 5 from an existing text format with content, we recommend documenting what tags are in use and then enabling the CKEditor 5 tags that support them.');
+              var updateButton = document.createElement('button');
+              updateButton.setAttribute('name', 'update-ckeditor5-allowed-tags');
+              updateButton.innerText = Drupal.t('Apply changes to allowed tags.');
+              updateButton.addEventListener('click', function () {
+                editorSelect.dispatchEvent(new CustomEvent('change'));
+                setTimeout(function () {
+                  resetChanges();
+                });
+              });
+              container.appendChild(description);
+              container.appendChild(updateButton);
+              wrapper.appendChild(container);
+              formSubmit.setAttribute('disabled', true);
+              var formSubmitHelp = document.createElement('p');
+              formSubmitHelp.setAttribute('data-ckeditor5-allowed-tags-disabled-help', true);
+              formSubmitHelp.textContent = Drupal.t('This form is not submittable when the editor is set to CKEditor 5 unless the "Limit allowed HTML tags and correct faulty HTML" filter\'s "Allowed HTML tags" field includes the tags required by CKEDitor 5');
+              formSubmit.parentNode.append(formSubmitHelp);
+            }
+          }
+        };
+
+        editorSelect.addEventListener('change', addAllowedTagsUpdateButton);
+        filterCheckbox.addEventListener('change', addAllowedTagsUpdateButton);
+      });
+    }
+  };
+  var originalAjaxEventResponse = Drupal.Ajax.prototype.eventResponse;
+
+  Drupal.Ajax.prototype.eventResponse = function () {
+    if (this.ckeditor5_only) {
+      if (this.$form[0].querySelector('#edit-editor-editor').value !== 'ckeditor5') {
+        return;
+      }
+    }
+
+    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+
+    originalAjaxEventResponse.apply(this, args);
+  };
+})(Drupal, once);
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/ckeditor5.js b/core/modules/ckeditor5/js/ckeditor5.js
new file mode 100644
index 0000000000..4ad188019d
--- /dev/null
+++ b/core/modules/ckeditor5/js/ckeditor5.js
@@ -0,0 +1,341 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
+
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
+
+function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
+
+function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+
+function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
+
+function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
+
+function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+(function (Drupal, debounce, CKEditor5, $) {
+  Drupal.CKEditor5Instances = new Map();
+  var callbacks = new Map();
+  var required = new Set();
+
+  function findFunc(scope, name) {
+    if (!scope) {
+      return null;
+    }
+
+    var parts = name.includes('.') ? name.split('.') : name;
+
+    if (parts.length > 1) {
+      return findFunc(scope[parts.shift()], parts);
+    }
+
+    return typeof scope[parts[0]] === 'function' ? scope[parts[0]] : null;
+  }
+
+  function buildFunc(config) {
+    var func = config.func;
+    var fn = findFunc(window, func.name);
+
+    if (typeof fn === 'function') {
+      var result = func.invoke ? fn.apply(void 0, _toConsumableArray(func.args)) : fn;
+      return result;
+    }
+
+    return null;
+  }
+
+  function buildRegexp(config) {
+    var pattern = config.regexp.pattern;
+    var main = pattern.match(/\/(.+)\/.*/)[1];
+    var options = pattern.match(/\/.+\/(.*)/)[1];
+    return new RegExp(main, options);
+  }
+
+  function processConfig(config) {
+    function processArray(config) {
+      return config.map(function (item) {
+        if (_typeof(item) === 'object') {
+          return processConfig(item);
+        }
+
+        return item;
+      });
+    }
+
+    return Object.entries(config).reduce(function (processed, _ref) {
+      var _ref2 = _slicedToArray(_ref, 2),
+          key = _ref2[0],
+          value = _ref2[1];
+
+      if (_typeof(value) === 'object') {
+        if (value.hasOwnProperty('func')) {
+          processed[key] = buildFunc(value);
+        } else if (value.hasOwnProperty('regexp')) {
+          processed[key] = buildRegexp(value);
+        } else if (Array.isArray(value)) {
+          processed[key] = processArray(value);
+        } else {
+          processed[key] = processConfig(value);
+        }
+      } else {
+        processed[key] = value;
+      }
+
+      return processed;
+    }, {});
+  }
+
+  var setElementId = function setElementId(element) {
+    var id = Math.random().toString().slice(2, 9);
+    element.setAttribute('data-ckeditor5-id', id);
+    return id;
+  };
+
+  var getElementId = function getElementId(element) {
+    return element.getAttribute('data-ckeditor5-id');
+  };
+
+  function selectPlugins(plugins) {
+    return plugins.map(function (pluginDefinition) {
+      var _pluginDefinition$spl = pluginDefinition.split('.'),
+          _pluginDefinition$spl2 = _slicedToArray(_pluginDefinition$spl, 2),
+          build = _pluginDefinition$spl2[0],
+          name = _pluginDefinition$spl2[1];
+
+      if (CKEditor5[build] && CKEditor5[build][name]) {
+        return CKEditor5[build][name];
+      }
+
+      console.warn("Failed to load ".concat(build, " - ").concat(name));
+      return null;
+    });
+  }
+
+  var offCanvasCss = function offCanvasCss(element) {
+    element.parentNode.setAttribute('data-drupal-ck-style-fence', true);
+
+    if (!document.querySelector('#ckeditor5-off-canvas-reset')) {
+      var prefix = "#drupal-off-canvas [data-drupal-ck-style-fence]";
+      var existingCss = '';
+
+      _toConsumableArray(document.styleSheets).forEach(function (sheet) {
+        if (!sheet.href || sheet.href && sheet.href.indexOf('off-canvas') === -1) {
+          try {
+            var rules = sheet.cssRules;
+
+            _toConsumableArray(rules).forEach(function (rule) {
+              var cssText = rule.cssText;
+              var selector = rule.cssText.split('{')[0];
+              cssText = cssText.replace(selector, selector.replace(/,/g, ", ".concat(prefix)));
+              existingCss += "".concat(prefix, " ").concat(cssText);
+            });
+          } catch (e) {
+            console.warn("Stylesheet ".concat(sheet.href, " not included in CKEditor reset due to the browser's CORS policy."));
+          }
+        }
+      });
+
+      var addedCss = ["".concat(prefix, " .ck.ck-content {display:block;min-height:5rem;}"), "".concat(prefix, " .ck.ck-content * {display:initial;background:initial;color:initial;padding:initial;}"), "".concat(prefix, " .ck.ck-content li {display:list-item}"), "".concat(prefix, " .ck.ck-content ol li {list-style-type: decimal}"), "".concat(prefix, " .ck[contenteditable], ").concat(prefix, " .ck[contenteditable] * {-webkit-user-modify: read-write;-moz-user-modify: read-write;}")];
+      var blockSelectors = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'ol', 'ul', 'address', 'article', 'aside', 'blockquote', 'body', 'dd', 'div', 'dl', 'dt', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'header', 'hgroup', 'hr', 'html', 'legend', 'main', 'menu', 'pre', 'section', 'xmp'].map(function (blockElement) {
+        return "".concat(prefix, " .ck.ck-content ").concat(blockElement);
+      }).join(', \n');
+      var blockCss = "".concat(blockSelectors, " { display: block; }");
+      var prefixedCss = [].concat(addedCss, [existingCss, blockCss]).join('\n');
+
+      var _offCanvasCss = document.createElement('style');
+
+      _offCanvasCss.innerHTML = prefixedCss;
+
+      _offCanvasCss.setAttribute('id', 'ckeditor5-off-canvas-reset');
+
+      document.body.appendChild(_offCanvasCss);
+    }
+  };
+
+  Drupal.editors.ckeditor5 = {
+    attach: function attach(element, format) {
+      var editorClassic = CKEditor5.editorClassic;
+      var _format$editorSetting = format.editorSettings,
+          toolbar = _format$editorSetting.toolbar,
+          plugins = _format$editorSetting.plugins,
+          pluginConfig = _format$editorSetting.config,
+          language = _format$editorSetting.language;
+      var extraPlugins = selectPlugins(plugins);
+
+      var config = _objectSpread({
+        extraPlugins: extraPlugins,
+        toolbar: toolbar,
+        language: language
+      }, processConfig(pluginConfig));
+
+      var id = setElementId(element);
+      var ClassicEditor = editorClassic.ClassicEditor;
+      ClassicEditor.create(element, config).then(function (editor) {
+        Drupal.CKEditor5Instances.set(id, editor);
+
+        if (element.hasAttribute('required')) {
+          required.add(id);
+          element.removeAttribute('required');
+        }
+
+        editor.model.document.on('change:data', function () {
+          var callback = callbacks.get(id);
+
+          if (callback) {
+            callback();
+          }
+        });
+        var isOffCanvas = element.closest('#drupal-off-canvas');
+
+        if (isOffCanvas) {
+          offCanvasCss(element);
+        }
+      }).catch(function (error) {
+        console.error(error);
+      });
+    },
+    detach: function detach(element, format, trigger) {
+      var id = getElementId(element);
+      var editor = Drupal.CKEditor5Instances.get(id);
+
+      if (!editor) {
+        return;
+      }
+
+      if (trigger === 'serialize') {
+        editor.updateSourceElement();
+      } else {
+        element.removeAttribute('contentEditable');
+        var textElement = null;
+        var originalValue = null;
+        var usingQuickEdit = (((Drupal || {}).quickedit || {}).editors || {}).editor;
+
+        if (usingQuickEdit) {
+          Drupal.quickedit.editors.editor.prototype.revert = function () {
+            textElement = this.$textElement[0];
+            originalValue = this.model.get('originalValue');
+          };
+        }
+
+        editor.destroy().then(function () {
+          if (textElement && originalValue) {
+            textElement.innerHTML = originalValue;
+          }
+
+          Drupal.CKEditor5Instances.delete(id);
+          callbacks.delete(id);
+
+          if (required.has(id)) {
+            element.setAttribute('required', 'required');
+            required.delete(id);
+          }
+        }).catch(function (error) {
+          console.error(error);
+        });
+      }
+    },
+    onChange: function onChange(element, callback) {
+      callbacks.set(getElementId(element), debounce(callback, 400));
+    },
+    attachInlineEditor: function attachInlineEditor(element, format, mainToolbarId, floatedToolbarId) {
+      var editorDecoupled = CKEditor5.editorDecoupled;
+      var _format$editorSetting2 = format.editorSettings,
+          toolbar = _format$editorSetting2.toolbar,
+          plugins = _format$editorSetting2.plugins,
+          pluginConfig = _format$editorSetting2.config,
+          language = _format$editorSetting2.language;
+      var extraPlugins = selectPlugins(plugins);
+
+      var config = _objectSpread({
+        extraPlugins: extraPlugins,
+        toolbar: toolbar,
+        language: language
+      }, processConfig(pluginConfig));
+
+      var id = setElementId(element);
+      var DecoupledEditor = editorDecoupled.DecoupledEditor;
+      DecoupledEditor.create(element, config).then(function (editor) {
+        Drupal.CKEditor5Instances.set(id, editor);
+        var toolbar = document.getElementById(mainToolbarId);
+        toolbar.appendChild(editor.ui.view.toolbar.element);
+        editor.model.document.on('change:data', function () {
+          var callback = callbacks.get(id);
+
+          if (callback) {
+            callback(editor.getData());
+          }
+        });
+      }).catch(function (error) {
+        console.error(error);
+      });
+    }
+  };
+  Drupal.ckeditor5 = {
+    saveCallback: null,
+    openDialog: function openDialog(url, saveCallback, dialogSettings) {
+      var classes = dialogSettings.dialogClass ? dialogSettings.dialogClass.split(' ') : [];
+      classes.push('ui-dialog--narrow');
+      dialogSettings.dialogClass = classes.join(' ');
+      dialogSettings.autoResize = window.matchMedia('(min-width: 600px)').matches;
+      dialogSettings.width = 'auto';
+      var $content = $("<div class=\"ckeditor5-dialog-loading\"><span style=\"top: -40px;\" class=\"ckeditor5-dialog-loading-link\">".concat(Drupal.t('Loading...'), "</span></div>"));
+      $content.appendTo($('body'));
+      var ckeditorAjaxDialog = Drupal.ajax({
+        dialog: dialogSettings,
+        dialogType: 'modal',
+        selector: '.ckeditor5-dialog-loading-link',
+        url: url,
+        progress: {
+          type: 'throbber'
+        },
+        submit: {
+          editor_object: {}
+        }
+      });
+      ckeditorAjaxDialog.execute();
+      window.setTimeout(function () {
+        $content.find('span').animate({
+          top: '0px'
+        });
+      }, 1000);
+      Drupal.ckeditor5.saveCallback = saveCallback;
+    }
+  };
+  $(window).on('dialog:beforecreate', function (e, dialog, $element, settings) {
+    $('.ckeditor5-dialog-loading').animate({
+      top: '-40px'
+    }, function () {
+      $(this).remove();
+    });
+  });
+  $(window).on('editor:dialogsave', function (e, values) {
+    if (Drupal.ckeditor5.saveCallback) {
+      Drupal.ckeditor5.saveCallback(values);
+    }
+  });
+  $(window).on('dialog:afterclose', function (e, dialog, $element) {
+    if (Drupal.ckeditor5.saveCallback) {
+      Drupal.ckeditor5.saveCallback = null;
+    }
+  });
+})(Drupal, Drupal.debounce, CKEditor5, jQuery);
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/ie11.filter.warnings.es6.js b/core/modules/ckeditor5/js/ie11.filter.warnings.es6.js
new file mode 100644
index 0000000000..b8e56f827e
--- /dev/null
+++ b/core/modules/ckeditor5/js/ie11.filter.warnings.es6.js
@@ -0,0 +1,131 @@
+/**
+ * @file
+ * Provides IE11 compatibility warnings when choosing a text editor.
+ */
+
+(function (Drupal, once, Modernizr) {
+  /**
+   * Presents a warning when selecting CKEditor 5 as a text format's text editor.
+   *
+   * @type {Drupal~behavior}
+   */
+  Drupal.behaviors.ckEditor5warn = {
+    attach: function attach() {
+      const isIE11 = Modernizr.mq(
+        '(-ms-high-contrast: active), (-ms-high-contrast: none)',
+      );
+      const editorSelect = once(
+        'editor-select',
+        document.querySelector(
+          '#filter-format-edit-form #edit-editor-editor, #filter-format-add-form #edit-editor-editor',
+        ),
+      );
+
+      if (typeof editorSelect[0] !== 'undefined') {
+        const select = editorSelect[0];
+
+        // Add a container for messages above the text format select element.
+        const selectMessageContainer = document.createElement('div');
+        select.parentNode.insertBefore(selectMessageContainer, select);
+        const selectMessages = new Drupal.Message(selectMessageContainer);
+        const editorSettings = document.querySelector(
+          '#editor-settings-wrapper',
+        );
+
+        /**
+         * Adds an IE11 compatibility warning to the message container.
+         */
+        const ck5Warning = function () {
+          selectMessages.add(
+            Drupal.t(
+              'CKEditor 5 is not compatible with Internet Explorer 11. Text fields using CKEditor 5 will still be editable but without the benefits of CKEditor.',
+            ),
+            {
+              type: 'warning',
+            },
+          );
+          if (isIE11) {
+            // https://www.drupal.org/docs/system-requirements/browser-requirements
+            selectMessages.add(
+              Drupal.t(
+                'Text editor toolbar settings are not available. They will be available in any <a href="@supported-browsers">supported browser</a> other than Internet Explorer',
+                {
+                  '@supported-browsers':
+                    'https://www.drupal.org/docs/system-requirements/browser-requirements',
+                },
+              ),
+              {
+                type: 'error',
+              },
+            );
+            editorSettings.hidden = true;
+          }
+        };
+
+        /**
+         * Adds a warning if the selected editor is ckeditor5, otherwise clears
+         * the message container.
+         */
+        const updateWarningStatus = function () {
+          if (
+            select.value === 'ckeditor5' &&
+            !select.classList.contains('error')
+          ) {
+            ck5Warning();
+          } else {
+            editorSettings.hidden = false;
+            selectMessages.clear();
+          }
+        };
+
+        const selectChangeHandler = function () {
+          // Declare the observer first so the observer callback can access it.
+          let editorSelectObserver = null;
+
+          /**
+           * MutationObserver callback for the editor select.
+           *
+           * This listens for the removal 'disabled' attribute on the <select>,
+           * which means the AJAX callback has completed and the form is in a
+           * state suitable for seeing if the IE11 warning is needed.
+           *
+           * @param mutations
+           *   The element's mutations.
+           */
+          function whenSelectAttributeChanges(mutations) {
+            for (let i = 0; i < mutations.length; i++) {
+              // When the select input is no longer disabled, the AJAX request
+              // is complete and the UI is in a state where it can be determined
+              // if the IE11 warning is needed.
+              if (
+                mutations[i].type === 'attributes' &&
+                mutations[i].attributeName === 'disabled' &&
+                !select.disabled
+              ) {
+                updateWarningStatus();
+                editorSelectObserver.disconnect();
+              }
+            }
+          }
+
+          // An observer is used because during the select change event, it is
+          // not yet known if validation prevented the switch to CKEditor 5.
+          // The IE11 warning should only appear if the switch wasn't prevented
+          // by validation.
+          editorSelectObserver = new MutationObserver(
+            whenSelectAttributeChanges,
+          );
+          editorSelectObserver.observe(select, {
+            attributes: true,
+            attributeOldValue: true,
+          });
+        };
+
+        updateWarningStatus();
+
+        // Listen to text format selection changes.
+        select.addEventListener('change', selectChangeHandler);
+      }
+    },
+  };
+})(Drupal, once, Modernizr);
diff --git a/core/modules/ckeditor5/js/ie11.filter.warnings.js b/core/modules/ckeditor5/js/ie11.filter.warnings.js
new file mode 100644
index 0000000000..2afbf8b6a7
--- /dev/null
+++ b/core/modules/ckeditor5/js/ie11.filter.warnings.js
@@ -0,0 +1,69 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function (Drupal, once, Modernizr) {
+  Drupal.behaviors.ckEditor5warn = {
+    attach: function attach() {
+      var isIE11 = Modernizr.mq('(-ms-high-contrast: active), (-ms-high-contrast: none)');
+      var editorSelect = once('editor-select', document.querySelector('#filter-format-edit-form #edit-editor-editor, #filter-format-add-form #edit-editor-editor'));
+
+      if (typeof editorSelect[0] !== 'undefined') {
+        var select = editorSelect[0];
+        var selectMessageContainer = document.createElement('div');
+        select.parentNode.insertBefore(selectMessageContainer, select);
+        var selectMessages = new Drupal.Message(selectMessageContainer);
+        var editorSettings = document.querySelector('#editor-settings-wrapper');
+
+        var ck5Warning = function ck5Warning() {
+          selectMessages.add(Drupal.t('CKEditor 5 is not compatible with Internet Explorer 11. Text fields using CKEditor 5 will still be editable but without the benefits of CKEditor.'), {
+            type: 'warning'
+          });
+
+          if (isIE11) {
+            selectMessages.add(Drupal.t('Text editor toolbar settings are not available. They will be available in any <a href="@supported-browsers">supported browser</a> other than Internet Explorer', {
+              '@supported-browsers': 'https://www.drupal.org/docs/system-requirements/browser-requirements'
+            }), {
+              type: 'error'
+            });
+            editorSettings.hidden = true;
+          }
+        };
+
+        var updateWarningStatus = function updateWarningStatus() {
+          if (select.value === 'ckeditor5' && !select.classList.contains('error')) {
+            ck5Warning();
+          } else {
+            editorSettings.hidden = false;
+            selectMessages.clear();
+          }
+        };
+
+        var selectChangeHandler = function selectChangeHandler() {
+          var editorSelectObserver = null;
+
+          function whenSelectAttributeChanges(mutations) {
+            for (var i = 0; i < mutations.length; i++) {
+              if (mutations[i].type === 'attributes' && mutations[i].attributeName === 'disabled' && !select.disabled) {
+                updateWarningStatus();
+                editorSelectObserver.disconnect();
+              }
+            }
+          }
+
+          editorSelectObserver = new MutationObserver(whenSelectAttributeChanges);
+          editorSelectObserver.observe(select, {
+            attributes: true,
+            attributeOldValue: true
+          });
+        };
+
+        updateWarningStatus();
+        select.addEventListener('change', selectChangeHandler);
+      }
+    }
+  };
+})(Drupal, once, Modernizr);
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/ie11.user.warnings.es6.js b/core/modules/ckeditor5/js/ie11.user.warnings.es6.js
new file mode 100644
index 0000000000..32ad3c8e9c
--- /dev/null
+++ b/core/modules/ckeditor5/js/ie11.user.warnings.es6.js
@@ -0,0 +1,134 @@
+/**
+ * @file
+ * Provide warnings when attempting to load CKEditor 5 on IE11.
+ */
+
+(function (Drupal, Modernizr) {
+  const isIE11 = Modernizr.mq(
+    '(-ms-high-contrast: active), (-ms-high-contrast: none)',
+  );
+
+  // If the browser is IE11, create an alternate version of
+  // Drupal.editors.ckeditor5 that provides warnings. In IE11, the incompatible
+  // Javascript of CKEditor 5 prevents Drupal.editors.ckeditor5 from being
+  // created. Features such as Quick Edit that require the presence of a
+  // Drupal.editors.ckeditor5, even for fields that do not use CKEditor 5.
+  if (isIE11) {
+    // This will reference a MutationObserver used by several functions in
+    // Drupal.editors.ckeditor5. It is declared here and not the editor object
+    // in order to work with IE11 object scope.
+    let quickEditLabelObserver = null;
+
+    /**
+     * @namespace
+     */
+    Drupal.editors.ckeditor5 = {
+      /**
+       * Provides a warning when trying to attach CKEditor 5 to a field in IE11.
+       *
+       * @param {HTMLElement} element
+       *   The element the editor would have been attached to.
+       */
+      attach: function attach(element) {
+        // Add a Drupal.Message container above the textarea and use it to
+        // provide a warning message to IE11 users.
+        const editorMessageContainer = document.createElement('div');
+        element.parentNode.insertBefore(editorMessageContainer, element);
+        const editorMessages = new Drupal.Message(editorMessageContainer);
+        editorMessages.add(
+          Drupal.t(
+            'Internet Explorer 11 user: a rich text editor is available for this field when used with any other supported browser.',
+          ),
+          {
+            type: 'warning',
+          },
+        );
+      },
+
+      /**
+       * Editor detach callback.
+       */
+      detach: function detach() {
+        const quickEditToolbar = document.querySelector(
+          '#quickedit-entity-toolbar .quickedit-toolbar',
+        );
+        if (quickEditToolbar) {
+          // Remove classes that style the Quick Edit toolbar as a warning.
+          quickEditToolbar.classList.remove('ck5-ie11');
+          quickEditToolbar.classList.add('icon-pencil');
+
+          // Disconnect the observer from the Quick Edit label that converts the
+          // label to a warning. A warning isn't needed for fields not using
+          // CKEditor 5.
+          quickEditLabelObserver.disconnect();
+        }
+      },
+
+      /**
+       * Registers a callback which CKEditor 5 will call on change:data event.
+       */
+      onChange: function onChange(element, callback) {
+        // Intentionally empty.
+      },
+
+      /**
+       * Provides a warning when Quick Edit tries to attach CKEditor 5 in IE11.
+       *
+       * @param {HTMLElement} element
+       *   The element the editor would have been attached to.
+       *
+       * @see Drupal.quickedit.editors.editor
+       */
+      attachInlineEditor: function attachInlineEditor(element) {
+        const quickEditToolbar = document.querySelector(
+          '#quickedit-entity-toolbar .quickedit-toolbar',
+        );
+
+        const notEditableAlert = Drupal.t('Field Not Editable');
+        const notEditableMessage = Drupal.t(
+          'CKEditor 5 is not compatible with IE11.',
+        );
+
+        /**
+         * Changes the Quick Edit label to a warning.
+         */
+        function quickEditLabelWarnIE11(toolbarLabel) {
+          // Disconnect the observer to prevent infinite recursion.
+          quickEditLabelObserver.disconnect();
+
+          // Change the quickEdit toolbar label to a warning that informs
+          // IE11 users that they can't edit the field due to CKEditor not
+          // working with IE11.
+          toolbarLabel.innerHTML = `<div><b>${notEditableAlert}</b><div>${notEditableMessage}</div></div>`;
+          quickEditLabelObserver.observe(toolbarLabel, { childList: true });
+        }
+
+        if (quickEditToolbar) {
+          quickEditToolbar.classList.add('ck5-ie11');
+          quickEditToolbar.classList.remove('icon-pencil');
+          element.classList.add('ck5-ie11');
+
+          // Prepare variables that will be used for changing the QuickEdit
+          // toolbar label to a warning.
+          const toolbarLabel = quickEditToolbar.querySelector(
+            '.quickedit-toolbar-label',
+          );
+
+          // Updating the Quick Edit label to display as a warning is triggered
+          // via an observer. An observer us used as there are multiple
+          // Quick Edit Backbone View events that alter the contents of this
+          // label. An observer is used to guarantee the warning persists
+          // without having to override multiple Backbone event handlers.
+          quickEditLabelObserver = new MutationObserver((mutations) => {
+            for (let i = 0; i < mutations.length; i++) {
+              if (mutations[i].type === 'childList') {
+                quickEditLabelWarnIE11(toolbarLabel);
+              }
+            }
+          });
+          quickEditLabelObserver.observe(toolbarLabel, { childList: true });
+        }
+      },
+    };
+  }
+})(Drupal, Modernizr);
diff --git a/core/modules/ckeditor5/js/ie11.user.warnings.js b/core/modules/ckeditor5/js/ie11.user.warnings.js
new file mode 100644
index 0000000000..23b227f6f2
--- /dev/null
+++ b/core/modules/ckeditor5/js/ie11.user.warnings.js
@@ -0,0 +1,64 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function (Drupal, Modernizr) {
+  var isIE11 = Modernizr.mq('(-ms-high-contrast: active), (-ms-high-contrast: none)');
+
+  if (isIE11) {
+    var quickEditLabelObserver = null;
+    Drupal.editors.ckeditor5 = {
+      attach: function attach(element) {
+        var editorMessageContainer = document.createElement('div');
+        element.parentNode.insertBefore(editorMessageContainer, element);
+        var editorMessages = new Drupal.Message(editorMessageContainer);
+        editorMessages.add(Drupal.t('Internet Explorer 11 user: a rich text editor is available for this field when used with any other supported browser.'), {
+          type: 'warning'
+        });
+      },
+      detach: function detach() {
+        var quickEditToolbar = document.querySelector('#quickedit-entity-toolbar .quickedit-toolbar');
+
+        if (quickEditToolbar) {
+          quickEditToolbar.classList.remove('ck5-ie11');
+          quickEditToolbar.classList.add('icon-pencil');
+          quickEditLabelObserver.disconnect();
+        }
+      },
+      onChange: function onChange(element, callback) {},
+      attachInlineEditor: function attachInlineEditor(element) {
+        var quickEditToolbar = document.querySelector('#quickedit-entity-toolbar .quickedit-toolbar');
+        var notEditableAlert = Drupal.t('Field Not Editable');
+        var notEditableMessage = Drupal.t('CKEditor 5 is not compatible with IE11.');
+
+        function quickEditLabelWarnIE11(toolbarLabel) {
+          quickEditLabelObserver.disconnect();
+          toolbarLabel.innerHTML = "<div><b>".concat(notEditableAlert, "</b><div>").concat(notEditableMessage, "</div></div>");
+          quickEditLabelObserver.observe(toolbarLabel, {
+            childList: true
+          });
+        }
+
+        if (quickEditToolbar) {
+          quickEditToolbar.classList.add('ck5-ie11');
+          quickEditToolbar.classList.remove('icon-pencil');
+          element.classList.add('ck5-ie11');
+          var toolbarLabel = quickEditToolbar.querySelector('.quickedit-toolbar-label');
+          quickEditLabelObserver = new MutationObserver(function (mutations) {
+            for (var i = 0; i < mutations.length; i++) {
+              if (mutations[i].type === 'childList') {
+                quickEditLabelWarnIE11(toolbarLabel);
+              }
+            }
+          });
+          quickEditLabelObserver.observe(toolbarLabel, {
+            childList: true
+          });
+        }
+      }
+    };
+  }
+})(Drupal, Modernizr);
\ No newline at end of file
diff --git a/core/modules/ckeditor5/js/media_embed_ckeditor5.theme.es6.js b/core/modules/ckeditor5/js/media_embed_ckeditor5.theme.es6.js
new file mode 100644
index 0000000000..ee9dbbef7b
--- /dev/null
+++ b/core/modules/ckeditor5/js/media_embed_ckeditor5.theme.es6.js
@@ -0,0 +1,19 @@
+/**
+ * @file
+ * Theme elements for the Media Embed CKEditor5 plugin.
+ */
+
+((Drupal) => {
+  /**
+   * Themes the error displayed when the media embed preview fails.
+   *
+   * @return {string}
+   *   A string representing a DOM fragment.
+   *
+   * @see media-embed-error.html.twig
+   */
+  Drupal.theme.mediaEmbedPreviewError = () =>
+    `<div>${Drupal.t(
+      'An error occurred while trying to preview the media. Please save your work and reload this page.',
+    )}</div>`;
+})(Drupal);
diff --git a/core/modules/ckeditor5/js/media_embed_ckeditor5.theme.js b/core/modules/ckeditor5/js/media_embed_ckeditor5.theme.js
new file mode 100644
index 0000000000..90d0db9545
--- /dev/null
+++ b/core/modules/ckeditor5/js/media_embed_ckeditor5.theme.js
@@ -0,0 +1,12 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function (Drupal) {
+  Drupal.theme.mediaEmbedPreviewError = function () {
+    return "<div>".concat(Drupal.t('An error occurred while trying to preview the media. Please save your work and reload this page.'), "</div>");
+  };
+})(Drupal);
\ No newline at end of file
diff --git a/core/modules/ckeditor5/modules/ckeditor5_dev/README.md b/core/modules/ckeditor5/modules/ckeditor5_dev/README.md
new file mode 100644
index 0000000000..9138620f6b
--- /dev/null
+++ b/core/modules/ckeditor5/modules/ckeditor5_dev/README.md
@@ -0,0 +1,20 @@
+CKEditor 5 Dev
+--------------
+
+This module adds the CKEditor5Inspector to any instances
+of CKEditor 5 in Drupal.
+
+It should **not be enabled** in production!
+
+* Documentation: https://ckeditor.com/docs/ckeditor5/latest/framework/guides/development-tools.html
+* Source code: https://github.com/ckeditor/ckeditor5-inspector
+
+Additionally the editor instances are added to `window`
+so that you may more easily call methods or check properties.
+
+For example, to get the current dataDowncast that will be saved to the field:
+`window['edit-field-FIELD_ID-value'].getData()`
+
+If you're not sure what this field id is, check the "Editor Instance" dropdown
+in the Inspector pane. There may be multiple instances on a page, such as a in
+a content type with multiple `textarea` fields.
diff --git a/core/modules/ckeditor5/modules/ckeditor5_dev/ckeditor5_dev.info.yml b/core/modules/ckeditor5/modules/ckeditor5_dev/ckeditor5_dev.info.yml
new file mode 100644
index 0000000000..92a1a2898f
--- /dev/null
+++ b/core/modules/ckeditor5/modules/ckeditor5_dev/ckeditor5_dev.info.yml
@@ -0,0 +1,8 @@
+name: CKEditor 5 Dev tools
+type: module
+description: "Enables the CKEditor 5 Inspector and provides testing helpers."
+version: VERSION
+package: Core (Experimental)
+lifecycle: experimental
+dependencies:
+  - ckeditor5:ckeditor5
diff --git a/core/modules/ckeditor5/modules/ckeditor5_dev/ckeditor5_dev.libraries.yml b/core/modules/ckeditor5/modules/ckeditor5_dev/ckeditor5_dev.libraries.yml
new file mode 100644
index 0000000000..d1fca5dce4
--- /dev/null
+++ b/core/modules/ckeditor5/modules/ckeditor5_dev/ckeditor5_dev.libraries.yml
@@ -0,0 +1,12 @@
+ckeditor5_dev:
+  js:
+    # The CKEditor 5 inspector does not need to be woven into Drupal's
+    # CKEditor 5 build. It is effectively standalone, and the inspector
+    # constructor receives an initialized CKEditor instance.
+    #
+    # @see https://github.com/ckeditor/ckeditor5-inspector
+    https://unpkg.com/@ckeditor/ckeditor5-inspector/build/inspector.js: { external: true, minified: true }
+    js/ckeditor5_dev.js: {}
+  dependencies:
+    - core/drupal
+    - core/once
diff --git a/core/modules/ckeditor5/modules/ckeditor5_dev/ckeditor5_dev.module b/core/modules/ckeditor5/modules/ckeditor5_dev/ckeditor5_dev.module
new file mode 100644
index 0000000000..c608b16c53
--- /dev/null
+++ b/core/modules/ckeditor5/modules/ckeditor5_dev/ckeditor5_dev.module
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Implements hooks for the CKEditor 5 Dev tools module.
+ */
+
+use Drupal\Core\Routing\RouteMatchInterface;
+
+/**
+ * Implements hook_help().
+ */
+function ckeditor5_dev_help($route_name, RouteMatchInterface $route_match) {
+  switch ($route_name) {
+    case 'help.page.ckeditor5_dev':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The CKEditor 5 Dev tools module attaches <code>CKEditor5Inspector</code> to any instances of CKEditor 5 on the page. For more information, see the <a href=":doc_url">online documentation for the CKEditor 5 Dev tools module</a>.', [':doc_url' => 'https://www.drupal.org/docs/contributed-modules/ckeditor-5/development-tools']) . '</p>';
+      $output .= '<p>' . t('This module should <em>not be enabled</em> in production!') . '</p>';
+      $output .= '<h3>' . t('Usage') . '</h3>';
+      $output .= '<p>' . t('After enabling the module, navigate to a page where CKEditor 5 is active, the inspector will appear in a pane at the bottom of your browser.') . '</p>';
+      $output .= '<p>' . t('For more information about <code>CKEditor5Inspector</code>, see the <a href=":documentation">documentation</a>.', [':documentation' => 'https://ckeditor.com/docs/ckeditor5/latest/framework/guides/development-tools.html']) . '</p>';
+      $output .= '<p>' . t('Additionally, the CKEditor 5 instance is added to <code>window</code> by its <code>id</code> so that you may easily access properties and methods') . '</p>';
+
+      return $output;
+  }
+
+}
+
+/**
+ * Implements hook_library_info_alter().
+ */
+function ckeditor5_dev_library_info_alter(&$libraries, $extension) {
+  if ($extension === 'ckeditor5' && isset($libraries['drupal.ckeditor5'])) {
+    $libraries['drupal.ckeditor5']['dependencies'][] = 'ckeditor5_dev/ckeditor5_dev';
+  }
+}
diff --git a/core/modules/ckeditor5/modules/ckeditor5_dev/js/ckeditor5_dev.es6.js b/core/modules/ckeditor5/modules/ckeditor5_dev/js/ckeditor5_dev.es6.js
new file mode 100644
index 0000000000..d131cf0f62
--- /dev/null
+++ b/core/modules/ckeditor5/modules/ckeditor5_dev/js/ckeditor5_dev.es6.js
@@ -0,0 +1,34 @@
+(function (Drupal, once) {
+  Drupal.behaviors.CKEditor5Inspector = {
+    /**
+     * Facilitates adding and removing inspectors.
+     */
+    attach() {
+      // This is added in a Drupal behavior so it can be applied after the
+      // Drupal.CKEditor5Instances Map() is initialized without having to change
+      // loading weights.
+      once('ckeditor5-inspector', 'body').forEach(() => {
+        // Get the current set and delete functions from
+        // Drupal.CKEditor5Instances so they can be called in their overrides.
+        const oldSet = Drupal.CKEditor5Instances.set;
+        const oldDelete = Drupal.CKEditor5Instances.delete;
+
+        // Override set() so an inspector is added when it is called, then the
+        // default functionality is invoked.
+        Drupal.CKEditor5Instances.set = function (...args) {
+          const [id, editor] = args;
+          CKEditorInspector.attach({ [id]: editor });
+          return oldSet.apply(Drupal.CKEditor5Instances, args);
+        };
+
+        // Override delete() so an inspector is detached when it is called,
+        // then the default functionality is invoked.
+        Drupal.CKEditor5Instances.delete = function (...args) {
+          const [id] = args;
+          CKEditorInspector.detach(id);
+          return oldDelete.apply(Drupal.CKEditor5Instances, args);
+        };
+      });
+    },
+  };
+})(Drupal, once);
diff --git a/core/modules/ckeditor5/modules/ckeditor5_dev/js/ckeditor5_dev.js b/core/modules/ckeditor5/modules/ckeditor5_dev/js/ckeditor5_dev.js
new file mode 100644
index 0000000000..d86baa3251
--- /dev/null
+++ b/core/modules/ckeditor5/modules/ckeditor5_dev/js/ckeditor5_dev.js
@@ -0,0 +1,40 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+(function (Drupal, once) {
+  Drupal.behaviors.CKEditor5Inspector = {
+    attach: function attach() {
+      once('ckeditor5-inspector', 'body').forEach(function () {
+        var oldSet = Drupal.CKEditor5Instances.set;
+        var oldDelete = Drupal.CKEditor5Instances.delete;
+
+        Drupal.CKEditor5Instances.set = function () {
+          for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+            args[_key] = arguments[_key];
+          }
+
+          var id = args[0],
+              editor = args[1];
+          CKEditorInspector.attach(_defineProperty({}, id, editor));
+          return oldSet.apply(Drupal.CKEditor5Instances, args);
+        };
+
+        Drupal.CKEditor5Instances.delete = function () {
+          for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+            args[_key2] = arguments[_key2];
+          }
+
+          var id = args[0];
+          CKEditorInspector.detach(id);
+          return oldDelete.apply(Drupal.CKEditor5Instances, args);
+        };
+      });
+    }
+  };
+})(Drupal, once);
\ No newline at end of file
diff --git a/core/modules/ckeditor5/src/Annotation/CKEditor5AspectsOfCKEditor5Plugin.php b/core/modules/ckeditor5/src/Annotation/CKEditor5AspectsOfCKEditor5Plugin.php
new file mode 100644
index 0000000000..af71c00e64
--- /dev/null
+++ b/core/modules/ckeditor5/src/Annotation/CKEditor5AspectsOfCKEditor5Plugin.php
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Annotation;
+
+use Drupal\Component\Annotation\Plugin;
+
+/**
+ * Defines the "CKEditor 5 aspects of a CKEditor5Plugin" annotation object.
+ *
+ * Plugin Namespace: Plugin\CKEditor5Plugin.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditorPluginInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditorPluginBase
+ * @see \Drupal\ckeditor5\Plugin\CKEditorPluginManager
+ * @see plugin_api
+ *
+ * @Annotation
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5Plugin
+ * @see \Drupal\ckeditor5\Annotation\DrupalPartsOfCKEditor5Plugin
+ */
+class CKEditor5AspectsOfCKEditor5Plugin extends Plugin {
+
+  /**
+   * The CKEditor5 plugin classes provided.
+   *
+   * Found in the CKEditor5 global js object as {package.Class}.
+   *
+   * @var string[]
+   */
+  public $plugins;
+
+  /**
+   * A keyed array of additional values for the CKEditor5 constructor config.
+   *
+   * @var array[] optional
+   */
+  public $config = [];
+
+}
diff --git a/core/modules/ckeditor5/src/Annotation/CKEditor5Plugin.php b/core/modules/ckeditor5/src/Annotation/CKEditor5Plugin.php
new file mode 100644
index 0000000000..5c6b876f05
--- /dev/null
+++ b/core/modules/ckeditor5/src/Annotation/CKEditor5Plugin.php
@@ -0,0 +1,88 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Annotation;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\Component\Annotation\Plugin;
+
+/**
+ * Defines a CKEditor5Plugin annotation object.
+ *
+ * Plugin Namespace: Plugin\CKEditor5Plugin.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface
+ * @see plugin_api
+ *
+ * @Annotation
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin
+ * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin
+ */
+class CKEditor5Plugin extends Plugin {
+
+  /**
+   * The plugin ID.
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * The CKEditor 5 aspects of the plugin definition.
+   *
+   * @var \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin
+   */
+  public $ckeditor5;
+
+  /**
+   * The Drupal aspects of the plugin definition.
+   *
+   * @var \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin
+   */
+  public $drupal;
+
+  /**
+   * {@inheritdoc}
+   *
+   * Overridden for compatibility with the AnnotationBridgeDecorator, which
+   * ensures YAML-defined CKEditor 5 plugin definitions are also processed by
+   * annotations. Unfortunately it does not (yet) support nested annotations.
+   * Force YAML-defined plugin definitions to be parsed by the
+   * annotations, to ensure consistent handling of defaults.
+   *
+   * @see \Drupal\Component\Annotation\Plugin\Discovery\AnnotationBridgeDecorator::getDefinitions()
+   */
+  public function __construct($values) {
+    if (isset($values['ckeditor5']) && is_array($values['ckeditor5'])) {
+      $values['ckeditor5'] = new CKEditor5AspectsOfCKEditor5Plugin($values['ckeditor5']);
+    }
+    if (isset($values['drupal']) && is_array($values['drupal'])) {
+      $values['drupal'] = new DrupalAspectsOfCKEditor5Plugin($values['drupal']);
+    }
+    parent::__construct($values);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getClass() {
+    return $this->definition['drupal']['class'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setClass($class) {
+    $this->definition['drupal']['class'] = $class;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function get(): CKEditor5PluginDefinition {
+    return new CKEditor5PluginDefinition($this->definition);
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Annotation/DrupalAspectsOfCKEditor5Plugin.php b/core/modules/ckeditor5/src/Annotation/DrupalAspectsOfCKEditor5Plugin.php
new file mode 100644
index 0000000000..f9e354574e
--- /dev/null
+++ b/core/modules/ckeditor5/src/Annotation/DrupalAspectsOfCKEditor5Plugin.php
@@ -0,0 +1,90 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Annotation;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\Component\Annotation\Plugin;
+
+/**
+ * Defines the "Drupal aspects of a CKEditor5Plugin" annotation object.
+ *
+ * Plugin Namespace: Plugin\CKEditor5Plugin.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditorPluginInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditorPluginBase
+ * @see \Drupal\ckeditor5\Plugin\CKEditorPluginManager
+ * @see plugin_api
+ *
+ * @Annotation
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5Plugin
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin
+ */
+class DrupalAspectsOfCKEditor5Plugin extends Plugin {
+
+  /**
+   * The human-readable name of the CKEditor plugin.
+   *
+   * @var \Drupal\Core\Annotation\Translation
+   * @ingroup plugin_translatable
+   */
+  public $label;
+
+  /**
+   * The CKEditor 5 plugin class.
+   *
+   * If not specified, the CKEditor5PluginDefault class is used.
+   *
+   * @var string optional
+   */
+  public $class = CKEditor5PluginDefault::class;
+
+  /**
+   * The library this plugin requires.
+   *
+   * @var string|false optional
+   */
+  public $library = FALSE;
+
+  /**
+   * The admin library this plugin provides.
+   *
+   * @var string|false optional
+   */
+  public $admin_library = FALSE;
+
+  /**
+   * List of elements and attributes provided.
+   *
+   * An array of strings, or false if no elements are provided.
+   *
+   * Syntax for each array value:
+   * - <element> only allows that HTML element with no attributes
+   * - <element attrA attrB> only allows that HTML element with attributes attrA
+   *   and attrB, and any value for those attributes.
+   * - <element attrA="foo bar baz" attrB="qux-*"> only allows that HTML element
+   *   with attributes attrA (if attrA contains one of the three listed values)
+   *   and attrB (if its value has the provided prefix).
+   * - <element data-*> only allows that HTML element with any attribute that
+   *   has the given prefix.
+   *
+   * @var string[]|false
+   */
+  public $elements;
+
+  /**
+   * List of toolbar items the plugin provides.
+   *
+   * @var array[] optional
+   */
+  public $toolbar_items = [];
+
+  /**
+   * List of conditions to enable this plugin.
+   *
+   * @var array|false optional
+   */
+  public $conditions = FALSE;
+
+}
diff --git a/core/modules/ckeditor5/src/Controller/CKEditor5ImageController.php b/core/modules/ckeditor5/src/Controller/CKEditor5ImageController.php
new file mode 100644
index 0000000000..01e927edf4
--- /dev/null
+++ b/core/modules/ckeditor5/src/Controller/CKEditor5ImageController.php
@@ -0,0 +1,286 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Controller;
+
+use Drupal\Component\Utility\Bytes;
+use Drupal\Component\Utility\Crypt;
+use Drupal\Component\Utility\Environment;
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Entity\Plugin\DataType\EntityAdapter;
+use Drupal\Core\File\Event\FileUploadSanitizeNameEvent;
+use Drupal\Core\File\Exception\FileException;
+use Drupal\Core\File\FileSystemInterface;
+use Drupal\Core\Lock\LockBackendInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\editor\Entity\Editor;
+use Drupal\Core\Validation\DrupalTranslator;
+use Drupal\file\Entity\File;
+use Drupal\file\FileInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Exception\HttpException;
+use Symfony\Component\Mime\MimeTypeGuesserInterface;
+use Symfony\Component\Validator\ConstraintViolation;
+use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
+
+/**
+ * Returns response for CKEditor5 Simple image upload adapter.
+ */
+class CKEditor5ImageController extends ControllerBase {
+
+  /**
+   * The file system service.
+   *
+   * @var \Drupal\Core\File\FileSystem
+   */
+  protected $fileSystem;
+
+  /**
+   * The currently authenticated user.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $currentUser;
+
+  /**
+   * The MIME type guesser.
+   *
+   * @var \Symfony\Component\Mime\MimeTypeGuesserInterface
+   */
+  protected $mimeTypeGuesser;
+
+  /**
+   * The lock service.
+   *
+   * @var \Drupal\Core\Lock\LockBackendInterface
+   */
+  protected $lock;
+
+  /**
+   * The event dispatcher.
+   *
+   * @var \Symfony\Contracts\EventDispatcher\EventDispatcherInterface
+   */
+  protected $eventDispatcher;
+
+  /**
+   * Constructs a new CKEditor5ImageController.
+   *
+   * @param \Drupal\Core\File\FileSystemInterface $file_system
+   *   The file system service.
+   * @param \Drupal\Core\Session\AccountInterface $current_user
+   *   The currently authenticated user.
+   * @param \Symfony\Component\Mime\MimeTypeGuesserInterface $mime_type_guesser
+   *   The MIME type guesser.
+   * @param \Drupal\Core\Lock\LockBackendInterface $lock
+   *   The lock service.
+   * @param \Symfony\Contracts\EventDispatcher\EventDispatcherInterface $event_dispatcher
+   *   The event dispatcher.
+   */
+  public function __construct(FileSystemInterface $file_system, AccountInterface $current_user, MimeTypeGuesserInterface $mime_type_guesser, LockBackendInterface $lock, EventDispatcherInterface $event_dispatcher) {
+    $this->fileSystem = $file_system;
+    $this->currentUser = $current_user;
+    $this->mimeTypeGuesser = $mime_type_guesser;
+    $this->lock = $lock;
+    $this->eventDispatcher = $event_dispatcher;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('file_system'),
+      $container->get('current_user'),
+      $container->get('file.mime_type.guesser'),
+      $container->get('lock'),
+      $container->get('event_dispatcher'),
+    );
+  }
+
+  /**
+   * Uploads and saves an image from a CKEditor5 POST.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request object.
+   *
+   * @return \Symfony\Component\HttpFoundation\JsonResponse
+   *   A JSON object including the file url.
+   */
+  public function upload(Request $request) {
+    // Getting the UploadedFile directly from the request.
+    $upload = $request->files->get('upload');
+    $filename = $upload->getClientOriginalName();
+
+    $editor = $request->attributes->get('editor');
+    $image_upload = $editor->getImageUploadSettings();
+    $destination = $image_upload['scheme'] . '://' . $image_upload['directory'];
+
+    // Check the destination file path is writable.
+    if (!$this->fileSystem->prepareDirectory($destination, FileSystemInterface::CREATE_DIRECTORY)) {
+      throw new HttpException(500, 'Destination file path is not writable');
+    }
+
+    $max_filesize = min(Bytes::toNumber($image_upload['max_size']), Environment::getUploadMaxSize());
+    if (!empty($image_upload['max_dimensions']['width']) || !empty($image_upload['max_dimensions']['height'])) {
+      $max_dimensions = $image_upload['max_dimensions']['width'] . 'x' . $image_upload['max_dimensions']['height'];
+    }
+    else {
+      $max_dimensions = 0;
+    }
+
+    $validators = [
+      'file_validate_extensions' => ['gif png jpg jpeg'],
+      'file_validate_size' => [$max_filesize],
+      'file_validate_image_resolution' => [$max_dimensions],
+    ];
+
+    $prepared_filename = $this->prepareFilename($filename, $validators);
+
+    // Create the file.
+    $file_uri = "{$destination}/{$prepared_filename}";
+
+    // Using the UploadedFile method instead of streamUploadData.
+    $temp_file_path = $upload->getRealPath();
+
+    $file_uri = $this->fileSystem->getDestinationFilename($file_uri, FileSystemInterface::EXISTS_RENAME);
+
+    // Lock based on the prepared file URI.
+    $lock_id = $this->generateLockIdFromFileUri($file_uri);
+
+    if (!$this->lock->acquire($lock_id)) {
+      throw new HttpException(503, sprintf('File "%s" is already locked for writing.'), NULL, ['Retry-After' => 1]);
+    }
+
+    // Begin building file entity.
+    $file = File::create([]);
+    $file->setOwnerId($this->currentUser->id());
+    $file->setFilename($prepared_filename);
+    if ($this->mimeTypeGuesser instanceof MimeTypeGuesserInterface) {
+      $file->setMimeType($this->mimeTypeGuesser->guessMimeType($prepared_filename));
+    }
+    else {
+      $file->setMimeType($this->mimeTypeGuesser->guess($prepared_filename));
+      @trigger_error('\Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface is deprecated in drupal:9.1.0 and is removed from drupal:10.0.0. Implement \Symfony\Component\Mime\MimeTypeGuesserInterface instead. See https://www.drupal.org/node/3133341', E_USER_DEPRECATED);
+    }
+
+    $file->setFileUri($file_uri);
+    $file->setSize(@filesize($temp_file_path));
+
+    $violations = $this->validate($file, $validators);
+    if ($violations->count() > 0) {
+      throw new HttpException(422, $violations->__toString());
+    }
+
+    try {
+      $this->fileSystem->move($temp_file_path, $file_uri, FileSystemInterface::EXISTS_ERROR);
+    }
+    catch (FileException $e) {
+      throw new HttpException(500, 'Temporary file could not be moved to file location');
+    }
+
+    $file->save();
+
+    $this->lock->release($lock_id);
+
+    return new JsonResponse([
+      'url' => $file->createFileUrl(),
+      'uuid' => $file->uuid(),
+      'entity_type' => $file->getEntityTypeId(),
+    ], 201);
+  }
+
+  /**
+   * Access check based on whether image upload is enabled or not.
+   *
+   * @param \Drupal\editor\Entity\Editor $editor
+   *   The text editor for which an image upload is occurring.
+   *
+   * @return \Drupal\Core\Access\AccessResultInterface
+   *   The access result.
+   */
+  public function imageUploadEnabledAccess(Editor $editor) {
+    if ($editor->getEditor() !== 'ckeditor5') {
+      return AccessResult::forbidden();
+    }
+    if ($editor->getImageUploadSettings()['status'] !== TRUE) {
+      return AccessResult::forbidden();
+    }
+
+    return AccessResult::allowed();
+  }
+
+  /**
+   * Validates the file.
+   *
+   * @param \Drupal\file\FileInterface $file
+   *   The file entity to validate.
+   * @param array $validators
+   *   An array of upload validators to pass to file_validate().
+   *
+   * @return \Drupal\Core\Entity\EntityConstraintViolationListInterface
+   *   The list of constraint violations, if any.
+   */
+  protected function validate(FileInterface $file, array $validators) {
+    $violations = $file->validate();
+
+    // Remove violations of inaccessible fields as they cannot stem from our
+    // changes.
+    $violations->filterByFieldAccess();
+
+    // Validate the file based on the field definition configuration.
+    $errors = file_validate($file, $validators);
+    if (!empty($errors)) {
+      $translator = new DrupalTranslator();
+      foreach ($errors as $error) {
+        $violation = new ConstraintViolation($translator->trans($error),
+          (string) $error,
+          [],
+          EntityAdapter::createFromEntity($file),
+          '',
+          NULL
+        );
+        $violations->add($violation);
+      }
+    }
+
+    return $violations;
+  }
+
+  /**
+   * Prepares the filename to strip out any malicious extensions.
+   *
+   * @param string $filename
+   *   The file name.
+   * @param array $validators
+   *   The array of upload validators.
+   *
+   * @return string
+   *   The prepared/munged filename.
+   */
+  protected function prepareFilename($filename, array &$validators) {
+    $extensions = $validators['file_validate_extensions'][0] ?? '';
+    $event = new FileUploadSanitizeNameEvent($filename, $extensions);
+    $this->eventDispatcher->dispatch($event);
+
+    return $event->getFilename();
+  }
+
+  /**
+   * Generates a lock ID based on the file URI.
+   *
+   * @param string $file_uri
+   *   The file URI.
+   *
+   * @return string
+   *   The generated lock ID.
+   */
+  protected static function generateLockIdFromFileUri($file_uri) {
+    return 'file:ckeditor5:' . Crypt::hashBase64($file_uri);
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Controller/CKEditor5MediaController.php b/core/modules/ckeditor5/src/Controller/CKEditor5MediaController.php
new file mode 100644
index 0000000000..d05b9f3b92
--- /dev/null
+++ b/core/modules/ckeditor5/src/Controller/CKEditor5MediaController.php
@@ -0,0 +1,165 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Controller;
+
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Access\AccessResultInterface;
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Entity\EntityRepositoryInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\editor\Entity\Editor;
+use Drupal\image\Plugin\Field\FieldType\ImageItem;
+use Drupal\media\MediaInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+
+/**
+ * Provides an API for checking if a media entity has image field.
+ */
+class CKEditor5MediaController extends ControllerBase {
+
+  /**
+   * The currently authenticated user.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $currentUser;
+
+  /**
+   * The entity repository.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
+  /**
+   * The request stack.
+   *
+   * @var \Symfony\Component\HttpFoundation\RequestStack
+   */
+  protected $requestStack;
+
+  /**
+   * Constructs a new CKEditor5MediaController.
+   *
+   * @param \Drupal\Core\Session\AccountInterface $current_user
+   *   The currently authenticated user.
+   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
+   *   The entity repository.
+   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
+   *   The request stack.
+   */
+  public function __construct(AccountInterface $current_user, EntityRepositoryInterface $entity_repository, RequestStack $request_stack) {
+    $this->currentUser = $current_user;
+    $this->entityRepository = $entity_repository;
+    $this->requestStack = $request_stack;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('current_user'),
+      $container->get('entity.repository'),
+      $container->get('request_stack')
+    );
+  }
+
+  /**
+   * Checks if media has a image field.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request object.
+   *
+   * @return \Symfony\Component\HttpFoundation\JsonResponse
+   *   A JSON object including the response.
+   */
+  public function isMediaImage(Request $request) {
+    $uuid = $request->query->get('uuid');
+    if ($uuid == '') {
+      throw new BadRequestHttpException();
+    }
+    // Access is enforced on route level.
+    // @see \Drupal\ckeditor5\Controller\CKEditor5MediaController::access().
+    if (!$media = $this->entityRepository->loadEntityByUuid('media', $uuid)) {
+      throw new NotFoundHttpException();
+    }
+
+    // Note that we intentionally do not use:
+    // - \Drupal\Core\Cache\CacheableResponse because caching it on the server
+    //   side is wasteful, hence there is no need for cacheability metadata.
+    // - \Drupal\Core\Render\HtmlResponse because there is no need for
+    //   attachments nor cacheability metadata.
+    return (new JsonResponse($this->hasImageField($media), 200))
+      // Do not allow any intermediary to cache the response, only the end user.
+      ->setPrivate()
+      // Allow the end user to cache it for up to 5 minutes.
+      ->setMaxAge(300);
+  }
+
+  /**
+   * Additional access check for ::isMediaImage().
+   *
+   * This grants access if media embed filter is enabled on the filter format
+   * and user has access to view the media entity.
+   *
+   * Note that access to the filter format is not checked here because the route
+   * is configured to check entity access to the filter format.
+   *
+   * @param \Drupal\editor\Entity\Editor $editor
+   *   The text editor.
+   *
+   * @return \Drupal\Core\Access\AccessResultInterface
+   *   The access result.
+   */
+  public function access(Editor $editor) : AccessResultInterface {
+    if ($editor->getEditor() !== 'ckeditor5') {
+      return AccessResult::forbidden();
+    }
+    // @todo add current request as an argument after
+    // https://www.drupal.org/project/drupal/issues/2786941 has been resolved.
+    $request = $this->requestStack->getCurrentRequest();
+    $uuid = $request->query->get('uuid');
+    if (!$uuid) {
+      throw new BadRequestHttpException();
+    }
+    $media = $this->entityRepository->loadEntityByUuid('media', $uuid);
+    if (!$media) {
+      throw new NotFoundHttpException();
+    }
+    $filters = $editor->getFilterFormat()->filters();
+
+    return AccessResult::allowedIf($filters->has('media_embed') && $filters->get('media_embed')->status)
+      ->andIf($media->access('view', $this->currentUser, TRUE))
+      ->addCacheableDependency($editor->getFilterFormat());
+  }
+
+  /**
+   * Check if the media type of the entity has a image field.
+   *
+   * @param \Drupal\media\MediaInterface $media
+   *   The media item being embedded.
+   *
+   * @return bool
+   *   Flag indicating whether the media type has image field or not.
+   *
+   * @see \Drupal\media\Form\EditorMediaDialog::getMediaImageSourceFieldName()
+   */
+  protected function hasImageField(MediaInterface $media) {
+    $field_definition = $media->getSource()
+      ->getSourceFieldDefinition($media->bundle->entity);
+    $item_class = $field_definition->getItemDefinition()->getClass();
+    if (is_a($item_class, ImageItem::class, TRUE)) {
+      return TRUE;
+    }
+    return FALSE;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/HTMLRestrictionsUtilities.php b/core/modules/ckeditor5/src/HTMLRestrictionsUtilities.php
new file mode 100644
index 0000000000..d0d43a80bf
--- /dev/null
+++ b/core/modules/ckeditor5/src/HTMLRestrictionsUtilities.php
@@ -0,0 +1,253 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5;
+
+use Drupal\Component\Assertion\Inspector;
+use Drupal\Component\Utility\DiffArray;
+use Drupal\Component\Utility\Html;
+use Masterminds\HTML5\Elements;
+
+/**
+ * Utilities for interacting with HTML restrictions.
+ *
+ * @internal
+ */
+final class HTMLRestrictionsUtilities {
+
+  /**
+   * Wildcard types, and the methods that return tags the wildcard represents.
+   *
+   * @var string[]
+   */
+  private const WILDCARD_ELEMENT_METHODS = [
+    '$block' => 'getBlockElementList',
+  ];
+
+  /**
+   * Formats HTML elements for display.
+   *
+   * @param array $elements
+   *   List of elements to format.
+   *
+   * @return string
+   *   A formatted list; a string representation of the given HTML elements.
+   */
+  public static function toReadableElements(array $elements) : array {
+    $readable = [];
+    foreach ($elements as $tag => $attributes) {
+      $attribute_string = '';
+      if (is_array($attributes)) {
+        foreach ($attributes as $attribute_name => $attribute_values) {
+          if (is_array($attribute_values)) {
+            $attribute_values_string = implode(' ', array_keys($attribute_values));
+            $attribute_string .= "$attribute_name=\"$attribute_values_string\" ";
+          }
+          else {
+            $attribute_string .= "$attribute_name ";
+          }
+        }
+      }
+      $joined = '<' . $tag . (!empty($attribute_string) ? ' ' . trim($attribute_string) : '') . '>';
+      array_push($readable, $joined);
+    }
+    assert(Inspector::assertAllStrings($readable));
+    return $readable;
+  }
+
+  /**
+   * Parses a HTML restrictions string with >=1 tags in an array of single tags.
+   *
+   * @param string $elements_string
+   *   A HTML restrictions string.
+   *
+   * @return string[]
+   *   A list of strings, with a HTML tag and potentially attributes in each.
+   */
+  public static function allowedElementsStringToPluginElementsArray(string $elements_string) : array {
+    $html_restrictions = static::allowedElementsStringToHtmlFilterArray($elements_string);
+    return static::toReadableElements($html_restrictions);
+  }
+
+  /**
+   * Parses an HTML string into an array structured as expected by filter_html.
+   *
+   * @param string $elements_string
+   *   A string of HTML tags, potentially with attributes.
+   *
+   * @return array
+   *   An elements array in the structure expected by filter_html.
+   *
+   * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManager::WILDCARD_ELEMENT_METHODS
+   *   Each key in this array represents a valid wildcard tag.
+   */
+  public static function allowedElementsStringToHtmlFilterArray(string $elements_string) : array {
+    preg_match('/<(\$[A-Z,a-z]*)/', $elements_string, $wildcard_matches);
+
+    $wildcard = NULL;
+    if (!empty($wildcard_matches)) {
+      $wildcard = $wildcard_matches[1];
+      assert(substr($wildcard, 0, 1) === '$', 'Wildcard tags must begin with "$"');
+      $elements_string = str_replace($wildcard, 'WILDCARD', $elements_string);
+    }
+
+    $elements = [];
+    $body_child_nodes = Html::load(str_replace('>', ' />', $elements_string))->getElementsByTagName('body')->item(0)->childNodes;
+
+    foreach ($body_child_nodes as $node) {
+      if ($node->nodeType !== XML_ELEMENT_NODE) {
+        // Skip the empty text nodes inside tags.
+        continue;
+      }
+
+      $tag = $wildcard ?? $node->tagName;
+      if ($node->hasAttributes()) {
+        foreach ($node->attributes as $attribute_name => $attribute) {
+          $value = empty($attribute->value) ? TRUE : explode(' ', $attribute->value);
+          self::providedElementsAttributes($elements, $tag, $attribute_name, $value);
+        }
+      }
+      else {
+        if (!isset($elements[$tag])) {
+          $elements[$tag] = FALSE;
+        }
+      }
+    }
+    return $elements;
+  }
+
+  /**
+   * Cleans unwanted artifacts from "allowed HTML" arrays.
+   *
+   * @param array $elements
+   *   An array of allowed elements, structured as expected by filter_html.
+   *
+   * @return array
+   *   The array without unwanted artifacts.
+   */
+  public static function cleanAllowedHtmlArray(array $elements) : array {
+    // When recursively merging elements arrays, unkeyed boolean values can
+    // appear in attribute config arrays. This removes them.
+    foreach ($elements as $tag => $tag_config) {
+      if (is_array($tag_config)) {
+        $elements[$tag] = array_filter($tag_config);
+      }
+    }
+    return $elements;
+  }
+
+  /**
+   * Adds allowed attributes to the elements array.
+   *
+   * @param array $elements
+   *   The elements array.
+   * @param string $tag
+   *   The tag having its attributes configured.
+   * @param string $attribute
+   *   The attribute being configured.
+   * @param array|bool $value
+   *   The attribute config value.
+   */
+  public static function providedElementsAttributes(array &$elements, string $tag, string $attribute, $value) : void {
+    $attribute_already_allows_all = isset($elements[$tag][$attribute]) && $elements[$tag][$attribute] === TRUE;
+
+    if ($value === TRUE) {
+      $elements[$tag][$attribute] = TRUE;
+    }
+    elseif (!$attribute_already_allows_all) {
+      foreach ($value as $attribute_value) {
+        $elements[$tag][$attribute][$attribute_value] = TRUE;
+      }
+    }
+  }
+
+  /**
+   * Compares two HTML restrictions.
+   *
+   * @param array $elements_array_1
+   *   The array to compare from.
+   * @param array $elements_array_2
+   *   The array to compare to.
+   *
+   * @return array
+   *   Returns an array with all the values in $elements_array_1 that are not
+   *   present in $elements_array_1, including values that are FALSE
+   */
+  public static function diffAllowedElements(array $elements_array_1, array $elements_array_2) : array {
+    return array_filter(
+      DiffArray::diffAssocRecursive($elements_array_1, $elements_array_2),
+      // DiffArray::diffAssocRecursive() does not know the semantics of the
+      // HTML restrictions array: unaware that `TAG => FALSE` is a subset of
+      // `TAG => foo` and that in turn is a subset of `TAG => TRUE`.
+      // @see \Drupal\filter\Entity\FilterFormat::getHtmlRestrictions()
+      function ($value, string $tag) use ($elements_array_2) {
+        return $value !== FALSE || !array_key_exists($tag, $elements_array_2);
+      },
+      ARRAY_FILTER_USE_BOTH
+    );
+  }
+
+  /**
+   * Parses a HTML restrictions string into htmlSupport plugin config structure.
+   *
+   * @param string $elements_string
+   *   A HTML restrictions string.
+   *
+   * @return string[]
+   *   An array of allowed elements, structured in the manner expected by the
+   *   CKEditor 5 htmlSupport plugin constructor.
+   *
+   * @see https://ckeditor5.github.io/docs/nightly/ckeditor5/latest/features/general-html-support.html#configuration
+   */
+  public static function allowedElementsStringToHtmlSupportConfig(string $elements_string) : array {
+    $html_restrictions = static::allowedElementsStringToHtmlFilterArray($elements_string);
+    $allowed = [];
+    foreach ($html_restrictions as $tag => $attributes) {
+      $to_allow['name'] = $tag;
+      assert($attributes === FALSE || is_array($attributes));
+      if (is_array($attributes)) {
+        foreach ($attributes as $name => $value) {
+          assert($value === TRUE || Inspector::assertAllStrings($value));
+          $to_allow['attributes'][$name] = $value;
+        }
+      }
+      $allowed[] = $to_allow;
+    }
+
+    return $allowed;
+  }
+
+  /**
+   * Gets a list of block level elements.
+   *
+   * @return array
+   *   An array of block level element tags.
+   */
+  private static function getBlockElementList(): array {
+    return array_filter(array_keys(Elements::$html5), function (string $element) {
+      return Elements::isA($element, Elements::BLOCK_TAG);
+    });
+  }
+
+  /**
+   * Returns the tags that match the provided wildcard.
+   *
+   * A wildcard tag in element config is a way of representing multiple tags
+   * with a single item, such as `<$block>` to represent all block tags. Each
+   * wildcard should have a corresponding callback method listed in
+   * WILDCARD_ELEMENT_METHODS that returns the set of tags represented by the
+   * wildcard.
+   *
+   * @param string $wildcard
+   *   The wildcard that represents multiple tags.
+   *
+   * @return array
+   *   An array of HTML tags.
+   */
+  public static function getWildcardTags(string $wildcard):array {
+    $wildcard_element_method = self::WILDCARD_ELEMENT_METHODS[$wildcard];
+    return call_user_func([self::class, $wildcard_element_method]);
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Heading.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Heading.php
new file mode 100644
index 0000000000..41694cbe20
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Heading.php
@@ -0,0 +1,223 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginElementsSubsetInterface;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\editor\EditorInterface;
+
+/**
+ * CKEditor5 Heading plugin.
+ */
+class Heading extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface, CKEditor5PluginElementsSubsetInterface {
+
+  use CKEditor5PluginConfigurableTrait;
+
+  /**
+   * The headings that cannot be disabled.
+   *
+   * @var string[]
+   */
+  const ALWAYS_ENABLED_HEADINGS = [
+    'paragraph',
+  ];
+
+  /**
+   * The default configuration for this plugin.
+   *
+   * @var string[][]
+   */
+  const DEFAULT_CONFIGURATION = [
+    'enabled_headings' => [
+      'heading2',
+      'heading3',
+      'heading4',
+      'heading5',
+      'heading6',
+    ],
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return static::DEFAULT_CONFIGURATION;
+  }
+
+  /**
+   * Computes all valid choices for the "enabled_headings" setting.
+   *
+   * @see ckeditor5.schema.yml
+   *
+   * @return string[]
+   *   All valid choices.
+   */
+  public static function validChoices() : array {
+    $cke5_plugin_manager = \Drupal::service('plugin.manager.ckeditor5.plugin');
+    assert($cke5_plugin_manager instanceof CKEditor5PluginManagerInterface);
+    $definition = $cke5_plugin_manager->getDefinition('ckeditor5_heading');
+    assert($definition->getClass() === static::class);
+    return array_diff(
+      array_column($definition->getCKEditor5Config()['heading']['options'], 'model'),
+      static::ALWAYS_ENABLED_HEADINGS
+    );
+  }
+
+  /**
+   * Gets all enabled headings.
+   *
+   * @return string[]
+   *   The values in the plugins.ckeditor5_heading.enabled_headings configuration
+   *   plus the headings that are always enabled.
+   */
+  private function getEnabledHeadings(): array {
+    return array_merge(
+      self::ALWAYS_ENABLED_HEADINGS,
+      $this->configuration['enabled_headings']
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * Form for choosing which heading tags are available.
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $form['enabled_headings'] = [
+      '#type' => 'fieldset',
+      '#title' => $this->t('Enabled Headings'),
+      '#description' => $this->t('These are the headings that will appear in the headings dropdown. If a heading is not chosen here, it does not necessarily mean the corresponding tag is disallowed in the text format.'),
+    ];
+
+    foreach ($this->getPluginDefinition()->getCKEditor5Config()['heading']['options'] as $heading_option) {
+      $model = $heading_option['model'];
+
+      if (in_array($model, self::ALWAYS_ENABLED_HEADINGS, TRUE)) {
+        continue;
+      }
+
+      // It's safe to use $model as a key: listing the same model twice with
+      // different properties triggers a schema error in CKEditor 5.
+      // @see https://ckeditor.com/docs/ckeditor5/latest/framework/guides/support/error-codes.html#error-schema-cannot-register-item-twice
+      // @see https://ckeditor.com/docs/ckeditor5/latest/features/headings.html#configuring-custom-heading-elements
+      $form['enabled_headings'][$model] = self::generateCheckboxForHeadingOption($heading_option);
+      $form['enabled_headings'][$model]['#default_value'] = in_array($model, $this->configuration['enabled_headings'], TRUE) ? $model : NULL;
+    }
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+    // Match the config schema structure at ckeditor5.plugin.ckeditor5_heading.
+    $form_value = $form_state->getValue('enabled_headings');
+    $config_value = array_values(array_filter($form_value));
+    $form_state->setValue('enabled_headings', $config_value);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $this->configuration['enabled_headings'] = $form_state->getValue('enabled_headings');
+  }
+
+  /**
+   * Generates checkbox for a CKEditor 5 heading plugin config option.
+   *
+   * @param array $heading_option
+   *   A heading option configuration as the CKEditor 5 Heading plugin expects
+   *   in its configuration.
+   *
+   * @return array
+   *   The checkbox render array.
+   *
+   * @see https://ckeditor.com/docs/ckeditor5/latest/api/module_heading_heading-HeadingConfig.html#member-options
+   */
+  private static function generateCheckboxForHeadingOption(array $heading_option) : array {
+    // This requires the `title` and `model` properties. The `class` property is
+    // optional. The `view` property is not used.
+    assert(array_key_exists('title', $heading_option));
+    assert(array_key_exists('model', $heading_option));
+
+    $checkbox = [
+      '#type' => 'checkbox',
+      '#title' => $heading_option['title'],
+      '#return_value' => $heading_option['model'],
+    ];
+    if (isset($heading_option['class'])) {
+      $checkbox['#label_attributes']['class'][] = $heading_option['class'];
+      $checkbox['#label_attributes']['class'][] = 'ck';
+    }
+
+    return $checkbox;
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * Filters the header options to those chosen in editor config.
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    $enabled_headings = $this->getEnabledHeadings($editor);
+    $all_heading_options = $static_plugin_config['heading']['options'];
+
+    $configured_heading_options = array_filter($all_heading_options, function ($option) use ($enabled_headings) {
+      return in_array($option['model'], $enabled_headings, TRUE);
+    });
+
+    return [
+      'heading' => [
+        'options' => array_values($configured_heading_options),
+      ],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getElementsSubset(): array {
+    return $this->enabledHeadingsToTags($this->configuration['enabled_headings']);
+  }
+
+  /**
+   * Returns an array of enabled tags based on the enabled headings.
+   *
+   * @param string[] $enabled_headings
+   *   Array of the enabled headings.
+   *
+   * @return string[]
+   *   List of tags provided by the enabled headings.
+   */
+  private function enabledHeadingsToTags(array $enabled_headings) : array {
+    $definition = $this->getPluginDefinition();
+    $elements = $definition->getElements();
+    $heading_keyed_by_model = [];
+    foreach ($definition->getCKEditor5Config()['heading']['options'] as $configured_heading) {
+      if (isset($configured_heading['model'])) {
+        $heading_keyed_by_model[$configured_heading['model']] = $configured_heading;
+      }
+    }
+
+    $tags_to_return = [];
+    foreach ($enabled_headings as $model) {
+      if (isset($heading_keyed_by_model[$model]) && isset($heading_keyed_by_model[$model]['view'])) {
+        $element_as_tag = "<{$heading_keyed_by_model[$model]['view']}>";
+        if (in_array($element_as_tag, $elements, TRUE)) {
+          $tags_to_return[] = "<{$heading_keyed_by_model[$model]['view']}>";
+        }
+      }
+    }
+
+    return $tags_to_return;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/ImageUpload.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/ImageUpload.php
new file mode 100644
index 0000000000..c72d05944e
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/ImageUpload.php
@@ -0,0 +1,133 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Url;
+use Drupal\editor\EditorInterface;
+
+// cspell:ignore imageupload
+
+/**
+ * CKEditor5 Image plugin.
+ *
+ * @CKEditor5Plugin(
+ *   id = "ckeditor5_imageUpload",
+ *   ckeditor5 = @CKEditor5AspectsOfCKEditor5Plugin(
+ *     plugins = {"image.ImageUpload", "drupalImage.DrupalImageUpload"},
+ *     config = {
+ *       "image" = {
+ *         "upload" = {
+ *           "types" = { "jpeg", "png", "gif" }
+ *         }
+ *       }
+ *     },
+ *   ),
+ *   drupal = @DrupalAspectsOfCKEditor5Plugin(
+ *     label = @Translation("Image Upload"),
+ *     elements = false,
+ *     admin_library = "ckeditor5/admin.imageupload",
+ *     toolbar_items = {
+ *       "uploadImage" = { "label" = "Image upload" }
+ *     },
+ *     conditions = {
+ *       "toolbarItem" = "uploadImage",
+ *       "imageUploadStatus" = true,
+ *     }
+ *   )
+ * )
+ */
+class ImageUpload extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface {
+
+  use CKEditor5PluginConfigurableTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    return $static_plugin_config + [
+      'drupalImageUpload' => [
+        'uploadUrl' => URL::fromRoute('ckeditor5.upload_image')
+          ->setRouteParameter('editor', $editor->getFilterFormat()->id())
+          ->toString(TRUE)
+          ->getGeneratedUrl(),
+        'withCredentials' => TRUE,
+        'headers' => ['Accept' => 'application/json', 'text/javascript'],
+      ],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @see \Drupal\editor\Form\EditorImageDialog
+   * @see editor_image_upload_settings_form()
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $editor = $form_state->get('editor');
+    $form_state->loadInclude('editor', 'admin.inc');
+    $form['image_upload'] = editor_image_upload_settings_form($editor);
+    $form['image_upload']['#element_validate'][] = [
+      $this, 'validateImageUploadSettings',
+    ];
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+    // @todo Move relevant parts of validateImageUploadSettings() in here in https://www.drupal.org/project/ckeditor5/issues/3231362.
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    // @todo Move relevant parts of validateImageUploadSettings() in here in https://www.drupal.org/project/ckeditor5/issues/3231362.
+  }
+
+  /**
+   * Handler for the "image_upload" element in buildConfigurationForm().
+   *
+   * Moves the text editor's image upload settings into $editor->image_upload.
+   *
+   * @see \Drupal\editor\Form\EditorImageDialog
+   * @see editor_image_upload_settings_form()
+   */
+  public function validateImageUploadSettings(array $element, FormStateInterface $form_state) {
+    $image_upload = [
+      'editor',
+      'settings',
+      'plugins',
+      'ckeditor5_imageUpload',
+      'image_upload',
+    ];
+    $settings = $form_state->getValue($image_upload);
+    $settings['status'] = (bool) $settings['status'];
+    $settings['max_dimensions']['width'] = (int) $settings['max_dimensions']['width'];
+    $settings['max_dimensions']['height'] = (int) $settings['max_dimensions']['height'];
+    $form_state->get('editor')->setImageUploadSettings($settings);
+    $form_state->unsetValue([
+      'editor',
+      'settings',
+      'plugins',
+      'ckeditor5_imageUpload',
+    ]);
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * This returns an empty array as image upload config is stored differently.
+   */
+  public function defaultConfiguration() {
+    return [];
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Language.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Language.php
new file mode 100644
index 0000000000..b0325e97ce
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Language.php
@@ -0,0 +1,99 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\LanguageManager;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\editor\EditorInterface;
+
+/**
+ * CKEditor5 Language plugin.
+ */
+class Language extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface {
+
+  use CKEditor5PluginConfigurableTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    $predefined_languages = $this->configuration['language_list'] === 'all' ?
+      LanguageManager::getStandardLanguageList() :
+      LanguageManager::getUnitedNationsLanguageList();
+
+    // Generate the language_list setting as expected by the CKEditor Language
+    // plugin, but key the values by the full language name so that we can sort
+    // them later on.
+    $language_list = [];
+    foreach ($predefined_languages as $langcode => $language) {
+      $english_name = $language[0];
+      $direction = empty($language[2]) ? NULL : $language[2];
+      $language_list[$english_name] = [
+        'title' => $english_name,
+        'languageCode' => $langcode,
+      ];
+      if ($direction === LanguageInterface::DIRECTION_RTL) {
+        $language_list[$english_name]['textDirection'] = 'rtl';
+      }
+    }
+
+    // Sort on full language name.
+    ksort($language_list);
+    $config = $static_plugin_config;
+    $config['language']['textPartLanguage'] = array_values($language_list);
+    return $config;
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @see \Drupal\editor\Form\EditorImageDialog
+   * @see editor_image_upload_settings_form()
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $predefined_languages = LanguageManager::getStandardLanguageList();
+    $form['language_list'] = [
+      '#title' => $this->t('Language list'),
+      '#title_display' => 'invisible',
+      '#type' => 'select',
+      '#options' => [
+        'un' => $this->t("United Nations' official languages"),
+        'all' => $this->t('All @count languages', ['@count' => count($predefined_languages)]),
+      ],
+      '#default_value' => $this->configuration['language_list'],
+      '#description' => $this->t('The list of languages to show in the language dropdown. The basic list will only show the <a href=":url">six official languages of the UN</a>. The extended list will show all @count languages that are available in Drupal.', [
+        ':url' => 'https://www.un.org/en/sections/about-un/official-languages',
+        '@count' => count($predefined_languages),
+      ]),
+    ];
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $this->configuration['language_list'] = $form_state->getValue('language_list');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return ['language_list' => 'un'];
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Media.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Media.php
new file mode 100644
index 0000000000..fa23477f54
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/Media.php
@@ -0,0 +1,35 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\Core\Url;
+use Drupal\editor\EditorInterface;
+
+/**
+ * CKEditor5 Media plugin.
+ *
+ * Provides drupal-media element and options provided by the CKEditor5 build.
+ */
+class Media extends CKEditor5PluginDefault {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    $config = $static_plugin_config;
+    $config['drupalMedia']['previewURL'] = Url::fromRoute('media.filter.preview')
+      ->setRouteParameter('filter_format', $editor->getFilterFormat()->id())
+      ->toString(TRUE)
+      ->getGeneratedUrl();
+    $config['drupalMedia']['isMediaUrl'] = Url::fromRoute('ckeditor5.media_image')
+      ->setRouteParameter('editor', $editor->id())
+      ->toString(TRUE)
+      ->getGeneratedUrl();
+
+    return $config;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/MediaLibrary.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/MediaLibrary.php
new file mode 100644
index 0000000000..cf9d1c9868
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/MediaLibrary.php
@@ -0,0 +1,99 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Url;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\editor\EditorInterface;
+use Drupal\media_library\MediaLibraryState;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * CKEditor5 Media Library plugin.
+ *
+ * Provides media library support and options for the CKEditor5 build.
+ */
+class MediaLibrary extends CKEditor5PluginDefault implements ContainerFactoryPluginInterface {
+
+  /**
+   * The media type entity storage.
+   *
+   * @var \Drupal\Core\Config\Entity\ConfigEntityStorageInterface
+   */
+  protected $mediaTypeStorage;
+
+  /**
+   * MediaLibrary constructor.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   */
+  public function __construct(array $configuration, string $plugin_id, CKEditor5PluginDefinition $plugin_definition, EntityTypeManagerInterface $entity_type_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->mediaTypeStorage = $entity_type_manager->getStorage('media_type');
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity_type.manager'),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    $media_type_ids = $this->mediaTypeStorage->getQuery()->execute();
+
+    if ($editor->hasAssociatedFilterFormat()) {
+      $media_embed_filter = $editor->getFilterFormat()->filters()->get('media_embed');
+      // Optionally limit the allowed media types based on the MediaEmbed
+      // setting. If the setting is empty, do not limit the options.
+      if (!empty($media_embed_filter->settings['allowed_media_types'])) {
+        $media_type_ids = array_intersect_key($media_type_ids, $media_embed_filter->settings['allowed_media_types']);
+      }
+    }
+    if (in_array('image', $media_type_ids, TRUE)) {
+      // Move image to first position.
+      // This workaround can be removed once this issue is fixed:
+      // @see https://www.drupal.org/project/drupal/issues/3073799
+      array_unshift($media_type_ids, 'image');
+      $media_type_ids = array_unique($media_type_ids);
+    }
+
+    $state = MediaLibraryState::create(
+      'media_library.opener.editor',
+      $media_type_ids,
+      reset($media_type_ids),
+      1,
+      ['filter_format_id' => $editor->getFilterFormat()->id()],
+    );
+
+    $library_url = Url::fromRoute('media_library.ui')
+      ->setOption('query', $state->all())
+      ->toString(TRUE)
+      ->getGeneratedUrl();
+
+    $config = $static_plugin_config;
+    $config['drupalMedia']['libraryURL'] = $library_url;
+    return $config;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/SourceEditing.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/SourceEditing.php
new file mode 100644
index 0000000000..190df80b94
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/SourceEditing.php
@@ -0,0 +1,84 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginElementsSubsetInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\editor\EditorInterface;
+
+/**
+ * CKEditor 5 Source Editing plugin configuration.
+ */
+class SourceEditing extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface, CKEditor5PluginElementsSubsetInterface {
+
+  use CKEditor5PluginConfigurableTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $form['allowed_tags'] = [
+      '#type' => 'textarea',
+      '#title' => $this->t('Manually editable HTML tags'),
+      '#default_value' => implode(' ', $this->configuration['allowed_tags']),
+      '#description' => $this->t('A list of HTML tags that can be used while editing source. It is only necessary to add tags that are not already supported by other enabled plugins. For example, if "Bold" is enabled, it is not necessary to add the <code>&lt;strong&gt;</code> tag, but it may be necessary to add <code>&lt;dl&gt;&lt;dt&gt;&lt;dd&gt;</code> in a format that does not have a definition list plugin, but requires definition list markup.'),
+    ];
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+    // Match the config schema structure at ckeditor5.plugin.ckeditor5_heading.
+    $form_value = $form_state->getValue('allowed_tags');
+    if (!is_array($form_value)) {
+      $config_value = HTMLRestrictionsUtilities::allowedElementsStringToPluginElementsArray($form_value);
+      $form_state->setValue('allowed_tags', $config_value);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $this->configuration['allowed_tags'] = $form_state->getValue('allowed_tags');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'allowed_tags' => [],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getElementsSubset(): array {
+    return $this->configuration['allowed_tags'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    $allowed = HTMLRestrictionsUtilities::allowedElementsStringToHtmlSupportConfig(implode('', $this->configuration['allowed_tags']));
+
+    return [
+      'htmlSupport' => [
+        'allow' => $allowed,
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginConfigurableInterface.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginConfigurableInterface.php
new file mode 100644
index 0000000000..a78fe949a2
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginConfigurableInterface.php
@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\Component\Plugin\ConfigurableInterface;
+use Drupal\Core\Plugin\PluginFormInterface;
+
+/**
+ * Defines an interface for configurable CKEditor 5 plugins.
+ *
+ * This allows a CKEditor 5 plugin to define a settings form. These settings can
+ * then be automatically passed on to the corresponding CKEditor 5 instance via
+ * CKEditor5PluginInterface::getDynamicPluginConfig().
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait
+ * @see \Drupal\ckeditor5\CKEditor5PluginInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginBase
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5Plugin
+ * @see plugin_api
+ */
+interface CKEditor5PluginConfigurableInterface extends CKEditor5PluginInterface, ConfigurableInterface, PluginFormInterface {
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginConfigurableTrait.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginConfigurableTrait.php
new file mode 100644
index 0000000000..1a790970eb
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginConfigurableTrait.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Drupal\ckeditor5\Plugin;
+
+/**
+ * Provides a trait for configurable CKEditor 5 plugins.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface
+ */
+trait CKEditor5PluginConfigurableTrait {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getConfiguration() {
+    return $this->configuration;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setConfiguration(array $configuration) {
+    $this->configuration = $configuration + $this->defaultConfiguration();
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginDefault.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginDefault.php
new file mode 100644
index 0000000000..e4b0da8e6f
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginDefault.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\Core\Plugin\PluginBase;
+use Drupal\editor\EditorInterface;
+
+/**
+ * Defines the default CKEditor 5 plugin implementation.
+ *
+ * When a CKEditor 5 plugin is not configurable nor has dynamic plugin
+ * configuration, no custom code needs to be written: this default
+ * implementation will be used under the hood.
+ *
+ * @see @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$class
+ */
+class CKEditor5PluginDefault extends PluginBase implements CKEditor5PluginInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+
+    // Ensure the configuration is set as expected for configurable plugins.
+    if ($this instanceof CKEditor5PluginConfigurableInterface) {
+      $this->setConfiguration($configuration);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
+    return $static_plugin_config;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginDefinition.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginDefinition.php
new file mode 100644
index 0000000000..1bb191e79a
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginDefinition.php
@@ -0,0 +1,348 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\Component\Assertion\Inspector;
+use Drupal\Component\Plugin\Definition\PluginDefinition;
+use Drupal\Component\Plugin\Definition\PluginDefinitionInterface;
+use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+
+/**
+ * Provides an implementation of a CKEditor 5 plugin definition.
+ */
+final class CKEditor5PluginDefinition extends PluginDefinition implements PluginDefinitionInterface {
+
+  /**
+   * The CKEditor 5 aspects of the plugin definition.
+   *
+   * @var array
+   */
+  private $ckeditor5;
+
+  /**
+   * The Drupal aspects of the plugin definition.
+   *
+   * @var array
+   */
+  private $drupal;
+
+  /**
+   * CKEditor5PluginDefinition constructor.
+   *
+   * @param array $definition
+   *   An array of values from the annotation/YAML.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   */
+  public function __construct(array $definition) {
+    $this->id = $id = $definition['id'];
+
+    $expected_prefix = sprintf("%s_", $definition['provider']);
+    if (strpos($id, $expected_prefix) !== 0) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must have a plugin ID that starts with "%s".', $id, $expected_prefix));
+    }
+    $this->provider = $definition['provider'];
+
+    static::validateCKEditor5Aspects($id, $definition);
+    $this->ckeditor5 = $definition['ckeditor5'];
+
+    static::validateDrupalAspects($id, $definition);
+    $this->drupal = $definition['drupal'];
+  }
+
+  /**
+   * Validates the CKEditor 5 aspects of the CKEditor 5 plugin definition.
+   *
+   * @param string $id
+   *   The plugin ID, for use in exception messages.
+   * @param array $definition
+   *   The plugin definition to validate.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   */
+  private static function validateCKEditor5Aspects(string $id, array $definition): void {
+    if (!isset($definition['ckeditor5'])) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must contain a "ckeditor5" key.', $id));
+    }
+
+    if (!isset($definition['ckeditor5']['plugins'])) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must contain a "ckeditor5.plugins" key.', $id));
+    }
+  }
+
+  /**
+   * Validates the Drupal aspects of the CKEditor 5 plugin definition.
+   *
+   * @param string $id
+   *   The plugin ID, for use in exception messages.
+   * @param array $definition
+   *   The plugin definition to validate.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   */
+  private static function validateDrupalAspects(string $id, array $definition): void {
+    if (!isset($definition['drupal'])) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must contain a "drupal" key.', $id));
+    }
+
+    // Without a label, the CKEditor 5 UI, validation constraints et cetera
+    // cannot be as informative in guiding the end user.
+    if (!isset($definition['drupal']['label'])) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must contain a "drupal.label" key.', $id));
+    }
+    elseif (!is_string($definition['drupal']['label']) && !$definition['drupal']['label'] instanceof TranslatableMarkup) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition has a "drupal.label" value that is not a string nor a TranslatableMarkup instance.', $id));
+    }
+
+    // Without accurate and complete metadata about what HTML elements a
+    // CKEditor 5 plugin supports, Drupal cannot ensure a complete and accurate
+    // upgrade path.
+    if (!isset($definition['drupal']['elements'])) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must contain a "drupal.elements" key.', $id));
+    }
+    elseif ($definition['drupal']['elements'] !== FALSE && !(is_array($definition['drupal']['elements']) && !empty($definition['drupal']['elements']) && Inspector::assertAllStrings($definition['drupal']['elements']))) {
+      throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition has a "drupal.elements" key that is neither a list of HTML tags/attributes nor false.', $id));
+    }
+
+    if (isset($definition['drupal']['class']) && !in_array(CKEditor5PluginInterface::class, class_implements($definition['drupal']['class']))) {
+      throw new InvalidPluginDefinitionException($id, sprintf('CKEditor 5 plugins must implement \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface. "%s" does not.', $id));
+    }
+
+    if ($definition['drupal']['admin_library'] !== FALSE) {
+      [$extension, $library] = explode('/', $definition['drupal']['admin_library'], 2);
+      if (\Drupal::service('library.discovery')->getLibraryByName($extension, $library) === FALSE) {
+        throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition has a "drupal.admin_library" key whose asset library "%s" does not exist.', $id, $definition['drupal']['admin_library']));
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$class
+   */
+  public function getClass() {
+    return $this->drupal['class'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setClass($class) {
+    $this->drupal['class'] = $class;
+    return $this;
+  }
+
+  /**
+   * Whether this plugin is configurable by the user.
+   *
+   * @return bool
+   *   TRUE if it is configurable, FALSE otherwise.
+   *
+   * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface
+   */
+  public function isConfigurable(): bool {
+    return is_subclass_of($this->getClass(), CKEditor5PluginConfigurableInterface::class);
+  }
+
+  /**
+   * Gets the human-readable name of the CKEditor plugin.
+   *
+   * @return \Drupal\Core\StringTranslation\TranslatableMarkup
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$label
+   */
+  public function label(): TranslatableMarkup {
+    $label = $this->drupal['label'];
+    if (!$label instanceof TranslatableMarkup) {
+      $label = new TranslatableMarkup($label);
+    }
+    return $label;
+  }
+
+  /**
+   * Gets the list of conditions to enable this plugin.
+   *
+   * @return array
+   *   An array of conditions.
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$conditions
+   */
+  public function getConditions(): array {
+    if (!$this->hasConditions()) {
+      throw new \LogicException('::getConditions() should only be called if ::hasConditions() returns TRUE.');
+    }
+    return $this->drupal['conditions'];
+  }
+
+  /**
+   * Whether this plugin has conditions.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$conditions
+   */
+  public function hasConditions(): bool {
+    return $this->drupal['conditions'] !== FALSE;
+  }
+
+  /**
+   * Gets the list of toolbar items this plugin provides.
+   *
+   * @return array[]
+   *   An array of toolbar items.
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$toolbar_items
+   */
+  public function getToolbarItems(): array {
+    return $this->drupal['toolbar_items'];
+  }
+
+  /**
+   * Whether this plugin has toolbar items.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$conditions
+   */
+  public function hasToolbarItems(): bool {
+    return $this->getToolbarItems() !== [];
+  }
+
+  /**
+   * Gets the asset library this plugin needs to be loaded.
+   *
+   * @return string
+   *   An asset library ID.
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$library
+   */
+  public function getLibrary(): string {
+    if (!$this->hasLibrary()) {
+      throw new \LogicException('::getLibrary() should only be called if ::hasLibrary() returns TRUE.');
+    }
+    return $this->drupal['library'];
+  }
+
+  /**
+   * Whether this plugin has an asset library to load.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$library
+   */
+  public function hasLibrary(): bool {
+    return $this->drupal['library'] !== FALSE;
+  }
+
+  /**
+   * Gets the asset library this plugin needs to be loaded on the admin UI.
+   *
+   * @return string
+   *   An asset library ID.
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$admin_library
+   */
+  public function getAdminLibrary(): string {
+    if (!$this->hasAdminLibrary()) {
+      throw new \LogicException('::getAdminLibrary() should only be called if ::hasAdminLibrary() returns TRUE.');
+    }
+    return $this->drupal['admin_library'];
+  }
+
+  /**
+   * Whether this plugin has an asset library to load on the admin UI.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$admin_library
+   */
+  public function hasAdminLibrary(): bool {
+    return $this->drupal['admin_library'] !== FALSE;
+  }
+
+  /**
+   * Gets the list of elements and attributes this plugin allows to create/edit.
+   *
+   * @return string[]|false
+   *   FALSE if this plugin does not create/edit any elements or attributes.
+   *   Otherwise a list.
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$elements
+   */
+  public function getElements() {
+    if ($this->drupal['elements'] === FALSE) {
+      return FALSE;
+    }
+
+    // Normalize elements: one tag per array value.
+    return array_reduce($this->drupal['elements'], function (array $all_elements, string $elements_string): array {
+      return array_merge(
+        $all_elements,
+        HTMLRestrictionsUtilities::allowedElementsStringToPluginElementsArray($elements_string)
+      );
+    }, []);
+  }
+
+  /**
+   * Whether this plugin allows creating/editing elements and attributes.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\DrupalAspectsOfCKEditor5Plugin::$elements
+   */
+  public function hasElements(): bool {
+    return $this->getElements() !== FALSE;
+  }
+
+  /**
+   * Gets the list of CKEditor 5 plugin classes this plugin needs to load.
+   *
+   * @return string[]
+   *   CKEditor 5 plugin classes.
+   *
+   * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin::$plugins
+   */
+  public function getCKEditor5Plugins(): array {
+    return $this->ckeditor5['plugins'];
+  }
+
+  /**
+   * Whether this plugin loads CKEditor 5 plugin classes.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin::$plugins
+   */
+  public function hasCKEditor5Plugins(): bool {
+    return $this->getCKEditor5Plugins() !== [];
+  }
+
+  /**
+   * Gets keyed array of additional values for the CKEditor5 constructor config.
+   *
+   * @return array
+   *   The CKEditor 5 constructor config.
+   *
+   * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin::$config
+   */
+  public function getCKEditor5Config(): array {
+    return $this->ckeditor5['config'];
+  }
+
+  /**
+   * Whether this plugin has additional values for the CKEditor5 constructor.
+   *
+   * @return bool
+   *
+   * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin::$config
+   */
+  public function hasCKEditor5Config(): bool {
+    return $this->getCKEditor5Config() !== [];
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginElementsSubsetInterface.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginElementsSubsetInterface.php
new file mode 100644
index 0000000000..8ecfd466f8
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginElementsSubsetInterface.php
@@ -0,0 +1,25 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+/**
+ * Defines an interface for plugins that can support an elements subset.
+ *
+ * Plugins can support multiple elements in the `elements` property of their
+ * definition. A text format may want to use a given plugin without supporting
+ * every supported element. Plugins that implement this interface return a
+ * subset based on the configuration in the Text Editor's settings.
+ */
+interface CKEditor5PluginElementsSubsetInterface extends CKEditor5PluginConfigurableInterface {
+
+  /**
+   * Returns a configured subset of the elements supported by this plugin.
+   *
+   * @return string[]
+   *   An array of supported elements.
+   */
+  public function getElementsSubset(): array;
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginInterface.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginInterface.php
new file mode 100644
index 0000000000..64b2b1dddc
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginInterface.php
@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\Component\Plugin\PluginInspectionInterface;
+use Drupal\editor\EditorInterface;
+
+/**
+ * Defines an interface for CKEditor5 plugins.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginBase
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5Plugin
+ * @see plugin_api
+ */
+interface CKEditor5PluginInterface extends PluginInspectionInterface {
+
+  /**
+   * Allows a plugin to modify its static configuration.
+   *
+   * @param array $static_plugin_config
+   *   The ckeditor5.config entry from the YAML or annotation, if any. If none
+   *   is specified in the YAML or annotation, then the empty array.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   *
+   * @return array
+   *   Returns the received $static_plugin_config plus dynamic additions or
+   *   alterations.
+   *
+   * @see \Drupal\ckeditor5\Annotation\CKEditor5AspectsOfCKEditor5Plugin::$config
+   * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition::getCKEditor5Config()
+   */
+  public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array;
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginManager.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginManager.php
new file mode 100644
index 0000000000..1ea3345ec2
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginManager.php
@@ -0,0 +1,389 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\ckeditor5\Annotation\CKEditor5Plugin;
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\Component\Annotation\Plugin\Discovery\AnnotationBridgeDecorator;
+use Drupal\Component\Assertion\Inspector;
+use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Plugin\DefaultPluginManager;
+use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
+use Drupal\Core\Plugin\Discovery\YamlDiscoveryDecorator;
+use Drupal\editor\EditorInterface;
+use Drupal\filter\FilterPluginCollection;
+
+/**
+ * Provides a CKEditor5 plugin manager.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginBase
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5Plugin
+ * @see plugin_api
+ */
+class CKEditor5PluginManager extends DefaultPluginManager implements CKEditor5PluginManagerInterface {
+
+  /**
+   * Constructs a CKEditor5PluginManager object.
+   *
+   * @param \Traversable $namespaces
+   *   An object that implements \Traversable which contains the root paths
+   *   keyed by the corresponding namespace to look for plugin implementations.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
+   *   Cache backend instance to use.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler to invoke the alter hook with.
+   */
+  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
+    parent::__construct('Plugin/CKEditor5Plugin', $namespaces, $module_handler, CKEditor5PluginInterface::class, CKEditor5Plugin::class);
+
+    $this->alterInfo('ckeditor5_plugin_info');
+    $this->setCacheBackend($cache_backend, 'ckeditor5_plugins');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getDiscovery() {
+    if (!$this->discovery) {
+      $discovery = new AnnotatedClassDiscovery($this->subdir, $this->namespaces, $this->pluginDefinitionAnnotationName, $this->additionalAnnotationNamespaces);
+      $discovery = new YamlDiscoveryDecorator($discovery, 'ckeditor5', $this->moduleHandler->getModuleDirectories());
+      // Note: adding translatable properties here is impossible because it only
+      // supports top-level properties.
+      // @see \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition::label()
+      $discovery = new AnnotationBridgeDecorator($discovery, $this->pluginDefinitionAnnotationName);
+      $this->discovery = $discovery;
+    }
+    return $this->discovery;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPlugin(string $plugin_id, ?EditorInterface $editor): CKEditor5PluginInterface {
+    $configuration = $editor
+      ? self::getPluginConfiguration($editor, $plugin_id)
+      : [];
+    return $this->createInstance($plugin_id, $configuration);
+  }
+
+  /**
+   * Gets the plugin configuration (if any) from a text editor config entity.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A text editor config entity that is using CKEditor 5.
+   * @param string $plugin_id
+   *   A CKEditor 5 plugin ID.
+   *
+   * @return array
+   *   The CKEditor 5 plugin configuration, if any.
+   */
+  protected static function getPluginConfiguration(EditorInterface $editor, string $plugin_id): array {
+    if ($editor->getEditor() !== 'ckeditor5') {
+      throw new \LogicException('This method should only be called on text editor config entities using CKEditor 5.');
+    }
+    return $editor->getSettings()['plugins'][$plugin_id] ?? [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getToolbarItems(): array {
+    return $this->mergeDefinitionValues('getToolbarItems', $this->getDefinitions());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAdminLibraries(): array {
+    $list = $this->mergeDefinitionValues('getAdminLibrary', $this->getDefinitions());
+    // Include main admin library.
+    array_unshift($list, 'ckeditor5/admin');
+    return $list;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getEnabledLibraries(EditorInterface $editor): array {
+    $list = $this->mergeDefinitionValues('getLibrary', $this->getEnabledDefinitions($editor));
+    $list = array_unique($list);
+    // Include main library.
+    array_unshift($list, 'ckeditor5/drupal.ckeditor5');
+    sort($list);
+    return $list;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getEnabledDefinitions(EditorInterface $editor): array {
+    $definitions = $this->getDefinitions();
+    ksort($definitions);
+    foreach ($definitions as $plugin_id => $definition) {
+      // Remove definition when plugin has conditions and they are not met.
+      if ($definition->hasConditions()) {
+        $plugin = $this->getPlugin($plugin_id, $editor);
+        if ($this->isPluginDisabled($plugin, $editor)) {
+          unset($definitions[$plugin_id]);
+        }
+      }
+      // Otherwise, only remove the definition if the plugin has buttons and
+      // none of its buttons are active.
+      elseif ($definition->hasToolbarItems()) {
+        if (empty(array_intersect($editor->getSettings()['toolbar']['items'], array_keys($definition->getToolbarItems())))) {
+          unset($definitions[$plugin_id]);
+        }
+      }
+    }
+
+    // Only enable the General HTML Support plugin on text formats with no HTML
+    // restrictions.
+    // @see https://ckeditor.com/docs/ckeditor5/latest/api/html-support.html
+    // @see https://github.com/ckeditor/ckeditor5/issues/9856
+    if ($editor->getFilterFormat()->getHtmlRestrictions() !== FALSE) {
+      unset($definitions['ckeditor5_htmlSupport']);
+    }
+
+    return $definitions;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function findPluginSupportingElement(string $tag) : ?string {
+    // This will contain the element config for a plugin found to support $tag,
+    // so it can be compared to additional plugins that support $tag so the
+    // plugin with the most permissive config can be the id returned.
+    $selected_provided_elements = [];
+    $plugin_id = NULL;
+
+    foreach ($this->getDefinitions() as $id => $definition) {
+      $provided_elements = $this->getProvidedElements([$id]);
+
+      // Multiple plugins may support the $tag being searched for.
+      if (array_key_exists($tag, $provided_elements)) {
+        // Skip plugins with conditions as those plugins can't be guaranteed to
+        // provide a given tag without additional criteria being met. In the
+        // future we could possibly add support for automatically enabling
+        // filters or other similar requirements a plugin might need in order to
+        // be enabled and provide the tag it supports. For now, we assume such
+        // configuration cannot be modified programmatically.
+        if ($definition->hasConditions()) {
+          continue;
+        }
+
+        // True if a plugin has already been selected. If another plugin
+        // supports $tag, it will be compared against this one. Whichever
+        // provides broader support for $tag will be the plugin id returned by
+        // this method.
+        $selected_plugin = isset($selected_provided_elements[$tag]);
+        $selected_config = $selected_provided_elements[$tag] ?? FALSE;
+
+        // True if a plugin supporting $tag has been selected but does not allow
+        // any attributes while the plugin currently being checked does support
+        // attributes.
+        $adds_attribute_config = is_array($provided_elements[$tag]) && $selected_plugin && !is_array($selected_config);
+        $broader_attribute_config = FALSE;
+
+        // If the selected plugin and the plugin being checked both have arrays
+        // for $tag configuration, they both have attribute configuration. Check
+        // which attribute configuration is more permissive.
+        if ($selected_plugin && is_array($selected_config) && is_array($provided_elements[$tag])) {
+          $selected_plugin_full_attributes = array_filter($selected_config, function ($attribute_config) {
+            return !is_array($attribute_config);
+          });
+          $being_checked_plugin_full_attributes = array_filter($provided_elements[$tag], function ($attribute_config) {
+            return !is_array($attribute_config);
+          });
+          if (count($being_checked_plugin_full_attributes) > count($selected_plugin_full_attributes)) {
+            $broader_attribute_config = TRUE;
+          }
+        }
+
+        if (empty($selected_provided_elements) || $broader_attribute_config || $adds_attribute_config) {
+          $selected_provided_elements = $provided_elements;
+          $plugin_id = $id;
+        }
+      }
+    }
+
+    return $plugin_id;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCKEditor5PluginConfig(EditorInterface $editor): array {
+    $definitions = $this->getEnabledDefinitions($editor);
+
+    // Allow plugin to modify config, such as loading dynamic values.
+    $config = [];
+    foreach ($definitions as $plugin_id => $definition) {
+      $plugin = $this->getPlugin($plugin_id, $editor);
+      $config[$plugin_id] = $plugin->getDynamicPluginConfig($definition->getCKEditor5Config(), $editor);
+    }
+
+    return [
+      'plugins' => $this->mergeDefinitionValues('getCKEditor5Plugins', $definitions),
+      'config' => NestedArray::mergeDeepArray($config),
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getProvidedElements(array $plugin_ids = [], EditorInterface $editor = NULL, bool $retain_wildcard = FALSE) : array {
+    $plugins = $this->getDefinitions();
+    if (!empty($plugin_ids)) {
+      $plugins = array_intersect_key($plugins, array_flip($plugin_ids));
+    }
+    $elements = [];
+    $processed_elements = [];
+
+    foreach ($plugins as $id => $definition) {
+      // Some CKEditor 5 plugins only provide functionality, not additional
+      // elements.
+      if (!$definition->hasElements()) {
+        continue;
+      }
+
+      $defined_elements = $definition->getElements();
+      if (is_a($definition->getClass(), CKEditor5PluginElementsSubsetInterface::class, TRUE)) {
+        // ckeditor5_sourceEditing is the edge case here: it is the only plugin
+        // that is allowed to return a superset. It's a special case because it
+        // is through configuring this particular plugin that additional HTML
+        // tags can be allowed.
+        // Even though its plugin definition says '<*>' is supported, this is a
+        // little lie to convey that this plugin is capable of supporting any
+        // HTML tag … but which ones are actually supported depends on the
+        // configuration.
+        // This also means that without any configuration, it does not support
+        // any HTML tags.
+        if ($id === 'ckeditor5_sourceEditing') {
+          $defined_elements = !isset($editor) ? [] : $this->getPlugin($id, $editor)->getElementsSubset();
+        }
+        // The default case: all other plugins that implement this interface are
+        // explicitly checked for compliance: only subsets are allowed. This is
+        // essential for \Drupal\ckeditor5\SmartDefaultSettings to be able to
+        // work: otherwise it would not be able to know which plugins to enable.
+        elseif (isset($editor)) {
+          $subset = $this->getPlugin($id, $editor)->getElementsSubset();
+          $subset_violations = array_diff($subset, $defined_elements);
+          if (!empty($subset_violations)) {
+            throw new \LogicException(sprintf('The "%s" CKEditor 5 plugin implements ::getElementsSubset() and did not return a subset, the following tags are absent from the plugin definition: "%s".', $id, implode(' ', $subset_violations)));
+          }
+          $defined_elements = $subset;
+        }
+      }
+      assert(Inspector::assertAllStrings($defined_elements));
+      foreach ($defined_elements as $element) {
+        if (in_array($element, $processed_elements)) {
+          continue;
+        }
+        $processed_elements[] = $element;
+        $additional_elements = HTMLRestrictionsUtilities::allowedElementsStringToHtmlFilterArray($element);
+        $elements = array_merge_recursive($elements, $additional_elements);
+      }
+    }
+
+    foreach ($elements as $tag_name => $tag_config) {
+      if (substr($tag_name, 0, 1) === '$') {
+        $wildcard_tags = HTMLRestrictionsUtilities::getWildcardTags($tag_name);
+        foreach ($wildcard_tags as $wildcard_tag) {
+          if (isset($elements[$wildcard_tag])) {
+            foreach ($tag_config as $attribute_name => $attribute_value) {
+              if (is_array($attribute_value)) {
+                $attribute_value = array_keys($attribute_value);
+              }
+              $element_already_allows_all_values = isset($elements[$wildcard_tag][$attribute_name]) && $elements[$wildcard_tag][$attribute_name] === TRUE;
+              if (!$element_already_allows_all_values) {
+                HTMLRestrictionsUtilities::providedElementsAttributes($elements, $wildcard_tag, $attribute_name, $attribute_value);
+              }
+            }
+          }
+        }
+        if (!$retain_wildcard) {
+          unset($elements[$tag_name]);
+        }
+      }
+    }
+
+    return HTMLRestrictionsUtilities::cleanAllowedHtmlArray($elements);
+  }
+
+  /**
+   * Returns array of merged values for the given plugin definitions.
+   *
+   * @param string $get_method
+   *   Which CKEditor5PluginDefinition getter to call to get values to merge.
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition[] $definitions
+   *   The plugin definitions whose values to merge.
+   *
+   * @return array
+   *   List of merged values for the given plugin definition method.
+   */
+  protected function mergeDefinitionValues(string $get_method, array $definitions): array {
+    assert(method_exists(CKEditor5PluginDefinition::class, $get_method));
+    $has_method = 'has' . substr($get_method, 3);
+    assert(method_exists(CKEditor5PluginDefinition::class, $has_method));
+    $per_plugin = array_filter(array_map(function (CKEditor5PluginDefinition $definition) use ($get_method, $has_method) {
+      if ($definition->$has_method()) {
+        return $definition->$get_method();
+      }
+    }, $definitions));
+    return array_reduce($per_plugin, function (array $result, $current): array {
+      return is_array($current) && is_array(reset($current))
+        // Merge nested arrays using their keys.
+        ? $result + $current
+        // Merge everything else by appending.
+        : array_merge($result, (array) $current);
+    }, []);
+  }
+
+  /**
+   * Checks whether a plugin must be disabled due to unmet conditions.
+   *
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface $plugin
+   *   A CKEditor 5 plugin instance.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   *
+   * @return bool
+   *   Whether the plugin is disabled due to unmet conditions.
+   */
+  protected function isPluginDisabled(CKEditor5PluginInterface $plugin, EditorInterface $editor) : bool {
+    assert($plugin->getPluginDefinition()->hasConditions());
+    foreach ($plugin->getPluginDefinition()->getConditions() as $condition_type => $required_value) {
+      switch ($condition_type) {
+        case 'toolbarItem':
+          if (!in_array($required_value, $editor->getSettings()['toolbar']['items'])) {
+            return TRUE;
+          }
+          break;
+
+        case 'imageUploadStatus':
+          $image_upload_status = $editor->getImageUploadSettings()['status'] ?? FALSE;
+          if (!$image_upload_status) {
+            return TRUE;
+          }
+          break;
+
+        case 'filter':
+          $filters = $editor->getFilterFormat()->filters();
+          assert($filters instanceof FilterPluginCollection);
+          if (!$filters->has($required_value) || !$filters->get($required_value)->status) {
+            return TRUE;
+          }
+          break;
+      }
+    }
+
+    return FALSE;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5PluginManagerInterface.php b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginManagerInterface.php
new file mode 100644
index 0000000000..0f2b89068c
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/CKEditor5PluginManagerInterface.php
@@ -0,0 +1,119 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin;
+
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Drupal\editor\EditorInterface;
+
+/**
+ * Provides the interface for a plugin manager of CKEditor 5 plugins.
+ *
+ * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface
+ * @see \Drupal\ckeditor5\Annotation\CKEditor5Plugin
+ * @see plugin_api
+ */
+interface CKEditor5PluginManagerInterface extends DiscoveryInterface {
+
+  /**
+   * Returns a CKEditor 5 plugin with configuration from the editor.
+   *
+   * @param string $plugin_id
+   *   The plugin ID.
+   * @param \Drupal\editor\EditorInterface|null $editor
+   *   The editor to load configuration from.
+   *
+   * @return \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface
+   *   The CKEditor 5 plugin instance.
+   */
+  public function getPlugin(string $plugin_id, ?EditorInterface $editor): CKEditor5PluginInterface;
+
+  /**
+   * Gets a list of all toolbar items.
+   *
+   * @return string[]
+   *   List of all toolbar items provided by plugins.
+   */
+  public function getToolbarItems(): array;
+
+  /**
+   * Gets a list of all admin library names.
+   *
+   * @return string[]
+   *   List of all admin libraries provided by plugins.
+   */
+  public function getAdminLibraries(): array;
+
+  /**
+   * Gets a list of libraries required for the editor.
+   *
+   * This list is filtered by enabled plugins because it is needed at runtime.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   *
+   * @return string[]
+   *   The list of enabled libraries.
+   */
+  public function getEnabledLibraries(EditorInterface $editor): array;
+
+  /**
+   * Filter list of definitions by enabled plugins only.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   *
+   * @return array
+   *   Enabled plugin definitions.
+   */
+  public function getEnabledDefinitions(EditorInterface $editor): array;
+
+  /**
+   * Searches for CKEditor 5 plugin that supports a given tag.
+   *
+   * @param string $tag
+   *   The HTML tag to be searched for within plugin definitions.
+   *
+   * @return string|null
+   *   The ID of the plugin that supports the given tag.
+   */
+  public function findPluginSupportingElement(string $tag): ?string;
+
+  /**
+   * Gets the configuration for the CKEditor 5 plugins enabled in this editor.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   *
+   * @return array[]
+   *   An array with two key-value pairs:
+   *   1. 'plugins' lists all plugins to load
+   *   2. 'config' lists the configuration for all these plugins.
+   *
+   * @see https://ckeditor.com/docs/ckeditor5/latest/api/module_editor-classic_classiceditor-ClassicEditor.html
+   *
+   * @see \Drupal\ckeditor5\Plugin\Editor\CKEditor5::getJSSettings()
+   */
+  public function getCKEditor5PluginConfig(EditorInterface $editor): array;
+
+  /**
+   * Create a list of elements with attributes declared for the CKEditor5 build.
+   *
+   * @param string[] $plugin_ids
+   *   An array of plugin IDs.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   * @param bool $retain_wildcard
+   *   If TRUE, the returned array will include config for wildcard elements
+   *   such as `<$block>`.
+   *
+   * @return array
+   *   A nested array with a structure as described in
+   *   \Drupal\filter\Plugin\FilterInterface::getHTMLRestrictions().
+   *
+   * @see \Drupal\filter\Plugin\FilterInterface::getHTMLRestrictions()
+   */
+  public function getProvidedElements(array $plugin_ids = [], EditorInterface $editor = NULL, bool $retain_wildcard = FALSE): array;
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Editor/CKEditor5.php b/core/modules/ckeditor5/src/Plugin/Editor/CKEditor5.php
new file mode 100644
index 0000000000..07a7391894
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Editor/CKEditor5.php
@@ -0,0 +1,874 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Editor;
+
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\ckeditor5\Plugin\CKEditor5Plugin\Heading;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface;
+use Drupal\Component\Serialization\Json;
+use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Config\Schema\SchemaCheckTrait;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\SubformState;
+use Drupal\Core\Form\SubformStateInterface;
+use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\ckeditor5\SmartDefaultSettings;
+use Drupal\editor\EditorInterface;
+use Drupal\editor\Entity\Editor;
+use Drupal\editor\Plugin\EditorBase;
+use Drupal\filter\FilterFormatInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Validator\ConstraintViolation;
+use Symfony\Component\Validator\ConstraintViolationListInterface;
+
+/**
+ * Defines a CKEditor 5-based text editor for Drupal.
+ *
+ * @Editor(
+ *   id = "ckeditor5",
+ *   label = @Translation("CKEditor 5"),
+ *   supports_content_filtering = TRUE,
+ *   supports_inline_editing = TRUE,
+ *   is_xss_safe = FALSE,
+ *   supported_element_types = {
+ *     "textarea"
+ *   }
+ * )
+ */
+class CKEditor5 extends EditorBase implements ContainerFactoryPluginInterface {
+
+  use SchemaCheckTrait;
+
+  /**
+   * The CKEditor plugin manager.
+   *
+   * @var \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface
+   */
+  protected $ckeditor5PluginManager;
+
+  /**
+   * The language manager.
+   *
+   * @var \Drupal\Core\Language\LanguageManagerInterface
+   */
+  protected $languageManager;
+
+  /**
+   * The module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * Smart default settings utility.
+   *
+   * @var \Drupal\ckeditor5\SmartDefaultSettings
+   */
+  protected $smartDefaultSettings;
+
+  /**
+   * The set of configured CKEditor 5 plugins.
+   *
+   * @var \Drupal\ckeditor5\Plugin\CKEditor5PluginInterface[]
+   */
+  private $plugins = [];
+
+  /**
+   * The submitted editor.
+   *
+   * @var \Drupal\editor\EditorInterface
+   */
+  private $submittedEditor;
+
+  /**
+   * The cache.
+   *
+   * @var \Drupal\Core\Cache\CacheBackendInterface
+   */
+  protected $cache;
+
+  /**
+   * Constructs a CKEditor5 editor plugin.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface $ckeditor5_plugin_manager
+   *   The CKEditor5 plugin manager.
+   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
+   *   The language manager
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler.
+   * @param \Drupal\ckeditor5\SmartDefaultSettings $smart_default_settings
+   *   The smart default settings utility.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache
+   *   The cache.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, CKEditor5PluginManagerInterface $ckeditor5_plugin_manager, LanguageManagerInterface $language_manager, ModuleHandlerInterface $module_handler, SmartDefaultSettings $smart_default_settings, CacheBackendInterface $cache) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->ckeditor5PluginManager = $ckeditor5_plugin_manager;
+    $this->languageManager = $language_manager;
+    $this->moduleHandler = $module_handler;
+    $this->smartDefaultSettings = $smart_default_settings;
+    $this->cache = $cache;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('plugin.manager.ckeditor5.plugin'),
+      $container->get('language_manager'),
+      $container->get('module_handler'),
+      $container->get('ckeditor5.smart_default_settings'),
+      $container->get('cache.default')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultSettings() {
+    return [
+      'toolbar' => [
+        'items' => ['heading', 'bold', 'italic'],
+      ],
+      'plugins' => [
+        'ckeditor5_heading' => Heading::DEFAULT_CONFIGURATION,
+      ],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, FormStateInterface $form_state, Editor $editor) {
+  }
+
+  /**
+   * Validates a Text Editor + Text Format pair.
+   *
+   * Drupal is designed to only verify schema conformity (and validation) of
+   * individual config entities. The Text Editor module layers a tightly coupled
+   * Editor entity on top of the Filter module's FilterFormat config entity.
+   * This inextricable coupling is clearly visible in EditorInterface:
+   * \Drupal\editor\EditorInterface::getFilterFormat(). They are always paired.
+   * Because not every text editor is guaranteed to be compatible with every
+   * text format, the pair must be validated.
+   *
+   * @param \Drupal\editor\EditorInterface $text_editor
+   *   The paired text editor to validate.
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   The paired text format to validate.
+   * @param bool $all_compatibility_problems
+   *   Get all compatibility problems (default) or only fundamental ones.
+   *
+   * @return \Symfony\Component\Validator\ConstraintViolationListInterface
+   *   The validation constraint violations.
+   *
+   * @see \Drupal\editor\EditorInterface::getFilterFormat()
+   * @see ckeditor5.pair.schema.yml
+   */
+  public static function validatePair(EditorInterface $text_editor, FilterFormatInterface $text_format, bool $all_compatibility_problems = TRUE) : ConstraintViolationListInterface {
+    if ($text_editor->getEditor() !== 'ckeditor5') {
+      throw new \DomainException('This text editor is not configured to use CKEditor 5.');
+    }
+
+    $typed_config_manager = \Drupal::getContainer()->get('config.typed');
+    $typed_config = $typed_config_manager->createFromNameAndData(
+      'ckeditor5_valid_pair__format_and_editor',
+      [
+        // A mix of:
+        // - editor.editor.*.settings — note that "settings" is top-level in
+        //   editor.editor.*, and so it is here, so all validation constraints
+        //   will continue to work fine.
+        'settings' => $text_editor->toArray()['settings'],
+        // - filter.format.*.filters — note that "filters" is top-level in
+        //   filter.format.*, and so it is here, so all validation constraints
+        //   will continue to work fine.
+        'filters' => $text_format->toArray()['filters'],
+        // - editor.editor.*.image_upload — note that "image_upload" is
+        //   top-level in editor.editor.*, and so it is here, so all validation
+        //   constraints will continue to work fine.
+        'image_upload' => $text_editor->toArray()['image_upload'],
+      ]
+    );
+    $violations = $typed_config->validate();
+
+    // Only consider validation constraint violations covering the pair, so not
+    // irrelevant details such as a PrimitiveTypeConstraint being somewhere in
+    // filter settings.
+    foreach ($violations as $i => $violation) {
+      assert($violation instanceof ConstraintViolation);
+      if (strpos(get_class($violation->getConstraint()), 'Drupal\\ckeditor5\\') === 0) {
+        continue;
+      }
+      $violations->remove($i);
+    }
+
+    if (!$all_compatibility_problems) {
+      foreach ($violations as $i => $violation) {
+        // Remove all violations that are not fundamental — these are at the
+        // root (property path '').
+        if ($violation->getPropertyPath() !== '') {
+          $violations->remove($i);
+        }
+      }
+    }
+
+    return $violations;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $editor = $form_state->get('editor');
+    assert($editor instanceof Editor);
+    $language = $this->languageManager->getCurrentLanguage();
+
+    // When enabling CKEditor 5, generate sensible settings from the
+    // pre-existing text editor/format rather than the hardcoded defaults
+    // whenever possible.
+    // @todo Remove after https://www.drupal.org/project/drupal/issues/3226673.
+    $format = $form_state->getFormObject()->getEntity();
+    assert($format instanceof FilterFormatInterface);
+    if ($editor->isNew() && !$form_state->get('ckeditor5_is_active') && $form_state->get('ckeditor5_is_selected')) {
+      assert($editor->getSettings() === $this->getDefaultSettings());
+      if (!$format->isNew()) {
+        $editor = $this->smartDefaultSettings->computeSmartDefaultSettings($editor, $format);
+      }
+      // @todo In https://www.drupal.org/project/ckeditor5/issues/3226694 this
+      //   should ensure the appropriate messages get printed.
+      $eventual_editor_and_format = $this->getEventualEditorWithPrimedFilterFormat($form_state, $editor);
+      // Provide the validated eventual pair in form state to
+      // ::getGeneratedAllowedHtmlValue(), to update filter_html's
+      // "allowed_html".
+      $form_state->set('ckeditor5_validated_pair', $eventual_editor_and_format);
+    }
+
+    $form['toolbar'] = [
+      '#type' => 'container',
+      '#title' => $this->t('CKEditor 5 toolbar configuration'),
+      '#theme' => 'ckeditor5_settings_toolbar',
+      '#attached' => [
+        'library' => $this->ckeditor5PluginManager->getAdminLibraries(),
+        'drupalSettings' => [
+          'ckeditor5' => [
+            'language' => [
+              'dir' => $language->getDirection(),
+              'langcode' => $language->getId(),
+            ],
+          ],
+        ],
+      ],
+    ];
+
+    $form['available_items_description'] = [
+      '#type' => 'container',
+      '#markup' => $this->t('Press the down arrow key to add to the toolbar.'),
+      '#id' => 'available-button-description',
+      '#attributes' => [
+        'class' => ['visually-hidden'],
+      ],
+    ];
+
+    $form['active_items_description'] = [
+      '#type' => 'container',
+      '#markup' => $this->t('Move this button in the toolbar by pressing the left or right arrow keys. Press the up arrow key to remove from the toolbar.'),
+      '#id' => 'active-button-description',
+      '#attributes' => [
+        'class' => ['visually-hidden'],
+      ],
+    ];
+
+    // The items are encoded in markup to provide a no-JS fallback.
+    // Although CKEditor 5 is useless without JS it would still be possible
+    // to see all the available toolbar items provided by plugins in the format
+    // that needs to be entered in the textarea. The UI app parses this list.
+    $form['toolbar']['available'] = [
+      '#type' => 'container',
+      '#title' => 'Available items',
+      '#id' => 'ckeditor5-toolbar-buttons-available',
+      'available_items' => [
+        '#markup' => Json::encode($this->ckeditor5PluginManager->getToolbarItems()),
+      ],
+    ];
+
+    $editor_settings = $editor->getSettings();
+    // This form field requires a JSON-style array of valid toolbar items.
+    // e.g. ["bold","italic","|","uploadImage"].
+    // CKEditor 5 config for toolbar items takes an array of strings which
+    // correspond to the keys under toolbar_items in a plugin yml or annotation.
+    // @see https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/toolbar.html
+    $form['toolbar']['items'] = [
+      '#type' => 'textarea',
+      '#title' => $this->t('Toolbar items'),
+      '#rows' => 1,
+      '#default_value' => Json::encode($editor_settings['toolbar']['items']),
+      '#id' => 'ckeditor5-toolbar-buttons-selected',
+      '#attributes' => [
+        'tabindex' => '-1',
+        'aria-hidden' => 'true',
+      ],
+    ];
+
+    $form['plugin_settings'] = [
+      '#type' => 'vertical_tabs',
+      '#title' => $this->t('CKEditor5 plugin settings'),
+      '#id' => 'ckeditor5-plugin-settings',
+    ];
+
+    $this->injectPluginSettingsForm($form, $form_state, $editor);
+
+    // Allow reliable detection of switching to CKEditor 5 from another text
+    // editor (or none at all).
+    $form['is_already_using_ckeditor5'] = [
+      '#type' => 'hidden',
+      '#default_value' => TRUE,
+    ];
+
+    return $form;
+  }
+
+  /**
+   * Determines whether the plugin settings form should be visible.
+   *
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition $definition
+   *   The configurable CKEditor 5 plugin to assess the visibility for.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   *
+   * @return bool
+   *   Whether this configurable plugin's settings form should be visible.
+   */
+  private function shouldHaveVisiblePluginSettingsForm(CKEditor5PluginDefinition $definition, EditorInterface $editor): bool {
+    assert($definition->isConfigurable());
+    $enabled_plugins = $this->ckeditor5PluginManager->getEnabledDefinitions($editor);
+
+    $plugin_id = $definition->id();
+
+    // Enabled plugins should be configurable.
+    if (isset($enabled_plugins[$plugin_id])) {
+      return TRUE;
+    }
+
+    // There are two circumstances where a plugin not listed in $enabled_plugins
+    // due to isEnabled() returning false, that should still have its config
+    // form provided:
+    // 1 - A conditionally enabled plugin that does not depend on a toolbar item
+    // to be active.
+    // 2 - A conditionally enabled plugin that does depend on a toolbar item,
+    // and that toolbar item is active.
+    if ($definition->hasConditions()) {
+      $conditions = $definition->getConditions();
+      if (!array_key_exists('toolbarItem', $conditions)) {
+        return TRUE;
+      }
+      elseif (in_array($conditions['toolbarItem'], $editor->getSettings()['toolbar']['items'], TRUE)) {
+        return TRUE;
+      }
+    }
+
+    return FALSE;
+  }
+
+  /**
+   * Injects the CKEditor plugins settings forms as a vertical tabs subform.
+   *
+   * @param array &$form
+   *   A reference to an associative array containing the structure of the form.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   A configured text editor object.
+   */
+  private function injectPluginSettingsForm(array &$form, FormStateInterface $form_state, EditorInterface $editor): void {
+    $definitions = $this->ckeditor5PluginManager->getDefinitions();
+    $eventual_editor_and_format = $this->getEventualEditorWithPrimedFilterFormat($form_state, $editor);
+
+    foreach ($definitions as $plugin_id => $definition) {
+      if ($definition->isConfigurable() && $this->shouldHaveVisiblePluginSettingsForm($definition, $eventual_editor_and_format)) {
+        $plugin = $this->ckeditor5PluginManager->getPlugin($plugin_id, $editor);
+        $plugin_settings_form = [];
+        $form['plugins'][$plugin_id] = [
+          '#type' => 'details',
+          '#title' => $definition->label(),
+          '#open' => TRUE,
+          '#group' => 'editor][settings][plugin_settings',
+          '#attributes' => [
+            'data-ckeditor5-plugin-id' => $plugin_id,
+          ],
+        ];
+        $form['plugins'][$plugin_id] += $plugin->buildConfigurationForm($plugin_settings_form, $form_state);
+      }
+    }
+  }
+
+  /**
+   * Form #after_build callback: provides text editor state changes.
+   *
+   * Updates the internal $this->entity object with submitted values when the
+   * form is being rebuilt (e.g. submitted via AJAX), so that subsequent
+   * processing (e.g. AJAX callbacks) can rely on it.
+   *
+   * @see \Drupal\Core\Entity\EntityForm::afterBuild()
+   */
+  public static function assessActiveTextEditorAfterBuild(array $element, FormStateInterface $form_state): array {
+    // The case of the form being built initially, and the text editor plugin in
+    // use is already CKEditor 5.
+    if (!$form_state->isProcessingInput()) {
+      $editor = $form_state->get('editor');
+      $already_using_ckeditor5 = $editor && $editor->getEditor() === 'ckeditor5';
+    }
+    else {
+      // Whenever there is user input, this cannot be the initial build of the
+      // form and hence we need to inspect user input.
+      $already_using_ckeditor5 = FALSE;
+      NestedArray::getValue($form_state->getUserInput(), ['editor', 'settings', 'is_already_using_ckeditor5'], $already_using_ckeditor5);
+    }
+
+    $form_state->set('ckeditor5_is_active', $already_using_ckeditor5);
+    $form_state->set('ckeditor5_is_selected', $form_state->getValue(['editor', 'editor']) === 'ckeditor5');
+    return $element;
+  }
+
+  /**
+   * Validate callback to inform the user of CKEditor 5 compatibility problems.
+   */
+  public static function validateSwitchingToCKEditor5(array $form, FormStateInterface $form_state): void {
+    if (!$form_state->get('ckeditor5_is_active') && $form_state->get('ckeditor5_is_selected')) {
+      $minimal_ckeditor5_editor = Editor::create([
+        'format' => NULL,
+        'editor' => 'ckeditor5',
+      ]);
+      $submitted_filter_format = CKEditor5::getSubmittedFilterFormat($form_state);
+      $fundamental_incompatibilities = CKEditor5::validatePair($minimal_ckeditor5_editor, $submitted_filter_format, FALSE);
+      foreach ($fundamental_incompatibilities as $violation) {
+        // @codingStandardsIgnoreLine
+        $form_state->setErrorByName('editor][editor', t($violation->getMessageTemplate(), $violation->getParameters()));
+      }
+    }
+  }
+
+  /**
+   * Value callback to set the CKEditor 5-generated "allowed_html" value.
+   *
+   * Used to set the value of filter_html's "allowed_html" form item if the form
+   * has been validated and hence `ckeditor5_validated_pair` is available
+   * in form state. This allows setting a guaranteed to be valid value.
+   *
+   * `ckeditor5_validated_pair` can be set from two places:
+   * - When switching to CKEditor 5, this is populated by
+   *   CKEditor5::buildConfigurationForm().
+   * - When making filter or editor settings changes, it is populated by
+   *  CKEditor5::validateConfigurationForm().
+   *
+   * @param array $element
+   *   An associative array containing the properties of the element.
+   * @param mixed $input
+   *   The incoming input to populate the form element. If this is FALSE,
+   *   the element's default value should be returned.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   *
+   * @return string
+   *   The value to assign to the element.
+   */
+  public static function getGeneratedAllowedHtmlValue(array &$element, $input, FormStateInterface $form_state): string {
+    if ($form_state->isValidationComplete()) {
+      $validated_format = $form_state->get('ckeditor5_validated_pair')->getFilterFormat();
+      $configuration = $validated_format->filters()->get('filter_html')->getConfiguration();
+      return $configuration['settings']['allowed_html'];
+    }
+    else {
+      if ($input !== FALSE) {
+        return $input;
+      }
+      return $element['#default_value'];
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $json = $form_state->getValue(['toolbar', 'items']);
+    $toolbar_items = Json::decode($json);
+
+    // This basic validation must live in the form logic because it can only
+    // occur in a form context.
+    if (!$toolbar_items) {
+      $form_state->setErrorByName('toolbar][items', $this->t('Invalid toolbar value.'));
+      return;
+    }
+
+    // Construct a Text Editor config entity with the submitted values for
+    // validation. Do this on a clone: do not manipulate form state.
+    $submitted_editor = clone $form_state->get('editor');
+    $settings = $submitted_editor->getSettings();
+    // Update settings first to match the submitted toolbar items. This is
+    // necessary for ::shouldHaveVisiblePluginSettingsForm() to work.
+    $settings['toolbar']['items'] = $toolbar_items;
+    $submitted_editor->setSettings($settings);
+    $eventual_editor_and_format_for_plugin_settings_visibility = $this->getEventualEditorWithPrimedFilterFormat($form_state, $submitted_editor);
+    $settings['plugins'] = [];
+    foreach ($this->ckeditor5PluginManager->getDefinitions() as $plugin_id => $definition) {
+      if (!$definition->isConfigurable()) {
+        continue;
+      }
+      if ($form_state->hasValue(['plugins', $plugin_id])) {
+        // Create a fresh instance of this CKEditor 5 plugin, not tied to a text
+        // editor configuration entity.
+        $plugin = $this->ckeditor5PluginManager->getPlugin($plugin_id, NULL);
+
+        $subform = $form['plugins'][$plugin_id];
+        $subform_state = SubformState::createForSubform($subform, $form, $form_state);
+        $plugin->validateConfigurationForm($subform, $subform_state);
+        $plugin->submitConfigurationForm($subform, $subform_state);
+
+        // Populate $settings, to populate $submitted_editor.
+        $settings['plugins'][$plugin_id] = $plugin->getConfiguration();
+      }
+      // @see \Drupal\ckeditor5\Plugin\Editor\CKEditor5::injectPluginSettingsForm()
+      elseif ($this->shouldHaveVisiblePluginSettingsForm($definition, $eventual_editor_and_format_for_plugin_settings_visibility)) {
+        $plugin = $this->ckeditor5PluginManager->getPlugin($plugin_id, NULL);
+        $default_configuration = $plugin->defaultConfiguration();
+        if (!empty($default_configuration)) {
+          $settings['plugins'][$plugin_id] = $default_configuration;
+        }
+      }
+    }
+    // All plugin settings have been collected, including defaults that depend
+    // on visibility. Store the collected settings, throw away the interim state
+    // that allowed determining which defaults to add.
+    unset($eventual_editor_and_format_for_plugin_settings_visibility);
+    $submitted_editor->setSettings($settings);
+
+    // Validate the text editor + text format pair.
+    // Note that the eventual pair is computed and validated, not the received
+    // pair: if the filter_html filter is in use, the CKEditor 5 configuration
+    // dictates the filter_html's filter plugin's "allowed_html" setting.
+    // @see ckeditor5_form_filter_format_form_alter()
+    // @see ::getGeneratedAllowedHtmlValue()
+    $eventual_editor_and_format = $this->getEventualEditorWithPrimedFilterFormat($form_state, $submitted_editor);
+    $violations = CKEditor5::validatePair($eventual_editor_and_format, $eventual_editor_and_format->getFilterFormat());
+    foreach ($violations as $violation) {
+      $form_item_name = static::mapPairViolationPropertyPathsToFormNames($violation->getPropertyPath(), $form);
+      // When adding a toolbar item, it is possible that not all conditions for
+      // using it have been met yet. FormBuilder refuses to rebuild forms when a
+      // validation error is present. But to meet the condition for the toolbar
+      // item, configuration must be set in a vertical tab that must still
+      // appear. Work-around: reduce the validation error to a warning message.
+      // @see \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemConditionsMetConstraintValidator
+      if ($form_state->isRedirectDisabled() && $form_item_name === 'editor][toolbar][items') {
+        $this->messenger()->addWarning($violation->getMessage());
+        continue;
+      }
+      $form_state->getCompleteFormState()->setErrorByName($form_item_name, $violation->getMessage());
+    }
+
+    // Pass it on to ::submitConfigurationForm().
+    $form_state->get('editor')->setSettings($settings);
+
+    // Provide the validated eventual pair in form state to
+    // ::getGeneratedAllowedHtmlValue(), to update filter_html's
+    // "allowed_html".
+    $form_state->set('ckeditor5_validated_pair', $eventual_editor_and_format);
+
+    assert(TRUE === $this->checkConfigSchema(\Drupal::getContainer()->get('config.typed'), 'editor.editor.id_does_not_matter', $submitted_editor->toArray()), 'Schema errors: ' . print_r($this->checkConfigSchema(\Drupal::getContainer()->get('config.typed'), 'editor.editor.id_does_not_matter', $submitted_editor->toArray()), TRUE));
+  }
+
+  /**
+   * Gets the submitted text format config entity from form state.
+   *
+   * Needed for validation.
+   *
+   * @param \Drupal\Core\Form\FormStateInterface $filter_format_form_state
+   *   The text format configuration form's form state.
+   *
+   * @return \Drupal\filter\FilterFormatInterface
+   *   A FilterFormat config entity representing the current filter form state.
+   */
+  protected static function getSubmittedFilterFormat(FormStateInterface $filter_format_form_state): FilterFormatInterface {
+    $submitted_filter_format = clone $filter_format_form_state->getFormObject()->getEntity();
+    assert($submitted_filter_format instanceof FilterFormatInterface);
+
+    // Get only the values of the filter_format form state that are relevant for
+    // checking compatibility. This logic is copied from FilterFormatFormBase.
+    // @see \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraintValidator
+    // @see \Drupal\filter\FilterFormatFormBase::submitForm()
+    $filter_format_form_values = array_intersect_key(
+      $filter_format_form_state->getValues(),
+      array_flip(['filters', 'filter_settings']
+    ));
+    foreach ($filter_format_form_values as $key => $value) {
+      if ($key !== 'filters') {
+        $submitted_filter_format->set($key, $value);
+      }
+      else {
+        foreach ($value as $instance_id => $config) {
+          $submitted_filter_format->setFilterConfig($instance_id, $config);
+        }
+      }
+    }
+
+    return $submitted_filter_format;
+  }
+
+  /**
+   * Gets the eventual text format config entity: from form state + editor.
+   *
+   * Needed for validation.
+   *
+   * @param \Drupal\Core\Form\SubformStateInterface $editor_form_state
+   *   The text editor configuration form's form state.
+   * @param \Drupal\editor\EditorInterface $submitted_editor
+   *   The current text editor config entity.
+   *
+   * @return \Drupal\editor\EditorInterface
+   *   A clone of the received Editor config entity , with a primed associated
+   *   FilterFormat that corresponds to the current form state, to avoid the
+   *   stored FilterFormat config entity being loaded.
+   */
+  protected function getEventualEditorWithPrimedFilterFormat(SubformStateInterface $editor_form_state, EditorInterface $submitted_editor): EditorInterface {
+    $submitted_filter_format = static::getSubmittedFilterFormat($editor_form_state->getCompleteFormState());
+
+    $pair = static::createEphemeralPairedEditor($submitted_editor, $submitted_filter_format);
+
+    if ($pair->getFilterFormat()->filters('filter_html')->status) {
+      // Compute elements provided by the current CKEditor 5 settings.
+      $enabled_plugins = array_keys($this->ckeditor5PluginManager->getEnabledDefinitions($pair));
+      $elements = $this->ckeditor5PluginManager->getProvidedElements($enabled_plugins, $pair);
+
+      // Compute eventual filter_html setting. Eventual as in: this is the list
+      // of eventually allowed HTML tags.
+      // @see \Drupal\filter\FilterFormatFormBase::submitForm()
+      // @see ckeditor5_form_filter_format_form_alter()
+      $allowed_html = implode(' ', HTMLRestrictionsUtilities::toReadableElements($elements));
+      $filter_html_config = $pair->getFilterFormat()->filters('filter_html')->getConfiguration();
+      $filter_html_config['settings']['allowed_html'] = $allowed_html;
+      $pair->getFilterFormat()->setFilterConfig('filter_html', $filter_html_config);
+    }
+
+    return $pair;
+  }
+
+  /**
+   * Creates an ephemeral pair of text editor + text format config entity.
+   *
+   * Clones the given text editor config entity object and then overwrites its
+   * $filterFormat property, to prevent loading the text format config entity
+   * from entity storage in calls to Editor::hasAssociatedFilterFormat() and
+   * Editor::getFilterFormat().
+   * This is necessary to be able to evaluate unsaved text editor and format
+   * config entities:
+   * - for assessing which CKEditor 5 plugins are enabled and whose settings
+   *   forms to show
+   * - for validating them.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   The submitted text editor config entity, constructed from form values.
+   * @param \Drupal\filter\FilterFormatInterface $filter_format
+   *   The submitted text format config entity, constructed from form values.
+   *
+   * @return \Drupal\editor\EditorInterface
+   *   A clone of the given text editor config entity, with its $filterFormat
+   *   property set to a clone of the given text format config entity.
+   *
+   * @throws \ReflectionException
+   *
+   * @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManager::isPluginDisabled()
+   * @todo Remove this in https://www.drupal.org/project/drupal/issues/3231347
+   */
+  protected static function createEphemeralPairedEditor(EditorInterface $editor, FilterFormatInterface $filter_format): EditorInterface {
+    $paired_editor = clone $editor;
+    $reflector = new \ReflectionObject($paired_editor);
+    $property = $reflector->getProperty('filterFormat');
+    $property->setAccessible(TRUE);
+    $property->setValue($paired_editor, clone $filter_format);
+    return $paired_editor;
+  }
+
+  /**
+   * Maps Text Editor config object property paths to form names.
+   *
+   * @param string $property_path
+   *   A config object property path.
+   * @param array $subform
+   *   The subform being checked.
+   *
+   * @return string
+   *   The corresponding form name in the subform.
+   */
+  protected static function mapViolationPropertyPathsToFormNames(string $property_path, array $subform) : string {
+    $parts = explode('.', $property_path);
+    // The "settings" form element does exist, but one level above the Text
+    // Editor-specific form. This is operating on a subform.
+    $shifted = array_shift($parts);
+    assert($shifted === 'settings');
+
+    // It is not required (nor sensible) for the form structure to match the
+    // config schema structure 1:1. Automatically identify the relevant form
+    // name. Try to be specific. Worst case, an entire plugin settings vertical
+    // tab is targeted. (Hence the minimum of 2 parts: the property path gets at
+    // minimum mapped to 'toolbar.items' or 'plugins.<plugin ID>'.)
+    while (count($parts) > 2 && !NestedArray::keyExists($subform, $parts)) {
+      array_pop($parts);
+    }
+    assert(NestedArray::keyExists($subform, $parts));
+    return implode('][', $parts);
+  }
+
+  /**
+   * Maps Text Editor + Text Format pair property paths to form names.
+   *
+   * @param string $property_path
+   *   A config object property path.
+   * @param array $form
+   *   The form being checked.
+   *
+   * @return string
+   *   The corresponding form name in the complete form.
+   */
+  protected static function mapPairViolationPropertyPathsToFormNames(string $property_path, array $form) : string {
+    // Fundamental compatibility errors are at the root. Map these to the text
+    // editor plugin dropdown.
+    if ($property_path === '') {
+      return 'editor][editor';
+    }
+
+    // Filters are top-level.
+    if (preg_match('/^filters\..*/', $property_path)) {
+      return implode('][', array_merge(explode('.', $property_path), ['settings']));
+    }
+
+    // Everything else is in the subform.
+    return 'editor][' . static::mapViolationPropertyPathsToFormNames($property_path, $form);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    // @see ::validateConfigurationForm()
+    $editor = $form_state->get('editor');
+
+    // Prepare the editor settings for editor_form_filter_admin_format_submit().
+    // This strips away unwanted form values too, because those never can exist
+    // in the already validated Editor config entity.
+    $form_state->setValues($editor->getSettings());
+
+    parent::submitConfigurationForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getJSSettings(Editor $editor) {
+    $toolbar_items = $editor->getSettings()['toolbar']['items'];
+    $plugin_config = $this->ckeditor5PluginManager->getCKEditor5PluginConfig($editor);
+
+    $settings = [
+      'toolbar' => [
+        'items' => $toolbar_items,
+        'shouldNotGroupWhenFull' => in_array('-', $toolbar_items, TRUE),
+      ],
+    ] + $plugin_config;
+
+    if ($this->moduleHandler->moduleExists('locale')) {
+      $ui_langcode = 'en';
+      $ckeditor_langcodes = $this->getLangcodes();
+      $language_interface = $this->languageManager->getCurrentLanguage();
+      if (isset($ckeditor_langcodes[$language_interface->getId()])) {
+        $ui_langcode = $ckeditor_langcodes[$language_interface->getId()];
+      }
+      $settings['language']['ui'] = $ui_langcode;
+    }
+
+    return $settings;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getLibraries(Editor $editor) {
+    $plugin_libraries = $this->ckeditor5PluginManager->getEnabledLibraries($editor);
+
+    if ($this->moduleHandler->moduleExists('locale')) {
+      $ui_langcode = 'en';
+      $ckeditor_langcodes = $this->getLangcodes();
+      $language_interface = $this->languageManager->getCurrentLanguage();
+      if (isset($ckeditor_langcodes[$language_interface->getId()])) {
+        $ui_langcode = $ckeditor_langcodes[$language_interface->getId()];
+      }
+      $plugin_libraries[] = 'core/ckeditor5.translations.' . $ui_langcode;
+    }
+
+    return $plugin_libraries;
+  }
+
+  /**
+   * Returns a list of language codes supported by CKEditor 5.
+   *
+   * @return array
+   *   An associative array keyed by language codes.
+   */
+  protected function getLangcodes(): array {
+    // Cache the file system based language list calculation because this would
+    // be expensive to calculate all the time. The cache is cleared on core
+    // upgrades which is the only situation the CKEditor file listing should
+    // change.
+    $langcode_cache = $this->cache->get('ckeditor5.langcodes');
+    if (!empty($langcode_cache)) {
+      $langcodes = $langcode_cache->data;
+    }
+    if (empty($langcodes)) {
+      $langcodes = [];
+      // Collect languages included with CKEditor 5 based on file listing.
+      $files = scandir('core/assets/vendor/ckeditor5/build/translations');
+      foreach ($files as $file) {
+        if ($file[0] !== '.' && preg_match('/\.js$/', $file)) {
+          $langcode = basename($file, '.js');
+          $langcodes[$langcode] = $langcode;
+        }
+      }
+      $this->cache->set('ckeditor5.langcodes', $langcodes);
+    }
+
+    // Get language mapping if available to map to Drupal language codes.
+    // This is configurable in the user interface and not expensive to get, so
+    // we don't include it in the cached language list.
+    $language_mappings = $this->moduleHandler->moduleExists('language') ? language_get_browser_drupal_langcode_mappings() : [];
+    foreach ($langcodes as $langcode) {
+      // If this language code is available in a Drupal mapping, use that to
+      // compute a possibility for matching from the Drupal langcode to the
+      // CKEditor langcode.
+      // For instance, CKEditor uses the langcode 'no' for Norwegian, Drupal
+      // uses 'nb'. This would then remove the 'no' => 'no' mapping and replace
+      // it with 'nb' => 'no'. Now Drupal knows which CKEditor translation to
+      // load.
+      if (isset($language_mappings[$langcode]) && !isset($langcodes[$language_mappings[$langcode]])) {
+        $langcodes[$language_mappings[$langcode]] = $langcode;
+        unset($langcodes[$langcode]);
+      }
+    }
+
+    return $langcodes;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraint.php
new file mode 100644
index 0000000000..b9c3dc6062
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraint.php
@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * CKEditor 5 element.
+ *
+ * @Constraint(
+ *   id = "CKEditor5Element",
+ *   label = @Translation("CKEditor 5 element", context = "Validation"),
+ * )
+ */
+class CKEditor5ElementConstraint extends Constraint {
+
+  /**
+   * The default violation message.
+   *
+   * @var string
+   */
+  public $message = 'The following tag is not valid HTML: %provided_element.';
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraintValidator.php
new file mode 100644
index 0000000000..90cf5d02cd
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/CKEditor5ElementConstraintValidator.php
@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\Component\Utility\Html;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * CKEditor 5 element validator.
+ */
+class CKEditor5ElementConstraintValidator extends ConstraintValidator {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($element, $constraint) {
+    if (!$constraint instanceof CKEditor5ElementConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\CKEditor5Element');
+    }
+    $body_child_nodes = Html::load(str_replace('>', ' />', trim($element)))->getElementsByTagName('body')->item(0)->childNodes;
+
+    if ($body_child_nodes->count() !== 1 || $body_child_nodes->item(0)->nodeType !== XML_ELEMENT_NODE) {
+      $this->context->buildViolation($constraint->message)
+        ->setParameter('%provided_element', $element)
+        ->addViolation();
+    }
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/EnabledConfigurablePluginsConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/EnabledConfigurablePluginsConstraint.php
new file mode 100644
index 0000000000..53467a41ff
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/EnabledConfigurablePluginsConstraint.php
@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * The CKEditor 5 plugin settings.
+ *
+ * @Constraint(
+ *   id = "CKEditor5EnabledConfigurablePlugins",
+ *   label = @Translation("CKEditor 5 enabled configurable plugins", context = "Validation"),
+ * )
+ */
+class EnabledConfigurablePluginsConstraint extends Constraint {
+
+  /**
+   * The default violation message.
+   *
+   * @var string
+   */
+  public $message = 'Configuration for the enabled plugin "%plugin_label" (%plugin_id) is missing.';
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/EnabledConfigurablePluginsConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/EnabledConfigurablePluginsConstraintValidator.php
new file mode 100644
index 0000000000..4edc561533
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/EnabledConfigurablePluginsConstraintValidator.php
@@ -0,0 +1,73 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Enabled configurable plugin settings validator.
+ */
+class EnabledConfigurablePluginsConstraintValidator extends ConstraintValidator implements ContainerInjectionInterface {
+
+  use PluginManagerDependentValidatorTrait;
+  use TextEditorObjectDependentValidatorTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($settings, Constraint $constraint) {
+    if (!$constraint instanceof EnabledConfigurablePluginsConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\EnabledConfigurablePluginsConstraint');
+    }
+
+    $configurable_enabled_definitions = $this->getConfigurableEnabledDefinitions();
+    try {
+      $plugin_settings = $this->context->getRoot()->get('settings.plugins')->getValue();
+    }
+    catch (\InvalidArgumentException $e) {
+      $plugin_settings = [];
+    }
+
+    foreach ($configurable_enabled_definitions as $id => $definition) {
+      if ($definition->hasConditions() && isset($definition->getConditions()['imageUploadStatus']) && $definition->getConditions()['imageUploadStatus'] === TRUE) {
+        // This is the exception to the rule: this is a privileged plugin due to
+        // the Text Editor config entity's built-in image upload settings.
+        // @see \Drupal\editor\Entity\Editor::getImageUploadSettings()
+        // @see editor_image_upload_settings_form()
+        // @see \Drupal\ckeditor5\Plugin\CKEditor5Plugin\ImageUpload::buildConfigurationForm()
+        continue;
+      }
+
+      if (!isset($plugin_settings[$id]) || empty($plugin_settings[$id])) {
+        $this->context->buildViolation($constraint->message)
+          ->setParameter('%plugin_label', $definition->label())
+          ->setParameter('%plugin_id', $id)
+          ->atPath("plugins.$id")
+          ->addViolation();
+      }
+    }
+  }
+
+  /**
+   * Gets all configurable CKEditor 5 plugin definitions that are enabled.
+   *
+   * @return \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition[]
+   *   An array of enabled configurable CKEditor 5 plugin definitions.
+   */
+  private function getConfigurableEnabledDefinitions() : array {
+    $text_editor = $this->createTextEditorObjectFromContext();
+    $enabled_definitions = $this->pluginManager->getEnabledDefinitions($text_editor);
+    $configurable_enabled_definitions = array_filter($enabled_definitions, function (CKEditor5PluginDefinition $definition): bool {
+      return $definition->isConfigurable();
+    });
+
+    return $configurable_enabled_definitions;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraint.php
new file mode 100644
index 0000000000..2b70c32547
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraint.php
@@ -0,0 +1,54 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * The fundamental compatibility constraint.
+ *
+ * @Constraint(
+ *   id = "CKEditor5FundamentalCompatibility",
+ *   label = @Translation("CKEditor 5 fundamental text format compatibility", context = "Validation"),
+ * )
+ */
+class FundamentalCompatibilityConstraint extends Constraint {
+
+  /**
+   * The violation message when no markup filters are enabled.
+   *
+   * @var string
+   */
+  public $noMarkupFiltersMessage = 'CKEditor 5 only works with HTML-based text formats. The "%filter_label" (%filter_plugin_id) filter implies this text format is not HTML anymore.';
+
+  /**
+   * The violation message when fundamental HTML elements are forbidden.
+   *
+   * @var string
+   */
+  public $forbiddenElementsMessage = 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are forbidden by the "%filter_label" (%filter_plugin_id) filter.';
+
+  /**
+   * The violation message when fundamental HTML elements are not allowed.
+   *
+   * @var string
+   */
+  public $nonAllowedElementsMessage = 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are not allowed by the "%filter_label" (%filter_plugin_id) filter.';
+
+  /**
+   * The violation message when HTML elements cannot be generated by CKE5.
+   *
+   * @var string
+   */
+  public $notSupportedElementsMessage = 'The current CKEditor 5 build requires the following elements and attributes: <br><code>@list</code><br>The following elements are not supported: <br><code>@diff</code>';
+
+  /**
+   * The violation message when CKE5 can generate disallowed HTML elements.
+   *
+   * @var string
+   */
+  public $missingElementsMessage = 'The current CKEditor 5 build requires the following elements and attributes: <br><code>@list</code><br>The following elements are missing: <br><code>@diff</code>';
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraintValidator.php
new file mode 100644
index 0000000000..394153ce69
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraintValidator.php
@@ -0,0 +1,288 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\editor\EditorInterface;
+use Drupal\filter\FilterFormatInterface;
+use Drupal\filter\Plugin\FilterInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Validates fundamental compatibility of CKEditor 5 with the given text format.
+ *
+ * Fundamental requirements:
+ * 1. No TYPE_MARKUP_LANGUAGE filters allowed.
+ * 2. Fundamental CKEditor 5 plugins' HTML tags are allowed.
+ * 3. The HTML restrictions of all TYPE_HTML_RESTRICTOR filters allow the
+ *    configured CKEditor 5 plugins to work.
+ *
+ * @see \Drupal\filter\Plugin\FilterInterface::TYPE_HTML_RESTRICTOR
+ */
+class FundamentalCompatibilityConstraintValidator extends ConstraintValidator implements ContainerInjectionInterface {
+
+  use PluginManagerDependentValidatorTrait;
+  use TextEditorObjectDependentValidatorTrait;
+
+  /**
+   * The fundamental CKEditor 5 plugins without which it cannot function.
+   *
+   * @var string[]
+   */
+  const FUNDAMENTAL_CKEDITOR5_PLUGINS = [
+    'ckeditor5_essentials',
+    'ckeditor5_paragraph',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($toolbar_item, Constraint $constraint) {
+    if (!$constraint instanceof FundamentalCompatibilityConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\FundamentalCompatibility');
+    }
+
+    $text_editor = $this->createTextEditorObjectFromContext();
+
+    // First: the two fundamental checks against the text format. If any of
+    // them adds a constraint violation, return early, because it is a
+    // fundamental compatibility problem.
+    $this->checkNoMarkupFilters($text_editor->getFilterFormat(), $constraint);
+    if ($this->context->getViolations()->count() > 0) {
+      return;
+    }
+    $this->checkHtmlRestrictionsAreCompatible($text_editor->getFilterFormat(), $constraint);
+    if ($this->context->getViolations()->count() > 0) {
+      return;
+    }
+
+    // Finally: ensure the CKEditor 5 configuration's ability to generate HTML
+    // markup precisely matches that of the text format.
+    $this->checkHtmlRestrictionsMatch($text_editor, $constraint);
+  }
+
+  /**
+   * Checks no TYPE_MARKUP_LANGUAGE filters are present.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   The text format to validate.
+   * @param \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraint $constraint
+   *   The constraint to validate.
+   */
+  private function checkNoMarkupFilters(FilterFormatInterface $text_format, FundamentalCompatibilityConstraint $constraint) : void {
+    $markup_filters = static::getFiltersInFormatOfType(
+      $text_format,
+      FilterInterface::TYPE_MARKUP_LANGUAGE
+    );
+    if (!empty($markup_filters)) {
+      foreach ($markup_filters as $markup_filter) {
+        $this->context->buildViolation($constraint->noMarkupFiltersMessage)
+          ->setParameter('%filter_label', $markup_filter->getLabel())
+          ->setParameter('%filter_plugin_id', $markup_filter->getPluginId())
+          ->addViolation();
+      }
+    }
+  }
+
+  /**
+   * Checks that fundamental CKEditor 5 plugins' HTML tags are allowed.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   The text format to validate.
+   * @param \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraint $constraint
+   *   The constraint to validate.
+   */
+  private function checkHtmlRestrictionsAreCompatible(FilterFormatInterface $text_format, FundamentalCompatibilityConstraint $constraint) : void {
+    $minimum_tags = array_keys($this->pluginManager->getProvidedElements(self::FUNDAMENTAL_CKEDITOR5_PLUGINS));
+
+    $html_restrictions = $text_format->getHtmlRestrictions();
+
+    $forbidden_minimum_tags = isset($html_restrictions['forbidden_tags'])
+      ? array_diff($minimum_tags, $html_restrictions['forbidden_tags'])
+      : [];
+    if (!empty($forbidden_minimum_tags)) {
+      $offending_filter = static::findHtmlRestrictorFilterForbiddingTags($text_format, $minimum_tags);
+      $this->context->buildViolation($constraint->forbiddenElementsMessage)
+        ->setParameter('%filter_label', $offending_filter->getLabel())
+        ->setParameter('%filter_plugin_id', $offending_filter->getPluginId())
+        ->addViolation();
+    }
+
+    $not_allowed_minimum_tags = isset($html_restrictions['allowed'])
+      ? array_diff($minimum_tags, array_keys($html_restrictions['allowed']))
+      : [];
+    if (!empty($not_allowed_minimum_tags)) {
+      $offending_filter = static::findHtmlRestrictorFilterNotAllowingTags($text_format, $minimum_tags);
+      $this->context->buildViolation($constraint->nonAllowedElementsMessage)
+        ->setParameter('%filter_label', $offending_filter->getLabel())
+        ->setParameter('%filter_plugin_id', $offending_filter->getPluginId())
+        ->addViolation();
+    }
+  }
+
+  /**
+   * Checks the HTML restrictions match the enabled CKEditor 5 plugins' output.
+   *
+   * @param \Drupal\editor\EditorInterface $text_editor
+   *   The text editor to validate.
+   * @param \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraint $constraint
+   *   The constraint to validate.
+   */
+  private function checkHtmlRestrictionsMatch(EditorInterface $text_editor, FundamentalCompatibilityConstraint $constraint) : void {
+    $html_restrictor_filters = static::getFiltersInFormatOfType(
+      $text_editor->getFilterFormat(),
+      FilterInterface::TYPE_HTML_RESTRICTOR
+    );
+
+    $enabled_plugins = array_keys($this->pluginManager->getEnabledDefinitions($text_editor));
+    $provided = $this->pluginManager->getProvidedElements($enabled_plugins, $text_editor);
+
+    foreach ($html_restrictor_filters as $filter_plugin_id => $filter) {
+      $restrictions = $filter->getHTMLRestrictions();
+      if (!isset($restrictions['allowed'])) {
+        // @todo Handle HTML restrictor filters that only set forbidden_tags
+        //   https://www.drupal.org/project/ckeditor5/issues/3231336.
+        continue;
+      }
+
+      $allowed = $restrictions['allowed'];
+      // @todo Validate attributes allowed or forbidden on all elements
+      //   https://www.drupal.org/project/ckeditor5/issues/3231334.
+      if (isset($allowed['*'])) {
+        unset($allowed['*']);
+      }
+
+      $diff_allowed = HTMLRestrictionsUtilities::diffAllowedElements($allowed, $provided);
+      $diff_elements = HTMLRestrictionsUtilities::diffAllowedElements($provided, $allowed);
+
+      if (!empty($diff_allowed)) {
+        $this->context->buildViolation($constraint->notSupportedElementsMessage)
+          ->setParameter('@list', implode(' ', HTMLRestrictionsUtilities::toReadableElements($provided)))
+          ->setParameter('@diff', implode(' ', HTMLRestrictionsUtilities::toReadableElements($diff_allowed)))
+          ->atPath("filters.$filter_plugin_id")
+          ->addViolation();
+      }
+      elseif (!empty($diff_elements)) {
+        $this->context->buildViolation($constraint->missingElementsMessage)
+          ->setParameter('@list', implode(' ', HTMLRestrictionsUtilities::toReadableElements($provided)))
+          ->setParameter('@diff', implode(' ', HTMLRestrictionsUtilities::toReadableElements($diff_elements)))
+          ->atPath("filters.$filter_plugin_id")
+          ->addViolation();
+      }
+    }
+  }
+
+  /**
+   * Gets the filters of the given type in this text format.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   A text format whose filters to get.
+   * @param int $filter_type
+   *   One of FilterInterface::TYPE_*.
+   * @param callable|null $extra_requirements
+   *   An optional callable that can check a filter of this type for additional
+   *   conditions to be met. Must return TRUE when it meets the conditions,
+   *   FALSE otherwise.
+   *
+   * @return \Drupal\filter\Plugin\FilterInterface[]
+   *   The matched filter plugins.
+   */
+  private static function getFiltersInFormatOfType(FilterFormatInterface $text_format, int $filter_type, callable $extra_requirements = NULL) : array {
+    assert(in_array($filter_type, [
+      FilterInterface::TYPE_MARKUP_LANGUAGE,
+      FilterInterface::TYPE_HTML_RESTRICTOR,
+      FilterInterface::TYPE_TRANSFORM_IRREVERSIBLE,
+      FilterInterface::TYPE_TRANSFORM_IRREVERSIBLE,
+    ]));
+    return array_filter($text_format->filters()->getAll(), function (FilterInterface $filter) use ($filter_type, $extra_requirements) {
+      if (!$filter->status) {
+        return FALSE;
+      }
+      if ($filter->getType() === $filter_type && ($extra_requirements === NULL || $extra_requirements($filter))) {
+        return TRUE;
+      }
+      return FALSE;
+    });
+  }
+
+  /**
+   * Analyzes a text format to find the filter not allowing required tags.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   A text format whose filters to check for compatibility.
+   * @param string[] $required_tags
+   *   A list of HTML tags that are required.
+   *
+   * @return \Drupal\filter\Plugin\FilterInterface
+   *   The filter plugin instance not allowing the required tags.
+   *
+   * @throws \InvalidArgumentException
+   */
+  private static function findHtmlRestrictorFilterForbiddingTags(FilterFormatInterface $text_format, array $required_tags) : FilterInterface {
+    // Get HTML restrictor filters that actually restrict HTML.
+    $filters = static::getFiltersInFormatOfType(
+      $text_format,
+      FilterInterface::TYPE_HTML_RESTRICTOR,
+      function (FilterInterface $filter) {
+        return $filter->getHTMLRestrictions() !== FALSE;
+      }
+    );
+
+    foreach ($filters as $filter) {
+      $restrictions = $filter->getHTMLRestrictions();
+
+      // @todo Fix
+      //   \Drupal\filter_test\Plugin\Filter\FilterTestRestrictTagsAndAttributes::getHTMLRestrictions(),
+      //   whose computed value for forbidden_tags does not comply with the API
+      //   https://www.drupal.org/project/drupal/issues/3231331.
+      if (array_keys($restrictions['forbidden_tags']) != range(0, count($restrictions['forbidden_tags']))) {
+        $restrictions['forbidden_tags'] = array_keys($restrictions['forbidden_tags']);
+      }
+      if (isset($restrictions['forbidden_tags']) && !empty(array_intersect($required_tags, $restrictions['forbidden_tags']))) {
+        return $filter;
+      }
+    }
+
+    throw new \InvalidArgumentException('This text format does not have a "tags forbidden" restriction that includes the required tags.');
+  }
+
+  /**
+   * Analyzes a text format to find the filter not allowing required tags.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   A text format whose filters to check for compatibility.
+   * @param string[] $required_tags
+   *   A list of HTML tags that are required.
+   *
+   * @return \Drupal\filter\Plugin\FilterInterface
+   *   The filter plugin instance not allowing the required tags.
+   *
+   * @throws \InvalidArgumentException
+   */
+  private static function findHtmlRestrictorFilterNotAllowingTags(FilterFormatInterface $text_format, array $required_tags) : FilterInterface {
+    // Get HTML restrictor filters that actually restrict HTML.
+    $filters = static::getFiltersInFormatOfType(
+      $text_format,
+      FilterInterface::TYPE_HTML_RESTRICTOR,
+      function (FilterInterface $filter) {
+        return $filter->getHTMLRestrictions() !== FALSE;
+      }
+    );
+
+    foreach ($filters as $filter) {
+      $restrictions = $filter->getHTMLRestrictions();
+
+      if (isset($restrictions['allowed']) && !empty(array_diff($required_tags, array_keys($restrictions['allowed'])))) {
+        return $filter;
+      }
+    }
+
+    throw new \InvalidArgumentException('This text format does not have a "tags allowed" restriction that excludes the required tags.');
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/PluginManagerDependentValidatorTrait.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/PluginManagerDependentValidatorTrait.php
new file mode 100644
index 0000000000..d4968f314e
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/PluginManagerDependentValidatorTrait.php
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Common functionality for many CKEditor 5 validation constraints.
+ */
+trait PluginManagerDependentValidatorTrait {
+
+  /**
+   * The CKEditor 5 plugin manager.
+   *
+   * @var \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface
+   */
+  protected $pluginManager;
+
+  /**
+   * Constructs a CKEditor5ConstraintValidatorTrait object.
+   *
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginManagerInterface $plugin_manager
+   *   The CKEditor 5 plugin manager.
+   */
+  public function __construct(CKEditor5PluginManagerInterface $plugin_manager) {
+    $this->pluginManager = $plugin_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('plugin.manager.ckeditor5.plugin')
+    );
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/SourceEditingRedundantTagsConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/SourceEditingRedundantTagsConstraint.php
new file mode 100644
index 0000000000..c6bd9209f7
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/SourceEditingRedundantTagsConstraint.php
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * For disallowing Source Editing tags that are already supported by a plugin.
+ *
+ * @Constraint(
+ *   id = "SourceEditingRedundantTags",
+ *   label = @Translation("Source editing should only use otherwise unavailable tags", context = "Validation"),
+ * )
+ */
+class SourceEditingRedundantTagsConstraint extends Constraint {
+
+  /**
+   * When a Source Editing tag is added that an enabled plugin supports.
+   *
+   * @var string
+   */
+  public $enabledPluginsMessage = 'The following tag(s) are already supported by enabled plugins and should not be added to the Source Editing "Manually editable HTML tags" field: %overlapping_tags.';
+
+  /**
+   * When a Source Editing tag is added that a disabled plugin supports.
+   *
+   * @var string
+   */
+  public $availablePluginsMessage = 'The following tag(s) are already supported by available plugins and should not be added to the Source Editing "Manually editable HTML tags" field. Instead, enable the following plugins to support these tags: %overlapping_tags.';
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/SourceEditingRedundantTagsConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/SourceEditingRedundantTagsConstraintValidator.php
new file mode 100644
index 0000000000..daa6f3e9e2
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/SourceEditingRedundantTagsConstraintValidator.php
@@ -0,0 +1,98 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Ensures tags already available via plugin are not be added to Source Editing.
+ */
+class SourceEditingRedundantTagsConstraintValidator extends ConstraintValidator implements ContainerInjectionInterface {
+
+  use PluginManagerDependentValidatorTrait;
+  use TextEditorObjectDependentValidatorTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($value, Constraint $constraint) {
+    if (!$constraint instanceof SourceEditingRedundantTagsConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\SourceEditingRedundantTagsConstraint');
+    }
+    if (empty($value)) {
+      return;
+    }
+
+    $text_editor = $this->createTextEditorObjectFromContext();
+    $enabled_plugins = $this->pluginManager->getEnabledDefinitions($text_editor);
+    $disabled_plugins = array_diff_key($this->pluginManager->getDefinitions(), $enabled_plugins);
+    unset($enabled_plugins['ckeditor5_sourceEditing']);
+
+    // An array of tags enabled by every plugin other than Source Editing.
+    $enabled_plugin_tags = $this->pluginManager->getProvidedElements(array_keys($enabled_plugins));
+    $disabled_plugin_tags = $this->pluginManager->getProvidedElements(array_keys($disabled_plugins));
+
+    // An array of just the tags enabled by Source Editing.
+    $source_enabled_tags = HTMLRestrictionsUtilities::allowedElementsStringToHtmlFilterArray($value);
+    $enabled_plugin_overlap = array_intersect_key($enabled_plugin_tags, $source_enabled_tags);
+    $disabled_plugin_overlap = array_intersect_key($disabled_plugin_tags, $source_enabled_tags);
+
+    foreach ([$enabled_plugin_overlap, $disabled_plugin_overlap] as &$overlap) {
+      $checking_enabled = $overlap === $enabled_plugin_overlap;
+      if (!empty($overlap)) {
+        foreach ($overlap as $overlapping_tag => $overlapping_config) {
+          if (is_array($source_enabled_tags[$overlapping_tag])) {
+            unset($overlap[$overlapping_tag]);
+          }
+        }
+      }
+      if (!empty($overlap)) {
+        $plugins_to_check_against = $checking_enabled ? $enabled_plugins : $disabled_plugins;
+        $tags_plugin_report = $this->pluginsSupplyingTagsMessage($overlap, $plugins_to_check_against);
+        $message = $checking_enabled ? $constraint->enabledPluginsMessage : $constraint->availablePluginsMessage;
+        $this->context->buildViolation($message)
+          ->setParameter('%overlapping_tags', $tags_plugin_report)
+          ->addViolation();
+      }
+    }
+  }
+
+  /**
+   * Creates a message listing plugins and the overlapping tags they provide.
+   *
+   * @param array $tags
+   *   An array of overlapping tags.
+   * @param \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition[] $plugin_definitions
+   *   An array of plugin definitions where overlap was found.
+   *
+   * @return string
+   *   A list of plugins that provide the overlapping tags.
+   */
+  private function pluginsSupplyingTagsMessage(array $tags, array $plugin_definitions): string {
+    $message_array = [];
+    $message_string = '';
+    foreach ($plugin_definitions as $plugin_id => $definition) {
+      if ($definition->hasElements()) {
+        $elements_array = HTMLRestrictionsUtilities::allowedElementsStringToHtmlFilterArray(implode('', $definition->getElements()));
+        foreach ($elements_array as $tag_name => $tag_config) {
+          if (isset($tags[$tag_name])) {
+            $message_array[(string) $definition->label()][] = "<$tag_name>";
+          }
+        }
+      }
+    }
+    foreach ($message_array as $plugin_label => $tag_list) {
+      $tags_string = implode(', ', $tag_list);
+      $message_string .= "$plugin_label ($tags_string), ";
+    }
+
+    return trim($message_string, ' ,');
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/TextEditorObjectDependentValidatorTrait.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/TextEditorObjectDependentValidatorTrait.php
new file mode 100644
index 0000000000..baf51cc900
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/TextEditorObjectDependentValidatorTrait.php
@@ -0,0 +1,55 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\editor\EditorInterface;
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\filter\FilterFormatInterface;
+
+/**
+ * Some CKEditor 5 constraint validators need a Text Editor object.
+ */
+trait TextEditorObjectDependentValidatorTrait {
+
+  /**
+   * Creates a text editor object from the execution context.
+   *
+   * Works both for an individual text editor config entity and a pair.
+   *
+   * @return \Drupal\editor\EditorInterface
+   *   A text editor object, with the text format pre-populated.
+   */
+  private function createTextEditorObjectFromContext() : EditorInterface {
+    if ($this->context->getRoot()->getDataDefinition()->getDataType() === 'ckeditor5_valid_pair__format_and_editor') {
+      $text_format = FilterFormat::create([
+        'filters' => $this->context->getRoot()->get('filters')->toArray(),
+      ]);
+    }
+    else {
+      assert($this->context->getRoot()->getDataDefinition()->getDataType() === 'editor.editor.*');
+      $text_format = FilterFormat::load($this->context->getRoot()->get('format')->getValue());
+    }
+    assert($text_format instanceof FilterFormatInterface);
+
+    $text_editor = Editor::create([
+      'editor' => 'ckeditor5',
+      'settings' => $this->context->getRoot()->get('settings')->toArray(),
+      'image_upload' => $this->context->getRoot()->get('image_upload')->toArray(),
+      // Specify `filterFormat` to ensure that the generated Editor config
+      // entity object already has the $filterFormat property set, to prevent
+      // calls to Editor::hasAssociatedFilterFormat() and
+      // Editor::getFilterFormat() from loading the FilterFormat from storage.
+      // As far as this validation constraint validator is concerned, the
+      // concrete FilterFormat entity ID does not matter, all that matters is
+      // its filter configuration. Those exist in $text_format.
+      'filterFormat' => $text_format,
+    ]);
+    assert($text_editor instanceof EditorInterface);
+
+    return $text_editor;
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConditionsMetConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConditionsMetConstraint.php
new file mode 100644
index 0000000000..75bf1482a1
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConditionsMetConstraint.php
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * A (placed) CKEditor 5 toolbar item's conditions must be met.
+ *
+ * @Constraint(
+ *   id = "CKEditor5ToolbarItemConditionsMet",
+ *   label = @Translation("CKEditor 5 toolbar item conditions must be met", context = "Validation"),
+ * )
+ */
+class ToolbarItemConditionsMetConstraint extends Constraint {
+
+  /**
+   * The violation message when the required image upload status is not set.
+   *
+   * @var string
+   */
+  public $imageUploadStatusRequiredMessage = 'The %toolbar_item toolbar item requires image uploads to be enabled.';
+
+  /**
+   * The violation message when a required filter is missing.
+   *
+   * @var string
+   */
+  public $filterRequiredMessage = 'The %toolbar_item toolbar item requires the %filter filter to be enabled.';
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConditionsMetConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConditionsMetConstraintValidator.php
new file mode 100644
index 0000000000..d746b5e473
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConditionsMetConstraintValidator.php
@@ -0,0 +1,104 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Toolbar item conditions met constraint validator.
+ */
+class ToolbarItemConditionsMetConstraintValidator extends ConstraintValidator implements ContainerInjectionInterface {
+
+  use PluginManagerDependentValidatorTrait;
+  use TextEditorObjectDependentValidatorTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($toolbar_item, Constraint $constraint) {
+    if (!$constraint instanceof ToolbarItemConditionsMetConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\ToolbarItemConditionsMetConstraint');
+    }
+
+    try {
+      $definition = $this->findDefinitionForToolbarItem($toolbar_item);
+    }
+    catch (\OutOfBoundsException $e) {
+      // No plugin definition found for this toolbar item. It's the
+      // responsibility of another validation constraint to raise this problem.
+      // @see \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemConstraint
+      return;
+    }
+
+    // If there are no conditions, there is nothing to validate.
+    if (!$definition->hasConditions()) {
+      return;
+    }
+
+    $toolbar_item_label = $definition->getToolbarItems()[$toolbar_item]['label'];
+    $text_editor = $this->createTextEditorObjectFromContext();
+
+    $conditions = $definition->getConditions();
+    foreach ($conditions as $condition_type => $required_value) {
+      switch ($condition_type) {
+        case 'toolbarItem':
+          // Nothing to validate.
+          break;
+
+        case 'imageUploadStatus':
+          $image_upload_settings = $text_editor->getImageUploadSettings();
+          if (!isset($image_upload_settings['status']) || (bool) $image_upload_settings['status'] !== TRUE) {
+            $this->context->buildViolation($constraint->imageUploadStatusRequiredMessage)
+              ->setParameter('%toolbar_item', $toolbar_item_label)
+              ->setInvalidValue($toolbar_item)
+              ->addViolation();
+          }
+          break;
+
+        case 'filter':
+          $filters = $text_editor->getFilterFormat()->filters();
+          if (!$filters->has($required_value) || !$filters->get($required_value)->status) {
+            $filter_label = $filters->has($required_value)
+              ? $filters->get($required_value)->getLabel()
+              : $required_value;
+            $this->context->buildViolation($constraint->filterRequiredMessage)
+              ->setParameter('%toolbar_item', $toolbar_item_label)
+              ->setParameter('%filter', $filter_label)
+              ->setInvalidValue($toolbar_item)
+              ->addViolation();
+          }
+          break;
+      }
+    }
+  }
+
+  /**
+   * Searches for CKEditor 5 plugin that provides a given toolbar item.
+   *
+   * @param string $toolbar_item
+   *   The toolbar item to be searched for within plugin definitions.
+   *
+   * @return \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition
+   *   The corresponding plugin definition.
+   *
+   * @throws \OutOfBoundsException
+   */
+  protected function findDefinitionForToolbarItem(string $toolbar_item): CKEditor5PluginDefinition {
+    $definitions = $this->pluginManager->getDefinitions();
+    foreach ($definitions as $definition) {
+      if (array_key_exists($toolbar_item, $definition->getToolbarItems())) {
+        return $definition;
+      }
+    }
+
+    // @see \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemConstraint
+    throw new \OutOfBoundsException("Toolbar item '$toolbar_item' not found.");
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConstraint.php
new file mode 100644
index 0000000000..9c31b259fa
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConstraint.php
@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * A CKEditor 5 toolbar item.
+ *
+ * @Constraint(
+ *   id = "CKEditor5ToolbarItem",
+ *   label = @Translation("CKEditor 5 toolbar item", context = "Validation"),
+ * )
+ *
+ * @see https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/toolbar.html
+ */
+class ToolbarItemConstraint extends Constraint {
+
+  /**
+   * The default violation message.
+   *
+   * @var string
+   */
+  public $message = 'The provided toolbar item %toolbar_item is not valid.';
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConstraintValidator.php
new file mode 100644
index 0000000000..f75f9c9204
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemConstraintValidator.php
@@ -0,0 +1,65 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Toolbar item constraint validator.
+ */
+class ToolbarItemConstraintValidator extends ConstraintValidator implements ContainerInjectionInterface {
+
+  use PluginManagerDependentValidatorTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($toolbar_item, Constraint $constraint) {
+    if (!$constraint instanceof ToolbarItemConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\ToolbarItem');
+    }
+
+    if ($toolbar_item === NULL) {
+      return;
+    }
+
+    if (!static::isValidToolbarItem($toolbar_item)) {
+      $this->context->buildViolation($constraint->message)
+        ->setParameter('%toolbar_item', $toolbar_item)
+        ->setInvalidValue($toolbar_item)
+        ->addViolation();
+    }
+  }
+
+  /**
+   * Validates the given toolbar item.
+   *
+   * @param string $toolbar_item
+   *   A toolbar item as expected by CKEditor 5.
+   *
+   * @return bool
+   *   Whether the given toolbar item is valid or not.
+   */
+  protected function isValidToolbarItem(string $toolbar_item) : bool {
+    // Special case: the toolbar group separator.
+    // @see https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/toolbar.html#separating-toolbar-items
+    if ($toolbar_item === '|') {
+      return TRUE;
+    }
+
+    // Special case: the breakpoint separator.
+    // @see https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/toolbar.html#explicit-wrapping-breakpoint
+    if ($toolbar_item === '-') {
+      return TRUE;
+    }
+
+    $available_toolbar_items = array_keys($this->pluginManager->getToolbarItems());
+    return in_array($toolbar_item, $available_toolbar_items, TRUE);
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemDependencyConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemDependencyConstraint.php
new file mode 100644
index 0000000000..2d44f8e3af
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemDependencyConstraint.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * A CKEditor 5 toolbar item.
+ *
+ * @Constraint(
+ *   id = "CKEditor5ToolbarItemDependencyConstraint",
+ *   label = @Translation("CKEditor 5 toolbar item dependency", context = "Validation"),
+ * )
+ */
+class ToolbarItemDependencyConstraint extends Constraint {
+
+  /**
+   * The default violation message.
+   *
+   * @var string
+   */
+  public $message = 'Depends on %toolbar_item, which is not enabled.';
+
+  /**
+   * The toolbar item that this validation constraint requires to be enabled.
+   *
+   * @var null|string
+   */
+  public $toolbarItem = NULL;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRequiredOptions() {
+    return ['toolbarItem'];
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemDependencyConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemDependencyConstraintValidator.php
new file mode 100644
index 0000000000..e300b6dd97
--- /dev/null
+++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/ToolbarItemDependencyConstraintValidator.php
@@ -0,0 +1,35 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5\Plugin\Validation\Constraint;
+
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Toolbar item dependency constraint validator.
+ */
+class ToolbarItemDependencyConstraintValidator extends ConstraintValidator implements ContainerInjectionInterface {
+
+  use PluginManagerDependentValidatorTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($toolbar_item, Constraint $constraint) {
+    if (!$constraint instanceof ToolbarItemDependencyConstraint) {
+      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\ToolbarItemDependency');
+    }
+
+    $toolbar_items = $this->context->getRoot()->get('settings.toolbar.items')->toArray();
+    if (!in_array($constraint->toolbarItem, $toolbar_items, TRUE)) {
+      $this->context->buildViolation($constraint->message)
+        ->setParameter('%toolbar_item', $constraint->toolbarItem)
+        ->addViolation();
+    }
+  }
+
+}
diff --git a/core/modules/ckeditor5/src/SmartDefaultSettings.php b/core/modules/ckeditor5/src/SmartDefaultSettings.php
new file mode 100644
index 0000000000..3734b11d39
--- /dev/null
+++ b/core/modules/ckeditor5/src/SmartDefaultSettings.php
@@ -0,0 +1,618 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\Component\Plugin\PluginManagerInterface;
+use Drupal\Core\Messenger\MessengerTrait;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\editor\EditorInterface;
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\FilterFormatInterface;
+
+/**
+ * Generates CKEditor 5 settings for existing text editors/formats.
+ *
+ * @internal
+ *   This class may change at any time. It is not for use outside this module.
+ */
+final class SmartDefaultSettings {
+
+  use MessengerTrait;
+  use StringTranslationTrait;
+
+  /**
+   * The CKEditor 5 plugin manager.
+   *
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $pluginManager;
+
+  /**
+   * Constructs a SmartDefaultSettings object.
+   *
+   * @param \Drupal\Component\Plugin\PluginManagerInterface $plugin_manager
+   *   The CKEditor 5 plugin manager.
+   */
+  public function __construct(PluginManagerInterface $plugin_manager) {
+    $this->pluginManager = $plugin_manager;
+  }
+
+  /**
+   * Computes the closest possible equivalent settings for switching to CKEditor 5.
+   *
+   * @param \Drupal\editor\EditorInterface|null $text_editor
+   *   The editor being reconfigured for CKEditor 5 to match the CKEditor 4
+   *   settings as closely as possible (if it was using CKEditor 4).
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   The text format for which to compute smart default settings.
+   *
+   * @return \Drupal\editor\EditorInterface
+   *   The cloned config entity with settings modified for CKEditor 5 … or a
+   *   completely new config entity if this text format did not yet have one.
+   */
+  public function computeSmartDefaultSettings(?EditorInterface $text_editor, FilterFormatInterface $text_format) : EditorInterface {
+    if ($text_format->isNew()) {
+      throw new \InvalidArgumentException('Smart default settings can only be computed when there is a pre-existing text format.');
+    }
+    if ($text_editor && $text_editor->id() !== $text_format->id()) {
+      throw new \InvalidArgumentException('The given text editor and text format must form a pair.');
+    }
+
+    // Ensure that unsaved changes to the text format object are also respected.
+    if ($text_editor) {
+      // Overwrite the Editor config entity object's $filterFormat property, to
+      // prevent calls to Editor::hasAssociatedFilterFormat() and
+      // Editor::getFilterFormat() from loading the FilterFormat from storage.
+      // @todo Remove in https://www.drupal.org/project/ckeditor5/issues/3218985.
+      $reflector = new \ReflectionObject($text_editor);
+      $property = $reflector->getProperty('filterFormat');
+      $property->setAccessible(TRUE);
+      $property->setValue($text_editor, $text_format);
+    }
+
+    // When there is a pre-existing text editor, pass that. Otherwise, generate
+    // an empty shell of a text editor config entity — this will then
+    // automatically get the default CKEditor 5 settings.
+    // @todo Update after https://www.drupal.org/project/drupal/issues/3226673.
+    /** @var \Drupal\editor\Entity\Editor $editor */
+    $editor = $text_editor !== NULL
+      ? clone $text_editor
+      : Editor::create([
+        'format' => $text_format->id(),
+        // @see \Drupal\editor\Entity\Editor::__construct()
+        // @see \Drupal\ckeditor5\Plugin\Editor\CKEditor5::getDefaultSettings()
+        'editor' => 'ckeditor5',
+      ]);
+    $editor->setEditor('ckeditor5');
+
+    // Compute the appropriate settings based on the CKEditor 4 configuration
+    // if it exists.
+    $old_editor = $editor->id() ? Editor::load($editor->id()) : NULL;
+    if ($old_editor && $old_editor->getEditor() === 'ckeditor') {
+      $upgraded_settings = $this->createSettingsFromCKEditor4($old_editor->getSettings());
+      $editor->setSettings($upgraded_settings);
+      $editor->setImageUploadSettings($old_editor->getImageUploadSettings());
+    }
+
+    // First, add toolbar items based on HTML tags.
+    // NOTE: Helper updates $editor->settings by reference and returns info for the message.
+    $result = $this->addToolbarItemsToMatchHtmlTagsInFormat($text_format, $editor);
+    if ($result !== NULL) {
+      [$enabling_message_content, $unsupported] = $result;
+      if ($enabling_message_content) {
+        $enabling_message = $this->t('The following plugins were enabled to support tags that are allowed by this text format: %enabling_message_content.',
+          ['%enabling_message_content' => $enabling_message_content],
+        );
+        $this->messenger()->addMessage($enabling_message);
+      }
+      unset($unsupported['*']);
+      // Warn user about unsupported tags.
+      if (!empty($unsupported)) {
+        $unsupported_string = implode(' ', HTMLRestrictionsUtilities::toReadableElements($unsupported));
+        $this->addTagsToSourceEditing($editor, $unsupported_string);
+        $this->messenger()->addMessage($this->t("The following tags were permitted by this format's filter configuration, but no plugin was available that supports them. To ensure the tags remain supported by this text format, the following were added to the Source Editing plugin's <em>Manually editable HTML tags</em>: @unsupported_string.", [
+          '@unsupported_string' => $unsupported_string,
+        ]));
+      }
+    }
+
+    // Next, add more toolbar items to try to also support attributes on already
+    // supported tags that have still unsupported attributes.
+    $result = $this->addToolbarItemsToMatchHtmlAttributesInFormat($text_format, $editor);
+    if ($result !== NULL) {
+      [$enabled_for_attributes_message_content, $missing_attributes] = $result;
+      if ($enabled_for_attributes_message_content) {
+        $enabled_for_attributes_message = $this->t('The following plugins were enabled to support specific attributes that are allowed by this text format: %enabled_for_attributes_message_content.',
+          ['%enabled_for_attributes_message_content' => $enabled_for_attributes_message_content],
+        );
+        $this->messenger()->addMessage($enabled_for_attributes_message);
+      }
+      // Warn user about supported tags but missing attributes.
+      if ($missing_attributes) {
+        $this->addTagsToSourceEditing($editor, $missing_attributes);
+        $this->messenger()->addMessage($this->t("This format's HTML filters includes plugins that support the following tags, but not some of their attributes. To ensure these attributes remain supported by this text format, the following were added to the Source Editing plugin's <em>Manually editable HTML tags</em>: @missing_attributes.", [
+          '@missing_attributes' => $missing_attributes,
+        ]));
+      }
+    }
+
+    // Finally: for all enabled plugins, find the ones that are configurable,
+    // and add their default settings.
+    $this->addDefaultSettingsForEnabledConfigurablePlugins($editor);
+
+    return $editor;
+  }
+
+  private function addTagsToSourceEditing(EditorInterface $editor, $tags) : void {
+    $settings = $editor->getSettings();
+    if (!isset($settings['toolbar']['items']) || !in_array('sourceEditing', $settings['toolbar']['items'])) {
+      $enabling_message = $this->t('The <em>Source Editing</em> plugin was enabled to support tags and/or attributes that are not explicitly supported by any available CKEditor 5 plugins.');
+      $this->messenger()->addMessage($enabling_message);
+      $settings['toolbar']['items'][] = 'sourceEditing';
+    }
+    $source_editing_allowed_tags = $settings['plugins']['ckeditor5_sourceEditing']['allowed_tags'] ?? [];
+    $settings['plugins']['ckeditor5_sourceEditing']['allowed_tags'] = array_merge($source_editing_allowed_tags, HTMLRestrictionsUtilities::allowedElementsStringToPluginElementsArray($tags));
+    $editor->setSettings($settings);
+  }
+
+  /**
+   * Creates equivalent CKEditor 5 settings from CKEditor 4 settings.
+   *
+   * @param array $ckeditor4_settings
+   *   The value for "settings" in a Text Editor config entity configured to use
+   *   CKEditor 4.
+   *
+   * @return array
+   *   An equivalent value for CKEditor 5.
+   */
+  private static function createSettingsFromCKEditor4(array $ckeditor4_settings) : array {
+    $settings = [];
+
+    // First: toolbar items.
+    // @see \Drupal\ckeditor\CKEditorPluginButtonsInterface
+    foreach ($ckeditor4_settings['toolbar']['rows'] as $row) {
+      foreach ($row as $group) {
+        $some_added = FALSE;
+        foreach ($group['items'] as $cke4_button) {
+          $equivalent = static::mapCKEditor4ToolbarButtonToCKEditor5ToolbarItem($cke4_button);
+          if ($equivalent) {
+            $settings['toolbar']['items'][] = $equivalent;
+            $some_added = TRUE;
+          }
+        }
+        // Add a CKEditor 5 toolbar group separator for every group.
+        if ($some_added) {
+          $settings['toolbar']['items'][] = '|';
+        }
+      }
+    }
+    // Remove the trailing CKEditor 5 toolbar group separator.
+    array_pop($settings['toolbar']['items']);
+    // Strip the CKEditor 4 buttons without a CKEditor 5 equivalent.
+    $settings['toolbar']['items'] = array_filter($settings['toolbar']['items']);
+
+    // Second: plugin settings.
+    // @see \Drupal\ckeditor\CKEditorPluginConfigurableInterface
+    // @todo Generalize in https://www.drupal.org/i/3226335.
+    foreach ($ckeditor4_settings['plugins'] as $cke4_plugin_id => $setting) {
+      switch ($cke4_plugin_id) {
+        // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\StylesCombo
+        case 'stylescombo':
+          // No equivalent exists yet.
+          break;
+
+        // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\Language
+        case 'language':
+          // In CKEditor 4, the language plugin is always part of settings, even
+          // if the language button isn't actually in use. Only add the plugin
+          // to CKEditor 5 if the language button is in the toolbar.
+          $language_in_toolbar = FALSE;
+          array_walk_recursive($ckeditor4_settings['toolbar'], function ($value) use (&$language_in_toolbar) {
+            if ($value === 'Language') {
+              $language_in_toolbar = TRUE;
+            }
+          });
+          if ($language_in_toolbar) {
+            $settings['plugins']['language'] = $setting;
+          }
+          break;
+      }
+    }
+
+    return $settings;
+  }
+
+  /**
+   * Maps a CKEditor 4 button to the CKEditor 5 equivalent, if it exists.
+   *
+   * Generated by inspecting all \Drupal\ckeditor\CKEditorPluginButtonsInterface
+   * implementations.
+   *
+   * @param string $cke4_button
+   *   A valid CKEditor 4 button name.
+   *
+   * @return string|null
+   *   The equivalent CKEditor 5 toolbar item, or NULL if no equivalent exists.
+   *
+   * @see \Drupal\ckeditor\CKEditorPluginButtonsInterface
+   * @todo Generalize in https://www.drupal.org/i/3226335.
+   */
+  private static function mapCKEditor4ToolbarButtonToCKEditor5ToolbarItem(string $cke4_button) : ?string {
+    switch ($cke4_button) {
+      // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\DrupalImage
+      case 'DrupalImage':
+        return 'uploadImage';
+
+      // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\DrupalLink
+      case 'DrupalLink':
+        return 'link';
+
+      case 'DrupalUnlink':
+        return NULL;
+
+      // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\Internal
+      case 'Bold':
+      case 'Italic':
+      case 'Underline':
+      case 'Superscript':
+      case 'Subscript':
+      case 'BulletedList':
+      case 'NumberedList':
+      case 'Outdent':
+      case 'Indent':
+      case 'Undo':
+      case 'Redo':
+        return lcfirst($cke4_button);
+
+      case 'Blockquote':
+        return 'blockQuote';
+
+      case 'JustifyLeft':
+        return "alignment:left";
+
+      case 'JustifyCenter':
+        return "alignment:center";
+
+      case 'JustifyRight':
+        return "alignment:right";
+
+      case 'JustifyBlock':
+        return "alignment:justify";
+
+      case 'HorizontalRule':
+        return 'horizontalLine';
+
+      case 'Format':
+        return 'heading';
+
+      case 'Table':
+        return 'insertTable';
+
+      case 'Source':
+        return 'sourceEditing';
+
+      case 'Strike':
+        return 'strikethrough';
+
+      case 'RemoveFormat':
+      case 'Cut':
+      case 'Copy':
+      case 'Paste':
+      case 'PasteText':
+      case 'PasteFromWord':
+      case 'SpecialChar':
+      case 'ShowBlocks':
+      case 'Maximize':
+      case '-':
+        // @see https://www.drupal.org/project/ckeditor5/issues/3211049#comment-14167764
+        return NULL;
+
+      // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\StylesCombo
+      case 'Styles':
+        return NULL;
+
+      // @see \Drupal\ckeditor\Plugin\CKEditorPlugin\Language
+      case 'Language':
+        return 'textPartLanguage';
+
+      // @see \Drupal\media_library\Plugin\CKEditorPlugin\DrupalMediaLibrary
+      case 'DrupalMediaLibrary':
+        return 'drupalMedia';
+
+      default:
+        return NULL;
+    }
+  }
+
+  /**
+   * Adds CKEditor 5 toolbar items to match the format's HTML tags.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $format
+   *   The text format for which to compute smart default settings.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   The text editor config entity to update.
+   *
+   * @return array|null
+   *   NULL when nothing happened, otherwise an array with two values:
+   *   1. a description (for use in a message) of which CKEditor 5 plugins were
+   *      enabled to match the HTML tags allowed by the text format.
+   *   2. the unsupported tags
+   */
+  private function addToolbarItemsToMatchHtmlTagsInFormat(FilterFormatInterface $format, EditorInterface $editor) : ?array {
+    $html_restrictions_needed_elements = $format->getHtmlRestrictions();
+    if ($html_restrictions_needed_elements === FALSE) {
+      return NULL;
+    }
+
+    // Add all buttons until we match or exceed the current text format
+    // restrictions.
+    $enabled_plugins = array_keys($this->pluginManager->getEnabledDefinitions($editor));
+    $provided_elements = $this->pluginManager->getProvidedElements($enabled_plugins);
+
+    // Automatically add the plugins that add support for the tags we want this
+    // CKEditor 5 instance to support.
+    $missing_tags = array_diff(array_keys($html_restrictions_needed_elements['allowed']), array_keys($provided_elements));
+    $to_add = [];
+    $unsupported = [];
+    foreach ($missing_tags as $tag) {
+      $id = $this->pluginManager->findPluginSupportingElement($tag);
+      if ($id) {
+        $to_add[$tag] = $id;
+      }
+      // Add any tag that isn't the "star protector" tag to the array of
+      // unsupported tags.
+      // @see the $star_protector variable in
+      // \Drupal\filter\Plugin\Filter\FilterHtml::getHTMLRestrictions
+      // @todo this can be an 'else' with no conditions after
+      // https://www.drupal.org/project/drupal/issues/3226368
+      elseif ($tag !== '__zqh6vxfbk3cg__') {
+        $unsupported[$tag] = $html_restrictions_needed_elements['allowed'][$tag];
+      }
+    }
+
+    $enabling_message_content = '';
+    $enabling_message_prep = [];
+    foreach ($to_add as $tag_name => $plugin_name) {
+      $enabling_message_prep[$plugin_name][] = $tag_name;
+    }
+
+    $editor_settings_to_update = $editor->getSettings();
+    $new_group_created = FALSE;
+    foreach ($enabling_message_prep as $plugin_id => $tag_names) {
+      $label = $this->pluginManager->getDefinition($plugin_id)->label();
+      $tags = array_reduce($tag_names, function ($carry, $item) {
+        return $carry . "<$item>";
+      });
+      $enabling_message_content .= "$label (for tags: $tags) ";
+      $definition = $this->pluginManager->getDefinition($plugin_id);
+      if ($definition->hasToolbarItems()) {
+        if (!$new_group_created) {
+          $editor_settings_to_update['toolbar']['items'][] = '|';
+          $new_group_created = TRUE;
+        }
+        $editor_settings_to_update['toolbar']['items'] = array_merge($editor_settings_to_update['toolbar']['items'], array_keys($definition->getToolbarItems()));
+      }
+    }
+
+    if (!empty($enabling_message_content)) {
+      $editor->setSettings($editor_settings_to_update);
+      $enabling_message_content = substr($enabling_message_content, 0, -1);
+      return [$enabling_message_content, $unsupported];
+    }
+    else {
+      return [NULL, $unsupported];
+    }
+  }
+
+  /**
+   * Adds CKEditor 5 toolbar items to match the format's HTML attributes.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $format
+   *   The text format for which to compute smart default settings.
+   * @param \Drupal\editor\EditorInterface $editor
+   *   The text editor config entity to update.
+   *
+   * @return array|null
+   *   NULL when nothing happened, otherwise an array with two values:
+   *   1. a description (for use in a message) of which CKEditor 5 plugins were
+   *      enabled to match the HTML attributes allowed by the text format.
+   *   2. the unsupported attributes
+   */
+  private function addToolbarItemsToMatchHtmlAttributesInFormat(FilterFormatInterface $format, EditorInterface $editor) : ?array {
+    $html_restrictions_needed_elements = $format->getHtmlRestrictions();
+    if ($html_restrictions_needed_elements === FALSE) {
+      return NULL;
+    }
+
+    $enabled_plugins = array_keys($this->pluginManager->getEnabledDefinitions($editor));
+    $provided_elements = $this->pluginManager->getProvidedElements($enabled_plugins);
+    $missing = HTMLRestrictionsUtilities::diffAllowedElements($editor->getFilterFormat()->getHtmlRestrictions()['allowed'], $provided_elements);
+    $supported_tags_with_unsupported_attributes = array_intersect_key($missing, $provided_elements);
+    $supported_tags_with_unsupported_attributes = array_filter($supported_tags_with_unsupported_attributes, function ($tag_config) {
+      return is_array($tag_config);
+    });
+
+    if (!empty($supported_tags_with_unsupported_attributes)) {
+      // This will be populated with plugins that aren't currently enabled, but
+      // provide element configuration that include attributes. I.e. they are
+      // the only plugins that can potentially address unsupported attributes
+      // in supported tags.
+      $disabled_plugins_with_attribute_config = [];
+      $all_plugins_definitions = $this->pluginManager->getDefinitions();
+      foreach ($all_plugins_definitions as $plugin_id => $definition) {
+        // Only proceed if the plugin has configured elements and the plugin
+        // does not have conditions. In the future we could add support for
+        // automatically enabling filters, but for now we assume that the filter
+        // configuration cannot be modified.
+        if (!in_array($plugin_id, $enabled_plugins) && !$definition->hasConditions()) {
+          $plugins_provided_elements = $this->pluginManager->getProvidedElements([$plugin_id], NULL, TRUE);
+          if (!empty($plugins_provided_elements)) {
+            // Filter elements that do not have attribute configuration.
+            $elements_with_attribute_config = array_filter($plugins_provided_elements, function ($elements) {
+              return $elements !== FALSE;
+            });
+            if (!empty($elements_with_attribute_config)) {
+              foreach ($elements_with_attribute_config as $tag_name => $attribute_config) {
+                // If the 'tag' is a wildcard, add the attribute config to
+                // all qualifying tags.
+                if (substr($tag_name, 0, 1) === '$') {
+                  // An array of all the tags that match the wildcard value.
+                  $wildcard_tags = HTMLRestrictionsUtilities::getWildcardTags($tag_name);
+
+                  // Matching wildcard tags that are also tags that have
+                  // attribute config that is not yet supported.
+                  $wildcard_tags_in_config_missing_attributes = array_intersect_key(array_flip($wildcard_tags), $supported_tags_with_unsupported_attributes);
+                  foreach (array_keys($wildcard_tags_in_config_missing_attributes) as $wildcard_provided_tag) {
+                    $elements_with_attribute_config[$wildcard_provided_tag] = $attribute_config;
+                  }
+
+                  // Remove the wildcard 'tag', as the tags it represents are
+                  // now accounted for.
+                  unset($elements_with_attribute_config[$tag_name]);
+                }
+              }
+              $disabled_plugins_with_attribute_config[$plugin_id] = $elements_with_attribute_config;
+            }
+          }
+        }
+      }
+
+      // This will contain plugins to be enabled if they provide support for the
+      // not-yet-supported attributes.
+      $plugins_to_enable_to_support_attribute_config = [];
+      foreach ($supported_tags_with_unsupported_attributes as $tag_name => $attributes_config) {
+        foreach ($attributes_config as $attribute_name => $attribute_config) {
+          // This means the existing config must allow all values of the
+          // attribute.
+          if ($attribute_config === TRUE) {
+            // See if there is a disabled plugin that will provide full use of
+            // the attribute for a given tag.
+            foreach ($disabled_plugins_with_attribute_config as $disabled_plugin_id => $disabled_plugin_elements_config) {
+              if (isset($disabled_plugin_elements_config[$tag_name][$attribute_name]) && $disabled_plugin_elements_config[$tag_name][$attribute_name] === TRUE) {
+                // Add this to the 'plugins to enable' array. Setting this value
+                // to TRUE instead of an array indicates to the message system
+                // that the attribute is allowed for the tag with any value.
+                $plugins_to_enable_to_support_attribute_config[$disabled_plugin_id][$attribute_name][$tag_name] = TRUE;
+
+                // This attribute can be removed from the list of unsupported
+                // attributes for the tag.
+                unset($supported_tags_with_unsupported_attributes[$tag_name][$attribute_name]);
+              }
+            }
+          }
+          else {
+            // This condition is reached if the existing configuration has the
+            // attribute value restricted to specific values.
+            // @todo currently, this will enable plugins that allow ALL values
+            //   for an attribute. This means the attribute+value is now allowed
+            //   but additional attribute values are permitted as well. This may
+            //   need to be more selective
+            //   https://www.drupal.org/project/ckeditor5/issues/3231328.
+            foreach ($attribute_config as $allowed_attribute_value => $noop) {
+              foreach ($disabled_plugins_with_attribute_config as $disabled_plugin_id => $disabled_plugin_config) {
+                if (isset($disabled_plugin_config[$tag_name][$attribute_name])) {
+                  if ($disabled_plugin_config[$tag_name][$attribute_name] === TRUE) {
+                    unset($supported_tags_with_unsupported_attributes[$tag_name][$attribute_name]);
+                    $plugins_to_enable_to_support_attribute_config[$disabled_plugin_id][$attribute_name][$tag_name] = TRUE;
+                  }
+                  elseif (is_array($disabled_plugin_config[$tag_name][$attribute_name])) {
+                    foreach ($disabled_plugin_config[$tag_name][$attribute_name] as $disabled_plugin_attribute_name => $disabled_plugin_allowed_value) {
+                      if ($disabled_plugin_attribute_name === $allowed_attribute_value) {
+                        unset($supported_tags_with_unsupported_attributes[$tag_name][$attribute_name][$allowed_attribute_value]);
+                        if (empty($supported_tags_with_unsupported_attributes[$tag_name][$attribute_name])) {
+                          unset($supported_tags_with_unsupported_attributes[$tag_name][$attribute_name]);
+                        }
+                        $plugins_to_enable_to_support_attribute_config[$disabled_plugin_id][$attribute_name][$tag_name][] = $allowed_attribute_value;
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+
+      $supported_tags_with_unsupported_attributes = array_filter($supported_tags_with_unsupported_attributes);
+      $missing_attributes = implode(' ', HTMLRestrictionsUtilities::toReadableElements($supported_tags_with_unsupported_attributes));
+
+      // If additional plugins need to be enable to support attribute config,
+      // loop through the list to enable the plugins and build a UI message that
+      // will convey this plugin-enabling to the user.
+      if (!empty($plugins_to_enable_to_support_attribute_config)) {
+        $enabled_for_attributes_message_content = '';
+        $editor_settings_to_update = $editor->getSettings();
+        foreach ($plugins_to_enable_to_support_attribute_config as $plugin_id => $reason_why_enabled) {
+          $plugin_definition = $this->pluginManager->getDefinition($plugin_id);
+          $label = $plugin_definition->label();
+          if ($plugin_definition->hasToolbarItems()) {
+            $editor_settings_to_update['toolbar']['items'] = array_merge($editor_settings_to_update['toolbar']['items'], array_keys($plugin_definition->getToolbarItems()));
+            foreach ($reason_why_enabled as $attribute_name => $attribute_config) {
+              $enabled_for_attributes_message_content .= "$label (";
+              foreach ($attribute_config as $tag_name => $attribute_value_config) {
+                $enabled_for_attributes_message_content .= " for tag: <$tag_name> to support: $attribute_name";
+                if (is_array($attribute_value_config)) {
+                  $enabled_for_attributes_message_content .= " with value(s): ";
+                  foreach ($attribute_value_config as $allowed_value) {
+                    $enabled_for_attributes_message_content .= " $allowed_value,";
+                  }
+                  $enabled_for_attributes_message_content = substr($enabled_for_attributes_message_content, 0, -1) . '), ';
+                }
+              }
+            }
+          }
+        }
+        $editor->setSettings($editor_settings_to_update);
+        // Some plugins enabled, maybe some missing attributes.
+        return [
+          substr($enabled_for_attributes_message_content, 0, -2),
+          $missing_attributes,
+        ];
+      }
+      else {
+        // No plugins enabled, maybe some missing attributes.
+        return [
+          NULL,
+          $missing_attributes,
+        ];
+      }
+    }
+    else {
+      return NULL;
+    }
+  }
+
+  /**
+   * Adds default settings for all enabled CKEditor 5 plugins.
+   *
+   * @param \Drupal\editor\EditorInterface $editor
+   *   The text editor config entity to update.
+   */
+  private function addDefaultSettingsForEnabledConfigurablePlugins(EditorInterface $editor) : void {
+    $settings = $editor->getSettings();
+    $update_settings = FALSE;
+    $enabled_definitions = $this->pluginManager->getEnabledDefinitions($editor);
+    $configurable_definitions = array_filter($enabled_definitions, function (CKEditor5PluginDefinition $definition): bool {
+      return $definition->isConfigurable();
+    });
+
+    foreach ($configurable_definitions as $plugin_name => $definition) {
+      // Skip image upload as its configuration is stored in a discrete
+      // property of the $editor object, not its settings. Also skip any plugin
+      // that already has configuration data as default values are not needed.
+      if ($plugin_name === 'ckeditor5_imageUpload' || isset($settings['plugins'][$plugin_name])) {
+        continue;
+      }
+      $update_settings = TRUE;
+      $settings['plugins'][$plugin_name] = $this->pluginManager->getPlugin($plugin_name, NULL)->defaultConfiguration();
+    }
+
+    if ($update_settings) {
+      $editor->setSettings($settings);
+    }
+  }
+
+}
diff --git a/core/modules/ckeditor5/templates/ckeditor5-settings-toolbar.html.twig b/core/modules/ckeditor5/templates/ckeditor5-settings-toolbar.html.twig
new file mode 100644
index 0000000000..017cac5634
--- /dev/null
+++ b/core/modules/ckeditor5/templates/ckeditor5-settings-toolbar.html.twig
@@ -0,0 +1,14 @@
+{% apply spaceless %}
+  <fieldset aria-labelledby="ckeditor5-toolbar-configuration" aria-describedby="ckeditor5-toolbar-description">
+    <legend id="ckeditor5-toolbar-configuration">{{ 'Toolbar configuration'|t }}</legend>
+    <div class="fieldset-wrapper">
+      <div id="ckeditor5-toolbar-description" class="fieldset-description">
+        {%- trans -%}
+          Move a button into the <em>Active toolbar</em> to enable it, or into the list of <em>Available buttons</em> to disable it. Buttons may be moved with the mouse or keyboard arrow keys.
+        {%- endtrans -%}
+      </div>
+      <div id="ckeditor5-toolbar-app"></div>
+      {{ form }}
+    </div>
+  </fieldset>
+{% endapply %}
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_definition_supporting_element/ckeditor5_definition_supporting_element.ckeditor5.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_definition_supporting_element/ckeditor5_definition_supporting_element.ckeditor5.yml
new file mode 100644
index 0000000000..0381bb6165
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_definition_supporting_element/ckeditor5_definition_supporting_element.ckeditor5.yml
@@ -0,0 +1,111 @@
+ckeditor5_definition_supporting_element_just_nav:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <nav>
+    elements:
+      - <nav>
+
+ckeditor5_definition_supporting_element_just_article:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <article>
+    elements:
+      - <article>
+
+ckeditor5_definition_supporting_element_article_class:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <article class>
+    elements:
+      - <article class>
+
+ckeditor5_definition_supporting_element_article_class_with_values:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <article class="…">
+    elements:
+      - <article class="this-value that-value">
+
+ckeditor5_definition_supporting_element_just_footer:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <footer>
+    elements:
+      - <footer>
+
+ckeditor5_definition_supporting_element_footer_class:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <footer class>
+    elements:
+      - <footer class>
+
+ckeditor5_definition_supporting_element_just_aside:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <aside>
+    elements:
+      - <aside>
+
+ckeditor5_definition_supporting_element_aside_class_with_values:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <article class="…">
+    elements:
+      - <aside class="this-value that-value">
+
+ckeditor5_definition_supporting_element_main_class:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <main class>
+    elements:
+      - <main class>
+
+ckeditor5_definition_supporting_element_main_class_with_values:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <main class="…">
+    elements:
+      - <main class="this-value that-value">
+
+ckeditor5_definition_supporting_element_figure_one_attrib:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <figure data-one>
+    elements:
+      - <figure data-one>
+
+ckeditor5_definition_supporting_element_figure_two_attrib:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <figure data-one data-two>
+    elements:
+      - <figure data-one data-two>
+
+ckeditor5_definition_supporting_element_dialog_two_attrib:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <dialog data-one data-two>
+    elements:
+      - <dialog data-one data-two>
+
+ckeditor5_definition_supporting_element_dialog_one_attrib:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — <dialog data-one>
+    elements:
+      - <dialog data-one>
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_definition_supporting_element/ckeditor5_definition_supporting_element.info.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_definition_supporting_element/ckeditor5_definition_supporting_element.info.yml
new file mode 100644
index 0000000000..ed19a8b2df
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_definition_supporting_element/ckeditor5_definition_supporting_element.info.yml
@@ -0,0 +1,7 @@
+name: CKEditor 5 Definition Supporting Tags Test
+type: module
+description: "Provides test plugins for CKEditor 5 to test finding plugin definitions that support specific tags."
+package: Testing
+core_version_requirement: ^9
+dependencies:
+  - ckeditor5:ckeditor5
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/ckeditor5_plugin_elements_subset.ckeditor5.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/ckeditor5_plugin_elements_subset.ckeditor5.yml
new file mode 100644
index 0000000000..c5218e7e2f
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/ckeditor5_plugin_elements_subset.ckeditor5.yml
@@ -0,0 +1,9 @@
+ckeditor5_plugin_elements_subset_sneakySuperset:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: Sneaky Superset
+    class: Drupal\ckeditor5_plugin_elements_subset\Plugin\CKEditor5Plugin\SneakySuperset
+    elements:
+      - <foo>
+      - <bar>
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/ckeditor5_plugin_elements_subset.info.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/ckeditor5_plugin_elements_subset.info.yml
new file mode 100644
index 0000000000..a47112763e
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/ckeditor5_plugin_elements_subset.info.yml
@@ -0,0 +1,7 @@
+name: CKEditor 5 Plugin Elements Subset Test
+type: module
+description: "Provides test plugin to test CKEditor5PluginElementsSubsetInterface"
+package: Testing
+core_version_requirement: ^9
+dependencies:
+  - ckeditor5:ckeditor5
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/src/Plugin/CKEditor5Plugin/SneakySuperset.php b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/src/Plugin/CKEditor5Plugin/SneakySuperset.php
new file mode 100644
index 0000000000..398758e298
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_subset/src/Plugin/CKEditor5Plugin/SneakySuperset.php
@@ -0,0 +1,51 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\ckeditor5_plugin_elements_subset\Plugin\CKEditor5Plugin;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
+use Drupal\ckeditor5\Plugin\CKEditor5PluginElementsSubsetInterface;
+use Drupal\Core\Form\FormStateInterface;
+
+class SneakySuperset extends CKEditor5PluginDefault implements CKEditor5PluginElementsSubsetInterface {
+
+  use CKEditor5PluginConfigurableTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'configured_subset' => [],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getElementsSubset(): array {
+    return $this->configuration['configured_subset'];
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_test/ckeditor5_plugin_elements_test.ckeditor5.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_test/ckeditor5_plugin_elements_test.ckeditor5.yml
new file mode 100644
index 0000000000..37a8c85c10
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_test/ckeditor5_plugin_elements_test.ckeditor5.yml
@@ -0,0 +1,33 @@
+# cspell:ignore everyblock justblockquote
+ckeditor5_plugin_elements_test_blockquoteCombo:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — block quote combo
+    elements:
+      - <blockquote data-justblockquote>
+      - <$block data-everyblock>
+
+ckeditor5_plugin_elements_test_headingsWithOtherAttributes:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — headings with other attributes
+    elements:
+      - <h1 data-just-h1>
+      - <h2 class="additional-allowed-class">
+      - <h3 data-just-h3 data-just-h3-limited="i-am-the-only-allowed-value">
+      - <h5 data-just-h5-limited="first-allowed-value second-allowed-value">
+
+ckeditor5_plugin_elements_test_headingsUseClassAnyValue:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST — headings with any class
+    elements:
+      - <h1 class>
+      - <h2 class>
+      - <h3 class>
+      - <h4 class>
+      - <h5 class>
+      - <h6 class>
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_test/ckeditor5_plugin_elements_test.info.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_test/ckeditor5_plugin_elements_test.info.yml
new file mode 100644
index 0000000000..aba0fa1edc
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_plugin_elements_test/ckeditor5_plugin_elements_test.info.yml
@@ -0,0 +1,7 @@
+name: CKEditor 5 Plugin Elements Test
+type: module
+description: "Provides test plugins for CKEditor 5 to test allowed elements parsing."
+package: Testing
+core_version_requirement: ^9
+dependencies:
+  - ckeditor5:ckeditor5
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.ckeditor5.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.ckeditor5.yml
new file mode 100644
index 0000000000..c7f853e446
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.ckeditor5.yml
@@ -0,0 +1,18 @@
+# cspell:ignore layercake
+ckeditor5_test_layercake:
+  ckeditor5:
+    plugins:
+      - layerCake.SimpleBox
+      - layerCake.TwoCol
+  drupal:
+    label: TEST — Layercake
+    library: ckeditor5_test/layercake
+    toolbar_items:
+      simpleBox:
+        label: Simple Box
+      twoCol:
+        label: Two Col layout
+    elements:
+      - <h1 class>
+      - <div class>
+      - <section class>
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.info.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.info.yml
new file mode 100644
index 0000000000..2e14f048d6
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.info.yml
@@ -0,0 +1,8 @@
+name: CKEditor 5 Test
+type: module
+description: "Provides test layout and component plugins for CKEditor 5."
+package: Testing
+core_version_requirement: ^9
+dependencies:
+  - drupal:editor
+  - ckeditor5:ckeditor5
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.libraries.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.libraries.yml
new file mode 100644
index 0000000000..c0c6118044
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.libraries.yml
@@ -0,0 +1,15 @@
+# cspell:ignore layercake
+layercake:
+  remote: https://github.com/zrpnr/ckeditor5-drupal-layercake
+  version: 1.0.0
+  license:
+    name: GNU-GPL-2.0-or-later
+    url: https://github.com/zrpnr/ckeditor5-drupal-layercake/blob/main/LICENSE
+    gpl-compatible: true
+  js:
+    js/build/layercake.js: { preprocess: false, minified: true }
+  css:
+    theme:
+      css/layout.css: {}
+  dependencies:
+    - core/ckeditor5
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.routing.yml b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.routing.yml
new file mode 100644
index 0000000000..50d7848984
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_test/ckeditor5_test.routing.yml
@@ -0,0 +1,6 @@
+ckeditor5_test.off_canvas:
+  path: '/ckeditor5_test/off_canvas'
+  defaults:
+    _controller: '\Drupal\ckeditor5_test\Controller\CKEditor5OffCanvasTestController::testOffCanvas'
+  requirements:
+    _access: 'TRUE'
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_test/css/layout.css b/core/modules/ckeditor5/tests/modules/ckeditor5_test/css/layout.css
new file mode 100644
index 0000000000..91a76da70b
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_test/css/layout.css
@@ -0,0 +1,14 @@
+.layout--two-col {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+}
+
+.simple-box {
+  padding: 0.5rem;
+  background: #ccc;
+}
+
+.simple-box-title,
+.simple-box-description {
+  background: #fff;
+}
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_test/js/build/layercake.js b/core/modules/ckeditor5/tests/modules/ckeditor5_test/js/build/layercake.js
new file mode 100644
index 0000000000..9a48179291
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_test/js/build/layercake.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.layerCake=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.layerCake=t())}(window,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s="./src/index.js")}({"./src/index.js":function(e,t,o){"use strict";o.r(t);var i=o("ckeditor5/src/core.js"),n=o("ckeditor5/src/widget.js");class l extends i.Command{execute(){const{model:e}=this.editor;e.change(t=>{e.insertContent(function(e){const t=e.createElement("simpleBox"),o=e.createElement("simpleBoxTitle"),i=e.createElement("simpleBoxDescription");return e.append(o,t),e.append(i,t),e.appendElement("paragraph",i),t}(t))})}refresh(){const{model:e}=this.editor,{selection:t}=e.document,o=e.schema.findAllowedParent(t.getFirstPosition(),"simpleBox");this.isEnabled=null!==o}}class s extends i.Plugin{static get requires(){return[n.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertSimpleBox",new l(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("simpleBox",{isObject:!0,allowWhere:"$block"}),e.register("simpleBoxTitle",{isLimit:!0,allowIn:"simpleBox",allowContentOf:"$block"}),e.register("simpleBoxDescription",{isLimit:!0,allowIn:"simpleBox",allowContentOf:"$root"}),e.addChildCheck((e,t)=>{if(e.endsWith("simpleBoxDescription")&&"simpleBox"==t.name)return!1})}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:"simpleBox",view:{name:"section",classes:"simple-box"}}),e.for("dataDowncast").elementToElement({model:"simpleBox",view:{name:"section",classes:"simple-box"}}),e.for("editingDowncast").elementToElement({model:"simpleBox",view:(e,{writer:t})=>{const o=t.createContainerElement("section",{class:"simple-box"});return Object(n.toWidget)(o,t,{label:"simple box widget"})}}),e.for("upcast").elementToElement({model:"simpleBoxTitle",view:{name:"h1",classes:"simple-box-title"}}),e.for("dataDowncast").elementToElement({model:"simpleBoxTitle",view:{name:"h1",classes:"simple-box-title"}}),e.for("editingDowncast").elementToElement({model:"simpleBoxTitle",view:(e,{writer:t})=>{const o=t.createEditableElement("h1",{class:"simple-box-title"});return Object(n.toWidgetEditable)(o,t)}}),e.for("upcast").elementToElement({model:"simpleBoxDescription",view:{name:"div",classes:"simple-box-description"}}),e.for("dataDowncast").elementToElement({model:"simpleBoxDescription",view:{name:"div",classes:"simple-box-description"}}),e.for("editingDowncast").elementToElement({model:"simpleBoxDescription",view:(e,{writer:t})=>{const o=t.createEditableElement("div",{class:"simple-box-description"});return Object(n.toWidgetEditable)(o,t)}})}}var r=o("ckeditor5/src/ui.js");class c extends i.Plugin{init(){const e=this.editor;e.ui.componentFactory.add("simpleBox",t=>{const o=e.commands.get("insertSimpleBox"),i=new r.ButtonView(t);return i.set({label:e.t("Simple Box"),withText:!0,tooltip:!0}),i.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(i,"execute",()=>e.execute("insertSimpleBox")),i})}}class a extends i.Plugin{static get requires(){return[s,c]}}class d extends i.Command{execute(){const{model:e}=this.editor;e.change(t=>{e.insertContent(function(e){const t=e.createElement("twoCol"),o=e.createElement("col"),i=e.createElement("col");return e.append(o,t),e.append(i,t),e.appendElement("paragraph",o),e.appendElement("paragraph",i),t}(t))})}refresh(){const{model:e}=this.editor,{selection:t}=e.document,o=e.schema.findAllowedParent(t.getFirstPosition(),"twoCol");this.isEnabled=null!==o}}class m extends i.Plugin{static get requires(){return[n.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertTwoCol",new d(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("twoCol",{isObject:!0,allowWhere:"$block"}),e.register("col",{isLimit:!0,allowIn:"twoCol",allowContentOf:"$root"})}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:"twoCol",view:{name:"section",classes:"layout--two-col"}}),e.for("dataDowncast").elementToElement({model:"twoCol",view:{name:"section",classes:"layout--two-col"}}),e.for("editingDowncast").elementToElement({model:"twoCol",view:(e,{writer:t})=>{const o=t.createContainerElement("section",{class:"layout--two-col"});return Object(n.toWidget)(o,t,{label:"Two col layout widget"})}}),e.for("upcast").elementToElement({model:"col",view:{name:"div",classes:"layout__col"}}),e.for("dataDowncast").elementToElement({model:"col",view:{name:"div",classes:"layout__col"}}),e.for("editingDowncast").elementToElement({model:"col",view:(e,{writer:t})=>{const o=t.createEditableElement("div",{class:"layout__col"});return Object(n.toWidgetEditable)(o,t)}})}}class u extends i.Plugin{init(){const e=this.editor;e.ui.componentFactory.add("twoCol",t=>{const o=e.commands.get("insertTwoCol"),i=new r.ButtonView(t);return i.set({label:e.t("Two Col"),withText:!0,tooltip:!0}),i.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(i,"execute",()=>e.execute("insertTwoCol")),i})}}class p extends i.Plugin{static get requires(){return[m,u]}}t.default={SimpleBox:a,TwoCol:p}},"ckeditor5/src/core.js":function(e,t,o){e.exports=o("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":function(e,t,o){e.exports=o("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":function(e,t,o){e.exports=o("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":function(e,t){e.exports=CKEditor5.dll}}).default}));
diff --git a/core/modules/ckeditor5/tests/modules/ckeditor5_test/src/Controller/CKEditor5OffCanvasTestController.php b/core/modules/ckeditor5/tests/modules/ckeditor5_test/src/Controller/CKEditor5OffCanvasTestController.php
new file mode 100644
index 0000000000..49951f3b36
--- /dev/null
+++ b/core/modules/ckeditor5/tests/modules/ckeditor5_test/src/Controller/CKEditor5OffCanvasTestController.php
@@ -0,0 +1,35 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\ckeditor5_test\Controller;
+
+use Drupal\Core\Url;
+
+/**
+ * Provides controller for testing CKEditor in off-canvas dialogs.
+ */
+class CKEditor5OffCanvasTestController {
+
+  /**
+   * Returns a link that can open a node add form in an off-canvas dialog.
+   *
+   * @return array
+   *   A render array.
+   */
+  public function testOffCanvas() {
+    $build['link'] = [
+      '#type' => 'link',
+      '#title' => 'Add Node',
+      '#url' => Url::fromRoute('node.add', ['node_type' => 'page']),
+      '#attributes' => [
+        'class' => ['use-ajax'],
+        'data-dialog-type' => 'dialog',
+        'data-dialog-renderer' => 'off_canvas',
+      ],
+    ];
+    $build['#attached']['library'][] = 'core/drupal.dialog.off_canvas';
+    return $build;
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Functional/ImageUploadAccessTest.php b/core/modules/ckeditor5/tests/src/Functional/ImageUploadAccessTest.php
new file mode 100644
index 0000000000..c902fff755
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Functional/ImageUploadAccessTest.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\Functional;
+
+/**
+ * Test image upload access.
+ *
+ * @group ckeditor5
+ */
+class ImageUploadAccessTest extends ImageUploadTest {
+
+  /**
+   * Test access to the CKEditor 5 image upload controller.
+   */
+  public function testCkeditor5ImageUploadRoute() {
+    $this->createBasicFormat();
+    $url = $this->getUploadUrl();
+    $test_image = file_get_contents(current($this->getTestFiles('image'))->uri);
+
+    // With no text editor, expect a 404.
+    $response = $this->uploadRequest($url, $test_image, 'test.jpg');
+    $this->assertSame(404, $response->getStatusCode());
+
+    $editor = $this->createEditorWithUpload([
+      'status' => FALSE,
+      'scheme' => 'public',
+      'directory' => 'inline-images',
+      'max_size' => '',
+      'max_dimensions' => [
+        'width' => 0,
+        'height' => 0,
+      ],
+    ]);
+
+    // Ensure that images cannot be uploaded when image upload is disabled.
+    $response = $this->uploadRequest($url, $test_image, 'test.jpg');
+    $this->assertSame(403, $response->getStatusCode());
+
+    $editor->setImageUploadSettings(['status' => TRUE] + $editor->getImageUploadSettings())
+      ->save();
+    $response = $this->uploadRequest($url, $test_image, 'test.jpg');
+    $this->assertSame(201, $response->getStatusCode());
+
+    // Ensure that users without permissions to the text format cannot upload
+    // images.
+    $this->drupalLogout();
+    $response = $this->uploadRequest($url, $test_image, 'test.jpg');
+    $this->assertSame(403, $response->getStatusCode());
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Functional/ImageUploadTest.php b/core/modules/ckeditor5/tests/src/Functional/ImageUploadTest.php
new file mode 100644
index 0000000000..96f76ed349
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Functional/ImageUploadTest.php
@@ -0,0 +1,252 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\Functional;
+
+use Drupal\Core\Url;
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\Tests\BrowserTestBase;
+use Drupal\Tests\jsonapi\Functional\JsonApiRequestTestTrait;
+use Drupal\Tests\TestFileCreationTrait;
+use Drupal\user\RoleInterface;
+use GuzzleHttp\RequestOptions;
+
+/**
+ * Test image upload.
+ *
+ * @group ckeditor5
+ */
+class ImageUploadTest extends BrowserTestBase {
+
+  use JsonApiRequestTestTrait;
+  use TestFileCreationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'editor',
+    'filter',
+    'ckeditor5',
+  ];
+
+  /**
+   * A user without any particular permissions to be used in testing.
+   *
+   * @var \Drupal\user\Entity\User
+   */
+  protected $user;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    $this->user = $this->drupalCreateUser();
+    $this->drupalLogin($this->user);
+  }
+
+  /**
+   * Tests using the file upload route with a disallowed extension.
+   */
+  public function testUploadFileExtension() {
+    $this->createBasicFormat();
+    $this->createEditorWithUpload([
+      'status' => TRUE,
+      'scheme' => 'public',
+      'directory' => 'inline-images',
+      'max_size' => '',
+      'max_dimensions' => [
+        'width' => 0,
+        'height' => 0,
+      ],
+    ]);
+
+    $url = $this->getUploadUrl();
+    $image_file = file_get_contents(current($this->getTestFiles('image'))->uri);
+    $non_image_file = file_get_contents(current($this->getTestFiles('php'))->uri);
+    $response = $this->uploadRequest($url, $non_image_file, 'test.php');
+    $this->assertSame(422, $response->getStatusCode());
+
+    $response = $this->uploadRequest($url, $image_file, 'test.jpg');
+    $this->assertSame(201, $response->getStatusCode());
+  }
+
+  /**
+   * Tests using the file upload route with a file size larger than allowed.
+   */
+  public function testFileUploadLargerFileSize() {
+    $this->createBasicFormat();
+    $this->createEditorWithUpload([
+      'status' => TRUE,
+      'scheme' => 'public',
+      'directory' => 'inline-images',
+      'max_size' => 30000,
+      'max_dimensions' => [
+        'width' => 0,
+        'height' => 0,
+      ],
+    ]);
+
+    $url = $this->getUploadUrl();
+    $images = $this->getTestFiles('image');
+    $large_image = $this->getTestImageByStat($images, 'size', function ($size) {
+      return $size > 30000;
+    });
+    $small_image = $this->getTestImageByStat($images, 'size', function ($size) {
+      return $size < 30000;
+    });
+
+    $response = $this->uploadRequest($url, file_get_contents($large_image->uri), 'large.jpg');
+    $this->assertSame(422, $response->getStatusCode());
+
+    $response = $this->uploadRequest($url, file_get_contents($small_image->uri), 'small.jpg');
+    $this->assertSame(201, $response->getStatusCode());
+  }
+
+  /**
+   * Test that lock is removed after a failed validation.
+   *
+   * @see https://www.drupal.org/project/drupal/issues/3184974
+   */
+  public function testLockAfterFailedValidation() {
+    $this->createBasicFormat();
+    $this->createEditorWithUpload([
+      'status' => TRUE,
+      'scheme' => 'public',
+      'directory' => 'inline-images',
+      'max_size' => 30000,
+      'max_dimensions' => [
+        'width' => 0,
+        'height' => 0,
+      ],
+    ]);
+
+    $url = $this->getUploadUrl();
+    $images = $this->getTestFiles('image');
+    $large_image = $this->getTestImageByStat($images, 'size', function ($size) {
+      return $size > 30000;
+    });
+    $small_image = $this->getTestImageByStat($images, 'size', function ($size) {
+      return $size < 30000;
+    });
+    $response = $this->uploadRequest($url, file_get_contents($large_image->uri), 'same.jpg');
+    $this->assertSame(422, $response->getStatusCode());
+
+    $response = $this->uploadRequest($url, file_get_contents($small_image->uri), 'same.jpg');
+    $this->assertSame(201, $response->getStatusCode());
+  }
+
+  /**
+   * Make upload request to a controller.
+   *
+   * @param \Drupal\Core\Url $url
+   *   The URL for the request.
+   * @param string $file_contents
+   *   File contents.
+   * @param string $file_name
+   *   Name of the file.
+   *
+   * @return \Psr\Http\Message\ResponseInterface
+   *   The response.
+   */
+  protected function uploadRequest(Url $url, string $file_contents, string $file_name) {
+    $request_options[RequestOptions::HEADERS] = [
+      'Accept' => 'application/json',
+    ];
+    $request_options[RequestOptions::MULTIPART] = [
+      [
+        'name' => 'upload',
+        'filename' => $file_name,
+        'contents' => $file_contents,
+      ],
+    ];
+
+    return $this->request('POST', $url, $request_options);
+  }
+
+  /**
+   * Provides the image upload url.
+   *
+   * @return \Drupal\Core\Url
+   *   The upload image url for the basic_html format.
+   */
+  protected function getUploadUrl() {
+    return Url::fromRoute('ckeditor5.upload_image', ['editor' => 'basic_html']);
+  }
+
+  /**
+   * Create a basic_html text format for the editor to reference.
+   *
+   * @throws \Drupal\Core\Entity\EntityStorageException
+   */
+  protected function createBasicFormat() {
+    $basic_html_format = FilterFormat::create([
+      'format' => 'basic_html',
+      'name' => 'Basic HTML',
+      'weight' => 1,
+      'filters' => [
+        'filter_html_escape' => ['status' => 1],
+      ],
+      'roles' => [RoleInterface::AUTHENTICATED_ID],
+    ]);
+    $basic_html_format->save();
+  }
+
+  /**
+   * Create an editor entity with image_upload config.
+   *
+   * @param array $upload_config
+   *   The editor image_upload config.
+   *
+   * @return \Drupal\Core\Entity\EntityBase|\Drupal\Core\Entity\EntityInterface
+   *   The text editor entity.
+   *
+   * @throws \Drupal\Core\Entity\EntityStorageException
+   */
+  protected function createEditorWithUpload(array $upload_config) {
+    $editor = Editor::create([
+      'editor' => 'ckeditor5',
+      'format' => 'basic_html',
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'uploadImage',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => $upload_config,
+    ]);
+    $editor->save();
+
+    return $editor;
+  }
+
+  /**
+   * Return the first image matching $condition.
+   *
+   * @param array $images
+   *   Images created with getTestFiles().
+   * @param string $stat
+   *   A key in the array returned from stat().
+   * @param callable $condition
+   *   A function to compare a value of the image file.
+   *
+   * @return object|bool
+   *   Objects with 'uri', 'filename', and 'name' properties.
+   */
+  protected function getTestImageByStat(array $images, string $stat, callable $condition) {
+    return current(array_filter($images, function ($image) use ($condition, $stat) {
+      $stats = stat($image->uri);
+      return $condition($stats[$stat]);
+    }));
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Functional/MediaImageTest.php b/core/modules/ckeditor5/tests/src/Functional/MediaImageTest.php
new file mode 100644
index 0000000000..fb8ed9ec23
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Functional/MediaImageTest.php
@@ -0,0 +1,180 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\Functional;
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\editor\Entity\Editor;
+use Drupal\file\Entity\File;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\media\Entity\Media;
+use Drupal\Tests\BrowserTestBase;
+use Drupal\Tests\media\Traits\MediaTypeCreationTrait;
+use Drupal\Tests\TestFileCreationTrait;
+use Drupal\user\RoleInterface;
+use Symfony\Component\Validator\ConstraintViolation;
+
+/**
+ * Tests that image media types are determined correctly.
+ *
+ * @group ckeditor5
+ */
+class MediaImageTest extends BrowserTestBase {
+
+  use TestFileCreationTrait;
+  use MediaTypeCreationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'system',
+    'user',
+    'filter',
+    'editor',
+    'ckeditor5',
+    'media',
+  ];
+
+  /**
+   * The sample image media entity to use for testing.
+   *
+   * @var \Drupal\media\MediaInterface
+   */
+  protected $mediaImage;
+
+  /**
+   * The sample file media entity to use for testing.
+   *
+   * @var \Drupal\media\MediaInterface
+   */
+  protected $mediaFile;
+
+  /**
+   * The editor instance to use for testing.
+   *
+   * @var \Drupal\editor\Entity\Editor
+   */
+  protected $editor;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    $filtered_html_format = FilterFormat::create([
+      'format' => 'filtered_html',
+      'name' => 'Filtered HTML',
+      'weight' => 0,
+      'filters' => [
+        'filter_html' => [
+          'id' => 'filter_html',
+          'status' => TRUE,
+          'weight' => -10,
+          'settings' => [
+            'allowed_html' => "<p> <br> <drupal-media data-entity-type data-entity-uuid alt>",
+            'filter_html_help' => TRUE,
+            'filter_html_nofollow' => TRUE,
+          ],
+        ],
+        'media_embed' => ['status' => TRUE],
+      ],
+      'roles' => [RoleInterface::AUTHENTICATED_ID],
+    ]);
+    $filtered_html_format->save();
+    $this->editor = Editor::create([
+      'format' => 'filtered_html',
+      'editor' => 'ckeditor5',
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+      ],
+    ]);
+    $this->editor->save();
+    $this->assertSame([], array_map(
+      function (ConstraintViolation $v) {
+        return (string) $v->getMessage();
+      },
+      iterator_to_array(CKEditor5::validatePair($this->editor, $filtered_html_format))
+    ));
+
+    // Create a sample media entity to be embedded.
+    $this->createMediaType('image', ['id' => 'image']);
+    File::create([
+      'uri' => $this->getTestFiles('image')[0]->uri,
+    ])->save();
+    $this->mediaImage = Media::create([
+      'bundle' => 'image',
+      'name' => 'Screaming hairy armadillo',
+      'field_media_image' => [
+        [
+          'target_id' => 1,
+          'alt' => 'default alt',
+          'title' => 'default title',
+        ],
+      ],
+    ]);
+    $this->mediaImage->save();
+
+    $this->createMediaType('file', ['id' => 'file']);
+    File::create([
+      'uri' => $this->getTestFiles('text')[0]->uri,
+    ])->save();
+    $this->mediaFile = Media::create([
+      'bundle' => 'file',
+      'name' => 'Information about screaming hairy armadillo',
+      'field_media_file' => [
+        [
+          'target_id' => 2,
+        ],
+      ],
+    ]);
+    $this->mediaFile->save();
+
+    $this->adminUser = $this->drupalCreateUser([
+      'use text format filtered_html',
+    ]);
+    $this->drupalLogin($this->adminUser);
+  }
+
+  /**
+   * Tests that media entity with image field is recognized.
+   */
+  public function testIsMediaImage() {
+    $this->drupalGet('/ckeditor5/filtered_html/is-media-image');
+    $this->assertSession()->statusCodeEquals(400);
+
+    $this->drupalGet('/ckeditor5/filtered_html/is-media-image', ['query' => ['uuid' => $this->mediaImage->uuid()]]);
+    $this->assertSession()->statusCodeEquals(200);
+    $this->assertSame(json_encode(TRUE), $this->getSession()->getPage()->getContent());
+
+    $this->drupalGet('/ckeditor5/filtered_html/is-media-image', ['query' => ['uuid' => $this->mediaFile->uuid()]]);
+    $this->assertSession()->statusCodeEquals(200);
+    $this->assertSame(json_encode(FALSE), $this->getSession()->getPage()->getContent());
+
+    // Ensure that unpublished media returns 403.
+    $this->mediaImage->setUnpublished()->save();
+    $this->drupalGet('/ckeditor5/filtered_html/is-media-image', ['query' => ['uuid' => $this->mediaImage->uuid()]]);
+    $this->assertSession()->statusCodeEquals(403);
+
+    // Ensure that users that don't have access to the filter format receive
+    // either 404 or 403.
+    $this->drupalLogout();
+    $this->drupalGet('/ckeditor5/filtered_html/is-media-image');
+    $this->assertSession()->statusCodeEquals(400);
+
+    $this->drupalGet('/ckeditor5/filtered_html/is-media-image', ['query' => ['uuid' => $this->mediaImage->uuid()]]);
+    $this->assertSession()->statusCodeEquals(403);
+
+    $this->mediaImage->setPublished()->save();
+    $this->drupalGet('/ckeditor5/filtered_html/is-media-image', ['query' => ['uuid' => $this->mediaImage->uuid()]]);
+    $this->assertSession()->statusCodeEquals(403);
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/AdminUiTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/AdminUiTest.php
new file mode 100644
index 0000000000..d115536e27
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/AdminUiTest.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+/**
+ * Tests for CKEditor 5 in the admin UI.
+ *
+ * @group ckeditor5
+ */
+class AdminUiTest extends CKEditor5TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'media_library',
+    'ckeditor',
+  ];
+
+  /**
+   * Confirm settings only trigger AJAX when select value is CKEditor 5.
+   */
+  public function testSettingsOnlyFireAjaxWithCkeditor5() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+    $this->addNewTextFormat($page, $assert_session);
+    $this->addNewTextFormat($page, $assert_session, 'ckeditor');
+
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor5');
+    $number_ajax_instances_before = $this->getSession()->evaluateScript('Drupal.ajax.instances.length');
+
+    // Enable media embed to trigger an AJAX rebuild.
+    $this->assertTrue($page->hasUncheckedField('filters[media_embed][status]'));
+    $page->checkField('filters[media_embed][status]');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ajax-progress-throbber'));
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->responseContains('Media types selectable in the Media Library');
+    $assert_session->assertWaitOnAjaxRequest();
+    $number_ajax_instances_after = $this->getSession()->evaluateScript('Drupal.ajax.instances.length');
+
+    // After the rebuild, there should be more AJAX instances.
+    $this->assertGreaterThan($number_ajax_instances_before, $number_ajax_instances_after);
+
+    // Perform the same steps as above with CKEditor, and confirm AJAX callbacks
+    // are not triggered on settings changes.
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor');
+    $number_ajax_instances_before = $this->getSession()->evaluateScript('Drupal.ajax.instances.length');
+
+    // Enable media embed to confirm a format not using CKEditor 5 will not
+    // trigger an AJAX rebuild.
+    $this->assertTrue($page->hasUncheckedField('filters[media_embed][status]'));
+    $page->checkField('filters[media_embed][status]');
+    $this->assertEmpty($assert_session->waitForElement('css', '.ajax-progress-throbber'));
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->responseContains('Media types selectable in the Media Library');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $number_ajax_instances_after = $this->getSession()->evaluateScript('Drupal.ajax.instances.length');
+    $this->assertSame($number_ajax_instances_before, $number_ajax_instances_after);
+
+    // Confirm that AJAX updates happen when attempting to switch to CKEditor 5,
+    // even if prevented from doing so by validation.
+    $this->drupalGet('admin/config/content/formats/add');
+    $page->fillField('name', 'trigger validator');
+    $assert_session->waitForText('Machine name');
+    $page->checkField('roles[authenticated]');
+
+    // Enable a filter that is incompatible with CKEditor 5, so validation is
+    // triggered when attempting to switch.
+    $number_ajax_instances_before = $this->getSession()->evaluateScript('Drupal.ajax.instances.length');
+    $this->assertTrue($page->hasUncheckedField('filters[filter_autop][status]'));
+    $page->checkField('filters[filter_autop][status]');
+    $this->assertEmpty($assert_session->waitForElement('css', '.ajax-progress-throbber'));
+    $assert_session->assertWaitOnAjaxRequest();
+    $number_ajax_instances_after = $this->getSession()->evaluateScript('Drupal.ajax.instances.length');
+    $this->assertSame($number_ajax_instances_before, $number_ajax_instances_after);
+
+    $page->selectFieldOption('editor[editor]', 'ckeditor5');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // The presence of this validation error message confirms the AJAX callback
+    // was invoked.
+    $assert_session->pageTextContains('CKEditor 5 only works with HTML-based text formats');
+
+    // Disable the incompatible filter. This should trigger another AJAX rebuild
+    // which will include the removal of the validation error as the issue has
+    // been corrected.
+    $this->assertTrue($page->hasCheckedField('filters[filter_autop][status]'));
+    $page->uncheckField('filters[filter_autop][status]');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ajax-progress-throbber'));
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextNotContains('CKEditor 5 only works with HTML-based text formats');
+  }
+
+  /**
+   * CKEditor5's filter UI modifications should not break it for other editors.
+   */
+  public function testFiltersHiddenWhenNotAvailable() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+    $this->createNewTextFormat($page, $assert_session, 'ckeditor');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextNotContains('Filter settings');
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5AllowedTagsTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5AllowedTagsTest.php
new file mode 100644
index 0000000000..4e8a41b963
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5AllowedTagsTest.php
@@ -0,0 +1,471 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Drupal\filter\Entity\FilterFormat;
+use Symfony\Component\Yaml\Yaml;
+
+// cspell:ignore esque imageUpload nofilter noeditor sourceediting Editing's
+
+/**
+ * Tests for CKEditor5.
+ *
+ * @group ckeditor5
+ */
+class CKEditor5AllowedTagsTest extends CKEditor5TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'node',
+    'ckeditor',
+    'ckeditor5',
+    'media',
+    'media_library',
+  ];
+
+  /**
+   * The default CKEditor 5 allowed elements.
+   *
+   * @var string
+   */
+  protected $allowedElements = '<br> <p> <h2> <h3> <h4> <h5> <h6> <strong> <em>';
+
+  /**
+   * The element that must be allowed when media embed is enabled.
+   *
+   * @var string
+   */
+  protected $mediaElement = '<drupal-media data-entity-type data-entity-uuid alt>';
+
+  /**
+   * The default allowed elements when adding a non-CKEditor 5 editor.
+   *
+   * @var string
+   */
+  protected $defaultElementsWhenAddingNotCkeditor5 = "<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type='1 A I'> <li> <dl> <dt> <dd> <h2 id='jump-*'> <h3 id> <h4 id> <h5 id> <h6 id>";
+
+  /**
+   * The default allowed elements when updating a non-CKEditor 5 editor.
+   *
+   * This is slightly different than when adding, as saving this value strips
+   * invalid attributes.
+   *
+   * @var string
+   */
+  protected $defaultElementsWhenUpdatingNotCkeditor5 = '<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id> <img src alt data-entity-type data-entity-uuid>';
+
+  /**
+   * Test enabling CKEditor 5 in a way that triggers validation.
+   */
+  public function testEnablingToVersion5Validation() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session, 'ckeditor');
+    $page->selectFieldOption('editor[editor]', 'ckeditor');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->checkField('filters[filter_html][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->selectFieldOption('editor[editor]', 'ckeditor5');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextContains('CKEditor 5 needs at least the <p> and <br> tags to be allowed to be able to function. They are not allowed by the "Limit allowed HTML tags and correct faulty HTML" (filter_html) filter.');
+
+    // Add the tags that must be included in the html filter for CKEditor 5
+    // defaults.
+    $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $allowed_html_field->setValue('<p> <br>');
+
+    // Confirm there are no longer any warnings.
+    $assert_session->waitForElementRemoved('css', '[data-drupal-messages] [role="alert"]');
+
+    $page->pressButton('update-ckeditor5-allowed-tags');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->saveNewTextFormat($page, $assert_session);
+  }
+
+  /**
+   * Confirm that switching to CKEditor 5 from another editor updates tags.
+   */
+  public function testSwitchToVersion5() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session, 'ckeditor');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Enable the HTML filter.
+    $this->assertTrue($page->hasUncheckedField('filters[filter_html][status]'));
+    $page->checkField('filters[filter_html][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Confirm the allowed HTML tags are the defaults for non-Ckeditor5 editors.
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $this->defaultElementsWhenAddingNotCkeditor5);
+
+    $this->saveNewTextFormat($page, $assert_session);
+    $assert_session->pageTextContains('Added text format ckeditor');
+
+    // Return to the config form to confirm that switching text editors on
+    // existing formats will properly switch allowed tags.
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $this->defaultElementsWhenUpdatingNotCkeditor5);
+
+    $page->selectFieldOption('editor[editor]', 'ckeditor5');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $this->assertTrue($page->find('css', '[name="editor[editor]"]')->hasClass('error'));
+    $this->assertNotEmpty($assert_session->waitForElement('css', '[data-ckeditor5-allowed-tags-info]'));
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $this->defaultElementsWhenUpdatingNotCkeditor5);
+
+    $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $allowed_html_field->setValue('<p> <br>');
+
+    $page->pressButton('update-ckeditor5-allowed-tags');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertFalse($page->find('css', '[name="editor[editor]"]')->hasClass('error'));
+    $page->pressButton('Save configuration');
+
+    $assert_session->pageTextContains('The Image upload toolbar item requires image uploads to be enabled.');
+    $page->clickLink('Image Upload');
+    $assert_session->waitForText('Enable image uploads');
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_imageUpload][image_upload][status]'));
+    $page->checkField('editor[settings][plugins][ckeditor5_imageUpload][image_upload][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+
+    $assert_session->pageTextContains('The text format ckeditor has been updated');
+  }
+
+  /**
+   * Tests the language config form.
+   */
+  public function testLanguageConfigForm() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // The language plugin config form should not be present.
+    $assert_session->elementNotExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-language"]');
+
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-textPartLanguage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-textPartLanguage', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // The language plugin config form should now be present.
+    $assert_session->elementExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-language"]');
+  }
+
+  /**
+   * Tests that the img tag is added after enabling image uploads.
+   */
+  public function testImgAddedViaUploadPlugin() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $this->assertTrue($allowed_html_field->hasAttribute('readonly'));
+
+    // Allowed tags are currently the default, with no <img>.
+    $this->assertEquals($this->allowedElements, $allowed_html_field->getValue());
+
+    // The image upload settings form should not be present.
+    $assert_session->elementNotExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-imageupload"]');
+
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-uploadImage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-uploadImage', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // The image upload settings form should now be present.
+    $assert_session->elementExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-imageupload"]');
+
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-active .ckeditor5-toolbar-item-uploadImage'));
+
+    // The image upload plugin is enabled, but <img> not yet allowed.
+    $this->assertEquals($this->allowedElements, $allowed_html_field->getValue());
+
+    $page->clickLink('Image Upload');
+    $assert_session->waitForText('Enable image uploads');
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_imageUpload][image_upload][status]'));
+    $page->checkField('editor[settings][plugins][ckeditor5_imageUpload][image_upload][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Enabling image uploads adds <img> with several attributes to allowed
+    // tags.
+    $this->assertEquals($this->allowedElements . ' <img src alt data-entity-uuid data-entity-type height width>', $allowed_html_field->getValue());
+
+    // Also enabling the caption filter will add the data-caption attribute to
+    // <img>.
+    $this->assertTrue($page->hasUncheckedField('filters[filter_caption][status]'));
+    $page->checkField('filters[filter_caption][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertEquals($this->allowedElements . ' <img src alt data-entity-uuid data-entity-type height width data-caption>', $allowed_html_field->getValue());
+
+    // Also enabling the alignment filter will add the data-align attribute to
+    // <img>.
+    $this->assertTrue($page->hasUncheckedField('filters[filter_align][status]'));
+    $page->checkField('filters[filter_align][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertEquals($this->allowedElements . ' <img src alt data-entity-uuid data-entity-type height width data-caption data-align>', $allowed_html_field->getValue());
+
+    // Disable image upload.
+    $page->clickLink('Image Upload');
+    $assert_session->waitForText('Enable image uploads');
+    $this->assertTrue($page->hasCheckedField('editor[settings][plugins][ckeditor5_imageUpload][image_upload][status]'));
+    $page->uncheckField('editor[settings][plugins][ckeditor5_imageUpload][image_upload][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Confirm <img> is no longer an allowed tag, once image upload disabled.
+    $this->assertEquals($this->allowedElements, $allowed_html_field->getValue());
+  }
+
+  /**
+   * Test filter_html allowed tags.
+   */
+  public function testAllowedTags() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Confirm the "allowed tags" field is  read only, and the value
+    // matches the tags required by CKEditor.
+    // Allowed HTML field is readonly and its wrapper has a form-disabled class.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.js-form-item-filters-filter-html-settings-allowed-html.form-disabled'));
+    $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $this->assertTrue($allowed_html_field->hasAttribute('readonly'));
+    $this->assertSame($this->allowedElements, $allowed_html_field->getValue());
+    $this->saveNewTextFormat($page, $assert_session);
+
+    $assert_session->pageTextContains('Added text format ckeditor5');
+    $assert_session->pageTextContains('Text formats and editors');
+
+    // Confirm the filter config was updated with the correct allowed tags.
+    $this->assertSame($this->allowedElements, FilterFormat::load('ckeditor5')->filters('filter_html')->getConfiguration()['settings']['allowed_html']);
+
+    $page->find('css', '[data-drupal-selector="edit-formats-ckeditor5"]')->clickLink('Configure');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Add the block quote plugin to the CKEditor 5 toolbar.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-blockQuote'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-blockQuote', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $allowed_with_blockquote = $this->allowedElements . ' <blockquote>';
+    $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $allowed_with_blockquote);
+
+    $page->pressButton('Save configuration');
+    $assert_session->pageTextContains('The text format ckeditor5 has been updated.');
+
+    // Flush caches so the updated config can be checked.
+    drupal_flush_all_caches();
+
+    // Confirm that the tags required by the newly-added plugins were correctly
+    // saved.
+    $this->assertSame($allowed_with_blockquote, FilterFormat::load('ckeditor5')->filters('filter_html')->getConfiguration()['settings']['allowed_html']);
+
+    $page->find('css', '[data-drupal-selector="edit-formats-ckeditor5"]')->clickLink('Configure');
+
+    // And for good measure, confirm the correct tags are in the form field when
+    // returning to the form.
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $allowed_with_blockquote);
+
+    // Add the source editing plugin to the CKEditor 5 toolbar.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-sourceEditing'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-sourceEditing', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Updating Source Editing's editable tags should automatically update
+    // filter_html to include those additional tags.
+    $assert_session->waitForText('Source editing');
+    $page->find('css', '[href^="#edit-editor-settings-plugins-ckeditor5-sourceediting"]')->click();
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->waitForText('Manually editable HTML tags');
+    $source_edit_tags_field = $assert_session->fieldExists('editor[settings][plugins][ckeditor5_sourceEditing][allowed_tags]');
+    $source_edit_tags_field->setValue('<aside>');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', '<br> <p> <h2> <h3> <h4> <h5> <h6> <aside> <strong> <em> <blockquote>');
+    $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $this->assertTrue($allowed_html_field->hasAttribute('readonly'));
+
+    // Adding tags to Source Editing's editable tags that are already supported
+    // by enabled CKEditor 5 plugins must trigger validation errors.
+    $source_edit_tags_field->setValue('<aside><strong>');
+    $assert_session->waitForText('The following tag(s) are already supported by enabled plugins and should not be added to the Source Editing "Manually editable HTML tags" field: Bold (<strong>)');
+    $this->assertTrue($allowed_html_field->hasAttribute('readonly'));
+
+    // The same validation error appears when saving the form regardless of the
+    // immediate AJAX validation error above.
+    $page->pressButton('Save configuration');
+    $assert_session->pageTextContains('The following tag(s) are already supported by enabled plugins and should not be added to the Source Editing "Manually editable HTML tags" field: Bold (<strong>)');
+    $assert_session->pageTextNotContains('The text format ckeditor5 has been updated');
+
+    // Wait for the "Source editing" vertical tab to appear, remove the already
+    // supported tags and re-save. Now the text format should save successfully.
+    $assert_session->waitForText('Source editing');
+    $page->find('css', '[href^="#edit-editor-settings-plugins-ckeditor5-sourceediting"]')->click();
+    $assert_session->pageTextContains('Manually editable HTML tags');
+    $source_edit_tags_field = $assert_session->fieldExists('editor[settings][plugins][ckeditor5_sourceEditing][allowed_tags]');
+    $source_edit_tags_field->setValue('<aside>');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+    $assert_session->pageTextContains('The text format ckeditor5 has been updated');
+    $assert_session->pageTextNotContains('The following tag(s) are already supported by enabled plugins and should not be added to the Source Editing "Manually editable HTML tags" field: Bold (<strong>)');
+
+    // Ensure that CKEditor can be initialized with Source Editing.
+    // @see https://www.drupal.org/i/3231427
+    $this->drupalGet('node/add');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+  }
+
+  /**
+   * Test that <drupal-media> is added to allowed tags when media embed enabled.
+   */
+  public function testMediaElementAllowedTags() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+
+    // Allowed HTML field is readonly and its wrapper has a form-disabled class.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.js-form-item-filters-filter-html-settings-allowed-html.form-disabled'));
+    $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+    $this->assertTrue($allowed_html_field->hasAttribute('readonly'));
+
+    // Allowed tags are currently the default, with no <drupal-media>.
+    $this->assertEquals($this->allowedElements, $allowed_html_field->getValue());
+
+    // Enable media embed.
+    $this->assertTrue($page->hasUncheckedField('filters[media_embed][status]'));
+    $page->checkField('filters[media_embed][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->responseContains('Media types selectable in the Media Library');
+
+    $allowed_with_media = $this->allowedElements . ' ' . $this->mediaElement;
+    $assert_session->responseContains('Media types selectable in the Media Library');
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $allowed_with_media);
+    $this->saveNewTextFormat($page, $assert_session);
+    $assert_session->pageTextContains('Added text format ckeditor5.');
+
+    // Confirm <drupal-media> was added to allowed tags on save, as a result of
+    // enabling the media embed filter.
+    $this->assertSame($allowed_with_media, FilterFormat::load('ckeditor5')->filters('filter_html')->getConfiguration()['settings']['allowed_html']);
+
+    $page->find('css', '[data-drupal-selector="edit-formats-ckeditor5"]')->clickLink('Configure');
+
+    // Confirm that <drupal-media> is now included in the "Allowed tags" form
+    // field.
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $allowed_with_media);
+
+    // Disable media embed.
+    $this->assertTrue($page->hasCheckedField('filters[media_embed][status]'));
+    $page->uncheckField('filters[media_embed][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Confirm allowed tags no longer has <drupal-media>.
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', $this->allowedElements);
+  }
+
+  /**
+   * Tests the presence of the IE warning when CKEditor 5 is selected.
+   */
+  public function testInternetExplorerWarning() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+    $warning_text = 'CKEditor 5 is not compatible with Internet Explorer 11. Fields using CKEditor 5 will still be editable but without the benefits of CKEditor.';
+    $this->createNewTextFormat($page, $assert_session);
+    $assert_session->waitForText($warning_text);
+    $page->selectFieldOption('editor[editor]', 'None');
+    $this->getSession()->getDriver()->executeScript("document.querySelector('#drupal-live-announce').innerHTML = ''");
+    $assert_session->assertNoElementAfterWait('css', '.messages--warning');
+    $assert_session->pageTextNotContains($warning_text);
+  }
+
+  /**
+   * Tests full HTML text format.
+   */
+  public function testFullHtml() {
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.full_html.yml')
+    )->save();
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.basic_html.yml')
+    )->save();
+
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    // Add a node with text rendered via the Plain Text format.
+    $this->drupalGet('node/add');
+    $page->fillField('title[0][value]', 'My test content');
+    $page->fillField('body[0][value]', '<p><a style="color:#ff0000;" foo="bar" hreflang="en" href="https://example.com"><abbr title="National Aeronautics and Space Administration">NASA</abbr> is an acronym.</a></p>');
+    $page->pressButton('Save');
+
+    // Configure Full HTML text format to use CKEditor 5.
+    $this->drupalGet('admin/config/content/formats/manage/full_html');
+    $page->checkField('roles[authenticated]');
+    $page->selectFieldOption('editor[editor]', 'ckeditor5');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+    $this->assertTrue($assert_session->waitForText('The text format Full HTML has been updated.'));
+
+    // Change the node's text format to Full HTML.
+    $this->drupalGet('node/1/edit');
+    $page->selectFieldOption('body[0][format]', 'full_html');
+    $this->assertNotEmpty($assert_session->waitForText('Change text format?'));
+    $page->pressButton('Continue');
+
+    // Ensure the editor is loaded and ensure that arbitrary markup is retained.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+    $page->pressButton('Save');
+
+    // But note that the `style` attribute was stripped by
+    // \Drupal\editor\EditorXssFilter\Standard.
+    $assert_session->responseContains('<p><a href="https://example.com" hreflang="en" foo="bar"><abbr title="National Aeronautics and Space Administration">NASA</abbr> is an acronym.</a></p>');
+
+    // Ensure attributes are retained after enabling link plugin.
+    $this->drupalGet('admin/config/content/formats/manage/full_html');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-link'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-link', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+
+    $this->drupalGet('node/1/edit');
+    $page->pressButton('Save');
+
+    $assert_session->responseContains('<p><a href="https://example.com" hreflang="en" foo="bar"><abbr title="National Aeronautics and Space Administration">NASA</abbr> is an acronym.</a></p>');
+
+    // Configure Basic HTML text format to use CKE5 and enable the link plugin.
+    $this->drupalGet('admin/config/content/formats/manage/basic_html');
+    $page->checkField('roles[authenticated]');
+    $page->selectFieldOption('editor[editor]', 'ckeditor5');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-link'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-link', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+    $this->assertTrue($assert_session->waitForText('The text format Basic HTML has been updated.'));
+
+    // Change the node's text format to Basic HTML.
+    $this->drupalGet('node/1/edit');
+    $page->selectFieldOption('body[0][format]', 'basic_html');
+    $this->assertNotEmpty($assert_session->waitForText('Change text format?'));
+    $page->pressButton('Continue');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save');
+
+    // The `style` and foo` attributes should have been removed, as should the
+    // `<abbr>` tag.
+    $assert_session->responseContains('<p><a href="https://example.com" hreflang="en">NASA is an acronym.</a></p>');
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5CKEditor4Compatibility.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5CKEditor4Compatibility.php
new file mode 100644
index 0000000000..07e006118c
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5CKEditor4Compatibility.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\Core\Entity\Entity\EntityFormDisplay;
+use Drupal\editor\Entity\Editor;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\filter\Entity\FilterFormat;
+use Symfony\Component\Validator\ConstraintViolation;
+
+/**
+ * Ensures that CKEditor 5 can be used on the same page with CKEditor 4.
+ *
+ * @group ckeditor5
+ */
+class CKEditor5CKEditor4Compatibility extends CKEditor5TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'ckeditor',
+    'ckeditor5_test',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    $current_user_roles = $this->loggedInUser->getRoles(TRUE);
+
+    // Create text format, text editor and text fields for CKEditor 5 and 4.
+    foreach ([5 => 'ckeditor5', 4 => 'ckeditor'] as $version => $text_editor_plugin_id) {
+      $format_id = sprintf('test_format_for_ckeditor%d', $version);
+      $field_name = sprintf('field_text_ckeditor%d', $version);
+
+      FilterFormat::create([
+        'format' => $format_id,
+        'name' => sprintf('CKEditor %d editor', $version),
+        'roles' => $current_user_roles,
+        'filters' => [
+          'filter_html' => [
+            'status' => TRUE,
+            'settings' => [
+              'allowed_html' => '<p> <br> <h2> <h3> <h4> <h5> <h6> <strong> <em>',
+            ],
+          ],
+        ],
+      ])->save();
+      Editor::create([
+        'editor' => $text_editor_plugin_id,
+        'format' => $format_id,
+        'settings' => $version === 4 ? [] : [
+          'toolbar' => [
+            'items' => ['heading', 'bold', 'italic'],
+          ],
+          'plugins' => [
+            'ckeditor5_heading' => [
+              'enabled_headings' => [
+                'heading2',
+                'heading3',
+                'heading4',
+                'heading5',
+                'heading6',
+              ],
+            ],
+          ],
+        ],
+        'image_upload' => [
+          'status' => FALSE,
+        ],
+      ])->save();
+      if ($version === 5) {
+        $this->assertSame([], array_map(
+          function (ConstraintViolation $v) {
+            return (string) $v->getMessage();
+          },
+          iterator_to_array(CKEditor5::validatePair(
+            Editor::load($format_id),
+            FilterFormat::load($format_id)
+          ))
+        ));
+      }
+      $field_storage = FieldStorageConfig::create([
+        'field_name' => $field_name,
+        'entity_type' => 'node',
+        'type' => 'text_long',
+      ]);
+      $field_storage->save();
+      FieldConfig::create([
+        'field_storage' => $field_storage,
+        'entity_type' => 'node',
+        'bundle' => 'page',
+      ])->save();
+
+      // Add the new field to the default form display.
+      EntityFormDisplay::load('node.page.default')
+        ->setComponent($field_name, ['type' => 'text_textarea'])
+        ->save();
+    }
+  }
+
+  /**
+   * Ensures that CKEditor 5 and CKEditor 4 can be used on the same page.
+   */
+  public function testCkeCompatibility() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->drupalGet('node/add/page');
+    $page->selectFieldOption('field_text_ckeditor4[0][format]', 'test_format_for_ckeditor4');
+    $page->selectFieldOption('field_text_ckeditor5[0][format]', 'test_format_for_ckeditor5');
+
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.cke_wysiwyg_frame'));
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5ContribTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5ContribTest.php
new file mode 100644
index 0000000000..1fd829653c
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5ContribTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+/**
+ * Tests for CKEditor5 to ensure contrib can extend functionality.
+ *
+ * @group ckeditor5
+ */
+class CKEditor5ContribTest extends CKEditor5TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'node',
+    'ckeditor5',
+    'ckeditor5_test',
+  ];
+
+  /**
+   * Tests that the contrib plugin is added to the CKEditor5 toolbar.
+   */
+  public function testContribPluginAdded() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    // Press arrow down key to add the button to the active toolbar.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-simpleBox'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-simpleBox', 'ArrowDown');
+    $this->saveNewTextFormat($page, $assert_session);
+
+    $this->drupalGet('node/add');
+    // The toolbar UI should have a button with text instead of an icon.
+    $this->assertNotEmpty($assert_session->waitForText('Simple box'));
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5OffCanvasTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5OffCanvasTest.php
new file mode 100644
index 0000000000..eef007911a
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5OffCanvasTest.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+/**
+ * Tests for CKEditor5 to ensure correct styling in off-canvas.
+ *
+ * @group ckeditor5
+ */
+class CKEditor5OffCanvasTest extends CKEditor5TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'node',
+    'ckeditor5',
+    'ckeditor5_test',
+  ];
+
+  /**
+   * Tests if CKEditor is properly styled inside an off-canvas dialog.
+   */
+  public function testOffCanvasStyles() {
+    $assert_session = $this->assertSession();
+    $page = $this->getSession()->getPage();
+
+    $this->addNewTextFormat($page, $assert_session);
+
+    $this->drupalGet('/ckeditor5_test/off_canvas');
+
+    // The "Add Node" link triggers an off-canvas dialog with an add node form
+    // that includes CKEditor.
+    $page->clickLink('Add Node');
+    $assert_session->waitForElementVisible('css', '#drupal-off-canvas');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $styles = $assert_session->elementExists('css', 'style#ckeditor5-off-canvas-reset');
+    $this->stringContains('#drupal-off-canvas [data-drupal-ck-style-fence]', $styles->getText());
+
+    $assert_session->elementExists('css', '.ck');
+
+    $ckeditor_toolbar_bg_color = $this->getSession()->evaluateScript('window.getComputedStyle(document.querySelector(\'.ck.ck-toolbar\')).backgroundColor');
+    $this->assertEquals('rgb(250, 250, 250)', $ckeditor_toolbar_bg_color, 'Toolbar background-color should be unaffected by off-canvas');
+    // Editable area should be visible.
+    $assert_session->elementExists('css', '.ck .ck-content');
+    $ckeditor_editable_bg_color = $this->getSession()->evaluateScript('window.getComputedStyle(document.querySelector(\'.ck.ck-content\')).backgroundColor');
+    $this->assertEquals('rgb(255, 255, 255)', $ckeditor_editable_bg_color, 'Content background-color should be unaffected by off-canvas');
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5Test.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5Test.php
new file mode 100644
index 0000000000..fd621bafdc
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5Test.php
@@ -0,0 +1,394 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Drupal\Core\Language\LanguageManager;
+use Drupal\file\Entity\File;
+use Drupal\node\Entity\Node;
+use Drupal\Tests\TestFileCreationTrait;
+
+// cspell:ignore esque upcasted
+
+/**
+ * Tests for CKEditor5.
+ *
+ * @group ckeditor5
+ */
+class CKEditor5Test extends CKEditor5TestBase {
+
+  use TestFileCreationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'media_library',
+  ];
+
+  /**
+   * Tests configuring CKEditor5 for existing content.
+   */
+  public function testExistingContent() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    // Add a node with text rendered via the Plain Text format.
+    $this->drupalGet('node/add');
+    $page->fillField('title[0][value]', 'My test content');
+    $page->fillField('body[0][value]', '<p>This is test content</p>');
+    $page->pressButton('Save');
+    $assert_session->responseNotContains('<p>This is test content</p>');
+    $assert_session->responseContains('&lt;p&gt;This is test content&lt;/p&gt;');
+
+    $this->addNewTextFormat($page, $assert_session);
+
+    // Change the node to use the new text format.
+    $this->drupalGet('node/1/edit');
+
+    // Confirm that the JavaScript that generates IE11 warnings loads.
+    $assert_session->elementExists('css', 'script[src*="ckeditor5/js/ie11.user.warnings.js"]');
+
+    $page->selectFieldOption('body[0][format]', 'ckeditor5');
+    $this->assertNotEmpty($assert_session->waitForText('Change text format?'));
+    $page->pressButton('Continue');
+    // Ensure the editor is loaded.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+    $page->pressButton('Save');
+
+    // Assert that the HTML is rendered correctly.
+    $assert_session->responseContains('<p>This is test content</p>');
+    $assert_session->responseNotContains('&lt;p&gt;This is test content&lt;/p&gt;');
+  }
+
+  /**
+   * Test headings configuration.
+   */
+  public function testHeadingsPlugin() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->addNewTextFormat($page, $assert_session);
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor5');
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', '<br> <p> <h2> <h3> <h4> <h5> <h6> <strong> <em>');
+
+    $this->drupalGet('node/add');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-heading-dropdown button'));
+
+    $page->find('css', '.ck-heading-dropdown button')->click();
+
+    // Get all the headings available in dropdown.
+    $headings_dropdown = $page->findAll('css', '.ck-heading-dropdown li .ck-button__label');
+
+    // Create array of available headings.
+    $available_headings = [];
+    foreach ($headings_dropdown as $item) {
+      $available_headings[] = $item->getText();
+    }
+
+    $this->assertSame([
+      'Paragraph',
+      'Heading 2',
+      'Heading 3',
+      'Heading 4',
+      'Heading 5',
+      'Heading 6',
+    ], $available_headings);
+
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor5');
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading1]'));
+    $page->checkField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading1]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertTrue($page->hasCheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading1]'));
+    $this->assertTrue($page->hasCheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading2]'));
+    $page->uncheckField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading2]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading2]'));
+    $this->assertTrue($page->hasCheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading4]'));
+    $page->uncheckField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading4]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading4]'));
+    $this->assertHtmlEsqueFieldValueEquals('filters[filter_html][settings][allowed_html]', '<br> <p> <h1> <h3> <h5> <h6> <strong> <em>');
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_heading][enabled_headings][heading4]'));
+
+    $page->pressButton('Save configuration');
+
+    $this->drupalGet('node/add');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-heading-dropdown button'));
+
+    $page->find('css', '.ck-heading-dropdown button')->click();
+
+    // Get all the headings available in dropdown.
+    $headings_dropdown = $page->findAll('css', '.ck-heading-dropdown li .ck-button__label');
+
+    // Create array of available headings.
+    $available_headings = [];
+    foreach ($headings_dropdown as $item) {
+      $available_headings[] = $item->getText();
+    }
+
+    $this->assertSame([
+      'Paragraph',
+      'Heading 1',
+      'Heading 3',
+      'Heading 5',
+      'Heading 6',
+    ], $available_headings);
+  }
+
+  /**
+   * Test for plugin Language of parts.
+   */
+  public function testLanguageOfPartsPlugin() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    // Press arrow down key to add the button to the active toolbar.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-textPartLanguage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-textPartLanguage', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Test for "United Nations' official languages" option.
+    $languages = LanguageManager::getUnitedNationsLanguageList();
+    $this->languageOfPartsPluginTestHelper($page, $assert_session, $languages, "un");
+
+    // Test for "All 95 languages" option.
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor5');
+    $languages = LanguageManager::getStandardLanguageList();
+    $this->languageOfPartsPluginTestHelper($page, $assert_session, $languages, "all");
+  }
+
+  /**
+   * Validate the available languages on the basis of selected language option.
+   */
+  public function languageOfPartsPluginTestHelper($page, $assert_session, $predefined_languages, $option) {
+    $this->assertNotEmpty($assert_session->waitForElement('css', 'a[href^="#edit-editor-settings-plugins-ckeditor5-language"]'));
+
+    // Set correct value.
+    $vertical_tab_link = $page->find('xpath', "//ul[contains(@class, 'vertical-tabs__menu')]/li/a[starts-with(@href, '#edit-editor-settings-plugins-ckeditor5-language')]");
+    $vertical_tab_link->click();
+    $page->selectFieldOption('editor[settings][plugins][ckeditor5_language][language_list]', $option);
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+
+    // Validate plugin on node add page.
+    $this->drupalGet('node/add');
+    $this->assertNotEmpty($assert_session->waitForText('Choose language'));
+
+    // Click on the dropdown button.
+    $page->find('css', '.ck-text-fragment-language-dropdown button')->click();
+
+    // Get all the languages available in dropdown.
+    $current_languages = $page->findAll('css', '.ck-text-fragment-language-dropdown li .ck-button__label');
+
+    // Remove "Remove language" element from current languages.
+    array_shift($current_languages);
+
+    // Create array of full language name.
+    $languages = [];
+    foreach ($current_languages as $item) {
+      $languages[] = $item->getText();
+    }
+    // Return the values from a single column.
+    $predefined_languages = array_column($predefined_languages, 0);
+
+    // Sort on full language name.
+    asort($predefined_languages);
+
+    $this->assertSame(array_values($predefined_languages), $languages);
+  }
+
+  /**
+   * Confirms active tab status is intact after AJAX refresh.
+   */
+  public function testActiveTabsMaintained() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Ensure the HTML filter tab is visible.
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'a[href^="#edit-filters-filter-html-settings"]'));
+
+    // Enable media embed to make a second filter config tab visible.
+    $this->assertTrue($page->hasUncheckedField('filters[media_embed][status]'));
+    $page->checkField('filters[media_embed][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->responseContains('Media types selectable in the Media Library');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Enable upload image to add one plugin config form.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-uploadImage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-uploadImage', 'ArrowDown');
+    // cSpell:disable-next-line
+    $this->assertNotEmpty($assert_session->waitForElement('css', 'a[href^="#edit-editor-settings-plugins-ckeditor5-imageupload"]'));
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-active .ckeditor5-toolbar-item-uploadImage'));
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $page->clickLink('Image Upload');
+    $assert_session->waitForText('Enable image uploads');
+    $this->assertTrue($page->hasUncheckedField('editor[settings][plugins][ckeditor5_imageUpload][image_upload][status]'));
+    $page->checkField('editor[settings][plugins][ckeditor5_imageUpload][image_upload][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Enable language to add a second plugin config form.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-textPartLanguage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-textPartLanguage', 'ArrowDown');
+    $this->assertNotEmpty($assert_session->waitForElement('css', 'a[href^="#edit-editor-settings-plugins-ckeditor5-language"]'));
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-active .ckeditor5-toolbar-item-textPartLanguage'));
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $page->pressButton('Save configuration');
+    $assert_session->pageTextContains('Added text format ckeditor5');
+
+    // Leave and return to the config form, both sets of tabs should then have
+    // the first tab active by default.
+    $this->drupalGet('admin/config/content/formats/');
+    $this->drupalGet('admin/config/content/formats/manage/ckeditor5');
+
+    $assert_session->waitForElement('css', '.vertical-tabs__menu-item.is-selected');
+
+    $plugin_settings_vertical_tabs = $page->findAll('css', '#plugin-settings-wrapper .vertical-tabs__menu-item');
+    $filter_settings_vertical_tabs = $page->findAll('css', '#filter-settings-wrapper .vertical-tabs__menu-item');
+
+    $this->assertTrue($plugin_settings_vertical_tabs[0]->hasClass('is-selected'), "Expected plugin tab 1 selected on initial build");
+    $this->assertFalse($plugin_settings_vertical_tabs[1]->hasClass('is-selected'), "Expected plugin tab 2 not selected on initial build");
+
+    $this->assertFalse($filter_settings_vertical_tabs[0]->hasClass('is-selected'), "Expected filter tab 1 not selected on initial build");
+    $this->assertTrue($filter_settings_vertical_tabs[2]->hasClass('is-selected'), "Expected (visible) filter tab 2 selected on initial build");
+
+    $plugin_settings_vertical_tabs[1]->click();
+    $filter_settings_vertical_tabs[0]->click();
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $this->assertFalse($plugin_settings_vertical_tabs[0]->hasClass('is-selected'), "Expected plugin tab 1 deselected after click");
+    $this->assertTrue($plugin_settings_vertical_tabs[1]->hasClass('is-selected'), "Expected plugin tab 2 selected after click");
+
+    $this->assertTrue($filter_settings_vertical_tabs[0]->hasClass('is-selected'), "Expected filter tab 1 selected after click");
+    $this->assertFalse($filter_settings_vertical_tabs[2]->hasClass('is-selected'), "Expected (visible) filter tab 2 deselected after click");
+
+    // Add a plugin just to trigger AJAX refresh.
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-blockQuote'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-blockQuote', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    $this->assertFalse($plugin_settings_vertical_tabs[0]->hasClass('is-selected'), "Expected plugin tab 1 deselected after AJAX refresh");
+    $this->assertTrue($plugin_settings_vertical_tabs[1]->hasClass('is-selected'), "Expected plugin tab 2 selected after AJAX refresh");
+
+    $this->assertTrue($filter_settings_vertical_tabs[0]->hasClass('is-selected'), "Expected filter tab 1 selected after AJAX refresh");
+    $this->assertFalse($filter_settings_vertical_tabs[1]->hasClass('is-selected'), "Expected filter tab 2 deselected after AJAX refresh");
+  }
+
+  /**
+   * Ensures that CKEditor 5 integrates with file reference filter.
+   */
+  public function testEditorFileReferenceIntegration() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-uploadImage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-uploadImage', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->clickLink('Image Upload');
+    $page->checkField('editor[settings][plugins][ckeditor5_imageUpload][image_upload][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->checkField('filters[editor_file_reference][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->saveNewTextFormat($page, $assert_session);
+
+    $this->drupalGet('node/add');
+    $page->fillField('title[0][value]', 'My test content');
+    $this->assertNotEmpty($image_upload_field = $page->find('css', '.ck-file-dialog-button input[type="file"]'));
+    $image = $this->getTestFiles('image')[0];
+    $image_upload_field->attachFile($this->container->get('file_system')->realpath($image->uri));
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save');
+
+    $uploaded_image = File::load(1);
+    $image_url = $this->container->get('file_url_generator')->generateString($uploaded_image->getFileUri());
+    $image_uuid = $uploaded_image->uuid();
+    $assert_session->elementExists('xpath', sprintf('//img[@src="%s" and @loading="lazy" and @width and @height and @data-entity-uuid="%s" and @data-entity-type="file"]', $image_url, $image_uuid));
+
+    // Ensure that width, height, and length attributes are not stored in the
+    // database.
+    $this->assertEquals(sprintf('<img data-entity-uuid="%s" data-entity-type="file" src="%s">', $image_uuid, $image_url), Node::load(1)->get('body')->value);
+
+    // Ensure that data-entity-uuid and data-entity-type attributes are upcasted
+    // correctly to CKEditor model.
+    $this->drupalGet('node/1/edit');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+    $page->pressButton('Save');
+
+    $assert_session->elementExists('xpath', sprintf('//img[@src="%s" and @loading="lazy" and @width and @height and @data-entity-uuid="%s" and @data-entity-type="file"]', $image_url, $image_uuid));
+  }
+
+  /**
+   * Ensures that CKEditor italic model is converted to em.
+   */
+  public function testEmphasis() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    // Add a node with text rendered via the Plain Text format.
+    $this->drupalGet('node/add');
+    $page->fillField('title[0][value]', 'My test content');
+    $page->fillField('body[0][value]', '<p>This is a <em>test!</em></p>');
+    $page->pressButton('Save');
+
+    $this->createNewTextFormat($page, $assert_session);
+    $this->saveNewTextFormat($page, $assert_session);
+
+    $this->drupalGet('node/1/edit');
+    $page->selectFieldOption('body[0][format]', 'ckeditor5');
+    $this->assertNotEmpty($assert_session->waitForText('Change text format?'));
+    $page->pressButton('Continue');
+
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+    $page->pressButton('Save');
+
+    $assert_session->responseContains('<p>This is a <em>test!</em></p>');
+  }
+
+  /**
+   * Ensures that images can have caption set.
+   */
+  public function testImageCaption() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    // Add a node with text rendered via the Plain Text format.
+    $this->drupalGet('node/add');
+    $page->fillField('title[0][value]', 'My test content');
+    // Add image with data-caption. The foo attribute is added to be removed
+    // later by CKEditor to make sure CKEditor was able to downcast data.
+    $page->fillField('body[0][value]', '<img src="/sites/default/files/alpaca.jpg" data-caption="Alpacas are cute" foo="bar">');
+    $page->pressButton('Save');
+
+    $this->createNewTextFormat($page, $assert_session);
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-uploadImage'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-uploadImage', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->clickLink('Image Upload');
+    $assert_session->waitForText('Enable image uploads');
+    $page->checkField('editor[settings][plugins][ckeditor5_imageUpload][image_upload][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->checkField('filters[filter_caption][status]');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->saveNewTextFormat($page, $assert_session);
+
+    $this->drupalGet('node/1/edit');
+    $page->selectFieldOption('body[0][format]', 'ckeditor5');
+    $this->assertNotEmpty($assert_session->waitForText('Change text format?'));
+    $page->pressButton('Continue');
+
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+    $page->pressButton('Save');
+
+    $this->assertEquals('<img src="/sites/default/files/alpaca.jpg" data-caption="Alpacas are cute">', Node::load(1)->get('body')->value);
+    $assert_session->elementExists('xpath', '//figure/img[@src="/sites/default/files/alpaca.jpg" and not(@data-caption)]');
+    $assert_session->responseContains('<figcaption>Alpacas are cute</figcaption>');
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5TestBase.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5TestBase.php
new file mode 100644
index 0000000000..c7649ed5e7
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5TestBase.php
@@ -0,0 +1,139 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Behat\Mink\Element\TraversableElement;
+use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
+
+// cspell:ignore esque
+
+/**
+ * Base class for testing CKEditor 5.
+ *
+ * @ingroup testing
+ */
+abstract class CKEditor5TestBase extends WebDriverTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'node',
+    'ckeditor5',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    $this->drupalCreateContentType(['type' => 'page']);
+
+    $this->drupalLogin($this->drupalCreateUser([
+      'administer filters',
+      'create page content',
+      'edit own page content',
+    ]));
+  }
+
+  /**
+   * Add and save a new text format using CKEditor 5.
+   */
+  public function addNewTextFormat($page, $assert_session, $name = 'ckeditor5') {
+    $this->createNewTextFormat($page, $assert_session, $name);
+    $this->saveNewTextFormat($page, $assert_session);
+  }
+
+  /**
+   * Create a new text format using CKEditor 5.
+   */
+  public function createNewTextFormat($page, $assert_session, $name = 'ckeditor5') {
+    $this->drupalGet('admin/config/content/formats/add');
+    $page->fillField('name', $name);
+    $assert_session->waitForText('Machine name');
+    $this->assertNotEmpty($assert_session->waitForText($name));
+    $page->checkField('roles[authenticated]');
+
+    if ($name === 'ckeditor5') {
+      // Enable the HTML filter, at least one HTML restricting filter is needed
+      // before CKEditor 5 can be enabled.
+      $this->assertTrue($page->hasUncheckedField('filters[filter_html][status]'));
+      $page->checkField('filters[filter_html][status]');
+      $assert_session->assertWaitOnAjaxRequest();
+
+      // Add the tags that must be included in the html filter for CKEditor 5.
+      $allowed_html_field = $assert_session->fieldExists('filters[filter_html][settings][allowed_html]');
+      $allowed_html_field->setValue('<p> <br>');
+    }
+    $page->selectFieldOption('editor[editor]', $name);
+  }
+
+  /**
+   * Save the new text format.
+   */
+  public function saveNewTextFormat($page, $assert_session) {
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Save configuration');
+    $this->assertTrue($assert_session->waitForText('Added text format'), "Confirm new text format saved");
+  }
+
+  /**
+   * Trigger a keyup event on the selected element.
+   *
+   * @param string $selector
+   *   The css selector for the element.
+   * @param string $key
+   *   The keyCode.
+   */
+  protected function triggerKeyUp(string $selector, string $key) {
+
+    $script = <<<JS
+(function (selector, key) {
+  const btn = document.querySelector(selector);
+    btn.dispatchEvent(new KeyboardEvent('keydown', { key }));
+    btn.dispatchEvent(new KeyboardEvent('keyup', { key }));
+})('{$selector}', '{$key}')
+
+JS;
+
+    $options = [
+      'script' => $script,
+      'args' => [],
+    ];
+
+    $this->getSession()->getDriver()->getWebDriverSession()->execute($options);
+  }
+
+  /**
+   * Decorates ::fieldValueEquals() to force DrupalCI to provide useful errors.
+   *
+   * @param string $field
+   *   Field id|name|label|value.
+   * @param string $value
+   *   Field value.
+   * @param \Behat\Mink\Element\TraversableElement $container
+   *   Document to check against.
+   *
+   * @throws \Behat\Mink\Exception\ExpectationException
+   *
+   * @see \Behat\Mink\WebAssert::fieldValueEquals()
+   */
+  protected function assertHtmlEsqueFieldValueEquals($field, $value, TraversableElement $container = NULL) {
+    $assert_session = $this->assertSession();
+
+    $node = $assert_session->fieldExists($field, $container);
+    $actual = $node->getValue();
+    $regex = '/^' . preg_quote($value, '/') . '$/ui';
+
+    $message = sprintf('The field "%s" value is "%s", but "%s" expected.', $field, htmlspecialchars($actual), htmlspecialchars($value));
+
+    $assert_session->assert((bool) preg_match($regex, $actual), $message);
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/LanguageTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/LanguageTest.php
new file mode 100644
index 0000000000..d07f8b097a
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/LanguageTest.php
@@ -0,0 +1,71 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Drupal\language\Entity\ConfigurableLanguage;
+
+/**
+ * Tests for CKEditor 5 UI translations.
+ *
+ * @group ckeditor5
+ */
+class LanguageTest extends CKEditor5TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'language',
+    'locale',
+  ];
+
+  /**
+   * Integration test to ensure that CKEditor 5 UI translations are loaded.
+   *
+   * @param string $langcode
+   *   The language code.
+   * @param string $blockquote_translation
+   *   The expected translation for blockquote toolbar button.
+   *
+   * @dataProvider provider
+   */
+  public function test(string $langcode, string $blockquote_translation): void {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    $this->createNewTextFormat($page, $assert_session);
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ckeditor5-toolbar-item-blockQuote'));
+    $this->triggerKeyUp('.ckeditor5-toolbar-item-blockQuote', 'ArrowDown');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->saveNewTextFormat($page, $assert_session);
+
+    ConfigurableLanguage::createFromLangcode($langcode)->save();
+    $this->config('system.site')->set('default_langcode', $langcode)->save();
+
+    $this->drupalGet('node/add');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '.ck-editor'));
+    // Ensure that blockquote button is translated.
+    $assert_session->elementExists('xpath', "//span[text()='$blockquote_translation']");
+  }
+
+  /**
+   * Data provider for ensuring CKEditor 5 UI translations are loaded.
+   *
+   * @return \string[][]
+   */
+  public function provider(): array {
+    return [
+      'Language code both in Drupal and CKEditor' => [
+        'langcode' => 'th',
+        'blockquote_translation' => 'คำพูดบล็อก',
+      ],
+      'Language code transformed from browser mappings' => [
+        'langcode' => 'zh-hans',
+        'blockquote_translation' => '块引用',
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/FunctionalJavascript/QuickEditIntegrationTest.php b/core/modules/ckeditor5/tests/src/FunctionalJavascript/QuickEditIntegrationTest.php
new file mode 100644
index 0000000000..4f6561dc58
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/FunctionalJavascript/QuickEditIntegrationTest.php
@@ -0,0 +1,305 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
+use Drupal\Tests\quickedit\FunctionalJavascript\QuickEditJavascriptTestBase;
+use Symfony\Component\Validator\ConstraintViolation;
+
+/**
+ * Tests that Quick Edit can load CKEditor 5.
+ *
+ * @group ckeditor5
+ */
+class QuickEditIntegrationTest extends QuickEditJavascriptTestBase {
+
+  use EntityReferenceTestTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'node',
+    'editor',
+    'ckeditor5',
+    'hold_test',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * A user with permissions to edit Articles and use Quick Edit.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $contentAuthorUser;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+    // Create text format, associate CKEditor 5, validate.
+    FilterFormat::create([
+      'format' => 'some_format',
+      'name' => 'Some format',
+      'filters' => [
+        'filter_html' => [
+          'status' => TRUE,
+          'settings' => [
+            'allowed_html' => '<p> <br> <h2> <h3> <h4> <h5> <h6> <strong> <em>',
+          ],
+        ],
+      ],
+    ])->save();
+    Editor::create([
+      'format' => 'some_format',
+      'editor' => 'ckeditor5',
+      'settings' => [
+        'toolbar' => [
+          'items' => ['heading', 'bold', 'italic'],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+        ],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+    ])->save();
+    $this->assertSame([], array_map(
+      function (ConstraintViolation $v) {
+        return (string) $v->getMessage();
+      },
+      iterator_to_array(CKEditor5::validatePair(
+        Editor::load('some_format'),
+        FilterFormat::load('some_format')
+      ))
+    ));
+
+    // Create the Article node type.
+    $this->drupalCreateContentType(['type' => 'article', 'name' => 'Article']);
+
+    // Log in as a content author who can use Quick Edit and edit Articles.
+    $this->contentAuthorUser = $this->drupalCreateUser([
+      'access contextual links',
+      'access toolbar',
+      'access in-place editing',
+      'access content',
+      'create article content',
+      'edit any article content',
+      'use text format some_format',
+    ]);
+    $this->drupalLogin($this->contentAuthorUser);
+  }
+
+  /**
+   * Tests that changes can be discarded.
+   */
+  public function testDiscard() {
+    $page = $this->getSession()->getPage();
+    $node = $this->drupalCreateNode([
+      'type' => 'article',
+      'title' => t('My Test Node'),
+      'body' => [
+        'value' => '<p>Hello world!</p><p>I do not know what to say…</p><p>I wish I were eloquent.</p>',
+        'format' => 'some_format',
+      ],
+    ]);
+
+    $this->drupalGet('node/' . $node->id());
+
+    // Initial state.
+    $this->awaitQuickEditForEntity('node', 1);
+    $this->assertEntityInstanceStates([
+      'node/1[0]' => 'closed',
+    ]);
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'inactive',
+      'node/1/uid/en/full' => 'inactive',
+      'node/1/created/en/full' => 'inactive',
+      'node/1/body/en/full' => 'inactive',
+    ]);
+
+    // Start in-place editing of the article node.
+    $this->startQuickEditViaToolbar('node', 1, 0);
+    $this->assertEntityInstanceStates([
+      'node/1[0]' => 'opened',
+    ]);
+    $this->assertQuickEditEntityToolbar((string) $node->label(), NULL);
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/uid/en/full' => 'candidate',
+      'node/1/created/en/full' => 'candidate',
+      'node/1/body/en/full' => 'candidate',
+    ]);
+
+    $assert_session = $this->assertSession();
+
+    // Click the body field.
+    hold_test_response(TRUE);
+    $this->click('[data-quickedit-field-id="node/1/body/en/full"]');
+    $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"]');
+    $this->assertQuickEditEntityToolbar((string) $node->label(), 'Body');
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/uid/en/full' => 'candidate',
+      'node/1/created/en/full' => 'candidate',
+      'node/1/body/en/full' => 'active',
+    ]);
+    hold_test_response(FALSE);
+
+    $this->assertEntityInstanceFieldMarkup([
+      'node/1/body/en/full' => '.ck-editor__editable_inline',
+    ]);
+    $this->assertSession()
+      ->elementExists('css', '#quickedit-entity-toolbar .quickedit-toolgroup.wysiwyg-main .ck-toolbar[role="toolbar"] .ck-toolbar__items > .ck-button[type="button"]');
+
+    // Click the body field.
+    $this->click('[data-quickedit-field-id="node/1/body/en/full"]');
+    $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"]');
+    $this->typeInPlainTextEditor('[data-quickedit-field-id="node/1/body/en/full"]', ' I am not wanted here');
+    $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"].quickedit-changed');
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/uid/en/full' => 'candidate',
+      'node/1/created/en/full' => 'candidate',
+      'node/1/body/en/full' => 'changed',
+    ]);
+
+    $assert_session->pageTextContains('I am not wanted here');
+
+    // Click the 'Cancel' button.
+    $page->find('css', '.action-cancel.quickedit-button')->press();
+    hold_test_response(TRUE);
+
+    // Click the 'Discard Changes' button.
+    $discard_changes_button = $page->findAll('css', '.ui-dialog-buttonset .button')[1];
+    $this->assertEquals('Discard changes', $discard_changes_button->getText());
+    $discard_changes_button->press();
+
+    $assert_session->pageTextNotContains('I am not wanted here');
+    hold_test_response(FALSE);
+  }
+
+  /**
+   * Tests if an article node can be in-place edited with Quick Edit.
+   */
+  public function testArticleNode() {
+    $assert_session = $this->assertSession();
+
+    $node = $this->drupalCreateNode([
+      'type' => 'article',
+      'title' => t('My Test Node'),
+      'body' => [
+        'value' => '<p>Hello world!</p><p>I do not know what to say…</p><p>I wish I were eloquent.</p>',
+        'format' => 'some_format',
+      ],
+    ]);
+
+    $this->drupalGet('node/' . $node->id());
+
+    // Confirm that the JavaScript that generates IE11 warnings loads.
+    $assert_session->elementExists('css', 'script[src*="ckeditor5/js/ie11.user.warnings.js"]');
+
+    // Initial state.
+    $this->awaitQuickEditForEntity('node', 1);
+    $this->assertEntityInstanceStates([
+      'node/1[0]' => 'closed',
+    ]);
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'inactive',
+      'node/1/uid/en/full' => 'inactive',
+      'node/1/created/en/full' => 'inactive',
+      'node/1/body/en/full' => 'inactive',
+    ]);
+
+    // Start in-place editing of the article node.
+    $this->startQuickEditViaToolbar('node', 1, 0);
+    $this->assertEntityInstanceStates([
+      'node/1[0]' => 'opened',
+    ]);
+    $this->assertQuickEditEntityToolbar((string) $node->label(), NULL);
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/uid/en/full' => 'candidate',
+      'node/1/created/en/full' => 'candidate',
+      'node/1/body/en/full' => 'candidate',
+    ]);
+
+    // Click the body field.
+    hold_test_response(TRUE);
+    $this->click('[data-quickedit-field-id="node/1/body/en/full"]');
+    $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"]');
+    $this->assertQuickEditEntityToolbar((string) $node->label(), 'Body');
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/uid/en/full' => 'candidate',
+      'node/1/created/en/full' => 'candidate',
+      'node/1/body/en/full' => 'active',
+    ]);
+    hold_test_response(FALSE);
+
+    $this->assertEntityInstanceFieldMarkup([
+      'node/1/body/en/full' => '.ck-editor__editable_inline',
+    ]);
+    $this->assertSession()
+      ->elementExists('css', '#quickedit-entity-toolbar .quickedit-toolgroup.wysiwyg-main .ck-toolbar[role="toolbar"] .ck-toolbar__items > .ck-button[type="button"]');
+
+    // Click the body field.
+    $this->click('[data-quickedit-field-id="node/1/body/en/full"]');
+    $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"]');
+    $this->typeInPlainTextEditor('[data-quickedit-field-id="node/1/body/en/full"]', ' Added text with CKEditor 5');
+    $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"].quickedit-changed');
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/uid/en/full' => 'candidate',
+      'node/1/created/en/full' => 'candidate',
+      'node/1/body/en/full' => 'changed',
+    ]);
+
+    // Click 'Save'.
+    hold_test_response(TRUE);
+    $this->saveQuickEdit();
+    $this->assertEntityInstanceStates([
+      'node/1[0]' => 'committing',
+    ]);
+
+    $this->assertEntityInstanceFieldStates('node', 1, 0, [
+      'node/1/title/en/full' => 'candidate',
+      'node/1/uid/en/full' => 'candidate',
+      'node/1/created/en/full' => 'candidate',
+      'node/1/body/en/full' => 'saving',
+    ]);
+
+    $this->assertEntityInstanceFieldMarkup([
+      'node/1/body/en/full' => '.quickedit-changed',
+    ]);
+    hold_test_response(FALSE);
+
+    $this->assertJsCondition("Drupal.quickedit.collections.entities.get('node/1[0]').get('state') === 'closed'");
+    $this->assertEntityInstanceStates([
+      'node/1[0]' => 'closed',
+    ]);
+
+    // Get the load again and ensure the values are the expected values.
+    $this->drupalGet('node/' . $node->id());
+    $this->assertSession()->pageTextContains('I wish I were eloquent.');
+    $this->assertSession()->pageTextContains('Added text with CKEditor 5');
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Kernel/CKEditor5PluginManagerTest.php b/core/modules/ckeditor5/tests/src/Kernel/CKEditor5PluginManagerTest.php
new file mode 100644
index 0000000000..88ffa0191c
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Kernel/CKEditor5PluginManagerTest.php
@@ -0,0 +1,711 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\Kernel;
+
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\ckeditor5\Plugin\CKEditor5Plugin\Heading;
+use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\editor\Entity\Editor;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\Tests\SchemaCheckTestTrait;
+use org\bovigo\vfs\vfsStream;
+use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
+use Symfony\Component\Yaml\Yaml;
+
+// cspell:ignore layercake everyblock justblockquote
+
+/**
+ * Tests different ways of enabling CKEditor 5 plugins.
+ *
+ * @group ckeditor5
+ */
+class CKEditor5PluginManagerTest extends KernelTestBase {
+
+  use SchemaCheckTestTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'system',
+    'user',
+    'filter',
+    'editor',
+    'ckeditor5',
+    'media',
+  ];
+
+  /**
+   * The manager for "CKEditor 5 plugin" plugins.
+   *
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $manager;
+
+  /**
+   * The typed config manager.
+   *
+   * @var \Drupal\Core\Config\TypedConfigManagerInterface
+   */
+  protected $typedConfig;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.basic_html.yml')
+    )->save();
+    Editor::create([
+      'format' => 'basic_html',
+      'editor' => 'ckeditor5',
+    ])->save();
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.full_html.yml')
+    )->save();
+    Editor::create([
+      'format' => 'full_html',
+      'editor' => 'ckeditor5',
+    ])->save();
+    $this->manager = $this->container->get('plugin.manager.ckeditor5.plugin');
+    $this->typedConfig = $this->container->get('config.typed');
+  }
+
+  /**
+   * @covers \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition::__construct()
+   * @dataProvider providerTestInvalidPluginDefinitions
+   */
+  public function testInvalidPluginDefinitions(string $yaml, ?string $expected_message): void {
+    if ($expected_message) {
+      $this->expectException(InvalidPluginDefinitionException::class);
+      $this->expectExceptionMessage($expected_message);
+    }
+
+    $vfs_root = vfsStream::setup('root');
+    vfsStream::create([
+      'modules' => [
+        'ckeditor5_invalid_plugin' => [
+          'ckeditor5_invalid_plugin.info.yml' => <<<YAML
+name: CKEditor 5 Invalid Plugin Definition Test
+type: module
+core_version_requirement: ^9
+YAML,
+          'ckeditor5_invalid_plugin.ckeditor5.yml' => $yaml,
+        ],
+      ],
+    ], $vfs_root);
+
+    // Construct a new container for testing a plugin definition in isolation,
+    // without needing a separate module directory structure for it, and instead
+    // allowing it to be provided entirely by a PHPUnit data provider. Inherit
+    // all definitions from the successfully installed Drupal site for this
+    // kernel test, but do not use $this->container. This is a hybrid of kernel
+    // and unit test, to get the best of both worlds: test a unit, but ensure
+    // the service definitions are in sync.
+    $root = 'vfs://root';
+    $container = new ContainerBuilder(new FrozenParameterBag([
+      'app.root' => $root,
+      'container.modules' => [
+        'ckeditor5_invalid_plugin' => [
+          'type' => 'module',
+          'pathname' => 'modules/ckeditor5_invalid_plugin/ckeditor5_invalid_plugin.info.yml',
+          'filename' => NULL,
+        ],
+      ],
+    ] + $this->container->getParameterBag()->all()));
+    $container->setDefinitions($this->container->getDefinitions());
+
+    // The exception to the above elegance: re-resolve the '%app_root%' param.
+    // @see \Symfony\Component\DependencyInjection\Compiler\ResolveParameterPlaceHoldersPass
+    // @see \Drupal\Core\DrupalKernel::guessApplicationRoot()
+    $container->getDefinition('module_handler')->setArgument(0, '%app.root%');
+
+    $container->get('plugin.manager.ckeditor5.plugin')->getDefinitions();
+  }
+
+  /**
+   * Data provider.
+   *
+   * @return \Generator
+   *   Test scenarios.
+   */
+  public function providerTestInvalidPluginDefinitions(): \Generator {
+    yield 'invalid plugin ID with everything else okay' => [
+      <<<YAML
+foo_bar:
+  ckeditor5:
+    plugins: []
+  drupal:
+    label: TEST
+    elements: false
+YAML,
+      'The "foo_bar" CKEditor 5 plugin definition must have a plugin ID that starts with "ckeditor5_invalid_plugin_".',
+    ];
+
+    // Now let's show the progressive exceptions that should steer the plugin
+    // developer in the right direction.
+
+    yield 'only plugin ID, nothing else' => [
+      <<<YAML
+foo_bar: {}
+YAML,
+      'The "foo_bar" CKEditor 5 plugin definition must have a plugin ID that starts with "ckeditor5_invalid_plugin_".',
+    ];
+
+    yield 'fixed plugin ID' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar: {}
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "ckeditor5" key.',
+    ];
+
+    yield 'added ckeditor5' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5: {}
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "ckeditor5.plugins" key.',
+    ];
+
+    yield 'added ckeditor5.plugins' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "drupal" key.',
+    ];
+
+    yield 'added drupal' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal: {}
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "drupal.label" key.',
+    ];
+
+    yield 'added drupal.label' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: {}
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition has a "drupal.label" value that is not a string nor a TranslatableMarkup instance.',
+    ];
+
+    yield 'fixed drupal.label' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "drupal.elements" key.',
+    ];
+
+    yield 'added drupal.elements' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+    elements: {}
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition has a "drupal.elements" key that is neither a list of HTML tags/attributes nor false.',
+    ];
+
+    yield 'fixed drupal.elements' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+    # @todo Validate the shape of each string as well https://www.drupal.org/project/ckeditor5/issues/3231327.
+    elements:
+      - foo
+      - bar
+YAML,
+      NULL,
+    ];
+
+    yield 'alternative fix for drupal.elements' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+    elements: false
+YAML,
+      NULL,
+    ];
+
+    yield 'added invalid optional metadata: drupal.admin_library' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+    elements:
+      - foo
+      - bar
+    admin_library: ckeditor5/foo_bar
+YAML,
+      'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition has a "drupal.admin_library" key whose asset library "ckeditor5/foo_bar" does not exist.',
+    ];
+
+    yield 'fixed drupal.admin_library' => [
+      <<<YAML
+ckeditor5_invalid_plugin_foo_bar:
+  ckeditor5:
+    plugins: {}
+  drupal:
+    label: "Foo bar"
+    elements:
+      - foo
+      - bar
+    admin_library: ckeditor5/admin.basic
+YAML,
+      NULL,
+    ];
+  }
+
+  /**
+   * Tests detection of invalid CKEditor5PluginElementsSubsetInterface class.
+   */
+  public function testProvidedElementsInvalidElementSubset(): void {
+    $this->enableModules(['ckeditor5_plugin_elements_subset']);
+
+    // Configure the sneaky superset plugin to have a random tag as the subset.
+    $sneaky_plugin_id = 'ckeditor5_plugin_elements_subset_sneakySuperset';
+    $random_tag = "<{$this->randomMachineName()}>";
+    $text_editor = Editor::create([
+      'format' => 'dummy',
+      'editor' => 'ckeditor5',
+      'settings' => [
+        'plugins' => [
+          $sneaky_plugin_id => ['configured_subset' => [$random_tag]],
+        ],
+      ],
+      'image_upload' => [],
+    ]);
+
+    // No exception when getting all provided elements.
+    $this->assertGreaterThan(0, count($this->manager->getProvidedElements()));
+
+    // No exception when getting the sneaky plugin's provided elements.
+    $this->assertGreaterThan(0, count($this->manager->getProvidedElements([$sneaky_plugin_id])));
+
+    // Exception when getting the sneaky plugin's provided elements *and* a text
+    // editor config entity is passed: only then can a subset be generated based
+    // on configuration.
+    $this->expectException(\LogicException::class);
+    $this->expectExceptionMessage("The \"ckeditor5_plugin_elements_subset_sneakySuperset\" CKEditor 5 plugin implements ::getElementsSubset() and did not return a subset, the following tags are absent from the plugin definition: \"$random_tag\".");
+    $this->manager->getProvidedElements([$sneaky_plugin_id], $text_editor);
+  }
+
+  /**
+   * Tests the enabling of plugins.
+   */
+  public function testEnabledPlugins() {
+    $editor = Editor::load('basic_html');
+
+    // Case 1: no extra CKEditor 5 plugins.
+    $definitions = array_keys($this->manager->getEnabledDefinitions($editor));
+    $default_plugins = [
+      'ckeditor5_bold',
+      'ckeditor5_emphasis',
+      'ckeditor5_essentials',
+      'ckeditor5_heading',
+      'ckeditor5_paragraph',
+    ];
+    $this->assertSame($default_plugins, $definitions, 'No CKEditor 5 plugins found besides the built-in ones.');
+    $default_libraries = [
+      'ckeditor5/drupal.ckeditor5',
+      'core/ckeditor5.basic',
+      'core/ckeditor5.internal',
+      'core/drupal.ckeditor5.emphasis',
+    ];
+    $this->assertSame($default_libraries, $this->manager->getEnabledLibraries($editor));
+
+    // Enable the CKEditor 5 Test module, which has the layercake plugin and
+    // clear the editor manager's static cache so that it is picked up.
+    $this->enableModules(['ckeditor5_test']);
+    $this->manager = $this->container->get('plugin.manager.ckeditor5.plugin');
+    $this->manager->clearCachedDefinitions();
+
+    // Case 2: The CKEditor 5 layercake plugin is available and library should
+    // NOT be loaded if its toolbar items are not enabled.
+    $this->assertSame($default_plugins, array_keys($this->manager->getEnabledDefinitions($editor)));
+    $this->assertSame($default_libraries, $this->manager->getEnabledLibraries($editor));
+
+    // Case 3: The CKEditor 5 layercake plugin is available and library should
+    // be loaded without having to enable plugins.
+    $settings = $editor->getSettings();
+    $settings['toolbar']['items'][] = 'simpleBox';
+    $editor->setSettings($settings);
+    $plugin_ids = array_keys($this->manager->getEnabledDefinitions($editor));
+    $default_plugins_with_layercake = array_merge($default_plugins, ['ckeditor5_test_layercake']);
+
+    // Sort on plugin id.
+    asort($default_plugins_with_layercake);
+    $this->assertSame(array_values($default_plugins_with_layercake), $plugin_ids);
+    $default_libraries_with_layercake = array_merge($default_libraries, ['ckeditor5_test/layercake']);
+    sort($default_libraries_with_layercake);
+    $this->assertSame($default_libraries_with_layercake, $this->manager->getEnabledLibraries($editor));
+
+    // Enable media embed filter which the CKEditor 5 media plugin requires.
+    $editor->getFilterFormat()->setFilterConfig('media_embed', ['status' => TRUE])->save();
+
+    // Case 4: The CKEditor 5 media plugin should be enabled and the library
+    // should be available now that the media_embed is enabled.
+    $plugin_ids = array_keys($this->manager->getEnabledDefinitions($editor));
+    $expected_plugins = array_merge($default_plugins, [
+      'ckeditor5_test_layercake',
+      'media_media',
+    ]);
+    sort($expected_plugins);
+    $this->assertSame($expected_plugins, $plugin_ids);
+    $expected_libraries = array_merge($default_libraries, [
+      'ckeditor5/drupal.ckeditor5.media',
+      'ckeditor5_test/layercake',
+    ]);
+    sort($expected_libraries);
+    $this->assertSame($expected_libraries, $this->manager->getEnabledLibraries($editor));
+
+    // Case 5: GHS is only enabled for Full HTML (or any other text format that
+    // has no TYPE_HTML_RESTRICTOR filters).
+    $editor = Editor::load('full_html');
+    $definitions = array_keys($this->manager->getEnabledDefinitions($editor));
+    $default_plugins = [
+      'ckeditor5_bold',
+      'ckeditor5_emphasis',
+      'ckeditor5_essentials',
+      'ckeditor5_heading',
+      'ckeditor5_htmlSupport',
+      'ckeditor5_paragraph',
+    ];
+    $this->assertSame($default_plugins, $definitions, 'No CKEditor 5 plugins found besides the built-in ones.');
+    $default_libraries = [
+      'ckeditor5/drupal.ckeditor5',
+      'core/ckeditor5.basic',
+      'core/ckeditor5.htmlSupport',
+      'core/ckeditor5.internal',
+      'core/drupal.ckeditor5.emphasis',
+    ];
+    $this->assertSame($default_libraries, $this->manager->getEnabledLibraries($editor));
+  }
+
+  /**
+   * Tests the parsing of CKEditor 5 plugin element config.
+   *
+   * @param string[] $plugins
+   *   The plugins to parse the elements list from.
+   * @param array $text_editor_settings
+   *   The text editor settings.
+   * @param array $expected_elements
+   *   An array of expected allowed elements an attributes in the structure
+   *   used by filter_html.
+   * @param string $expected_readable_string
+   *   The expected allowed tags and attributes as a string, typically used
+   *   in the filter_html "Allowed tags" field.
+   *
+   * @covers \Drupal\ckeditor5\Plugin\CKEditor5PluginManager::getProvidedElements
+   * @covers \Drupal\ckeditor5\HTMLRestrictionsUtilities::toReadableElements
+   * @dataProvider providerTestProvidedElements
+   */
+  public function testProvidedElements(array $plugins, array $text_editor_settings, array $expected_elements, string $expected_readable_string) {
+    $this->enableModules(['ckeditor5_plugin_elements_test']);
+
+    $text_editor = Editor::create([
+      'format' => 'dummy',
+      'editor' => 'ckeditor5',
+      'settings' => $text_editor_settings,
+      'image_upload' => [],
+    ]);
+    $this->assertConfigSchema(
+      $this->typedConfig,
+      $text_editor->getConfigDependencyName(),
+      $text_editor->toArray()
+    );
+
+    $provided_elements = $this->manager->getProvidedElements($plugins, $text_editor);
+    $this->assertSame($expected_elements, $provided_elements);
+    $readable_string = implode(' ', HTMLRestrictionsUtilities::toReadableElements($provided_elements));
+    $this->assertSame($expected_readable_string, $readable_string);
+  }
+
+  /**
+   * Provides uses cases enabling different elements and the expected results.
+   */
+  public function providerTestProvidedElements() : array {
+    $text_align_classes = [
+      'text-align-left' => TRUE,
+      'text-align-center' => TRUE,
+      'text-align-right' => TRUE,
+      'text-align-justify' => TRUE,
+    ];
+
+    return [
+      'sourceEditing' => [
+        'plugins' => ['ckeditor5_sourceEditing'],
+        'text_editor_settings' => [],
+        'expected_elements' => [],
+        'expected_readable_string' => '',
+      ],
+      'language' => [
+        'plugins' => ['ckeditor5_language'],
+        'text_editor_settings' => [],
+        'expected_elements' => [
+          'span' => [
+            'lang' => TRUE,
+            'dir' => TRUE,
+          ],
+        ],
+        'expected_readable_string' => '<span lang dir>',
+      ],
+      'alignment and heading' => [
+        'plugins' => [
+          'ckeditor5_alignment',
+          'ckeditor5_heading',
+          'ckeditor5_paragraph',
+        ],
+        'text_editor_settings' => [
+          'plugins' => [
+            'ckeditor5_heading' => Heading::DEFAULT_CONFIGURATION,
+          ],
+        ],
+        'expected_elements' => [
+          'p' => [
+            'class' => $text_align_classes,
+          ],
+          'h2' => [
+            'class' => $text_align_classes,
+          ],
+          'h3' => [
+            'class' => $text_align_classes,
+          ],
+          'h4' => [
+            'class' => $text_align_classes,
+          ],
+          'h5' => [
+            'class' => $text_align_classes,
+          ],
+          'h6' => [
+            'class' => $text_align_classes,
+          ],
+        ],
+        'expected_readable_string' => '<p class="text-align-left text-align-center text-align-right text-align-justify"> <h2 class="text-align-left text-align-center text-align-right text-align-justify"> <h3 class="text-align-left text-align-center text-align-right text-align-justify"> <h4 class="text-align-left text-align-center text-align-right text-align-justify"> <h5 class="text-align-left text-align-center text-align-right text-align-justify"> <h6 class="text-align-left text-align-center text-align-right text-align-justify">',
+      ],
+      'alignment and heading, but all class values allowed for headings' => [
+        'plugins' => [
+          'ckeditor5_alignment',
+          'ckeditor5_heading',
+          'ckeditor5_paragraph',
+          'ckeditor5_plugin_elements_test_headingsUseClassAnyValue',
+        ],
+        'text_editor_settings' => [
+          'plugins' => [
+            'ckeditor5_heading' => Heading::DEFAULT_CONFIGURATION,
+          ],
+        ],
+        'expected_elements' => [
+          'p' => [
+            'class' => $text_align_classes,
+          ],
+          'h2' => [
+            'class' => TRUE,
+          ],
+          'h3' => [
+            'class' => TRUE,
+          ],
+          'h4' => [
+            'class' => TRUE,
+          ],
+          'h5' => [
+            'class' => TRUE,
+          ],
+          'h6' => [
+            'class' => TRUE,
+          ],
+          'h1' => [
+            'class' => TRUE,
+          ],
+        ],
+        'expected_readable_string' => '<p class="text-align-left text-align-center text-align-right text-align-justify"> <h2 class> <h3 class> <h4 class> <h5 class> <h6 class> <h1 class>',
+      ],
+      'blockquote combo' => [
+        'plugins' => [
+          'ckeditor5_plugin_elements_test_blockquoteCombo',
+          'ckeditor5_paragraph',
+        ],
+        'text_editor_settings' => [
+          'plugins' => [
+            'ckeditor5_heading' => Heading::DEFAULT_CONFIGURATION,
+          ],
+        ],
+        'expected_elements' => [
+          'p' => [
+            'data-everyblock' => TRUE,
+          ],
+          'blockquote' => [
+            'data-justblockquote' => TRUE,
+            'data-everyblock' => TRUE,
+          ],
+        ],
+        'expected_readable_string' => '<p data-everyblock> <blockquote data-justblockquote data-everyblock>',
+      ],
+      'headings plus headings with attributes' => [
+        'plugins' => [
+          'ckeditor5_plugin_elements_test_headingsWithOtherAttributes',
+          'ckeditor5_heading',
+        ],
+        'text_editor_settings' => [
+          'plugins' => [
+            'ckeditor5_heading' => Heading::DEFAULT_CONFIGURATION,
+          ],
+        ],
+        'expected_elements' => [
+          'h2' => [
+            'class' => [
+              'additional-allowed-class' => TRUE,
+            ],
+          ],
+          'h3' => [
+            'data-just-h3' => TRUE,
+            'data-just-h3-limited' => [
+              'i-am-the-only-allowed-value' => TRUE,
+            ],
+          ],
+          'h4' => FALSE,
+          'h5' => [
+            'data-just-h5-limited' => [
+              'first-allowed-value' => TRUE,
+              'second-allowed-value' => TRUE,
+            ],
+          ],
+          'h6' => FALSE,
+          'h1' => [
+            'data-just-h1' => TRUE,
+          ],
+        ],
+        'expected_readable_string' => '<h2 class="additional-allowed-class"> <h3 data-just-h3 data-just-h3-limited="i-am-the-only-allowed-value"> <h4> <h5 data-just-h5-limited="first-allowed-value second-allowed-value"> <h6> <h1 data-just-h1>',
+      ],
+      'headings plus headings with attributes and alignment' => [
+        'plugins' => [
+          'ckeditor5_plugin_elements_test_headingsWithOtherAttributes',
+          'ckeditor5_heading',
+          'ckeditor5_alignment',
+        ],
+        'text_editor_settings' => [
+          'plugins' => [
+            'ckeditor5_heading' => Heading::DEFAULT_CONFIGURATION,
+          ],
+        ],
+        'expected_elements' => [
+          'h2' => [
+            'class' => ['additional-allowed-class' => TRUE] + $text_align_classes,
+          ],
+          'h3' => [
+            'data-just-h3' => TRUE,
+            'data-just-h3-limited' => [
+              'i-am-the-only-allowed-value' => TRUE,
+            ],
+            'class' => $text_align_classes,
+          ],
+          'h4' => [
+            'class' => $text_align_classes,
+          ],
+          'h5' => [
+            'data-just-h5-limited' => [
+              'first-allowed-value' => TRUE,
+              'second-allowed-value' => TRUE,
+            ],
+            'class' => $text_align_classes,
+          ],
+          'h6' => [
+            'class' => $text_align_classes,
+          ],
+          'h1' => [
+            'data-just-h1' => TRUE,
+            'class' => $text_align_classes,
+          ],
+        ],
+        'expected_readable_string' => '<h2 class="additional-allowed-class text-align-left text-align-center text-align-right text-align-justify"> <h3 data-just-h3 data-just-h3-limited="i-am-the-only-allowed-value" class="text-align-left text-align-center text-align-right text-align-justify"> <h4 class="text-align-left text-align-center text-align-right text-align-justify"> <h5 data-just-h5-limited="first-allowed-value second-allowed-value" class="text-align-left text-align-center text-align-right text-align-justify"> <h6 class="text-align-left text-align-center text-align-right text-align-justify"> <h1 data-just-h1 class="text-align-left text-align-center text-align-right text-align-justify">',
+      ],
+    ];
+  }
+
+  /**
+   * Tests the logic of findPluginSupportingElement.
+   *
+   * When multiple plugins support a given tag, this method decides which plugin
+   * to return based on which provides the broadest attribute support.
+   *
+   * @covers \Drupal\ckeditor5\Plugin\CKEditor5PluginManager::findPluginSupportingElement
+   *
+   * @dataProvider providerTestPluginSupportingElement
+   */
+  public function testPluginSupportingElement(string $tag, ?string $expected_plugin_id) {
+    $this->enableModules(['ckeditor5_definition_supporting_element']);
+    $plugin_id = $this->manager->findPluginSupportingElement($tag);
+    $this->assertSame($expected_plugin_id, $plugin_id);
+  }
+
+  /**
+   * Provides use cases for findPluginSupportingElement().
+   */
+  public function providerTestPluginSupportingElement() {
+    return [
+      'tag that belongs to a superset' => [
+        'tag' => 'h2',
+        'expected_plugin' => 'ckeditor5_heading',
+      ],
+      'tag only available as tag' => [
+        'tag' => 'nav',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_just_nav',
+      ],
+      'between just tag, full use of class, and constrained use of class, return full use of class' => [
+        'tag' => 'article',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_article_class',
+      ],
+      'between just tag and full use of class, return full use of class' => [
+        'tag' => 'footer',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_footer_class',
+      ],
+      'between just tag and constrained use of class, return constrained use of class' => [
+        'tag' => 'aside',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_aside_class_with_values',
+      ],
+      'between full use of class and constrained use of class, return full use of class' => [
+        'tag' => 'main',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_main_class',
+      ],
+      'between one plugin allows one attribute, second allows two, return the one that allows two' => [
+        'tag' => 'figure',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_figure_two_attrib',
+      ],
+      'between one plugin allows one attribute, second allows two (but appearing in opposite order), still return the one that allows two' => [
+        'tag' => 'dialog',
+        'expected_plugin' => 'ckeditor5_definition_supporting_element_dialog_two_attrib',
+      ],
+      'tag that belongs to a plugin with conditions' => [
+        'tag' => 'drupal-media',
+        'expected_plugin' => NULL,
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Kernel/CKEditor5ValidationTestTrait.php b/core/modules/ckeditor5/tests/src/Kernel/CKEditor5ValidationTestTrait.php
new file mode 100644
index 0000000000..bdb4bcfa28
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Kernel/CKEditor5ValidationTestTrait.php
@@ -0,0 +1,50 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\ckeditor5\Kernel;
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\editor\EditorInterface;
+use Drupal\filter\FilterFormatInterface;
+
+/**
+ * Defines a trait for testing CKEditor 5 validity.
+ */
+trait CKEditor5ValidationTestTrait {
+
+  /**
+   * Decorator for CKEditor5::validatePair() that returns an assertable array.
+   *
+   * @param \Drupal\editor\EditorInterface $text_editor
+   *   The paired text editor to validate.
+   * @param \Drupal\filter\FilterFormatInterface $text_format
+   *   The paired text format to validate.
+   * @param bool $all_compatibility_problems
+   *   Only fundamental compatibility violations are returned unless TRUE.
+   *
+   * @return array
+   *   An array with property paths as keys and violation messages as values.
+   *
+   * @see \Drupal\ckeditor5\Plugin\Editor\CKEditor5::validatePair
+   */
+  private function validatePairToViolationsArray(EditorInterface $text_editor, FilterFormatInterface $text_format, bool $all_compatibility_problems) : array {
+    $violations = CKEditor5::validatePair($text_editor, $text_format, $all_compatibility_problems);
+    $actual_violations = [];
+    foreach ($violations as $violation) {
+      if (!isset($actual_violations[$violation->getPropertyPath()])) {
+        $actual_violations[$violation->getPropertyPath()] = (string) $violation->getMessage();
+      }
+      else {
+        // Transform value from string to array.
+        if (is_string($actual_violations[$violation->getPropertyPath()])) {
+          $actual_violations[$violation->getPropertyPath()] = (array) $actual_violations[$violation->getPropertyPath()];
+        }
+        // And append.
+        $actual_violations[$violation->getPropertyPath()][] = (string) $violation->getMessage();
+      }
+    }
+    return $actual_violations;
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Kernel/ConfigurablePluginTest.php b/core/modules/ckeditor5/tests/src/Kernel/ConfigurablePluginTest.php
new file mode 100644
index 0000000000..3e0563340e
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Kernel/ConfigurablePluginTest.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace Drupal\Tests\ckeditor5\Kernel;
+
+use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Tests configurable plugins.
+ *
+ * @group ckeditor5
+ */
+class ConfigurablePluginTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'ckeditor5',
+  ];
+
+  /**
+   * The manager for "CKEditor 5 plugin" plugins.
+   *
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $manager;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+    $this->manager = $this->container->get('plugin.manager.ckeditor5.plugin');
+  }
+
+  /**
+   * Tests default settings for configurable CKEditor 5 plugins.
+   */
+  public function testDefaults() {
+    $all_definitions = $this->manager->getDefinitions();
+    $configurable_definitions = array_filter($all_definitions, function (CKEditor5PluginDefinition $definition) : bool {
+      return $definition->isConfigurable();
+    });
+    $default_plugin_settings = [];
+    foreach (array_keys($configurable_definitions) as $plugin_name) {
+      $default_plugin_settings[$plugin_name] = $this->manager->getPlugin($plugin_name, NULL)->defaultConfiguration();
+    }
+
+    $expected_default_plugin_settings = [
+      'ckeditor5_heading' => [
+        'enabled_headings' => [
+          'heading2',
+          'heading3',
+          'heading4',
+          'heading5',
+          'heading6',
+        ],
+      ],
+      'ckeditor5_sourceEditing' => [
+        'allowed_tags' => [],
+      ],
+      'ckeditor5_language' => [
+        'language_list' => 'un',
+      ],
+      'ckeditor5_imageUpload' => [],
+    ];
+    $this->assertSame($expected_default_plugin_settings, $default_plugin_settings);
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Kernel/LanguageTest.php b/core/modules/ckeditor5/tests/src/Kernel/LanguageTest.php
new file mode 100644
index 0000000000..34b746c185
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Kernel/LanguageTest.php
@@ -0,0 +1,121 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\ckeditor5\Kernel;
+
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\language\Entity\ConfigurableLanguage;
+use Symfony\Component\Yaml\Yaml;
+
+/**
+ * Tests language resolving for CKEditor 5.
+ *
+ * @group ckeditor5
+ */
+class LanguageTest extends KernelTestBase {
+
+  /**
+   * The CKEditor 5 plugin.
+   *
+   * @var \Drupal\ckeditor5\Plugin\Editor\CKEditor5
+   */
+  protected $ckeditor5;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'system',
+    'user',
+    'ckeditor5',
+    'editor',
+    'filter',
+    'language',
+    'locale',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+    $this->ckeditor5 = $this->container->get('plugin.manager.editor')->createInstance('ckeditor5');
+
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.basic_html.yml')
+    )->save();
+    Editor::create([
+      'format' => 'basic_html',
+      'editor' => 'ckeditor5',
+    ])->save();
+
+    $this->installConfig(['language']);
+  }
+
+  /**
+   * Ensure that languages are resolved correctly.
+   *
+   * @param string $drupal_langcode
+   *   The language code in Drupal.
+   * @param string $cke5_langcode
+   *   The language code in CKEditor 5.
+   * @param bool $is_missing_mapping
+   *   Whether this mapping is expected to be missing from language.mappings.
+   *
+   * @dataProvider provider
+   */
+  public function test(string $drupal_langcode, string $cke5_langcode, bool $is_missing_mapping = FALSE): void {
+    $editor = Editor::load('basic_html');
+
+    ConfigurableLanguage::createFromLangcode($drupal_langcode)->save();
+    $this->config('system.site')->set('default_langcode', $drupal_langcode)->save();
+
+    if ($is_missing_mapping) {
+      // CKEditor 5's UI language falls back to English, until the language
+      // mapping is expanded.
+      $settings = $this->ckeditor5->getJSSettings($editor);
+      $this->assertSame('en', $settings['language']['ui']);
+
+      // Expand the language mapping.
+      $config = $this->config('language.mappings');
+      $mapping = $config->get('map');
+      $mapping += [$cke5_langcode => $drupal_langcode];
+      $config->set('map', $mapping)->save();
+    }
+
+    $settings = $this->ckeditor5->getJSSettings($editor);
+    $this->assertSame($cke5_langcode, $settings['language']['ui']);
+  }
+
+  /**
+   * Provides a list of language code pairs.
+   *
+   * @return \string[][]
+   */
+  public function provider(): array {
+    $random_langcode = $this->randomMachineName();
+    return [
+      'Language code transformed from browser mappings' => [
+        'drupal_langcode' => 'pt-pt',
+        'cke_langcode' => 'pt',
+      ],
+      'Language code transformed from browser mappings 2' => [
+        'drupal_langcode' => 'zh-hans',
+        'cke_langcode' => 'zh-cn',
+      ],
+      'Language code both in Drupal and CKEditor' => [
+        'drupal_langcode' => 'fi',
+        'cke_langcode' => 'fi',
+      ],
+      'Language code not in Drupal but in CKEditor 5 requires new language.mappings entry' => [
+        'drupal_langcode' => $random_langcode,
+        'cke_langcode' => 'de-ch',
+        'is_missing_mapping' => TRUE,
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Kernel/SmartDefaultSettingsTest.php b/core/modules/ckeditor5/tests/src/Kernel/SmartDefaultSettingsTest.php
new file mode 100644
index 0000000000..aa8eaef000
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Kernel/SmartDefaultSettingsTest.php
@@ -0,0 +1,496 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\ckeditor5\Kernel;
+
+use Drupal\ckeditor5\HTMLRestrictionsUtilities;
+use Drupal\Component\Utility\NestedArray;
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\Tests\SchemaCheckTestTrait;
+use Symfony\Component\Yaml\Yaml;
+
+/**
+ * @covers \Drupal\ckeditor5\SmartDefaultSettings::computeSmartDefaultSettings()
+ * @group ckeditor5
+ */
+class SmartDefaultSettingsTest extends KernelTestBase {
+
+  use SchemaCheckTestTrait;
+  use CKEditor5ValidationTestTrait;
+
+  /**
+   * The manager for "CKEditor 5 plugin" plugins.
+   *
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $manager;
+
+  /**
+   * The typed config manager.
+   *
+   * @var \Drupal\Core\Config\TypedConfigManagerInterface
+   */
+  protected $typedConfig;
+
+  /**
+   * Smart default settings utility.
+   *
+   * @var \Drupal\ckeditor5\SmartDefaultSettings
+   */
+  protected $smartDefaultSettings;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'ckeditor',
+    'ckeditor5',
+    'editor',
+    'filter',
+    'user',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+    $this->manager = $this->container->get('plugin.manager.ckeditor5.plugin');
+    $this->typedConfig = $this->container->get('config.typed');
+    $this->smartDefaultSettings = $this->container->get('ckeditor5.smart_default_settings');
+
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.full_html.yml')
+    )
+      ->setSyncing(TRUE)
+      ->save();
+    Editor::create(
+      Yaml::parseFile('core/profiles/standard/config/install/editor.editor.full_html.yml')
+    )->save();
+
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.basic_html.yml')
+    )->save();
+    Editor::create(
+      Yaml::parseFile('core/profiles/standard/config/install/editor.editor.basic_html.yml')
+    )->save();
+
+    FilterFormat::create(
+      Yaml::parseFile('core/profiles/standard/config/install/filter.format.restricted_html.yml')
+    )->save();
+
+    $filter_plugin_manager = $this->container->get('plugin.manager.filter');
+    FilterFormat::create([
+      'format' => 'filter_only__filter_html',
+      'name' => 'Only the "filter_html" filter and its default settings',
+      'filters' => [
+        'filter_html' => [
+          'status' => 1,
+          'settings' => $filter_plugin_manager->getDefinition('filter_html')['settings'],
+        ],
+      ],
+    ])->save();
+  }
+
+  /**
+   * Tests the CKEditor 5 default settings conversion.
+   *
+   * @param string $format_id
+   *   The existing text format/editor pair to switch to CKEditor 5.
+   * @param array $filters_to_drop
+   *   An array of filter IDs to drop as the keys and either TRUE (fundamental
+   *   compatibility error from CKEditor 5 expected) or FALSE (if optional to
+   *   drop).
+   * @param array $expected_ckeditor5_settings
+   *   The CKEditor 5 settings to test.
+   * @param string $expected_superset
+   *   The default settings conversion may generate a superset of the original
+   *   HTML restrictions. This lists the additional elements and attributes.
+   * @param array $expected_fundamental_compatibility_violations
+   *   All expected fundamental compatibility violations for the given text
+   *   format.
+   * @param array|null $expected_post_filter_drop_fundamental_compatibility_violations
+   *   All expected fundamental compatibility violations for the given text
+   *   format, after dropping filters specified in $filters_to_drop.
+   *
+   * @dataProvider provider
+   *
+   * @todo In https://www.drupal.org/project/ckeditor5/issues/3226694 this
+   *   should also test the expected messages.
+   */
+  public function test(string $format_id, array $filters_to_drop, array $expected_ckeditor5_settings, string $expected_superset, array $expected_fundamental_compatibility_violations, ?array $expected_post_filter_drop_fundamental_compatibility_violations = NULL) : void {
+    $text_format = FilterFormat::load($format_id);
+    $text_editor = Editor::load($format_id);
+
+    // Check the pre-CKE5 switch validation errors in case of a minimal (empty)
+    // CKEditor 5 text editor config entity, to allow us to detect fundamental
+    // compatibility problems, such as incompatible filters.
+    $minimal_valid_cke5_text_editor = Editor::create([
+      'format' => $format_id,
+      'editor' => 'ckeditor5',
+      'settings' => ['toolbar' => ['items' => []]],
+    ]);
+    $pre_ck5_validation_errors = $this->validatePairToViolationsArray($minimal_valid_cke5_text_editor, $text_format, FALSE);
+    $this->assertSame($expected_fundamental_compatibility_violations, $pre_ck5_validation_errors);
+
+    if (!empty($filters_to_drop)) {
+      foreach ($filters_to_drop as $filter_name => $is_fundamentally_incompatible) {
+        // Assert if it should appear in the pre-CKE5 switch validation errors.
+        $this->assertSame($is_fundamentally_incompatible, mb_strpos(implode("\n\n", $pre_ck5_validation_errors[''] ?? []), $filter_name) !== FALSE);
+        $text_format->setFilterConfig($filter_name, [
+          'status' => FALSE,
+        ]);
+      }
+
+      // If filters were dropped because of a fundamental compatibility problem,
+      // validate the text format + minimal CKEditor 5 text editor config again
+      // after dropping those filters from the text format. This allows us to be
+      // confident that we have caught all fundamental compatibility problems.
+      if (!empty(array_filter($filters_to_drop))) {
+        $post_filter_drop_validation_errors = $this->validatePairToViolationsArray($minimal_valid_cke5_text_editor, $text_format, FALSE);
+        $this->assertSame($expected_post_filter_drop_fundamental_compatibility_violations, $post_filter_drop_validation_errors);
+      }
+    }
+
+    $updated_text_editor = $this->smartDefaultSettings->computeSmartDefaultSettings($text_editor, $text_format);
+
+    // Ensure that the result of ::computeSmartDefaultSettings() always complies
+    // with the config schema.
+    $this->assertConfigSchema(
+      $this->typedConfig,
+      $updated_text_editor->getConfigDependencyName(),
+      $updated_text_editor->toArray()
+    );
+
+    // We should now have the expected data in the Editor config entity.
+    $this->assertSame('ckeditor5', $updated_text_editor->getEditor());
+    $this->assertSame($expected_ckeditor5_settings, $updated_text_editor->getSettings());
+
+    // If this text format already had a text editor, ensure that the settings
+    // do not match the original settings, but the image upload settings should
+    // not have been changed.
+    if ($text_editor !== NULL) {
+      $this->assertNotSame($text_editor->getSettings(), $updated_text_editor->getSettings());
+      $this->assertSame($text_editor->getImageUploadSettings(), $updated_text_editor->getImageUploadSettings());
+    }
+
+    // The resulting Editor config entity should be valid.
+    $typed_config = $this->typedConfig->createFromNameAndData(
+      $updated_text_editor->getConfigDependencyName(),
+      $updated_text_editor->toArray(),
+    );
+    $this->assertCount(0, $typed_config->validate());
+
+    // If the text format has HTML restrictions, ensure that a strict superset
+    // is allowed after switching to CKEditor 5.
+    $html_restrictions = $text_format->getHtmlRestrictions();
+    $allowed_tags = $html_restrictions['allowed'] ?? [];
+    if ($allowed_tags) {
+      unset($allowed_tags['*']);
+      $enabled_plugins = array_keys($this->manager->getEnabledDefinitions($updated_text_editor));
+      $updated_allowed_tags = $this->manager->getProvidedElements($enabled_plugins, $updated_text_editor);
+      $unsupported_tags_attributes = HTMLRestrictionsUtilities::diffAllowedElements($allowed_tags, $updated_allowed_tags);
+      $superset_tags_attributes = HTMLRestrictionsUtilities::diffAllowedElements($updated_allowed_tags, $allowed_tags);
+      $this->assertSame($expected_superset, implode(' ', HTMLRestrictionsUtilities::toReadableElements($superset_tags_attributes)));
+      $this->assertEmpty($unsupported_tags_attributes, "The following tags/attributes are not allowed in the updated text format:" . print_r($unsupported_tags_attributes, TRUE));
+
+      // Update the text format like ckeditor5_form_filter_format_form_alter()
+      // would.
+      $updated_text_format = clone $text_format;
+      $filter_html_config = $text_format->filters('filter_html')->getConfiguration();
+      $filter_html_config['settings']['allowed_html'] = implode(' ', HTMLRestrictionsUtilities::toReadableElements($updated_allowed_tags));
+      $updated_text_format->setFilterConfig('filter_html', $filter_html_config);
+    }
+    else {
+      // No update.
+      $updated_text_format = $text_format;
+    }
+
+    // The resulting pair should be valid.
+    $this->assertSame([], $this->validatePairToViolationsArray($updated_text_editor, $updated_text_format, TRUE));
+  }
+
+  /**
+   * Data provider.
+   *
+   * @return \Generator
+   *   Test scenarios.
+   */
+  public function provider() {
+    $basic_html_test_case = [
+      'format_id' => 'basic_html',
+      'filters_to_drop' => [],
+      'expected_ckeditor5_settings' => [
+        'toolbar' => [
+          'items' => [
+            // Items based on toolbar items from prior config.
+            'bold',
+            'italic',
+            '|',
+            'link',
+            '|',
+            'bulletedList',
+            'numberedList',
+            '|',
+            'blockQuote',
+            'uploadImage',
+            '|',
+            'heading',
+            '|',
+            'sourceEditing',
+            // Items added based on "allowed tags" config.
+            '|',
+            // The 'code' button added because <code> is allowed.
+            'code',
+            // The 'textPartLanguage' button added because <span> is allowed.
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [
+              '<cite>',
+              '<dl>',
+              '<dt>',
+              '<dd>',
+              '<a hreflang>',
+              '<blockquote cite>',
+              '<ul type>',
+              '<ol start type>',
+              '<h2 id>',
+              '<h3 id>',
+              '<h4 id>',
+              '<h5 id>',
+              '<h6 id>',
+            ],
+          ],
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+          'ckeditor5_language' => [
+            'language_list' => 'un',
+          ],
+        ],
+      ],
+      'expected_superset' => '<span lang dir>',
+      'expected_fundamental_compatibility_violations' => [],
+    ];
+
+    yield "basic_html can be switched to CKEditor 5 without problems" => $basic_html_test_case;
+
+    yield "basic_html with filter_caption removed => disallows <img data-caption>" => NestedArray::mergeDeep(
+      $basic_html_test_case,
+      [
+        'filters_to_drop' => [
+          'filter_caption' => FALSE,
+        ],
+        'expected_ckeditor5_settings' => [
+          'plugins' => [
+            'ckeditor5_sourceEditing' => [
+              'allowed_tags' => [
+                '<img data-caption>',
+              ],
+            ],
+          ],
+        ],
+      ]);
+
+    yield "basic_html with filter_align removed => disallows <img data-align>, but " => NestedArray::mergeDeep(
+      $basic_html_test_case,
+      [
+        'filters_to_drop' => [
+          'filter_align' => FALSE,
+        ],
+        'expected_ckeditor5_settings' => [
+          'plugins' => [
+            'ckeditor5_sourceEditing' => [
+              'allowed_tags' => [
+                '<img data-align>',
+              ],
+            ],
+          ],
+        ],
+      ]);
+
+    yield "restricted_html can be switched to CKEditor 5 after dropping the two markup-creating filters" => [
+      'format_id' => 'restricted_html',
+      'filters_to_drop' => [
+        'filter_autop' => TRUE,
+        'filter_url' => TRUE,
+      ],
+      'expected_ckeditor5_settings' => [
+        'toolbar' => [
+          'items' => [
+            // Items originating from CKEditor5::getDefaultSettings().
+            'heading',
+            'bold',
+            'italic',
+            // Items added based on "allowed tags" config.
+            '|',
+            // Because '<a>' is in allowed_html.
+            'link',
+            // Because '<blockquote cite>' is in allowed_html.
+            'blockQuote',
+            // Because '<code>' is in allowed_html.
+            'code',
+            // Because '<ul>' is in allowed_html.
+            'bulletedList',
+            // Because '<ol>' is in allowed_html.
+            'numberedList',
+            // Because additional tags need to be allowed to achieve a superset.
+            'sourceEditing',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [
+              '<cite>',
+              '<dl>',
+              '<dt>',
+              '<dd>',
+              '<a hreflang>',
+              '<blockquote cite>',
+              '<ul type>',
+              '<ol start type>',
+              '<h2 id>',
+              '<h3 id>',
+              '<h4 id>',
+              '<h5 id>',
+              '<h6 id>',
+            ],
+          ],
+        ],
+      ],
+      'expected_superset' => '<br> <p>',
+      'expected_fundamental_compatibility_violations' => [
+        '' => [
+          0 => 'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert URLs into links</em>" (<em class="placeholder">filter_url</em>) filter implies this text format is not HTML anymore.',
+          1 => 'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert line breaks into HTML (i.e. &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;)</em>" (<em class="placeholder">filter_autop</em>) filter implies this text format is not HTML anymore.',
+        ],
+      ],
+      'expected_post_filter_drop_fundamental_compatibility_violations' => [
+        '' => 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are not allowed by the "<em class="placeholder">Limit allowed HTML tags and correct faulty HTML</em>" (<em class="placeholder">filter_html</em>) filter.',
+      ],
+    ];
+
+    yield "full_html can be switched to CKEditor 5 after dropping the two markup-creating filters" => [
+      'format_id' => 'full_html',
+      'filters_to_drop' => [],
+      'expected_ckeditor5_settings' => [
+        'toolbar' => [
+          'items' => [
+            'bold',
+            'italic',
+            'strikethrough',
+            'superscript',
+            'subscript',
+            '|',
+            'link',
+            '|',
+            'bulletedList',
+            'numberedList',
+            '|',
+            'blockQuote',
+            'uploadImage',
+            'insertTable',
+            'horizontalLine',
+            '|',
+            'heading',
+            '|',
+            'sourceEditing',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [],
+          ],
+        ],
+      ],
+      'expected_superset' => '',
+      'expected_fundamental_compatibility_violations' => [],
+    ];
+
+    yield "filter_only__filter_html can be switched to CKEditor 5 without problems" => [
+      'format_id' => 'filter_only__filter_html',
+      'filters_to_drop' => [],
+      'expected_ckeditor5_settings' => [
+        'toolbar' => [
+          'items' => [
+            // Default toolbar items.
+            'heading',
+            'bold',
+            'italic',
+            '|',
+            // Items added based on filter_html's "allowed tags" config.
+            'link',
+            'blockQuote',
+            'code',
+            'bulletedList',
+            'numberedList',
+            'sourceEditing',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [
+              '<cite>',
+              '<dl>',
+              '<dt>',
+              '<dd>',
+              '<a hreflang>',
+              '<blockquote cite>',
+              '<ul type>',
+              '<ol start type="1 A I">',
+              '<h2 id="jump-*">',
+              '<h3 id>',
+              '<h4 id>',
+              '<h5 id>',
+              '<h6 id>',
+            ],
+          ],
+        ],
+      ],
+      'expected_superset' => '<br> <p>',
+      'expected_fundamental_compatibility_violations' => [
+        '' => 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are not allowed by the "<em class="placeholder">Limit allowed HTML tags and correct faulty HTML</em>" (<em class="placeholder">filter_html</em>) filter.',
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Kernel/ValidatorsTest.php b/core/modules/ckeditor5/tests/src/Kernel/ValidatorsTest.php
new file mode 100644
index 0000000000..3ea74ed6f4
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Kernel/ValidatorsTest.php
@@ -0,0 +1,750 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\ckeditor5\Kernel;
+
+use Drupal\Component\Utility\Html;
+use Drupal\editor\EditorInterface;
+use Drupal\editor\Entity\Editor;
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\filter\FilterFormatInterface;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\Tests\SchemaCheckTestTrait;
+
+/**
+ * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemConstraintValidator
+ * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemDependencyConstraintValidator
+ * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\EnabledConfigurablePluginsConstraintValidator
+ * @covers \Drupal\ckeditor5\Plugin\Editor\CKEditor5::validatePair()
+ * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraintValidator
+ * @group ckeditor5
+ */
+class ValidatorsTest extends KernelTestBase {
+
+  use SchemaCheckTestTrait;
+  use CKEditor5ValidationTestTrait;
+
+  /**
+   * The typed config manager.
+   *
+   * @var \Drupal\Core\Config\TypedConfigManagerInterface
+   */
+  protected $typedConfig;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'ckeditor5',
+    'editor',
+    'filter',
+    'filter_test',
+    'media',
+    'media_library',
+    'views',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+    $this->typedConfig = $this->container->get('config.typed');
+  }
+
+  /**
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemConstraintValidator
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemDependencyConstraintValidator
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\EnabledConfigurablePluginsConstraintValidator
+   * @dataProvider provider
+   *
+   * @param array $ckeditor5_settings
+   *   The CKEditor 5 settings to test.
+   * @param array $expected_violations
+   *   All expected violations for the given CKEditor 5 settings, with property
+   *   path as keys and message as values.
+   */
+  public function test(array $ckeditor5_settings, array $expected_violations) {
+    // The data provider is unable to access services, so the test scenario of
+    // testing with CKEditor 5's default settings is partially provided here.
+    if ($ckeditor5_settings === ['__DEFAULT__']) {
+      $ckeditor5_settings = \Drupal::service('plugin.manager.editor')->createInstance('ckeditor5')->getDefaultSettings();
+    }
+
+    FilterFormat::create([
+      'format' => 'dummy',
+      'name' => 'Dummy',
+    ])->save();
+    $editor = Editor::create([
+      'format' => 'dummy',
+      'editor' => 'ckeditor5',
+      'settings' => $ckeditor5_settings,
+      'image_upload' => [],
+    ]);
+
+    $typed_config = $this->typedConfig->createFromNameAndData(
+      $editor->getConfigDependencyName(),
+      $editor->toArray(),
+    );
+    $this->assertConfigSchema(
+      $this->typedConfig,
+      $editor->getConfigDependencyName(),
+      $typed_config->getValue()
+    );
+    $violations = $typed_config->validate();
+
+    $actual_violations = [];
+    foreach ($violations as $violation) {
+      $actual_violations[$violation->getPropertyPath()] = (string) $violation->getMessage();
+    }
+    $this->assertSame($expected_violations, $actual_violations);
+  }
+
+  /**
+   * Provides a list of Text Editor config entities using CKEditor 5 to test.
+   */
+  public function provider() : array {
+    $data = [];
+    $data['CKEditor5::getDefaultSettings()'] = [
+      // @see ::test()
+      'settings' => ['__DEFAULT__'],
+      'violations' => [],
+    ];
+    $data['non-existent toolbar button'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'underline',
+            'bold',
+            'italic',
+            '-',
+            'bulletedList',
+            'foobar',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'violations' => [
+        'settings.toolbar.items.5' => 'The provided toolbar item <em class="placeholder">foobar</em> is not valid.',
+      ],
+    ];
+
+    $data['missing heading plugin configuration'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'heading',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'violations' => [
+        'settings.plugins.ckeditor5_heading' => 'Configuration for the enabled plugin "<em class="placeholder">Headings</em>" (<em class="placeholder">ckeditor5_heading</em>) is missing.',
+      ],
+    ];
+    $data['missing language plugin configuration'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'violations' => [
+        'settings.plugins.ckeditor5_language' => 'Configuration for the enabled plugin "<em class="placeholder">Language</em>" (<em class="placeholder">ckeditor5_language</em>) is missing.',
+      ],
+    ];
+    $data['empty language plugin configuration'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_language' => [],
+        ],
+      ],
+      'violations' => [
+        'settings.plugins.ckeditor5_language' => 'Configuration for the enabled plugin "<em class="placeholder">Language</em>" (<em class="placeholder">ckeditor5_language</em>) is missing.',
+      ],
+    ];
+    $data['valid language plugin configuration: un'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_language' => [
+            'language_list' => 'un',
+          ],
+        ],
+      ],
+      'violations' => [],
+    ];
+    $data['valid language plugin configuration: all'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_language' => [
+            'language_list' => 'all',
+          ],
+        ],
+      ],
+      'violations' => [],
+    ];
+    $data['invalid language plugin configuration: textPartLanguage button not enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'bold',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_language' => [
+            'language_list' => 'all',
+          ],
+        ],
+      ],
+      'violations' => [
+        'settings.plugins.ckeditor5_language.language_list' => 'Depends on <em class="placeholder">textPartLanguage</em>, which is not enabled.',
+      ],
+    ];
+    $data['invalid language plugin configuration: invalid language_list setting'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_language' => [
+            'language_list' => 'foo',
+          ],
+        ],
+      ],
+      'violations' => [
+        'settings.plugins.ckeditor5_language.language_list' => 'The value you selected is not a valid choice.',
+      ],
+    ];
+
+    $data['uploadImage toolbar item condition not met: image uploads must be enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'uploadImage',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'violations' => [
+        'settings.toolbar.items.0' => 'The <em class="placeholder">Image upload</em> toolbar item requires image uploads to be enabled.',
+      ],
+    ];
+    $data['drupalMedia toolbar item condition not met: media filter enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'drupalMedia',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'violations' => [
+        'settings.toolbar.items.0' => 'The <em class="placeholder">Drupal media</em> toolbar item requires the <em class="placeholder">Embed media</em> filter to be enabled.',
+      ],
+    ];
+
+    return $data;
+  }
+
+  /**
+   * @covers \Drupal\ckeditor5\Plugin\Editor\CKEditor5::validatePair()
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraintValidator
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemConstraintValidator
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\ToolbarItemDependencyConstraintValidator
+   * @covers \Drupal\ckeditor5\Plugin\Validation\Constraint\EnabledConfigurablePluginsConstraintValidator
+   * @dataProvider providerPair
+   *
+   * @param array $ckeditor5_settings
+   *   The paired text editor's CKEditor 5 settings to test.
+   * @param array $editor_image_upload_settings
+   *   The paired text editor's image upload settings to test.
+   * @param array $filters
+   *   The paired text format's filters and filter settings.
+   * @param array $expected_violations
+   *   All expected violations for the pair.
+   */
+  public function testPair(array $ckeditor5_settings, array $editor_image_upload_settings, array $filters, array $expected_violations) {
+    $text_editor = Editor::create([
+      'format' => 'dummy',
+      'editor' => 'ckeditor5',
+      'settings' => $ckeditor5_settings,
+      'image_upload' => $editor_image_upload_settings,
+    ]);
+    assert($text_editor instanceof EditorInterface);
+    $this->assertConfigSchema(
+      $this->typedConfig,
+      $text_editor->getConfigDependencyName(),
+      $text_editor->toArray()
+    );
+    $text_format = FilterFormat::create([
+      'filters' => $filters,
+    ]);
+    assert($text_format instanceof FilterFormatInterface);
+
+    $this->assertSame($expected_violations, $this->validatePairToViolationsArray($text_editor, $text_format, TRUE));
+  }
+
+  /**
+   * Provides a list of Text Editor + Text Format pairs to test.
+   */
+  public function providerPair() : array {
+    // cspell:ignore donk
+    $data = [];
+    $data['INVALID: non-HTML format: filter_autop'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'bold',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_autop' => [
+          'id' => 'filter_autop',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [],
+        ],
+      ],
+      'violations' => [
+        '' => 'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert line breaks into HTML (i.e. &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;)</em>" (<em class="placeholder">filter_autop</em>) filter implies this text format is not HTML anymore.',
+      ],
+    ];
+    $data['INVALID: non-HTML format: filter_autop + filter_url'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'bold',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_autop' => [
+          'id' => 'filter_autop',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [],
+        ],
+        'filter_url' => [
+          'id' => 'filter_url',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'filter_url_length' => 72,
+          ],
+        ],
+      ],
+      'violations' => [
+        '' => [
+          'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert URLs into links</em>" (<em class="placeholder">filter_url</em>) filter implies this text format is not HTML anymore.',
+          'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert line breaks into HTML (i.e. &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;)</em>" (<em class="placeholder">filter_autop</em>) filter implies this text format is not HTML anymore.',
+        ],
+      ],
+    ];
+    $data['INVALID: forbidden tags'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_test_restrict_tags_and_attributes' => [
+          'id' => 'filter_test_restrict_tags_and_attributes',
+          'provider' => 'filter_test',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'restrictions' => [
+              'forbidden_tags' => ['p' => FALSE],
+            ],
+          ],
+        ],
+      ],
+      'violations' => [
+        '' => 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are forbidden by the "<em class="placeholder">Tag and attribute restricting filter</em>" (<em class="placeholder">filter_test_restrict_tags_and_attributes</em>) filter.',
+      ],
+    ];
+    // @todo read this directly from
+    // core/profiles/standard/config/install/filter.format.restricted_html.yml,
+    // but it seems that PHPUnit forbids us from doing that
+    // https://www.drupal.org/project/ckeditor5/issues/3231325.
+    $restricted_html_format_filters = [
+      'filter_html' => [
+        'id' => 'filter_html',
+        'provider' => 'filter',
+        'status' => TRUE,
+        'weight' => -10,
+        'settings' => [
+          'allowed_html' => "<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>",
+          'filter_html_help' => TRUE,
+          'filter_html_nofollow' => TRUE,
+        ],
+      ],
+      'filter_autop' => [
+        'id' => 'filter_autop',
+        'provider' => 'filter',
+        'status' => TRUE,
+        'weight' => 0,
+        'settings' => [],
+      ],
+      'filter_url' => [
+        'id' => 'filter_url',
+        'provider' => 'filter',
+        'status' => TRUE,
+        'weight' => 0,
+        'settings' => [
+          'filter_url_length' => 72,
+        ],
+      ],
+    ];
+    $data['INVALID: the default restricted_html text format'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => $restricted_html_format_filters,
+      'violations' => [
+        '' => [
+          'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert URLs into links</em>" (<em class="placeholder">filter_url</em>) filter implies this text format is not HTML anymore.',
+          'CKEditor 5 only works with HTML-based text formats. The "<em class="placeholder">Convert line breaks into HTML (i.e. &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;)</em>" (<em class="placeholder">filter_autop</em>) filter implies this text format is not HTML anymore.',
+        ],
+      ],
+    ];
+    $data['INVALID: the modified restricted_html text format (with filter_autop and filter_url removed)'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => array_diff_key(
+        $restricted_html_format_filters,
+        ['filter_autop' => TRUE, 'filter_url' => TRUE]
+      ),
+      'violations' => [
+        '' => 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are not allowed by the "<em class="placeholder">Limit allowed HTML tags and correct faulty HTML</em>" (<em class="placeholder">filter_html</em>) filter.',
+      ],
+    ];
+    $data['VALID: HTML format: empty toolbar + minimal allowed HTML'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_html' => [
+          'id' => 'filter_html',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'allowed_html' => "<p> <br>",
+            'filter_html_help' => TRUE,
+            'filter_html_nofollow' => TRUE,
+          ],
+        ],
+      ],
+      'violations' => [],
+    ];
+    $data['VALID: HTML format: very minimal toolbar + minimal allowed HTML'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'bold',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_html' => [
+          'id' => 'filter_html',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'allowed_html' => "<p> <br> <strong>",
+            'filter_html_help' => TRUE,
+            'filter_html_nofollow' => TRUE,
+          ],
+        ],
+      ],
+      'violations' => [],
+    ];
+    $data['INVALID: HTML format: empty toolbar + default allowed HTML tags + <p> + <br>'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_html' => [
+          'id' => 'filter_html',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'allowed_html' => "<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type='1 A I'> <li> <dl> <dt> <dd> <h2 id='jump-*'> <h3 id> <h4 id> <h5 id> <h6 id>" . "<p> <br>",
+            'filter_html_help' => TRUE,
+            'filter_html_nofollow' => TRUE,
+          ],
+        ],
+      ],
+      'violations' => [
+        'filters.filter_html' => sprintf(
+          'The current CKEditor 5 build requires the following elements and attributes: <br><code>%s</code><br>The following elements are not supported: <br><code>%s</code>',
+          Html::escape('<br> <p>'),
+          Html::escape('<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type="1 A I"> <li> <dl> <dt> <dd> <h2 id="jump-*"> <h3 id> <h4 id> <h5 id> <h6 id>'),
+        ),
+      ],
+    ];
+    $data['INVALID: HTML format: empty toolbar + default allowed HTML tags'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_html' => [
+          'id' => 'filter_html',
+          'provider' => 'filter',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'allowed_html' => "<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type='1 A I'> <li> <dl> <dt> <dd> <h2 id='jump-*'> <h3 id> <h4 id> <h5 id> <h6 id>",
+            'filter_html_help' => TRUE,
+            'filter_html_nofollow' => TRUE,
+          ],
+        ],
+      ],
+      'violations' => [
+        '' => 'CKEditor 5 needs at least the &lt;p&gt; and &lt;br&gt; tags to be allowed to be able to function. They are not allowed by the "<em class="placeholder">Limit allowed HTML tags and correct faulty HTML</em>" (<em class="placeholder">filter_html</em>) filter.',
+      ],
+    ];
+    $data['INVALID Source Editable tag already provided by plugin and another available in a not enabled plugin'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'heading',
+            'bold',
+            'italic',
+            'sourceEditing',
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+          'ckeditor5_language' => [
+            'language_list' => 'un',
+          ],
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [
+              '<strong>',
+              '<table>',
+            ],
+          ],
+        ],
+      ],
+      'image_upload' => [
+        'status' => TRUE,
+      ],
+      'filters' => [],
+      'violations' => [
+        'settings.plugins.ckeditor5_sourceEditing.allowed_tags.0' => 'The following tag(s) are already supported by enabled plugins and should not be added to the Source Editing "Manually editable HTML tags" field: <em class="placeholder">Bold (&lt;strong&gt;)</em>.',
+        'settings.plugins.ckeditor5_sourceEditing.allowed_tags.1' => 'The following tag(s) are already supported by available plugins and should not be added to the Source Editing "Manually editable HTML tags" field. Instead, enable the following plugins to support these tags: <em class="placeholder">Table (&lt;table&gt;)</em>.',
+      ],
+    ];
+    $data['INVALID some invalid Source Editable tags provided by plugin and another available in a not enabled plugin'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'heading',
+            'bold',
+            'italic',
+            'sourceEditing',
+            'textPartLanguage',
+          ],
+        ],
+        'plugins' => [
+          'ckeditor5_heading' => [
+            'enabled_headings' => [
+              'heading2',
+              'heading3',
+              'heading4',
+              'heading5',
+              'heading6',
+            ],
+          ],
+          'ckeditor5_language' => [
+            'language_list' => 'un',
+          ],
+          'ckeditor5_sourceEditing' => [
+            'allowed_tags' => [
+              '<aside>',
+              '<footer>',
+              'roy',
+              '<#donk>',
+              '<junior>cruft',
+            ],
+          ],
+        ],
+      ],
+      'image_upload' => [
+        'status' => TRUE,
+      ],
+      'filters' => [],
+      'violations' => [
+        'settings.plugins.ckeditor5_sourceEditing.allowed_tags.2' => 'The following tag is not valid HTML: <em class="placeholder">roy</em>.',
+        'settings.plugins.ckeditor5_sourceEditing.allowed_tags.3' => 'The following tag is not valid HTML: <em class="placeholder">&lt;#donk&gt;</em>.',
+        'settings.plugins.ckeditor5_sourceEditing.allowed_tags.4' => 'The following tag is not valid HTML: <em class="placeholder">&lt;junior&gt;cruft</em>.',
+      ],
+    ];
+
+    $data['INVALID: uploadImage toolbar item condition NOT met: image uploads must be enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'uploadImage',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [],
+      'violations' => [
+        'settings.toolbar.items.0' => 'The <em class="placeholder">Image upload</em> toolbar item requires image uploads to be enabled.',
+      ],
+    ];
+    $data['VALID: uploadImage toolbar item condition met: image uploads must be enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'uploadImage',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => TRUE,
+      ],
+      'filters' => [],
+      'violations' => [],
+    ];
+    $data['INVALID: drupalMedia toolbar item condition NOT met: media filter enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'drupalMedia',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [],
+      'violations' => [
+        'settings.toolbar.items.0' => 'The <em class="placeholder">Drupal media</em> toolbar item requires the <em class="placeholder">Embed media</em> filter to be enabled.',
+      ],
+    ];
+    $data['VALID: drupalMedia toolbar item condition met: media filter enabled'] = [
+      'settings' => [
+        'toolbar' => [
+          'items' => [
+            'drupalMedia',
+          ],
+        ],
+        'plugins' => [],
+      ],
+      'image_upload' => [
+        'status' => FALSE,
+      ],
+      'filters' => [
+        'filter_html' => [
+          'id' => 'media_embed',
+          'provider' => 'media',
+          'status' => TRUE,
+          'weight' => 0,
+          'settings' => [
+            'default_view_mode' => 'default',
+            'allowed_view_modes' => [],
+            'allowed_media_types' => [],
+          ],
+        ],
+      ],
+      'violations' => [
+        'settings.toolbar.items.0' => 'The <em class="placeholder">Drupal media</em> toolbar item requires the <em class="placeholder">Embed media</em> filter to be enabled.',
+      ],
+    ];
+
+    return $data;
+  }
+
+}
diff --git a/core/modules/ckeditor5/tests/src/Unit/CKEditor5Test.php b/core/modules/ckeditor5/tests/src/Unit/CKEditor5Test.php
new file mode 100644
index 0000000000..a7b175ef60
--- /dev/null
+++ b/core/modules/ckeditor5/tests/src/Unit/CKEditor5Test.php
@@ -0,0 +1,116 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\ckeditor5\Unit;
+
+use Drupal\ckeditor5\Plugin\Editor\CKEditor5;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\ckeditor5\Plugin\Editor\CKEditor5
+ * @group ckeditor5
+ */
+class CKEditor5Test extends UnitTestCase {
+
+  /**
+   * Simulated CKEditor5::buildConfigurationForm() form structure.
+   *
+   * @var array
+   */
+  protected const SIMULATED_FORM_STRUCTURE = [
+    'toolbar' => [
+      'available' => [],
+      'items' => [],
+    ],
+    'available_items_description' => [],
+    'active_items_description' => [],
+    'plugin_settings' => [],
+    'plugins' => [
+      'providerA_plugin1' => [],
+      'providerB_plugin2' => [
+        'foo' => [],
+        'bar' => [],
+      ],
+    ],
+  ];
+
+  /**
+   * Gets a protected/private method to test.
+   *
+   * @param string $name
+   *   The method name.
+   *
+   * @return \ReflectionMethod
+   *   The accessible method.
+   */
+  protected static function getMethod(string $name): \ReflectionMethod {
+    $class = new \ReflectionClass(CKEditor5::class);
+    $method = $class->getMethod($name);
+    $method->setAccessible(TRUE);
+    return $method;
+  }
+
+  /**
+   * @covers \Drupal\ckeditor5\Plugin\Editor\CKEditor5::mapViolationPropertyPathsToFormNames
+   * @dataProvider providerPathsToFormNames
+   */
+  public function testPathsToFormNames(string $property_path, string $expected_form_item_name, bool $expect_exception = FALSE): void {
+    $mapMethod = self::getMethod('mapViolationPropertyPathsToFormNames');
+    if ($expect_exception) {
+      $this->expectExceptionMessage('assert($shifted === \'settings\')');
+    }
+
+    $form_item_name = $mapMethod->invokeArgs(NULL, [$property_path, static::SIMULATED_FORM_STRUCTURE]);
+
+    if (!$expect_exception) {
+      $this->assertSame($expected_form_item_name, $form_item_name);
+    }
+  }
+
+  /**
+   * Data provider for testing mapViolationPropertyPathsToFormNames.
+   *
+   * @return array[]
+   *   An array with the property path and expected form item name.
+   */
+  public function providerPathsToFormNames(): array {
+    return [
+      'validation error targeting toolbar items' => [
+        'settings.toolbar.items',
+        'toolbar][items',
+      ],
+      'validation error targeting a specific toolbar item' => [
+        'settings.toolbar.items.6',
+        'toolbar][items',
+      ],
+      'validation error targeting a simple plugin form' => [
+        'settings.plugins.providerA_plugin1',
+        'plugins][providerA_plugin1',
+      ],
+      'validation error targeting a simple plugin form, with deep config schema detail' => [
+        'settings.plugins.providerA_plugin1.foo.bar.baz',
+        'plugins][providerA_plugin1',
+      ],
+      'validation error targeting a complex plugin form' => [
+        'settings.plugins.providerB_plugin2',
+        'plugins][providerB_plugin2',
+      ],
+      'validation error targeting a complex plugin form, with deep config schema detail' => [
+        'settings.plugins.providerB_plugin2.foo.bar.baz',
+        'plugins][providerB_plugin2][foo',
+      ],
+      'unrealistic example one — should trigger exception' => [
+        'bad.bad.worst',
+        'I DO NOT EXIST',
+        TRUE,
+      ],
+      'unrealistic example two — should trigger exception' => [
+        'one.two.three.four',
+        'one][two][three][four',
+        TRUE,
+      ],
+    ];
+  }
+
+}
diff --git a/core/package.json b/core/package.json
index 55dfe7044e..51289fb71d 100644
--- a/core/package.json
+++ b/core/package.json
@@ -28,12 +28,17 @@
     "spellcheck": "cspell",
     "spellcheck:make-drupal-dict": "rm -f misc/cspell/dictionary.txt && yarn -s spellcheck:core --unique --wordsOnly | tr '[:upper:]' '[:lower:]' | tr -d \\\\\\\\ | LC_ALL=C sort -u -o misc/cspell/dictionary.txt",
     "spellcheck:core": "cspell \"**/*\" \".*\" \"../composer/**/*\" \"../composer.json\"",
-    "vendor-update": "node ./scripts/js/assets.js"
+    "vendor-update": "node ./scripts/js/assets.js",
+    "ckeditor5:drupal:watch": "yarn ckeditor5:drupal:manifest && webpack --mode development --watch",
+    "ckeditor5:drupal:build": "yarn ckeditor5:drupal:manifest && webpack",
+    "ckeditor5:drupal:manifest": "node assets/vendor/ckeditor5/drupal/scripts/manifest.js",
+    "ckeditor5:build": "node assets/vendor/ckeditor5/scripts/build.js"
   },
   "devDependencies": {
     "@babel/core": "^7.0.0",
     "@babel/preset-env": "^7.0.0",
     "@babel/register": "^7.7.7",
+    "@ckeditor/ckeditor5-dev-utils": "^25.2.0",
     "@drupal/once": "^1.0.1",
     "@popperjs/core": "^2.9.2",
     "babel-plugin-add-header-comment": "^1.0.3",
@@ -44,6 +49,7 @@
     "cross-env": "^7.0.2",
     "cspell": "^4.0.63",
     "css.escape": "^1.5.1",
+    "dllCkeditor5": "https://github.com/ckeditor/ckeditor5.git#v29.2.0",
     "dotenv-safe": "^8.2.0",
     "es6-promise": "^4.2.8",
     "eslint": "^7.10.0",
@@ -76,6 +82,7 @@
     "postcss-pxtorem": "^5.1.1",
     "postcss-url": "^8.0.0",
     "prettier": "^2.1.2",
+    "raw-loader": "^4.0.2",
     "shepherd.js": "^8.3.1",
     "sortablejs": "^1.13.0",
     "stylelint": "^13.0.0",
@@ -84,7 +91,10 @@
     "stylelint-order": "^4.0.0",
     "tabbable": "^5.2.0",
     "terser": "^5.3.4",
-    "underscore": "^1.13.1"
+    "terser-webpack-plugin": "^5.2.0",
+    "underscore": "^1.13.1",
+    "webpack": "^5.51.1",
+    "webpack-cli": "^4.4.0"
   },
   "//": "'development is the default environment, and legacy is for transpiling the old jQuery codebase",
   "babel": {
diff --git a/core/scripts/dev/commit-code-check.sh b/core/scripts/dev/commit-code-check.sh
index bbeb3eb2d3..0b9bd97cee 100755
--- a/core/scripts/dev/commit-code-check.sh
+++ b/core/scripts/dev/commit-code-check.sh
@@ -293,7 +293,7 @@
     else
       # If there is no .es6.js file then there should be unless the .js is
       # not really Drupal's.
-      if ! [[ "$FILE" =~ ^core/assets/vendor ]] && ! [[ "$FILE" =~ ^core/scripts/js ]] && ! [[ "$FILE" =~ ^core/scripts/css ]] && ! [[ "$FILE" =~ core/postcss.config.js ]] && ! [[ -f "$TOP_LEVEL/$BASENAME.es6.js" ]]; then
+      if ! [[ "$FILE" =~ ^core/assets/vendor ]] && ! [[ "$FILE" =~ ^core/scripts/js ]] && ! [[ "$FILE" =~ ^core/scripts/css ]] && ! [[ "$FILE" =~ core/postcss.config.js ]] && ! [[ "$FILE" =~ core/webpack.config.js ]] && ! [[ -f "$TOP_LEVEL/$BASENAME.es6.js" ]] && ! [[ "$FILE" =~ core/modules/ckeditor5/tests/modules/ckeditor5_test/js/build/layercake.js ]]; then
         printf "${red}FAILURE${reset} $FILE does not have a corresponding $BASENAME.es6.js\n"
         STATUS=1
       fi
diff --git a/core/tests/Drupal/KernelTests/Core/Asset/ResolvedLibraryDefinitionsFilesMatchTest.php b/core/tests/Drupal/KernelTests/Core/Asset/ResolvedLibraryDefinitionsFilesMatchTest.php
index 32040acacc..bdab04e2e9 100644
--- a/core/tests/Drupal/KernelTests/Core/Asset/ResolvedLibraryDefinitionsFilesMatchTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Asset/ResolvedLibraryDefinitionsFilesMatchTest.php
@@ -74,6 +74,8 @@ class ResolvedLibraryDefinitionsFilesMatchTest extends KernelTestBase {
   protected $librariesToSkip = [
     // Locale has a "dummy" library that does not actually exist.
     'locale/translations',
+    // The "CKEditor 5 Dev tools" module has an external asset library.
+    'ckeditor5_dev/ckeditor5_dev',
   ];
 
   /**
diff --git a/core/webpack.config.js b/core/webpack.config.js
new file mode 100644
index 0000000000..37d4649bd3
--- /dev/null
+++ b/core/webpack.config.js
@@ -0,0 +1,58 @@
+const path = require('path');
+const fs = require('fs');
+const webpack = require('webpack');
+const { styles, builds } = require('@ckeditor/ckeditor5-dev-utils');
+const TerserPlugin = require('terser-webpack-plugin');
+
+function getDirectories(srcpath) {
+  return fs
+    .readdirSync(srcpath)
+    .filter((item) => fs.statSync(path.join(srcpath, item)).isDirectory());
+}
+
+module.exports = [];
+// Loop through every subdirectory in src, which should be a different
+// plugin, and build them all in ./build.
+getDirectories('assets/vendor/ckeditor5/drupal/src').forEach((dir) => {
+  const bc = {
+    mode: 'production',
+    optimization: {
+      minimize: true,
+      minimizer: [
+        new TerserPlugin({
+          terserOptions: {
+            format: {
+              comments: false,
+            },
+          },
+          test: /\.js(\?.*)?$/i,
+          extractComments: false,
+        }),
+      ],
+      moduleIds: 'named',
+    },
+    entry: {
+      path: path.resolve(__dirname, 'assets/vendor/ckeditor5/drupal/src', dir, 'src/index.js'),
+    },
+    output: {
+      path: path.resolve(__dirname, 'assets/vendor/ckeditor5/build/drupal'),
+      filename: `${dir}.js`,
+      library: ['CKEditor5', dir],
+      libraryTarget: 'umd',
+      libraryExport: 'default',
+    },
+    plugins: [
+      new webpack.BannerPlugin('cspell:disable'),
+      new webpack.DllReferencePlugin({
+        manifest: require('./node_modules/dllCkeditor5/build/ckeditor5-dll.manifest.json'), // eslint-disable-line global-require, import/no-unresolved
+        scope: 'ckeditor5/src',
+        name: 'CKEditor5.dll',
+      }),
+    ],
+    module: {
+      rules: [{ test: /\.svg$/, use: 'raw-loader' }],
+    },
+  };
+
+  module.exports.push(bc);
+});
diff --git a/core/yarn.lock b/core/yarn.lock
index cef6ce3705..ac123bde83 100644
--- a/core/yarn.lock
+++ b/core/yarn.lock
@@ -893,6 +893,585 @@
     "@babel/helper-validator-identifier" "^7.14.0"
     to-fast-properties "^2.0.0"
 
+"@ckeditor/ckeditor5-adapter-ckfinder@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-adapter-ckfinder/-/ckeditor5-adapter-ckfinder-29.2.0.tgz#7348dd4dd58e1856b517d0abb30c44dfb3351aee"
+  integrity sha512-u8udllfP3RhmA415ZPCqgNw94M0fT/URL4r82f4zgOLTtR/cvP3MBgJzYj6EMRm+MGb5889HYjz6AXCrGKn2eQ==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-alignment@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-alignment/-/ckeditor5-alignment-29.2.0.tgz#2ac19db6e4788498ad4fa9cfb60d5f2cd9c269d3"
+  integrity sha512-wfkIB3UtyZCSp4cEgclO7Cp3UH5ec/gqxVidKdrNox4KDnpHqK8xSQYcf+P/6ZXD1/rKy0APBK6qCtofTczJ/w==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-autoformat@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-autoformat/-/ckeditor5-autoformat-29.2.0.tgz#054d10a0208c9cd48a064924a6b3872621e640e6"
+  integrity sha512-dFy4jNqo/1Ikbo3CVwH30m0O5XyD0e0JkdQPjsrR7TY0/oV0AVHXv2UgKzDlScR9hWUstBE28w+O/1wnZaRESg==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-autosave@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-autosave/-/ckeditor5-autosave-29.2.0.tgz#b6bd594bcc9a73b330eccb8e5a1299f4ca0a5d42"
+  integrity sha512-MU8IB43Q89NHAye9JaPL8rkw3rXpQM50zVb5VSXiNF2ktMRhIEhkYbt5erZsp/bd4+okO2V/1/m28m8pEDHvog==
+  dependencies:
+    ckeditor5 "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-basic-styles@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-basic-styles/-/ckeditor5-basic-styles-29.2.0.tgz#917f4e151861c25630c6455722a5109604e3f39f"
+  integrity sha512-Sd5aj4Gd9HBEee/n+Gbd6km7RmsUMQAolrDHsSq3jXdb4tY98IF98scKkln7SyYJ/rF4NBadpCVLSMoE+17Qkw==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-block-quote@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-block-quote/-/ckeditor5-block-quote-29.2.0.tgz#9174ba7570f396cc6d7043cb1f25145ab45dcf69"
+  integrity sha512-W86EarJFvxmIjxiJdU/ReYzNCuAFPGksV10XF8nMr2Jd/DtVfOAqoN4GgLaE1cJ/ES0IL6fcs1kxUX+I8BMA+g==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-build-balloon-block@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-build-balloon-block/-/ckeditor5-build-balloon-block-29.2.0.tgz#189b416c2f1dddb32a7cbf91495ccd824ff6e691"
+  integrity sha512-sN1Og6ctRaH+jPqMN1xXpaTXzaGKd1PTkPjyYMC5eH+wl+bQKnV5BKSqNVqlzJpzjK8Lh6lkTWplw8QPE08J8g==
+  dependencies:
+    "@ckeditor/ckeditor5-adapter-ckfinder" "^29.2.0"
+    "@ckeditor/ckeditor5-autoformat" "^29.2.0"
+    "@ckeditor/ckeditor5-basic-styles" "^29.2.0"
+    "@ckeditor/ckeditor5-block-quote" "^29.2.0"
+    "@ckeditor/ckeditor5-ckfinder" "^29.2.0"
+    "@ckeditor/ckeditor5-cloud-services" "^29.2.0"
+    "@ckeditor/ckeditor5-easy-image" "^29.2.0"
+    "@ckeditor/ckeditor5-editor-balloon" "^29.2.0"
+    "@ckeditor/ckeditor5-essentials" "^29.2.0"
+    "@ckeditor/ckeditor5-heading" "^29.2.0"
+    "@ckeditor/ckeditor5-image" "^29.2.0"
+    "@ckeditor/ckeditor5-indent" "^29.2.0"
+    "@ckeditor/ckeditor5-link" "^29.2.0"
+    "@ckeditor/ckeditor5-list" "^29.2.0"
+    "@ckeditor/ckeditor5-media-embed" "^29.2.0"
+    "@ckeditor/ckeditor5-paragraph" "^29.2.0"
+    "@ckeditor/ckeditor5-paste-from-office" "^29.2.0"
+    "@ckeditor/ckeditor5-table" "^29.2.0"
+    "@ckeditor/ckeditor5-typing" "^29.2.0"
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+
+"@ckeditor/ckeditor5-build-balloon@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-build-balloon/-/ckeditor5-build-balloon-29.2.0.tgz#810b877b0771de442e6bd2f69872c4f2ab1f1594"
+  integrity sha512-4jJxBj2bo2MIL0YDt4kPOKl416atCbwLDsleKoJXSK4ihXG76fOErqt+ihdcnIq1lOC+33L87w+xNULfI9mjAw==
+  dependencies:
+    "@ckeditor/ckeditor5-adapter-ckfinder" "^29.2.0"
+    "@ckeditor/ckeditor5-autoformat" "^29.2.0"
+    "@ckeditor/ckeditor5-basic-styles" "^29.2.0"
+    "@ckeditor/ckeditor5-block-quote" "^29.2.0"
+    "@ckeditor/ckeditor5-ckfinder" "^29.2.0"
+    "@ckeditor/ckeditor5-cloud-services" "^29.2.0"
+    "@ckeditor/ckeditor5-easy-image" "^29.2.0"
+    "@ckeditor/ckeditor5-editor-balloon" "^29.2.0"
+    "@ckeditor/ckeditor5-essentials" "^29.2.0"
+    "@ckeditor/ckeditor5-heading" "^29.2.0"
+    "@ckeditor/ckeditor5-image" "^29.2.0"
+    "@ckeditor/ckeditor5-indent" "^29.2.0"
+    "@ckeditor/ckeditor5-link" "^29.2.0"
+    "@ckeditor/ckeditor5-list" "^29.2.0"
+    "@ckeditor/ckeditor5-media-embed" "^29.2.0"
+    "@ckeditor/ckeditor5-paragraph" "^29.2.0"
+    "@ckeditor/ckeditor5-paste-from-office" "^29.2.0"
+    "@ckeditor/ckeditor5-table" "^29.2.0"
+    "@ckeditor/ckeditor5-typing" "^29.2.0"
+
+"@ckeditor/ckeditor5-build-classic@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-build-classic/-/ckeditor5-build-classic-29.2.0.tgz#0fa4e51c1a70d3f2a2e188c07b8835c3ed0005f7"
+  integrity sha512-Hoysq4JxTpepfKknOklBwnjamOCLMhdRyKUT9j/slJzBbPgcxcJEooxD0iL8viBVJzXGHCVJltoNgNsQh4CaDQ==
+  dependencies:
+    "@ckeditor/ckeditor5-adapter-ckfinder" "^29.2.0"
+    "@ckeditor/ckeditor5-autoformat" "^29.2.0"
+    "@ckeditor/ckeditor5-basic-styles" "^29.2.0"
+    "@ckeditor/ckeditor5-block-quote" "^29.2.0"
+    "@ckeditor/ckeditor5-ckfinder" "^29.2.0"
+    "@ckeditor/ckeditor5-cloud-services" "^29.2.0"
+    "@ckeditor/ckeditor5-easy-image" "^29.2.0"
+    "@ckeditor/ckeditor5-editor-classic" "^29.2.0"
+    "@ckeditor/ckeditor5-essentials" "^29.2.0"
+    "@ckeditor/ckeditor5-heading" "^29.2.0"
+    "@ckeditor/ckeditor5-image" "^29.2.0"
+    "@ckeditor/ckeditor5-indent" "^29.2.0"
+    "@ckeditor/ckeditor5-link" "^29.2.0"
+    "@ckeditor/ckeditor5-list" "^29.2.0"
+    "@ckeditor/ckeditor5-media-embed" "^29.2.0"
+    "@ckeditor/ckeditor5-paragraph" "^29.2.0"
+    "@ckeditor/ckeditor5-paste-from-office" "^29.2.0"
+    "@ckeditor/ckeditor5-table" "^29.2.0"
+    "@ckeditor/ckeditor5-typing" "^29.2.0"
+
+"@ckeditor/ckeditor5-build-decoupled-document@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-build-decoupled-document/-/ckeditor5-build-decoupled-document-29.2.0.tgz#4a99322df76ec8a7da8efdaf1a87810ed96c741a"
+  integrity sha512-v6sWdEyHft1n2HJEr7XIAgdKLLoEiGQVovj3BGsX17cGiazIv7qf5O3mZS1CnL5Kfz/TyFpdit5yIjDhgl+uBw==
+  dependencies:
+    "@ckeditor/ckeditor5-adapter-ckfinder" "^29.2.0"
+    "@ckeditor/ckeditor5-alignment" "^29.2.0"
+    "@ckeditor/ckeditor5-autoformat" "^29.2.0"
+    "@ckeditor/ckeditor5-basic-styles" "^29.2.0"
+    "@ckeditor/ckeditor5-block-quote" "^29.2.0"
+    "@ckeditor/ckeditor5-ckfinder" "^29.2.0"
+    "@ckeditor/ckeditor5-cloud-services" "^29.2.0"
+    "@ckeditor/ckeditor5-easy-image" "^29.2.0"
+    "@ckeditor/ckeditor5-editor-decoupled" "^29.2.0"
+    "@ckeditor/ckeditor5-essentials" "^29.2.0"
+    "@ckeditor/ckeditor5-font" "^29.2.0"
+    "@ckeditor/ckeditor5-heading" "^29.2.0"
+    "@ckeditor/ckeditor5-image" "^29.2.0"
+    "@ckeditor/ckeditor5-indent" "^29.2.0"
+    "@ckeditor/ckeditor5-link" "^29.2.0"
+    "@ckeditor/ckeditor5-list" "^29.2.0"
+    "@ckeditor/ckeditor5-media-embed" "^29.2.0"
+    "@ckeditor/ckeditor5-paragraph" "^29.2.0"
+    "@ckeditor/ckeditor5-paste-from-office" "^29.2.0"
+    "@ckeditor/ckeditor5-table" "^29.2.0"
+    "@ckeditor/ckeditor5-typing" "^29.2.0"
+
+"@ckeditor/ckeditor5-build-inline@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-build-inline/-/ckeditor5-build-inline-29.2.0.tgz#e769aa44debc6fa8c07dadc95659ce06c9303ed2"
+  integrity sha512-YzVXYiuMaVP/zDH7AzPedQCloWVA6Ala72o/RGQ9Vc13rBABySHZDl/ZYeBLolk/BkRIydVXcDG/cI1VKxVMZA==
+  dependencies:
+    "@ckeditor/ckeditor5-adapter-ckfinder" "^29.2.0"
+    "@ckeditor/ckeditor5-autoformat" "^29.2.0"
+    "@ckeditor/ckeditor5-basic-styles" "^29.2.0"
+    "@ckeditor/ckeditor5-block-quote" "^29.2.0"
+    "@ckeditor/ckeditor5-ckfinder" "^29.2.0"
+    "@ckeditor/ckeditor5-cloud-services" "^29.2.0"
+    "@ckeditor/ckeditor5-easy-image" "^29.2.0"
+    "@ckeditor/ckeditor5-editor-inline" "^29.2.0"
+    "@ckeditor/ckeditor5-essentials" "^29.2.0"
+    "@ckeditor/ckeditor5-heading" "^29.2.0"
+    "@ckeditor/ckeditor5-image" "^29.2.0"
+    "@ckeditor/ckeditor5-indent" "^29.2.0"
+    "@ckeditor/ckeditor5-link" "^29.2.0"
+    "@ckeditor/ckeditor5-list" "^29.2.0"
+    "@ckeditor/ckeditor5-media-embed" "^29.2.0"
+    "@ckeditor/ckeditor5-paragraph" "^29.2.0"
+    "@ckeditor/ckeditor5-paste-from-office" "^29.2.0"
+    "@ckeditor/ckeditor5-table" "^29.2.0"
+    "@ckeditor/ckeditor5-typing" "^29.2.0"
+
+"@ckeditor/ckeditor5-ckfinder@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-ckfinder/-/ckeditor5-ckfinder-29.2.0.tgz#41bf1be7651ca47e77d11b6b5794cb355f02cb75"
+  integrity sha512-JXxLes9ztvUeqO/lsoxfkb6f9/NFlO8Hu0v+Flh3WfExcEhvQYTAJBLyWKzfAM8/+arlwMtxRPXJumV1xysWtQ==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-clipboard@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-29.2.0.tgz#c2a9d79713232fc1a311d98e63615227fa0e1e6a"
+  integrity sha512-LT0EKQI4SF/m4+1h27wxXi7F6ounVnKzVComdQM/1Ev8nGFP2fD3RSBGmOSfUAl3w1XCiJSqjIm/AUp7D15qig==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^29.2.0"
+    "@ckeditor/ckeditor5-engine" "^29.2.0"
+    "@ckeditor/ckeditor5-utils" "^29.2.0"
+    "@ckeditor/ckeditor5-widget" "^29.2.0"
+    lodash-es "^4.17.11"
+
+"@ckeditor/ckeditor5-cloud-services@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-cloud-services/-/ckeditor5-cloud-services-29.2.0.tgz#7157703f17c203a14e3338ae37eaaf9791ff4584"
+  integrity sha512-6KQv2UyhWBpVZKkWwi1CPpa9r9cMEEyLgqSfFtJMlmK7FApcHpNqtuGQbpLjOWXcN6AQuOM5l48iBhbS6xbMEQ==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-code-block@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-code-block/-/ckeditor5-code-block-29.2.0.tgz#9ddf0db854c6a27e8f59729bd7e10678c3c9a320"
+  integrity sha512-8xLWwe0Dt46JNzllT83DX4BuDzQlmTE/j326EALuIklXLAz+niCGlsFukXSabDvDt7mpe4mpRhfzc+btmHxMsQ==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-core@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-core/-/ckeditor5-core-29.2.0.tgz#3090e125e3f24ee5c7bcce15170b6f955efb86e0"
+  integrity sha512-uHLKkbVGRpDkx4y2MYfjfqh2sFrwsKVXwoZ5pflQ0biutwpoeGdwY9rLYeBMI8h8V37M97yVc9UBYSnuDAE5SA==
+  dependencies:
+    "@ckeditor/ckeditor5-engine" "^29.2.0"
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+    "@ckeditor/ckeditor5-utils" "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-dev-utils@^25.2.0", "@ckeditor/ckeditor5-dev-utils@^25.4.2":
+  version "25.4.2"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-dev-utils/-/ckeditor5-dev-utils-25.4.2.tgz#6c1fbe301dc4fd4fee0c20854c95b61534c2b19c"
+  integrity sha512-K79bVVbVhl7m3GCNr+Mlwou9wUBf8o/WBi/wzSdEZsGoTfoacsF3INX4iFG812LC5Zh3F18YW/EQjZ4okBfv4w==
+  dependencies:
+    "@ckeditor/ckeditor5-dev-webpack-plugin" "^25.4.2"
+    acorn "^6.2.1"
+    acorn-walk "^6.2.0"
+    chalk "^3.0.0"
+    cssnano "^4.0.0"
+    del "^5.0.0"
+    escodegen "^1.9.0"
+    fs-extra "^8.1.0"
+    javascript-stringify "^1.6.0"
+    pofile "^1.0.9"
+    postcss "^7.0.36"
+    postcss-import "^12.0.0"
+    postcss-loader "^3.0.0"
+    postcss-mixins "^6.2.0"
+    postcss-nesting "^7.0.0"
+    raw-loader "^4.0.1"
+    shelljs "^0.8.1"
+    style-loader "^1.2.1"
+    terser-webpack-plugin "^3.0.2"
+    through2 "^3.0.1"
+
+"@ckeditor/ckeditor5-dev-webpack-plugin@^25.4.2":
+  version "25.4.2"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-dev-webpack-plugin/-/ckeditor5-dev-webpack-plugin-25.4.2.tgz#e02b8f0ef49520ea989d91514efc5cac85b82010"
+  integrity sha512-A5y7xQ0nqZBSq0Sj0YENrDzH5+WPMQ1H2fIXrVOcLpAHdRknWgyw/eR5lHeeiYoMjggGkm6UR9AfmnO+BwsKSg==
+  dependencies:
+    "@ckeditor/ckeditor5-dev-utils" "^25.4.2"
+    chalk "^4.0.0"
+    rimraf "^3.0.2"
+    semver "^7.3.4"
+    webpack-sources "^2.0.1"
+
+"@ckeditor/ckeditor5-easy-image@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-easy-image/-/ckeditor5-easy-image-29.2.0.tgz#cc06f382008ebe2474d412929a842151fbd8fc4d"
+  integrity sha512-yYlZsWW3U6f6dbkbz6UFet9Kx9M5TpIteIwqsQOQ/tq3mnaeFq4vu1fRPtHdBfhNeLDHisQC5h2nbKnn2phseQ==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-editor-balloon@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-balloon/-/ckeditor5-editor-balloon-29.2.0.tgz#90eef17ad08231036ca47574bef074667def7022"
+  integrity sha512-SlxESKgOFJ6GOxNyWFJ8s7665qLxS4mfrzclFnNeT4Dp+QP5pI9nwGLZktA8sNshYdjxpFsXmE46OI/x7eZHHA==
+  dependencies:
+    ckeditor5 "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-editor-classic@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-29.2.0.tgz#b2578bfce7f49fc68c5cf28d997ffc1046cb842c"
+  integrity sha512-6XY9p+aY4K54pHigxaL6nJMJ4C9XXYOQmDORRrwyxsUuBKwCl5kA4VwVc8+fquCium/lt13pcV3t2BctIR3r0A==
+  dependencies:
+    ckeditor5 "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-editor-decoupled@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-decoupled/-/ckeditor5-editor-decoupled-29.2.0.tgz#47f70ac709e10b54b11730b1a890accb39f7a54a"
+  integrity sha512-ecQMElwKgCGLfFIgOmtoSoqF86UWfLDXFqL08qeNzBKNc+mxsudprLFcsMBIm31LZDBCfCmSIoYxHPKU1O6nag==
+  dependencies:
+    ckeditor5 "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-editor-inline@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-inline/-/ckeditor5-editor-inline-29.2.0.tgz#1df5d0f1360c87dd71d623d4a4f5fcdd1825d2ee"
+  integrity sha512-/YG9xIPd/cwA2pVh4wIruJumdInMT4h15ew6LzU+wa6T5qzYRObvxWf9wmzHAahhhJUAlCaNywLjLjqJLh6C+g==
+  dependencies:
+    ckeditor5 "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-engine@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-29.2.0.tgz#9aac280f0cc033e7b19a646cff556867b91d55fc"
+  integrity sha512-+YJ5xOpBdT2TsLMm29E9pev5ivQYmQq9GvoNXGGhDi+hbP9cV4itJPMjXKZsQpcitBtDwAwsKjwxi6G8TbKglA==
+  dependencies:
+    "@ckeditor/ckeditor5-utils" "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-enter@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-29.2.0.tgz#db04880600ece342ba55383daf116755df82833b"
+  integrity sha512-SSzUZ6iTI1Tymgvol/3HEdsOoMnu6GRl0wdBUizMBqP6SkCLU6t+Zdayz/aRNnU9slLXl0pJyz/aD9jR0N6gKg==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^29.2.0"
+    "@ckeditor/ckeditor5-engine" "^29.2.0"
+    "@ckeditor/ckeditor5-utils" "^29.2.0"
+
+"@ckeditor/ckeditor5-essentials@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-29.2.0.tgz#9984fac613f429a94608bb16957b16711718582f"
+  integrity sha512-uYuJEMV1ox7KnBUPxsUNNvM96EIXbj3CtU2g9FyPDGHxkjMiAMhluVAUUDHYgC0dbZtGUXM2/xx1u0Ux54K5MA==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-find-and-replace@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-find-and-replace/-/ckeditor5-find-and-replace-29.2.0.tgz#b8e1bb37b0b82e6901c193570254f8f59af6188c"
+  integrity sha512-Bl+LUUdqPD6LQz58gT3B3OQj0Fl81BKu9j4TLkHBAE6TFUkTIMeqTGCoWEsvLlj1eViHseWGiPfhsUssjCRMVg==
+  dependencies:
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+    "@ckeditor/ckeditor5-utils" "^29.2.0"
+    ckeditor5 "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-font@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-font/-/ckeditor5-font-29.2.0.tgz#1f73a0437fb8bd488a5d08e0ad3cf3cc1775d498"
+  integrity sha512-jN+kyOR3V1TRdglHeRhuNDipRlZyS7cFP8XL1qenfah7OLYZEntw6G/xiHTaR3QnG8nS6bRPMYp0XPMAJVT5QA==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-heading@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-heading/-/ckeditor5-heading-29.2.0.tgz#7db87ec874e637017aaf822ff75c8834d8506150"
+  integrity sha512-JWJYPwfi/46ekv83o/ckLs4oZFg+84bhOsjdSlSBVZcFeTLsxML7hVJFiUrl/p+clKLM4iM+Ao1K6AZDISPRXA==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-highlight@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-highlight/-/ckeditor5-highlight-29.2.0.tgz#77921826162f1212779c945b8db3f20a63676080"
+  integrity sha512-oMHAFsr8ek3SzUdPjp2cuDF73NAinBLL3BRsJQQ5X+gye1GTumLNIn2KqalqNFwWSLd0L7Ep9cNgWWdCBjZs1g==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-horizontal-line@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-horizontal-line/-/ckeditor5-horizontal-line-29.2.0.tgz#52c84f3f61a7fda79d860c57c040e5a635705716"
+  integrity sha512-Fv0DdUdT0JATgqpBBFKS15w3d7DT5kTLb9ZSVzdsRehySOM1brzOXtzaRhTo7RL4uKRsgadeWAg5s+iTRCPSGA==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-html-embed@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-html-embed/-/ckeditor5-html-embed-29.2.0.tgz#a0789d7c8f04fdb8b3c1fde95a56d39bf227b315"
+  integrity sha512-lucOnk28Zg7gDcXY9nW9S+4FUhZQ4E0jPW4X5BYlSD4Vvvs5W2I/OcjqWW7LzGOeNQ+px7hGwhoRsh7Ow1IoaQ==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-html-support@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-html-support/-/ckeditor5-html-support-29.2.0.tgz#9590736da0c6a6135d8aeae0882d5e31bd91ecfb"
+  integrity sha512-kPDUFLoQRUm+5YvSxswPoBaU8wl7nURGD4G8mIRVLCN7glTm2ri15OouStaMdQMqEatR8DcW/yzIcF9QfPNy/A==
+  dependencies:
+    ckeditor5 "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-image@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-image/-/ckeditor5-image-29.2.0.tgz#5b07f85b5870d6607f4a5244fde69dc8f430ffe2"
+  integrity sha512-TLjFSg5KMHGuDr0UXompW9DuuQUtvsxPXg8N75rrQUgPj9B8yXrX4wrLXBbvgSvS7BMSlBWYjAVGr3Wyn0IEgQ==
+  dependencies:
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+    ckeditor5 "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-indent@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-indent/-/ckeditor5-indent-29.2.0.tgz#5f303a3b9b5b9cef74d52c8dc7193943a97d8418"
+  integrity sha512-BX2nxSkvwNfIERUIbO9050eTbv+bnEYmKPnow22r2LftQp/Xl4PU7+Xuo5Ay1evh2ZakIGphPqBGnsZ3xvmZRw==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-language@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-language/-/ckeditor5-language-29.2.0.tgz#e15eb6640db9cc0c82de73814e6ec0dcd35976a5"
+  integrity sha512-Df65+qsUhd34gnyWJtfubNXiczhcfnTb9axb6G7yfsVvadnlIx27R7RcYNMQwGWOwSdCGGooJMlpyAAu2MZfmw==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-link@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-link/-/ckeditor5-link-29.2.0.tgz#2f951152ce9be5b90a7751d53f1de2a918f351a3"
+  integrity sha512-pgioEuY8q85J+fVVd8r4Giab4pjYZYs1zhcQkDrCXBDZkb4NlSKGEgc2TaR1nkuldTcQ1JXDlby7HVmUsS7PuQ==
+  dependencies:
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+    ckeditor5 "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-list@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-list/-/ckeditor5-list-29.2.0.tgz#feb8c52923f9276c3812c8779e109d6e288bba28"
+  integrity sha512-9cxHiXKJg827fUM3z5khIKO/7kSLSaXFNtEqP3JSPmm2bMqmUAf5VbSgApUWHgnzT6Yin/D1xKSgxQRkX/lbAg==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-markdown-gfm@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-markdown-gfm/-/ckeditor5-markdown-gfm-29.2.0.tgz#47ad86ecfe2234ee65431ff2c179b23d933a4d3a"
+  integrity sha512-kEq571z9bqBI2Jy/8CxPhNwwCH1rvSHOOvPNlrzcaP1U5z2NLYWSqM8mXOvDdWhU0tNyg3dnDlnz2HshX1xwbQ==
+  dependencies:
+    ckeditor5 "^29.2.0"
+    marked "1.1.1"
+    turndown "^6.0.0"
+    turndown-plugin-gfm "^1.0.2"
+
+"@ckeditor/ckeditor5-media-embed@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-media-embed/-/ckeditor5-media-embed-29.2.0.tgz#da85752948646acd553ddde7a152bee00ebb50f5"
+  integrity sha512-OijakFLlP90xKF4fAzdrsWpBAVyNz1DwWXr1NqKviAjaYMLJiRk4DUGxXDDUzXCPfcJx1d+jY9CcYlRWK7eS+A==
+  dependencies:
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-mention@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-mention/-/ckeditor5-mention-29.2.0.tgz#f5a8c395ca5b85e1f1afb0347494639a3139abde"
+  integrity sha512-7R3B75XUn+ubGNT2sXdXu8bRrrX4IXPK7sU2pzCgoci6OpALWmqCGDjUC5cuqibn0QnE6uOlWf7ROyUeWGyP9g==
+  dependencies:
+    ckeditor5 "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-page-break@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-page-break/-/ckeditor5-page-break-29.2.0.tgz#ca9f9be957f89bbaaa52d75e0dab42d690f3ee57"
+  integrity sha512-DDSbM+lXfQT1VP5CR9IuDN0xFuuancQdf0+NNOEDMJy1zfiwDkRvEGZY/HHVRb/W1QYZkEwnNmG+lv8I5Zk4/g==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-paragraph@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-29.2.0.tgz#ca2360e2deca45da48878d1cab68848f903bf711"
+  integrity sha512-SiitWURZBn08ZW3UGyaOqqThIHhMRew87PGVGUlYZH+xh9trTG9uxSYUBImX4W7K/m/zdgyL2u5akjWLV81y/g==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^29.2.0"
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+    "@ckeditor/ckeditor5-utils" "^29.2.0"
+
+"@ckeditor/ckeditor5-paste-from-office@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-paste-from-office/-/ckeditor5-paste-from-office-29.2.0.tgz#a8960c041f53edd4bf46b6a483170035943c5f94"
+  integrity sha512-c5WQaU/Tdi0cYb+8e6B9SYsOol8pklxL7vUbe1BgknbcIHEdJ+teV49DSIbwi2E4TkyDk1f4Sj1eo+00wOLVHQ==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-remove-format@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-remove-format/-/ckeditor5-remove-format-29.2.0.tgz#8a236009d8c02e94c520440e80df6faf12ca5ec2"
+  integrity sha512-5y7+hMw0c+T0Aj56Y8FXemaVGwoEty0QUot/x8n1I5yXNk9o20oTUvJAuEQFkvZdSmsDCne/Tny/BcvNU2xBQw==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-restricted-editing@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-restricted-editing/-/ckeditor5-restricted-editing-29.2.0.tgz#39846cc41bd59336952c2a2fdc02e1af68b60d4e"
+  integrity sha512-k3gDEYA+u/qhDaIvIkhWdCiNAj3sAjRe8229/CRvttsWPGmcDmvRAKAwTpgDt4pCcfx4UiXeoIZxa3Dttl+sbA==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-select-all@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-29.2.0.tgz#7d51326a820c139017b06fe0f9a8744949062d8d"
+  integrity sha512-GqUQKnNcuT2yQPiZMvOhX4k6bpFsSpUU8wPIt5m991fzO0KcCV42fYFElse9/kajiTn7X4RfybQxIw0abS2ttw==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^29.2.0"
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+    "@ckeditor/ckeditor5-utils" "^29.2.0"
+
+"@ckeditor/ckeditor5-source-editing@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-source-editing/-/ckeditor5-source-editing-29.2.0.tgz#1c7138218a87234e664591a4f7d4b61bec6b9d4a"
+  integrity sha512-Jc06rhAUXIjHWpfusnacVc4ZRLky4P4VB9Oyh6p4Nc1TRroSQ6lxin/VSL5oU+3iLFe3v/UzlhPcqtFobE0eeQ==
+  dependencies:
+    "@ckeditor/ckeditor5-theme-lark" "^29.2.0"
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-special-characters@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-special-characters/-/ckeditor5-special-characters-29.2.0.tgz#fdc624b94f1c4f17e2bb62a78c4ceb7a2b33a1f0"
+  integrity sha512-UGoEnKgcIODFPB7E6LJWwGLxJIUYGy3NKssfIROi+/1Nh6b9p0YaHVpec9ahYOuNwfXewHVb2W9lo7k+/E8LsQ==
+  dependencies:
+    ckeditor5 "^29.2.0"
+
+"@ckeditor/ckeditor5-table@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-table/-/ckeditor5-table-29.2.0.tgz#737e9e47f0ef862bb8d195f7785b56fffe8ee9c2"
+  integrity sha512-Cx6KA6Mz/47Qm/6U7o3K/POxh1BCzrDTHmLrp8JeQvDZRF3bL0vrRN9ftEWMjauTsLAFyJQUx5G2i188mcyuiw==
+  dependencies:
+    ckeditor5 "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-theme-lark@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-theme-lark/-/ckeditor5-theme-lark-29.2.0.tgz#4e49a0dc2b253806a57552ba5733e80d908a86e5"
+  integrity sha512-2anRz7vq7DgPJijsDnLeUcjMVomodje4dBeUq9wBkg4mhIbfFcA6lCOkkcyqTUZThiuimSjJcheVCBNFIBkpOA==
+  dependencies:
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+
+"@ckeditor/ckeditor5-typing@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-29.2.0.tgz#6c5859e424834b443dbb4d975f1f4f04242d4c78"
+  integrity sha512-Kb+GLR4SlIpvvDINLv+0GmPATlIAIqSHPcBwP7xQUQzhYGgJQXDTexcKI/Lx/mbgXE8mNz1QxUzUtB4od/6Wsw==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^29.2.0"
+    "@ckeditor/ckeditor5-engine" "^29.2.0"
+    "@ckeditor/ckeditor5-utils" "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-ui@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-29.2.0.tgz#8188ac4c237297b098f94660fb7e409da3cb267d"
+  integrity sha512-jxoXDF7QwFOG7OCifYX2yrNb2PNsBhrMnBSxtWGWjMS9c39QXTUBIuzTXcYPOAOVCxzTpZ+yNxuSmJ9eHe8jMg==
+  dependencies:
+    "@ckeditor/ckeditor5-utils" "^29.2.0"
+    ckeditor5 "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-undo@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-29.2.0.tgz#0e205984e81d78f672c118e83e61bd89e217d403"
+  integrity sha512-ADhs5qgou5jG/fW0tMzxeUwVuuNHUpqjLjM2rIjq6Gsb7RlpfhpmZxq6vEKMYfqc1C375fTGA+1kM7KInNU2Cw==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^29.2.0"
+    "@ckeditor/ckeditor5-engine" "^29.2.0"
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+
+"@ckeditor/ckeditor5-upload@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-29.2.0.tgz#7087be505ea9485c64ddfaae7fe20109609018b0"
+  integrity sha512-w7J1a3HaveOyBZHO4V/XODs2EsJNJkFJS75I3A3P82tBPb1T5gHOtZADQ4SI9kFnLo1CzLq6jU0YeSCwXETy3w==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^29.2.0"
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+    "@ckeditor/ckeditor5-utils" "^29.2.0"
+
+"@ckeditor/ckeditor5-utils@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-29.2.0.tgz#8707e2e7cc9a92a6841037d31f58fe1e0c65304e"
+  integrity sha512-aTbahSk2W7HTc4g9yggWCYpLcHkJ60mffFAXzt8TPeSDJ3obW/9DoDPz5gwLnCArmmuYFDJf9UOaTpEO6GwwAQ==
+  dependencies:
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-watchdog@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-29.2.0.tgz#b4cae2122af93a9030edd7c316fd767815d4c195"
+  integrity sha512-QuInmnJ5Dr93/j1YfoOL5yx2+vqdHkOFo4zFTXAATS9yCI4ov57eMNfWL1+iK9XzhzQu7UNZWv+QbymQ0bFPZQ==
+  dependencies:
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-widget@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-29.2.0.tgz#ebaf3e8ffc266f50afead3e0e1d1ad3d1998ebeb"
+  integrity sha512-DuxtXLhQ4jo5471aW9NidzNi/ZU0hIqQOa64Hg18NvLsdqw23mt/yMWgDrxBykygMRdyOQze7EubmhQDbZa95Q==
+  dependencies:
+    "@ckeditor/ckeditor5-core" "^29.2.0"
+    "@ckeditor/ckeditor5-engine" "^29.2.0"
+    "@ckeditor/ckeditor5-enter" "^29.2.0"
+    "@ckeditor/ckeditor5-typing" "^29.2.0"
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+    "@ckeditor/ckeditor5-utils" "^29.2.0"
+    lodash-es "^4.17.15"
+
+"@ckeditor/ckeditor5-word-count@^29.2.0":
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-word-count/-/ckeditor5-word-count-29.2.0.tgz#910848e7cb19d84c24d3e4f51c95c6e406b2b6ee"
+  integrity sha512-tUCoQMujjtRtt4YqTewTy74x5cuttAaK7K5EIrh4A7Fin5Olj6dc2hZU77JSEKkJ95OsHLKTTM3g7tzDVX2Jxw==
+  dependencies:
+    ckeditor5 "^29.2.0"
+    lodash-es "^4.17.15"
+
 "@cspell/dict-aws@^1.0.13":
   version "1.0.14"
   resolved "https://registry.yarnpkg.com/@cspell/dict-aws/-/dict-aws-1.0.14.tgz#beddede1053ce3622400e36c65da9fd2954e939d"
@@ -1063,6 +1642,11 @@
   resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
   integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==
 
+"@discoveryjs/json-ext@^0.5.0":
+  version "0.5.3"
+  resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d"
+  integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==
+
 "@drupal/once@^1.0.1":
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/@drupal/once/-/once-1.0.1.tgz#7c1ef480aec6d5fa4b5ae986afa5a607afc38482"
@@ -1083,6 +1667,19 @@
     minimatch "^3.0.4"
     strip-json-comments "^3.1.1"
 
+"@gar/promisify@^1.0.1":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210"
+  integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==
+
+"@mrmlnc/readdir-enhanced@^2.2.1":
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+  integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
+  dependencies:
+    call-me-maybe "^1.0.1"
+    glob-to-regexp "^0.3.0"
+
 "@nodelib/fs.scandir@2.1.4":
   version "2.1.4"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69"
@@ -1096,6 +1693,11 @@
   resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655"
   integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==
 
+"@nodelib/fs.stat@^1.1.2":
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
+  integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+
 "@nodelib/fs.walk@^1.2.3":
   version "1.2.6"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063"
@@ -1104,6 +1706,22 @@
     "@nodelib/fs.scandir" "2.1.4"
     fastq "^1.6.0"
 
+"@npmcli/fs@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f"
+  integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==
+  dependencies:
+    "@gar/promisify" "^1.0.1"
+    semver "^7.3.5"
+
+"@npmcli/move-file@^1.0.1":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674"
+  integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==
+  dependencies:
+    mkdirp "^1.0.4"
+    rimraf "^3.0.2"
+
 "@popperjs/core@^2.9.2":
   version "2.9.2"
   resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.2.tgz#adea7b6953cbb34651766b0548468e743c6a2353"
@@ -1134,6 +1752,40 @@
   resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
   integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
 
+"@types/eslint-scope@^3.7.0":
+  version "3.7.1"
+  resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e"
+  integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==
+  dependencies:
+    "@types/eslint" "*"
+    "@types/estree" "*"
+
+"@types/eslint@*":
+  version "7.28.0"
+  resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.0.tgz#7e41f2481d301c68e14f483fe10b017753ce8d5a"
+  integrity sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==
+  dependencies:
+    "@types/estree" "*"
+    "@types/json-schema" "*"
+
+"@types/estree@*", "@types/estree@^0.0.50":
+  version "0.0.50"
+  resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
+  integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==
+
+"@types/glob@^7.1.1":
+  version "7.1.4"
+  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672"
+  integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==
+  dependencies:
+    "@types/minimatch" "*"
+    "@types/node" "*"
+
+"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8":
+  version "7.0.9"
+  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
+  integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
+
 "@types/json5@^0.0.29":
   version "0.0.29"
   resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
@@ -1146,6 +1798,11 @@
   dependencies:
     "@types/unist" "*"
 
+"@types/minimatch@*":
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
+  integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
+
 "@types/minimist@^1.2.0":
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256"
@@ -1166,6 +1823,11 @@
   resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
   integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
 
+"@types/q@^1.5.1":
+  version "1.5.5"
+  resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df"
+  integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==
+
 "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2":
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e"
@@ -1178,16 +1840,202 @@
   dependencies:
     "@types/node" "*"
 
+"@webassemblyjs/ast@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
+  integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==
+  dependencies:
+    "@webassemblyjs/helper-numbers" "1.11.1"
+    "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+
+"@webassemblyjs/floating-point-hex-parser@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f"
+  integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==
+
+"@webassemblyjs/helper-api-error@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16"
+  integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==
+
+"@webassemblyjs/helper-buffer@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5"
+  integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==
+
+"@webassemblyjs/helper-numbers@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae"
+  integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==
+  dependencies:
+    "@webassemblyjs/floating-point-hex-parser" "1.11.1"
+    "@webassemblyjs/helper-api-error" "1.11.1"
+    "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/helper-wasm-bytecode@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1"
+  integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==
+
+"@webassemblyjs/helper-wasm-section@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a"
+  integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==
+  dependencies:
+    "@webassemblyjs/ast" "1.11.1"
+    "@webassemblyjs/helper-buffer" "1.11.1"
+    "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+    "@webassemblyjs/wasm-gen" "1.11.1"
+
+"@webassemblyjs/ieee754@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614"
+  integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==
+  dependencies:
+    "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5"
+  integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==
+  dependencies:
+    "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff"
+  integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==
+
+"@webassemblyjs/wasm-edit@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6"
+  integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==
+  dependencies:
+    "@webassemblyjs/ast" "1.11.1"
+    "@webassemblyjs/helper-buffer" "1.11.1"
+    "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+    "@webassemblyjs/helper-wasm-section" "1.11.1"
+    "@webassemblyjs/wasm-gen" "1.11.1"
+    "@webassemblyjs/wasm-opt" "1.11.1"
+    "@webassemblyjs/wasm-parser" "1.11.1"
+    "@webassemblyjs/wast-printer" "1.11.1"
+
+"@webassemblyjs/wasm-gen@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76"
+  integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==
+  dependencies:
+    "@webassemblyjs/ast" "1.11.1"
+    "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+    "@webassemblyjs/ieee754" "1.11.1"
+    "@webassemblyjs/leb128" "1.11.1"
+    "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wasm-opt@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2"
+  integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==
+  dependencies:
+    "@webassemblyjs/ast" "1.11.1"
+    "@webassemblyjs/helper-buffer" "1.11.1"
+    "@webassemblyjs/wasm-gen" "1.11.1"
+    "@webassemblyjs/wasm-parser" "1.11.1"
+
+"@webassemblyjs/wasm-parser@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199"
+  integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==
+  dependencies:
+    "@webassemblyjs/ast" "1.11.1"
+    "@webassemblyjs/helper-api-error" "1.11.1"
+    "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+    "@webassemblyjs/ieee754" "1.11.1"
+    "@webassemblyjs/leb128" "1.11.1"
+    "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wast-printer@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0"
+  integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==
+  dependencies:
+    "@webassemblyjs/ast" "1.11.1"
+    "@xtuc/long" "4.2.2"
+
+"@webpack-cli/configtest@^1.0.4":
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.4.tgz#f03ce6311c0883a83d04569e2c03c6238316d2aa"
+  integrity sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==
+
+"@webpack-cli/info@^1.3.0":
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.3.0.tgz#9d78a31101a960997a4acd41ffd9b9300627fe2b"
+  integrity sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==
+  dependencies:
+    envinfo "^7.7.3"
+
+"@webpack-cli/serve@^1.5.2":
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.5.2.tgz#ea584b637ff63c5a477f6f21604b5a205b72c9ec"
+  integrity sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==
+
+"@xtuc/ieee754@^1.2.0":
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+  integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+  integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+abab@^2.0.3, abab@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
+  integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==
+
+acorn-globals@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45"
+  integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==
+  dependencies:
+    acorn "^7.1.1"
+    acorn-walk "^7.1.1"
+
+acorn-import-assertions@^1.7.6:
+  version "1.7.6"
+  resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz#580e3ffcae6770eebeec76c3b9723201e9d01f78"
+  integrity sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==
+
 acorn-jsx@^5.3.1:
   version "5.3.1"
   resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
   integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==
 
-acorn@^7.4.0:
+acorn-walk@^6.2.0:
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
+  integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
+
+acorn-walk@^7.1.1:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
+  integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
+
+acorn@^6.2.1:
+  version "6.4.2"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6"
+  integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==
+
+acorn@^7.1.1, acorn@^7.4.0:
   version "7.4.1"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
   integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
 
+acorn@^8.2.4, acorn@^8.4.1:
+  version "8.4.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c"
+  integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==
+
 agent-base@6, agent-base@^6.0.0:
   version "6.0.2"
   resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
@@ -1203,7 +2051,17 @@ aggregate-error@^3.0.0:
     clean-stack "^2.0.0"
     indent-string "^4.0.0"
 
-ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4:
+ajv-errors@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
+  integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
+
+ajv-keywords@^3.1.0, ajv-keywords@^3.5.2:
+  version "3.5.2"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+  integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5:
   version "6.12.6"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
   integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -1223,6 +2081,11 @@ ajv@^8.0.1:
     require-from-string "^2.0.2"
     uri-js "^4.2.2"
 
+alphanum-sort@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+  integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
+
 ansi-colors@3.2.3:
   version "3.2.3"
   resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813"
@@ -1285,6 +2148,21 @@ aria-query@^4.2.2:
     "@babel/runtime" "^7.10.2"
     "@babel/runtime-corejs3" "^7.10.2"
 
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+  integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+  integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+  integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
 array-includes@^3.1.1, array-includes@^3.1.2, array-includes@^3.1.3:
   version "3.1.3"
   resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a"
@@ -1301,11 +2179,28 @@ array-timsort@^1.0.3:
   resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926"
   integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==
 
+array-union@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
+  dependencies:
+    array-uniq "^1.0.1"
+
 array-union@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
   integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
 
+array-uniq@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+  integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
+
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+  integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
 array.prototype.flat@^1.2.4:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123"
@@ -1352,6 +2247,11 @@ assertion-error@^1.1.0:
   resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
   integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
 
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+  integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
 ast-types-flow@^0.0.7:
   version "0.0.7"
   resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
@@ -1384,6 +2284,11 @@ at-least-node@^1.0.0:
   resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
   integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
 
+atob@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+  integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
 autoprefixer@^9.6.1, autoprefixer@^9.8.6:
   version "9.8.6"
   resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f"
@@ -1482,6 +2387,19 @@ balanced-match@^2.0.0:
   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9"
   integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==
 
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+  dependencies:
+    cache-base "^1.0.1"
+    class-utils "^0.3.5"
+    component-emitter "^1.2.1"
+    define-property "^1.0.0"
+    isobject "^3.0.1"
+    mixin-deep "^1.2.0"
+    pascalcase "^0.1.1"
+
 bcrypt-pbkdf@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
@@ -1489,6 +2407,11 @@ bcrypt-pbkdf@^1.0.0:
   dependencies:
     tweetnacl "^0.14.3"
 
+big.js@^5.2.2:
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+  integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
 binary-extensions@^2.0.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
@@ -1499,6 +2422,11 @@ bluebird@^3.5.0:
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
   integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
 
+boolbase@^1.0.0, boolbase@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+  integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
 brace-expansion@^1.1.7:
   version "1.1.11"
   resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -1507,6 +2435,22 @@ brace-expansion@^1.1.7:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
 
+braces@^2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+  integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+  dependencies:
+    arr-flatten "^1.1.0"
+    array-unique "^0.3.2"
+    extend-shallow "^2.0.1"
+    fill-range "^4.0.0"
+    isobject "^3.0.1"
+    repeat-element "^1.1.2"
+    snapdragon "^0.8.1"
+    snapdragon-node "^2.0.1"
+    split-string "^3.0.2"
+    to-regex "^3.0.1"
+
 braces@^3.0.1, braces@~3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
@@ -1514,11 +2458,27 @@ braces@^3.0.1, braces@~3.0.2:
   dependencies:
     fill-range "^7.0.1"
 
+browser-process-hrtime@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
+  integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
+
 browser-stdout@1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
   integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
 
+browserslist@^4.0.0:
+  version "4.16.8"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.8.tgz#cb868b0b554f137ba6e33de0ecff2eda403c4fb0"
+  integrity sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==
+  dependencies:
+    caniuse-lite "^1.0.30001251"
+    colorette "^1.3.0"
+    electron-to-chromium "^1.3.811"
+    escalade "^3.1.1"
+    node-releases "^1.1.75"
+
 browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.6.4:
   version "4.16.6"
   resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2"
@@ -1545,6 +2505,45 @@ bytes@3.1.0:
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
   integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
 
+cacache@^15.0.5:
+  version "15.3.0"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb"
+  integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==
+  dependencies:
+    "@npmcli/fs" "^1.0.0"
+    "@npmcli/move-file" "^1.0.1"
+    chownr "^2.0.0"
+    fs-minipass "^2.0.0"
+    glob "^7.1.4"
+    infer-owner "^1.0.4"
+    lru-cache "^6.0.0"
+    minipass "^3.1.1"
+    minipass-collect "^1.0.2"
+    minipass-flush "^1.0.5"
+    minipass-pipeline "^1.2.2"
+    mkdirp "^1.0.3"
+    p-map "^4.0.0"
+    promise-inflight "^1.0.1"
+    rimraf "^3.0.2"
+    ssri "^8.0.1"
+    tar "^6.0.2"
+    unique-filename "^1.1.1"
+
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+  dependencies:
+    collection-visit "^1.0.0"
+    component-emitter "^1.2.1"
+    get-value "^2.0.6"
+    has-value "^1.0.0"
+    isobject "^3.0.1"
+    set-value "^2.0.0"
+    to-object-path "^0.3.0"
+    union-value "^1.0.0"
+    unset-value "^1.0.0"
+
 call-bind@^1.0.0, call-bind@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
@@ -1553,11 +2552,40 @@ call-bind@^1.0.0, call-bind@^1.0.2:
     function-bind "^1.1.1"
     get-intrinsic "^1.0.2"
 
+call-me-maybe@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
+  integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
+
+caller-callsite@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
+  integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
+  dependencies:
+    callsites "^2.0.0"
+
+caller-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
+  integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
+  dependencies:
+    caller-callsite "^2.0.0"
+
+callsites@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+  integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
+
 callsites@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
   integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
 
+camelcase-css@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
+  integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
+
 camelcase-keys@^6.2.2:
   version "6.2.2"
   resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
@@ -1572,6 +2600,21 @@ camelcase@^5.0.0, camelcase@^5.3.1:
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
   integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
 
+caniuse-api@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
+  integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
+  dependencies:
+    browserslist "^4.0.0"
+    caniuse-lite "^1.0.0"
+    lodash.memoize "^4.1.2"
+    lodash.uniq "^4.5.0"
+
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001251:
+  version "1.0.30001252"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz#cb16e4e3dafe948fc4a9bb3307aea054b912019a"
+  integrity sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==
+
 caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219:
   version "1.0.30001228"
   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa"
@@ -1590,7 +2633,7 @@ chai-nightwatch@^0.4.0:
     assertion-error "1.0.0"
     deep-eql "0.1.3"
 
-chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2:
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
   integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -1645,6 +2688,16 @@ chokidar@^3.3.1:
   optionalDependencies:
     fsevents "~2.3.1"
 
+chownr@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+  integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+chrome-trace-event@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
+  integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
+
 chromedriver@^87.0.0:
   version "87.0.7"
   resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-87.0.7.tgz#74041e02ff7f633e91b98eb707e2476f713dc4ca"
@@ -1664,6 +2717,34 @@ ci-info@^2.0.0:
   resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
   integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
 
+ckeditor5@^29.2.0:
+  version "29.2.0"
+  resolved "https://registry.yarnpkg.com/ckeditor5/-/ckeditor5-29.2.0.tgz#5c23a475cd50553b2a586dad2818f4ab09818723"
+  integrity sha512-S0nNmgLbf/Z23bXeuKIe2KeTyWuz7Pt/SnQy13baqAGoBJblBFVG9fdylS7GxCaJmPqJE0dT4RN9rni0LvgGyg==
+  dependencies:
+    "@ckeditor/ckeditor5-clipboard" "^29.2.0"
+    "@ckeditor/ckeditor5-core" "^29.2.0"
+    "@ckeditor/ckeditor5-engine" "^29.2.0"
+    "@ckeditor/ckeditor5-enter" "^29.2.0"
+    "@ckeditor/ckeditor5-paragraph" "^29.2.0"
+    "@ckeditor/ckeditor5-select-all" "^29.2.0"
+    "@ckeditor/ckeditor5-typing" "^29.2.0"
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+    "@ckeditor/ckeditor5-undo" "^29.2.0"
+    "@ckeditor/ckeditor5-upload" "^29.2.0"
+    "@ckeditor/ckeditor5-utils" "^29.2.0"
+    "@ckeditor/ckeditor5-widget" "^29.2.0"
+
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+  dependencies:
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
+
 clean-stack@^2.0.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
@@ -1711,7 +2792,24 @@ clone@^1.0.2:
   resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
   integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
 
-color-convert@^1.9.0:
+coa@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
+  integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==
+  dependencies:
+    "@types/q" "^1.5.1"
+    chalk "^2.4.1"
+    q "^1.1.2"
+
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+  dependencies:
+    map-visit "^1.0.0"
+    object-visit "^1.0.0"
+
+color-convert@^1.9.0, color-convert@^1.9.3:
   version "1.9.3"
   resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
   integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
@@ -1730,17 +2828,38 @@ color-name@1.1.3:
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
   integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
 
-color-name@~1.1.4:
+color-name@^1.0.0, color-name@~1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
   integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
 
+color-string@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312"
+  integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==
+  dependencies:
+    color-name "^1.0.0"
+    simple-swizzle "^0.2.2"
+
+color@^3.0.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164"
+  integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==
+  dependencies:
+    color-convert "^1.9.3"
+    color-string "^1.6.0"
+
 colorette@^1.2.1, colorette@^1.2.2:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
   integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
 
-combined-stream@^1.0.6, combined-stream@~1.0.6:
+colorette@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af"
+  integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==
+
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
   version "1.0.8"
   resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
   integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
@@ -1773,6 +2892,11 @@ commondir@^1.0.1:
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
   integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
 
+component-emitter@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+  integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
 concat-map@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@@ -1810,6 +2934,11 @@ convert-source-map@^1.7.0:
   dependencies:
     safe-buffer "~5.1.1"
 
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+  integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
 core-js-compat@^3.9.0, core-js-compat@^3.9.1:
   version "3.12.1"
   resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.12.1.tgz#2c302c4708505fa7072b0adb5156d26f7801a18b"
@@ -1828,6 +2957,16 @@ core-util-is@1.0.2, core-util-is@^1.0.2, core-util-is@~1.0.0:
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
   integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
 
+cosmiconfig@^5.0.0:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
+  integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
+  dependencies:
+    import-fresh "^2.0.0"
+    is-directory "^0.3.1"
+    js-yaml "^3.13.1"
+    parse-json "^4.0.0"
+
 cosmiconfig@^7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3"
@@ -1846,7 +2985,7 @@ cross-env@^7.0.2:
   dependencies:
     cross-spawn "^7.0.1"
 
-cross-spawn@^7.0.1, cross-spawn@^7.0.2:
+cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
   version "7.0.3"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
   integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -1960,6 +3099,19 @@ css-blank-pseudo@^0.1.4:
   dependencies:
     postcss "^7.0.5"
 
+css-color-names@0.0.4, css-color-names@^0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+  integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+
+css-declaration-sorter@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
+  integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==
+  dependencies:
+    postcss "^7.0.1"
+    timsort "^0.3.0"
+
 css-has-pseudo@^0.10.0:
   version "0.10.0"
   resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee"
@@ -1975,6 +3127,42 @@ css-prefers-color-scheme@^3.1.1:
   dependencies:
     postcss "^7.0.5"
 
+css-select-base-adapter@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
+  integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
+
+css-select@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef"
+  integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==
+  dependencies:
+    boolbase "^1.0.0"
+    css-what "^3.2.1"
+    domutils "^1.7.0"
+    nth-check "^1.0.2"
+
+css-tree@1.0.0-alpha.37:
+  version "1.0.0-alpha.37"
+  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22"
+  integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==
+  dependencies:
+    mdn-data "2.0.4"
+    source-map "^0.6.1"
+
+css-tree@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d"
+  integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
+  dependencies:
+    mdn-data "2.0.14"
+    source-map "^0.6.1"
+
+css-what@^3.2.1:
+  version "3.4.2"
+  resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4"
+  integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==
+
 css.escape@^1.5.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb"
@@ -1995,6 +3183,98 @@ cssesc@^3.0.0:
   resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
   integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
 
+cssnano-preset-default@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff"
+  integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==
+  dependencies:
+    css-declaration-sorter "^4.0.1"
+    cssnano-util-raw-cache "^4.0.1"
+    postcss "^7.0.0"
+    postcss-calc "^7.0.1"
+    postcss-colormin "^4.0.3"
+    postcss-convert-values "^4.0.1"
+    postcss-discard-comments "^4.0.2"
+    postcss-discard-duplicates "^4.0.2"
+    postcss-discard-empty "^4.0.1"
+    postcss-discard-overridden "^4.0.1"
+    postcss-merge-longhand "^4.0.11"
+    postcss-merge-rules "^4.0.3"
+    postcss-minify-font-values "^4.0.2"
+    postcss-minify-gradients "^4.0.2"
+    postcss-minify-params "^4.0.2"
+    postcss-minify-selectors "^4.0.2"
+    postcss-normalize-charset "^4.0.1"
+    postcss-normalize-display-values "^4.0.2"
+    postcss-normalize-positions "^4.0.2"
+    postcss-normalize-repeat-style "^4.0.2"
+    postcss-normalize-string "^4.0.2"
+    postcss-normalize-timing-functions "^4.0.2"
+    postcss-normalize-unicode "^4.0.1"
+    postcss-normalize-url "^4.0.1"
+    postcss-normalize-whitespace "^4.0.2"
+    postcss-ordered-values "^4.1.2"
+    postcss-reduce-initial "^4.0.3"
+    postcss-reduce-transforms "^4.0.2"
+    postcss-svgo "^4.0.3"
+    postcss-unique-selectors "^4.0.1"
+
+cssnano-util-get-arguments@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
+  integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=
+
+cssnano-util-get-match@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
+  integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=
+
+cssnano-util-raw-cache@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
+  integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==
+  dependencies:
+    postcss "^7.0.0"
+
+cssnano-util-same-parent@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
+  integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==
+
+cssnano@^4.0.0:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99"
+  integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==
+  dependencies:
+    cosmiconfig "^5.0.0"
+    cssnano-preset-default "^4.0.8"
+    is-resolvable "^1.0.0"
+    postcss "^7.0.0"
+
+csso@^4.0.2:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529"
+  integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
+  dependencies:
+    css-tree "^1.1.2"
+
+cssom@^0.4.4:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
+  integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
+
+cssom@~0.3.6:
+  version "0.3.8"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
+  integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
+
+cssstyle@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852"
+  integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==
+  dependencies:
+    cssom "~0.3.6"
+
 cuint@^0.2.2:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
@@ -2017,6 +3297,15 @@ data-uri-to-buffer@3:
   resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636"
   integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==
 
+data-urls@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
+  integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==
+  dependencies:
+    abab "^2.0.3"
+    whatwg-mimetype "^2.3.0"
+    whatwg-url "^8.0.0"
+
 debug@3.2.6:
   version "3.2.6"
   resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
@@ -2031,7 +3320,7 @@ debug@4, debug@4.3.1, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, de
   dependencies:
     ms "2.1.2"
 
-debug@^2.6.9:
+debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
   version "2.6.9"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
   integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
@@ -2058,6 +3347,16 @@ decamelize@^1.1.0, decamelize@^1.2.0:
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
   integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
 
+decimal.js@^10.2.1:
+  version "10.3.1"
+  resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
+  integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
+
+decode-uri-component@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+  integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
 deep-eql@0.1.3:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2"
@@ -2089,6 +3388,28 @@ define-properties@^1.1.2, define-properties@^1.1.3:
   dependencies:
     object-keys "^1.0.12"
 
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+  dependencies:
+    is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+  dependencies:
+    is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+  dependencies:
+    is-descriptor "^1.0.2"
+    isobject "^3.0.1"
+
 degenerator@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-2.2.0.tgz#49e98c11fa0293c5b26edfbb52f15729afcdb254"
@@ -2098,6 +3419,20 @@ degenerator@^2.2.0:
     escodegen "^1.8.1"
     esprima "^4.0.0"
 
+del@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7"
+  integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==
+  dependencies:
+    globby "^10.0.1"
+    graceful-fs "^4.2.2"
+    is-glob "^4.0.1"
+    is-path-cwd "^2.2.0"
+    is-path-inside "^3.0.1"
+    p-map "^3.0.0"
+    rimraf "^3.0.0"
+    slash "^3.0.0"
+
 del@^6.0.0:
   version "6.0.0"
   resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952"
@@ -2127,6 +3462,14 @@ diff@3.5.0:
   resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
   integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
 
+dir-glob@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034"
+  integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==
+  dependencies:
+    arrify "^1.0.1"
+    path-type "^3.0.0"
+
 dir-glob@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@@ -2134,6 +3477,68 @@ dir-glob@^3.0.1:
   dependencies:
     path-type "^4.0.0"
 
+"dllCkeditor5@https://github.com/ckeditor/ckeditor5.git#v29.2.0":
+  version "29.2.0"
+  resolved "https://github.com/ckeditor/ckeditor5.git#8472932fcdbf41a5917a4d6b95661866ea8412e2"
+  dependencies:
+    "@ckeditor/ckeditor5-adapter-ckfinder" "^29.2.0"
+    "@ckeditor/ckeditor5-alignment" "^29.2.0"
+    "@ckeditor/ckeditor5-autoformat" "^29.2.0"
+    "@ckeditor/ckeditor5-autosave" "^29.2.0"
+    "@ckeditor/ckeditor5-basic-styles" "^29.2.0"
+    "@ckeditor/ckeditor5-block-quote" "^29.2.0"
+    "@ckeditor/ckeditor5-build-balloon" "^29.2.0"
+    "@ckeditor/ckeditor5-build-balloon-block" "^29.2.0"
+    "@ckeditor/ckeditor5-build-classic" "^29.2.0"
+    "@ckeditor/ckeditor5-build-decoupled-document" "^29.2.0"
+    "@ckeditor/ckeditor5-build-inline" "^29.2.0"
+    "@ckeditor/ckeditor5-ckfinder" "^29.2.0"
+    "@ckeditor/ckeditor5-clipboard" "^29.2.0"
+    "@ckeditor/ckeditor5-cloud-services" "^29.2.0"
+    "@ckeditor/ckeditor5-code-block" "^29.2.0"
+    "@ckeditor/ckeditor5-core" "^29.2.0"
+    "@ckeditor/ckeditor5-easy-image" "^29.2.0"
+    "@ckeditor/ckeditor5-editor-balloon" "^29.2.0"
+    "@ckeditor/ckeditor5-editor-classic" "^29.2.0"
+    "@ckeditor/ckeditor5-editor-decoupled" "^29.2.0"
+    "@ckeditor/ckeditor5-editor-inline" "^29.2.0"
+    "@ckeditor/ckeditor5-engine" "^29.2.0"
+    "@ckeditor/ckeditor5-enter" "^29.2.0"
+    "@ckeditor/ckeditor5-essentials" "^29.2.0"
+    "@ckeditor/ckeditor5-find-and-replace" "^29.2.0"
+    "@ckeditor/ckeditor5-font" "^29.2.0"
+    "@ckeditor/ckeditor5-heading" "^29.2.0"
+    "@ckeditor/ckeditor5-highlight" "^29.2.0"
+    "@ckeditor/ckeditor5-horizontal-line" "^29.2.0"
+    "@ckeditor/ckeditor5-html-embed" "^29.2.0"
+    "@ckeditor/ckeditor5-html-support" "^29.2.0"
+    "@ckeditor/ckeditor5-image" "^29.2.0"
+    "@ckeditor/ckeditor5-indent" "^29.2.0"
+    "@ckeditor/ckeditor5-language" "^29.2.0"
+    "@ckeditor/ckeditor5-link" "^29.2.0"
+    "@ckeditor/ckeditor5-list" "^29.2.0"
+    "@ckeditor/ckeditor5-markdown-gfm" "^29.2.0"
+    "@ckeditor/ckeditor5-media-embed" "^29.2.0"
+    "@ckeditor/ckeditor5-mention" "^29.2.0"
+    "@ckeditor/ckeditor5-page-break" "^29.2.0"
+    "@ckeditor/ckeditor5-paragraph" "^29.2.0"
+    "@ckeditor/ckeditor5-paste-from-office" "^29.2.0"
+    "@ckeditor/ckeditor5-remove-format" "^29.2.0"
+    "@ckeditor/ckeditor5-restricted-editing" "^29.2.0"
+    "@ckeditor/ckeditor5-select-all" "^29.2.0"
+    "@ckeditor/ckeditor5-source-editing" "^29.2.0"
+    "@ckeditor/ckeditor5-special-characters" "^29.2.0"
+    "@ckeditor/ckeditor5-table" "^29.2.0"
+    "@ckeditor/ckeditor5-theme-lark" "^29.2.0"
+    "@ckeditor/ckeditor5-typing" "^29.2.0"
+    "@ckeditor/ckeditor5-ui" "^29.2.0"
+    "@ckeditor/ckeditor5-undo" "^29.2.0"
+    "@ckeditor/ckeditor5-upload" "^29.2.0"
+    "@ckeditor/ckeditor5-utils" "^29.2.0"
+    "@ckeditor/ckeditor5-watchdog" "^29.2.0"
+    "@ckeditor/ckeditor5-widget" "^29.2.0"
+    "@ckeditor/ckeditor5-word-count" "^29.2.0"
+
 doctrine@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
@@ -2166,6 +3571,13 @@ domelementtype@^2.0.1:
   resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
   integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
 
+domexception@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
+  integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
+  dependencies:
+    webidl-conversions "^5.0.0"
+
 domhandler@^2.3.0:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
@@ -2173,7 +3585,7 @@ domhandler@^2.3.0:
   dependencies:
     domelementtype "1"
 
-domutils@^1.5.1:
+domutils@^1.5.1, domutils@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
   integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
@@ -2225,6 +3637,11 @@ electron-to-chromium@^1.3.723:
   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.728.tgz#dbedd6373f595ae10a13d146b66bece4c1afa5bd"
   integrity sha512-SHv4ziXruBpb1Nz4aTuqEHBYi/9GNCJMYIJgDEXrp/2V01nFXMNFUTli5Z85f5ivSkioLilQatqBYFB44wNJrA==
 
+electron-to-chromium@^1.3.811:
+  version "1.3.829"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.829.tgz#efd360b594824fcd84e24c6eb0c8e41e2a44fbc7"
+  integrity sha512-5EXDbvsaLRxS1UOfRr8Hymp3dR42bvBNPgzVuPwUFj3v66bpvDUcNwwUywQUQYn/scz26/3Sgd3fNVGQOlVwvQ==
+
 emoji-regex@^7.0.1:
   version "7.0.3"
   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
@@ -2240,6 +3657,11 @@ emoji-regex@^9.0.0:
   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
   integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
 
+emojis-list@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+  integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
 end-of-stream@^1.1.0:
   version "1.4.4"
   resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
@@ -2247,6 +3669,14 @@ end-of-stream@^1.1.0:
   dependencies:
     once "^1.4.0"
 
+enhanced-resolve@^5.8.0:
+  version "5.8.2"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b"
+  integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==
+  dependencies:
+    graceful-fs "^4.2.4"
+    tapable "^2.2.0"
+
 enquirer@^2.3.5:
   version "2.3.6"
   resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
@@ -2264,7 +3694,7 @@ entities@^2.0.0:
   resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
   integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
 
-envinfo@^7.5.1:
+envinfo@^7.5.1, envinfo@^7.7.3:
   version "7.8.1"
   resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
   integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
@@ -2276,6 +3706,29 @@ error-ex@^1.3.1:
   dependencies:
     is-arrayish "^0.2.1"
 
+es-abstract@^1.17.2, es-abstract@^1.18.2:
+  version "1.18.5"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.5.tgz#9b10de7d4c206a3581fd5b2124233e04db49ae19"
+  integrity sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==
+  dependencies:
+    call-bind "^1.0.2"
+    es-to-primitive "^1.2.1"
+    function-bind "^1.1.1"
+    get-intrinsic "^1.1.1"
+    has "^1.0.3"
+    has-symbols "^1.0.2"
+    internal-slot "^1.0.3"
+    is-callable "^1.2.3"
+    is-negative-zero "^2.0.1"
+    is-regex "^1.1.3"
+    is-string "^1.0.6"
+    object-inspect "^1.11.0"
+    object-keys "^1.1.1"
+    object.assign "^4.1.2"
+    string.prototype.trimend "^1.0.4"
+    string.prototype.trimstart "^1.0.4"
+    unbox-primitive "^1.0.1"
+
 es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2:
   version "1.18.0"
   resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4"
@@ -2298,6 +3751,11 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2:
     string.prototype.trimstart "^1.0.4"
     unbox-primitive "^1.0.0"
 
+es-module-lexer@^0.7.1:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.7.1.tgz#c2c8e0f46f2df06274cdaf0dd3f3b33e0a0b267d"
+  integrity sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==
+
 es-to-primitive@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
@@ -2322,7 +3780,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5:
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
   integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
 
-escodegen@^1.8.1:
+escodegen@^1.8.1, escodegen@^1.9.0:
   version "1.14.3"
   resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
   integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==
@@ -2334,6 +3792,18 @@ escodegen@^1.8.1:
   optionalDependencies:
     source-map "~0.6.1"
 
+escodegen@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd"
+  integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==
+  dependencies:
+    esprima "^4.0.1"
+    estraverse "^5.2.0"
+    esutils "^2.0.2"
+    optionator "^0.8.1"
+  optionalDependencies:
+    source-map "~0.6.1"
+
 eslint-config-airbnb-base@^14.2.1:
   version "14.2.1"
   resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e"
@@ -2459,7 +3929,7 @@ eslint-plugin-yml@^0.10.0:
     natural-compare "^1.4.0"
     yaml-eslint-parser "^0.4.0"
 
-eslint-scope@^5.1.1:
+eslint-scope@5.1.1, eslint-scope@^5.1.1:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
   integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -2570,6 +4040,26 @@ esutils@^2.0.2:
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
   integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
 
+events@^3.2.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+  integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+execa@^5.0.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+  integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+  dependencies:
+    cross-spawn "^7.0.3"
+    get-stream "^6.0.0"
+    human-signals "^2.1.0"
+    is-stream "^2.0.0"
+    merge-stream "^2.0.0"
+    npm-run-path "^4.0.1"
+    onetime "^5.1.2"
+    signal-exit "^3.0.3"
+    strip-final-newline "^2.0.0"
+
 execall@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45"
@@ -2577,11 +4067,53 @@ execall@^2.0.0:
   dependencies:
     clone-regexp "^2.1.0"
 
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+  dependencies:
+    debug "^2.3.3"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    posix-character-classes "^0.1.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+  dependencies:
+    is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+  dependencies:
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
+
 extend@^3.0.0, extend@~3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
   integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
 
+extglob@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+  dependencies:
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    expand-brackets "^2.1.4"
+    extend-shallow "^2.0.1"
+    fragment-cache "^0.2.1"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
 extract-zip@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
@@ -2617,6 +4149,29 @@ fast-diff@^1.1.2:
   resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
   integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
 
+fast-glob@^2.0.2:
+  version "2.2.7"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
+  integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==
+  dependencies:
+    "@mrmlnc/readdir-enhanced" "^2.2.1"
+    "@nodelib/fs.stat" "^1.1.2"
+    glob-parent "^3.1.0"
+    is-glob "^4.0.0"
+    merge2 "^1.2.3"
+    micromatch "^3.1.10"
+
+fast-glob@^3.0.3:
+  version "3.2.7"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
+  integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
+  dependencies:
+    "@nodelib/fs.stat" "^2.0.2"
+    "@nodelib/fs.walk" "^1.2.3"
+    glob-parent "^5.1.2"
+    merge2 "^1.3.0"
+    micromatch "^4.0.4"
+
 fast-glob@^3.1.1, fast-glob@^3.2.5:
   version "3.2.5"
   resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661"
@@ -2677,6 +4232,16 @@ filelist@^1.0.1:
   dependencies:
     minimatch "^3.0.4"
 
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
+
 fill-range@^7.0.1:
   version "7.0.1"
   resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
@@ -2693,6 +4258,15 @@ find-cache-dir@^2.0.0:
     make-dir "^2.0.0"
     pkg-dir "^3.0.0"
 
+find-cache-dir@^3.3.1:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
+  integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^3.0.2"
+    pkg-dir "^4.1.0"
+
 find-up@3.0.0, find-up@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
@@ -2707,7 +4281,7 @@ find-up@^2.0.0, find-up@^2.1.0:
   dependencies:
     locate-path "^2.0.0"
 
-find-up@^4.1.0:
+find-up@^4.0.0, find-up@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
   integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
@@ -2745,11 +4319,25 @@ follow-redirects@^1.10.0:
   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
   integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
 
+for-in@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+  integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
 forever-agent@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
   integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
 
+form-data@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+  integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.8"
+    mime-types "^2.1.12"
+
 form-data@~2.3.2:
   version "2.3.3"
   resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
@@ -2759,6 +4347,13 @@ form-data@~2.3.2:
     combined-stream "^1.0.6"
     mime-types "^2.1.12"
 
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+  dependencies:
+    map-cache "^0.2.2"
+
 fs-extra@^8.1.0:
   version "8.1.0"
   resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
@@ -2778,6 +4373,13 @@ fs-extra@^9.1.0:
     jsonfile "^6.0.1"
     universalify "^2.0.0"
 
+fs-minipass@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+  integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+  dependencies:
+    minipass "^3.0.0"
+
 fs.realpath@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@@ -2847,6 +4449,11 @@ get-stream@^5.1.0:
   dependencies:
     pump "^3.0.0"
 
+get-stream@^6.0.0:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+  integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
 get-uri@3:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c"
@@ -2859,6 +4466,11 @@ get-uri@3:
     fs-extra "^8.1.0"
     ftp "^0.3.10"
 
+get-value@^2.0.3, get-value@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+  integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
 getpass@^0.1.1:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
@@ -2866,13 +4478,31 @@ getpass@^0.1.1:
   dependencies:
     assert-plus "^1.0.0"
 
-glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0:
+glob-parent@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
+  dependencies:
+    is-glob "^3.1.0"
+    path-dirname "^1.0.0"
+
+glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.0:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
   integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
   dependencies:
     is-glob "^4.0.1"
 
+glob-to-regexp@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+  integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
+
+glob-to-regexp@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
+  integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
+
 glob@7.1.3:
   version "7.1.3"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
@@ -2885,7 +4515,7 @@ glob@7.1.3:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-glob@^7.1.2, glob@^7.1.3, glob@^7.1.6:
+glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
   version "7.1.7"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
   integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
@@ -2939,6 +4569,20 @@ globals@^13.6.0:
   dependencies:
     type-fest "^0.20.2"
 
+globby@^10.0.1:
+  version "10.0.2"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543"
+  integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==
+  dependencies:
+    "@types/glob" "^7.1.1"
+    array-union "^2.1.0"
+    dir-glob "^3.0.1"
+    fast-glob "^3.0.3"
+    glob "^7.1.3"
+    ignore "^5.1.1"
+    merge2 "^1.2.3"
+    slash "^3.0.0"
+
 globby@^11.0.1, globby@^11.0.3:
   version "11.0.3"
   resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb"
@@ -2951,6 +4595,19 @@ globby@^11.0.1, globby@^11.0.3:
     merge2 "^1.3.0"
     slash "^3.0.0"
 
+globby@^8.0.1:
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d"
+  integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==
+  dependencies:
+    array-union "^1.0.1"
+    dir-glob "2.0.0"
+    fast-glob "^2.0.2"
+    glob "^7.1.2"
+    ignore "^3.3.5"
+    pify "^3.0.0"
+    slash "^1.0.0"
+
 globjoin@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
@@ -2968,6 +4625,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
   integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
 
+graceful-fs@^4.2.2:
+  version "4.2.8"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
+  integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
+
 growl@1.10.5:
   version "1.10.5"
   resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
@@ -3016,7 +4678,45 @@ has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2:
   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
   integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
 
-has@^1.0.3:
+has-tostringtag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+  integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+  dependencies:
+    has-symbols "^1.0.2"
+
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+  dependencies:
+    get-value "^2.0.3"
+    has-values "^0.1.4"
+    isobject "^2.0.0"
+
+has-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+  dependencies:
+    get-value "^2.0.6"
+    has-values "^1.0.0"
+    isobject "^3.0.0"
+
+has-values@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+  integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+has@^1.0.0, has@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
   integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
@@ -3028,6 +4728,11 @@ he@1.2.0:
   resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
   integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
 
+hex-color-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+  integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+
 hosted-git-info@^2.1.4:
   version "2.8.9"
   resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
@@ -3040,6 +4745,23 @@ hosted-git-info@^4.0.1:
   dependencies:
     lru-cache "^6.0.0"
 
+hsl-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
+  integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
+
+hsla-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
+  integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
+
+html-encoding-sniffer@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
+  integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==
+  dependencies:
+    whatwg-encoding "^1.0.5"
+
 html-tags@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
@@ -3094,6 +4816,11 @@ https-proxy-agent@5, https-proxy-agent@^5.0.0:
     agent-base "6"
     debug "4"
 
+human-signals@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+  integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
 iconv-lite@0.4.24:
   version "0.4.24"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -3108,16 +4835,36 @@ iconv-lite@^0.6.2:
   dependencies:
     safer-buffer ">= 2.1.2 < 3.0.0"
 
+ignore@^3.3.5:
+  version "3.3.10"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
+  integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
+
 ignore@^4.0.6:
   version "4.0.6"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
-ignore@^5.1.4, ignore@^5.1.8:
+ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8:
   version "5.1.8"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
   integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
 
+import-cwd@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
+  integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=
+  dependencies:
+    import-from "^2.1.0"
+
+import-fresh@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
+  integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
+  dependencies:
+    caller-path "^2.0.0"
+    resolve-from "^3.0.0"
+
 import-fresh@^3.0.0, import-fresh@^3.2.1:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@@ -3126,11 +4873,26 @@ import-fresh@^3.0.0, import-fresh@^3.2.1:
     parent-module "^1.0.0"
     resolve-from "^4.0.0"
 
+import-from@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
+  integrity sha1-M1238qev/VOqpHHUuAId7ja387E=
+  dependencies:
+    resolve-from "^3.0.0"
+
 import-lazy@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153"
   integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==
 
+import-local@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6"
+  integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==
+  dependencies:
+    pkg-dir "^4.2.0"
+    resolve-cwd "^3.0.0"
+
 imurmurhash@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
@@ -3146,6 +4908,11 @@ indexes-of@^1.0.1:
   resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
   integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
 
+infer-owner@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+  integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
+
 inflight@^1.0.4:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@@ -3154,7 +4921,7 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -3173,6 +4940,16 @@ internal-slot@^1.0.3:
     has "^1.0.3"
     side-channel "^1.0.4"
 
+interpret@^1.0.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
+  integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
+
+interpret@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
+  integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
+
 ip-regex@^4.1.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5"
@@ -3183,6 +4960,25 @@ ip@^1.1.5:
   resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
   integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
 
+is-absolute-url@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+  integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
+
+is-accessor-descriptor@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+  integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+  dependencies:
+    kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+  integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+  dependencies:
+    kind-of "^6.0.0"
+
 is-alphabetical@^1.0.0:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
@@ -3201,6 +4997,11 @@ is-arrayish@^0.2.1:
   resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
   integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
 
+is-arrayish@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+  integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
 is-bigint@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a"
@@ -3220,6 +5021,11 @@ is-boolean-object@^1.1.0:
   dependencies:
     call-bind "^1.0.2"
 
+is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+  integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
 is-buffer@^2.0.0, is-buffer@~2.0.3:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
@@ -3230,6 +5036,18 @@ is-callable@^1.1.4, is-callable@^1.2.3:
   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e"
   integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==
 
+is-color-stop@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
+  integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
+  dependencies:
+    css-color-names "^0.0.4"
+    hex-color-regex "^1.1.0"
+    hsl-regex "^1.0.0"
+    hsla-regex "^1.0.0"
+    rgb-regex "^1.0.1"
+    rgba-regex "^1.0.0"
+
 is-core-module@^2.2.0, is-core-module@^2.4.0:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
@@ -3237,6 +5055,20 @@ is-core-module@^2.2.0, is-core-module@^2.4.0:
   dependencies:
     has "^1.0.3"
 
+is-data-descriptor@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+  integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+  dependencies:
+    kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+  integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+  dependencies:
+    kind-of "^6.0.0"
+
 is-date-object@^1.0.1:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5"
@@ -3247,7 +5079,42 @@ is-decimal@^1.0.0:
   resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
   integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
 
-is-extglob@^2.1.1:
+is-descriptor@^0.1.0:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+  integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+  dependencies:
+    is-accessor-descriptor "^0.1.6"
+    is-data-descriptor "^0.1.4"
+    kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+  integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+  dependencies:
+    is-accessor-descriptor "^1.0.0"
+    is-data-descriptor "^1.0.0"
+    kind-of "^6.0.2"
+
+is-directory@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+  integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+  integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+  dependencies:
+    is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
   integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
@@ -3262,6 +5129,13 @@ is-fullwidth-code-point@^3.0.0:
   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
   integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
 
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
+  dependencies:
+    is-extglob "^2.1.0"
+
 is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
@@ -3289,6 +5163,13 @@ is-number-object@^1.0.4:
   resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb"
   integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==
 
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+  dependencies:
+    kind-of "^3.0.2"
+
 is-number@^7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@@ -3304,7 +5185,7 @@ is-path-cwd@^2.2.0:
   resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb"
   integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
 
-is-path-inside@^3.0.2:
+is-path-inside@^3.0.1, is-path-inside@^3.0.2:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
   integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
@@ -3319,13 +5200,18 @@ is-plain-obj@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
   integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
 
-is-plain-object@^2.0.4:
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
   integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
   dependencies:
     isobject "^3.0.1"
 
+is-potential-custom-element-name@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
+  integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+
 is-regex@^1.1.2:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f"
@@ -3334,16 +5220,41 @@ is-regex@^1.1.2:
     call-bind "^1.0.2"
     has-symbols "^1.0.2"
 
+is-regex@^1.1.3:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+  integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+  dependencies:
+    call-bind "^1.0.2"
+    has-tostringtag "^1.0.0"
+
 is-regexp@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d"
   integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==
 
+is-resolvable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+  integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+
+is-stream@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+  integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
 is-string@^1.0.5:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f"
   integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==
 
+is-string@^1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+  integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+  dependencies:
+    has-tostringtag "^1.0.0"
+
 is-symbol@^1.0.2, is-symbol@^1.0.3:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
@@ -3366,6 +5277,11 @@ is-url@^1.2.4:
   resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
   integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
 
+is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
 is2@^2.0.6:
   version "2.0.7"
   resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.7.tgz#d084e10cab3bd45d6c9dfde7a48599fcbb93fcac"
@@ -3380,12 +5296,24 @@ isarray@0.0.1:
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
   integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
 
+isarray@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+  integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
 isexe@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
   integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
 
-isobject@^3.0.1:
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+  dependencies:
+    isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
   integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
@@ -3410,6 +5338,29 @@ jake@^10.6.1:
     filelist "^1.0.1"
     minimatch "^3.0.4"
 
+javascript-stringify@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3"
+  integrity sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=
+
+jest-worker@^26.2.1:
+  version "26.6.2"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
+  integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
+  dependencies:
+    "@types/node" "*"
+    merge-stream "^2.0.0"
+    supports-color "^7.0.0"
+
+jest-worker@^27.0.6:
+  version "27.1.0"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.1.0.tgz#65f4a88e37148ed984ba8ca8492d6b376938c0aa"
+  integrity sha512-mO4PHb2QWLn9yRXGp7rkvXLAYuxwhq1ZYUo0LoDhg8wqvv4QizP1ZWEJOeolgbEgAWZLIEU0wsku8J+lGWfBhg==
+  dependencies:
+    "@types/node" "*"
+    merge-stream "^2.0.0"
+    supports-color "^8.0.0"
+
 "joyride@https://github.com/zurb/joyride/archive/refs/heads/v2.1.tar.gz":
   version "0.0.0"
   resolved "https://github.com/zurb/joyride/archive/refs/heads/v2.1.tar.gz#a2149b220318565de072ed0c956310cd7c30c7d7"
@@ -3464,6 +5415,39 @@ jsbn@~0.1.0:
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
   integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
 
+jsdom@^16.2.0:
+  version "16.7.0"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710"
+  integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==
+  dependencies:
+    abab "^2.0.5"
+    acorn "^8.2.4"
+    acorn-globals "^6.0.0"
+    cssom "^0.4.4"
+    cssstyle "^2.3.0"
+    data-urls "^2.0.0"
+    decimal.js "^10.2.1"
+    domexception "^2.0.1"
+    escodegen "^2.0.0"
+    form-data "^3.0.0"
+    html-encoding-sniffer "^2.0.1"
+    http-proxy-agent "^4.0.1"
+    https-proxy-agent "^5.0.0"
+    is-potential-custom-element-name "^1.0.1"
+    nwsapi "^2.2.0"
+    parse5 "6.0.1"
+    saxes "^5.0.1"
+    symbol-tree "^3.2.4"
+    tough-cookie "^4.0.0"
+    w3c-hr-time "^1.0.2"
+    w3c-xmlserializer "^2.0.0"
+    webidl-conversions "^6.1.0"
+    whatwg-encoding "^1.0.5"
+    whatwg-mimetype "^2.3.0"
+    whatwg-url "^8.5.0"
+    ws "^7.4.6"
+    xml-name-validator "^3.0.0"
+
 jsesc@^2.5.1:
   version "2.5.2"
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
@@ -3474,7 +5458,7 @@ jsesc@~0.5.0:
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
   integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
 
-json-parse-better-errors@^1.0.1:
+json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
   integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
@@ -3557,7 +5541,26 @@ jsprim@^1.2.2:
     array-includes "^3.1.2"
     object.assign "^4.1.2"
 
-kind-of@^6.0.2, kind-of@^6.0.3:
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+  integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
   version "6.0.3"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
   integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
@@ -3610,6 +5613,29 @@ load-json-file@^4.0.0:
     pify "^3.0.0"
     strip-bom "^3.0.0"
 
+loader-runner@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384"
+  integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==
+
+loader-utils@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
+  integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
+  dependencies:
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^1.0.1"
+
+loader-utils@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
+  integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
+  dependencies:
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^2.1.2"
+
 locate-path@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
@@ -3633,6 +5659,11 @@ locate-path@^5.0.0:
   dependencies:
     p-locate "^4.1.0"
 
+lodash-es@^4.17.11, lodash-es@^4.17.15:
+  version "4.17.21"
+  resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
+  integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
 lodash._arraycopy@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1"
@@ -3731,6 +5762,11 @@ lodash.keys@^3.0.0:
     lodash.isarguments "^3.0.0"
     lodash.isarray "^3.0.0"
 
+lodash.memoize@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+  integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+
 lodash.merge@^4.6.2:
   version "4.6.2"
   resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
@@ -3741,7 +5777,12 @@ lodash.truncate@^4.4.2:
   resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
   integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
 
-lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21:
+lodash.uniq@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+  integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
+
+lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0:
   version "4.17.21"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -3802,13 +5843,18 @@ make-dir@^2.0.0, make-dir@^2.1.0:
     pify "^4.0.1"
     semver "^5.6.0"
 
-make-dir@^3.0.0:
+make-dir@^3.0.0, make-dir@^3.0.2:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
   integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
   dependencies:
     semver "^6.0.0"
 
+map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+  integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
 map-obj@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
@@ -3819,6 +5865,18 @@ map-obj@^4.0.0:
   resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7"
   integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==
 
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+  dependencies:
+    object-visit "^1.0.0"
+
+marked@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/marked/-/marked-1.1.1.tgz#e5d61b69842210d5df57b05856e0c91572703e6a"
+  integrity sha512-mJzT8D2yPxoPh7h0UXkB+dBj4FykPJ2OIfxAWeIHrvoHDkFxukV/29QxoFQoPM6RLEwhIFdJpmKBlqVM3s2ZIw==
+
 mathml-tag-names@^2.1.3:
   version "2.1.3"
   resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
@@ -3852,6 +5910,16 @@ mdast-util-to-string@^2.0.0:
   resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b"
   integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==
 
+mdn-data@2.0.14:
+  version "2.0.14"
+  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
+  integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
+
+mdn-data@2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
+  integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
+
 meow@^9.0.0:
   version "9.0.0"
   resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364"
@@ -3870,7 +5938,12 @@ meow@^9.0.0:
     type-fest "^0.18.0"
     yargs-parser "^20.2.3"
 
-merge2@^1.3.0:
+merge-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+  integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.2.3, merge2@^1.3.0:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
   integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
@@ -3883,6 +5956,25 @@ micromark@~2.11.0:
     debug "^4.0.0"
     parse-entities "^2.0.0"
 
+micromatch@^3.1.10:
+  version "3.1.10"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+  integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.3.1"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    extglob "^2.0.4"
+    fragment-cache "^0.2.1"
+    kind-of "^6.0.2"
+    nanomatch "^1.2.9"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.2"
+
 micromatch@^4.0.2, micromatch@^4.0.4:
   version "4.0.4"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
@@ -3896,6 +5988,11 @@ mime-db@1.47.0:
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
   integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==
 
+mime-db@1.49.0:
+  version "1.49.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed"
+  integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==
+
 mime-types@^2.1.12, mime-types@~2.1.19:
   version "2.1.30"
   resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d"
@@ -3903,6 +6000,13 @@ mime-types@^2.1.12, mime-types@~2.1.19:
   dependencies:
     mime-db "1.47.0"
 
+mime-types@^2.1.27:
+  version "2.1.32"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5"
+  integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==
+  dependencies:
+    mime-db "1.49.0"
+
 mime@^2.3.1:
   version "2.5.2"
   resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
@@ -3939,6 +6043,50 @@ minimist@^1.2.0, minimist@^1.2.2, minimist@^1.2.5:
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
   integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
 
+minipass-collect@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
+  integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass-flush@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
+  integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass-pipeline@^1.2.2:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
+  integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass@^3.0.0, minipass@^3.1.1:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd"
+  integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==
+  dependencies:
+    yallist "^4.0.0"
+
+minizlib@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+  integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+  dependencies:
+    minipass "^3.0.0"
+    yallist "^4.0.0"
+
+mixin-deep@^1.2.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+  integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+  dependencies:
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
+
 mkdirp@0.5.4:
   version "0.5.4"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512"
@@ -3946,14 +6094,14 @@ mkdirp@0.5.4:
   dependencies:
     minimist "^1.2.5"
 
-mkdirp@^0.5.0:
+mkdirp@^0.5.0, mkdirp@~0.5.1:
   version "0.5.5"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
   integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
   dependencies:
     minimist "^1.2.5"
 
-mkdirp@^1.0.4:
+mkdirp@^1.0.3, mkdirp@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
   integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
@@ -4017,11 +6165,33 @@ mute-stream@0.0.8:
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
   integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 
+nanomatch@^1.2.9:
+  version "1.2.13"
+  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+  integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    fragment-cache "^0.2.1"
+    is-windows "^1.0.2"
+    kind-of "^6.0.2"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
 natural-compare@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
   integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
 
+neo-async@^2.6.2:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+  integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
 netmask@^2.0.1:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7"
@@ -4070,6 +6240,11 @@ node-releases@^1.1.71:
   resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe"
   integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==
 
+node-releases@^1.1.75:
+  version "1.1.75"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe"
+  integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==
+
 normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
   version "2.5.0"
   resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@@ -4112,16 +6287,40 @@ normalize-selector@^0.2.0:
   resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03"
   integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=
 
+normalize-url@^3.0.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
+  integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
+
 normalize.css@^8.0.1:
   version "8.0.1"
   resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3"
   integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==
 
+npm-run-path@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+  integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+  dependencies:
+    path-key "^3.0.0"
+
+nth-check@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+  integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+  dependencies:
+    boolbase "~1.0.0"
+
 num2fraction@^1.2.2:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
   integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
 
+nwsapi@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
+  integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
+
 oauth-sign@~0.9.0:
   version "0.9.0"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
@@ -4132,6 +6331,20 @@ object-assign@^4.1.1:
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
   integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
 
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+  dependencies:
+    copy-descriptor "^0.1.0"
+    define-property "^0.2.5"
+    kind-of "^3.0.3"
+
+object-inspect@^1.11.0:
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
+  integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==
+
 object-inspect@^1.9.0:
   version "1.10.3"
   resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369"
@@ -4142,6 +6355,13 @@ object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
   resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
   integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
 
+object-visit@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+  dependencies:
+    isobject "^3.0.0"
+
 object.assign@4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
@@ -4182,7 +6402,7 @@ object.fromentries@^2.0.4:
     es-abstract "^1.18.0-next.2"
     has "^1.0.3"
 
-object.getownpropertydescriptors@^2.0.3:
+object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7"
   integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==
@@ -4191,6 +6411,22 @@ object.getownpropertydescriptors@^2.0.3:
     define-properties "^1.1.3"
     es-abstract "^1.18.0-next.2"
 
+object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+  dependencies:
+    isobject "^3.0.1"
+
+object.values@^1.1.0:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30"
+  integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.1.3"
+    es-abstract "^1.18.2"
+
 object.values@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee"
@@ -4208,7 +6444,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
   dependencies:
     wrappy "1"
 
-onetime@^5.1.0:
+onetime@^5.1.0, onetime@^5.1.2:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
   integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
@@ -4267,6 +6503,13 @@ p-limit@^2.0.0, p-limit@^2.2.0:
   dependencies:
     p-try "^2.0.0"
 
+p-limit@^3.0.2, p-limit@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+  integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+  dependencies:
+    yocto-queue "^0.1.0"
+
 p-locate@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
@@ -4288,6 +6531,13 @@ p-locate@^4.1.0:
   dependencies:
     p-limit "^2.2.0"
 
+p-map@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d"
+  integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==
+  dependencies:
+    aggregate-error "^3.0.0"
+
 p-map@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
@@ -4366,6 +6616,21 @@ parse-json@^5.0.0:
     json-parse-even-better-errors "^2.3.0"
     lines-and-columns "^1.1.6"
 
+parse5@6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
+  integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+  integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+path-dirname@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+  integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
+
 path-exists@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
@@ -4381,7 +6646,7 @@ path-is-absolute@^1.0.0:
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
   integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
 
-path-key@^3.1.0:
+path-key@^3.0.0, path-key@^3.1.0:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
   integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
@@ -4466,6 +6731,13 @@ pkg-dir@^3.0.0:
   dependencies:
     find-up "^3.0.0"
 
+pkg-dir@^4.1.0, pkg-dir@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+  integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+  dependencies:
+    find-up "^4.0.0"
+
 pkg-up@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
@@ -4473,6 +6745,16 @@ pkg-up@^2.0.0:
   dependencies:
     find-up "^2.1.0"
 
+pofile@^1.0.9:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/pofile/-/pofile-1.1.1.tgz#a581df04a6fae4941eebd7c1211dbd43700c5541"
+  integrity sha512-RVAzFGo1Mx9+YukVKSgTLut6r4ZVBW8IVrqGHAPfEsVJN93WSp5HRD6+qNa7av1q/joPKDNJd55m5AJl9GBQGA==
+
+posix-character-classes@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+  integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
 postcss-attribute-case-insensitive@^4.0.1:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880"
@@ -4532,6 +6814,25 @@ postcss-color-rebeccapurple@^4.0.1:
     postcss "^7.0.2"
     postcss-values-parser "^2.0.0"
 
+postcss-colormin@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
+  integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==
+  dependencies:
+    browserslist "^4.0.0"
+    color "^3.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-convert-values@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
+  integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==
+  dependencies:
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
 postcss-custom-media@^7.0.8:
   version "7.0.8"
   resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c"
@@ -4563,6 +6864,34 @@ postcss-dir-pseudo-class@^5.0.0:
     postcss "^7.0.2"
     postcss-selector-parser "^5.0.0-rc.3"
 
+postcss-discard-comments@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
+  integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==
+  dependencies:
+    postcss "^7.0.0"
+
+postcss-discard-duplicates@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
+  integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==
+  dependencies:
+    postcss "^7.0.0"
+
+postcss-discard-empty@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
+  integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==
+  dependencies:
+    postcss "^7.0.0"
+
+postcss-discard-overridden@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
+  integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==
+  dependencies:
+    postcss "^7.0.0"
+
 postcss-double-position-gradients@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e"
@@ -4630,7 +6959,7 @@ postcss-image-set-function@^3.0.1:
     postcss "^7.0.2"
     postcss-values-parser "^2.0.0"
 
-postcss-import@^12.0.1:
+postcss-import@^12.0.0, postcss-import@^12.0.1:
   version "12.0.1"
   resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153"
   integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==
@@ -4647,6 +6976,14 @@ postcss-initial@^3.0.0:
   dependencies:
     postcss "^7.0.2"
 
+postcss-js@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-2.0.3.tgz#a96f0f23ff3d08cec7dc5b11bf11c5f8077cdab9"
+  integrity sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==
+  dependencies:
+    camelcase-css "^2.0.1"
+    postcss "^7.0.18"
+
 postcss-lab-function@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e"
@@ -4663,6 +7000,24 @@ postcss-less@^3.1.4:
   dependencies:
     postcss "^7.0.14"
 
+postcss-load-config@^2.0.0:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a"
+  integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==
+  dependencies:
+    cosmiconfig "^5.0.0"
+    import-cwd "^2.0.0"
+
+postcss-loader@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d"
+  integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==
+  dependencies:
+    loader-utils "^1.1.0"
+    postcss "^7.0.0"
+    postcss-load-config "^2.0.0"
+    schema-utils "^1.0.0"
+
 postcss-logical@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5"
@@ -4682,12 +7037,175 @@ postcss-media-query-parser@^0.2.3:
   resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
   integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=
 
-postcss-nesting@^7.0.0:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052"
-  integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==
+postcss-merge-longhand@^4.0.11:
+  version "4.0.11"
+  resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
+  integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==
+  dependencies:
+    css-color-names "0.0.4"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+    stylehacks "^4.0.0"
+
+postcss-merge-rules@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
+  integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==
+  dependencies:
+    browserslist "^4.0.0"
+    caniuse-api "^3.0.0"
+    cssnano-util-same-parent "^4.0.0"
+    postcss "^7.0.0"
+    postcss-selector-parser "^3.0.0"
+    vendors "^1.0.0"
+
+postcss-minify-font-values@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
+  integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==
+  dependencies:
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-minify-gradients@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
+  integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==
+  dependencies:
+    cssnano-util-get-arguments "^4.0.0"
+    is-color-stop "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-minify-params@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
+  integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==
+  dependencies:
+    alphanum-sort "^1.0.0"
+    browserslist "^4.0.0"
+    cssnano-util-get-arguments "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+    uniqs "^2.0.0"
+
+postcss-minify-selectors@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
+  integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==
+  dependencies:
+    alphanum-sort "^1.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-selector-parser "^3.0.0"
+
+postcss-mixins@^6.2.0:
+  version "6.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-mixins/-/postcss-mixins-6.2.3.tgz#021893ba455d04b5baa052bf196297ddd70e4af1"
+  integrity sha512-gfH5d09YilzDn/CLGFA9Lwv7GTezuyHgnAyXC8AfvhUMpl67ZTewhcpNuOgawClCOD+76XePE2IHO1xMgsOlvA==
+  dependencies:
+    globby "^8.0.1"
+    postcss "^7.0.21"
+    postcss-js "^2.0.3"
+    postcss-simple-vars "^5.0.2"
+    sugarss "^2.0.0"
+
+postcss-nesting@^7.0.0:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052"
+  integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==
+  dependencies:
+    postcss "^7.0.2"
+
+postcss-normalize-charset@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
+  integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==
+  dependencies:
+    postcss "^7.0.0"
+
+postcss-normalize-display-values@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
+  integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==
+  dependencies:
+    cssnano-util-get-match "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-positions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
+  integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==
+  dependencies:
+    cssnano-util-get-arguments "^4.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-repeat-style@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
+  integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==
+  dependencies:
+    cssnano-util-get-arguments "^4.0.0"
+    cssnano-util-get-match "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-string@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
+  integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==
+  dependencies:
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-timing-functions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
+  integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==
+  dependencies:
+    cssnano-util-get-match "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-unicode@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
+  integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==
+  dependencies:
+    browserslist "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-url@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
+  integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==
+  dependencies:
+    is-absolute-url "^2.0.0"
+    normalize-url "^3.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-whitespace@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
+  integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==
+  dependencies:
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-ordered-values@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
+  integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==
   dependencies:
-    postcss "^7.0.2"
+    cssnano-util-get-arguments "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
 
 postcss-overflow-shorthand@^2.0.0:
   version "2.0.0"
@@ -4769,6 +7287,26 @@ postcss-pxtorem@^5.1.1:
   dependencies:
     postcss "^7.0.27"
 
+postcss-reduce-initial@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
+  integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==
+  dependencies:
+    browserslist "^4.0.0"
+    caniuse-api "^3.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+
+postcss-reduce-transforms@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
+  integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==
+  dependencies:
+    cssnano-util-get-match "^4.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
 postcss-replace-overflow-wrap@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c"
@@ -4819,6 +7357,15 @@ postcss-selector-not@^4.0.0:
     balanced-match "^1.0.0"
     postcss "^7.0.2"
 
+postcss-selector-parser@^3.0.0:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270"
+  integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==
+  dependencies:
+    dot-prop "^5.2.0"
+    indexes-of "^1.0.1"
+    uniq "^1.0.1"
+
 postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c"
@@ -4836,6 +7383,13 @@ postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.5:
     cssesc "^3.0.0"
     util-deprecate "^1.0.2"
 
+postcss-simple-vars@^5.0.2:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-simple-vars/-/postcss-simple-vars-5.0.2.tgz#e2f81b3d0847ddd4169816b6d141b91d51e6e22e"
+  integrity sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg==
+  dependencies:
+    postcss "^7.0.14"
+
 postcss-sorting@^5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/postcss-sorting/-/postcss-sorting-5.0.1.tgz#10d5d0059eea8334dacc820c0121864035bc3f11"
@@ -4844,11 +7398,29 @@ postcss-sorting@^5.0.1:
     lodash "^4.17.14"
     postcss "^7.0.17"
 
+postcss-svgo@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e"
+  integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==
+  dependencies:
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+    svgo "^1.0.0"
+
 postcss-syntax@^0.36.2:
   version "0.36.2"
   resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c"
   integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==
 
+postcss-unique-selectors@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
+  integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==
+  dependencies:
+    alphanum-sort "^1.0.0"
+    postcss "^7.0.0"
+    uniqs "^2.0.0"
+
 postcss-url@^8.0.0:
   version "8.0.0"
   resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-8.0.0.tgz#7b10059bd12929cdbb1971c60f61a0e5af86b4ca"
@@ -4860,7 +7432,7 @@ postcss-url@^8.0.0:
     postcss "^7.0.2"
     xxhashjs "^0.2.1"
 
-postcss-value-parser@^3.2.3:
+postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3:
   version "3.3.1"
   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
   integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
@@ -4879,6 +7451,15 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
     indexes-of "^1.0.1"
     uniq "^1.0.1"
 
+postcss@^7.0.0, postcss@^7.0.36:
+  version "7.0.36"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb"
+  integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==
+  dependencies:
+    chalk "^2.4.2"
+    source-map "^0.6.1"
+    supports-color "^6.1.0"
+
 postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.18, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6:
   version "7.0.35"
   resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24"
@@ -4915,6 +7496,11 @@ progress@^2.0.0:
   resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
   integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
 
+promise-inflight@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+  integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+
 prop-types@^15.7.2:
   version "15.7.2"
   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
@@ -4943,7 +7529,7 @@ proxy-from-env@^1.0.0, proxy-from-env@^1.1.0:
   resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
   integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
 
-psl@^1.1.28:
+psl@^1.1.28, psl@^1.1.33:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
   integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
@@ -4961,6 +7547,11 @@ punycode@^2.1.0, punycode@^2.1.1:
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
   integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
 
+q@^1.1.2:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+  integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+
 qs@~6.5.2:
   version "6.5.2"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
@@ -4976,6 +7567,13 @@ quick-lru@^4.0.1:
   resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
   integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
 
+randombytes@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+  integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+  dependencies:
+    safe-buffer "^5.1.0"
+
 raw-body@^2.2.0:
   version "2.4.1"
   resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
@@ -4986,6 +7584,14 @@ raw-body@^2.2.0:
     iconv-lite "0.4.24"
     unpipe "1.0.0"
 
+raw-loader@^4.0.1, raw-loader@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6"
+  integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==
+  dependencies:
+    loader-utils "^2.0.0"
+    schema-utils "^3.0.0"
+
 react-is@^16.8.1:
   version "16.13.1"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
@@ -5044,7 +7650,7 @@ readable-stream@1.1.x:
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
-readable-stream@^3.1.1:
+"readable-stream@2 || 3", readable-stream@^3.1.1:
   version "3.6.0"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
   integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -5060,6 +7666,20 @@ readdirp@~3.5.0:
   dependencies:
     picomatch "^2.2.1"
 
+rechoir@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+  integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
+  dependencies:
+    resolve "^1.1.6"
+
+rechoir@^0.7.0:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686"
+  integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==
+  dependencies:
+    resolve "^1.9.0"
+
 redent@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
@@ -5092,6 +7712,14 @@ regenerator-transform@^0.14.2:
   dependencies:
     "@babel/runtime" "^7.8.4"
 
+regex-not@^1.0.0, regex-not@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+  dependencies:
+    extend-shallow "^3.0.2"
+    safe-regex "^1.1.0"
+
 regexp.prototype.flags@^1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26"
@@ -5157,6 +7785,11 @@ remove-trailing-separator@^1.0.1:
   resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
   integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
 
+repeat-element@^1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+  integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
 repeat-string@^1.0.0, repeat-string@^1.6.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
@@ -5220,6 +7853,18 @@ require-main-filename@^2.0.0:
   resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
   integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
 
+resolve-cwd@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+  integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+  dependencies:
+    resolve-from "^5.0.0"
+
+resolve-from@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+  integrity sha1-six699nWiBvItuZTM17rywoYh0g=
+
 resolve-from@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
@@ -5237,7 +7882,12 @@ resolve-global@^1.0.0:
   dependencies:
     global-dirs "^0.1.1"
 
-resolve@^1.1.7, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.20.0:
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0:
   version "1.20.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
   integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
@@ -5261,12 +7911,27 @@ restore-cursor@^3.1.0:
     onetime "^5.1.0"
     signal-exit "^3.0.2"
 
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+  integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
 reusify@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
   integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
-rimraf@^3.0.2:
+rgb-regex@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
+  integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
+
+rgba-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+  integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
+
+rimraf@^3.0.0, rimraf@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
   integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
@@ -5280,7 +7945,7 @@ run-parallel@^1.1.9:
   dependencies:
     queue-microtask "^1.2.2"
 
-safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
   version "5.2.1"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
   integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -5290,11 +7955,57 @@ safe-buffer@~5.1.1:
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
 
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+  dependencies:
+    ret "~0.1.10"
+
 "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
   integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
 
+sax@~1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+  integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+saxes@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d"
+  integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==
+  dependencies:
+    xmlchars "^2.2.0"
+
+schema-utils@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
+  integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
+  dependencies:
+    ajv "^6.1.0"
+    ajv-errors "^1.0.0"
+    ajv-keywords "^3.1.0"
+
+schema-utils@^2.6.6, schema-utils@^2.7.0:
+  version "2.7.1"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
+  integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
+  dependencies:
+    "@types/json-schema" "^7.0.5"
+    ajv "^6.12.4"
+    ajv-keywords "^3.5.2"
+
+schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
+  integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
+  dependencies:
+    "@types/json-schema" "^7.0.8"
+    ajv "^6.12.5"
+    ajv-keywords "^3.5.2"
+
 "semver@2 || 3 || 4 || 5", semver@^5.6.0, semver@^5.7.0:
   version "5.7.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
@@ -5310,18 +8021,42 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
   resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
-semver@^7.2.1, semver@^7.3.4:
+semver@^7.2.1, semver@^7.3.4, semver@^7.3.5:
   version "7.3.5"
   resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
   integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
   dependencies:
     lru-cache "^6.0.0"
 
+serialize-javascript@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
+  integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
+  dependencies:
+    randombytes "^2.1.0"
+
+serialize-javascript@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
+  integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
+  dependencies:
+    randombytes "^2.1.0"
+
 set-blocking@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
   integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
 
+set-value@^2.0.0, set-value@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+  integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
+
 setprototypeof@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
@@ -5346,6 +8081,15 @@ shebang-regex@^3.0.0:
   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
   integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
 
+shelljs@^0.8.1:
+  version "0.8.4"
+  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2"
+  integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==
+  dependencies:
+    glob "^7.0.0"
+    interpret "^1.0.0"
+    rechoir "^0.6.2"
+
 shepherd.js@^8.3.1:
   version "8.3.1"
   resolved "https://registry.yarnpkg.com/shepherd.js/-/shepherd.js-8.3.1.tgz#131eeefc5eb2bc44c9e23d0da139db46b2b55339"
@@ -5364,11 +8108,23 @@ side-channel@^1.0.4:
     get-intrinsic "^1.0.2"
     object-inspect "^1.9.0"
 
-signal-exit@^3.0.2:
+signal-exit@^3.0.2, signal-exit@^3.0.3:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
   integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
 
+simple-swizzle@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+  integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
+  dependencies:
+    is-arrayish "^0.3.1"
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+  integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
+
 slash@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
@@ -5393,6 +8149,36 @@ smoothscroll-polyfill@^0.4.4:
   resolved "https://registry.yarnpkg.com/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz#3a259131dc6930e6ca80003e1cb03b603b69abf8"
   integrity sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg==
 
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+  dependencies:
+    define-property "^1.0.0"
+    isobject "^3.0.0"
+    snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+  dependencies:
+    kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+  integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+  dependencies:
+    base "^0.11.1"
+    debug "^2.2.0"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    map-cache "^0.2.2"
+    source-map "^0.5.6"
+    source-map-resolve "^0.5.0"
+    use "^3.1.0"
+
 socks-proxy-agent@5, socks-proxy-agent@^5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60"
@@ -5415,7 +8201,23 @@ sortablejs@^1.13.0:
   resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.13.0.tgz#3ab2473f8c69ca63569e80b1cd1b5669b51269e9"
   integrity sha512-RBJirPY0spWCrU5yCmWM1eFs/XgX2J5c6b275/YyxFRgnzPhKl/TDeU2hNR8Dt7ITq66NRPM4UlOt+e5O4CFHg==
 
-source-map-support@^0.5.16, source-map-support@~0.5.19:
+source-list-map@^2.0.0, source-list-map@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+  integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+
+source-map-resolve@^0.5.0:
+  version "0.5.3"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+  integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+  dependencies:
+    atob "^2.1.2"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
+
+source-map-support@^0.5.16, source-map-support@~0.5.12, source-map-support@~0.5.19:
   version "0.5.19"
   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
   integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
@@ -5423,7 +8225,12 @@ source-map-support@^0.5.16, source-map-support@~0.5.19:
     buffer-from "^1.0.0"
     source-map "^0.6.0"
 
-source-map@^0.5.0:
+source-map-url@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+  integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.0, source-map@^0.5.6:
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
   integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
@@ -5469,6 +8276,13 @@ specificity@^0.4.1:
   resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019"
   integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==
 
+split-string@^3.0.1, split-string@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+  dependencies:
+    extend-shallow "^3.0.0"
+
 sprintf-js@~1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
@@ -5489,6 +8303,26 @@ sshpk@^1.7.0:
     safer-buffer "^2.0.2"
     tweetnacl "~0.14.0"
 
+ssri@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af"
+  integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==
+  dependencies:
+    minipass "^3.1.1"
+
+stable@^0.1.8:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+  integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+  dependencies:
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
+
 "statuses@>= 1.5.0 < 2":
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
@@ -5592,6 +8426,11 @@ strip-bom@^3.0.0:
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
   integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
 
+strip-final-newline@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+  integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
 strip-indent@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
@@ -5609,11 +8448,28 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
   integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
 
+style-loader@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e"
+  integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==
+  dependencies:
+    loader-utils "^2.0.0"
+    schema-utils "^2.7.0"
+
 style-search@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"
   integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=
 
+stylehacks@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
+  integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==
+  dependencies:
+    browserslist "^4.0.0"
+    postcss "^7.0.0"
+    postcss-selector-parser "^3.0.0"
+
 stylelint-checkstyle-formatter@^0.1.1:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/stylelint-checkstyle-formatter/-/stylelint-checkstyle-formatter-0.1.2.tgz#a127d97d352ec0e98229945db9768a65e1a89ca5"
@@ -5724,18 +8580,49 @@ supports-color@^6.1.0:
   dependencies:
     has-flag "^3.0.0"
 
-supports-color@^7.1.0:
+supports-color@^7.0.0, supports-color@^7.1.0:
   version "7.2.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
   integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
   dependencies:
     has-flag "^4.0.0"
 
+supports-color@^8.0.0:
+  version "8.1.1"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+  integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+  dependencies:
+    has-flag "^4.0.0"
+
 svg-tags@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
   integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
 
+svgo@^1.0.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167"
+  integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==
+  dependencies:
+    chalk "^2.4.1"
+    coa "^2.0.2"
+    css-select "^2.0.0"
+    css-select-base-adapter "^0.1.1"
+    css-tree "1.0.0-alpha.37"
+    csso "^4.0.2"
+    js-yaml "^3.13.1"
+    mkdirp "~0.5.1"
+    object.values "^1.1.0"
+    sax "~1.2.4"
+    stable "^0.1.8"
+    unquote "~1.1.1"
+    util.promisify "~1.0.0"
+
+symbol-tree@^3.2.4:
+  version "3.2.4"
+  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+  integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
 tabbable@^5.2.0:
   version "5.2.0"
   resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.2.0.tgz#4fba60991d8bb89d06e5d9455c92b453acf88fb2"
@@ -5753,6 +8640,23 @@ table@^6.0.4, table@^6.6.0:
     string-width "^4.2.0"
     strip-ansi "^6.0.0"
 
+tapable@^2.1.1, tapable@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b"
+  integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==
+
+tar@^6.0.2:
+  version "6.1.11"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
+  integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
+  dependencies:
+    chownr "^2.0.0"
+    fs-minipass "^2.0.0"
+    minipass "^3.0.0"
+    minizlib "^2.1.1"
+    mkdirp "^1.0.3"
+    yallist "^4.0.0"
+
 tcp-port-used@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.2.tgz#9652b7436eb1f4cfae111c79b558a25769f6faea"
@@ -5761,6 +8665,42 @@ tcp-port-used@^1.0.1:
     debug "4.3.1"
     is2 "^2.0.6"
 
+terser-webpack-plugin@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.1.0.tgz#91e6d39571460ed240c0cf69d295bcf30ebf98cb"
+  integrity sha512-cjdZte66fYkZ65rQ2oJfrdCAkkhJA7YLYk5eGOcGCSGlq0ieZupRdjedSQXYknMPo2IveQL+tPdrxUkERENCFA==
+  dependencies:
+    cacache "^15.0.5"
+    find-cache-dir "^3.3.1"
+    jest-worker "^26.2.1"
+    p-limit "^3.0.2"
+    schema-utils "^2.6.6"
+    serialize-javascript "^4.0.0"
+    source-map "^0.6.1"
+    terser "^4.8.0"
+    webpack-sources "^1.4.3"
+
+terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.0:
+  version "5.2.3"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.3.tgz#4852c91f709a4ea2bcf324cf48e7e88124cda0cc"
+  integrity sha512-eDbuaDlXhVaaoKuLD3DTNTozKqln6xOG6Us0SzlKG5tNlazG+/cdl8pm9qiF1Di89iWScTI0HcO+CDcf2dkXiw==
+  dependencies:
+    jest-worker "^27.0.6"
+    p-limit "^3.1.0"
+    schema-utils "^3.1.1"
+    serialize-javascript "^6.0.0"
+    source-map "^0.6.1"
+    terser "^5.7.2"
+
+terser@^4.8.0:
+  version "4.8.0"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
+  integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
+  dependencies:
+    commander "^2.20.0"
+    source-map "~0.6.1"
+    source-map-support "~0.5.12"
+
 terser@^5.3.4:
   version "5.7.0"
   resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693"
@@ -5770,16 +8710,53 @@ terser@^5.3.4:
     source-map "~0.7.2"
     source-map-support "~0.5.19"
 
+terser@^5.7.2:
+  version "5.7.2"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.2.tgz#d4d95ed4f8bf735cb933e802f2a1829abf545e3f"
+  integrity sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==
+  dependencies:
+    commander "^2.20.0"
+    source-map "~0.7.2"
+    source-map-support "~0.5.19"
+
 text-table@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
   integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
 
+through2@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4"
+  integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==
+  dependencies:
+    inherits "^2.0.4"
+    readable-stream "2 || 3"
+
+timsort@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
+  integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
+
 to-fast-properties@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
   integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
 
+to-object-path@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+  dependencies:
+    kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+  dependencies:
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+
 to-regex-range@^5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
@@ -5787,6 +8764,16 @@ to-regex-range@^5.0.1:
   dependencies:
     is-number "^7.0.0"
 
+to-regex@^3.0.1, to-regex@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+  dependencies:
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
+
 toidentifier@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
@@ -5800,6 +8787,22 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0:
     psl "^1.1.28"
     punycode "^2.1.1"
 
+tough-cookie@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
+  integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
+  dependencies:
+    psl "^1.1.33"
+    punycode "^2.1.1"
+    universalify "^0.1.2"
+
+tr46@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240"
+  integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==
+  dependencies:
+    punycode "^2.1.1"
+
 trim-newlines@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30"
@@ -5832,6 +8835,18 @@ tunnel-agent@^0.6.0:
   dependencies:
     safe-buffer "^5.0.1"
 
+turndown-plugin-gfm@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz#6f8678a361f35220b2bdf5619e6049add75bf1c7"
+  integrity sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==
+
+turndown@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/turndown/-/turndown-6.0.0.tgz#c083d6109a9366be1b84b86b20af09140ea4b413"
+  integrity sha512-UVJBhSyRHCpNKtQ00mNWlYUM/i+tcipkb++F0PrOpt0L7EhNd0AX9mWEpL2dRFBu7LWXMp4HgAMA4OeKKnN7og==
+  dependencies:
+    jsdom "^16.2.0"
+
 tweetnacl@^0.14.3, tweetnacl@~0.14.0:
   version "0.14.5"
   resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
@@ -5883,7 +8898,7 @@ typedarray-to-buffer@^3.1.5:
   dependencies:
     is-typedarray "^1.0.0"
 
-unbox-primitive@^1.0.0:
+unbox-primitive@^1.0.0, unbox-primitive@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
   integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
@@ -5933,11 +8948,40 @@ unified@^9.1.0:
     trough "^1.0.0"
     vfile "^4.0.0"
 
+union-value@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+  integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+  dependencies:
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^2.0.1"
+
 uniq@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
   integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
 
+uniqs@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+  integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
+
+unique-filename@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+  integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+  dependencies:
+    unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
+  integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
+  dependencies:
+    imurmurhash "^0.1.4"
+
 unique-string@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
@@ -5964,7 +9008,7 @@ unist-util-stringify-position@^2.0.0:
   dependencies:
     "@types/unist" "^2.0.2"
 
-universalify@^0.1.0:
+universalify@^0.1.0, universalify@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
   integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
@@ -5979,6 +9023,19 @@ unpipe@1.0.0:
   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
   integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
 
+unquote@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+  integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=
+
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+  dependencies:
+    has-value "^0.3.1"
+    isobject "^3.0.0"
+
 uri-js@^4.2.2:
   version "4.4.1"
   resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
@@ -5986,17 +9043,37 @@ uri-js@^4.2.2:
   dependencies:
     punycode "^2.1.0"
 
+urix@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+  integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+use@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+  integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
 util-deprecate@^1.0.1, util-deprecate@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
   integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
 
+util.promisify@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee"
+  integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.2"
+    has-symbols "^1.0.1"
+    object.getownpropertydescriptors "^2.1.0"
+
 uuid@^3.3.2:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
   integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
 
-v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0:
+v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0, v8-compile-cache@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
   integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
@@ -6009,6 +9086,11 @@ validate-npm-package-license@^3.0.1:
     spdx-correct "^3.0.0"
     spdx-expression-parse "^3.0.0"
 
+vendors@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
+  integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
+
 verror@1.10.0:
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
@@ -6041,6 +9123,28 @@ vscode-uri@^3.0.2:
   resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.2.tgz#ecfd1d066cb8ef4c3a208decdbab9a8c23d055d0"
   integrity sha512-jkjy6pjU1fxUvI51P+gCsxg1u2n8LSt0W6KrCNQceaziKzff74GoWmjVG46KieVzybO1sttPQmYfrwSHey7GUA==
 
+w3c-hr-time@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
+  integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
+  dependencies:
+    browser-process-hrtime "^1.0.0"
+
+w3c-xmlserializer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a"
+  integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==
+  dependencies:
+    xml-name-validator "^3.0.0"
+
+watchpack@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce"
+  integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==
+  dependencies:
+    glob-to-regexp "^0.4.1"
+    graceful-fs "^4.1.2"
+
 wcwidth@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
@@ -6048,6 +9152,115 @@ wcwidth@^1.0.1:
   dependencies:
     defaults "^1.0.3"
 
+webidl-conversions@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
+  integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
+
+webidl-conversions@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
+  integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
+
+webpack-cli@^4.4.0:
+  version "4.8.0"
+  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.8.0.tgz#5fc3c8b9401d3c8a43e2afceacfa8261962338d1"
+  integrity sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==
+  dependencies:
+    "@discoveryjs/json-ext" "^0.5.0"
+    "@webpack-cli/configtest" "^1.0.4"
+    "@webpack-cli/info" "^1.3.0"
+    "@webpack-cli/serve" "^1.5.2"
+    colorette "^1.2.1"
+    commander "^7.0.0"
+    execa "^5.0.0"
+    fastest-levenshtein "^1.0.12"
+    import-local "^3.0.2"
+    interpret "^2.2.0"
+    rechoir "^0.7.0"
+    v8-compile-cache "^2.2.0"
+    webpack-merge "^5.7.3"
+
+webpack-merge@^5.7.3:
+  version "5.8.0"
+  resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61"
+  integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==
+  dependencies:
+    clone-deep "^4.0.1"
+    wildcard "^2.0.0"
+
+webpack-sources@^1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
+  integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
+  dependencies:
+    source-list-map "^2.0.0"
+    source-map "~0.6.1"
+
+webpack-sources@^2.0.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd"
+  integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==
+  dependencies:
+    source-list-map "^2.0.1"
+    source-map "^0.6.1"
+
+webpack-sources@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.0.tgz#b16973bcf844ebcdb3afde32eda1c04d0b90f89d"
+  integrity sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw==
+
+webpack@^5.51.1:
+  version "5.51.2"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.51.2.tgz#f765d258b0bf6abda3c5f21bf855a25720e9796f"
+  integrity sha512-odydxP4WA3XYYzwSQUivPxywdzMlY42bbfxMwCaEtHb+i/N9uzKSHcLgWkXo/Gsa+4Zlzf3Jg0hEHn1FnZpk2Q==
+  dependencies:
+    "@types/eslint-scope" "^3.7.0"
+    "@types/estree" "^0.0.50"
+    "@webassemblyjs/ast" "1.11.1"
+    "@webassemblyjs/wasm-edit" "1.11.1"
+    "@webassemblyjs/wasm-parser" "1.11.1"
+    acorn "^8.4.1"
+    acorn-import-assertions "^1.7.6"
+    browserslist "^4.14.5"
+    chrome-trace-event "^1.0.2"
+    enhanced-resolve "^5.8.0"
+    es-module-lexer "^0.7.1"
+    eslint-scope "5.1.1"
+    events "^3.2.0"
+    glob-to-regexp "^0.4.1"
+    graceful-fs "^4.2.4"
+    json-parse-better-errors "^1.0.2"
+    loader-runner "^4.2.0"
+    mime-types "^2.1.27"
+    neo-async "^2.6.2"
+    schema-utils "^3.1.0"
+    tapable "^2.1.1"
+    terser-webpack-plugin "^5.1.3"
+    watchpack "^2.2.0"
+    webpack-sources "^3.2.0"
+
+whatwg-encoding@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
+  integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
+  dependencies:
+    iconv-lite "0.4.24"
+
+whatwg-mimetype@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
+  integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+
+whatwg-url@^8.0.0, whatwg-url@^8.5.0:
+  version "8.7.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77"
+  integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==
+  dependencies:
+    lodash "^4.7.0"
+    tr46 "^2.1.0"
+    webidl-conversions "^6.1.0"
+
 which-boxed-primitive@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
@@ -6085,6 +9298,11 @@ wide-align@1.1.3:
   dependencies:
     string-width "^1.0.2 || 2"
 
+wildcard@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
+  integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
+
 word-wrap@^1.2.3, word-wrap@~1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
@@ -6114,11 +9332,26 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3:
     signal-exit "^3.0.2"
     typedarray-to-buffer "^3.1.5"
 
+ws@^7.4.6:
+  version "7.5.4"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.4.tgz#56bfa20b167427e138a7795de68d134fe92e21f9"
+  integrity sha512-zP9z6GXm6zC27YtspwH99T3qTG7bBFv2VIkeHstMLrLlDJuzA7tQ5ls3OJ1hOGGCzTQPniNJoHXIAOS0Jljohg==
+
 xdg-basedir@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
   integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
 
+xml-name-validator@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+  integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+
+xmlchars@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+  integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
 xregexp@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
@@ -6206,6 +9439,11 @@ yauzl@^2.10.0:
     buffer-crc32 "~0.2.3"
     fd-slicer "~1.1.0"
 
+yocto-queue@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+  integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
 zwitch@^1.0.0:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"
